{"version":3,"file":"static/js/7923face5fd1af331f63.bundle.js","mappings":";0OAsBM,MAAOA,EAGTC,YAAYC,EAAuCC,GAI5C,KAAAC,YAAc,IAAM,yBACpB,KAAAC,mBAAqB,IAAM,yBAC3B,KAAAC,cAAgB,IAA0B,OAL7CC,KAAKL,SAAWA,EAChBK,KAAKJ,iBAAmBA,GAqChC,MAAMK,EAAkBC,MAAOC,EAAsBC,EAA+BC,EAAaC,KAC7F,IAAKH,EAAWI,OACZ,MAAO,GAEX,MAAMC,QAAuBC,EAAAA,EAAAA,+BACzB,CAAEC,cAAeJ,GACjB,CAAEK,WAAYR,EAAYS,sBAAsB,EAAMC,sBAAuBT,IAE3EU,GAAkBC,EAAAA,EAAAA,0CAAyCT,EAAKE,GAEtE,OADAM,EAAgBE,SAAQC,GAAMA,EAAEC,yBAAyBC,cAAgBd,IAClES,GAGX,EAAeM,EAAAA,GAAoC,CAC/CC,OA7BJnB,eAAsBoB,EAA6BhB,GAC/C,MAAMiB,EAAqBD,EAAM1B,iBAAiB4B,KAAIC,GAAKA,EAAEC,YACvDC,EAAaL,EAAM3B,SAASiC,QAAOH,GAAuC,OAAlCA,EAAEI,cAAcC,gBAAwBN,KAAIO,GAAMA,EAAGL,YAC7FM,EAAaV,EAAM3B,SACpBiC,QAAOH,GAAuC,OAAlCA,EAAEI,cAAcC,eAA0BP,EAAmBU,SAASR,EAAEC,aACpFF,KAAIO,GAAMA,EAAGL,YACZQ,EAAmBjC,EAAgB0B,EAAY,EAAG,KAAMrB,GACxD6B,EAAmBlC,EAAgB+B,EAAY,EAAG,KAAM1B,GACxD8B,EAAoB,GAI1B,OAHAA,EAAkBC,cAAeH,GACjCE,EAAkBC,cAAeF,GAE1B,CAAEG,4BAA6BF,IAmBtCG,GAAI,kBACJjB,MAvCiBkB,GACV,IAAI/C,EAAqB,GAAI,0GC/BlC,MAAOgD,EAIT/C,YAAYgD,EAAoCC,GAMzC,KAAA9C,YAAc,IAAM,WAAWG,KAAK4C,OAAOpB,KAAIqB,GAAKA,EAAEC,gBAAeC,KAAK,cAAc/C,KAAK2C,YAC7F,KAAA7C,mBAAqB,IAAM,gBAC3B,KAAAC,cAAgB,IAA0B,cAP7CC,KAAK4C,OAASF,EACd1C,KAAK2C,UAAYA,GA4BzB,QAAevB,EAAAA,GAAoC,CAC/CC,OALJnB,eAAsBoB,EAAoBhB,GACtC,OAAO0C,EAAAA,EAAAA,IAAuB,CAAEtC,cAAeJ,GAAOgB,EAAMsB,QAAStB,EAAMqB,YAM3EJ,GAAI,SACJjB,MAfiBkB,GACV,IAAIC,EAAY,GAAI,urBCMzB,MAAOQ,EAqBTvD,YACIwD,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAf,GAcG,KAAA9C,YAAc,KACjB,MAAMuD,EAAmBO,EAAAA,EAAA,GAClB3D,KAAKoD,oBAAoBQ,SACzBC,EAAAA,EAAAA,IAAK7D,KAAKoD,oBAAoBU,UAYrC,OATiBC,EAAAA,EAAAA,eAEb,GAAG/D,KAAKkD,YAAYlD,KAAK0D,UAAU1D,KAAKsD,UAAYtD,KAAKuD,cAAcvD,KAAK2C,aAAa3C,KAAKqD,SAAS7B,KAEnGwC,GAAW,GAAGA,EAAQC,iBAAmBD,EAAQE,sBAAwB,KAAOF,EAAQG,uBAAyB,aAChHC,EAAAA,EAAAA,iBAAgBhB,KACrBpD,KAAKmD,YACLnD,KAAK0D,SAKN,KAAA5D,mBAAqB,IAAM,yBAE3B,KAAAC,cAAgB,IAAiB,UAhCpCC,KAAKkD,SAAWA,EAChBlD,KAAKmD,YAAcA,EACnBnD,KAAKsD,SAAWA,EAChBtD,KAAKuD,WAAaA,EAClBvD,KAAKoD,oBAAsBA,EAC3BpD,KAAKqD,SAAWA,EAChBrD,KAAKwD,kBAAoBA,EACzBxD,KAAKyD,qBAAuBA,EAC5BzD,KAAK0D,OAASA,EACd1D,KAAK2C,UAAYA,MAAAA,EAAAA,EAAa,GAiD/B,MAAM0B,EAA4BA,CACrC7B,EACA8B,KAEA,MAAMpB,EACyC,aAA3CV,EAAK+B,eAAeC,UAAUtB,UAA4BV,EAAK+B,eAAeE,OAASjC,EAAK+B,eAAeE,MAAMC,WAC3G,WACA,SAEJtB,EAAsBuB,EAAAA,yBAAyBC,cAAcpC,GAAMqC,oBACnEC,GAAgBC,EAAAA,EAAAA,IAAuBvC,EAAK+B,gBAC5Cf,MAzHoBwB,EAyHqBxC,KAxH9BwC,EAAUC,aAAiDC,IAAvCF,EAAUC,OAAOzB,oBAA0E,IAAvCwB,EAAUC,OAAOzB,mBAD9G,IAA8BwB,EA0H1B,MAAMvB,EA9GV,SAA+BuB,GAA+D,IAAAG,EAC1F,QAAyB,QAAjBA,EAACH,EAAUC,cAAM,IAAAE,IAAhBA,EAAkBC,oBA6GEC,CAAsB7C,GAC7CG,GAAY2C,EAAAA,EAAAA,IAAa9C,EAAK+B,gBAMpC,GAJI/B,EAAK+B,eAAeE,OAASjC,EAAK+B,eAAeE,MAAMc,UACvDnC,EAAoBU,QAAU,CAAE0B,QAAuBC,KAAKC,MAAMC,mBAAmBnD,EAAK+B,eAAeE,MAAMc,YAGlG,aAAbrC,EACA,OAAO,IAAIoB,EACPpB,EACAV,EAAK+B,eAAepB,YACpBC,EACA0B,IACEtC,EAAK+B,eAAeC,UAAUoB,QAAWpD,EAAK+B,eAAeE,OAASjC,EAAK+B,eAAeE,MAAMC,YAAe,QACjHQ,EACA1B,EACAC,EACAjB,EAAK+B,eAAeb,OACpBf,GAED,GAAiB,WAAbO,GAAyBV,EAAK+B,eAAeE,OAASjC,EAAK+B,eAAeE,MAAMoB,EACvF,OAAO,IAAIvB,EACPpB,EACAV,EAAK+B,eAAepB,YACpBC,EACA0B,OACAI,EACA1C,EAAK+B,eAAeE,MAAMoB,EAC1BrC,EACAC,EACAjB,EAAK+B,eAAeb,OACpBf,GAED,GACU,WAAbO,GACAV,EAAK+B,eAAeE,OACpBjC,EAAK+B,eAAeE,MAAM/C,WAC1Bc,EAAK+B,eAAeE,MAAMqB,eAE1B,OAAO,IAAIxB,EACPpB,EACAV,EAAK+B,eAAepB,YACpBC,EACA0B,OACAI,EACAO,KAAKM,UAAU,CAAEC,UAAWxD,EAAK+B,eAAeE,MAAM/C,UAAWuE,eAAgBzD,EAAK+B,eAAeE,MAAMqB,iBAC3GtC,EACAC,EACAjB,EAAK+B,eAAeb,OACpBf,GAIR,MAAM,IAAIuD,MAAM,+SCtLd,MAAOC,UAA0ClD,EAAAA,EAGnDvD,YAAmB4B,GAAyE,IAA7C8E,EAAAC,UAAA9F,OAAA,QAAA2E,IAAAmB,UAAA,GAAAA,UAAA,GAA4C,EACvFC,MACIhF,EAAM4B,SACN5B,EAAM6B,YACN7B,EAAM8B,oBAGN,QAGA8B,EAGA,IAGA,GAGA,OAGAA,EACA5D,EAAMqB,WAUP,KAAA9C,YAAc,KAAckE,EAAAA,EAAAA,eAAc,cAAe/D,KAAKmD,aAM9D,KAAArD,mBAAqB,IAAc,cAMnC,KAAAC,cAAgB,IAAiB,cAnBpCC,KAAKoG,kCAAoCA,GAiD1C,MAKP,GALgCG,EAAAA,EAAAA,IAA2B,CACvDhE,GAAI,4EACJlB,OAvBJnB,eAAsBoB,EAA0CkF,GAAuB,IAAAC,EAYnF,OAA6F,QAA7FA,SAXuBC,EAAAA,EAAAA,GACnB,CACIC,QAAS,CACLC,UAAWtF,EAAM6B,YAAY0D,UAC7BC,UAAWxF,EAAMqB,YAGzBrB,EAAM8B,oBACNoD,IAGYO,MAAK/C,GAAWA,EAAQgD,WAAa1F,EAAM8E,2CAAkC,IAAAK,EAAAA,EAAI,QCtD/F,MAAOQ,UAAyChE,EAAAA,EAAtDvD,kCAKW,KAAAI,mBAAqB,IAAc,0BAMnC,KAAAC,cAAgB,IAEG,aAAlBC,KAAKkD,UACJlD,KAAKqD,UAAYrD,KAAKqD,SAAS9C,OAAS,GACxCP,KAAKoD,qBACFpD,KAAKoD,oBAAoBU,SACzB9D,KAAKoD,oBAAoBU,QAAQ0B,SACjCxF,KAAKoD,oBAAoBU,QAAQ0B,QAAQjF,OAAS,EAE/C,UAEJ,eAOR,IAAK2G,GAAZ,SAAYA,GAIRA,EAAA,kBAKAA,EAAA,kBAKAA,EAAA,kBAdJ,CAAYA,IAAAA,EAAoC,KAoFzChH,eAAeiH,EAClBC,EACAZ,EACAa,EACAC,GAEA,MAEMC,EAAiCH,EAAqB5F,KAAIgG,IAC5D,MAAMC,GAAcC,EAAAA,EAAAA,yBAAwBF,EAAqBhB,EAAQjC,eAAepB,aAMxF,OAJIsE,IACAD,EAAoBG,gBAAkBF,GAGnCD,KAKX,GACIhB,EAAQjC,eAAeqD,IAAI3C,OAAO4C,iBAAmBC,EAAAA,gBAAgBC,YACd,IAAvDvB,EAAQjC,eAAeqD,IAAI3C,OAAO+C,iBAElC,MAAO,CACHrI,SAAU4H,EACVU,MAAOZ,MAAAA,EAAAA,EApBqB,GAwBpC,MAAMa,EAAyBZ,MAAAA,EAAAA,QAAwCa,EAAAA,EAAAA,gCAA+B,CAAEzH,cAAe8F,IAyBvH,MAAO,CACH7G,SAxBmB4H,EAA+B/F,KAAIgG,IACtD,GAAIY,EAAAA,gBAAgBC,YAAYb,EAAoBc,iBAChD,IAAK,MAAMC,KAAWf,EAAoBc,gBAElChB,QACqBpC,IAArBqD,EAAQvB,UACRuB,EAAQvB,WAAaM,EAA8BkB,mCAEG,QAAtDhC,EAAQjC,eAAeqD,IAAI3C,OAAOwD,iBAClCF,EAAQG,YAAcpB,EAA8BqB,wCAMpDJ,EAAQG,UAAY,IAKhC,OAAOlB,KAKPS,MAAOZ,MAAAA,EAAAA,EAnDyB,EAqDhCuB,gCAAiCV,EAAyBA,EAAuBM,uCAAoCtD,EACrH2D,kCAAmCX,EAC7BA,EAAuBY,kDACvB5D,GAyGP,MAAM6D,GAAmBxC,EAAAA,EAAAA,IAA2B,CACvDhE,GAAI,qFACJlB,OAhGJnB,eAAsBoB,EAAyCkF,GAAuB,IAAAwC,EAAAC,EAAAC,EAAAC,EAAAC,EAClF,IAAIC,EACAC,EACJ,MAAMC,EAA6C,GACnDA,EAAoB5C,QAAU,CAAEC,UAAWJ,EAAQjC,eAAepB,YAAY0D,UAAWC,UAAWxF,EAAMqB,WAC1G4G,EAAoBC,WAAalI,EAAM+B,SACvCkG,EAAoBE,kBAAoBnI,EAAMkC,kBAC9C+F,EAAoBG,sBAAuB,EAC3C,MAEMpC,QAAsCa,EAAAA,EAAAA,gCAA+B,CAAEzH,cAAe8F,IAG5F,IAAqC,QAAjCwC,EAAAxC,EAAQjC,eAAeqD,IAAI3C,cAAM,IAAA+D,OAAA,EAAjCA,EAAmCW,+BAAgCzC,EAAqC0C,QAAS,CACjH,MAAMC,QAlHd3J,eACIoB,EACAkF,EACAc,GAA4D,IAAAwC,EAE5D,MAAMC,EAAe,IAAI5D,EAAkC7E,EAAOgG,EAA8BkB,mCAE1FwB,QAAyBC,EAA2BF,EAAcvD,GAGxE,OAKK,QALLsD,EACIE,MAAAA,OAAgB,EAAhBA,EAAkBE,OAAOnD,MACrBoD,GACIA,EAAMjG,uBAAyBoD,EAA8BqB,uCAC7DwB,EAAMhG,wBAA0BmD,EAA8BqB,+CACrE,IAAAmB,EAAAA,EAAI,KAmGsBM,CAAqC9I,EAAOkF,EAASc,IAClCiC,EAAoBC,WAAWa,MACzEF,GAASA,EAAMlG,mBAAoB4F,MAAAA,OAAY,EAAZA,EAAc5F,oBAEP4F,GAC1CN,EAAoBC,WAAWnH,KAAKwH,GAK5C,IACqC,QAAjCZ,EAAAzC,EAAQjC,eAAeqD,IAAI3C,cAAM,IAAAgE,OAAA,EAAjCA,EAAmCU,+BAAgCzC,EAAqCoD,SACxGhD,EAA8BwB,6CAChC,KAAAyB,EAAAC,EACElJ,EAAM8B,oBAAoBU,QAA2C,QAApCyG,EAAGjJ,EAAM8B,oBAAoBU,eAAO,IAAAyG,EAAAA,EAAI,GACzEjJ,EAAM8B,oBAAoBU,QAAQ0B,QAAmD,QAA5CgF,EAAGlJ,EAAM8B,oBAAoBU,QAAQ0B,eAAO,IAAAgF,EAAAA,EAAI,GACzF,MAAMC,EAAiB,QAAQnD,EAA8BwB,+CAChCxH,EAAM8B,oBAAoBU,QAAQ0B,QAAQ6E,MAAKK,GAAUA,EAAOC,aAAeF,KAExGnJ,EAAM8B,oBAAoBU,QAAQ0B,QAAQnD,KAAK,CAC3CsI,WAAYF,EACZG,cAAc,IAK1B,GAAuB,aAAnBtJ,EAAM4B,UAAuD,QAAhCgG,EAAI1C,EAAQjC,eAAeE,aAAK,IAAAyE,GAA5BA,EAA8BxE,WAAY,CAC3E,IAAIpD,EAAMgC,SAUN,MAAM,IAAI4C,MAAM,wFAThBqD,EAAoBsB,YAAc,CAACvJ,EAAMgC,UAlCnB,GAmCtB+F,GAAUyB,EAAAA,EAAAA,uBACN,CACIpK,cAAe8F,EACfpD,oBAAqB9B,EAAM8B,qBAE/BmG,QAKL,GAAIjI,EAAMiC,YAA0C,QAAhC4F,EAAI3C,EAAQjC,eAAeE,aAAK,IAAA0E,GAA5BA,EAA8BtD,EACzD0D,EAAoBwB,gBAAkBzJ,EAAMiC,WAC5C8F,GAAUyB,EAAAA,EAAAA,uBACN,CACIpK,cAAe8F,EACfpD,oBAAqB9B,EAAM8B,qBAE/BmG,OAED,MAAIjI,EAAMiC,YAA0C,QAAhC6F,EAAI5C,EAAQjC,eAAeE,aAAK,IAAA2E,GAA5BA,EAA8B1H,WAAa8E,EAAQjC,eAAeE,MAAMqB,gBAyBnG,MAAM,IAAII,MAAM,qGAzBmG,CAEnH,MAAM8E,EAAevF,KAAKC,MAAMpE,EAAMiC,YAGtC,GADA+F,EAAkB2B,OAAOD,EAAahF,WAClCiF,OAAOC,MAAM5B,GACb,MAAM,IAAIpD,MAAM,mDACb,IAEF8E,EAAa/E,eAEd,MAAM,IAAIC,MAAM,0CAGhBqD,EAAoB4B,qBAAuBH,EAAa/E,eACxDsD,EAAoB6B,IAAM,CAAC9B,GArEL,GAsEtBD,GAAUyB,EAAAA,EAAAA,uBACN,CACIpK,cAAe8F,EACfpD,oBAAqB9B,EAAM8B,qBAE/BmG,IAQZ,OAAOpC,QAD4BkC,EACS7C,EAAS6C,EAAQgC,SAASpD,MAAOX,IAM7EhG,MA9NiBkB,IACjB,MAAMlB,GAAQ+C,EAAAA,EAAAA,GAA0B7B,EAAMyE,GAc9C,OAXI3F,EAAM8B,oBAAoBQ,QAAUpB,EAAKyC,SACzC3D,EAAM8B,oBAAoBQ,OAAO0H,IAAM9I,EAAKyC,OAAOsG,cAAgB,GAInEjK,EAAM8B,oBAAoBQ,QAAUpB,EAAK+B,eAAeE,OAASjC,EAAK+B,eAAeE,MAAM+G,OAC3FlK,EAAM8B,oBAAoBQ,OAAO6H,MAAQjJ,EAAK+B,eAAeE,MAAM+G,MAGvElK,EAAM8B,oBAAoB6E,OAAQ,EAE3B3G,KAkNX,0OC5RO,MAAMoK,EAAc,CACvBC,0BAA2B,eAC3BC,sBAAuB,oBACvBC,uBAAwB,qBACxBC,oBAAqB,WACrBC,qBAAsB,YACtBC,qBAAsB,YACtBC,sBAAuB,aACvBC,wBAAyB,cACzBC,qBAAsB,WACtBC,0BAA2B,iBAMzB,MAAOC,EAGT3M,YAAYyD,GAIL,KAAAtD,YAAc,KAAMkE,EAAAA,EAAAA,eAAc,oBAAqB/D,KAAKmD,aAE5D,KAAArD,mBAAqB,IAAM,oBAE3B,KAAAC,cAAgB,IAAiB,UAPpCC,KAAKmD,YAAcA,GAepBjD,eAAeoM,EAA6BhL,EAA0BhB,GACzE,OAAOiM,EAAAA,EAAAA,6BAA4B,CAAE7L,cAAeJ,IAAOkM,MAAMC,IACxBA,EAAoBC,oBAAsB,IAC1ElL,KAA4CmL,IACzC,IAAIC,EAAM,GACV,GAAID,EAAWhC,WACX,OAAQgC,EAAWhC,WAAW7I,eAC1B,IAAK,OACD8K,EAAMD,EAAW/B,aAAec,EAAYK,qBAAuBL,EAAYI,oBAC/E,MACJ,IAAK,QACDc,EAAMD,EAAW/B,aAAec,EAAYO,sBAAwBP,EAAYM,qBAChF,MACJ,IAAK,gBACDY,EAAMD,EAAW/B,aAAec,EAAYG,uBAAyBH,EAAYE,sBACjF,MACJ,IAAK,UACDgB,EAAMlB,EAAYC,0BAClB,MACJ,IAAK,mBACDiB,EAAMlB,EAAYQ,wBAClB,MACJ,IAAK,WACDU,EAAMlB,EAAYS,qBAClB,MACJ,IAAK,gBACDS,EAAMlB,EAAYU,+BAK1B9L,EAAIuM,UAAUC,QAAQ,2DAE1B,GAAIF,EACA,MAAO,CACHA,IAAAA,EACAD,WAAAA,MAKX/K,OAAOmL,WAIb,MAAMC,EAAehI,GACjB,IAAIqH,EAAkBrH,EAAUT,eAAepB,aAG7C8J,GAAyC1G,EAAAA,EAAAA,IAA2B,CAC7EhE,GAAI,qFACJlB,OAA8CiL,EAC9ChL,MAAO0L,IAGX,kECzGO9M,eAAewG,EAClBwG,EACA9J,EACA9C,GAEA,OAAO6M,EAAAA,EAAAA,+BAA8B,CAAEzM,cAAeJ,EAAK8C,oBAAAA,GAAuB8J,GAAgBV,MAC7FY,IACG,IAAKA,EAED,OADA9M,EAAI+M,MAAM,sDACyB,GAGvC,MAAMC,GAAUF,GAAmB,IAAI5L,KAAK+L,GAA6DA,IAEzG,OAAsB,IAAlBD,EAAO/M,QACPD,EAAI+M,MAAM,8EACyB,IAGhCC,sICtBdE,4BAAL,SAAKA,GACDA,EAAAA,EAAA,mDACAA,EAAAA,EAAA,iDAFJ,CAAKA,IAAAA,EAAa,KAQZ,MAAOC,UAAkCxK,EAAAA,EAA/CvD,kCACW,KAAAI,mBAAqB,IAAM,iBAE3B,KAAAC,cAAgB,IAEG,aAAlBC,KAAKkD,UACJlD,KAAKqD,UAAYrD,KAAKqD,SAAS9C,OAAS,GACxCP,KAAKoD,qBACFpD,KAAKoD,oBAAoBU,SACzB9D,KAAKoD,oBAAoBU,QAAQ0B,SACjCxF,KAAKoD,oBAAoBU,QAAQ0B,QAAQjF,OAAS,EAE/C,UAEJ,eA8ER,MAAMwI,GAAmBxC,EAAAA,EAAAA,IAA2B,CACvDhE,GAAI,iFACJlB,OA/DJnB,eAAsBoB,EAAkChB,GACpD,IAAIgJ,EACJ,GAAuB,aAAnBhI,EAAM4B,SAAyB,CAC/B,GAAI5B,EAAMgC,SACN,OAAOoD,EAAAA,EAAAA,GACH,CACImE,YAAa,CAACvJ,EAAMgC,UAAYkK,EAAcE,wBAC9C/G,QAAS,CACLC,UAAWtF,EAAM6B,YAAY0D,UAC7BC,UAAWxF,EAAMqB,WAErB6G,WAAYlI,EAAMmC,qBAAuBnC,EAAM+B,SAAW,IAE9D/B,EAAM8B,oBACN9C,GAGR,MAAM,IAAI4F,MAAM,oFAEhB,GAAI5E,EAAMiC,YAAcjD,EAAIiE,eAAeE,OAASnE,EAAIiE,eAAeE,MAAMoB,EACzE,OAAOa,EAAAA,EAAAA,GACH,CACIqE,gBAAiBzJ,EAAMiC,WACvBoD,QAAS,CACLC,UAAWtF,EAAM6B,YAAY0D,UAC7BC,UAAWxF,EAAMqB,WAErB6G,WAAYlI,EAAMmC,qBAAuBnC,EAAM+B,SAAW,IAE9D/B,EAAM8B,oBACN9C,GAGR,GAAIgB,EAAMiC,YAAcjD,EAAIiE,eAAeE,OAASnE,EAAIiE,eAAeE,MAAM/C,UAAW,CACpF,MAAMsJ,EAAevF,KAAKC,MAAMpE,EAAMiC,YAEtC,GADA+F,EAAkB2B,OAAOD,EAAahF,WAClCiF,OAAOC,MAAM5B,GACb,MAAM,IAAIpD,MAAM,mDACb,GAAK8E,EAAa/E,eAGrB,OAAOS,EAAAA,EAAAA,GACH,CACIC,QAAS,CACLC,UAAWtF,EAAM6B,YAAY0D,UAC7BC,UAAWxF,EAAMqB,WAErB6G,WAAYlI,EAAMmC,qBAAuBnC,EAAM+B,SAAW,GAC1D8H,qBAAsBH,EAAa/E,eACnCmF,IAAK,CAAC9B,GAAmBkE,EAAcG,wBAE3CrM,EAAM8B,oBACN9C,GAbJ,MAAM,IAAI4F,MAAM,0CAiBpB,MAAM,IAAIA,MAAM,sGAQxB5E,MAzEiBkB,IACV6B,EAAAA,EAAAA,GAA0B7B,EAAMiL,KA2E3C,kICxGA,MAAMG,EAAwB,CAC1B,gBACA,uBACA,kBACA,qBACA,wBACA,YAQS7I,EAA0BR,IACnC,MAAMsJ,EAAyBC,EAAuC,WAAYvJ,GAClF,OAAKsJ,GAA4D,IAAlCA,EAAuBtN,OAIxBsN,EACzBrM,KAAIuM,IACD,IACI,MAAMC,EAAqC,GAI3C,OAHAJ,EAAsB5M,SAAQ,CAACiN,EAAYC,KACvCF,EAAcC,GAAcF,EAAkBG,MAE3CF,EACT,MAAAG,GACE,WAGPvM,OAAOmL,SAfD,IA2CFqB,EAAmBA,CAACC,EAAchL,EAAkCiL,EAA+BC,KAE5G,QAAiBrJ,IAAb7B,EAAwB,CACxB,GAAwB,IAApBA,EAAS9C,OACT8N,EAAQG,aAAaC,OAAO,gBACzB,CACH,MAAMC,EAAiBrL,EAASsL,MAAK,CAACC,EAAOC,IACzCD,EAAM3K,iBAAmB4K,EAAO5K,iBAAmB2K,EAAM3K,gBAAkB4K,EAAO5K,gBAAkB,GAAK,IAE7GoK,EAAQG,aAAaM,IAAI,WAAYrJ,KAAKM,UA9BrB1C,CAAAA,IAC7B,MAAM0L,EAA4C,GAUlD,OARA1L,EAASrC,SAAQgD,IACb,MAAM+J,EAAyC,GAC/CH,EAAsB5M,SAAQiN,IAC1BF,EAAkB1L,KAAK2B,EAAQiK,OAEnCc,EAAmB1M,KAAK0L,MAGrBgB,GAmBqDC,CAAiBN,KAKzE,OADAL,EAAQG,aAAaC,OAAO,QACrBJ,EAAQY,KAGnB,YAAuB/J,IAAnBoJ,GAC8B,IAA1BA,EAAe/N,OACf8N,EAAQG,aAAaC,OAAO,WAE5BJ,EAAQG,aAAaM,IAAI,UAAWrJ,KAAKM,UAAUuI,IAIvDD,EAAQG,aAAaC,OAAO,QACrBJ,EAAQY,OAGfV,GACAF,EAAQG,aAAaM,IAAI,OAAQP,EAAUW,YAGxCb,EAAQY,OAQNnB,EAAkBA,CAAIlB,EAAarI,IACxCA,EAAeE,OAASF,EAAeE,MAAMmI,GACnCnH,KAAKC,MAAMC,mBAAmBpB,EAAeE,MAAMmI,KAE1D,KAOEuC,EAAiB5K,GACtB6K,EAAAA,GAASC,UACF,IAAIC,IAAIC,OAAOC,SAASP,MAI/B1K,EAAekL,IAAIC,WAAWT,KACvB,IAAIK,IAAI/K,EAAekL,IAAIC,WAAWT,MAE1C,IAAIK,IAAsB/K,EAAekL,IAAIC,gHCvH5CC,EAmDAC,EA8BAC,+tBAwDN,SAAUC,EAAYC,GACxB,OACIA,IAAkBC,EAAAA,kBAAkBC,SAMtC,SAAUC,EAAe/F,EAAegG,GAC1C,GAAgC,iBAA5BA,EAAUC,cACV,IACI,MAAMC,EAAYC,SAASnG,EAAO,IAClC,OAAIkG,EAAY,IACFA,EAAY,IAAf,IAEA,GAAGA,MAEhB,MAAOE,GACLC,QAAQC,MAAMF,GAItB,OAAOpG,EAQL,SAAUuG,EACZC,EACAC,GAGA,OAAOA,EAAmB7J,MAAM8J,GAC5BC,EAA8BH,EAAqBE,KAUrD,SAAUC,EAA8BH,EAA0CE,GAEpF,OACIA,EAAoB5M,kBAAoB0M,EAAoB1M,iBAC5D4M,EAAoBE,qBAAuBJ,EAAoBI,oBAC/DF,EAAoBG,gBAAkBL,EAAoBK,gBACzDlB,EAAYe,EAAoBG,gBAC7BH,EAAoB3M,uBAAyByM,EAAoBzM,sBAIvE,SAAU+M,EACZC,EACAC,GAEA,MAAMC,EAAmD,GACzD,IAAIC,GAAmB,EAsBvB,GArBAF,EAA0BnQ,SAASsQ,IAC/B,GAAIR,EAA8BI,EAAuBP,oBAAqBW,IAE1E,GADAD,GAAmB,EACfH,EAAuBK,YAAa,CACpC,MAAMC,EAAI7N,EAAAA,EAAA,GACH2N,GAAiB,IACpBpN,0BAC2CgB,IAAtCgM,EAAuBO,YAA4B,GAAGP,EAAuBO,cAC9EH,EAAkBpN,qBACtBC,2BACyCe,IAApCgM,EAAuBQ,UAA0B,GAAGR,EAAuBQ,YAC5EJ,EAAkBnN,wBAE1BiN,EAA0B/O,KAAKmP,SAInCJ,EAA0B/O,KAAKiP,OAIlCD,EAAkB,CACnB,MAAMG,EAAI7N,EAAAA,EAAA,GACHuN,EAAuBP,qBAAmB,IAC7CzM,0BAC2CgB,IAAtCgM,EAAuBO,YAA4B,GAAGP,EAAuBO,cAC9EP,EAAuBP,oBAAoBzM,qBAC/CC,2BACyCe,IAApCgM,EAAuBQ,UAA0B,GAAGR,EAAuBQ,YAC5ER,EAAuBP,oBAAoBxM,wBAEnDiN,EAA0B/O,KAAKmP,GAI1BN,EAAuBP,oBAAoBK,gBAAkBhB,EAAAA,kBAAkB2B,MAC5ET,EAAuBP,oBAAoBK,gBAAkBhB,EAAAA,kBAAkB4B,WACnFV,EAAuBW,8BAA8BC,mBAAqBC,EAAAA,YAAYC,cAEtFd,EAAuBW,8BAA8B3H,OAAOlJ,SAASiR,IACjE,GAAIA,EAAMhO,kBAAoBuN,EAAKvN,iBAAmBgO,EAAM/N,uBAAyBsN,EAAKtN,0BAEnF,CACH,MAAMgO,EAAgBd,EAA0Be,WAAWC,GACvDtB,EAA8BmB,EAAOG,KAErCF,GAAiB,GACjBd,EAA0BiB,OAAOH,EAAe,OAOpE,OAAOd,GA9PX,SAAYzB,GASRA,EAAAA,EAAA,iBAWAA,EAAAA,EAAA,2BAUAA,EAAAA,EAAA,eAUAA,EAAAA,EAAA,qBAxCJ,CAAYA,IAAAA,EAAgC,KAmD5C,SAAYC,GASRA,EAAAA,EAAA,mBAUAA,EAAAA,EAAA,iBAnBJ,CAAYA,IAAAA,EAAuB,KA8BnC,SAAYC,GASRA,EAAAA,EAAA,eAUAA,EAAAA,EAAA,yBAUAA,EAAAA,EAAA,uBAUAA,EAAAA,EAAA,iBAUAA,EAAAA,EAAA,mBAjDJ,CAAYA,IAAAA,EAAoB,KCxEhC,IAAqByC,EAArB,cAA2CC,EAAAA,cA2BvC7S,YAAY8S,GACRlM,MAAMkM,GA3BO,KAAAC,iBAA2B,gBA+K3B,KAAAC,SAAYnC,IACzBA,EAAEoC,iBACFpC,EAAEqC,kBAEF,MAAMC,EAAStC,EAAEuC,cACXC,EAAWF,EAAOG,aAAa,SAAU/Q,SAAS,6BAClDgR,EAAkBF,OAAW7N,EAAYlF,KAAKkT,0BAA0BL,GAE1E7S,KAAKwS,MAAMW,iBACXnT,KAAKwS,MAAMW,gBAAgB,CACvBJ,SAAAA,EACAK,YAAaP,EACbQ,cAAeJ,EACfK,gBAAiBT,EAAOU,eAhKhCvT,KAAKwT,SAAUC,EAAAA,EAAAA,kBAAiB,QAASzT,KAAKwS,MAAMkB,iBAAmB,IAxBjE,0BAAuB,IAAAC,EAC7B,IAAI,gBAAEC,GAAoB5T,KAAKwS,MAC/B,MAAM,gCAAE5J,EAA+B,iBAAEiL,GAAqB7T,KAAKwS,MAWnE,OATsB,QAAlBmB,EAAA3T,KAAKwS,MAAMhM,eAAO,IAAAmN,OAAA,EAAlBA,EAAoB/L,IAAI3C,OAAO0E,+BAAgCzC,EAAAA,qCAAqC0C,UACpGgK,EAAkBA,EAAgBhS,QAAOkS,IACrC,MAAMC,EAASF,EAAiB9M,MAC3BiN,KACKA,EAAU9J,OAAOnD,MAAMoD,GAA+B2G,EAA8B3G,EAAO2J,OAErG,OAAOC,GAAUA,EAAO/M,WAAa4B,MAGtCgL,EAAgBpS,KAAKyR,IACjB,CACHrG,IAAK5M,KAAKiU,uBAAuBhB,GACjCiB,QAASlU,KAAKmU,sBAAsBlB,GACpC9I,MAAO8I,MAUZmB,SACH,MAAM,aAAEC,EAAY,MAAEC,EAAK,WAAEC,EAAU,gBAAEC,EAAe,eAAEC,GAAmBzU,KAAKwS,MAC5EkC,EAAQ1U,KAAK2U,oBACnB3U,KAAKwT,QAAQoB,cAAcC,MAAQR,EACnC,MAAMS,GAAqBC,EAAAA,EAAAA,wBAAuB/U,KAAKwS,MAAMkB,iBAAmB1T,KAAKwT,SACrF,OACIjB,EAAAA,cAAA,OAAKyC,UAAU,sBACVN,EAAMnU,OAAS,GAAK+T,GAAS/B,EAAAA,cAAA,QAAMyC,UAAU,6BAA6BV,GAC3E/B,EAAAA,cAAA,MAAIyC,UAAWC,GAAAA,CAAWV,EAAY,2BAA4B,kBAC7DG,EAAMlT,KAAK0T,IACRlV,KAAKwT,QAAQoB,cAAcC,MAAQK,EAAKtI,IACxC,MAAMuI,GAAYJ,EAAAA,EAAAA,wBAAuB/U,KAAKwS,MAAMkB,iBAAmB1T,KAAKwT,SAE5E,OACIjB,EAAAA,cAAA,MAAIyC,UAAU,gCAAgCpI,IAAKsI,EAAKtI,KACpD2F,EAAAA,cAAA,IAAA6C,OAAAC,OAAA,CACIL,UAAU,2BACV/F,KAAMjP,KAAKwS,MAAM8C,WAAWJ,EAAK/K,OAAO,GAAM,aAClC,GAAG+K,EAAK/K,MAAMjG,wBAAwBsQ,IAClDe,QAASvV,KAAK0S,SACd8C,KAAK,SACLjT,GAAI2S,EAAKtI,KACLuI,GAEHD,EAAKhB,QAAO,IAAG,IACfgB,EAAK/K,MAAMjG,sBAAqE,KAA7CgR,EAAK/K,MAAMsL,gCAExCP,EAAK/K,MAAMsL,oCACqCvQ,IAA7CgQ,EAAK/K,MAAMsL,+BACgB,IAA/BP,EAAK/K,MAAMlG,gBAHXiM,EAAegF,EAAK/K,MAAMjG,qBAAsBgR,EAAKhB,SAIrDgB,EAAKtI,IAEX2F,EAAAA,cAAA,QACIyC,UAAW,GAAGhV,KAAKyS,6CACnB+C,KAAK,SAAQ,aACDf,UAOnCC,EAAMnU,OAAS,GAAK8T,GACjB9B,EAAAA,cAAA,IAAA6C,OAAAC,OAAA,CACIpG,KAAMjP,KAAKwS,MAAM8C,WAAW,IAAI,GAChCN,UAAU,iCACNF,EAAkB,CACtBS,QAASvV,KAAK0S,WAEb2B,IAObJ,uBAAuBtD,GAC3B,MAAM,aAAE+E,EAAY,uBAAEC,EAAsB,iBAAE9B,EAAgB,UAAEhH,EAAS,cAAE+I,GAAkB5V,KAAKwS,MAC5FqD,EAAgBH,GAAgB,MAChCI,EAAcH,EACpB,IAcII,EAdAC,EAAc,GAClB,GAAInC,GAAoBA,EAAiB9M,KAAM,CAC3C,MAAMgN,EAASF,EAAiB9M,MAC3BiN,KACKA,EAAU9J,OAAOnD,MAAMoD,GAA+B2G,EAA8B3G,EAAOwG,OAGhGoD,EAGDiC,EAAcjC,EAAOkC,SAAW,GAFhCpJ,EAAUC,QAAQ,oEAO1B,GAAIgD,EAAYa,EAAoBK,eAChC+E,EAAmBD,EACdI,QAAQ,MAAOlW,KAAKmW,aAAaxF,EAAoBzM,qBAAsByM,EAAoByF,WAC/FF,QAAQ,MAAOlW,KAAKmW,aAAaxF,EAAoBxM,sBAAuBwM,EAAoByF,gBAClG,GAA4C,IAAxCzF,EAAoB1M,gBAAuB,CAClD,MAAMoS,EAAcT,MAAAA,OAAa,EAAbA,EAAe1L,OAAOnD,MAAKuP,GAAKA,EAAEpS,uBAAyByM,EAAoBzM,uBACnG6R,GAAoBM,EAAcA,EAAYZ,8BAAgC9E,EAAoBzM,uBAAyB,QAE3H6R,EAAmBpF,EAAoB8E,+BAAiC9E,EAAoBzM,sBAAwB,GAGxH,MAAoB,WAAhB8R,GAA4C,UAAhBA,EACrBH,EAAcK,QAAQ,MAAOF,GAAaE,QAAQ,MAAO,GAAGH,KAEhEF,EAAcK,QAAQ,MAAOF,GAAaE,QAAQ,MAAO,GAAGH,KAAoBC,KAGnF7B,sBAAsBxD,GAC1B,MAAM,aAAE+E,EAAY,uBAAEC,EAAsB,iBAAE9B,EAAgB,UAAEhH,EAAS,cAAE+I,GAAkB5V,KAAKwS,MAC5FqD,EAAgBH,GAAgB,MAChCI,EAAcH,EACpB,IAcII,EAdAC,EAAc,GAClB,GAAInC,GAAoBA,EAAiB9M,KAAM,CAC3C,MAAMgN,EAASF,EAAiB9M,MAC3BiN,KACKA,EAAU9J,OAAOnD,MAAMoD,GAA+B2G,EAA8B3G,EAAOwG,OAGhGoD,EAGDiC,EAAcjC,EAAOkC,SAAW,GAFhCpJ,EAAUC,QAAQ,oEAO1B,GAAIgD,EAAYa,EAAoBK,eAChC+E,EAAmBD,EACdI,QAAQ,MAAOlW,KAAKmW,aAAaxF,EAAoBzM,qBAAsByM,EAAoByF,WAC/FF,QAAQ,MAAOlW,KAAKmW,aAAaxF,EAAoBxM,sBAAuBwM,EAAoByF,gBAClG,GAA4C,IAAxCzF,EAAoB1M,gBAAuB,CAClD,MAAMoS,EAAcT,MAAAA,OAAa,EAAbA,EAAe1L,OAAOnD,MAAKuP,GAAKA,EAAEpS,uBAAyByM,EAAoBzM,uBACnG6R,GAAoBM,EAAcA,EAAYZ,8BAAgC9E,EAAoBzM,uBAAyB,QAE3H6R,EAAmBpF,EAAoB8E,+BAAiC9E,EAAoBzM,sBAAwB,GAGxH,MAAoB,WAAhB8R,GAA4C,UAAhBA,EACrBH,EAAcK,QAAQ,MAAOF,GAAaE,QAAQ,MAAO,GAAGH,KAEhEC,EAGHG,aAAaI,EAA4BC,GAC7C,IAAKD,IAAWC,EAEZ,OADAxW,KAAKwS,MAAM3F,UAAUQ,MAAM,2CACpBkJ,GAAU,GAErB,IAAIjJ,EAASiJ,EAEb,IACIjJ,EAAStN,KAAKwS,MAAMhM,QAASiQ,iBAAiBC,eAAezL,OAAOsL,GAASC,GAC/E,MAAO/F,GACLzQ,KAAKwS,MAAM3F,UAAUC,QAAQ,8BAA8BQ,MAAWmD,KAG1E,OAAOnD,EAqBH4F,0BAA0BE,GAC9B,MAAM9F,EAAStN,KAAK2U,oBAAoB5N,MAAK4P,GAAYvD,EAAY7Q,KAAOoU,EAAS/J,MACrF,OAAQU,GAAUA,EAAOnD,YAAUjF,KA/L7B0R,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,wCALQvE,GAAasE,EAAAA,EAAAA,IAAA,CADjCE,EAAAA,IACoBxE,qBChBd,MAAMyE,EAAwCC,IAAa,IAAZ,KAAEC,GAAMD,EAC1D,OACIzE,EAAAA,cAAA,QAAMyC,UAAU,kDACZzC,EAAAA,cAAA,MAAIyC,UAAU,cACT,IACAiC,EACA,aCSV,MAAMC,EAA8DF,IAOtE,IAPuE,QACxEG,EAAO,QACP3Q,EAAO,cACP4Q,EAAa,UACbC,EAAS,iBACT3D,EAAgB,eAChB5N,GACHkR,EACG,GAAgB,OAAZG,EACA,OAAO,KAGX,MAAMG,EAAcH,EAAQI,KACtBC,EAAkBL,GAAWA,EAAQnQ,SAAWmQ,EAAQnQ,SAAW,EACnEyQ,GAAaC,EAAAA,EAAAA,uBAAsBP,EAAQI,MAAQ,GAAIC,EAAiBhR,GAAWA,EAAQmR,mBAAezS,GAC1G0S,GAAgBC,EAAAA,EAAAA,qBAAoBV,EAAQW,OAAQtR,EAAQmR,cAAcpT,eAAepB,aACzF4U,EACFjS,GAAqC,iBAAnBA,EAAoCuR,EAAUW,+BAAiCX,EAAUY,yBAGzGzE,GAAUC,EAAAA,EAAAA,kBAAiB,QAASC,EAAmB4D,EAAcE,EAAgBtI,YAErFiG,GAAYJ,EAAAA,EAAAA,wBAAuBrB,EAAmBF,GAC5D,OACIjB,EAAAA,cAAA,OAAKyC,UAAU,kCACXzC,EAAAA,cAAA,IAAA6C,OAAAC,OAAA,CACIpG,KAAMwI,EACNlC,SAAS2C,EAAAA,EAAAA,kBAAiBxE,EAAmBF,EAAS2D,EAAQI,OAC1DpC,EAAS,cACDgC,EAAQI,OAEpBhF,EAAAA,cAAA,OAAKyC,UAAU,0CAmB/B,SACIoC,EACAe,EACAC,EACAC,EACAT,EACApR,GAEA,IAAK4R,IAAaD,IAAiBf,EAC/B,OAAO,KAEX,MAAMkB,EAAkB,CACpBC,IAAKH,EACLC,QAASA,GAAoB,IAE3BG,EAAa,CACfL,aAAAA,EACAf,cAAAA,EACAqB,YAAab,GAEjB,OAAOrF,EAAAA,cAACmG,EAAAA,GAAKtD,OAAAC,OAAA,GAAKiD,EAASE,EAAU,CAAEG,oBAAoB,QAAQpU,eAAgBiC,KAtClEoS,CACGxB,EACA5Q,EAAQqS,QAAQV,aAChBhB,EAAQxP,gBACRwP,EAAQI,KACRK,EACApR,EAAQmR,cAAcpT,kBAIlCgO,EAAAA,cAAA,OAAKyC,UAAU,2CACXzC,EAAAA,cAAA,KAAGyC,UAAU,4CAA4C+C,IA8B7Ce,EA7BQ3B,MAAAA,OAAO,EAAPA,EAASI,KA8BlChF,EAAAA,cAAA,MAAIyC,UAAU,kDAAkD8D,MAD3E,IAA4BA,GCrFrB,MAAMC,EAAwB/B,IAAA,IAAC,KAAEC,EAAI,UAAEjC,EAAS,KAAE/F,EAAI,UAAE+J,GAAWhC,EAAA,OACtEzE,EAAAA,cAAA,KAAGyC,UAAWA,EAAW/F,KAAMA,EAAI,aAAc+J,GAC5C,IACA/B,EAAM,MCkBFgC,EAA4CzG,IACrD,MAAM,KAAEyE,EAAI,QAAE1B,EAAO,UAAEyD,EAAS,SAAEE,EAAQ,GAAE3W,GAAOiQ,EACnD,OACID,IAAAA,cAAA,UAAQhQ,GAAIA,EAAIyS,UAAU,aAAY,aAAagE,EAAWzD,QAASA,EAAS4D,IAAKD,GAChFjC,IAcPmC,EAAa5G,GAEXD,IAAAA,cAAC8G,EAAAA,MAAK,CACFC,WAAS,EACTC,gBAAgB,aAChBC,eAAgBhH,EAAMiH,UACtBC,OAAQlH,EAAMkH,OACdC,OAAQnH,EAAMoH,cACd5E,UAAU,0BACV6E,OAAQ,OAKdC,EAAmBtH,GACdD,IAAAA,cAACwH,EAAAA,YAAW,CAACJ,OAAQnH,EAAMoH,eAAgBpH,EAAM6E,UAAU2C,YAGhEC,EAAmBzH,GAEjBD,IAAAA,cAAC2H,EAAAA,YAAW,KACR3H,IAAAA,cAAC4H,EAAAA,OAAM,CAAC5E,QAAS/C,EAAMoH,cAAe5E,UAAU,kCAC3CxC,EAAM6E,UAAU+C,mCCtC3B,SAAUC,EAAkBzR,EAAqDuO,GACnF,IAAKvO,IAAoCR,EAAAA,gBAAgBC,YAAY8O,EAAQ7O,iBACzE,OAEJ,MAAMgS,EAAqBnD,EAAQ7O,gBAAgBvB,MAAKoO,GAAaA,EAAUnO,WAAa4B,IAC5F,OAAI0R,EACOA,EAAmB5R,eAD9B,EAMG,MAAM6R,EAAgEvD,IAcxE,IAdyE,SAC1ErX,EAAQ,QACR6G,EAAO,cACP4Q,EAAa,UACbC,EAAS,WACTmD,EAAU,SACVC,EAAQ,oBACRC,EAAmB,iBACnBhH,EAAgB,cAChBiH,EAAa,wBACbC,EAAuB,gCACvBhS,EAA+B,qBAC/BiS,EAAoB,gCACpBC,GACH9D,EACG,MAAM+D,EAA2C,CAC7CC,oBAAqB3D,EAAU2D,qBAEnC,OACIzI,EAAAA,cAAA,MAAIyC,UAAU,iBACTrV,EAAS6B,KAAI,CAAC2V,EAA8BjJ,IACzCqE,EAAAA,cAAA,MAAIyC,UAAU,iCAAiCpI,IAAKsB,GAChDqE,EAAAA,cAAC0I,EAAAA,iBAAgB,CACbzU,QAASA,EACTkN,iBAAkBA,EAClB0D,cAAeA,EACf8D,cAAe7D,EAAU8D,UACzBC,kBAAmB/D,EAAU+D,kBAC7BC,iBAAkBhE,EAAUgE,iBAC5BC,gBAAiBjE,EAAUiE,gBAC3BC,UAAWb,EACXnY,GAAIkY,EACJ7N,IAAKuK,EAAQnQ,SACbwU,SAAUhB,EACViB,KAAM,CAAEtE,QAAAA,GACRuE,gBAAiBf,EACjBC,wBAAyBA,EACzBe,eAAgBtB,EAAkBzR,EAAiCuO,GACnE0D,qBAAsBA,EACtBE,eAAgBA,EAChBa,oBAAqBvE,EAAUuE,oBAC/BC,wBAAyBf,MAAAA,OAA+B,EAA/BA,EAAiC/T,MACtD+U,GACI1T,EAAAA,gBAAgBC,YAAYyT,IAC5BA,EAAsB,GAAGC,kBAAoB5E,EAAQ6E,mDC5CrF,IAAqBC,EAArB,cAA6C1J,EAAAA,UAWzC7S,YAAmB8S,GAA4B,IAAA0J,EAAAlF,EAAAmF,EAAAC,EAAAC,EAAAC,EAAAC,EAC3CjW,MAAMkM,GAXO,KAAAgK,6BAAoD,IAAIC,IA0IxD,KAAAC,UAAY,CAACC,EAAkBC,EAAkBC,IACvD,CACH,CACIC,QAAS,GAAGH,UACZI,YAAa,GAAGH,IAChBI,iBAAkB,SAEtB,CACIF,QAAS,GAAGH,QACZI,YAAa,GAAGF,IAChBG,iBAAkB,QAgBb,KAAAC,gBAAkB,CAC/BN,EACAO,EACAC,EACAC,EACAC,EACAC,EACAT,KACqB,IAAAU,EAAAC,EAErB,MAAO,CACH,CACIjb,GAAI,GAAGoa,IAAWO,uBAClB/S,MAAQgT,GAAelS,OAAOkS,IAJN,EAKxBnE,UAAW,GAA0C,QAA1CuE,EAAGvd,KAAKwS,MAAMiL,oCAA4B,IAAAF,EAAAA,EAAI,MAAMvd,KAAK0d,eACpEC,cAAe,GAAGP,KAEtB,CACI7a,GAAI,GAAGoa,IAAWO,qBAClB/S,MAAOc,OAAOoS,IAAgBpS,OAAO4R,GACrC7D,UAAW,GAA0C,QAA1CwE,EAAGxd,KAAKwS,MAAMoL,oCAA4B,IAAAJ,EAAAA,EAAI,MAAMxd,KAAK0d,eACpEC,cAAe,GAAGL,OA7K1Btd,KAAK6d,eAAiB7d,KAAK6d,eAAeC,KAAK9d,MAC/CA,KAAK+d,kBAAoB/d,KAAK+d,kBAAkBD,KAAK9d,MACrDA,KAAKge,wBAA0Bhe,KAAKge,wBAAwBF,KAAK9d,MACjEA,KAAKie,WAAaje,KAAKie,WAAWH,KAAK9d,MACvCA,KAAKke,WAAale,KAAKke,WAAWJ,KAAK9d,MACvCA,KAAKme,iBAAmBne,KAAKme,iBAAiBL,KAAK9d,MACnDA,KAAKoe,iBAAmBpe,KAAKoe,iBAAiBN,KAAK9d,MAEnDA,KAAKqe,SAAW9L,EAAAA,YAChBvS,KAAKse,SAAW/L,EAAAA,YAEhB,MAAM,4BAAEgM,GAAgCve,KAAKwS,MACvCgM,EAA8D,QAApDtC,EAAGqC,MAAAA,OAA2B,EAA3BA,EAA6Bra,4BAAoB,IAAAgY,EAAAA,EAAI,IAClEuC,EAAaF,MAAAA,OAA2B,EAA3BA,EAA6Bpa,sBAC1CwY,EAAW,UAAU+B,OAAO1e,KAAKwS,MAAMX,8BAA8B7K,aAAa0X,OACpF1e,KAAKwS,MAAM7B,oBAAoB1M,mBAE7B0a,EAAW3e,KAAKwS,MAAM7B,oBAAoBzM,qBAC1C0a,EAAW5e,KAAKwS,MAAM7B,oBAAoBxM,sBAC1CyY,EAAW5c,KAAKmW,aAAawI,GAC7B9B,EAAW7c,KAAKmW,aAAayI,GAC7BC,EAAyB7e,KAAK0c,UAAUC,EAAUC,EAAUC,GAC5DM,EACiH,QADtGnG,EAC+C,QAD/CmF,EACyB,QADzBC,EACbpc,KAAKwS,MAAM+L,mCAA2B,IAAAnC,OAAA,EAAtCA,EAAwClY,4BAAoB,IAAAiY,EAAAA,EAAInc,KAAKwS,MAAM7B,oBAAoBzM,4BAAoB,IAAA8S,EAAAA,EAAI,IACrHqG,EAEkD,QAFvChB,EACgD,QADhDC,EACyB,QADzBC,EACbvc,KAAKwS,MAAM+L,mCAA2B,IAAAhC,OAAA,EAAtCA,EAAwCpY,6BAAqB,IAAAmY,EAAAA,EAC7Dtc,KAAKwS,MAAM7B,oBAAoBxM,6BAAqB,IAAAkY,EAAAA,EACpDuC,EACExB,EAAmBpd,KAAKmW,aAAagH,GACrCG,EAAmBtd,KAAKmW,aAAakH,GACrCyB,EAAkB9e,KAAKwS,MAAM0K,UAAY,IAAIwB,OAAO1e,KAAKwS,MAAM0K,aAAe,GAC9E6B,EAAoC/e,KAAKid,gBAC3CN,EACAmC,EACA3B,EACAC,EACAC,EACAC,EACAT,GAEJ7c,KAAKgf,MAAQ,CACTC,WAAW,EACXC,wBAAoBha,EACpBia,wBAAoBja,EACpBiY,YAAaqB,EACbnB,YAAaoB,EACbW,YAAY,EACZC,YAAY,EACZ1C,SAAAA,EACAgC,SAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAE,aAAAA,GA1DE,mBACN,OAAO/e,KAAKwS,MAAM7B,oBAAoByF,UAAY,GA6D/CkJ,sBAAsBC,EAAkCC,GAC3D,OAAIxf,KAAKgf,QAAUQ,GAAaxf,KAAKwS,QAAU+M,EAM5CE,mBAAmBC,GAClBA,IAAkB1f,KAAKwS,OACvBxS,KAAK2f,oBAINvL,SACH,MAAM,oBAAEzD,EAAmB,8BAAEkB,EAA6B,sBAAE+N,GAA0B5f,KAAKwS,MAE3F,GAAK7B,GAAwBkB,EAO7B,MAA6B,UAAzB7R,KAAKwS,MAAMqN,UACJ7f,KAAK8f,qBAGT9f,KAAK+f,gBAVRH,EAAsB/S,UAAU4D,MAC5B,kGAeJkP,oBAAiB,IAAAK,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACrB,MAAM1D,EAAW,UAAU+B,OAAO1e,KAAKwS,MAAMX,8BAA8B7K,aAAa0X,OACpF1e,KAAKwS,MAAM7B,oBAAoB1M,mBAE7B0a,EAAW3e,KAAKwS,MAAM7B,oBAAoBzM,qBAC1C0a,EAAW5e,KAAKwS,MAAM7B,oBAAoBxM,sBAC1CyY,EAAW5c,KAAKmW,aAAawI,GAC7B9B,EAAW7c,KAAKmW,aAAayI,GAC7BC,EAAyB7e,KAAK0c,UAAUC,EAAUC,EAAUC,GAC5DM,EACiH,QADtG6C,EAC+C,QAD/CC,EACyB,QADzBC,EACblgB,KAAKwS,MAAM+L,mCAA2B,IAAA2B,OAAA,EAAtCA,EAAwChc,4BAAoB,IAAA+b,EAAAA,EAAIjgB,KAAKwS,MAAM7B,oBAAoBzM,4BAAoB,IAAA8b,EAAAA,EAAI,IACrH3C,EAEkD,QAFvC8C,EACgD,QADhDC,EACyB,QADzBC,EACbrgB,KAAKwS,MAAM+L,mCAA2B,IAAA8B,OAAA,EAAtCA,EAAwClc,6BAAqB,IAAAic,EAAAA,EAC7DpgB,KAAKwS,MAAM7B,oBAAoBxM,6BAAqB,IAAAgc,EAAAA,EACpDvB,EACExB,EAAmBpd,KAAKmW,aAAagH,GACrCG,EAAmBtd,KAAKmW,aAAakH,GACrCyB,EAAkB9e,KAAKwS,MAAM0K,UAAY,IAAIwB,OAAO1e,KAAKwS,MAAM0K,aAAe,GAC9E6B,EAAoC/e,KAAKid,gBAC3CN,EACAmC,EACA3B,EACAC,EACAC,EACAC,EACAT,GAEJ7c,KAAKsgB,SAAS,CAAE3D,SAAAA,EAAUgC,SAAAA,EAAUC,SAAAA,EAAUC,OAAAA,EAAQE,aAAAA,IA8DlDe,qBACJ,MAAM,WAAES,EAAU,8BAAE1O,EAA6B,sBAAE+N,GAA0B5f,KAAKwS,OAC5E,YAAE2K,EAAW,YAAEE,EAAW,WAAE+B,EAAU,WAAEC,EAAU,mBAAEH,EAAkB,mBAAEC,GAAuBnf,KAAKgf,MAGpGwB,EAAY,CACd,cAFoBZ,EAAsBa,iBAAmB,OAAOvK,QAAQ,MAAOrE,EAA8BoE,SAAW,IAG5H,gBAAiBsK,GAOfG,EAAoB,mEACtBxB,EAAqB,qCAAuC,IAE1DyB,EAAoB,mEACtBxB,EAAqB,qCAAuC,IAI1DyB,EAAuB5gB,KAAK6gB,2BAA2B1D,EAAaiC,EAAYF,GAChF4B,EAAuB9gB,KAAK6gB,2BAA2BxD,EAAagC,EAAYF,GACtF,OACI5M,EAAAA,cAAA,OAAA6C,OAAAC,OAAA,CAAML,UAAU,0CAA6CwL,GACzDjO,EAAAA,cAAA,SAAOyC,UANW,8EAOb4K,EAAsBmB,SACvBxO,EAAAA,cAAA,SACIyC,UAAW0L,EACXM,SAAUhhB,KAAKie,WACfgD,QAASjhB,KAAKie,WACdiD,OAAQlhB,KAAKme,iBACbhU,MAAOyW,EACPzH,IAAKnZ,KAAKqe,YAGlB9L,EAAAA,cAAA,SAAOyC,UAhBW,8EAiBb4K,EAAsBuB,SACvB5O,EAAAA,cAAA,SACIyC,UAAW2L,EACXS,YAAaN,OAAuB5b,EAAY0a,EAAsByB,mBACtEL,SAAUhhB,KAAKke,WACf+C,QAASjhB,KAAKke,WACdgD,OAAQlhB,KAAKoe,iBACbjU,MAAO2W,EACP3H,IAAKnZ,KAAKse,YAGjBY,GACG3M,EAAAA,cAAA,QAAMyC,UAAU,wFACXkK,GAGRC,GAAsBD,IAAuBC,GAC1C5M,EAAAA,cAAA,QAAMyC,UAAU,wFACXmK,IAObY,gBACJ,MAAM,WAAEQ,EAAU,UAAErD,GAAcld,KAAKwS,MACjC8O,EAAiB,CACnB,gBAAiBf,GAGrB,OACIhO,EAAAA,cAACgP,EAAAA,OAAMnM,OAAAC,OAAA,CACHL,UAAU,mCACVpI,IAAK5M,KAAKgf,MAAMrC,SAChBO,UAAWA,EACX3a,GAAIvC,KAAKgf,MAAMrC,SACf6E,QAAQ,EACRC,IAAMzhB,KAAKgf,MAAML,UAAY1T,OAAOjL,KAAKgf,MAAML,gBAAczZ,EAC7Dwc,IAAM1hB,KAAKgf,MAAMJ,UAAY3T,OAAOjL,KAAKgf,MAAMJ,gBAAc1Z,EAC7Dyc,KAAM,EACNC,YAAY,aACZ/C,OAAQ7e,KAAKgf,MAAMH,OACnBgD,YAAU,EACVC,aAAW,EACX/C,aAAc/e,KAAKgf,MAAMD,aACzBgD,YAAa/hB,KAAK+d,kBAClBiD,SAAUgB,GAAAA,CAAShiB,KAAK6d,eAAgB,KACxCoE,kBAAmBjiB,KAAKge,yBACpBsD,IAKRrD,WAAWiE,GACfliB,KAAKmiB,aAAaD,EAAO,OAGrBhE,WAAWgE,GACfliB,KAAKmiB,aAAaD,EAAO,OAGrBC,aAAaD,EAA2CE,GAC5D,MAAMC,EAAc,WAAWD,IACzBE,EAAa,UAAUF,IAC7BpiB,KAAKsgB,SAAS,CACV,CAAC+B,GAAcriB,KAAKuiB,2BAA2BL,EAAMpP,cAAc3I,OACnE,CAACmY,IAAa,IAIdnE,iBAAiB+D,GACrB,MAAMM,EAAmBxiB,KAAKuiB,2BAA2BL,EAAMpP,cAAc3I,OAC7EnK,KAAKsgB,SAAS,CACVnD,YAAaqF,EACbC,YAAY,IAEhB,MAAMpE,EAAWpT,OAAOuX,IAClB,SACFE,EAAQ,8BACR7Q,EAA6B,oBAC7BlB,EAAmB,sBACnBiP,EAAqB,4BACrBrB,GACAve,KAAKwS,MACHkP,EAAOnD,GAA+BA,EAA4Bpa,4BAA0Be,EAE5Fyd,EAASjB,EAAMzW,OAAOyW,QAAOxc,EAEnC,OAAIgG,MAAMmT,IACNre,KAAKsgB,SAAS,CAAEpB,mBAAoBU,EAAsBgD,qBAC1D5iB,KAAK6iB,OAAO,QACL,GAGP7iB,KAAK8iB,eAAezE,EAAUsE,IAC9BD,EAAS,CACL7Q,8BAAAA,EACAlB,oBAAAA,EACAY,aAAa,EACbE,WAAY4M,EACZ3M,SAAUiR,KAEP,IAEX3iB,KAAK6iB,OAAO,QAEL,GAGHzE,iBAAiB8D,GACrB,MAAMa,EAAmB/iB,KAAKuiB,2BAA2BL,EAAMpP,cAAc3I,OAC7EnK,KAAKsgB,SAAS,CACVjD,YAAa0F,EACbC,YAAY,IAEhB,MAAM1E,EAAWrT,OAAO8X,IAClB,SACFL,EAAQ,8BACR7Q,EAA6B,oBAC7BlB,EAAmB,sBACnBiP,EAAqB,4BACrBrB,GACAve,KAAKwS,MACHiP,EAAOlD,GAA+BA,EAA4Bra,sBAAyB,IAE3F+e,EAAShY,OAAOwW,GAEtB,OAAIvW,MAAMoT,IACNte,KAAKsgB,SAAS,CAAEnB,mBAAoBS,EAAsBgD,qBAC1D5iB,KAAK6iB,OAAO,QACL,KAGP7iB,KAAK8iB,eAAeG,EAAQ3E,KACxB3N,EACA+R,EAAS,CACL7Q,8BAAAA,EACAlB,oBAAAA,EACAY,aAAa,EACbE,WAAYwR,EACZvR,SAAU4M,IAGdte,KAAK6iB,OAAO,QAET,GAMPA,OAAOT,GACX,MAAMjJ,EAAoB,QAAdiJ,EAAsBpiB,KAAKse,SAAWte,KAAKqe,SAEvD6E,YAAW,KACH/J,GAAOA,EAAIgK,SACXhK,EAAIgK,QAAQC,UAEjB,IAGCvC,2BACJlK,EACA0M,EACAC,GAEA,OAAID,GAAWC,QAAgCpe,IAAbyR,EACvBA,EAEJ3W,KAAKmW,aAAaQ,GAGrBmM,eAAerB,EAAaC,GAChC,MAAM,sBAAE9B,GAA0B5f,KAAKwS,MACvC,YAAYtN,IAARwc,MAIAD,EAAMC,KACN1hB,KAAKsgB,SAAS,CACVpB,mBAAoBU,EAAsB2D,qBAC1CpE,mBAAoBS,EAAsB2D,wBAEvC,IAMPpN,aAAaI,GAEjB,OADevW,KAAKwS,MAAMhM,QAAQiQ,iBAAiBC,eAAezL,OAAOsL,GAASvW,KAAK0d,cAInF6E,2BAA2BjhB,GAE/B,MAAMkiB,EAAavY,OAAO3J,GAC1B,IAAK4J,MAAMsY,GACP,OAAOliB,EAKX,OAD4BtB,KAAKwc,6BAA6BiH,IAAIniB,IACpCA,EAK1Buc,eAAe6F,GAEnB,GAA2C,cAAvCA,EAAyBC,UAA2B,CACpD,MAAM,SAAEjB,EAAQ,8BAAE7Q,EAA6B,oBAAElB,GAAwB3Q,KAAKwS,MAC1E7B,GAAuB+S,IACvBhB,EAAS,CACL7Q,8BAAAA,EACAlB,oBAAAA,EACAY,aAAa,EACbE,WAAYiS,EAAyBE,gBACrClS,SAAUgS,EAAyBG,mBAGvC7jB,KAAK8jB,oBAAoBJ,KAM7B3F,kBAAkB2F,GACtB,MAAM,SAAEhB,EAAQ,8BAAE7Q,EAA6B,oBAAElB,GAAwB3Q,KAAKwS,MAC1E7B,GAAuB+S,IACvBhB,EAAS,CACL7Q,8BAAAA,EACAlB,oBAAAA,EACAY,aAAa,EACbE,WAAYiS,EAAyBE,gBACrClS,SAAUgS,EAAyBG,mBAGvC7jB,KAAK8jB,oBAAoBJ,IAKzBI,oBAAoBJ,GACxB,GAAIA,EAAyBnhB,GAAI,CAC7B,MAAMgG,EAAUwb,SAASC,eAAe,GAAGN,EAAyBnhB,WAChEgG,GACA2a,YAAW,KACP3a,EAAQ6a,UACT,IAKPpF,wBAAwBiG,GAC5B,OAAOjkB,KAAKmW,aAAa,GAAG8N,QA9dtBrN,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,iCAPQoF,GAAerF,EAAAA,EAAAA,IAAA,CADnCE,EAAAA,IACoBmF,gUCQP,MAAOiI,UAAmB3R,EAAAA,UAKpC7S,YAAmB8S,GACflM,MAAMkM,GA8JO,KAAAE,SAAYnC,IACzBA,EAAEoC,iBAEF,MAAM,8BAAEd,EAA6B,oBAAElB,EAAmB,4BAAE4N,GAAgCve,KAAKwS,MAC7F7B,IACA3Q,KAAKwS,MAAMkQ,SAAS,CAChB7Q,8BAAAA,EACAlB,oBAAAA,EACAY,aAAcgN,IAGlB2E,YAAW,KACPljB,KAAKmkB,WAAWhB,SAAWnjB,KAAKmkB,WAAWhB,QAAQC,UACpD,KA1KPpjB,KAAK0S,SAAW1S,KAAK0S,SAASoL,KAAK9d,MACnCA,KAAKgf,MAAQ,CACTC,YAAajf,KAAKwS,MAAM+L,6BAE5Bve,KAAKmkB,WAAa5R,EAAAA,YAClBvS,KAAKwT,SAAUC,EAAAA,EAAAA,kBAAiB,QAASzT,KAAKwS,MAAMkB,iBAAmB,IAGpE4L,sBAAsBC,EAA6BC,GACtD,OAAIxf,KAAKgf,QAAUQ,GAAaxf,KAAKwS,QAAU+M,EAM5CnL,SAAM,IAAAgQ,EACT,MAAAC,EAgBIrkB,KAAKwS,OAhBH,WACF+N,EAAU,sBACVX,EAAqB,8BACrB/N,EAA6B,oBAC7BlB,EAAmB,4BACnB4N,EAA2B,sBAC3B+F,EAAqB,4BACrBC,EAA2B,MAC3BrW,EAAK,SACLsW,EAAQ,SACR9B,EAAQ,QACRlc,EAAO,iBACPkN,EAAgB,oBAChB+Q,EAAmB,qBACnBC,GAEHL,EADMM,GAAKC,EAAAA,EAAAA,GAAAP,EAAAQ,GAEZ,IAAKlU,EAED,YADAiP,EAAsB/S,UAAU4D,MAAM,sEAGrCE,EAAoBzM,sBACrB0b,EAAsB/S,UAAUC,QAC5B,2DAA2DrH,KAAKM,UAAU4K,MAGlF,MAAMmU,EAAiBjT,EAA8BC,mBAAqBC,EAAAA,YAAYC,aACtF,IAAI+S,EAAoBD,EAAiB,gBAAkB,eAC3DC,EAAoB,0BAA0BA,IAC9C,MAAM3C,EAAY0C,EAAiB,QAAU,WACvC7F,IAAcV,EAEpB,GADAwG,EAAoB9F,EAAY,GAAG8F,YAA8BA,EAC7DlT,EAA8BmT,cAAgBnV,EAAAA,qBAAqBoV,OACnE,OAAOjlB,KAAKklB,cACRvU,EACAkB,EACAoN,EACAzY,EACA0H,EACAwF,EACA4Q,EACAC,GAGRvkB,KAAKwT,QAAQoB,cAAcC,MAAyD,QAApDuP,EAAGzT,EAAoB8E,qCAA6B,IAAA2O,EAAAA,EAAIzT,EAAoBzM,qBAC5G,MAAMiR,GAAYJ,EAAAA,EAAAA,wBAAuBrB,EAAmB1T,KAAKwT,SAE3D2R,EAAcxU,EAAoB8E,+BAAiC9E,EAAoBzM,sBAAwB,GAE/GkhB,EAAezU,EAAoB0U,OAAS,EAClD,IAAIC,EAUJ,OARIA,EADiB,IAAjBF,EAC0BX,GACpBc,EAAAA,EAAAA,QAAOd,EAAqB5S,EAA8BoE,QAASkP,GACnE,GAEoBT,GACpBa,EAAAA,EAAAA,QAAOb,EAAsB7S,EAA8BoE,QAASkP,EAAaC,GACjF,GAGN7S,EAAAA,cAAA,MAAIyC,UAAU,yBAAyBzS,GAAI,GAAGsP,EAA8BoE,WAAY/H,KACpFqE,EAAAA,cAAA,IAAA6C,OAAAC,OAAA,CACIzI,IAAK2R,EAA8B,OAAS,QAC5CpF,IAAKnZ,KAAKmkB,WACVlV,KAAMjP,KAAKwlB,iBACXC,SAAU,EACVlQ,QAASvV,KAAK0S,SACdsC,UAAW+P,EACXvP,KAAM4M,EAAS,aACHkD,EAAuB,iBACnB/G,GACZpJ,EACAwP,GAEH3kB,KAAK0lB,gBACNnT,EAAAA,cAAA,QAAMyC,UAAU,gCAA+B,cAAa,QAEvD9E,EACGS,EAAoB8E,+BAAiC9E,EAAoBzM,sBAAwB,GACjG2N,EAA8BoE,cAEH/Q,IAA9ByL,EAAoB0U,OAAuB,KAAK1U,EAAoB0U,YAOjFK,gBAAa,IAAAC,EAAAC,EAAAC,EACjB,MAAMlV,EAAsB3Q,KAAKwS,MAAM7B,oBAEjCsG,EAAOtG,EAAoB8E,+BAAiC9E,EAAoBzM,sBAAwB,GAExG4hB,EAAsF,QAAzEH,EAAoD,QAApDC,EAAI5lB,KAAKwS,MAAMX,8BAA8BoE,eAAO,IAAA2P,OAAA,EAAhDA,EAAkDG,2BAAmB,IAAAJ,EAAAA,EAAI,GAC1FK,GAAYC,EAAAA,iBAAiBC,mBAAmBvV,EAAoBwV,oBACpEC,GAAYH,EAAAA,iBAAiBC,mBAAmBvV,EAAoB0V,gBAIpEC,GAHiBN,GAAYI,KAEbG,EAAAA,EAAAA,8BAA6BT,EAAe9lB,KAAKwS,MAAMhM,SAEvE,CACI,CACIZ,OAAQ,GAAsC,QAAtCigB,EAAGlV,EAAoB1M,uBAAe,IAAA4hB,EAAAA,EAAI,MAAMC,KAAiB7O,IACzE9M,MAAO8M,EACP6O,cAAAA,EACAU,aAAc7V,EAAoBwV,mBAClC/N,SAAUzH,EAAoB0V,sBAGtCnhB,EAEN,OAAKohB,EAKD/T,EAAAA,cAACkU,EAAAA,gBAAe,CACZzR,UAAU,iCACV7R,YAAanD,KAAKwS,MAAMhM,QAAQqS,QAAQ1V,YACxCujB,KAAMJ,EACNK,oBAAoB,EACpBC,cAAY,IATT,KAcPpB,iBACJ,MAAM,WAAElQ,EAAU,8BAAEzD,EAA6B,oBAAElB,EAAmB,4BAAE4N,GAAgCve,KAAKwS,MAE7G,OAAI7B,EACO2E,EAAW,CACdzD,8BAAAA,EACAlB,oBAAAA,EACAY,aAAcgN,IAIf,GAoBH2G,cACJvU,EACAkB,EACAoN,EACAzY,EACA0H,EACAwF,EACAmT,EACAC,GAEA,GAAInW,EAAoBzM,qBAAsB,KAAAiY,EAAA4K,EAC1C/mB,KAAKwT,QAAQoB,cAAcC,MAAQlE,EAAoB8E,8BACvD,MAAMN,GAAYJ,EAAAA,EAAAA,wBAAuBrB,EAAmB1T,KAAKwT,SAC3DwT,EAAgB/b,OAAOqF,SAASK,EAAoBzM,qBAAsB,IAC1E+iB,EAAgD,QAAnC9K,EAAGnc,KAAKwS,MAAM0U,6BAAqB,IAAA/K,OAAA,EAAhCA,EAAkCpV,MACpDoD,GAASA,EAAM6G,gBAAkBL,EAAoBK,gBAGnDmW,EAAiBlc,OAAOqF,UAAS2W,MAAAA,OAAa,EAAbA,EAAe/iB,uBAAwB,IAAK,IAC7EkjB,EAAyB,EAC/B,IAAIC,EAA+B,sBAE/BA,EADAL,EAAgBG,EACO,GAAGE,QACnBL,EAAgBG,EACA,GAAGE,UAEH,GAAGA,aAE9B,MAAMC,OAC4BpiB,IAA9ByL,EAAoB0U,OAAuB1U,EAAoB0U,QAAU+B,EACnEN,IAAkCvB,EAAAA,EAAAA,QAAOuB,EAAgCnW,EAAoB0U,OAC7FwB,IAA4BtB,EAAAA,EAAAA,QAAOsB,EAA0BlW,EAAoB0U,OAC3F,OACI9S,EAAAA,cAAA,MACIyC,UAAU,yBACVQ,KAAOxV,KAAKwS,MAAM+U,kBAAgCriB,EAAjB,eACjC3C,GAAI,GAAGsP,EAA8BoE,WAAY/H,KAEjDqE,EAAAA,cAAA,IAAA6C,OAAAC,OAAA,CACIpG,KAAMjP,KAAKwlB,iBACXhQ,KAAK,SAAQ,gBACEyJ,EAAS,aACZ,GAAGpN,EAA8BoE,WAAYtF,EAAoB8E,0DAC3E6R,IACF/R,QAASvV,KAAK0S,UACVyC,GAEJ5C,EAAAA,cAACiV,EAAAA,gBAAe,CACZxS,UAAWqS,EACXI,UAAWT,EACXU,YAA8D,QAAnDX,EAAEpW,EAAoB8E,qCAA6B,IAAAsR,EAAAA,EAAIpW,EAAoBzM,qBACtFyjB,WAAW,EACXC,UAAQ,EACR5O,UAAU,GACVxS,QAASA,EACTjE,GAAIvC,KAAKwS,MAAMiI,SACfe,SAAUxb,KAAKwS,MAAMqV,eACrBpM,KAAM,KAEVlJ,EAAAA,cAAA,QAAMyC,UAAU,8BAA6B,cAAchV,KAAKwS,MAAM+U,aAAe,YAASriB,QAC3DA,IAA9ByL,EAAoB0U,OAAuB,IAAI1U,EAAoB0U,8BC9OhG,MAAMyC,UAAsBvV,EAAAA,UACxB7S,YAAY8S,GACRlM,MAAMkM,GAENxS,KAAK+nB,cAAgB/nB,KAAK+nB,cAAcjK,KAAK9d,MAC7CA,KAAKgoB,iBAAmBhoB,KAAKgoB,iBAAiBlK,KAAK9d,MAEnD,MAAMioB,EAAajoB,KAAKwS,MAAM0V,wBAM9BloB,KAAKgf,MAAQ,CACTmJ,SAAUF,GAIX3I,sBAAsBC,EAAgCC,GACzD,OAAIxf,KAAKgf,QAAUQ,GAAaxf,KAAKwS,QAAU+M,EAM5CnL,SACH,MAAM,wBAAEgU,EAAuB,sBAAExI,GAA0B5f,KAAKwS,MAMhE,OAJK4V,GACDxI,EAAsB/S,UAAU4D,MAAM,wDAGtC2X,EAAwBpD,cAAgBnV,EAAAA,qBAAqBoV,QAAUjlB,KAAKwS,MAAMhM,QAAQoB,IAAI3C,OAAOojB,WAC9F,KAGP9V,EAAAA,cAAA,OAAKyC,UAAW,gCAAgCoT,EAAwBnS,WACpE1D,EAAAA,cAAC4H,EAAAA,OAAM,CACHnF,UAAWhV,KAAKgf,MAAMmJ,SAAW,qCAAuC,sCAAqC,aACjGC,EAAwBnS,SAAW,eAC/CV,QAASvV,KAAKgoB,iBAAgB,gBACfhoB,KAAKgf,MAAMmJ,UAEzBC,EAAwBnS,SAE7B1D,EAAAA,cAAC+V,EAAAA,SAAQ,CAAC5O,OAAQ1Z,KAAKgf,MAAMmJ,SAAUI,QAAS,KAC3CvoB,KAAKwoB,kBAAkBJ,KAMhCI,kBAAkBJ,GACtB,OAAItY,EAAYsY,EAAwBpX,eAC7BhR,KAAKyoB,aAAaL,GAEtBpoB,KAAK0oB,yBAAyBN,GAGjCM,yBAAyBN,GAC7B,MAAM,WACF7H,EAAU,sBACVX,EAAqB,sBACrBsH,EAAqB,QACrB1gB,EAAO,sBACP8d,EAAqB,4BACrBC,EAA2B,oBAC3BE,EAAmB,qBACnBC,EAAoB,SACpBiE,GACA3oB,KAAKwS,MAIHgD,EAFF4S,EAAwBtW,mBAAqBC,EAAAA,YAAYC,cACzDoW,EAAwBpD,cAAgBnV,EAAAA,qBAAqBoV,OACnC,CAAEzP,KAAM,gBAActQ,EAC9C0jB,EAAoBR,EAAwBle,QAAU,GACtD2e,EAAYD,EAAkBpnB,KAAI,CAACyQ,EAA4B/D,KACjE,IAAK+D,EAID,OAHA2N,EAAsB/S,UAAU4D,MAC5B,6DAA6D2X,EAAwBphB,aAAaohB,EAAwBnS,YAEvH,KAGX,MAAMsI,EAA8B7N,EAAgCuB,EAAOiV,GAE3E,OACI3U,EAAAA,cAAC2R,EAAU,CACPrS,8BAA+BuW,EAC/BzX,oBAAqBsB,EACrBsM,4BAA6BA,EAC7B2I,sBAAuBA,EAAsBtlB,QAAOknB,GAChDF,EAAkB7hB,MAAKoD,GAASA,EAAMlG,kBAAoB6kB,EAAc7kB,oBAE5E2b,sBAAuBA,EACvB8C,SAAU1iB,KAAK+nB,cACfzS,WAAYtV,KAAKwS,MAAM8C,WACvBiL,WAAYA,EACZ3T,IAAKsB,EACLA,MAAOA,EACP1H,QAASA,EACTiU,SAAUza,KAAKwS,MAAMiI,SACrBoN,eAAgB7nB,KAAKwS,MAAMqV,eAC3BnU,iBAAkB1T,KAAKwS,MAAMkB,iBAC7B4Q,sBAAuBA,EACvBG,oBAAqBA,EACrBC,qBAAsBA,EACtBH,4BAA6BA,EAC7BgD,aAAcoB,OAI1B,OACIpW,EAAAA,cAAA,KAAA6C,OAAAC,OAAA,CACIL,UAAW,2BAA2BoT,EAAwBnS,WAC1DT,EAAI,cACI4S,EAAwBnS,UAEnC4S,GAKLE,cAAcX,GAClB,OACIA,EAAwBY,uBAAyBC,EAAAA,gBAAgBC,OACjEd,EAAwBY,uBAAyBC,EAAAA,gBAAgB1H,QACjE6G,EAAwBY,uBAAyBC,EAAAA,gBAAgBE,eAE1D,SAEJ,QAGHV,aAAaL,GACjB,MAAM,WACF7H,EAAU,sBACVX,EAAqB,sBACrBsH,EAAqB,QACrB1gB,EAAO,6BACPiX,EAA4B,6BAC5BG,GACA5d,KAAKwS,MAGHqW,GADoBT,EAAwBle,QAAU,IACxB1I,KAAI,CAACyQ,EAA4B/D,KACjE,IAAK+D,EAID,OAHA2N,EAAsB/S,UAAU4D,MAC5B,4CAA4C2X,EAAwBphB,aAAaohB,EAAwBnS,YAEtG,KAGX,MAAMsI,EAA8B7N,EAAgCuB,EAAOiV,GAErErH,EAAY7f,KAAK+oB,cAAcX,GAC/Bxb,EAAM2R,EACN,GAAGA,EAA4Bra,wBAAwBqa,EAA4Bpa,wBACnF,gBAAgB+J,IACtB,OACIqE,EAAAA,cAAA,MAAIyC,UAAW,sEAAoCpI,IAAKsB,GACpDqE,EAAAA,cAAC0J,EAAe,CACZpK,8BAA+BuW,EAC/BzX,oBAAqBsB,EACrBsM,4BAA6BA,EAC7BqB,sBAAuBA,EACvB8C,SAAU1iB,KAAK+nB,cACfzS,WAAYtV,KAAKwS,MAAM8C,WACvBiL,WAAYA,EACZV,UAAWA,EACXjT,IAAKA,EACLsQ,UAAWtQ,EACXpG,QAASA,EACTiX,6BAA8BA,EAC9BG,6BAA8BA,EAC9BnD,SAAUza,KAAKwS,MAAMiI,SACrBoN,eAAgB7nB,KAAKwS,MAAMqV,qBAK3C,OAAOtV,EAAAA,cAAA,MAAIyC,UAAW,yCAAyCoT,EAAwBnS,WAAY4S,GAG/Fd,cAAc7W,GAClBlR,KAAKwS,MAAM4W,iBAAiBlY,GAGxB8W,mBACJhoB,KAAKsgB,UAAS+I,IAAa,CACvBlB,UAAWkB,EAAUlB,cAKjC,UCnPamB,EAAkCtS,IAAA,IAAC,UAAEuS,GAAWvS,EAAA,OACzDzE,EAAAA,cAAA,YACK,IACAgX,EACA,MCHIC,EAA0BxS,IAAA,IAAC,KAAEC,EAAI,UAAEjC,GAAWgC,EAAA,OACvDzE,EAAAA,cAAA,QAAMyC,UAAWA,GACZ,IACAiC,EACA,MCPF,IAAWwS,GAAlB,SAAkBA,GACdA,EAAA,UACAA,EAAA,UACAA,EAAA,UACAA,EAAA,cACAA,EAAA,YALJ,CAAkBA,IAAAA,EAAmB,wmBCqIrC,IAAqBC,GAAqBC,EAA1C,cAAmDpX,EAAAA,cAoD/C7S,YAAmB8S,EAAsEwM,GAAkC,IAAA4K,EACvHtjB,MAAMkM,GA7CO,KAAAqX,sBAAkD,CAC/D,CAAEjd,IAAKlB,EAAAA,YAAYC,0BAA2BxB,MAAOnK,KAAKwS,MAAM6E,UAAU1L,2BAC1E,CAAEiB,IAAKlB,EAAAA,YAAYI,oBAAqB3B,MAAOnK,KAAKwS,MAAM6E,UAAUvL,qBACpE,CAAEc,IAAKlB,EAAAA,YAAYK,qBAAsB5B,MAAOnK,KAAKwS,MAAM6E,UAAUtL,sBACrE,CAAEa,IAAKlB,EAAAA,YAAYM,qBAAsB7B,MAAOnK,KAAKwS,MAAM6E,UAAUrL,sBACrE,CAAEY,IAAKlB,EAAAA,YAAYO,sBAAuB9B,MAAOnK,KAAKwS,MAAM6E,UAAUpL,uBACtE,CAAEW,IAAKlB,EAAAA,YAAYG,uBAAwB1B,MAAOnK,KAAKwS,MAAM6E,UAAUxL,wBACvE,CAAEe,IAAKlB,EAAAA,YAAYQ,wBAAyB/B,MAAOnK,KAAKwS,MAAM6E,UAAUnL,yBACxE,CAAEU,IAAKlB,EAAAA,YAAYS,qBAAsBhC,MAAOnK,KAAKwS,MAAM6E,UAAUlL,sBACrE,CAAES,IAAKlB,EAAAA,YAAYU,0BAA2BjC,MAAOnK,KAAKwS,MAAM6E,UAAUjL,4BAK7D,KAAA0d,UAAgC9pB,KAAKwS,MAAMhM,QAAQqS,QAAQrU,UAAUtB,SAG9E,KAAA6mB,UAAsB,KAMtB,KAAAC,mBAAyC,EAMhC,KAAAC,kBAAoB,EAEpB,KAAAtnB,WAAY2C,EAAAA,EAAAA,IAAatF,KAAKwS,MAAMhM,QAAQqS,SAErD,KAAAqR,wBAAkC,EA6PzB,KAAAC,qBAAuB,CAACC,EAA8BzqB,KAAuD,IAAA0qB,EAAAC,EAAAC,EAAAC,EAC1H,IAAIC,EAA6B,GAsBjC,GAnBuB,aAAnBzqB,KAAK8pB,UACLM,EAAclnB,SAAW,WAEzBknB,EAAclnB,SAAW,SAGO,QAApCmnB,EAAIrqB,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA4lB,GAAhCA,EAAkC9kB,UAClCklB,EAAehlB,KAAKC,MAAMC,mBAAmB3F,KAAKwS,MAAMhM,QAAQqS,QAAQpU,MAAMc,WAGlF6kB,EAAcM,kBACT1qB,KAAKwS,MAAMhM,QAAQqS,QAAQpU,QACvBzE,KAAKwS,MAAMhM,QAAQqS,QAAQpU,MAAM+G,MAAsC,QAAlC8e,EAAItqB,KAAKwS,MAAMvN,OAAOsG,oBAAY,IAAA+e,EAAAA,EAd9C,KAe9B,EACJF,EAAcO,eAAiB,CAAEnlB,QAASilB,GAC1CL,EAAcQ,SAAyC,QAAjCL,EAAGvqB,KAAKwS,MAAMvN,OAAOsG,oBAAY,IAAAgf,EAAAA,EAjBrB,GAkBlCH,EAAcS,eAAiBlrB,EAASA,SACxCyqB,EAAcU,kBAAoBnrB,EAASsI,MAC3CmiB,EAAcW,eAAgBhmB,EAAAA,EAAAA,IAAuB/E,KAAKwS,MAAMhM,QAAQqS,SACpC,QAApC2R,EAAIxqB,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA+lB,GAAhCA,EAAkC9oB,UAAW,CAC7C,MAAMspB,EAAiBhrB,KAAKwS,MAAMiJ,KAAKuP,eAAe1d,OAClD0d,IACAZ,EAAcY,eAAiBA,KAS1B,KAAAC,qCAAuC/qB,UAA0B,IAAAgrB,EAAAC,EAC9E,MAAMC,EAAmE,QAAvDF,EAAuC,QAAvCC,EAAGnrB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA6d,OAAA,EAApCA,EAAsCN,sBAAc,IAAAK,EAAAA,EAAI,GAEvEpQ,QAAwCuQ,EAAAA,EAAAA,wDAC1C,IAAIC,EAAAA,mDAAmDF,EAAcprB,KAAKwS,MAAMhM,SAChFxG,KAAKwS,MAAMhM,QAAQmR,eAGnBvP,EAAAA,gBAAgBC,YAAYyS,IAC5B9a,KAAKsgB,SAAS,CAAExF,gCAAAA,KAOP,KAAAyQ,gBAAkBrrB,UAA0B,IAAAsrB,EAAAC,EACzD,MAAML,EAAmE,QAAvDI,EAAuC,QAAvCC,EAAGzrB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAAme,OAAA,EAApCA,EAAsCZ,sBAAc,IAAAW,EAAAA,EAAI,GACvE7rB,QAAiB+rB,EAAAA,EAAAA,gCACnB,IAAIC,EAAAA,iCAAiCP,GACrCprB,KAAKwS,MAAMhM,QAAQmR,sBAGK3X,KAAKwS,MAAMiJ,KAAK2O,eAC9BS,eAAiBlrB,GAGlB,KAAAisB,sBAAwB,KACrC,MAAM,UAAEvU,GAAcrX,KAAKwS,MAC3B,MRxc0BA,CAAAA,IACvB,CACHqZ,MAAOzS,EAAU5G,GACjBsZ,YAAahS,EAAgBtH,GAC7BuZ,YAAa9R,EAAgBzH,GAC7BwZ,UAAWzZ,IAAAA,cAAC0Z,EAAAA,UAAS,CAACjX,UAAU,4BQmczBkX,CAAkB,CACrB7U,UAAW,CACP+C,qBAAsB/C,EAAU+C,qBAChCJ,WAAY3C,EAAU2C,YAE1BN,OAAQ1Z,KAAKgf,MAAMmN,YACnB1S,UAAWzZ,KAAKosB,gBAChBxS,cAAe5Z,KAAKqsB,gBAIX,KAAAC,oBAAsB,KACnC,MAAM,KAAE7Q,EAAI,QAAEjV,EAAO,UAAE6Q,GAAcrX,KAAKwS,MAE1C,IAAI+Z,EAAsC,GAEtCA,EADA/lB,GAAWA,EAAQqS,SAAWrS,EAAQqS,QAAQpU,OAAS+B,EAAQqS,QAAQpU,MAAMoB,EAC3D,IAAIW,EAAQqS,QAAQpU,MAAMoB,KAGvC4V,EAAKnY,SAASgK,QACXqc,EAAsB6C,gBAAgBhmB,EAAQqS,QAAQnV,OAAQ+X,EAAKnY,SAASgK,OAAOmf,mBACtFhR,EAAKnY,SAASgK,QAAUmO,EAAKnY,SAASgK,OAAOiK,KAEtD,IACImV,EADAC,EAAmB,GAEnBlR,EAAK2O,eAAiB3O,EAAK2O,cAAc9c,aAA0DpI,IAAhDuW,EAAK2O,cAAc9c,OAAOwd,kBAC7E4B,EAAqBjR,EAAK2O,cAAc9c,OAAOwd,kBACxCrP,EAAK9b,UAAY8b,EAAK9b,SAAS2N,SACtCof,EAAqBjR,EAAK9b,SAAS2N,OAAOrF,OAI1C0kB,EADAD,GAA6C,IAAvBA,EAEK,IAAvBA,GACMnH,EAAAA,EAAAA,QAAOvlB,KAAKwS,MAAM6E,UAAUuV,iBAAkBF,GAC9C1sB,KAAKwS,MAAM6E,UAAUwV,YAEZtH,EAAAA,EAAAA,QAAOvlB,KAAKwS,MAAM6E,UAAUuV,iBAAkB,GAOrE,MAAO,CACHE,eAAgB,CAAE9X,UAAW,qCANhBxO,EAAQqS,QAAQkU,kBAAoB,gBAAgBvmB,EAAQqS,QAAQkU,kBAAkB3c,gBAAkB,MAOrH0I,MAAO,CACHkU,YAPYza,EAAAA,cAACiX,EAAK,CAACxU,UAAU,4CAA4CiC,KAAMI,EAAU4V,mBAQzFC,UAPUX,GAAmBha,EAAAA,cAACiX,EAAK,CAACxU,UAAU,0CAA0CiC,KAAMsV,IAQ9FY,WAPW5a,EAAAA,cAACiX,EAAK,CAACxU,UAAU,2CAA2CiC,KAAM0V,OAYxE,KAAAS,sBAAwB,KACrC,MAAM,KAAE3R,GAASzb,KAAKwS,MAChB6a,EAAoB5R,EAAK4R,kBAAkB/f,OAejD,MAAO,CACHggB,2BAA4B,CAAEC,IAAK,MAAOvY,UAAW,kDACrDwY,sBAfAH,GACAA,EAAkB7rB,KAAI,CAAC2I,EAA8B+D,IAE7CqE,EAAAA,cAACwG,EAAI,CACDnM,IAAKsB,EACL+I,KAAM9M,EAAMoN,KACZyB,UAAW,GAAGhZ,KAAKwS,MAAM6E,UAAUoW,yBAAyBtjB,EAAMoN,OAClEtI,KAAM9E,EAAMujB,QASxBC,2BAL0Bpb,EAAAA,cAAC+W,EAAS,CAACC,UAAU,QAStC,KAAAqE,oBAAsB,KACnC,MAAM,UAAEvW,GAAcrX,KAAKwS,MACrBqb,EAAiB7tB,KAAK8tB,+BAAiC9tB,KAAKgf,MAAM+O,aAAaC,qBACrF,IAAIC,EAAkBjuB,KAAKkuB,uBAEvBluB,KAAKwS,MAAMhM,QAAQoB,IAAI3C,OAAOojB,aAC9B4F,EAAkBA,EAAgBrsB,QAAOusB,GAAkBA,EAAevhB,MAAQlB,EAAAA,YAAYG,0BAgBlG,MAAO,CACHuiB,iBAAkB,CAAEpZ,UAAW,gDAC/BqZ,eAdA9b,EAAAA,cAAC+b,EAAAA,gBAAe,CACZC,eAAe,uBACfC,UAAWnX,EAAUoX,oBACrBC,WAAW,yBACXC,kBAAkB,wBAClBC,YAAY,OACZX,gBAAiBA,EACjBY,eAAgBhB,EAChBiB,eAAgB9uB,KAAK+uB,sBACrB5V,IAAKnZ,KAAKgvB,+BASL,KAAAC,eAAiB,KAC9B,MAAM,OAAEhqB,EAAM,QAAEuB,EAAO,KAAEiV,EAAI,UAAEpE,GAAcrX,KAAKwS,MAC5C4X,EAAgB3O,EAAK2O,cAAc9c,OACnCe,GAAUc,EAAAA,EAAAA,IAAc3I,EAAQqS,SAChCtN,EAAetG,EAAOsG,cAAgB,GAEtCgD,EAAY6b,MAAAA,GAAAA,EAAeM,kBAC3BN,EAAcM,mBAAqB1qB,KAAKwS,MAAMvN,OAAOsG,cAAgB,IACpEvL,KAAKwS,MAAMhM,QAAQqS,QAAQpU,QAAUzE,KAAKwS,MAAMhM,QAAQqS,QAAQpU,MAAM+G,MAAS,EAChF0jB,GAAa9E,MAAAA,OAAa,EAAbA,EAAeU,oBAAqB,EACjDqE,EAAe9X,EAAU+X,gBACzBC,EAAWhY,EAAUiY,YAE3B,OAAIJ,GAAc3jB,EACP,KAGPgH,EAAAA,cAACgd,EAAAA,uBAAsB,CACnBva,UAAU,yCACVQ,KAAK,aAAY,aACL6B,EAAUmY,oBACtB/f,IAAKpB,EAAQY,KACbwgB,IAAI,OACJ/a,MAAOwa,EACP3jB,aAAcA,EACdmkB,aAAcnhB,EACd4gB,aAAcnvB,KAAK2vB,YAAYR,GAC/BE,SAAUrvB,KAAK4vB,YAAYP,GAC3BQ,kBAAmBV,EACnBW,cAAeT,EACf3b,iBAAkB1T,KAAK0T,oBAKlB,KAAAqc,eAAiB,KAC9B,MAAM,KAAEtU,EAAI,QAAEjV,EAAO,OAAEvB,GAAWjF,KAAKwS,MACjCwd,EAAoBxpB,EAAQqS,QAAQpU,OAAS+B,EAAQqS,QAAQpU,MAAMwrB,WAAa,QAAU,SAC1FC,EACFlwB,KAAKwS,MAAMvN,OAAOG,oBAAsBgD,EAAAA,gBAAgBC,YAAYrI,KAAKgf,MAAM3b,UACzErD,KAAKgf,MAAM3b,SAASzB,QAAOoC,GAChBoE,EAAAA,gBAAgBC,YAAYrE,EAAQkG,UAAYlK,KAAKmwB,wBAAwBnsB,KAExFyX,EAAKpY,SAASiK,QACdmO,EAAKpY,SAASiK,OAAO1L,QAAOoC,GACjBoE,EAAAA,gBAAgBC,YAAYrE,EAAQkG,UAAYlK,KAAKmwB,wBAAwBnsB,KAG5FosB,EAAkB3U,EAAK2O,cAAc9c,QAAUmO,EAAK2O,cAAc9c,OAAOyd,eAAkB,GAEjG/qB,KAAKqwB,uBAAuBH,GAAiBA,EAAc3vB,OAAQ0E,EAAOwkB,qBAC1E,MAAM6G,EAAmBtwB,KAAKgqB,mBA8B9B,MAAO,CACHuG,oBAAqB,CAAEvb,UAAW,2CAClCwb,wBAAyB,CAAExb,UAAW,+CACtC3R,SA/BA6sB,GACAA,EAAc1uB,KAAI,CAAC4mB,EAAmDla,IAE9DqE,EAAAA,cAACuV,EAAa,CACVM,wBAAyBA,EACzBlB,sBAAuBkJ,EACvBxQ,sBAAuB5f,KAAKywB,uBAC5BhT,6BAA8Bzd,KAAKwS,MAAM6E,UAAUoG,6BACnDG,6BAA8B5d,KAAKwS,MAAM6E,UAAUuG,6BACnDhR,IAAKsB,EACLkb,iBAAkBppB,KAAK0wB,kBACvBpb,WAAYtV,KAAK2wB,iBACjBpQ,YAAY,EACZ2H,2BAA4BoI,GAAoBA,EAAmBpiB,GACnE8hB,kBAAmBA,EACnBxpB,QAASA,EACTiU,SAAUza,KAAKwS,MAAMjQ,GACrBslB,eAAgB7nB,KAAKwS,MAAMgJ,SAC3B9H,iBAAkB1T,KAAK0T,iBACvB4Q,sBAAuBtkB,KAAKwS,MAAM6E,UAAUiN,sBAC5CG,oBAAqBzkB,KAAKwS,MAAM6E,UAAUoN,oBAC1CC,qBAAsB1kB,KAAKwS,MAAM6E,UAAUqN,qBAC3CH,4BAA6BvkB,KAAKwS,MAAM6E,UAAUkN,4BAClDoE,SAAU3oB,KAAK2oB,eAiBlB,KAAAwH,wBAA2BnsB,IAA8C,IAAA4sB,EAAAC,EAEtF,OACI7sB,EAAQgD,YAA4C,QAApC4pB,EAAK5wB,KAAKwS,MAAMiJ,KAAK9b,SAAS2N,cAAM,IAAAsjB,OAAA,EAA/BA,EAAiC/nB,oCAErD7I,KAAKwS,MAAMhM,QAAQoB,IAAI3C,OAAO0E,8BAAgCzC,EAAAA,qCAAqC0C,SAChG5F,EAAQgD,YAA4C,QAApC6pB,EAAK7wB,KAAKwS,MAAMiJ,KAAK9b,SAAS2N,cAAM,IAAAujB,OAAA,EAA/BA,EAAiCjoB,kCAIjD,KAAAkoB,kBAAoB,KAAsB,IAAAC,EAAAC,EACvD,MAAM,UAAE3Z,EAAS,KAAEoE,EAAI,UAAE5O,GAAc7M,KAAKwS,MACtCye,EAAoBxV,EAAK2O,cAAc9c,QAAUmO,EAAK2O,cAAc9c,OAAOyd,eAAkB,GAC7FhV,EAAkD,QAAlCgb,EAAG/wB,KAAKwS,MAAMiJ,KAAKpY,SAASiK,cAAM,IAAAyjB,OAAA,EAA/BA,EAAiChqB,MAAKmqB,GAAmB,WAAdA,EAAEjb,UACtE,OACI1D,EAAAA,cAACD,EAAa,CACViC,WAAW,gCACXF,aAAcgD,EAAUhD,aACxBC,MAAO+C,EAAU8Z,mBACjB1c,eAAgB4C,EAAU5C,eAC1Bb,gBAAiBqd,EAEjBpd,iBAAkB4H,EAAKpY,SAASiK,OAChCoI,aAAc2B,EAAU3B,aACxBC,uBAAwB0B,EAAU1B,uBAClC9I,UAAWA,EACXsG,gBAAiBnT,KAAKoxB,iBACtB9b,WAAYtV,KAAKqxB,iCACjB7c,gBAAiB6C,EAAU7C,gBAC3Bd,iBAAkB1T,KAAK0T,iBACvBlN,QAASxG,KAAKwS,MAAMhM,QACpBoC,gCAAgE,QAAjCooB,EAAEhxB,KAAKwS,MAAMiJ,KAAK9b,SAAS2N,cAAM,IAAA0jB,OAAA,EAA/BA,EAAiCpoB,gCAClEgN,cAAeG,KASV,KAAAub,aAAe,KAAkB,IAAAC,EAAAC,EAAAC,EAC9C,MACIxsB,QAAQ,cAAEmS,EAAesD,oBAAqBgX,IAC9C1xB,KAAKwS,OACH,UAAE6E,GAAcrX,KAAKwS,MAErBmf,EAAyB3xB,KAAKwS,MAAMhM,QAAQoB,IAAI3C,OAAO2sB,eACvDC,EAAkBH,IAAiD,SAAnBC,GAAgD,oBAAnBA,GAE7EhyB,EAAYK,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,QAAUtN,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAOud,gBAAmB,GAC5GlQ,EAAgC,QAAnB4W,EAAGvxB,KAAKwS,MAAMsf,aAAK,IAAAP,GAAW,QAAXA,EAAhBA,EAAkBQ,iBAAS,IAAAR,OAAA,EAA3BA,EAA8B,GAC9C3W,EAA0BxS,EAAAA,gBAAgBC,YAAYrI,KAAKwS,MAAMsf,MAAMlX,yBACvE5a,KAAKwS,MAAMsf,MAAMlX,wBAAwB,GACzC,KAEAoX,EAA+D,QAAtCR,EAAGxxB,KAAKwS,MAAMiJ,KAAKwW,aAAa3kB,cAAM,IAAAkkB,OAAA,EAAnCA,EAAqCzqB,MACnEkrB,GAAsC,0DAAtBA,EAAa1a,OAEjC,OACIhF,EAAAA,cAACgI,EAAwB,CACrB5a,SAAUA,EACV6G,QAASxG,KAAKwS,MAAMhM,QACpB4Q,cAAeA,EACfC,UAAWA,EACXmD,WAAYxa,KAAKwS,MAAMgJ,SACvBf,SAAUza,KAAKwS,MAAMjQ,GACrBmY,oBAAqBmX,EACrBne,iBAAkB1T,KAAK0T,iBACvBiH,cAAeA,EACfC,wBAAyBA,EACzBhS,gCAAgE,QAAjC6oB,EAAEzxB,KAAKwS,MAAMiJ,KAAK9b,SAAS2N,cAAM,IAAAmkB,OAAA,EAA/BA,EAAiC7oB,gCAClEiS,qBAAsBmX,MAAAA,OAAyB,EAAzBA,EAA2BE,UACjDpX,gCAAiC9a,KAAKgf,MAAMlE,mCAKvC,KAAAiU,sBAAyBoD,IACtC,MACI3rB,SAAWqS,QAAStU,EAAc,cAAEoT,IACpC3X,KAAKwS,MAET,GAAKjO,GAAmBoT,GAAkB3X,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OASxEiC,OAAO6iB,QAAQC,UACX,GACA,IACAjkB,EAAAA,EAAAA,KACIe,EAAAA,EAAAA,IAAcnP,KAAKwS,MAAMhM,QAAQqS,cACjC3T,EACA,CAAClF,KAAKsyB,iCAAiCH,EAAatD,sBACpD3pB,KAGRqtB,EAAAA,EAAAA,KAAY,KACRvyB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQod,kBAAoB,EAC1D1qB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQqd,eAAiB,CACnDnlB,QAAS,CAACxF,KAAKsyB,iCAAiCH,EAAatD,yBAtBrE,CAEI,MAAMpe,EAAQ,mDAAoDlM,EAAqC,GAApB,qBAC9EoT,EAAmC,GAAnB,sCAErB3X,KAAKwS,MAAM3F,UAAUC,QAAQ2D,KAsBpB,KAAA6hB,iCAAoCE,IACjD,MAAM,KAAE/W,GAASzb,KAAKwS,MAEtB,IAAKiJ,EAAKhP,oBAAoBa,OAC1B,MAAO,GAGX,MAAMmlB,EAAsBhX,EAAKhP,oBAAoBa,OAAOvG,MAAK0F,GACtDA,EAAoBG,MAAQ4lB,EAAO5lB,MAG9C,OAAI6lB,EACOA,EAAoB9lB,WAGxB,IAOM,KAAA+lB,uBAAyB,KAA6B,IAAAC,EACnE,MAAMC,EAAmD,QAAvCD,EAAG3yB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAAqlB,OAAA,EAApCA,EAAsChI,eAC3D,GAAIviB,EAAAA,gBAAgBC,YAAYuqB,MAAAA,OAAY,EAAZA,EAAcptB,SAC1C,OAAOotB,EAAcptB,QAAQ,GAGjC,MAAMqtB,GAAe/kB,EAAAA,EAAAA,IAA8B,UAAW9N,KAAKwS,MAAMhM,QAAQqS,SACjF,OAAIzQ,EAAAA,gBAAgBC,YAAYwqB,GACrBA,EAAa,QADxB,GAWa,KAAA3E,qBAAuB,KACpC,MAAMzhB,EAAsBzM,KAAKwS,MAAMiJ,KAAKhP,oBAAoBa,OAEhE,IAAKb,EACD,MAAO,GAGX,MAAMqmB,EAA4B9yB,KAAK6pB,sBAAsBjoB,QAAOmxB,GAChEtmB,EAAoB1F,MAAKmO,GAAQ6d,EAAmBnmB,MAAQsI,EAAKtI,QAGrE,OAAOxE,EAAAA,gBAAgB4qB,YAAYF,IAOtB,KAAAhF,4BAA8B,KAC3C,MAAMmF,EAAmBjzB,KAAK0yB,yBAExBjmB,EAAsBzM,KAAKwS,MAAMiJ,KAAKhP,oBAAoBa,OAEhE,IAAK2lB,IAAqBxmB,EACtB,OAGJ,MAAMymB,EAAqBzmB,EAAoB1F,MAC3CgsB,GACIA,EAAmBpmB,WAAWhC,aAAesoB,EAAiBtoB,YAC9DooB,EAAmBpmB,WAAW/B,eAAiBqoB,EAAiBroB,eAExE,OAAKsoB,EAIElzB,KAAK6pB,sBAAsB9iB,MAAKonB,GAAkBA,EAAevhB,MAAQsmB,EAAmBtmB,WAJnG,GAOa,KAAA8jB,kBAAqBxf,IAA+D,IAAAiiB,EACjG,MACI3sB,SAAWqS,QAAStU,EAAc,cAAEoT,IACpC3X,KAAKwS,MAET,IAAKjO,IAAmBoT,IAAkB3X,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQ,CAC5E,MAAMmD,EAAQ,gEACPlM,EAAqC,GAApB,qBAA2BoT,EAAmC,GAAnB,sCAEnE,YADA3X,KAAKwS,MAAM3F,UAAUC,QAAQ2D,GAKjC,MAAMW,EAA4BH,EAC9BC,GACoC,QAApCiiB,EAAAnzB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA6lB,OAAA,EAApCA,EAAsCpI,gBAAiB,IAG3Dxb,OAAO6iB,QAAQC,UAAU,GAAI,IAAIjkB,EAAAA,EAAAA,KAAiBe,EAAAA,EAAAA,IAAcnP,KAAKwS,MAAMhM,QAAQqS,SAAUzH,KAC7FmhB,EAAAA,EAAAA,KAAY,KACRvyB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQod,kBAAoB,EAC1D1qB,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQyd,cAAgB3Z,MAI7C,KAAAuf,iBAAoBzf,IACjC,GAAIlR,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAQ,CACtC,MAAM8lB,EAAwBniB,EAC1BC,EACAlR,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAOyd,eAAiB,IAG1D,OAAO3c,EAAAA,EAAAA,KAAiBe,EAAAA,EAAAA,IAAcnP,KAAKwS,MAAMhM,QAAQqS,SAAUua,GAGvE,OADApzB,KAAKwS,MAAM3F,UAAUC,QAAQ,uFACtB,IAGM,KAAAskB,iBAAoBe,IACjC,MAAM,KAAE1W,EAAI,UAAE5O,GAAc7M,KAAKwS,MAEjC,IAAKiJ,EAAK2O,cAAc9c,OAEpB,YADAT,EAAUC,QAAQ,sGAItB,IAAIqE,EAA6BsK,EAAK2O,cAAc9c,QAAUmO,EAAK2O,cAAc9c,OAAOyd,eAAkB,GAE1G,GAAKoH,EAAapf,SASX,CACH5B,EAA4B,GAG5B,MAAMkiB,EAAoBrzB,KAAKgvB,2BAA2B7L,SAAWnjB,KAAKgvB,2BAA2B7L,QAAQ3Q,MAAMkc,WAC7G4E,EAAkBD,GAAqBtP,SAASC,eAAeqP,GACrEnQ,YAAW,KACPoQ,GAAmBA,EAAgBlQ,UACpC,QAjBqB,CACxB,MAAMmQ,EAAiBpB,EAAa9e,cACpC,IAAKkgB,EAED,YADA1mB,EAAUC,QAAQ,gFAGtBqE,EAA4BA,EAA0BvP,QACjD0P,IAA4CR,EAA8ByiB,EAAgBjiB,KAanG,MAAMjD,GAAUc,EAAAA,EAAAA,IAAcnP,KAAKwS,MAAMhM,QAAQqS,SACjDtJ,OAAO6iB,QAAQC,UAAU,GAAI,IAAIjkB,EAAAA,EAAAA,IAAiBC,EAAS8C,IAC3DsK,EAAK2O,cAAc9c,OAAOod,kBAAoB,EAC9CjP,EAAK2O,cAAc9c,OAAOyd,cAAgB5Z,GAG7B,KAAAkgB,iCAAmC,CAACpe,EAAsCugB,KACvF,MAAM,KAAE/X,EAAI,UAAE5O,GAAc7M,KAAKwS,MAC3BnE,GAAUc,EAAAA,EAAAA,IAAcnP,KAAKwS,MAAMhM,QAAQqS,SAEjD,IAAK4C,EAAK2O,cAAc9c,OAEpB,OADAT,EAAUC,QAAQ,yGACXuB,EAAQY,KAGnB,IAAIkC,EAA6BsK,EAAK2O,cAAc9c,QAAUmO,EAAK2O,cAAc9c,OAAOyd,eAAkB,GAE1G,GAAKyI,EASDriB,EAA4B,OATf,CACb,IAAK8B,EAED,OADApG,EAAUC,QAAQ,wFACXuB,EAAQY,KAEnBkC,EAA4BA,EAA0BvP,QACjD0P,IAA4CR,EAA8BmC,EAAiB3B,KAMpG,OAAOlD,EAAAA,EAAAA,IAAiBC,EAAS8C,IAwBpB,KAAAkf,uBAAyB,CAACH,EAAwBuD,KAC/D,OAAQA,GACJ,KAAKhK,EAAoBiK,IACrB1zB,KAAKgqB,mBAAqBkG,EAC1B,MACJ,KAAKzG,EAAoBkK,IACrB3zB,KAAKgqB,mBAAqB,EAC1B,MACJ,KAAKP,EAAoBmK,IACrB5zB,KAAKgqB,mBAAqB,EAC1B,MACJ,KAAKP,EAAoBoK,MACrB7zB,KAAKgqB,mBAAqB,EAC1B,MACJ,KAAKP,EAAoBqK,KACrB9zB,KAAKgqB,mBAAqB,EAC1B,MACJ,QACIhqB,KAAKgqB,mBAAqB,IASrB,KAAA2F,YAAeoE,GAExBxhB,EAAAA,cAAA,OAAKyC,UAAU,wBACXzC,EAAAA,cAAA,QAAMyC,UAAU,oCAAmC,cAAa,SAChEzC,EAAAA,cAAA,QAAMyC,UAAU,aAAa+e,IAUxB,KAAAnE,YAAeoE,GAExBzhB,EAAAA,cAAA,OAAKyC,UAAU,wBACXzC,EAAAA,cAAA,QAAMyC,UAAU,aAAagf,GAC7BzhB,EAAAA,cAAA,QAAMyC,UAAU,qCAAoC,cAAa,UAz1BzEhV,KAAK+pB,UAAoD,YAAnB,QAArBH,EAAApX,EAAMhM,QAAQqS,eAAO,IAAA+Q,GAAQ,QAARA,EAArBA,EAAuBqK,cAAM,IAAArK,OAAA,EAA7BA,EAA+BsK,MAAoB,KAAO,KAC3El0B,KAAKosB,gBAAkB7Z,EAAAA,YACvBvS,KAAKgvB,2BAA6Bzc,EAAAA,YAClCvS,KAAKqsB,aAAersB,KAAKqsB,aAAavO,KAAK9d,MAC3CA,KAAKm0B,gBAAkBn0B,KAAKm0B,gBAAgBrW,KAAK9d,MACjDA,KAAKo0B,cAAgB,GACrBp0B,KAAKgf,MAAQ,CACT+O,aAAc,CACVsG,SAAS,EACTrG,qBAAsBhuB,KAAK6pB,sBAAsB,IAErDsC,aAAa,EACb9oB,SAAU,IAEd,MAAM,mBAAEge,EAAkB,SAAEN,EAAQ,SAAEI,EAAQ,gBAAEV,GAAoBzgB,KAAKwS,MAAM6E,UAEzE3T,EAAS1D,KAAKwS,MAAMhM,QAAQqS,QAAQnV,OACpCmJ,EAAY7M,KAAKwS,MAAM3F,UACvB+V,EAAqB5iB,KAAKwS,MAAM6E,UAAUid,yBAC1C/Q,EAAuBvjB,KAAKwS,MAAM6E,UAAUkd,wBAClDv0B,KAAKywB,uBAAyB,CAC1B5jB,UAAAA,EACAnJ,OAAAA,EACA2d,mBAAAA,EACAN,SAAAA,EACAI,SAAAA,EACAV,gBAAAA,EACAmC,mBAAAA,EACAW,qBAAAA,GAEJvjB,KAAK0T,kBAAmB8gB,EAAAA,EAAAA,oBACpBx0B,KAAKwS,MAAMhM,QAAQqS,QAAQkU,kBAC3B/sB,KAAKwS,MAAMiiB,aACXz0B,KAAKwS,MAAM3F,WAEf7M,KAAKm0B,kBAtFC,eACN,MAA0B,OAAnBn0B,KAAK+pB,WAAyC,OAAnB/pB,KAAK+pB,UAsCpC,uBAAuBrmB,EAAgBgxB,GAAyC,IAAAC,EACnF,IAAIC,EAKJ,OAJIlxB,GAAUgxB,GAAoBtsB,EAAAA,gBAAgBC,YAAYqsB,KAC1DE,EAAkBF,EAAiB3tB,MAAKmO,GAAQA,EAAK2f,SAAUzkB,gBAAkB1M,EAAO0M,iBAGtE,QAAtBukB,EAAOC,SAAe,IAAAD,OAAA,EAAfA,EAAiBhjB,KA4CrB,0BAAuB,IAAAmjB,EACtB1lB,EAAAA,GAASC,WAAaE,OAAOwlB,mBAC7BxlB,OAAOwlB,iBAAiB,SAAU/0B,KAAKm0B,iBACvCn0B,KAAKm0B,mBAGT,MAAM/J,QAAsBpqB,KAAKwS,MAAMiJ,KAAK2O,cACtCzqB,QAAiBK,KAAKwS,MAAMiJ,KAAK9b,SAEvCK,KAAKmqB,qBAAqBC,EAAezqB,IAGzCq1B,EAAAA,EAAAA,KACI,KAAK,IAAAC,EAAAC,EACD,MAAO,CACwB,QADxBD,EACH7K,EAAcW,qBAAa,IAAAkK,OAAA,EAA3BA,EAA6B10B,OAC7B6pB,EAAcM,kBACdtiB,EAAAA,gBAAgBC,YAAwC,QAA7B6sB,EAAC9K,EAAcO,sBAAc,IAAAuK,OAAA,EAA5BA,EAA8B1vB,aAGlEtF,UAAW,IAAAi1B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAnR,EAAAoR,EACP,MAAMC,QAAyB11B,KAAKwS,MAAMiJ,KAAK2O,cACzC9oB,EAAQ,IAAI2F,EAAAA,iCACdyuB,EAAiBxyB,SACjBlD,KAAKwS,MAAMhM,QAAQqS,QAAQ1V,YAC3B,CACIS,OAAQ,CACJ0H,IAAKtL,KAAKwS,MAAMvN,OAAOsG,aACvBE,KAAMkqB,KAAKjU,IAAIgU,EAAiB9K,UAA8C,QAAtCuK,EAAIO,EAAiBhL,yBAAiB,IAAAyK,EAAAA,EAAI,GAAI,IAE1FltB,OAAO,EACPnE,QAAwC,QAAjCsxB,EAAEM,EAAiB/K,sBAAc,IAAAyK,EAAAA,EAAI,IAElB,QAD7BC,EACDK,EAAiB3K,qBAAa,IAAAsK,EAAAA,EAAI,KAEhCr1B,KAAKwS,MAAMhM,QAAQqS,QAAQrU,UAAUoxB,UAAY,GAGnB,QAAhCN,EAAAt1B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA6wB,GAAhCA,EAAkCzvB,EAC5B7F,KAAKwS,MAAMhM,QAAQqS,QAAQpU,MAAMoB,EACjCJ,KAAKM,UAAU,CACXC,UAA2C,QAAlCuvB,EAAEv1B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA8wB,OAAA,EAAhCA,EAAkC7zB,UAC7CuE,eAAgD,QAAlCuvB,EAAEx1B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA+wB,OAAA,EAAhCA,EAAkC1vB,mBAGhD,QAAXue,EAACrkB,KAAKwS,aAAK,IAAA6R,GAAQ,QAARA,EAAVA,EAAYpf,cAAM,IAAAof,IAAlBA,EAAoB7gB,mBACtBxD,KAAKwS,MAAMvN,OAAOG,mBAClBpF,KAAKwS,MAAMhM,QAAQqS,QAAQnV,OAC3B1D,KAAK2C,WAGHkzB,QAAuBC,EAAAA,EAAAA,SAAsBx0B,EAAOtB,KAAKwS,MAAMhM,QAAQmR,eAa7E,GAZA+d,EAAiB5K,kBAAoB+K,EAAe5tB,MACpDytB,EAAiB7K,eAAiBgL,EAAel2B,SAI7CK,KAAKwS,MAAMvN,OAAO8wB,+BAC6B,QADAN,EAC/Cz1B,KAAKwS,MAAMhM,QAAQmR,cAAcpT,sBAAc,IAAAkxB,GAAM,QAANA,EAA/CA,EAAiDO,YAAI,IAAAP,GAArDA,EAAuDQ,iBAGvDj2B,KAAKurB,kBAGLvrB,KAAKwS,MAAMvN,OAAOG,mBAAoB,KAAA8wB,EAAAC,EAAAC,EAAAC,EAAAC,EACtC,MAAMvsB,EAAe,IAAI0D,EAAAA,0BACrBioB,EAAiBxyB,SACjBlD,KAAKwS,MAAMhM,QAAQqS,QAAQ1V,YAC3B,CACIS,OAAQ,CACJ0H,IAAKtL,KAAKwS,MAAMvN,OAAOsG,aACvBE,KAAMkqB,KAAKjU,IACPgU,EAAiB9K,UAA8C,QAAtCsL,EAAIR,EAAiBhL,yBAAiB,IAAAwL,EAAAA,EAAIl2B,KAAKiqB,mBACxEjqB,KAAKiqB,oBAGbhiB,OAAO,EACPnE,QAAwC,QAAjCqyB,EAAET,EAAiB/K,sBAAc,IAAAwL,EAAAA,EAAI,IAElB,QAD7BC,EACDV,EAAiB3K,qBAAa,IAAAqL,EAAAA,EAAI,KAEhCp2B,KAAKwS,MAAMhM,QAAQqS,QAAQrU,UAAUoxB,UAAY,GACnB,QAAhCS,EAAAr2B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA4xB,GAAhCA,EAAkCxwB,EAC5B7F,KAAKwS,MAAMhM,QAAQqS,QAAQpU,MAAMoB,EACD,QADEywB,EAClCt2B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAA6xB,OAAA,EAAhCA,EAAkC50B,WACxC,EACA1B,KAAKwS,MAAMvN,OAAOG,wBAClBF,EACAlF,KAAK2C,WAGHU,QAAiBkzB,EAAAA,EAAAA,SAA4BxsB,EAAc/J,KAAKwS,MAAMhM,QAAQmR,eACpF3X,KAAKsgB,SAAS,CAAEjd,SAAAA,QAMxBrD,KAAKwS,MAAMvN,OAAO8wB,+BAE6B,QAD/CjB,EACA90B,KAAKwS,MAAMhM,QAAQmR,cAAcpT,sBAAc,IAAAuwB,GAAM,QAANA,EAA/CA,EAAiDkB,YAAI,IAAAlB,GAArDA,EAAuDmB,iBAGvDj2B,KAAKurB,kBAGT,MAAM/kB,EAAUxG,KAAKwS,MAAMhM,QACrBgwB,EAAmChwB,EAAQoB,IAAI3C,OAAOwxB,wBACtDC,EAA8BlwB,EAAQoB,IAAI3C,OAAO0xB,uBAEnDvuB,EAAAA,gBAAgBC,YAAYmuB,KAC3BA,EAAiCv0B,SAAS20B,EAAAA,eAAeC,OAC1DzuB,EAAAA,gBAAgBC,YAAYquB,KAC3BA,EAA4Bz0B,SAAS20B,EAAAA,eAAeC,OACrD72B,KAAKwS,MAAMvN,OAAOzB,yBAEZxD,KAAKirB,uCAIZ6L,uBACC1nB,EAAAA,GAASC,WAAaE,OAAOwnB,qBAC7BxnB,OAAOwnB,oBAAoB,SAAU/2B,KAAKm0B,iBAI3C/f,SAAM,IAAA4C,EAAAggB,EAAAC,EAAAC,EAAAC,EAAAC,EACT,MACInyB,QAAQ,cAAEmS,EAAa,UAAEpC,GAAW,UACpCqC,EACAoE,MAAM,cAAE2O,EAAezqB,SAAU03B,EAAiB,eAAErM,IACpDhrB,KAAKwS,OAEJxS,KAAKkqB,wBAA0BE,EAAc9c,QAAU+pB,EAAkB/pB,SAC1EtN,KAAKmqB,qBAAqBC,EAAc9c,OAAQ+pB,EAAkB/pB,QAClEtN,KAAKkqB,wBAAyB,GAGlC,MAAMvqB,EAAYK,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,QAAUtN,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,OAAOud,gBAAmB,GAC5GyM,EAA6E,QAAhEtgB,EAAuC,QAAvCggB,EAAuB,QAAvBC,EAAG7M,EAAc9c,cAAM,IAAA2pB,OAAA,EAApBA,EAAsBjM,sBAAc,IAAAgM,EAAAA,EAAIhM,EAAe1d,cAAM,IAAA0J,EAAAA,EAAI,KACvF,IAAIugB,EAAY,GACXnvB,EAAAA,gBAAgBC,YAAY1I,KAC7B43B,EAA+B,aAAnBv3B,KAAK8pB,UAA2BzS,EAAUmgB,2BAA6BngB,EAAUogB,0BAEjG,MAAMC,EAAoB13B,KAAKsxB,eACzBqG,EACFplB,EAAAA,cAAC2E,EAAuB,CACpBC,QAASmgB,EACT9wB,QAASxG,KAAKwS,MAAMhM,QACpB4Q,cAAeA,EACfC,UAAWA,EACXmD,WAAYxa,KAAKwS,MAAMgJ,SACvBf,SAAUza,KAAKwS,MAAMjQ,GACrBmR,iBAAkB1T,KAAK0T,iBACvB5N,eAAgD,QAAlCoxB,EAAEl3B,KAAKwS,MAAMhM,QAAQqS,QAAQpU,aAAK,IAAAyyB,OAAA,EAAhCA,EAAkCpxB,iBAIpD8xB,EAA8Bj0B,GAAAA,GAAA,GAC7B3D,KAAKwS,OAAK,IACb7S,SAAU+3B,EACVG,eAAgB73B,KAAKssB,sBACrBe,mBAAoBrtB,KAAKwS,MAAMvN,OAAO6yB,kBAAoB93B,KAAKotB,wBAC/D2K,WAAY/3B,KAAK+vB,iBACjB/a,UAAWC,GAAAA,CAAW,6BAA8BD,GACpD0U,sBAAuB,CACnBsO,YAAah4B,KAAKwS,MAClBwC,UAAWC,GAAAA,CAAW,6BAA8BD,IAExDijB,cAA2E,KAAxB,QAApCd,EAAAn3B,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA6pB,OAAA,EAApCA,EAAsCrM,mBAA0B9qB,KAAK4tB,sBAAwB,KAC5GsK,WAAYl4B,KAAKivB,iBACjBkJ,kBAAmB,CAAEnjB,UAAW,wCAChCojB,wBAAyB,CAAEpjB,UAAW,+CACtCqjB,qBAAsB,CAAErjB,UAAW,oDACnCsjB,iCAAkC,CAAEtjB,UAAW,sDAC/CujB,cAAev4B,KAAK8wB,oBACpB0H,YACgE,KAAxB,QAApCpB,EAAAp3B,KAAKwS,MAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA8pB,OAAA,EAApCA,EAAsCtM,mBAClCvY,EAAAA,cAAC0G,EAAW,CACRhC,KAAMI,EAAU2C,WAChBhB,UAAW3B,EAAU2C,WACrBd,SAAUlZ,KAAKosB,gBACf7W,QAASvV,KAAKqsB,aACd9pB,GAAG,wBAEP,KACRk2B,kBAAmBz4B,KAAK4rB,wBACxBjD,SAAU3oB,KAAK2oB,SACf+P,aAAcnB,GAAahlB,EAAAA,cAACwE,EAAY,CAACE,KAAMsgB,IAC/CoB,uBAAwB,CAAE3jB,UAAW,4BACrC4jB,mBAAoBtB,EAAgBK,EAAmB,KACvDvD,cAAep0B,KAAKo0B,gBAExB,OAAOp0B,KAAKwS,MAAMqmB,WAAWjB,GAgjBzBkB,eACJ,OAAI1pB,EAAAA,GAASC,WACFsZ,EAAAA,EAAAA,UAAS,CAAEoQ,QAASC,EAAAA,YAAYC,QAASzyB,QAASxG,KAAKwS,MAAMhM,QAAQqS,WAEzE8P,EAAAA,EAAAA,UAAS,CAAEoQ,QAASC,EAAAA,YAAYE,SAAU1yB,QAASxG,KAAKwS,MAAMhM,QAAQqS,UAGzEwT,eACJrsB,KAAKsgB,SAAS,CACV6L,aAAcnsB,KAAKgf,MAAMmN,cAIzBgI,kBACJn0B,KAAK+pB,UAAY/pB,KAAK84B,eAElB94B,KAAKgf,MAAMmN,cAAgBnsB,KAAK2oB,UAChC3oB,KAAKqsB,kBA31BHzV,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,+BAqBTD,EAAAA,EAAAA,IAAA,CADCuiB,EAAAA,IAAU,iCAxBMzP,GAAqBC,GAAA/S,EAAAA,EAAAA,IAAA,CADzCE,EAAAA,IACoB4S,iKCpHhB0P,wGAAL,SAAKA,GACDA,EAAAA,EAAA,4DACAA,EAAAA,EAAA,+EACAA,EAAAA,EAAA,+EAHJ,CAAKA,IAAAA,EAAmB,KAmBlB,MAAO92B,EAAb5C,cACW,KAAAk2B,SAAmB,EACnB,KAAAthB,MAAgB,IAQ3B,MAAM+kB,EAAsB7mB,GAEpBD,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAK7C,EAAM2lB,mBACX3lB,EAAMkmB,aACNlmB,EAAM7S,UAWnB,SAAS0a,EAAkBzR,EAAqDuO,GAC5E,IAAKvO,IAAoCR,EAAAA,gBAAgBC,YAAY8O,EAAQ7O,iBACzE,OAEJ,MAAMgS,EAAqBnD,EAAQ7O,gBAAgBvB,MAAKoO,GAAaA,EAAUnO,WAAa4B,IAC5F,OAAI0R,EACOA,EAAmB5R,eAD9B,EAMJ,SAAS6wB,EAAmBC,EAA8D5zB,EAAgBvF,GACtG,MAAMo5B,EAAQD,EAAazyB,MAAK2yB,GAAMA,EAAGviB,QAAQW,SAAWlS,GAAU8zB,EAAGviB,QAAQwiB,uBAAyBt5B,IAC1G,OAAOo5B,MAAAA,OAAK,EAALA,EAAOG,WAAY,EAW9B,MAAMC,EAAgCA,CAClCrnB,EACA2E,EACAjJ,EACA4rB,EACAC,EACAC,EACAC,EACAC,EACAV,EACAW,KACoB,IAAAC,EAAAC,EAAAC,EACpB,MAAM,OAAEr1B,EAAM,QAAEuB,EAAO,UAAE6Q,EAAS,SAAEsR,GAAanW,EAC3CkB,GAAmB8gB,EAAAA,EAAAA,oBAAmBhiB,EAAMhM,QAAQqS,QAAQkU,kBAAoBva,EAAMiiB,aAAcjiB,EAAM3F,WAC1G8kB,EAAiBnf,EAAMhM,QAAQoB,IAAI3C,OAAO2sB,eAC1C2I,EAAc/nB,EAAMvN,OAAOyV,sBAA2C,SAAnBiX,GAAgD,oBAAnBA,GAChF6I,EAAYL,EACZ,sDACA,iCACAM,EAAgBryB,EAAAA,gBAAgBC,YAAYmK,EAAMsf,MAAMC,WAAavf,EAAMsf,MAAMC,UAAU,QAAK7sB,EAChG0D,EAA4D,QAA7BwxB,EAAG5nB,EAAMiJ,KAAK9b,SAAS2N,cAAM,IAAA8sB,OAAA,EAA1BA,EAA4BxxB,gCAC9DopB,EAA0D,QAAjCqI,EAAG7nB,EAAMiJ,KAAKwW,aAAa3kB,cAAM,IAAA+sB,OAAA,EAA9BA,EAAgCtzB,MAC9DkrB,GAAsC,0DAAtBA,EAAa1a,OAE3BwD,EAA2C,CAC7CC,oBAAqB3D,EAAU2D,qBAG7BJ,EAA0BxS,EAAAA,gBAAgBC,YAAYmK,EAAMsf,MAAMlX,yBAClEpI,EAAMsf,MAAMlX,wBAAwB,GACpC,KAEA8f,EAAsB,QAAlBJ,EAAG9nB,EAAMiJ,KAAKif,YAAI,IAAAJ,GAAQ,QAARA,EAAfA,EAAiBhtB,cAAM,IAAAgtB,OAAA,EAAvBA,EAAyBI,KAChCC,EAAYD,MAAAA,OAAI,EAAJA,EAAME,UACxB,IAAIC,EACAF,GAAaA,EAAUp6B,SACvBs6B,GAAuBC,EAAAA,EAAAA,GACnBH,EAAU,GAAGI,oBACb,uBACAC,EAAAA,EAA0BC,UAIlC,MAAMC,EAAYjB,EAAsBlzB,MAAKmO,IAAO,IAAAimB,EAChD,OACIjmB,EAAKhU,yBAAyB8E,YAAcmR,EAAQnQ,UACW,QAApB,QAA3Cm0B,EAAAjmB,EAAKhU,yBAAyBC,qBAAa,IAAAg6B,OAAA,EAA3CA,EAA6Cr5B,kBAI/Cs5B,EAAYnB,EAAsBlzB,MAAKmO,IAAO,IAAAmmB,EAChD,OACInmB,EAAKhU,yBAAyB8E,YAAcmR,EAAQnQ,UACW,QAApB,QAA3Cq0B,EAAAnmB,EAAKhU,yBAAyBC,qBAAa,IAAAk6B,OAAA,EAA3CA,EAA6Cv5B,kBAGrD,IAAIw5B,GAAYJ,MAAAA,OAAS,EAATA,EAAWK,kBAAmB,MAC5B,QAAdD,IACAA,GAAYF,MAAAA,OAAS,EAATA,EAAWG,kBAAmB,OAE9C,MAAMC,EAAYxB,EAASjzB,MAAKmO,GAAQA,EAAK4C,SAAWX,EAAQW,SAE9C,IAAA2jB,EAAAC,EA+CPC,EAAAC,EAhDX,OAAIjT,GAAmB1jB,EAAO42B,YACtB9B,EAEIxnB,IAAAA,cAAA,MAAIyC,UAAW,gCAAiCpI,IAAKuK,EAAQnQ,UACzDuL,IAAAA,cAAC0I,EAAAA,iBAAgB,CACbzU,QAASA,EACTkN,iBAAkBA,EAClB0D,cAAenS,EAAOmS,cACtB8D,cAAe7D,EAAU8D,UACzBC,kBAAmB/D,EAAU+D,kBAC7BC,iBAAkBhE,EAAUgE,iBAC5BC,gBAAiBjE,EAAUiE,gBAC3BC,UAAWgf,EACXh4B,GAAIiQ,EAAMjQ,GACVqK,IAAKuK,EAAQnQ,SACbwU,SAAUhJ,EAAMgJ,SAChBC,KAAM,CAAEtE,QAAAA,GACRuE,gBAAiB+e,EACjB7f,wBAAyBA,EACzBuf,4BAA6BA,EAC7Bxe,eAAgB2f,EAChBzgB,qBAAsBmX,MAAAA,OAAyB,EAAzBA,EAA2BE,UACjDnX,eAAgBA,EAChBa,oBAAqBvE,EAAUuE,oBAC/BkgB,YAAYnT,GAAmB1jB,EAAO42B,YACtCE,QAASP,IAEXX,EAeEtoB,IAAAA,cAAA,MAAIyC,UAAU,wCACVzC,IAAAA,cAAA,OAAKyC,UAAU,aAAaqC,EAAU2kB,gCAf1CzpB,IAAAA,cAAC0pB,EAAAA,uBAAsB,CACnB9kB,QAASA,EACT+kB,UAAWpC,EACXqC,oBAAqB9kB,EAAU+kB,eAC/BC,iBAAkBb,EAClBc,eAAgE,QAApB,QAA5Bb,EAAAtkB,EAAQwiB,4BAAoB,IAAA8B,OAAA,EAA5BA,EAA8BrrB,eAC9CmsB,OAAyB,QAAnBb,EAAEF,MAAAA,OAAS,EAATA,EAAWgB,cAAM,IAAAd,EAAAA,OAAIx2B,EAC7Bu3B,YAA2B,QAAdnB,EAAsB,EAAI3F,KAAK+G,OAAMtB,MAAAA,OAAS,EAATA,EAAWl6B,yBAAyBy7B,oBAAqB,GAC3GC,YAA2B,QAAdtB,EAAsB,EAAI3F,KAAK+G,OAAMxB,MAAAA,OAAS,EAATA,EAAWh6B,yBAAyBy7B,oBAAqB,GAC3GzC,qBAAsBA,EACtB2C,MAAOtD,EAAmBC,EAAcriB,EAAQW,OAAS,MACzDglB,MAAOvD,EAAmBC,EAAcriB,EAAQW,OAAS,SAWrEvF,IAAAA,cAAA,MAAIyC,UAAW,wBAAyBpI,IAAKuK,EAAQnQ,UACjDuL,IAAAA,cAAC0I,EAAAA,iBAAgB,CACbzU,QAASA,EACTkN,iBAAkBA,EAClB0D,cAAenS,EAAOmS,cACtB8D,cAAe7D,EAAU8D,UACzBC,kBAAmB/D,EAAU+D,kBAC7BC,iBAAkBhE,EAAUgE,iBAC5BC,gBAAiBjE,EAAUiE,gBAC3BC,UAAWgf,EACXh4B,GAAIiQ,EAAMjQ,GACVqK,IAAKuK,EAAQnQ,SACbwU,SAAUhJ,EAAMgJ,SAChBC,KAAM,CAAEtE,QAAAA,GACRuE,gBAAiB+e,EACjB7f,wBAAyBA,EACzBuf,4BAA6BA,EAC7Bxe,eAAgB2f,EAChBzgB,qBAAsBmX,MAAAA,OAAyB,EAAzBA,EAA2BE,UACjDnX,eAAgBA,EAChBa,oBAAqBvE,EAAUuE,oBAC/BkgB,YAAYnT,GAAmB1jB,EAAO42B,YACtCE,QAAS/B,EAASjzB,MAAKmO,GAAQA,EAAK4C,SAAWX,EAAQW,WAEzD+iB,EAmBEtoB,IAAAA,cAAA,MAAIyC,UAAU,gCACVzC,IAAAA,cAAA,OAAKyC,UAAU,aAAaqC,EAAU2kB,gCAnB1CzpB,IAAAA,cAAC0pB,EAAAA,uBAAsB,CACnB9kB,QAASA,EACT+kB,UAAWpC,EACXqC,oBAAqB9kB,EAAU+kB,eAC/BC,iBAAkBb,EAClBc,eAAgE,QAApB,QAA5BX,EAAAxkB,EAAQwiB,4BAAoB,IAAAgC,OAAA,EAA5BA,EAA8BvrB,eAC9CmsB,OAAyB,QAAnBX,EAAEJ,MAAAA,OAAS,EAATA,EAAWgB,cAAM,IAAAZ,EAAAA,OAAI12B,EAC7Bu3B,YACkB,QAAdnB,EACM,EACA3F,KAAK+G,OAAMtB,MAAAA,OAAS,EAATA,EAAWl6B,yBAAyBy7B,oBAAqB,KAAMnB,MAAAA,OAAS,EAATA,EAAWgB,SAAU,GAEzGI,YAA2B,QAAdtB,EAAsB,EAAI3F,KAAK+G,OAAMxB,MAAAA,OAAS,EAATA,EAAWh6B,yBAAyBy7B,oBAAqB,GAC3GzC,qBAAsBA,EACtB2C,MAAOtD,EAAmBC,EAAcriB,EAAQW,OAAS,MACzDglB,MAAOvD,EAAmBC,EAAcriB,EAAQW,OAAS,SAa7EvF,IAAAA,cAAA,MAAIyC,UAAWwlB,EAAW5tB,IAAKsB,GAC3BqE,IAAAA,cAAC0I,EAAAA,iBAAgB,CACbzU,QAASA,EACTkN,iBAAkBA,EAClB0D,cAAenS,EAAOmS,cACtB8D,cAAe7D,EAAU8D,UACzBC,kBAAmB/D,EAAU+D,kBAC7BC,iBAAkBhE,EAAUgE,iBAC5BC,gBAAiBjE,EAAUiE,gBAC3BC,UAAWgf,EACXh4B,GAAIiQ,EAAMjQ,GACVqK,IAAKuK,EAAQnQ,SACbwU,SAAUhJ,EAAMgJ,SAChBC,KAAM,CAAEtE,QAAAA,GACRuE,gBAAiB+e,EACjB7f,wBAAyBA,EACzBuf,4BAA6BA,EAC7Bxe,eAAgBtB,EAAkBzR,EAAiCuO,GACnE0D,qBAAsBmX,MAAAA,OAAyB,EAAzBA,EAA2BE,UACjDnX,eAAgBA,EAChBa,oBAAqBvE,EAAUuE,oBAC/BkgB,YAAYnT,GAAmB1jB,EAAO42B,gBAWhDkB,EAAiBA,CACnBvqB,EACAsnB,EACAE,EACAgD,EACA9C,EACAV,KACoB,IAAAyD,EACpB,MAAM,OAAEh4B,EAAM,UAAEoS,EAAS,SAAEsR,GAAanW,EAClC7S,EAA0C,QAAlCs9B,EAAGzqB,EAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA2vB,OAAA,EAA/BA,EAAiCpS,eAClD,IAAKlrB,IAAayI,EAAAA,gBAAgBC,YAAY1I,GAC1C,OAAO,KAKX,MAAMu9B,EAAqC9D,EAAoB8D,2BACzDC,EAA+C/D,EAAoB+D,qCACnEC,EAA+ChE,EAAoBgE,qCACzE,OAAIzU,GAAmB1jB,EAAO42B,YAEtBtpB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAK7C,EAAM2lB,mBACX3lB,EAAMkmB,aACPnmB,IAAAA,cAAC8qB,EAAAA,EAAK,CAACroB,UAAW,oBACdzC,IAAAA,cAAA,aACIA,IAAAA,cAAA,MAAIyC,UAAW,+BACXzC,IAAAA,cAAA,MAAIyC,UAAW,0CACfzC,IAAAA,cAAA,MAAIyC,UAAU,6BAA6BqC,EAAUimB,aACrD/qB,IAAAA,cAAA,MAAIyC,UAAU,2BAA2BqC,EAAUkmB,WACnDhrB,IAAAA,cAAA,MAAIyC,UAAU,6BAA6BqC,EAAUmmB,mBACrDjrB,IAAAA,cAAA,MAAIyC,UAAU,4BAA4BqC,EAAUomB,gBACpDlrB,IAAAA,cAAA,MAAIyC,UAAU,6BAA6BqC,EAAUqmB,eACrDnrB,IAAAA,cAAA,MAAIyC,UAAW,6CAGvBzC,IAAAA,cAAA,aACK5S,EAAS6B,KAAI,CAAC2V,EAA8BjJ,IAGnC2rB,EACIrnB,EACA2E,EACAjJ,EACA4rB,EACA5rB,EAAQ,GAAM,EACd8rB,EACAgD,EACA9C,EACAV,EAXVtrB,EAAQgvB,IAA+BC,GACvCjvB,EAAQgvB,IAA+BE,QAgCvD7qB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAK7C,EAAM2lB,mBACX3lB,EAAMkmB,aACPnmB,IAAAA,cAAA,MAAIyC,UAAU,iBACTrV,EAAS6B,KAAI,CAAC2V,EAA8BjJ,IAGnC2rB,EACIrnB,EACA2E,EACAjJ,EACA4rB,EACA5rB,EAAQ,GAAM,EACd8rB,EACAgD,EACA9C,EACAV,EAXVtrB,EAAQgvB,IAA+BC,GACvCjvB,EAAQgvB,IAA+BE,QAqCzDO,EAAoBnrB,IACtB,MAAM,MAAEsG,EAAK,eAAEgU,GAAmBta,EAClC,OAAIsG,EACOvG,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKyX,GAAiBhU,EAAMqU,YAErC,MAQLyQ,EAA2BprB,IAC7B,MAAM,2BAAE8a,EAA0B,sBAAEE,EAAqB,2BAAEG,GAA+Bnb,EAC1F,OAAIgb,EAEIjb,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKiY,GACLE,EAAsBhsB,KAAI,CAAC8B,EAAU4K,IAClCqE,IAAAA,cAACA,IAAAA,SAAc,CAAC3F,IAAKsB,GAChB5K,EACAkqB,EAAsBtf,EAAQ,IAAMyf,MAOlD,MAQEkQ,EAAwBA,CAAClV,EAAmBmV,KAErD,MAEMC,EAAsCha,SAASia,cAAc,cAE7DC,EAAmCF,MAAAA,OAAe,EAAfA,EAAiBG,aAEpDC,EAAgBL,EAND,EAKWG,MAAAA,EAAAA,EAJV,GAMhBG,EAAgBra,SAASia,cAAc,uBACvCK,EAAmBta,SAASia,cAAc,6BAC1CM,EAAiB3V,EAAW5E,SAASia,cAAc,4BAA8Bja,SAASia,cAAc,uBAC1GM,GAAkBF,GAAiBC,EAC/BjvB,EAAAA,GAASC,WAAa0U,SAASwa,gBAAgBC,UAAYL,GAC3DG,EAAeG,UAAUC,IAAI,eAC7BJ,EAAeK,aAAa,QAAS,QAAQN,EAAiBO,mBAE9DN,EAAeG,UAAUI,OAAO,eAE7BP,IACHlvB,EAAAA,GAASC,WAAa0U,SAASwa,gBAAgBC,UAAYL,EAC3DG,EAAeG,UAAUC,IAAI,aAE7BJ,EAAeG,UAAUI,OAAO,YAChCP,EAAeG,UAAUI,OAAO,eAChCP,EAAeQ,gBAAgB,YAmD3C,MAyPMC,EAA0BA,CAC5BC,EACAjH,EACA1J,EACA4Q,IAEO1sB,IAAAA,aACHysB,EAAWnT,MACX,GACAmT,EAAWlT,YACXoT,EAAgBF,EAAYjH,EAAY1J,EAAgB4Q,GACxDD,EAAWjT,aAiCbmT,EAAkBA,CACpB1sB,EACAulB,EACA1J,EACA4Q,IAEI5Q,EACO9b,IAAAA,aAAmBC,EAAMwZ,UAAW,GAAImT,EAAW9Q,EAAgB4Q,GA/BrDzsB,CAAAA,IACzB,MAAM,SAAEnP,EAAQ,oBAAEktB,EAAmB,wBAAEC,GAA4Bhe,EACnE,OAAInP,EAEIkP,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKmb,GACNje,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKkb,GACLltB,EAAS7B,KAAI,CAAC49B,EAASlxB,IACpBqE,IAAAA,cAACA,IAAAA,SAAc,CAAC3F,IAAKsB,GAAQkxB,OAM1C,MAkB0FC,CAAoBtH,IAE9G,KAQLuH,EAAiB9sB,IACnB,MAAM,SAAEnP,EAAQ,oBAAEktB,EAAmB,wBAAEC,GAA4Bhe,EACnE,OAAInP,EAEIkP,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKmb,GACNje,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKkb,GACLltB,EAAS7B,KAAI,CAAC49B,EAASlxB,IACpBqE,IAAAA,cAACA,IAAAA,SAAc,CAAC3F,IAAKsB,GAAQkxB,OAM1C,MAULG,EAAsBA,CACxB/sB,EACAgtB,EACAnoB,KAEA,MAAM,SAAEhU,GAAamP,EACrB,OAAInP,EAEIkP,IAAAA,cAAC+mB,EAAAA,KAAI,CAACtkB,UAAU,2BACZzC,IAAAA,cAAC+mB,EAAAA,KAAI,CAAC/L,IAAI,SAASvY,UAAU,wBAAuB,aAAaqC,EAAUooB,cAAeha,SAAU,EAAGlQ,QAASiqB,GAC3GnoB,EAAUqoB,WAKpB,MASLP,EAAaA,CAAC3sB,EAAyBysB,KACzC,MAAM,iBAAE7Q,EAAgB,eAAEC,GAAmB7b,EAC7C,OAAI6b,IAAmB4Q,EACZ1sB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAK+Y,GAAmBC,GAEjC,MAQLsR,EAAentB,IACjB,MAAM,MAAEsG,EAAK,eAAEgU,GAAmBta,EAClC,OAAIsG,EAEIvG,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKyX,GACNva,IAAAA,cAAC+mB,EAAAA,KAAI,CAAC/L,IAAI,KAAKvY,UAAU,IACpB8D,EAAMkU,YACNlU,EAAMoU,YAKhB,MAUX,EAxY6E1a,IAAQ,IAAAotB,EAAAC,EACjF,MAAM,sBACFnW,EAAqB,WACrBwO,EAAU,wBACVE,EAAuB,cACvBG,EAAa,SACb5P,EAAQ,YACR6P,EAAW,kBACXC,EAAiB,eACjBZ,EAAc,WACdE,EAAU,kBACV1K,EAAiB,cACjB4K,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,uBAChCK,EAAsB,mBACtBC,EAAkB,aAClBF,EAAY,UAEZrhB,EACAoE,MAAM,KAAEif,GACRl0B,SAAS,cACLmR,EACAA,eACIpT,gBAAgB,aAAE4T,KAG1Bd,WAAW,aAAEyoB,EAAY,qBAAEC,EAAoB,sBAAEC,GACjD/6B,QAAQ,cAAEmS,IACV5E,GACGyV,EAAYgY,IAAiBC,EAAAA,EAAAA,WAAkB,IAC/CC,EAAWC,GAAgB7tB,IAAAA,UAAwB,IAEnD8tB,EAAcC,GAAmB/tB,IAAAA,cAA0CrN,IAE3Eq7B,EAAgBC,GAAqBjuB,IAAAA,cAAyCrN,IAC9E80B,EAAUyG,IAAeluB,IAAAA,SAAgC,KACzDmuB,GAAUC,IAAepuB,IAAAA,UAAwB,IACjDyqB,GAAgB4D,IAAqBruB,IAAAA,SAA+C,KAEpFinB,GAAcqH,IAAmBtuB,IAAAA,SAA+D,KACvGuuB,EAAAA,EAAAA,YAAU,KACFtuB,EAAMvN,OAAO87B,iBAAmB3xB,EAAAA,GAASC,WAnFrD,SAA2BsZ,EAAmBmV,GAC1CvuB,OAAOwlB,iBAAiB,UAAU,KAC9B8I,EAAsBlV,EAAUmV,MAEpCD,EAAsBlV,EAAUmV,GAiFxBkD,CAAkBxuB,EAAMmW,SAAUnW,EAAMhM,QAAQoB,IAAI3C,OAAOg8B,sBAEhE,CAACzuB,KACJsuB,EAAAA,EAAAA,YAAU,KACDI,OACN,CAAgC,QAAhCtB,EAACptB,EAAMiJ,KAAK2O,cAAc9c,cAAM,IAAAsyB,OAAA,EAA/BA,EAAiC/U,iBAErC,MAAMqW,GAA0BhhC,UAAW,IAAAihC,EACvC,MAAMC,EAA4C,QAAlCD,EAAG3uB,EAAMiJ,KAAK2O,cAAc9c,cAAM,IAAA6zB,OAAA,EAA/BA,EAAiCtW,eAC9CwW,EAA8C,GACpD,GAAID,GAAch5B,EAAAA,gBAAgBC,YAAY+4B,GAAa,CACvDA,MAAAA,GAAAA,EAAYpgC,SAAQmW,IAChBkqB,EAAiBh/B,KAAK,CAAEi/B,gBAAiBnqB,EAAQnQ,SAAUlE,cAAeqU,EAAQW,YAGtF,MAAMhR,GAAYy6B,EAAAA,EAAAA,GAAwB/uB,EAAMhM,QAAQmR,eAElDrW,EAAQ,IAAImB,EAAAA,YAAY4+B,EAAkBv6B,GAE1C06B,QAAgBC,EAAAA,EAAAA,SAAangC,EAAOkR,EAAMhM,QAAQmR,eACxD8oB,GAAYe,GACZb,IAAY,GAEZ,MAAMe,EAA4CN,EAAW5/B,KAAIO,IACtD,CACHL,UAAWK,EAAGiF,SACdnF,cAAeE,EAAG43B,sBAAwB,OAI5CgI,EAAiB,IAAIliC,EAAAA,qBACvBiiC,EACAF,EAAQhgC,KAAIC,IACD,CAAEC,UAAWD,EAAEuE,UAAYu2B,OAAQ96B,EAAE+6B,QAAU,OAGxDoF,QAAsBC,EAAAA,EAAAA,SAAsBF,EAAgBnvB,EAAMhM,QAAQmR,eAChFipB,GAAkBgB,EAAct/B,+BAIlCqX,GAASA,KACXsmB,GAAehY,IAGb6Z,GAAyBC,IAC3B,MAAMC,EAAa,IAAIxI,IACvBuI,EAAIvgC,KAAIygC,IACJ,MAAMC,EAAMF,EAAW7vB,WACnBgwB,GACIA,EAAEhrB,QAAQW,SAAWmqB,EAAY9qB,QAAQW,QACzCqqB,EAAEhrB,QAAQwiB,uBAAyBsI,EAAY9qB,QAAQwiB,uBAE3DuI,GAAO,EACPF,EAAWE,GAAOD,EAElBD,EAAW3/B,KAAK4/B,MAGxBpB,GAAgBmB,IAGdI,GAAkBA,KACpB,MAAMC,EAAY7I,GAAa53B,QAAOH,GAAKA,EAAEm4B,SAAW,IAClD0I,EAAY5H,EAAKptB,OACnBg1B,GAAaD,EAAU9hC,OAAS,GAC3B+hC,EACAC,kBACGF,EAAU7gC,KAAIghC,IACH,CACHrrB,QAASqrB,EAAGrrB,QACZlP,MAAOu6B,EAAG5I,cAIrBptB,MAAK,KACFq0B,GAAgB,QAK1B4B,GAAkBA,IACsC,IAAtDjJ,GAAa53B,QAAO83B,GAAMA,EAAGE,SAAW,IAAGr5B,OACpC,KAGPgS,IAAAA,cAAA,OAAKyC,UAAW,0BACZzC,IAAAA,cAAA,UAAQmwB,KAAM,SAAUntB,QAAS6sB,GAAiBptB,UAAW,yCACxDxC,EAAM6E,UAAU+kB,iBAiC3BuG,GAAiBpwB,IAAAA,OAAa,OAlMxC,SAAyBqwB,EAA+CjpB,GACpEpH,IAAAA,WAAgB,KAKZ,SAASswB,EAAmB3gB,GACxB,MAAM3Z,EAAUwb,SAASia,cAAc,wCACnC4E,EAAgBzf,SAAYyf,EAAgBzf,QAAQ2f,SAAS5gB,EAAMrP,SAAoBtK,GACvFoR,EAAOuI,GAOf,OAHI9S,EAAAA,GAASC,WACT0U,SAASgR,iBAAiB,QAAS8N,GAEhC,KACCzzB,EAAAA,GAASC,WACT0U,SAASgT,oBAAoB,QAAS8L,MAG/C,CAACD,EAAiBjpB,IA8KrBopB,CAAgBJ,GAAgBhpB,IAChC,MAAMslB,GAAmE,QAAnDY,EAAGrtB,EAAMhM,QAAQmR,cAAcpT,eAAeE,aAAK,IAAAo7B,OAAA,EAAhDA,EAAkD/5B,eAE3E,OAAI6iB,EAEIpW,IAAAA,cAACywB,EAAAA,OAAM5tB,OAAAC,OAAA,GAAKqU,GACPkP,EAAqB,KAClBrmB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKgjB,GACLuF,EAAwBvQ,GACxBsS,EAAY9H,GACZ8F,EAAiB9F,IAGzBU,EACDhmB,IAAAA,cAAC+mB,EAAAA,KAAI,CAACtkB,UAAU,2BAA2BwjB,GAC1CuG,EAAwBtG,EAAmBV,EAAYE,EAAegH,IACvE1sB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKsjB,GAAyBC,GAClCF,EACAlmB,EAAMvN,OAAOg+B,wBACRlG,EAAevqB,EAAO4vB,GAAiBpI,EAAUgD,GAAgB8E,GAAuBtI,IACxFH,EAAmB7mB,GACxB0lB,EACAuK,MAKTlwB,IAAAA,cAACywB,EAAAA,OAAM5tB,OAAAC,OAAA,GAAKqU,GACPyW,GAAaE,GAAgBE,EAAiBhuB,IAAAA,cAAC2wB,EAAAA,MAAK9tB,OAAAC,OAAA,IAxDtC8B,GAwDyDkpB,EAxDjC8C,GAwD+C5C,EAvDnF,CACHJ,UAAWA,EACX35B,QAASgM,EAAMhM,QACfwO,UAAW,mBACXmD,aAAAA,EACAf,cAAAA,EACAgsB,eAAgB5wB,EAAM6wB,UACtB9gC,GAAI,IACJ+gC,gBAAiB,EACjBC,eAAeC,EAAAA,EAAAA,IAAW,OAAQ7rB,GAClCyoB,aAAcj2B,GAASi2B,EAAaj2B,GACpCqR,SAAU,cACVC,KAAM,CAAEtE,QAAAA,GAASgsB,MAAAA,IACjBM,cAAe,CACX3D,aAAcA,EACdzkB,iBAAkB,GAClB0kB,qBAAsBA,EACtB7kB,cAAe,GACfwoB,kBAAmB1D,EACnB2D,qBAAsB,GACtBvoB,kBAAmB,GACnBwoB,kBAAmB,QAkCqF,KAC3GhL,EAAqB,KAClBrmB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKgjB,GACLhL,GAAqBuQ,EAAwBvQ,GAC7CwK,GAAkB8H,EAAY9H,GAC9BA,GAAkB8F,EAAiB9F,IAG5CtlB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKsjB,GAAyBC,GACnCrmB,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAKijB,GACN/lB,IAAAA,cAAC+mB,EAAAA,KAAI,CAACngB,IAAKwpB,GAAgB3tB,UAAU,sBACjCzC,IAAAA,cAAC+mB,EAAAA,KAAI,CAACtkB,UAAU,4BACZzC,IAAAA,cAAC4H,EAAAA,OAAM,CACHnF,UAAWiT,EAAa,oCAAsC,qCAAoC,aACvF,SACX1S,QAASoE,GAAM,gBACAsO,EACfxC,SAAU,GAETpO,EAAUwsB,YAEftxB,IAAAA,cAAA,OAAKyC,UAAU,iDAAiDujB,GAChEhmB,IAAAA,cAAA,OAAKyC,UAAU,6CACVijB,IAAkBgH,IAAoBE,EAAWlH,KAGzDF,GAAc9P,GAAcqX,EAAcvH,GAC3CxlB,IAAAA,cAAC+mB,EAAAA,KAAI,CAACtkB,UAAU,qBACX+iB,GAAc9P,GAAcsX,EAAoBxH,EAAYpe,GAAQtC,KAI7E9E,IAAAA,cAAC+mB,EAAAA,KAAIlkB,OAAAC,OAAA,GAAK+iB,GACLM,EACAgI,GACKluB,EAAMvN,OAAOg+B,wBACTlG,EAAevqB,EAAO4vB,GAAiBpI,EAAUgD,GAAgB8E,GAAuBtI,IACxFH,EAAmB7mB,GACvBuqB,EAAevqB,EAAO4vB,GAAiBpI,EAAUgD,GAAgB8E,GAAuBtI,IAC7FtB,IAGRuK,MAlGaqB,IAAC3sB,GAAwBgsB,gMCrnB7C,MAAOY,EAAbrkC,cACuB,KAAAqrB,cAA8C,KAE9C,KAAAF,eAAwC,GAExC,KAAAF,eAAqC,KAErC,KAAAD,kBAAmC,KAEnC,KAAArnB,SAA8C,KAI9C,KAAAunB,SAAmB,GAEnB,KAAA1nB,SAAyB,UAEzB,KAAA8nB,eAAuC,KAEvC,KAAAoJ,cAA4C,KAlBnDxd,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,qCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,sCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,sCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,yCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,gCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,yCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,gCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,gCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,sCAECviB,EAAAA,EAAAA,IAAA,CAAXuiB,EAAAA,IAAU,oCAMT,MAAO6K,EAAbtkC,cACW,KAAAG,YAAc,IAAM,gBAEpB,KAAAC,mBAAqB,IAAM,gBAE3B,KAAAC,cAAgB,IAAiB,WAGrCG,eAAe+jC,EAAoB3iC,EAA2BhB,GACjE,OAAO,IAAIyjC,EAOR,MAAMG,EAAuBl/B,GACzB,IAAIg/B,EAMf,GAAez9B,EAAAA,EAAAA,IAA0C,CACrDlF,OAAgC4iC,EAChC3iC,MAAO4iC,iDCnEJ,MAAM3C,EAA2B/6B,IACpC,IAAKA,EAAQjC,eAAeyxB,KACxB,OAAO,EAEX,IAAIrzB,EACC6D,EAAQjC,eAAeE,OAAS+B,EAAQjC,eAAeE,MAAiB,YAAM+B,EAAQjC,eAAeE,MAAiB,WAAM,EAKjI,OAJkB,IAAd9B,IACAA,EAAa6D,EAAQjC,eAAeyxB,KAAKrzB,YAAc6D,EAAQjC,eAAeyxB,KAAKrzB,WAAc,GAG9FA,+BCfJ,IAAKq4B,2BAAZ,SAAYA,GACRA,EAAA,qBACAA,EAAA,uBACAA,EAAA,uBAHJ,CAAYA,IAAAA,EAAyB,KAM9B,MAAMF,EAAiCA,CAC1CqJ,EACAv3B,EACAw3B,KACA,IAAAC,EACA,MAAMC,EAAWH,MAAAA,GAAoC,QAA1BE,EAAVF,EAAYp9B,MAAKtF,GAAKA,EAAE8iC,MAAQ33B,WAAI,IAAAy3B,OAAA,EAApCA,EAAsCG,MAIvD,OADYF,EAAWA,EAASF,GAAa,gIChB1C,MAAMK,EAAiBC,GAAiBA,EAAKxuB,QAAQ,IAAK,IAAI9F,goBCArE,MAAMu0B,EAAU,CAAEC,QAAS,GAAIC,YAAa,IAmBlCC,EAA8BA,CAACC,EAAqBC,KAUlD,GADAL,EAAQE,YAAYE,GAAuBC,GACtCL,EAAQE,YAAYE,GAAqBE,QAC1C,MAAM,IAAI/+B,MAAM,oBAAsB6+B,EAAsB,mCAEhEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAUC,eAAiBJ,EACxEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAU3iC,KAC3DoiC,EAAQE,YAAYF,EAAQE,YAAYE,GAAqBE,QAAQC,UAAU3iC,IAAMwiC,IAMhGJ,EAAQC,QAAQ,+BAAiC,CAC9CzC,EAAGA,IAAMiD,EAAQ,MACjBC,MAAO,kBACPC,GAAI,CAAC,CAACZ,KAAK,OAASa,KAAK,+EAAgFC,MAAO,GAAG,CAACd,KAAK,WAAaa,KAAK,0EAA2EC,MAAO,GAAG,CAACd,KAAK,oBAAsBa,KAAK,oFAAqFC,MAAO,GAAG,CAACd,KAAK,iBAAmBa,KAAK,0EAA2EC,MAAO,GAAG,CAACd,KAAK,eAAiBa,KAAK,uEAAwEC,MAAO,GAAG,CAACd,KAAK,gBAAkBa,KAAK,sDAAuDC,MAAO,GAAG,CAACd,KAAK,WAAaa,KAAK,8EAA+EC,MAAO,GAAG,CAACd,KAAK,WAAaa,KAAK,0EAA2EC,MAAO,GAAG,CAACd,KAAK,sBAAwBa,KAAK,8EAA+EC,MAAO,IAEt/BC,KAAK,EACLC,GAAI,YACJxU,EAAG,8BACHzvB,EAAG,YAEHkkC,IAAK,GAGLC,GAAI,2CAOAd,EAF4B,0EACXM,EAAQ,MAQzBN,EAF4B,oFACXM,EAAQ,MAQzBN,EAF4B,uEACXM,EAAQ,KAQzBN,EAF4B,0EACXM,EAAQ,KAQzBN,EAF4B,+EACXM,EAAQ,KAQzBN,EAF4B,8EACXM,EAAQ,MAQzBN,EAF4B,8EACXM,EAAQ,OAQzBN,EAF4B,0EACXM,EAAQ,OAQzBN,EAF4B,sDACXM,EAAQ,OAMjC71B,OAAOs2B,aAAet2B,OAAOs2B,cAAgB,GAC7Ct2B,OAAOs2B,aAAajB,QAAOjhC,EAAAA,EAAA,GACpB4L,OAAOs2B,aAAajB,SAAW,IAC/BD,EAAQC,SAGXr1B,OAAOs2B,aAAahB,YAAWlhC,EAAAA,EAAA,GAC5B4L,OAAOs2B,aAAahB,aAAe,IACnCF,EAAQE,aAEY,MAAMiB,EAAiB,GAC9BA,EAAe,uFAAyF,CAChH3D,EAAGA,IAAMiD,EAAQ,MACjBW,GAAI,mDAEpBx2B,OAAOs2B,aAAet2B,OAAOs2B,cAAgB,GAC7Ct2B,OAAOs2B,aAAaC,eAAcniC,EAAAA,EAAA,GACP4L,OAAOs2B,aAAaC,gBAAkB,IACtCA,uBC3I3BE,EAAOC,QAAU1zB,2BCAjByzB,EAAOC,QAAUC","sources":["webpack://Msdyn365.Commerce.Online/./src/actions/get-inventory-uom.action.ts?9307","webpack://Msdyn365.Commerce.Online/./src/actions/get-uom.action.ts?12cd","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/base-collection-action.ts?c773","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/get-inventory-refiners.ts?0be8","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/get-full-products-by-collection.ts?9232","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/get-mapped-search-configuration.ts?763c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/get-product-refiner-hierarchy.ts?2080","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/get-refiners-for-collection.ts?182d","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/actions/url-utils.ts?5b9b","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/utilities.ts?71e1","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/choice-summary.tsx?92a7","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/error-message.tsx?5da8","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/feature-search-result-item.tsx?5dcb","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/link.tsx?3ec2","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/modal.tsx?793f","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/product-search-result-items.tsx?7848","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/range-refine-item.tsx?cc5e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-item.tsx?ac45","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/refine-submenu.tsx?49ea","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/separator.tsx?fa0e","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/components/title.tsx?1fda","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.props.autogenerated.ts?22c3","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.tsx?578c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/eve-search-result-container.view.tsx?c38c","webpack://Msdyn365.Commerce.Online/./src/modules/eve-search-result-container/list-page-state.ts?5c58","webpack://Msdyn365.Commerce.Online/./src/utilities/get-catalog-id-from-context.ts?89bf","webpack://Msdyn365.Commerce.Online/./src/utilities/getExtensionPropertyValueByKey.ts?f8db","webpack://Msdyn365.Commerce.Online/./src/utilities/normalizeName.ts?3142","webpack://Msdyn365.Commerce.Online/./lib/eve-search-result-container/module-registration.js?3563","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getEstimatedAvailabilityAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { IProductInventoryInformation, mapAggregatedProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\n\r\nexport interface IUomProductInventoryInput {\r\n productId: number;\r\n unitOfMeasure: string;\r\n}\r\n\r\nexport interface IUomProductFactor {\r\n productId: number;\r\n factor: number;\r\n}\r\n/**\r\n * GetInventoryUom Input Action\r\n */\r\nexport class GetInventoryUomInput implements Msdyn365.IActionInput {\r\n public products: IUomProductInventoryInput[];\r\n public multiUomProducts: IUomProductFactor[];\r\n constructor(products: IUomProductInventoryInput[], multiUomProducts: IUomProductFactor[]) {\r\n this.products = products;\r\n this.multiUomProducts = multiUomProducts;\r\n }\r\n public getCacheKey = () => `UNITOFMEASUREINVENTORY`;\r\n public getCacheObjectType = () => 'UNITOFMEASUREINVENTORY';\r\n public dataCacheType = (): Msdyn365.CacheType => 'none';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetInventoryUomData {\r\n productInventoryInformation: IProductInventoryInformation[];\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new GetInventoryUomInput([], []);\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: GetInventoryUomInput, ctx: Msdyn365.IActionContext): Promise {\r\n const multiUomProductIds = input.multiUomProducts.map(p => p.productId);\r\n const csProducts = input.products.filter(p => p.unitOfMeasure.toUpperCase() === 'CS').map(pr => pr.productId);\r\n const eaProducts = input.products\r\n .filter(p => p.unitOfMeasure.toUpperCase() === 'EA' || multiUomProductIds.includes(p.productId))\r\n .map(pr => pr.productId);\r\n const csAvailabilities = getAvailability(csProducts, 1, 'CS', ctx);\r\n const eaAvailabilities = getAvailability(eaProducts, 0, 'EA', ctx);\r\n const allAvailabilities = [];\r\n allAvailabilities.push(...(await csAvailabilities));\r\n allAvailabilities.push(...(await eaAvailabilities));\r\n\r\n return { productInventoryInformation: allAvailabilities };\r\n}\r\n\r\nconst getAvailability = async (productIds: number[], quantityUnitTypeValue: number, uom: string, ctx: IActionContext) => {\r\n if (!productIds.length) {\r\n return [];\r\n }\r\n const availabilities = await getEstimatedAvailabilityAsync(\r\n { callerContext: ctx },\r\n { ProductIds: productIds, DefaultWarehouseOnly: true, QuantityUnitTypeValue: quantityUnitTypeValue }\r\n );\r\n const availabilities2 = mapAggregatedProductInventoryInformation(ctx, availabilities);\r\n availabilities2.forEach(a => (a.ProductAvailableQuantity.UnitOfMeasure = uom));\r\n return availabilities2;\r\n};\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // TODO: Give your data action a unique id\r\n id: 'GetInventoryUom',\r\n input: createInput\r\n // TODO: Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { postEveUomRequestAsync } from './DataActionExtension.g';\r\nimport { IEveEachPrice, IEveEachPriceRequestMap } from './DataServiceEntities.g';\r\n\r\n/**\r\n * GetUom Input Action\r\n */\r\nexport class GetUomInput implements Msdyn365.IActionInput {\r\n public reqMap: IEveEachPriceRequestMap[];\r\n public catalogId: string | number;\r\n // TODO: Construct the input needed to run the action\r\n constructor(itemIds: IEveEachPriceRequestMap[], catalogId: string | number) {\r\n this.reqMap = itemIds;\r\n this.catalogId = catalogId;\r\n }\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `ITEMIDS:${this.reqMap.map(i => i.ProductItemId).join(';')}:CATID:${this.catalogId}`;\r\n public getCacheObjectType = () => 'UnitOfMeasure';\r\n public dataCacheType = (): Msdyn365.CacheType => 'application';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetUomData {\r\n prices: IEveEachPrice[];\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (args: Msdyn365.ICreateActionContext): Msdyn365.IActionInput => {\r\n return new GetUomInput([], 0);\r\n};\r\n\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nasync function action(input: GetUomInput, ctx: Msdyn365.IActionContext): Promise {\r\n return postEveUomRequestAsync({ callerContext: ctx }, input.reqMap, +input.catalogId);\r\n}\r\n\r\nexport default Msdyn365.createObservableDataAction({\r\n action: >action,\r\n // TODO: Give your data action a unique id\r\n id: 'GetUom',\r\n input: createInput\r\n // TODO: Uncomment the below line if this is a meant to be a batched data action\r\n // isBatched: true\r\n});\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { buildCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { toJS } from 'mobx';\r\n\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n\r\n/**\r\n * BaseCollection Action Input.\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n\r\n public category: number | undefined;\r\n\r\n public searchText: string | undefined;\r\n\r\n public refiners: ProductRefinerValue[];\r\n\r\n public queryResultSettings: IQueryResultSettings;\r\n\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public includeAttributes: boolean | undefined;\r\n\r\n public locale?: string;\r\n\r\n public isUpdateRefinerPanel?: boolean;\r\n\r\n public catalogId?: number;\r\n\r\n public constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.locale = locale;\r\n this.catalogId = catalogId ?? 0;\r\n }\r\n\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n const cacheKey = buildCacheKey(\r\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- disabling this as inputs can be undefined depending on page type\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.catalogId}-${this.refiners.map(\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands -- required\r\n refiner => `${refiner.RefinerRecordId + (refiner.LeftValueBoundString || '') + (refiner.RightValueBoundString || '')}-`\r\n )}-${convertToString(queryResultSettings)}`,\r\n this.apiSettings,\r\n this.locale\r\n );\r\n return cacheKey;\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call.\r\n * @param args\r\n * @param inputClassConstuctor\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n const catalogId = getCatalogId(args.requestContext);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (\r\n pageType === 'Search' &&\r\n args.requestContext.query &&\r\n args.requestContext.query.productId &&\r\n args.requestContext.query.recommendation\r\n ) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n JSON.stringify({ ProductId: args.requestContext.query.productId, Recommendation: args.requestContext.query.recommendation }),\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput } from '@msdyn365-commerce/core';\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { BaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * InventoryInStockRefinerValue Input action.\r\n */\r\nexport class InventoryInStockRefinerValueInput extends BaseCollectionInput implements IActionInput {\r\n public inventoryProductAttributeRecordId: number;\r\n\r\n public constructor(input: BaseCollectionInput, inventoryProductAttributeRecordId: number = 0) {\r\n super(\r\n input.pageType,\r\n input.apiSettings,\r\n input.queryResultSettings,\r\n\r\n // Parameter - refiners\r\n [],\r\n\r\n // Parameter - category\r\n undefined,\r\n\r\n // Parameter - searchText\r\n '',\r\n\r\n // Parameter - includeAttributes\r\n false,\r\n\r\n // Parameter - isUpdateRefinerPanel\r\n false,\r\n\r\n // Parameter - locale\r\n undefined,\r\n input.catalogId\r\n );\r\n\r\n this.inventoryProductAttributeRecordId = inventoryProductAttributeRecordId;\r\n }\r\n\r\n /**\r\n * GetCacheKey.\r\n * @returns - Returns string.\r\n */\r\n public getCacheKey = (): string => buildCacheKey('RefinerList', this.apiSettings);\r\n\r\n /**\r\n * GetCacheObjectType.\r\n * @returns - Returns string.\r\n */\r\n public getCacheObjectType = (): string => 'RefinerList';\r\n\r\n /**\r\n * DataCacheType.\r\n * @returns - CacheType string.\r\n */\r\n public dataCacheType = (): CacheType => 'application';\r\n}\r\n\r\n/**\r\n * Action method returns inventory in stock refiners.\r\n * @param input - InventoryInStockRefinerValueInput.\r\n * @param context - IActionContext.\r\n * @returns - Promise.\r\n */\r\nasync function action(input: InventoryInStockRefinerValueInput, context: IActionContext): Promise {\r\n const refiners = await getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n }\r\n },\r\n input.queryResultSettings,\r\n context\r\n );\r\n\r\n return refiners.find(refiner => refiner.RecordId === input.inventoryProductAttributeRecordId) ?? null;\r\n}\r\n\r\n/**\r\n * Action.\r\n * @param id - Id.\r\n * @param action - Action.\r\n * @returns - Results.\r\n */\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-inventory-refiners',\r\n action: action as IAction\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext\r\n} from '@msdyn365-commerce/core';\r\nimport {\r\n AsyncResult,\r\n ChannelInventoryConfiguration,\r\n ProductRefinerValue,\r\n ProductSearchCriteria,\r\n ProductSearchResult\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport getInventoryRefinersAction, { InventoryInStockRefinerValueInput } from './get-inventory-refiners';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input.\r\n */\r\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n /**\r\n * The cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'FullProductSearchResult';\r\n\r\n /**\r\n * The data cache type.\r\n * @returns The data cache type.\r\n */\r\n public dataCacheType = (): CacheType => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n };\r\n}\r\n\r\n/**\r\n * This setting defines inventory filtering options.\r\n */\r\nexport enum ProductListInventoryFilteringOptions {\r\n /**\r\n * Filter out all products out of stock.\r\n */\r\n HideOOS = 'hideOOS',\r\n\r\n /**\r\n * Sort products by availability, OOS goes last.\r\n */\r\n SortOOS = 'sortOOS',\r\n\r\n /**\r\n * No filtering selected.\r\n */\r\n Default = 'default'\r\n}\r\n\r\n/**\r\n * The full product search result with count interface.\r\n */\r\nexport interface IFullProductsSearchResultsWithCount {\r\n products: ProductSearchResult[];\r\n count: number;\r\n channelInventoryConfigurationId?: number;\r\n inventoryAwareSortableAttributeId?: number;\r\n}\r\n\r\n/**\r\n * CreateInput function which creates and actionInput used to fetch products for a list page.\r\n * @param args - The API arguments.\r\n * @returns IActionInput - The action input.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Returns sorted products based on availability.\r\n * @param input - The GetFullProductsByCollectionInput input.\r\n * @param context - The context.\r\n * @param channelInventoryConfiguration - The channelInventoryConfiguration.\r\n * @returns Refiners.\r\n */\r\nasync function getInventoryInStockRefinerValueAsync(\r\n input: GetFullProductsByCollectionInput,\r\n context: IActionContext,\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): Promise {\r\n const refinerInput = new InventoryInStockRefinerValueInput(input, channelInventoryConfiguration.InventoryProductAttributeRecordId);\r\n\r\n const inventoryRefiner = await getInventoryRefinersAction(refinerInput, context);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- inventoryRefiner may be null\r\n return (\r\n inventoryRefiner?.Values.find(\r\n value =>\r\n value.LeftValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText &&\r\n value.RightValueBoundString !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) ?? null\r\n );\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param productSearchResults - The products.\r\n * @param context - The context.\r\n * @param metadataCount - The metadata count.\r\n * @param channelInventoryConfiguration - The channel inventory configuration.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport async function returnProducts(\r\n productSearchResults: ProductSearchResult[],\r\n context: IActionContext,\r\n metadataCount: number | undefined,\r\n channelInventoryConfiguration?: ChannelInventoryConfiguration\r\n): Promise {\r\n const defaultProductCount: number = 0;\r\n\r\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n\r\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n if (\r\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\r\n context.requestContext.app.config.enableStockCheck === false\r\n ) {\r\n return {\r\n products: productSearchResultsWithImages,\r\n count: metadataCount ?? defaultProductCount\r\n };\r\n }\r\n\r\n const inventoryConfiguration = channelInventoryConfiguration ?? (await getInventoryConfigurationAsync({ callerContext: context }));\r\n\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\r\n if (\r\n channelInventoryConfiguration &&\r\n element.RecordId !== undefined &&\r\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n context.requestContext.app.config.inventoryRanges !== 'all' &&\r\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // If same RecordId then it means that is the Inventory attribute\r\n // Based on the inventory range (and filtering options), the inventory label will be displayed\r\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\r\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\r\n element.TextValue = '';\r\n }\r\n }\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n\r\n return {\r\n products: mappedProducts,\r\n count: metadataCount ?? defaultProductCount,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\r\n channelInventoryConfigurationId: inventoryConfiguration ? inventoryConfiguration.InventoryProductAttributeRecordId : undefined,\r\n inventoryAwareSortableAttributeId: inventoryConfiguration\r\n ? inventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\r\n : undefined\r\n };\r\n}\r\n\r\n/**\r\n * Action function to fetch products for a list page.\r\n * @param input - The input.\r\n * @param context - The context.\r\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\r\n */\r\n// eslint-disable-next-line complexity -- ignore the complexity.\r\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\r\n let promise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = { ChannelId: context.requestContext.apiSettings.channelId, CatalogId: input.catalogId };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: context });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n const refinerValue = await getInventoryInStockRefinerValueAsync(input, context, channelInventoryConfiguration);\r\n const isInventoryAvailableRefinerValueExist = searchCriteriaInput.Refinement.some(\r\n value => value.RefinerRecordId === refinerValue?.RefinerRecordId\r\n );\r\n if (!isInventoryAvailableRefinerValueExist && refinerValue) {\r\n searchCriteriaInput.Refinement.push(refinerValue);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (\r\n context.requestContext.app.config?.productListInventoryDisplay === ProductListInventoryFilteringOptions.SortOOS &&\r\n channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId\r\n ) {\r\n input.queryResultSettings.Sorting = input.queryResultSettings.Sorting ?? {};\r\n input.queryResultSettings.Sorting.Columns = input.queryResultSettings.Sorting.Columns ?? [];\r\n const sortColumnName = `Attr_${channelInventoryConfiguration.ProductAvailabilitySortableAttributeRecordId}`;\r\n const isSortAttributeExist = input.queryResultSettings.Sorting.Columns.some(column => column.ColumnName === sortColumnName);\r\n if (!isSortAttributeExist) {\r\n input.queryResultSettings.Sorting.Columns.push({\r\n ColumnName: sortColumnName,\r\n IsDescending: true\r\n });\r\n }\r\n }\r\n\r\n if (input.pageType === 'Category' || context.requestContext.query?.categoryId) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else if (input.searchText && context.requestContext.query?.q) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (input.searchText && context.requestContext.query?.productId && context.requestContext.query.recommendation) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Existing code\r\n const searchObject = JSON.parse(input.searchText);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Existing code\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Existing code\r\n !searchObject.Recommendation\r\n ) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Existing code\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n\r\n const productSearchResults = await promise;\r\n return returnProducts(productSearchResults, context, promise.metadata.count, channelInventoryConfiguration);\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\r\n action: action as IAction,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n// TODO: import from commerce entities when available\r\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\ninterface SearchConfiguration {\r\n ProductSortColumns?: SortColumn[];\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\nexport interface MappedSearchConfiguration {\r\n key: string;\r\n sortColumn: SortColumn;\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc',\r\n sortByOptionBestSelling: 'BestSelling',\r\n sortByOptionNewScore: 'NewScore',\r\n sortByOptionTrendingScore: 'TrendingScore'\r\n};\r\n\r\n/**\r\n * ActionInput class for the get-mapped-search-configuration Data Action.\r\n */\r\nexport class MappedSearchInput implements IActionInput {\r\n private readonly apiSettings: ICommerceApiSettings;\r\n\r\n constructor(apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\r\n\r\n public getCacheObjectType = () => 'MappedSearchInput';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Get a mapped search configuration that is easy to use for sorting.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\r\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\r\n return (searchConfiguration.ProductSortColumns || [])\r\n .map((sortColumn: SortColumn) => {\r\n let key = '';\r\n if (sortColumn.ColumnName) {\r\n switch (sortColumn.ColumnName.toUpperCase()) {\r\n case 'NAME':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\r\n break;\r\n case 'PRICE':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\r\n break;\r\n case 'AVERAGERATING':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\r\n break;\r\n case 'RANKING':\r\n key = sortOptions.sortByOptionRelevanceDesc;\r\n break;\r\n case 'BESTSELLINGSCORE':\r\n key = sortOptions.sortByOptionBestSelling;\r\n break;\r\n case 'NEWSCORE':\r\n key = sortOptions.sortByOptionNewScore;\r\n break;\r\n case 'TRENDINGSCORE':\r\n key = sortOptions.sortByOptionTrendingScore;\r\n break;\r\n default:\r\n }\r\n } else {\r\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\r\n }\r\n if (key) {\r\n return {\r\n key,\r\n sortColumn\r\n };\r\n }\r\n return undefined;\r\n })\r\n .filter(Boolean);\r\n });\r\n}\r\n\r\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new MappedSearchInput(inputData.requestContext.apiSettings);\r\n};\r\n\r\nexport const getMappedSearchConfigurationDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\r\n action: >getMappedSearchConfiguration,\r\n input: createInput\r\n});\r\n\r\nexport default getMappedSearchConfigurationDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values.\r\n * @param searchCriteria Product search criteria.\r\n * @param maxItems Max items.\r\n * @param queryResultSettings\r\n * @param ctx Action context.\r\n */\r\nexport async function getProductRefinerHierarchy(\r\n searchCriteria: ProductSearchCriteria,\r\n queryResultSettings: IQueryResultSettings,\r\n ctx: IActionContext\r\n): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\r\n (productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * Default Category/Product Id Values.\r\n */\r\nenum DefaultValues {\r\n defaultCategoryIdValue = 0,\r\n defaultProductIdValue = 0\r\n}\r\n\r\n/**\r\n * Refiners-by-Collection Input action.\r\n */\r\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n\r\n public dataCacheType = () => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n };\r\n}\r\n\r\n/**\r\n * Create input method which creates an ActionInput for fetching list page refiners.\r\n * @param args\r\n */\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return createBaseCollectionInput(args, RefinersByCollectionInput);\r\n};\r\n\r\n/**\r\n * Action method which fetches refiners for the given list page.\r\n * @param input\r\n * @param ctx\r\n */\r\nasync function action(input: RefinersByCollectionInput, ctx: IActionContext): Promise {\r\n let searchProductId;\r\n if (input.pageType === 'Category') {\r\n if (input.category) {\r\n return getProductRefinerHierarchy(\r\n {\r\n CategoryIds: [input.category || DefaultValues.defaultCategoryIdValue],\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\r\n } else {\r\n if (input.searchText && ctx.requestContext.query && ctx.requestContext.query.q) {\r\n return getProductRefinerHierarchy(\r\n {\r\n SearchCondition: input.searchText,\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n if (input.searchText && ctx.requestContext.query && ctx.requestContext.query.productId) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n return getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : [],\r\n RecommendationListId: searchObject.Recommendation,\r\n Ids: [searchProductId || DefaultValues.defaultProductIdValue]\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n }\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray\r\n .map(compressedRefiner => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n })\r\n .filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n const sortedRefiners = refiners.sort((first, second) =>\r\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\r\n );\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\n/**\r\n * ProductRefinerSource enum type.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum ProductRefinerSource {\r\n /**\r\n * The None member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n None = 0,\r\n\r\n /**\r\n * The Attribute member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Attribute = 1,\r\n\r\n /**\r\n * The Category member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Category = 2,\r\n\r\n /**\r\n * The Price member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Price = 3,\r\n\r\n /**\r\n * The Rating member.\r\n * @deprecated This will be removed soon. Please, use `ProductRefinerSource` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { ProductRefinerSource } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Rating = 4\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency\r\n // dataTypeValue === AttributeDataType.Decimal ||\r\n // dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\nexport function getRenderValue(value: string, facetName: string) {\r\n if (facetName.toLowerCase() === 'product size') {\r\n try {\r\n const parsedVal = parseInt(value, 10);\r\n if (parsedVal > 999) {\r\n return `${parsedVal / 1000}L`;\r\n } else {\r\n return `${parsedVal}ML`;\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n productRefinerValue: ProductRefinerValue,\r\n refinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(productRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(productRefinerValue: ProductRefinerValue, refinementCriterion: ProductRefinerValue): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === productRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === productRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === productRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === productRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: IRefineItemToggleNotification,\r\n currentRefinementCriteria: ProductRefinerValue[]\r\n): ProductRefinerValue[] {\r\n const updatedRefinementCriteria: ProductRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ProductRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.productRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.productRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.productRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.productRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.productRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentProductRefinerHierarchy.Values.forEach((child: ProductRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ProductRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\nexport function formatPrice(\r\n amount: string | undefined,\r\n currency: string | undefined,\r\n locale: string | undefined,\r\n telemetry: ITelemetry\r\n): string {\r\n if (!amount || !currency) {\r\n telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n return amount || '';\r\n }\r\n const priceAmount = (amount && Number(amount)) || 0;\r\n let result: string;\r\n\r\n try {\r\n result = new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currencyDisplay: 'symbol',\r\n currency,\r\n minimumFractionDigits: 0\r\n }).format(priceAmount);\r\n } catch (error) {\r\n result = `${priceAmount} ${currency}`;\r\n telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { ProductRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { getPayloadObject, getTelemetryAttributes, IPayLoad } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IChoiceSummaryProps } from './choice-summary.props';\r\nimport { getRenderValue, isMatchingRefinementCriterion, isRangeType } from './utilities';\r\nimport { ProductListInventoryFilteringOptions } from '../actions/get-full-products-by-collection';\r\n\r\ninterface IRefinerMap {\r\n key: string;\r\n keyName: string;\r\n value: ProductRefinerValue;\r\n}\r\n\r\n/**\r\n * ChoiceSummary component.\r\n */\r\n@observer\r\nexport default class ChoiceSummary extends React.PureComponent {\r\n private readonly closeButtonGlyph: string = 'msi-close-btn';\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n @computed get selectedRefinersMap(): IRefinerMap[] {\r\n let { selectedChoices } = this.props;\r\n const { channelInventoryConfigurationId, refinerHierarchy } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n if (this.props.context?.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS) {\r\n selectedChoices = selectedChoices.filter(choice => {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, choice))\r\n );\r\n return parent && parent.RecordId !== channelInventoryConfigurationId;\r\n });\r\n }\r\n return selectedChoices.map((selectedRefiner: ProductRefinerValue) => {\r\n return {\r\n key: this._getKeyForRefinerValue(selectedRefiner),\r\n keyName: this._getKeyNameForRefiner(selectedRefiner),\r\n value: selectedRefiner\r\n } as IRefinerMap;\r\n });\r\n }\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { clearAllText, label, classNames, choiceAriaLabel, closeAriaLabel } = this.props;\r\n const items = this.selectedRefinersMap;\r\n this.payLoad.contentAction.etext = clearAllText;\r\n const clearAllAttributes = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n return (\r\n
\r\n {items.length > 0 && label && {label}}\r\n
    \r\n {items.map((item: IRefinerMap) => {\r\n this.payLoad.contentAction.etext = item.key;\r\n const attribute = getTelemetryAttributes(this.props.telemetryContent!, this.payLoad);\r\n\r\n return (\r\n
  • \r\n \r\n {item.keyName}:{' '}\r\n {item.value.LeftValueBoundString && item.value.LeftValueBoundLocalizedString === ''\r\n ? getRenderValue(item.value.LeftValueBoundString, item.keyName)\r\n : (item.value.LeftValueBoundLocalizedString ||\r\n item.value.LeftValueBoundLocalizedString === undefined) &&\r\n item.value.RefinerRecordId === 0\r\n ? item.key\r\n : getRenderValue(item.value.LeftValueBoundString!, item.keyName)}\r\n \r\n \r\n
  • \r\n );\r\n })}\r\n
\r\n {items.length > 0 && clearAllText && (\r\n \r\n {clearAllText}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _getKeyForRefinerValue(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(r => r.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}_${refinerName}`);\r\n }\r\n\r\n private _getKeyNameForRefiner(productRefinerValue: ProductRefinerValue): string {\r\n const { choiceFormat, choiceRangeValueFormat, refinerHierarchy, telemetry, refinerValues } = this.props;\r\n const overallFormat = choiceFormat || '{1}';\r\n const rangeFormat = choiceRangeValueFormat;\r\n let refinerName = '';\r\n if (refinerHierarchy && refinerHierarchy.find) {\r\n const parent = refinerHierarchy.find(\r\n (hierarchy: IProductRefinerHierarchy) =>\r\n !!hierarchy.Values.find((value: ProductRefinerValue) => isMatchingRefinementCriterion(value, productRefinerValue))\r\n );\r\n\r\n if (!parent) {\r\n telemetry.warning('[choice-summary] could not find parent of selected refiner value');\r\n } else {\r\n refinerName = parent.KeyName || '';\r\n }\r\n }\r\n\r\n let refinerValueName: string;\r\n if (isRangeType(productRefinerValue.DataTypeValue)) {\r\n refinerValueName = rangeFormat\r\n .replace('{0}', this._formatPrice(productRefinerValue.LeftValueBoundString, productRefinerValue.UnitText))\r\n .replace('{1}', this._formatPrice(productRefinerValue.RightValueBoundString, productRefinerValue.UnitText));\r\n } else if (productRefinerValue.RefinerRecordId === 0) {\r\n const filterValue = refinerValues?.Values.find(r => r.LeftValueBoundString === productRefinerValue.LeftValueBoundString);\r\n refinerValueName = (filterValue ? filterValue.LeftValueBoundLocalizedString : productRefinerValue.LeftValueBoundString) || '';\r\n } else {\r\n refinerValueName = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n }\r\n\r\n if (refinerName === 'Rating' || refinerName === 'Price') {\r\n return overallFormat.replace('{0}', refinerName).replace('{1}', `${refinerValueName}`);\r\n }\r\n return refinerName;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined, currency: string | undefined): string {\r\n if (!amount || !currency) {\r\n this.props.telemetry.trace('[choice-summary] could not format price');\r\n return amount || '';\r\n }\r\n let result = amount;\r\n\r\n try {\r\n result = this.props.context!.cultureFormatter.formatCurrency(Number(amount), currency);\r\n } catch (error) {\r\n this.props.telemetry.warning(`Failed to format price for ${result}: ${error}`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.currentTarget as HTMLElement;\r\n const clearAll = target.getAttribute('class')!.includes('choice-summary__clear-all');\r\n const selectedRefiner = clearAll ? undefined : this._getSelectedRefinerChoice(target);\r\n\r\n if (this.props.onChoiceClicked) {\r\n this.props.onChoiceClicked({\r\n clearAll,\r\n itemClicked: target,\r\n choiceClicked: selectedRefiner,\r\n nextItemToFocus: target.nextSibling as HTMLElement\r\n });\r\n }\r\n };\r\n\r\n private _getSelectedRefinerChoice(itemClicked: HTMLElement): ProductRefinerValue | undefined {\r\n const result = this.selectedRefinersMap.find(selected => itemClicked.id === selected.key);\r\n return (result && result.value) || undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface IErrorMessage {\r\n text?: string;\r\n}\r\n\r\nexport const ErrorMessage: React.FC = ({ text }) => {\r\n return (\r\n \r\n
\r\n {` `}\r\n {text}\r\n {` `}\r\n
\r\n
\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ICoreContext, IGridSettings, IImageData, IImageSettings, Image, IRequestContext } from '@msdyn365-commerce/core';\r\nimport { SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { getFallbackImageUrl, getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-search-result-container.props.autogenerated';\r\n\r\n// Import { IComponent, IComponentProps, ICoreContext, IGridSettings, IImageData, IImageSettings, Image, msdyn365Commerce } from '@msdyn365-commerce/core';\r\n\r\ninterface IFeatureSearchResultItem {\r\n product: SimpleProduct | null;\r\n context: ICoreContext;\r\n resources: IEveSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n telemetryContent?: ITelemetryContent;\r\n recommendation?: string;\r\n}\r\n\r\nexport const FeatureSearchResultItem: React.FC = ({\r\n product,\r\n context,\r\n imageSettings,\r\n resources,\r\n telemetryContent,\r\n recommendation\r\n}) => {\r\n if (product === null) {\r\n return null;\r\n }\r\n\r\n const productName = product.Name;\r\n const productRecordId = product && product.RecordId ? product.RecordId : 0;\r\n const productUrl = getProductPageUrlSync(product.Name || '', productRecordId, context && context.actionContext, undefined);\r\n const fallbackImage = getFallbackImageUrl(product.ItemId, context.actionContext.requestContext.apiSettings);\r\n const heading =\r\n recommendation && recommendation === 'descriptions' ? resources.featureSimilarDescriptionTitle : resources.featureSimilarLooksTitle;\r\n\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, productName!, productRecordId.toString());\r\n\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n return (\r\n
\r\n \r\n
\r\n {renderProductPlacementImage(\r\n imageSettings,\r\n context.request.gridSettings,\r\n product.PrimaryImageUrl,\r\n product.Name,\r\n fallbackImage,\r\n context.actionContext.requestContext\r\n )}\r\n
\r\n \r\n
\r\n

{heading}

\r\n {renderProductTitle(product?.Name)}\r\n
\r\n
\r\n );\r\n};\r\n\r\nfunction renderProductPlacementImage(\r\n imageSettings?: IImageSettings,\r\n gridSettings?: IGridSettings,\r\n imageUrl?: string,\r\n altText?: string,\r\n fallbackImage?: string,\r\n context?: IRequestContext\r\n): JSX.Element | null {\r\n if (!imageUrl || !gridSettings || !imageSettings) {\r\n return null;\r\n }\r\n const img: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : ''\r\n };\r\n const imageProps = {\r\n gridSettings,\r\n imageSettings,\r\n fallBackSrc: fallbackImage\r\n };\r\n return ;\r\n}\r\n\r\nfunction renderProductTitle(title?: string): JSX.Element | null {\r\n return

{title}

;\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ILink {\r\n className?: string;\r\n text?: string;\r\n href?: string;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport const Link: React.FC = ({ text, className, href, ariaLabel }) => (\r\n \r\n {' '}\r\n {text}{' '}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Button, Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ISearchResultModalViewProps {\r\n modal: React.ReactElement;\r\n modalHeader: React.ReactElement;\r\n modalFooter: React.ReactElement;\r\n modalBody: React.ReactElement;\r\n}\r\n\r\ninterface IModalToggleProps {\r\n innerRef: React.RefObject | undefined;\r\n id: string;\r\n text: string;\r\n ariaLabel: string;\r\n onClick(): void;\r\n}\r\n\r\nexport interface ISearchResultModalResources {\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n}\r\n\r\nexport interface ISearchResultModalProps {\r\n resources: ISearchResultModalResources;\r\n isOpen: boolean;\r\n returnRef: React.RefObject | undefined;\r\n onModalToggle(): void;\r\n}\r\n\r\nexport const ModalToggle: React.FC = (props: IModalToggleProps) => {\r\n const { text, onClick, ariaLabel, innerRef, id } = props;\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SearchResultModal = (props: ISearchResultModalProps): ISearchResultModalViewProps => {\r\n return {\r\n modal: modalNode(props),\r\n modalHeader: modalHeaderNode(props),\r\n modalFooter: modalFooterNode(props),\r\n modalBody: \r\n };\r\n};\r\n\r\nconst modalNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n );\r\n};\r\n\r\nconst modalHeaderNode = (props: ISearchResultModalProps) => {\r\n return {props.resources.modalTitle};\r\n};\r\n\r\nconst modalFooterNode = (props: ISearchResultModalProps) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductsDimensionsAvailabilities } from '@msdyn365-commerce/commerce-entities';\r\nimport { IPriceComponentResources, ProductComponent } from '@msdyn365-commerce/components';\r\nimport { ICoreContext, IImageSettings } from '@msdyn365-commerce/core';\r\nimport { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IEveSearchResultContainerResources } from '../eve-search-result-container.props.autogenerated';\r\n\r\ninterface IProductSearchResultItems {\r\n products: ProductSearchResult[];\r\n context: ICoreContext;\r\n resources: IEveSearchResultContainerResources;\r\n imageSettings?: IImageSettings;\r\n moduleType: string;\r\n moduleId: string;\r\n allowBackNavigation?: boolean;\r\n telemetryContent: ITelemetryContent;\r\n quickviewSlot?: {} | null | undefined;\r\n productComparisonButton?: {} | null | undefined;\r\n channelInventoryConfigurationId?: number;\r\n isPriceMinMaxEnabled?: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nexport function getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport const ProductSearchResultItems: React.FC = ({\r\n products,\r\n context,\r\n imageSettings,\r\n resources,\r\n moduleType,\r\n moduleId,\r\n allowBackNavigation,\r\n telemetryContent,\r\n quickviewSlot,\r\n productComparisonButton,\r\n channelInventoryConfigurationId,\r\n isPriceMinMaxEnabled,\r\n productsDimensionAvailabilities\r\n}) => {\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n return (\r\n
    \r\n {products.map((product: ProductSearchResult, index: number) => (\r\n
  • \r\n \r\n ArrayExtensions.hasElements(dimensionAvailability) &&\r\n dimensionAvailability[0].masterProductId === product.MasterProductId\r\n )}\r\n />\r\n
  • \r\n ))}\r\n
\r\n );\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemProps, IRefineItemState } from './refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends IRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends IRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.productRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { productRefinerValue, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerValue || !parentProductRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without productRefinerValue and parentProductRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentProductRefinerHierarchy.RecordId)}_${String(\r\n this.props.productRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.productRefinerValue.LeftValueBoundString;\r\n const maxValue = this.props.productRefinerValue.RightValueBoundString;\r\n const minPrice = this._formatPrice(minValue);\r\n const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minPrice, maxPrice);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.productRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ??\r\n this.props.productRefinerValue.RightValueBoundString ??\r\n maxValue;\r\n const selectedMinPrice = this._formatPrice(selectedMin);\r\n const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n selectedMinPrice,\r\n selectedMax,\r\n selectedMaxPrice,\r\n maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minPrice - Slider min value.\r\n * @param maxPrice - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minPrice: string, maxPrice: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minPrice}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxPrice}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n selectedMinPrice: string,\r\n selectedMax: string | undefined,\r\n selectedMaxPrice: string,\r\n maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMinPrice}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) || Number(maxPrice),\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${selectedMaxPrice}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentProductRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentProductRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const {\r\n onToggle,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n refineItemCommonProps,\r\n selectedRefinementCriterion\r\n } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (productRefinerValue) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentProductRefinerHierarchy, productRefinerValue } = this.props;\r\n if (productRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { format, getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { getRenderValue } from './utilities';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface IRefineItemProps {\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy;\r\n productRefinerValue: ProductRefinerValue;\r\n selectedRefinementCriterion: ProductRefinerValue | undefined;\r\n selectedRefinerValues?: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface IRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class RefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: IRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineItemProps, nextState: IRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n selectedRefinementCriterion,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n ...attrs\r\n } = this.props;\r\n if (!productRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without productRefinerValue');\r\n return undefined;\r\n }\r\n if (!productRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(productRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentProductRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n return this._renderRating(\r\n productRefinerValue,\r\n parentProductRefinerHierarchy,\r\n isChecked,\r\n context,\r\n index,\r\n telemetryContent,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel\r\n );\r\n }\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString ?? productRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productText = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const productCount = productRefinerValue.Count || 0;\r\n let refineMenuItemAriaLabel;\r\n if (productCount === 1) {\r\n refineMenuItemAriaLabel = refineItemAriaLabel\r\n ? format(refineItemAriaLabel, parentProductRefinerHierarchy.KeyName, productText)\r\n : '';\r\n } else {\r\n refineMenuItemAriaLabel = refineItemsAriaLabel\r\n ? format(refineItemsAriaLabel, parentProductRefinerHierarchy.KeyName, productText, productCount)\r\n : '';\r\n }\r\n return (\r\n
  • \r\n \r\n {this._renderSwatch()}\r\n \r\n \r\n
  • \r\n );\r\n }\r\n\r\n private _renderSwatch(): JSX.Element | null {\r\n const productRefinerValue = this.props.productRefinerValue;\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n const hasValidSwatch = hasColor || hasImage;\r\n const shouldDisplayAsSwatch =\r\n hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n const swatchItems = shouldDisplayAsSwatch\r\n ? [\r\n {\r\n itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n value: text,\r\n dimensionType,\r\n colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n imageUrl: productRefinerValue.SwatchImageUrl\r\n }\r\n ]\r\n : undefined;\r\n\r\n if (!swatchItems) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _getRefinerUrl(): string {\r\n const { urlBuilder, parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n if (productRefinerValue) {\r\n return urlBuilder({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n\r\n const { parentProductRefinerHierarchy, productRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (productRefinerValue) {\r\n this.props.onToggle({\r\n parentProductRefinerHierarchy,\r\n productRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n private _renderRating(\r\n productRefinerValue: ProductRefinerValue,\r\n parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n isChecked: boolean,\r\n context: ICoreContext,\r\n index?: number,\r\n telemetryContent?: ITelemetryContent,\r\n ratingUserCountAriaLabel?: string,\r\n ratingSingleUserCountAriaLabel?: string\r\n ): JSX.Element | undefined {\r\n if (productRefinerValue.LeftValueBoundString) {\r\n this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n );\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n const defaultChkProductCount = 1;\r\n let ratingComponentClass: string = 'ms-rating-component';\r\n if (refinerRating > selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__up`;\r\n } else if (refinerRating < selectedRating) {\r\n ratingComponentClass = `${ratingComponentClass}__down`;\r\n } else {\r\n ratingComponentClass = `${ratingComponentClass}__current`;\r\n }\r\n const productCountAriaLabelValue =\r\n productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n return (\r\n \r\n \r\n \r\n \r\n {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n \r\n \r\n \r\n );\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource, ProductRefinerValue, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\nimport { Button, Collapse, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './range-refine-item';\r\nimport RefineItem from './refine-item';\r\nimport { IRefineItemCommonProps } from './refine-item.props.common';\r\nimport { IRefineItemToggleNotification } from './refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './utilities';\r\n\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface IRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n productRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ProductRefinerValue[];\r\n refineItemCommonProps: IRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n refineItemAriaLabel?: string;\r\n refineItemsAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: IRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface IRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass RefineSubmenu extends React.Component {\r\n constructor(props: IRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRefineSubmenuProps, nextState: IRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { productRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!productRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n return (\r\n
    \r\n \r\n {productRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(productRefinerHierarchy)}\r\n \r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(productRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(productRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(productRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n refineItemAriaLabel,\r\n refineItemsAriaLabel,\r\n isMobile\r\n } = this.props;\r\n const isSingleSelect =\r\n productRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect &&\r\n productRefinerHierarchy.SourceValue === ProductRefinerSource.Rating;\r\n const role = isSingleSelect ? { role: 'listbox' } : undefined;\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n productCountAriaLabel={productCountAriaLabel}\r\n refineItemAriaLabel={refineItemAriaLabel}\r\n refineItemsAriaLabel={refineItemsAriaLabel}\r\n singleProductCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(productRefinerHierarchy: IProductRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n productRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(productRefinerHierarchy: IProductRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = productRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ProductRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${productRefinerHierarchy.RecordId} (${productRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(productRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: IRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default RefineSubmenu;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ISeparator {\r\n separator: string;\r\n}\r\n\r\nexport const Separator: React.FC = ({ separator }) => (\r\n \r\n {` `}\r\n {separator}\r\n {` `}\r\n \r\n);\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport * as React from 'react';\r\n\r\ninterface ITitle {\r\n className: string;\r\n text: string;\r\n}\r\n\r\nexport const Title: React.FC = ({ text, className }) => (\r\n \r\n {` `}\r\n {text}\r\n {` `}\r\n \r\n);\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IEveSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IEveSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n enableProdutDescription?: boolean;\r\n useStickyFilter?: boolean;\r\n useListView?: boolean;\r\n}\r\n\r\nexport interface IEveSearchResultContainerResources {\r\n filterText: string;\r\n doneText: string;\r\n doneAriaLabel: string;\r\n itemNoLabel: string;\r\n nameLabel: string;\r\n availabilityLabel: string;\r\n listPriceLabel: string;\r\n quantityLabel: string;\r\n addToCartLabel: string;\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n addToCartModalHeading: string;\r\n licenseAndTaxPaymentErrorText: string;\r\n noProductsFoundMessage: string;\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n}\r\n\r\nexport interface IEveSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IEveSearchResultContainerResources;\r\n config: IEveSearchResultContainerConfig;\r\n slots: {\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365, { getCatalogId, ICoreContext } from '@msdyn365-commerce/core';\r\nimport { format, ProductPrice, ProductRefinerValue, SortColumn, TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ArrayExtensions,\r\n DimensionAvailabilitiesForProductSearchResultInput,\r\n DimensionTypes,\r\n getDimensionAvailabilitiesForProductSearchResultAction,\r\n getPriceForProductSearchResult,\r\n IDimensionsApp,\r\n PriceForProductSearchResultInput\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n isMobile,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\nimport getCollectionProducts from './actions/get-full-products-by-collection';\r\nimport { buildListPageUrl, getCurrentUrl, hydrateRefinersFromUrl, parseQueryParam } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { ListPageState } from './list-page-state';\r\nimport { IEveSearchResultContainerData } from './eve-search-result-container.data';\r\nimport { expandRefinersCount, IEveSearchResultContainerProps } from './eve-search-result-container.props.autogenerated';\r\nimport { sortOptions } from './actions/get-mapped-search-configuration';\r\nimport {\r\n GetFullProductsByCollectionInput,\r\n IFullProductsSearchResultsWithCount,\r\n ProductListInventoryFilteringOptions\r\n} from './actions/get-full-products-by-collection';\r\nimport getCollectionRefinersAction, { RefinersByCollectionInput } from './actions/get-refiners-for-collection';\r\n\r\nexport interface ISearchResultContainerViewProps extends IEveSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IEveSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc },\r\n { key: sortOptions.sortByOptionBestSelling, value: this.props.resources.sortByOptionBestSelling },\r\n { key: sortOptions.sortByOptionNewScore, value: this.props.resources.sortByOptionNewScore },\r\n { key: sortOptions.sortByOptionTrendingScore, value: this.props.resources.sortByOptionTrendingScore }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize = 'lg';\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private readonly catalogId = getCatalogId(this.props.context.request);\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && ArrayExtensions.hasElements(nameTranslations)) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation?.Text;\r\n }\r\n\r\n public constructor(props: IEveSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Check required.\r\n this._viewport = props.context.request?.device?.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: []\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n this._updateViewport();\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const products = await this.props.data.products;\r\n\r\n this._updateListPageState(listPageState, products);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters?.length,\r\n listPageState.currentPageNumber,\r\n ArrayExtensions.hasElements(listPageState.sortingCritera?.Columns)\r\n ];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const input = new GetFullProductsByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n\r\n // eslint-disable-next-line max-len -- existing code\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Required check.\r\n !!this.props?.config?.includeAttributes,\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale,\r\n this.catalogId\r\n );\r\n\r\n const productResults = await getCollectionProducts(input, this.props.context.actionContext);\r\n newListPageState.totalProductCount = productResults.count;\r\n newListPageState.activeProducts = productResults.products;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check is required.\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n newListPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n newListPageState.pageSize * (newListPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: newListPageState.sortingCritera ?? {}\r\n },\r\n newListPageState.activeFilters ?? [],\r\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- RecordId is string. Check required.\r\n +(this.props.context.request.urlTokens.recordId || 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel,\r\n undefined,\r\n this.catalogId\r\n );\r\n\r\n const refiners = await getCollectionRefinersAction(refinerInput, this.props.context.actionContext);\r\n this.setState({ refiners });\r\n }\r\n }\r\n );\r\n\r\n if (\r\n this.props.config.enableAffiliationBasedPricing &&\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Condition required.\r\n this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n ) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call api to retrieve the availabilities data without blocking the UI.\r\n this._getActivePrice();\r\n }\r\n\r\n const context = this.props.context as ICoreContext;\r\n const dimensionsToDisplayOnProductCard = context.app.config.dimensionsInProductCard;\r\n const dimensionsToDisplayAsSwatch = context.app.config.dimensionsAsSwatchType;\r\n if (\r\n ArrayExtensions.hasElements(dimensionsToDisplayOnProductCard) &&\r\n !dimensionsToDisplayOnProductCard.includes(DimensionTypes.none) &&\r\n ArrayExtensions.hasElements(dimensionsToDisplayAsSwatch) &&\r\n !dimensionsToDisplayAsSwatch.includes(DimensionTypes.none) &&\r\n this.props.config.includeAttributes\r\n ) {\r\n await this._getProductsDimensionsAvailabilities();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const {\r\n config: { imageSettings, className },\r\n resources,\r\n data: { listPageState, products: productCollection, featureProduct }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && productCollection.result) {\r\n this._updateListPageState(listPageState.result, productCollection.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const searchProduct = listPageState.result?.featureProduct ?? featureProduct.result ?? null;\r\n let errorText = '';\r\n if (!ArrayExtensions.hasElements(products)) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n products: productsComponent,\r\n TitleViewProps: this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container', className)\r\n },\r\n sortByOptions: this.props.data.listPageState.result?.totalProductCount !== 0 ? this._getSortingDropDown() : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section' },\r\n RefineAndProductSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result?.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct: searchProduct ? featureComponent : null,\r\n productPrices: this.productPrices\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n /**\r\n * Update the list page state with initial data.\r\n * @param listPageState -- List page State.\r\n * @param products -- Products.\r\n */\r\n private readonly _updateListPageState = (listPageState: ListPageState, products: IFullProductsSearchResultsWithCount): void => {\r\n let querySorting: SortColumn[] = [];\r\n const defaultPageNumber: number = 10;\r\n\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n if (this.props.context.request.query?.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get products dimension availabilities.\r\n * @returns Void.\r\n */\r\n private readonly _getProductsDimensionsAvailabilities = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n\r\n const productsDimensionAvailabilities = await getDimensionAvailabilitiesForProductSearchResultAction(\r\n new DimensionAvailabilitiesForProductSearchResultInput(productsList, this.props.context as ICoreContext),\r\n this.props.context.actionContext\r\n );\r\n\r\n if (ArrayExtensions.hasElements(productsDimensionAvailabilities)) {\r\n this.setState({ productsDimensionAvailabilities });\r\n }\r\n };\r\n\r\n /**\r\n * Get the active price for the products.\r\n */\r\n private readonly _getActivePrice = async (): Promise => {\r\n const productsList = this.props.data.listPageState.result?.activeProducts ?? [];\r\n const products = await getPriceForProductSearchResult(\r\n new PriceForProductSearchResultInput(productsList),\r\n this.props.context.actionContext\r\n );\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n listPageState.activeProducts = products;\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdownOptions = this._getAllSortByOptions();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdownOptions = dropdownOptions.filter(dropdownOption => dropdownOption.key !== sortOptions.sortByOptionRatingDesc);\r\n }\r\n\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdownOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState?.currentPageNumber\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = listPageState?.totalProductCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n (this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId)\r\n );\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n const refinerValueName = this.props.data.refiners.result?.find(n => n.KeyName === 'Rating');\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n label={resources.choiceSummaryLabel}\r\n closeAriaLabel={resources.closeAriaLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n refinerValues={refinerValueName}\r\n />\r\n );\r\n };\r\n\r\n /**\r\n * Get Active products.\r\n * @returns - JSX Elements.\r\n */\r\n private readonly _getProducts = (): JSX.Element => {\r\n const {\r\n config: { imageSettings, allowBackNavigation: shouldAllowBackNavigation }\r\n } = this.props;\r\n const { resources } = this.props;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- Reading config value.\r\n const breadCrumbType: string = this.props.context.app.config.breadcrumbType;\r\n const shouldAllowBack = shouldAllowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewSlot = this.props.slots?.quickview?.[0];\r\n const productComparisonButton = ArrayExtensions.hasElements(this.props.slots.productComparisonButton)\r\n ? this.props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={shouldAllowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewSlot}\r\n productComparisonButton={productComparisonButton}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n productsDimensionAvailabilities={this.state.productsDimensionAvailabilities}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n // eslint-disable-next-line max-len -- existing code\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n /**\r\n * Retrieves current sort criteria.\r\n * @returns Sort criteria column which is currently active or undefined if it's not specified.\r\n */\r\n private readonly _getSortCriteriaColumn = (): SortColumn | undefined => {\r\n const sortCriteria = this.props.data.listPageState.result?.sortingCritera;\r\n if (ArrayExtensions.hasElements(sortCriteria?.Columns)) {\r\n return sortCriteria!.Columns[0];\r\n }\r\n\r\n const queryColumns = parseQueryParam<SortColumn[]>('sorting', this.props.context.request);\r\n if (ArrayExtensions.hasElements(queryColumns)) {\r\n return queryColumns[0];\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Retrieves dropdown options.\r\n * @returns All dropdown options.\r\n */\r\n private readonly _getAllSortByOptions = (): ILabeledDropdownOption[] => {\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!searchConfiguration) {\r\n return [];\r\n }\r\n\r\n const mappedSearchConfiguration = this.sortByDropdownOptions.filter(mappedSearchConfig =>\r\n searchConfiguration.find(item => mappedSearchConfig.key === item.key)\r\n );\r\n\r\n return ArrayExtensions.validValues(mappedSearchConfiguration);\r\n };\r\n\r\n /**\r\n * Retrieves current selected dropdown option based on the sort criteria.\r\n * @returns Current dropdown option.\r\n */\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const activeSortColumn = this._getSortCriteriaColumn();\r\n\r\n const searchConfiguration = this.props.data.searchConfiguration.result;\r\n\r\n if (!activeSortColumn || !searchConfiguration) {\r\n return undefined;\r\n }\r\n\r\n const activeMappedConfig = searchConfiguration.find(\r\n mappedSearchConfig =>\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n if (!activeMappedConfig) {\r\n return undefined;\r\n }\r\n\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const {\r\n context: { request: requestContext, actionContext }\r\n } = this.props;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: \r\n ${!requestContext ? 'requestContext ' : ''} ${!actionContext ? 'actionContext ' : ''} could not be found`;\r\n this.props.telemetry.warning(error);\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Server side the list PageState will not be called.\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result?.activeFilters || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n if (MsDyn365.isBrowser) {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.context.request });\r\n }\r\n return isMobile({ variant: VariantType.Viewport, context: this.props.context.request });\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport MsDyn365, { getUrlSync } from '@msdyn365-commerce/core';\r\nimport { AsyncResult, ProductPrice, ProductSearchResult, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { ArrayExtensions, IProductInventoryInformation } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './eve-search-result-container';\r\nimport { Button, getTelemetryObject, IPopupProps, Module, Node, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { MouseEventHandler, useEffect, useState } from 'react';\r\n\r\nimport { ProductComponent } from './components/product.component';\r\n\r\nimport { AddToCartListComponent } from './components/add-to-cart.component';\r\nimport Table from 'reactstrap/lib/Table';\r\n\r\n/**\r\n * DescriptionInterval.\r\n */\r\nenum DescriptionInterval {\r\n productDescriptionInterval = 14,\r\n productDescriptionIntervalRemainder0 = 0,\r\n productDescriptionIntervalRemainder9 = 9\r\n}\r\n\r\nimport { ICartState } from '@msdyn365-commerce/global-state';\r\nimport { IEveEachPrice, IEveEachPriceRequestMap } from '../../actions/DataServiceEntities.g';\r\nimport { GetCatalogIdFromContext } from '../../utilities';\r\nimport { getExtensionPropertyValueByKey, CommercePropertyValueEnum } from '../../utilities/getExtensionPropertyValueByKey';\r\nimport { IEveSearchResultContainerResources } from './eve-search-result-container.props.autogenerated';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport GetUomAction, { GetUomInput } from '../../actions/get-uom.action';\r\nimport GetInventoryUomAction, { GetInventoryUomInput, IUomProductInventoryInput } from '../../actions/get-inventory-uom.action';\r\n\r\nexport interface IProductSearchResultExtensionData {\r\n cart: AsyncResult<ICartState>;\r\n}\r\n\r\nexport class productInventoryInformation {\r\n public recordId: number = 0;\r\n public label: string = '';\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCards = (props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n {props.products}\r\n </Node>\r\n );\r\n};\r\n\r\n/**\r\n * Returns the product inventory label.\r\n * @param channelInventoryConfigurationId - The channel configuration Id.\r\n * @param product - The product.\r\n * @returns The inventory label.\r\n */\r\nfunction getInventoryLabel(channelInventoryConfigurationId: number | undefined, product: ProductSearchResult): string | undefined {\r\n if (!channelInventoryConfigurationId || !ArrayExtensions.hasElements(product.AttributeValues)) {\r\n return undefined;\r\n }\r\n const inventoryAttribute = product.AttributeValues.find(attribute => attribute.RecordId === channelInventoryConfigurationId);\r\n if (inventoryAttribute) {\r\n return inventoryAttribute.TextValue;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction getQuantityForLine(productLines: { product: SimpleProduct; quantity: number }[], itemId: string, uom: string) {\r\n const found = productLines.find(pl => pl.product.ItemId === itemId && pl.product.DefaultUnitOfMeasure === uom);\r\n return found?.quantity || 0;\r\n}\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @param product - The product item data.\r\n * @param index - The index of each product item.\r\n * @param isEnabledProductDescription - The flag for showing Product desription tile.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProductCardsDescription = (\r\n props: ISearchResultContainerViewProps,\r\n product: ProductSearchResult,\r\n index: number,\r\n cartFunction: (itemID: number, caseQuantity: number, eachQuantity: number) => void,\r\n isOddRow: boolean,\r\n EaPrices: IEveEachPrice[],\r\n inventoryAvailability: IProductInventoryInformation[],\r\n handleCartLineUpdate: (pl: { product: SimpleProduct; quantity: number }[]) => void,\r\n productLines: { product: SimpleProduct; quantity: number }[],\r\n isEnabledProductDescription?: boolean\r\n): JSX.Element | null => {\r\n const { config, context, resources, isMobile } = props;\r\n const telemetryContent = getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n const breadCrumbType = props.context.app.config.breadcrumbType;\r\n const isAllowBack = props.config.allowBackNavigation && (breadCrumbType === 'back' || breadCrumbType === 'categoryAndBack');\r\n const classname = isEnabledProductDescription\r\n ? 'ms-product-search-result__item product__description'\r\n : 'ms-product-search-result__item';\r\n const quickviewslot = ArrayExtensions.hasElements(props.slots.quickview) ? props.slots.quickview[0] : undefined;\r\n const channelInventoryConfigurationId = props.data.products.result?.channelInventoryConfigurationId;\r\n const isPriceMinMaxFeatureState = props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n const priceResources: IPriceComponentResources = {\r\n priceRangeSeparator: resources.priceRangeSeparator\r\n };\r\n\r\n const productComparisonButton = ArrayExtensions.hasElements(props.slots.productComparisonButton)\r\n ? props.slots.productComparisonButton[0]\r\n : null;\r\n\r\n const cart = props.data.cart?.result?.cart;\r\n const cartLines = cart?.CartLines;\r\n let licenseAndTaxPayment;\r\n if (cartLines && cartLines.length) {\r\n licenseAndTaxPayment = getExtensionPropertyValueByKey(\r\n cartLines[0].ExtensionProperties,\r\n 'LicenseAndTaxPayment',\r\n CommercePropertyValueEnum.boolean\r\n );\r\n }\r\n\r\n const invNodeCs = inventoryAvailability.find(item => {\r\n return (\r\n item.ProductAvailableQuantity.ProductId === product.RecordId &&\r\n item.ProductAvailableQuantity.UnitOfMeasure?.toUpperCase() === 'CS'\r\n );\r\n });\r\n\r\n const invNodeEa = inventoryAvailability.find(item => {\r\n return (\r\n item.ProductAvailableQuantity.ProductId === product.RecordId &&\r\n item.ProductAvailableQuantity.UnitOfMeasure?.toUpperCase() === 'EA'\r\n );\r\n });\r\n let invString = invNodeCs?.StockLevelLabel || 'OOS';\r\n if (invString === 'OOS') {\r\n invString = invNodeEa?.StockLevelLabel || 'OOS';\r\n }\r\n const myEaPrice = EaPrices.find(item => item.ItemId === product.ItemId);\r\n if (isMobile ? false : config.useListView) {\r\n if (isOddRow) {\r\n return (\r\n <tr className={'list-view__table__row__shaded'} key={product.RecordId}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n key={product.RecordId}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n productComparisonButton={productComparisonButton}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={invString}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n isListView={isMobile ? false : config.useListView}\r\n EaPrice={myEaPrice}\r\n />\r\n {!licenseAndTaxPayment ? (\r\n <AddToCartListComponent\r\n product={product}\r\n addToCart={cartFunction}\r\n addToCartButtonText={resources.addToCartLabel}\r\n displayEaPrice={!!myEaPrice}\r\n displayCsPrice={product.DefaultUnitOfMeasure?.toLowerCase() !== 'ea'}\r\n factor={myEaPrice?.Factor ?? undefined}\r\n eaAvailable={invString === 'OOS' ? 0 : Math.floor(invNodeEa?.ProductAvailableQuantity.AvailableQuantity || 0)}\r\n csAvailable={invString === 'OOS' ? 0 : Math.floor(invNodeCs?.ProductAvailableQuantity.AvailableQuantity || 0)}\r\n handleCartLineUpdate={handleCartLineUpdate}\r\n eaQty={getQuantityForLine(productLines, product.ItemId!, 'ea')}\r\n csQty={getQuantityForLine(productLines, product.ItemId!, 'cs')}\r\n />\r\n ) : (\r\n <td className='list-view__table__row__shaded--error'>\r\n <div className='taxerrors'>{resources.licenseAndTaxPaymentErrorText}</div>\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n } else {\r\n return (\r\n <tr className={'list-view__table__row'} key={product.RecordId}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n key={product.RecordId}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n productComparisonButton={productComparisonButton}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={invString}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n isListView={isMobile ? false : config.useListView}\r\n EaPrice={EaPrices.find(item => item.ItemId === product.ItemId)}\r\n />\r\n {!licenseAndTaxPayment ? (\r\n <AddToCartListComponent\r\n product={product}\r\n addToCart={cartFunction}\r\n addToCartButtonText={resources.addToCartLabel}\r\n displayEaPrice={!!myEaPrice}\r\n displayCsPrice={product.DefaultUnitOfMeasure?.toLowerCase() !== 'ea'}\r\n factor={myEaPrice?.Factor ?? undefined}\r\n eaAvailable={\r\n invString === 'OOS'\r\n ? 0\r\n : Math.floor(invNodeEa?.ProductAvailableQuantity.AvailableQuantity || 0) % (myEaPrice?.Factor || 1)\r\n }\r\n csAvailable={invString === 'OOS' ? 0 : Math.floor(invNodeCs?.ProductAvailableQuantity.AvailableQuantity || 0)}\r\n handleCartLineUpdate={handleCartLineUpdate}\r\n eaQty={getQuantityForLine(productLines, product.ItemId!, 'ea')}\r\n csQty={getQuantityForLine(productLines, product.ItemId!, 'cs')}\r\n />\r\n ) : (\r\n <td className='list-view__table__row--error'>\r\n <div className='taxerrors'>{resources.licenseAndTaxPaymentErrorText}</div>\r\n </td>\r\n )}\r\n </tr>\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <li className={classname} key={index}>\r\n <ProductComponent\r\n context={context}\r\n telemetryContent={telemetryContent}\r\n imageSettings={config.imageSettings}\r\n freePriceText={resources.priceFree}\r\n originalPriceText={resources.originalPriceText}\r\n currentPriceText={resources.currentPriceText}\r\n ratingAriaLabel={resources.ratingAriaLabel}\r\n allowBack={isAllowBack}\r\n id={props.id}\r\n key={product.RecordId}\r\n typeName={props.typeName}\r\n data={{ product }}\r\n quickViewButton={quickviewslot}\r\n productComparisonButton={productComparisonButton}\r\n isEnabledProductDescription={isEnabledProductDescription}\r\n inventoryLabel={getInventoryLabel(channelInventoryConfigurationId, product)}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n priceResources={priceResources}\r\n swatchItemAriaLabel={resources.swatchItemAriaLabel}\r\n isListView={isMobile ? false : config.useListView}\r\n />\r\n </li>\r\n );\r\n};\r\n\r\n/**\r\n * Render Clear button for mobile viewport.\r\n * @param props - The view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderProducts = (\r\n props: ISearchResultContainerViewProps,\r\n cartFunction: (itemID: number, caseQuantity: number, eachQuantity: number) => void,\r\n EaPrices: IEveEachPrice[],\r\n Availabilities: IProductInventoryInformation[],\r\n handleCartLineUpdate: (cl: { product: SimpleProduct; quantity: number }[]) => void,\r\n productLines: { product: SimpleProduct; quantity: number }[]\r\n): JSX.Element | null => {\r\n const { config, resources, isMobile } = props;\r\n const products = props.data.listPageState.result?.activeProducts;\r\n if (!products || !ArrayExtensions.hasElements(products)) {\r\n return null;\r\n }\r\n\r\n // const test = props.data\r\n\r\n const productDescriptionInterval: number = DescriptionInterval.productDescriptionInterval;\r\n const productDescriptionIntervalRemainder0: number = DescriptionInterval.productDescriptionIntervalRemainder0;\r\n const productDescriptionIntervalRemainder9: number = DescriptionInterval.productDescriptionIntervalRemainder9;\r\n if (isMobile ? false : config.useListView) {\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <Table className={'list-view__table'}>\r\n <thead>\r\n <tr className={'list-view__table__title-row'}>\r\n <th className={'list-view__table__title-row__top-left'}></th>\r\n <th className='list-view__centre-justify'>{resources.itemNoLabel}</th>\r\n <th className='list-view__left-justify'>{resources.nameLabel}</th>\r\n <th className='list-view__centre-justify'>{resources.availabilityLabel}</th>\r\n <th className='list-view__right-justify'>{resources.listPriceLabel}</th>\r\n <th className='list-view__centre-justify'>{resources.quantityLabel}</th>\r\n <th className={'list-view__table__title-row__top-right'}></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(\r\n props,\r\n product,\r\n index,\r\n cartFunction,\r\n index % 2 === 1,\r\n EaPrices,\r\n Availabilities,\r\n handleCartLineUpdate,\r\n productLines,\r\n true\r\n )\r\n : renderProductCardsDescription(\r\n props,\r\n product,\r\n index,\r\n cartFunction,\r\n index % 2 === 1,\r\n EaPrices,\r\n Availabilities,\r\n handleCartLineUpdate,\r\n productLines,\r\n false\r\n )\r\n )}\r\n </tbody>\r\n </Table>\r\n </Node>\r\n );\r\n } else {\r\n return (\r\n <Node {...props.ProductsContainer}>\r\n {props.errorMessage}\r\n <ul className='list-unstyled'>\r\n {products.map((product: ProductSearchResult, index: number) =>\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder0 ||\r\n index % productDescriptionInterval === productDescriptionIntervalRemainder9\r\n ? renderProductCardsDescription(\r\n props,\r\n product,\r\n index,\r\n cartFunction,\r\n index % 2 === 1,\r\n EaPrices,\r\n Availabilities,\r\n handleCartLineUpdate,\r\n productLines,\r\n true\r\n )\r\n : renderProductCardsDescription(\r\n props,\r\n product,\r\n index,\r\n cartFunction,\r\n index % 2 === 1,\r\n EaPrices,\r\n Availabilities,\r\n handleCartLineUpdate,\r\n productLines,\r\n false\r\n )\r\n )}\r\n </ul>\r\n </Node>\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Render Title Count.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitleCount = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return <Node {...TitleContainer}>{title.titleCount}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Category Hierarchy.\r\n * @param props - The category hierarchy view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Function to make filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nexport const configureStickyFilter = (isMobile: boolean, isStickyHeader: boolean): void => {\r\n // Get heights of cookie and promotion banners\r\n const defaultValue = 0;\r\n const defaultOffset = 28;\r\n const headerContainer: HTMLElement | null = document.querySelector('.ms-header');\r\n\r\n const headerHeight: number | undefined = headerContainer?.offsetHeight;\r\n const containerHeight: number = headerHeight ?? defaultOffset;\r\n const bannerHeights = isStickyHeader ? defaultValue : containerHeight;\r\n const headerElement = document.querySelector('header .lock-opaque');\r\n const defaultContainer = document.querySelector('header .default-container');\r\n const refinerElement = isMobile ? document.querySelector('.msc-sort-filter-wrapper') : document.querySelector('.ms-refiner-heading');\r\n if (refinerElement && headerElement && defaultContainer) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-Filter');\r\n refinerElement.setAttribute('style', `top: ${defaultContainer.clientHeight}px`);\r\n } else {\r\n refinerElement.classList.remove('lock-Filter');\r\n }\r\n } else if (refinerElement) {\r\n if (MsDyn365.isBrowser && document.documentElement.scrollTop > bannerHeights) {\r\n refinerElement.classList.add('lock-top');\r\n } else {\r\n refinerElement.classList.remove('lock-top');\r\n refinerElement.classList.remove('lock-Filter');\r\n refinerElement.removeAttribute('style');\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Function to setup filter sticky.\r\n * @param isMobile - The boolean prop.\r\n * @param isStickyHeader - The boolean prop.\r\n */\r\nfunction stickyFilterSetup(isMobile: boolean, isStickyHeader: boolean): void {\r\n window.addEventListener('scroll', () => {\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n });\r\n configureStickyFilter(isMobile, isStickyHeader);\r\n}\r\n\r\n/**\r\n * Function to make filter sticky.\r\n * @param refinerRefernce - Ref prop for filter.\r\n * @param toggle - Toggle function for filter menu.\r\n */\r\nfunction useOutsideClick(refinerRefernce: React.RefObject<HTMLElement>, toggle: (event: Event) => void) {\r\n React.useEffect(() => {\r\n /**\r\n * Function to make filter sticky.\r\n * @param event - Event prop for filter.\r\n */\r\n function handleClickOutside(event: Event) {\r\n const element = document.querySelector('.ms-refine-filter__toggle_collapsed');\r\n if (refinerRefernce.current && !refinerRefernce.current.contains(event.target as Node) && !element) {\r\n toggle(event);\r\n }\r\n }\r\n\r\n if (MsDyn365.isBrowser) {\r\n document.addEventListener('click', handleClickOutside);\r\n }\r\n return () => {\r\n if (MsDyn365.isBrowser) {\r\n document.removeEventListener('click', handleClickOutside);\r\n }\r\n };\r\n }, [refinerRefernce, toggle]);\r\n}\r\n\r\n/**\r\n * Render the category page items.\r\n * @param props - The view props.\r\n * @returns The search Result container module view.\r\n */\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n SearchResultContainer,\r\n pagination,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n errorMessage,\r\n // productPrices,\r\n resources,\r\n data: { cart },\r\n context: {\r\n actionContext,\r\n actionContext: {\r\n requestContext: { gridSettings }\r\n }\r\n },\r\n resources: { goToCartText, continueShoppingText, addToCartModalHeading },\r\n config: { imageSettings }\r\n } = props;\r\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\r\n const [modalOpen, setModalOpen] = React.useState<boolean>(false);\r\n // @ts-ignore\r\n const [addedProduct, setAddedProduct] = React.useState<SimpleProduct | undefined>(undefined);\r\n // @ts-ignore\r\n const [productPricing, setProductPricing] = React.useState<ProductPrice | undefined>(undefined);\r\n const [EaPrices, setEaPrices] = React.useState<IEveEachPrice[]>([]);\r\n const [PriceGet, setPriceGet] = React.useState<boolean>(false);\r\n const [Availabilities, setAvailabilities] = React.useState<IProductInventoryInformation[]>([]);\r\n\r\n const [productLines, setProductLines] = React.useState<{ product: SimpleProduct; quantity: number }[]>([]);\r\n useEffect(() => {\r\n if (props.config.useStickyFilter && MsDyn365.isBrowser) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app context is generic\r\n stickyFilterSetup(props.isMobile, props.context.app.config.enableStickyHeader as boolean);\r\n }\r\n }, [props]);\r\n useEffect(() => {\r\n void getUomAndAvailabilities();\r\n }, [props.data.listPageState.result?.activeProducts]);\r\n\r\n const getUomAndAvailabilities = async () => {\r\n const myproducts = props.data.listPageState.result?.activeProducts;\r\n const productRecordIds: IEveEachPriceRequestMap[] = [];\r\n if (myproducts && ArrayExtensions.hasElements(myproducts)) {\r\n myproducts?.forEach(product => {\r\n productRecordIds.push({ ProductRecordId: product.RecordId, ProductItemId: product.ItemId });\r\n });\r\n\r\n const CatalogId = GetCatalogIdFromContext(props.context.actionContext);\r\n\r\n const input = new GetUomInput(productRecordIds, CatalogId);\r\n\r\n const results = await GetUomAction(input, props.context.actionContext);\r\n setEaPrices(results);\r\n setPriceGet(true);\r\n\r\n const productInput: IUomProductInventoryInput[] = myproducts.map(pr => {\r\n return {\r\n productId: pr.RecordId,\r\n unitOfMeasure: pr.DefaultUnitOfMeasure || ''\r\n };\r\n });\r\n\r\n const inventoryInput = new GetInventoryUomInput(\r\n productInput,\r\n results.map(p => {\r\n return { productId: p.ProductId!, factor: p.Factor || 0 };\r\n })\r\n );\r\n const inventResults = await GetInventoryUomAction(inventoryInput, props.context.actionContext);\r\n setAvailabilities(inventResults.productInventoryInformation);\r\n }\r\n };\r\n\r\n const toggle = () => {\r\n setIsExpanded(!isExpanded);\r\n };\r\n\r\n const _handleCartLineUpdate = (pls: { product: SimpleProduct; quantity: number }[]) => {\r\n const _cartLines = [...productLines];\r\n pls.map(productLine => {\r\n const idx = _cartLines.findIndex(\r\n c =>\r\n c.product.ItemId === productLine.product.ItemId &&\r\n c.product.DefaultUnitOfMeasure === productLine.product.DefaultUnitOfMeasure\r\n );\r\n if (idx > -1) {\r\n _cartLines[idx] = productLine;\r\n } else {\r\n _cartLines.push(productLine);\r\n }\r\n });\r\n setProductLines(_cartLines);\r\n };\r\n\r\n const handleAddToCart = () => {\r\n const cartItems = productLines.filter(p => p.quantity > 0);\r\n const cartState = cart.result;\r\n if (cartState && cartItems.length > 0) {\r\n void cartState\r\n .addProductsToCart(\r\n cartItems.map(ci => {\r\n return {\r\n product: ci.product,\r\n count: ci.quantity\r\n };\r\n })\r\n )\r\n .then(() => {\r\n setProductLines([]);\r\n });\r\n }\r\n };\r\n\r\n const renderAddToCart = () => {\r\n if (productLines.filter(pl => pl.quantity > 0).length === 0) {\r\n return null;\r\n }\r\n return (\r\n <div className={'list-view__add-to-cart'}>\r\n <button type={'button'} onClick={handleAddToCart} className={'list-view__add-to-cart-btn msc-button'}>\r\n {props.resources.addToCartLabel}\r\n </button>\r\n </div>\r\n );\r\n };\r\n\r\n const setModalProps = (product: SimpleProduct, price: ProductPrice): IPopupProps => {\r\n return {\r\n modalOpen: modalOpen,\r\n context: props.context,\r\n className: 'list-view__modal',\r\n gridSettings,\r\n imageSettings,\r\n priceComponent: props.component,\r\n id: '1',\r\n productQuantity: 1,\r\n navigationUrl: getUrlSync('cart', actionContext),\r\n setModalOpen: value => setModalOpen(value),\r\n typeName: 'Add To Cart',\r\n data: { product, price },\r\n dialogStrings: {\r\n goToCartText: goToCartText,\r\n currentPriceText: '',\r\n continueShoppingText: continueShoppingText,\r\n freePriceText: '',\r\n headerItemOneText: addToCartModalHeading,\r\n headerItemFormatText: '',\r\n originalPriceText: '',\r\n headerMessageText: ''\r\n }\r\n };\r\n };\r\n\r\n const wrapperRefiner = React.useRef(null);\r\n useOutsideClick(wrapperRefiner, toggle);\r\n const isRecoSearchPage = props.context.actionContext.requestContext.query?.recommendation;\r\n\r\n if (isMobile) {\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {renderCategoryHierarchy(categoryHierarchy)}\r\n {renderTitle(TitleViewProps)}\r\n {renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n {choiceSummary}\r\n <Node className='msc-sort-filter-wrapper'>{modalToggle}</Node>\r\n {createSearchResultModal(searchResultModal, refineMenu, sortByOptions, isRecoSearchPage)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n {errorMessage}\r\n {props.config.enableProdutDescription\r\n ? renderProducts(props, handleAddToCart, EaPrices, Availabilities, _handleCartLineUpdate, productLines)\r\n : renderProductCards(props)}\r\n {pagination}\r\n {renderAddToCart()}\r\n </Module>\r\n );\r\n }\r\n return (\r\n <Module {...SearchResultContainer}>\r\n {modalOpen && addedProduct && productPricing ? <Popup {...setModalProps(addedProduct, productPricing)} /> : null}\r\n {similarLookProduct ? null : (\r\n <Node {...CategoryNavContainer}>\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {TitleViewProps && renderTitle(TitleViewProps)}\r\n {TitleViewProps && renderTitleCount(TitleViewProps)}\r\n </Node>\r\n )}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...RefineAndProductSectionContainer}>\r\n <Node ref={wrapperRefiner} className='ms-refiner-heading'>\r\n <Node className='ms-refiner-heading_title'>\r\n <Button\r\n className={isExpanded ? 'ms-refine-filter__toggle_expanded' : 'ms-refine-filter__toggle_collapsed'}\r\n aria-label='Filter'\r\n onClick={toggle}\r\n aria-expanded={isExpanded}\r\n tabIndex={0}\r\n >\r\n {resources.filterText}\r\n </Button>\r\n <div className='ms-search-result-wrapper-title-choice-summary'>{choiceSummary}</div>\r\n <div className='ms-search-result-wrapper-sort-by-category'>\r\n {sortByOptions && !isRecoSearchPage && renderSort(sortByOptions)}\r\n </div>\r\n </Node>\r\n {refineMenu && isExpanded && renderRefiner(refineMenu)}\r\n <Node className='ms-refine__footer'>\r\n {refineMenu && isExpanded && renderRefinerFooter(refineMenu, toggle, resources)}\r\n </Node>\r\n </Node>\r\n\r\n <Node {...ProductSectionContainer}>\r\n {errorMessage}\r\n {PriceGet\r\n ? props.config.enableProdutDescription\r\n ? renderProducts(props, handleAddToCart, EaPrices, Availabilities, _handleCartLineUpdate, productLines)\r\n : renderProductCards(props)\r\n : renderProducts(props, handleAddToCart, EaPrices, Availabilities, _handleCartLineUpdate, productLines)}\r\n {pagination}\r\n </Node>\r\n </Node>\r\n {renderAddToCart()}\r\n </Module>\r\n );\r\n};\r\n\r\n/**\r\n * Render Search result Modal.\r\n * @param modalProps - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createSearchResultModal = (\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(modalProps, refineMenu, sortByDropDown, isRecoSearchPage),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\n/**\r\n * Render Refiner Mobile.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerMobile = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Search result Body.\r\n * @param props - The Search Result Modal view props.\r\n * @param refineMenu - The Refine Menu view props.\r\n * @param sortByDropDown - The Sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst createModalBody = (\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isRecoSearchPage?: string\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(props.modalBody, {}, renderSort(sortByDropDown, isRecoSearchPage), renderRefinerMobile(refineMenu));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner.\r\n * @param props - The Refine Menu view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefiner = (props: IRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n <Node {...RefinerSectionContainer}>\r\n <Node {...RefineMenuContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Refiner Footer.\r\n * @param props - The Refine Menu view props.\r\n * @param handler - The Refine menu toggle function.\r\n * @param resources - Resources to get the done text and aria label.\r\n * @returns The JSX Element.\r\n */\r\nconst renderRefinerFooter = (\r\n props: IRefineMenuViewProps,\r\n handler: MouseEventHandler,\r\n resources: IEveSearchResultContainerResources\r\n): JSX.Element | null => {\r\n const { refiners } = props;\r\n if (refiners) {\r\n return (\r\n <Node className='ms-refine__footer__done'>\r\n <Node tag='button' className='ms-refine-filter-done' aria-label={resources.doneAriaLabel} tabIndex={0} onClick={handler}>\r\n {resources.doneText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render sort by drop down.\r\n * @param props - The sort by view props.\r\n * @param isRecoSearchPage - The recomandation search page flag.\r\n * @returns The JSX Element.\r\n */\r\nconst renderSort = (props: ISortByViewProps, isRecoSearchPage?: string): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown && !isRecoSearchPage) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Render Title.\r\n * @param props - The title view props.\r\n * @returns The JSX Element.\r\n */\r\nconst renderTitle = (props: ITitleViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n <Node tag='h1' className=''>\r\n {title.titlePrefix}\r\n {title.titleText}\r\n </Node>\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const getProductPrice = (pricing: ProductPrice[] | undefined, productRecId: number): ProductPrice | undefined => {\r\n// if (!pricing) {\r\n// return undefined;\r\n// }\r\n// return pricing.find(pr => pr.ProductId === productRecId);\r\n// };\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\nimport { listPageType } from './actions/base-collection-action';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n\r\n @observable public activeProducts: ProductSearchResult[] = [];\r\n\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalProductCount: number | undefined;\r\n\r\n @observable public pageSize: number = 10;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise<ListPageState> {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction<ListPageState>({\r\n action: <IAction<ListPageState>>listPageStateAction,\r\n input: createListPageInput\r\n});\r\n","import { IActionContext } from '@msdyn365-commerce/core-internal';\r\n\r\n/**\r\n * Gets Catalog ID from the action context object\r\n * @param context\r\n * @constructor\r\n */\r\nexport const GetCatalogIdFromContext = (context: IActionContext): number => {\r\n if (!context.requestContext.user) {\r\n return 0;\r\n }\r\n let catalogId =\r\n (context.requestContext.query && context.requestContext.query['catalogid'] && +context.requestContext.query['catalogid']) || 0;\r\n if (catalogId === 0) {\r\n catalogId = (context.requestContext.user.catalogId && +context.requestContext.user.catalogId) || 0;\r\n }\r\n\r\n return catalogId;\r\n};\r\n","import { CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport enum CommercePropertyValueEnum {\r\n string = 'StringValue',\r\n decimal = 'DecimalValue',\r\n boolean = 'BooleanValue'\r\n}\r\n\r\nexport const getExtensionPropertyValueByKey = (\r\n properties: CommerceProperty[] | undefined,\r\n key: string,\r\n valueType: CommercePropertyValueEnum\r\n) => {\r\n const property = properties?.find(p => p.Key === key)?.Value;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n const val = property ? property[valueType] : null;\r\n return val;\r\n};\r\n","export const normalizeName = (name: string) => name.replace(/ /, '').toLowerCase();\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['eve-search-result-container'] = {\n c: () => require('partner/modules/eve-search-result-container/eve-search-result-container.tsx'),\n $type: 'containerModule',\n da: [{name:'cart', path:'@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action', runOn: 0},{name:'category', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category', runOn: 0},{name:'categoryHierarchy', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy', runOn: 0},{name:'featureProduct', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'listPageState', path:'modules/eve-search-result-container/list-page-state', runOn: 0},{name:'products', path:'modules/eve-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/eve-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/eve-search-result-container/actions/get-mapped-search-configuration', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'eve-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/eve-search-result-container'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action';\n let dataAction = require('@msdyn365-commerce/global-state/dist/lib/data-actions/cart-state-data-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/eve-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/eve-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/eve-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/eve-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/eve-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/eve-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/eve-search-result-container/list-page-state';\n let dataAction = require('partner/modules/eve-search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|eve-search-result-container|eve-search-result-container'] = {\n c: () => require('partner/modules/eve-search-result-container/eve-search-result-container.view.tsx'),\n cn: '__local__-__local__-eve-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["GetInventoryUomInput","constructor","products","multiUomProducts","getCacheKey","getCacheObjectType","dataCacheType","this","getAvailability","async","productIds","quantityUnitTypeValue","uom","ctx","length","availabilities","getEstimatedAvailabilityAsync","callerContext","ProductIds","DefaultWarehouseOnly","QuantityUnitTypeValue","availabilities2","mapAggregatedProductInventoryInformation","forEach","a","ProductAvailableQuantity","UnitOfMeasure","Msdyn365","action","input","multiUomProductIds","map","p","productId","csProducts","filter","unitOfMeasure","toUpperCase","pr","eaProducts","includes","csAvailabilities","eaAvailabilities","allAvailabilities","push","productInventoryInformation","id","args","GetUomInput","itemIds","catalogId","reqMap","i","ProductItemId","join","postEveUomRequestAsync","BaseCollectionInput","pageType","apiSettings","queryResultSettings","refiners","category","searchText","includeAttributes","isUpdateRefinerPanel","locale","_objectSpread","Paging","toJS","Sorting","buildCacheKey","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","createBaseCollectionInput","inputClassConstuctor","requestContext","urlTokens","query","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","config","undefined","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","recommendation","stringify","ProductId","Recommendation","Error","InventoryInStockRefinerValueInput","inventoryProductAttributeRecordId","arguments","super","createObservableDataAction","context","_refiners$find","getProductRefinerHierarchy","Context","ChannelId","channelId","CatalogId","find","RecordId","GetFullProductsByCollectionInput","ProductListInventoryFilteringOptions","returnProducts","productSearchResults","metadataCount","channelInventoryConfiguration","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","app","inventoryLevel","InventoryLevels","threshold","enableStockCheck","count","inventoryConfiguration","getInventoryConfigurationAsync","ArrayExtensions","hasElements","AttributeValues","element","InventoryProductAttributeRecordId","inventoryRanges","TextValue","InventoryOutOfStockAttributeValueText","channelInventoryConfigurationId","inventoryAwareSortableAttributeId","ProductAvailabilitySortableAttributeRecordId","actionDataAction","_context$requestConte","_context$requestConte2","_context$requestConte3","_context$requestConte4","_context$requestConte5","promise","searchProductId","searchCriteriaInput","Refinement","IncludeAttributes","SkipVariantExpansion","productListInventoryDisplay","HideOOS","refinerValue","_inventoryRefiner$Val","refinerInput","inventoryRefiner","getInventoryRefinersAction","Values","value","getInventoryInStockRefinerValueAsync","some","SortOOS","_input$queryResultSet","_input$queryResultSet2","sortColumnName","column","ColumnName","IsDescending","CategoryIds","searchByCriteriaAsync","SearchCondition","searchObject","Number","isNaN","RecommendationListId","Ids","metadata","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","getMappedSearchConfiguration","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","key","telemetry","warning","Boolean","createInput","getMappedSearchConfigurationDataAction","searchCriteria","getProductSearchRefinersAsync","productRefiners","trace","result","productRefiner","DefaultValues","RefinersByCollectionInput","defaultCategoryIdValue","defaultProductIdValue","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","refinerKey","index","_unused","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","MsDyn365","isBrowser","URL","window","location","url","requestUrl","ProductRefinerValueDataTypeValue","ProductRefinerTypeValue","ProductRefinerSource","isRangeType","dataTypeValue","AttributeDataType","Currency","getRenderValue","facetName","toLowerCase","parsedVal","parseInt","e","console","error","findMatchingRefinementCriterion","productRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerSourceValue","DataTypeValue","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","rangeStart","rangeEnd","Text","TrueFalse","parentProductRefinerHierarchy","RefinerTypeValue","RefinerType","SingleSelect","child","matchingIndex","findIndex","criterion","splice","ChoiceSummary","React","props","closeButtonGlyph","_onClick","preventDefault","stopPropagation","target","currentTarget","clearAll","getAttribute","selectedRefiner","_getSelectedRefinerChoice","onChoiceClicked","itemClicked","choiceClicked","nextItemToFocus","nextSibling","payLoad","getPayloadObject","telemetryContent","_this$props$context","selectedChoices","refinerHierarchy","choice","parent","hierarchy","_getKeyForRefinerValue","keyName","_getKeyNameForRefiner","render","clearAllText","label","classNames","choiceAriaLabel","closeAriaLabel","items","selectedRefinersMap","contentAction","etext","clearAllAttributes","getTelemetryAttributes","className","classnames","item","attribute","Object","assign","urlBuilder","onClick","role","LeftValueBoundLocalizedString","choiceFormat","choiceRangeValueFormat","refinerValues","overallFormat","rangeFormat","refinerValueName","refinerName","KeyName","replace","_formatPrice","UnitText","filterValue","r","amount","currency","cultureFormatter","formatCurrency","selected","__decorate","computed","observer","ErrorMessage","_ref","text","FeatureSearchResultItem","product","imageSettings","resources","productName","Name","productRecordId","productUrl","getProductPageUrlSync","actionContext","fallbackImage","getFallbackImageUrl","ItemId","heading","featureSimilarDescriptionTitle","featureSimilarLooksTitle","onTelemetryClick","gridSettings","imageUrl","altText","img","src","imageProps","fallBackSrc","Image","loadFailureBehavior","renderProductPlacementImage","request","title","Link","ariaLabel","ModalToggle","innerRef","ref","modalNode","Modal","autoFocus","applicationNode","returnFocusRef","returnRef","isOpen","toggle","onModalToggle","zIndex","modalHeaderNode","ModalHeader","modalTitle","modalFooterNode","ModalFooter","Button","modalCloseButtonText","getInventoryLabel","inventoryAttribute","ProductSearchResultItems","moduleType","moduleId","allowBackNavigation","quickviewSlot","productComparisonButton","isPriceMinMaxEnabled","productsDimensionAvailabilities","priceResources","priceRangeSeparator","ProductComponent","freePriceText","priceFree","originalPriceText","currentPriceText","ratingAriaLabel","allowBack","typeName","data","quickViewButton","inventoryLabel","swatchItemAriaLabel","dimensionAvailabilities","dimensionAvailability","masterProductId","MasterProductId","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minPrice","maxPrice","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMinPrice","selectedMax","selectedMaxPrice","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","minValue","maxValue","labels","sliderKeyString","sliderThumbs","state","isChecked","validationErrorMin","validationErrorMax","touchedMin","touchedMax","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","setState","isDisabled","formAttrs","rangeNameFormat","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onChange","onFocus","onBlur","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","event","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","selectedMinValue","minTouched","onToggle","maxNum","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","current","focus","touched","validationError","validationErrorRange","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","document","getElementById","tooltip","RefineItem","anchorType","_productRefinerValue$","_this$props","productCountAriaLabel","singleProductCountAriaLabel","children","refineItemAriaLabel","refineItemsAriaLabel","attrs","_objectWithoutProperties","_excluded","isSingleSelect","itemTypeClassName","SourceValue","Rating","_renderRating","productText","productCount","Count","refineMenuItemAriaLabel","format","_getRefinerUrl","tabIndex","_renderSwatch","_this$props$parentPro","_this$props$parentPro2","_productRefinerValue$2","dimensionType","toLocaleLowerCase","hasColor","StringExtensions","isNullOrWhitespace","SwatchColorHexCode","hasImage","SwatchImageUrl","swatchItems","checkIfShouldDisplayAsSwatch","colorHexCode","SwatchComponent","list","isSelectionEnabled","isRefineItem","ratingUserCountAriaLabel","ratingSingleUserCountAriaLabel","_productRefinerValue$3","refinerRating","ratingRefiner","selectedRefinerValues","selectedRating","defaultChkProductCount","ratingComponentClass","productCountAriaLabelValue","isMobileView","RatingComponent","avgRating","ratingCount","hideCount","readOnly","moduleTypeName","RefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpanded","isExpandedOnInitialLoad","expanded","productRefinerHierarchy","hideRating","Collapse","timeout","_renderChildItems","_renderRange","_renderSingleMultiSelect","isMobile","refinerValuesList","listItems","selectedValue","_getRangeType","DisplayTemplateValue","DisplayTemplate","Range","SliderWithBars","onUpdateRefiners","prevState","Separator","separator","Title","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","_props$context$reques","sortByDropdownOptions","_pageType","_viewport","expandrefinerCount","defaultPageNumber","isListPageStateUpdated","_updateListPageState","listPageState","_this$props$context$r","_this$props$config$it","_this$props$config$it2","_this$props$context$r2","querySorting","currentPageNumber","sortingCritera","pageSize","activeProducts","totalProductCount","activeFilters","featureProduct","_getProductsDimensionsAvailabilities","_this$props$data$list","_this$props$data$list2","productsList","getDimensionAvailabilitiesForProductSearchResultAction","DimensionAvailabilitiesForProductSearchResultInput","_getActivePrice","_this$props$data$list3","_this$props$data$list4","getPriceForProductSearchResult","PriceForProductSearchResultInput","_getSearchResultModal","modal","modalHeader","modalFooter","modalBody","ModalBody","SearchResultModal","modalIsOpen","_modalToggleRef","_toggleModal","_getCollectionTitle","collectionTitle","getFriendlyName","NameTranslations","productCountNumber","productCountText","numberOfProducts","oneProduct","TitleContainer","telemetryPageName","titlePrefix","searchTextPrefix","titleText","titleCount","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","categoryLinkAriaLabel","Url","categoryHierarchySeparator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdownOptions","_getAllSortByOptions","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","selectedOption","onSelectOption","_updateSortByDropdown","_sortAndFilterContainerRef","_getPagination","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","paginationAriaLabel","qsp","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","_shouldHideFromRefiners","activeRefiners","_getexpandRefinerCount","expandedRefiners","RefineMenuContainer","RefinerSectionContainer","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","_this$props$data$prod","_this$props$data$prod2","_getChoiceSummary","_this$props$data$refi","_this$props$data$prod3","selectedRefiners","n","choiceSummaryLabel","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","_getProducts","_this$props$slots","_this$props$data$feat","_this$props$data$prod4","shouldAllowBackNavigation","breadCrumbType","breadcrumbType","shouldAllowBack","slots","quickview","isPriceMinMaxFeatureState","featureState","IsEnabled","notification","history","pushState","_getSortColumnFromSelectedOption","transaction","option","mappedConfiguration","_getSortCriteriaColumn","_this$props$data$list5","sortCriteria","queryColumns","mappedSearchConfiguration","mappedSearchConfig","validValues","activeSortColumn","activeMappedConfig","_this$props$data$list6","newRefinementCriteria","dropdownElementId","dropdownElement","selectedChoice","isClearAll","refinerCount","all","one","two","three","four","paginationPreviousText","paginationNextText","device","Type","_updateViewport","productPrices","pending","validationErrorNotNumber","validationErrorNotRange","getTelemetryObject","friendlyName","nameTranslations","_nameTranslation","nameTranslation","Language","_this$props$context$a2","addEventListener","reaction","_listPageState$active","_listPageState$sortin","_newListPageState$cur","_newListPageState$sor","_newListPageState$act","_this$props$context$r3","_this$props$context$r4","_this$props$context$r5","_this$props$context$a","newListPageState","Math","recordId","productResults","getCollectionProducts","enableAffiliationBasedPricing","user","isAuthenticated","_newListPageState$cur2","_newListPageState$sor2","_newListPageState$act2","_this$props$context$r6","_this$props$context$r7","getCollectionRefinersAction","dimensionsToDisplayOnProductCard","dimensionsInProductCard","dimensionsToDisplayAsSwatch","dimensionsAsSwatchType","DimensionTypes","none","componentWillUnmount","removeEventListener","_listPageState$result","_listPageState$result2","_this$props$context$r8","_this$props$data$list7","_this$props$data$list8","productCollection","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","searchResultModal","errorMessage","FeatureSearchContainer","similarLookProduct","renderView","_getViewport","variant","VariantType","Browser","Viewport","observable","DescriptionInterval","renderProductCards","Node","getQuantityForLine","productLines","found","pl","DefaultUnitOfMeasure","quantity","renderProductCardsDescription","cartFunction","isOddRow","EaPrices","inventoryAvailability","handleCartLineUpdate","isEnabledProductDescription","_props$data$products$","_props$data$featureSt","_props$data$cart","isAllowBack","classname","quickviewslot","cart","cartLines","CartLines","licenseAndTaxPayment","getExtensionPropertyValueByKey","ExtensionProperties","CommercePropertyValueEnum","boolean","invNodeCs","_item$ProductAvailabl","invNodeEa","_item$ProductAvailabl2","invString","StockLevelLabel","myEaPrice","_product$DefaultUnitO","_myEaPrice$Factor","_product$DefaultUnitO2","_myEaPrice$Factor2","useListView","isListView","EaPrice","licenseAndTaxPaymentErrorText","AddToCartListComponent","addToCart","addToCartButtonText","addToCartLabel","displayEaPrice","displayCsPrice","factor","Factor","eaAvailable","floor","AvailableQuantity","csAvailable","eaQty","csQty","renderProducts","Availabilities","_props$data$listPageS","productDescriptionInterval","productDescriptionIntervalRemainder0","productDescriptionIntervalRemainder9","Table","itemNoLabel","nameLabel","availabilityLabel","listPriceLabel","quantityLabel","renderTitleCount","renderCategoryHierarchy","configureStickyFilter","isStickyHeader","headerContainer","querySelector","headerHeight","offsetHeight","bannerHeights","headerElement","defaultContainer","refinerElement","documentElement","scrollTop","classList","add","setAttribute","clientHeight","remove","removeAttribute","createSearchResultModal","modalProps","isRecoSearchPage","createModalBody","renderSort","submenu","renderRefinerMobile","renderRefiner","renderRefinerFooter","handler","doneAriaLabel","doneText","renderTitle","_props$data$listPageS2","_props$context$action","goToCartText","continueShoppingText","addToCartModalHeading","setIsExpanded","useState","modalOpen","setModalOpen","addedProduct","setAddedProduct","productPricing","setProductPricing","setEaPrices","PriceGet","setPriceGet","setAvailabilities","setProductLines","useEffect","useStickyFilter","stickyFilterSetup","enableStickyHeader","getUomAndAvailabilities","_props$data$listPageS3","myproducts","productRecordIds","ProductRecordId","GetCatalogIdFromContext","results","GetUomAction","productInput","inventoryInput","inventResults","GetInventoryUomAction","_handleCartLineUpdate","pls","_cartLines","productLine","idx","c","handleAddToCart","cartItems","cartState","addProductsToCart","ci","renderAddToCart","type","wrapperRefiner","refinerRefernce","handleClickOutside","contains","useOutsideClick","Module","enableProdutDescription","Popup","price","priceComponent","component","productQuantity","navigationUrl","getUrlSync","dialogStrings","headerItemOneText","headerItemFormatText","headerMessageText","filterText","setModalProps","ListPageState","ListPageStateInput","listPageStateAction","createListPageInput","properties","valueType","_properties$find","property","Key","Value","normalizeName","name","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","require","$type","da","path","runOn","iNM","ns","pdp","md","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}