{"version":3,"file":"diContainer.07562dec278dfa175b69.bundle.js","mappings":"+wCAAO,MAAMA,EAAwB,qBACxBC,EAAY,QACZC,EAAiB,cACjBC,EAAiB,oBACjBC,EAAiB,oBACjBC,EAAmB,qBACnBC,EAAgB,SACtB,IAAWC,EAAX,CAAWA,IACdA,EAAA,QAAU,UACVA,EAAA,SAAW,WAFGA,GAAX,CAAWA,GAAA,IAIX,MAAMC,EAAoB,CAC7BC,cAAeN,EACfO,cAAeN,GAENO,EAAiB,gBACjBC,EAAuB,yCACvBC,EAAyB,4CACzBC,EAAwB,EACxBC,EAAoB,iBACpBC,EAAmB,gBACnBC,EAAoB,8BACpBC,EAAa,gBACbC,EAAqB,iBACrBC,EAA0B,sBAC1BC,EAAkC,8BAClCC,EAAuB,6BACvBC,EAA8B,mCAC9BC,EAA2B,wBAC3BC,EAAyB,2BACzBC,EAA8B,0BAC9BC,EAAqC,mBACrCC,EAA4B,gBAC5BC,EAAiC,oCACjCC,EAAyB,EACzBC,EAAuB,EACvBC,EAA6B,EAC7BC,EAAuB,UACvBC,EAAqB,qBACrBC,EAAuB,qBACvBC,EAAiC,6BACjCC,EAAiC,6BACjCC,EAAwC,0BAC9C,IAAKC,EAAL,CAAKA,IACRA,EAAA,KAAO,OACPA,EAAA,SAAW,WAFHA,GAAL,CAAKA,GAAA,IAKAC,EAAL,CAAKA,IACRA,EAAA,aAAe,gCACfA,EAAA,mBAAqB,qCACrBA,EAAA,kBAAoB,oCACpBA,EAAA,YAAc,+BACdA,EAAA,aAAe,uBACfA,EAAA,cAAgB,oCAChBA,EAAA,sBAAwB,yBACxBA,EAAA,sBAAwB,oBACxBA,EAAA,2BAA6B,sCAC7BA,EAAA,0BAA4B,qCAC5BA,EAAA,yBAA2B,qCAC3BA,EAAA,eAAiB,sBACjBA,EAAA,mBAAqB,wBAbbA,GAAL,CAAKA,GAAA,G,0RCzCL,MAAMC,EAAN,cAKS,KAAOC,WAAqB,EAExC,KAAOC,YAAeC,IAClBC,KAAKC,UAAYF,CAAI,EAGzB,KAAOG,MAASC,IACZH,KAAKG,GAAKA,GAAMC,KAAKC,SAASC,mBAAmBH,IAAK,CAC1D,CAEA,QAAWJ,GACP,MAAO,CAAC,CACZ,E,wHAZmB,EAAnB,cALSH,EAKU,yB,kFCZvB,MAEaW,EAAyB,CAClCC,EACAC,EAJ6B,KAM7B,MAAMC,EAAkBC,KAAKC,IAAI,GAAIH,GAErC,OAAOE,KAAKE,MAAML,EAASE,GAAmBA,CAAe,E,wDCJ1D,MAAMI,EAIT,WAAAC,CAAYC,GAOZ,KAAOC,QAAU,KACbjB,KAAKkB,4BAA4BC,UAAUnB,KAAKgB,cAAc,EAP9DhB,KAAKgB,cAAgBA,EACrBhB,KAAKkB,4BAA8BE,GAAYC,IAC3C,gCAER,ECZG,MACMC,EAAkB,+B,gMCKxB,MAAMC,EAIT,WAAAR,CAAYS,GAKZ,KAAOP,QAAU,KAAY,O,EAAA,K,EAAA,K,EAAA,YAEzB,MAAMQ,QAAiB,IAAAC,OAAM,EAAAC,eAAA,iBAAiC,CAC1DC,SAAU,CACNC,WAAY,CAAC7B,KAAKwB,cAI1BxB,KAAK8B,kBAAkBC,YAAYN,EACvC,E,yMAAA,EAbIzB,KAAKwB,UAAYA,EACjBxB,KAAK8B,kBAAoBV,GAAYC,IAAI,sBAC7C,EANmB,GAAnB,cADSE,EACU,iCACA,GAAnB,cAFSA,EAEU,yB,gMCqBhB,MAAMS,UAAoCpC,EAa7C,WAAAmB,CAAYe,EAAsCG,GAC9CC,QAbQ,KAAOC,qBAA+B,EAGtC,KAAQC,cFjCe,EEoCvB,KAAQC,WAAqB,EA2CzC,KAAOC,OAAgBC,IAAuD,O,EAAA,K,EAAA,K,EAAA,YAhFlF,MAiFQvC,KAAKH,WAAY,EAEjBG,KAAKwC,cAAgB,CACjBC,YAAaF,EAAMG,eAAiB,EACpCC,cAAepC,EAAuBgC,EAAMK,eAAiB,IAGjE5C,KAAK6C,YAAcN,EAAMO,SAAW,KAEpC,MAAM,cAAEV,EAAa,UAAEZ,GAAce,EAIrC,GAHAvC,KAAKoC,cAAgBA,EACrBpC,KAAKwB,UAAYA,GAEZe,EAAMO,QAAS,CAChB,MAAMC,EAAuB,IAAIxB,EAAqBvB,KAAKwB,iBACrDuB,EAAqB9B,SAC/B,CACAjB,KAAKiC,kBAAkBe,iBAAiBxB,GAExCxB,KAAKiD,wBAA0BV,EAAMW,oBACjC,SAAAlD,KAAKiD,8BAAL,IAA8BE,WAC9BnD,KAAKoD,cAAgBpD,KAAKiC,kBAAkBoB,kBAAkBrD,KAAKwB,YAGvExB,KAAKH,WAAY,EACjBG,KAAKqC,WAAY,CACrB,E,yMAAA,EAkBA,KAAOiB,eAAkBC,IACrBvD,KAAKmC,oBAAsBoB,EAEG,IAAIzC,EAAsByC,GAClCtC,SAAS,EAInC,KAAOuC,mBAAqB,MACxB,IAAAC,MAAK,EAAAC,OAAA,0BAAkC1D,KAAK2D,mBAAmB,EAInE,KAAOC,mBAAqB,MACxB,IAAAH,MAAK,EAAAC,OAAA,2BAAmC1D,KAAK2D,mBAAmB,EA0BpE,KAAOxC,UAAaoC,IAChBvD,KAAK6D,gBAAkB7D,KAAK6D,gBAAkB,CAAC,EAGnD,KAAQC,kBAAqBC,IAzKjC,QA0KQ,MAAM,iBAAEC,GAAqBhE,KAAKiD,yBAA2B,CAAC,EACxDgB,EAAkB,SAAAjE,KAAKoD,cAAL,IAAcc,QAClC,EAAGC,SAAQC,cAAeD,GAAUH,GAAoBI,EAASC,QAAUN,IAG/E,OAAO,eAAAE,OAAA,EAAAA,GC/K2BK,ED+KiB,MAAAL,OAAA,EAAAA,EAAiBI,OC/KlB1D,KAAK4D,MAAM5D,KAAK6D,SAAWF,WD+KtE,IAAuEF,SC/K7C,IAACE,CD+KoD,EAlItFtE,KAAK8B,kBAAoBA,EACzB9B,KAAKiC,kBAAoBA,CAC7B,CAGA,QAAWlC,GAlDf,QAmDQ,MAAO,CACHoC,oBAAqBnC,KAAKmC,oBAC1BsC,iBAAkBzE,KAAKyE,iBACvBnB,eAAgBtD,KAAKsD,eACrBE,mBAAoBxD,KAAKwD,mBACzBI,mBAAoB5D,KAAK4D,mBACzBC,gBAAiB,SAAA7D,KAAKmE,aAAL,IAAa1B,YAC9BE,cAAe,SAAA3C,KAAKmE,aAAL,IAAaxB,cAC5BL,OAAQtC,KAAKqC,UACbe,QAASpD,KAAKoD,QACdsB,0BAA2B1E,KAAK0E,0BAExC,CAGA,UAAWP,GACP,OACInE,KAAKiC,kBAAkB0C,eAAe3E,KAAKwB,YAC3CxB,KAAK4E,qBACL5E,KAAKwC,aAEb,CAGA,WAAWM,GACP,OAAO9C,KAAK6C,aAAe7C,KAAK8B,kBAAkB+C,eAAe7E,KAAKwB,UAC1E,CAiCA,oBAAYiD,GACR,MAAMK,OAAa,EAEnB,GAAI9E,KAAKmE,QAAU,EAAArG,kBAAkBkC,KAAKmE,OAAQ,CAC9C,MAAM,cAAExB,GAAkB3C,KAAKmE,OAE/B,OEnHoB,eFmHbxB,EACDmC,EACiB,IAAhBnC,EAAuB3C,KAAKoC,aACvC,CAEA,OAAO0C,CACX,CAqBA,uBAAYF,GACR,OAAK5E,KAAK8C,QAIH,CACHL,YAAazC,KAAK8C,QAAQM,QAAQS,gBAClClB,cAAe3C,KAAK8C,QAAQM,QAAQT,eAL7B,IAOf,CAEQ,gBAAAgB,GACJ,MAAM,UAAEnC,EAAS,YAAEuD,GAAgB/E,KAAK8C,QAExC,MAAO,CACH3C,GAAIqB,EACJwD,KAAMD,EACNE,eAAgB3D,EAExB,CAiBA,6BAAWoD,GAnLf,QAoLQ,MAAM,sBAAEQ,GAA0BlF,KAAKiD,yBAA2B,CAAC,EAEnE,MAAO,CACHkC,gBAAiB,SAAAnF,KAAK8D,kBAAkB,MAAAoB,OAAA,EAAAA,EAAuBE,eAA9C,EAA+D,GAChFC,eAAgB,SAAArF,KAAK8D,kBAAkB,MAAAoB,OAAA,EAAAA,EAAuBI,gBAA9C,EAAgE,GAExF,EA3JmB,GAAnB,cADStD,EACU,mCACA,GAAnB,cAFSA,EAEU,iCACA,GAAnB,cAHSA,EAGU,yBACC,GAApB,cAJSA,EAIW,6BACD,GAAnB,cALSA,EAKU,+BACC,GAApB,cANSA,EAMW,iCACA,GAApB,cAPSA,EAOW,yBACA,GAApB,cARSA,EAQW,2BAEA,GAApB,cAVSA,EAUW,uBACA,GAApB,cAXSA,EAWW,uCAST,GADX,YAnBSA,EAoBE,oBAgBA,GADX,YAnCSA,EAoCE,sBASA,GADX,YA5CSA,EA6CE,uBAKJ,GADP,UAjDSA,EAkDF,sBA8BK,GADZ,YA/ESA,EAgFG,gCAeL,GADP,UA9FSA,EA+FF,8BAQA,GADP,UAtGSA,EAuGF,kCAKA,GADP,UA3GSA,EA4GF,kCAKK,GADZ,YAhHSA,EAiHG,mCAsBL,GADP,UAtISA,EAuIF,yBAcI,GADX,YApJSA,EAqJE,yCGnLR,MACM,EAAkB,kB,6ZCWxB,MAAMuD,UAAqC3F,EAA3C,kCAsBH,KAAQ4F,+BAAkCC,IACtC,MAAM,GAAEtF,EAAE,KAAE6E,EAAI,eAAEC,GAAmBjF,KAAK0F,iBACpCC,EAA2BF,EAAMG,OAEjCC,EAA2B,CAC7B1F,KACA6E,OACAC,kBAGEa,EAAWC,OAAOC,KAAKC,EAAA,2BAAiDC,MACzEC,KACYR,EAAYS,QACjBH,EAAA,0BACIE,MAKZL,GACA9F,KAAKqG,wBACDJ,EAAA,0BACIH,IAEN,CAAEH,cAAaE,WACrB,EAGJ,KAAQQ,wBAKJ,CACA,CAACJ,EAAA,wCAAgEK,KAC7D,IAAA7C,MAAK,EAAAC,OAAA,qBAA6B4C,EAAOT,QAAQ,EAErD,CAACI,EAAA,8CAAsEK,KACnE,IAAA7C,MAAK,EAAAC,OAAA,4BAAoC4C,EAAOT,QAAQ,EAE5D,CAACI,EAAA,6CAAqEK,KAClE,IAAA7C,MAAK,EAAAC,OAAA,2BAAmC4C,EAAOT,QAAQ,EAE3D,CAACI,EAAA,uCAA+DK,KAC5D,IAAA7C,MAAK,EAAAC,OAAA,4BAAoC4C,EAAOT,QAAQ,EAE5D,CAACI,EAAA,wCAAgEK,IAC7DtG,KAAKuG,sBAAsBD,EAAOX,YAAY,EAElD,CAACM,EAAA,yCAAiEK,IAC9DtG,KAAKwG,oBAAoBF,EAAOX,YAAY,EAEhD,CAACM,EAAA,iDAAyEK,IACtEtG,KAAKyG,yBAAyBH,EAAOT,QAAQ,EAEjD,CAACI,EAAA,iDAAyEK,IACtEtG,KAAK0G,yBAAyBJ,EAAOX,YAAY,EAErD,CAACM,EAAA,sDAA8EK,KAC3E,IAAA7C,MAAK,EAAAC,OAAA,mCAA2C4C,EAAOT,QAAQ,EAEnE,CAACI,EAAA,qDAA6EK,KAC1E,IAAA7C,MAAK,EAAAC,OAAA,kCAA0C4C,EAAOT,QAAQ,EAElE,CAACI,EAAA,oDAA4EK,KACzE,IAAA7C,MAAK,EAAAC,OAAA,iCAAyC4C,EAAOT,QAAQ,EAEjE,CAACI,EAAA,0CAAkEK,IAC/DtG,KAAK2G,oBAAoBL,EAAOX,YAAY,EAEhD,CAACM,EAAA,8CAAsEK,IACnEtG,KAAK4G,wBAAwBN,EAAOX,YAAY,GAIxD,KAAQc,yBAA4BZ,IAC3BgB,SAASC,eAAeb,EAAA,0BACzB,IAAAxC,MAAK,EAAAC,OAAA,uBAA+BmC,EACxC,EAGJ,KAAQkB,gCAAmCtB,IACvC,MAAME,EAA2BF,EAAMG,QACjC,GAAEzF,EAAE,KAAE6E,EAAI,eAAEC,GAAmBjF,KAAK0F,kBACpC,WAAErH,EAAU,0BAAEU,GAA8BkH,EAC5CJ,EAA2B,CAC7B1F,KACA6E,OACAC,iBACA+B,cAAkCrB,EAAasB,OAEnD,OAAQtB,GAAeA,EAAYxF,IAC/B,KAAK9B,GACD,IAAAoF,MAAK,EAAAC,OAAA,wBAAgCmC,GACrC,MAEJ,KAAK9G,GACD,IAAA0E,MAAK,EAAAC,OAAA,gCAAwCmC,GAIrD,EAGJ,KAAQqB,+BAAkCzB,IACtC,MAAME,EAA2BF,EAAMG,QACjC,qBAAEnH,EAAoB,4BAAEI,EAA2B,UAAEzB,EAAS,eAAEC,GAClE4I,EACEkB,EAAa1B,EAAM2B,OAAS/J,GAAkBoI,EAAMU,MAAQ/I,EAE5DuI,EAAYS,QAAQ,IAAI3H,MAA2B0I,EACrDnH,KAAKwG,oBAAoBb,GAChBA,EAAYS,QAAQ,IAAIvH,MAAkCsI,GACnEnH,KAAK0G,yBAAyBf,EAClC,CACJ,CArIO,uBAAA0B,CAAwB3B,GAC3B1F,KAAK0F,iBAAmBA,EACxB1F,KAAKsH,wBACDT,SAASU,cACL,IAAItB,EAAA,qDAGPjG,KAAKsH,0BAGVtH,KAAKsH,wBAAwBE,iBAAiB,QAASxH,KAAKwF,gCAC5DxF,KAAKsH,wBAAwBE,iBACzB,SACAxH,KAAK+G,iCAET/G,KAAKsH,wBAAwBE,iBAAiB,QAASxH,KAAKkH,gCAChE,CAuHQ,qBAAAX,CAAsBZ,GAC1B,MAAM,mBAAErH,EAAkB,wBAAEC,GAA4B0H,EAClDwB,EAAoB9B,GAAeA,EAAYS,QAAQ,IAAI9H,KAC3DoJ,EAAc/B,GAAeA,EAAYS,QAAQ,IAAI7H,MACrD,GAAE4B,EAAE,KAAE6E,EAAI,eAAEC,GAAmBjF,KAAK0F,iBAE1C,GAAIgC,GAAeA,EAAYC,aAAa,iBAGxC,YAFAD,EAAYE,gBAAgB,iBAIhCF,GAAeA,EAAYG,aAAa,gBAAiB,IAEzD,MAAMC,EAAgB9H,KAAK+H,sBAAsBN,GAC3CO,EAAwBhI,KAAKiI,yBAAyBR,GAE5D,GAAIK,EAAczD,OAAS,EAAG,CAC1B,MAAMwB,EAA2B,CAC7B1F,KACA6E,OACAC,iBACA+B,cAAe,GAAGgB,OAA2BF,EAAcI,KAAK,SAEpE,IAAAzE,MAAK,EAAAC,OAAA,uBAA+BmC,EACxC,CACJ,CAEQ,wBAAAoC,CAAyBR,GAC7B,MAAMU,EACFV,GACAA,EAAkBF,cACd,IAAItB,EAAA,mCAGZ,OAAOkC,GAAqBA,EAAkBC,WAClD,CAEQ,qBAAAL,CAAsBN,GAC1B,MAAMY,EACFZ,GACAA,EAAkBa,iBAAiB,IAAIrC,EAAA,2BACrC6B,EAA0B,GAWhC,OAVAO,GACIA,EAAiBE,SAASC,IACtB,GAAIA,EAAWb,aAAa,iBAAkB,CAC1C,MAAMc,EAAwBD,GAAcA,EAAWjB,cAAc,QAC/DmB,EACFD,GAAyBA,EAAsBL,YACnDM,GAAoBZ,EAAca,KAAKD,EAC3C,KAGDZ,CACX,CAEQ,mBAAAtB,CAAoBb,GACxB,MAAMiD,EACFjD,GAAeA,EAAYS,QAAQ,IAAIH,EAAA,wBACrC4C,EAAYD,GAAgBA,EAAarB,cAAc,SACvDuB,EAAcD,GAAaA,EAAU5B,OACrC,GAAE9G,EAAE,KAAE6E,EAAI,eAAEC,GAAmBjF,KAAK0F,iBAC1C,IAAKoD,EACD,OAEJ,MAAMjD,EAA2B,CAC7B1F,KACA6E,OACAC,iBACA+B,cAAe8B,IAEnB,IAAArF,MAAK,EAAAC,OAAA,uBAA+BmC,EACxC,CAEQ,wBAAAa,CAAyBf,GAC7B,MAAMiD,EACFjD,GACAA,EAAYS,QAAQ,IAAIH,EAAA,+BACtB4C,EAAYD,GAAgBA,EAAarB,cAAc,SACvDuB,EAAcD,GAAaA,EAAU5B,OACrC,GAAE9G,EAAE,KAAE6E,EAAI,eAAEC,GAAmBjF,KAAK0F,iBAC1C,IAAKoD,EACD,OAEJ,MAAMjD,EAA2B,CAC7B1F,KACA6E,OACAC,iBACA+B,cAAe8B,IAEnB,IAAArF,MAAK,EAAAC,OAAA,8BAAsCmC,EAC/C,CAEQ,mBAAAc,CAAoBhB,GAGxB,IAAIqB,EAEJ,MAJyBrB,EAAYS,QAAQH,EAAA,uCAIxB,CACjB,MAAM8C,EAAkBlC,SAASmC,uBAC7B/C,EAAA,sBAEEgD,EAAuBC,MAAMC,KAAKJ,GAElCK,EAAsBzD,EAAYS,QACpCH,EAAA,0CAGJ,GAAImD,EAAqB,CACrB,MAAMC,EAAcJ,EAAqBK,QAAQF,GAGjDpC,EAAgB,GAFDf,EAAA,sBAA8CoD,SAI7D,MAAMxD,EAA2B,OAC1B7F,KAAK0F,kBADqB,CAE7BsB,mBAGJ,IAAAvD,MAAK,EAAAC,OAAA,uBAA+BmC,EACxC,CACJ,CACJ,CAEQ,4BAAA0D,CACJC,GAEA,MAAM3D,EAA2B,OAC1B7F,KAAK0F,kBADqB,CAE7BsB,cAAewC,KAGnB,IAAA/F,MAAK,EAAAC,OAAA,2BAAmCmC,EAC5C,CAEQ,uBAAAe,CAAwBjB,GAC5B,MAAM8D,EAAe9D,EAAY+D,UAAUC,SACvC1D,EAAA,gCAGE2D,EAAejE,EAAY+D,UAAUC,SACvC1D,EAAA,gCAGAwD,EACAzJ,KAAKuJ,6BAA6BtD,EAAA,6BAC3B2D,GACP5J,KAAKuJ,6BACDtD,EAAA,gCAGZ,CAEO,0BAAA4D,GACE7J,KAAKsH,0BAGVtH,KAAKsH,wBAAwBwC,oBACzB,QACA9J,KAAKwF,gCAETxF,KAAKsH,wBAAwBwC,oBACzB,SACA9J,KAAK+G,iCAET/G,KAAKsH,wBAAwBwC,oBACzB,QACA9J,KAAKkH,gCAEb,E,ifCpTG,MAAM6C,UAAqCxE,EAO9C,WAAAxE,CAAYiJ,EAA0BlI,GAClCI,QAPQ,KAAOrC,WAAqB,EAI5B,KAAOoK,UAAoB,QAqCvC,KAAOC,kBAAqBC,IACxBnK,KAAK8B,kBAAkBoI,kBAAkBC,EAAe,EAI5D,KAAOC,oBAAuBC,IAC1BrK,KAAK8B,kBAAkBsI,oBAAoBC,EAAiB,EAIhE,KAAOC,WAAc7E,IACjB,MAAMG,EAAsBH,EAAMG,OAClC5F,KAAKiK,UAAYrE,EAAO2E,QAAQC,KAAO,IAI3C,KAAOC,YAAeC,IAClB1K,KAAKH,WAAY,EAEjBG,KAAKsC,SAASqI,MAAK,KAxE3B,MAyEY3K,KAAK4K,wBAAwBF,GAC7B1K,KAAKqH,wBAAwB,CACzBlH,GAAIH,KAAKwB,UACTwD,MAAM,SAAAhF,KAAK8C,cAAL,IAAciC,cAAe,GACnCE,eAAgB3D,GAClB,GACJ,EAGN,KAAOuJ,4BAA8B,KACjC7K,KAAK6J,4BAA4B,EAIrC,KAAOe,wBAA2BF,IAC9BA,EAAmBI,KAAO,kBAC1BJ,EAAmBK,IAAM,uBACzBL,EAAmBM,OAAQ,EAC3BN,EAAmBO,OAAQ,EAC3BP,EAAmBQ,OAAS,KACxBlL,KAAKmL,iBAAiB,EAE1BtE,SAASuE,KAAKC,QAAQX,GAEtB1K,KAAK0K,mBAAqBA,CAAkB,EAGhD,KAAOY,YAAc,KACjB,MAAMC,EAAW1E,SAAS2E,cAAc,UACnCxL,KAAK0K,oBACN1K,KAAKyK,YAAYc,EACrB,EAGJ,KAAOjJ,OAAS,KAAY,O,EAAA,K,EAAA,K,EAAA,YACxB,GAAItC,KAAKwB,UAAW,CAChB,MAAMuB,EAAuB,IAAIxB,EAAqBvB,KAAKwB,iBACrDuB,EAAqB9B,SAC/B,CAEA,OAAOwK,QAAQC,SACnB,E,yMAAA,EAEA,KAAOP,gBAAkB,MACrB,IAAA1H,MAAK,EAAAC,OAAA,uBAA+B1D,KAAKwB,UAAU,EAjGnDxB,KAAK2L,OAAS3B,EAAY2B,OAC1B3L,KAAK8B,kBAAoBA,CAC7B,CAEO,UAAA8J,CAAWrJ,GACd,MAAM,OAAEoJ,GAAWpJ,EACnBvC,KAAK2L,OAAS,OAAK3L,KAAK2L,QAAWA,EACvC,CAGA,QAAI5L,GACA,MAAO,CACHF,UAAWG,KAAKH,UAChBoK,UAAWjK,KAAKiK,UAExB,CAGA,aAAWzI,GACP,OAAOxB,KAAK8B,kBAAkBN,WAAaxB,KAAK2L,OAAOnK,SAC3D,CAGA,WAAWsB,GACP,OAAO9C,KAAK8B,kBAAkB+C,eAAe7E,KAAKwB,UACtD,CAGA,wBAAWqK,GACP,OAAO7L,KAAK8C,SAAW9C,KAAK8C,QAAQM,SAAWpD,KAAK8C,QAAQM,QAAQS,eACxE,EAtCmB,GAAnB,cADSkG,EACU,yBACA,GAAnB,cAFSA,EAEU,sBACA,GAAnB,cAHSA,EAGU,iCACA,GAAnB,cAJSA,EAIU,kCACA,GAAnB,cALSA,EAKU,yBAcf,GADJ,YAlBSA,EAmBL,oBAQO,GADX,YA1BSA,EA2BE,yBAKA,GADX,YA/BSA,EAgCE,uBAKA,GADX,YApCSA,EAqCE,oCAKJ,GADP,UAzCSA,EA0CF,iCAKA,GADP,UA9CSA,EA+CF,mCAKA,GADP,UAnDSA,EAoDF,0BAMA,GADP,UAzDSA,EA0DF,2BAkBA,GADP,UA3ESA,EA4EF,uCClFJ,MAAM+B,EAAmB,CAACC,EAA2BnG,KACxDG,OAAOC,KAAK+F,GAAQxD,SAASpC,IACL,OAAhB4F,EAAO5F,SAAiC,IAAhB4F,EAAO5F,KAC/BP,EAAOO,GAAO4F,EAAO5F,GACzB,GACF,ECPC,MAAM6F,EAYT,aAAcC,CAAOlM,GACjB,MAAMmM,EAAgB,IAAIF,EACpBG,EAAc,CAChBnH,KAAMjF,EAAKiF,KACXoH,IAAKrM,EAAKqM,IACVC,UAAWtM,EAAKuM,SAChBC,YAAaxM,EAAKwM,YAClBC,cAAezM,EAAK0M,aACpBC,gBAAiB3M,EAAK4M,eACtBC,IAAK7M,EAAK6M,IACVC,WAAY9M,EAAK+M,UACjBC,MAAOhN,EAAKgN,OAIhB,OAFAjB,EAAiBK,EAAaD,GAEvBA,CACX,ECAG,MAAMc,EAYT,aAAcf,CAAOlM,GACjB,MAAMkN,EAAgB,IAAID,EACpBb,EAAc,CAChBe,QAASnN,EAAKoN,OACdC,YAAarN,EAAKsN,WAClBC,kBAAmBvN,EAAKwN,gBACxBC,OAAQzN,EAAKyN,OACbC,QAAS1N,EAAK2N,OACd5K,QAASkJ,EAAcC,OAAOlM,GAC9B4N,mBAAoB5N,EAAK6N,iBACzBC,WAAY9N,EAAK8N,WACjBC,UAAW/N,EAAKgO,SAChBC,UAAWjO,EAAKkO,UAIpB,OAFAnC,EAAiBK,EAAac,GAEvBA,CACX,E,6aCvCG,MAAMiB,WAAoC3I,EAO7C,WAAAxE,CAAYiJ,GACR9H,QAKJ,KAAOI,OAAgBC,IAAwC,O,EAAA,K,EAAA,K,EAAA,YAC3DvC,KAAKmO,kBAAoB5L,EAAMoJ,OAC/B,MAAM9F,EAAU,CACZ1F,GAAIH,KAAKmO,kBAAkBT,OAC3B1I,KAAMhF,KAAKmO,kBAAkBnJ,KAC7BC,eAAgB,GAEpBjF,KAAKoO,iBAAmB7L,EAAM6L,iBAC9BpO,KAAKqO,qBAAuB9L,EAAMoJ,OAAO2C,aACzCtO,KAAKuO,oBACLvO,KAAKqH,wBAAwBxB,IAC7B,IAAApC,MAAK,EAAAC,OAAA,sBAA8BmC,EACvC,E,yMAAA,EAsCA,KAAQ2I,qBAAuB,KAC3B,MAAMC,EAAyBzO,KAAKoO,iBAAiBM,QACrD,GAA+B,OAA3BD,EACA,OAEuC,IAAIE,iBAAiB3O,KAAK4O,uBAMpDC,QAAQJ,EALV,CACXK,WAAW,EACXC,SAAS,GAG2C,EAG5D,KAAQH,sBAAwB,CAC5BI,EACAC,KAEA,UAAWC,KAAYF,EACnB,GAAcE,EAAStJ,OAAQ2B,cAAc,IAAI,EAAAlI,sBAAuB,CACpEW,KAAKmP,uBACLF,EAAiBG,aACjB,KACJ,CACJ,EA9EApP,KAAKqP,QAAUrF,CACnB,CAiBQ,iBAAAuE,GACAvO,KAAKsP,eACLtP,KAAKuP,gBAITvP,KAAKwP,kBACT,CAEQ,gBAAAA,GACJ,MAAMC,EAAS5I,SAAS6I,qBAAqB,UAAU,GACjDhF,EAAqB7D,SAAS2E,cAAc,UAClDd,EAAmBI,KAAO,kBAC1BJ,EAAmBO,OAAQ,EAC3BP,EAAmBK,IAAM,EAAAhN,qBACzB2M,EAAmBQ,OAAS,KACxBlL,KAAKsP,gBAAiB,EACtBtP,KAAKuO,mBAAmB,EAG5BkB,EAAOE,YAAcF,EAAOE,WAAWC,aAAalF,EAAoB+E,EAC5E,CAEQ,aAAAF,GACJ,MAAMM,G,EAAgB,MACf7P,KAAKqP,QAAQ1D,OAAOmE,sB,EADL,CAElBjC,WAAY,EAAAlQ,mB,mBAEhB,MAAMoS,EAAsB/C,EAAcf,OAAO,SAC1C4D,GACA7P,KAAKmO,oBAEZ6B,IAAI,SAAUD,GACd/P,KAAKqO,sBAAwBrO,KAAKwO,sBACtC,CA8BQ,oBAAAW,GACJ,MAAMc,EAA0BpJ,SAASC,eAAe,EAAAzH,oBACxD,IAAK4Q,EACD,OAEJ,MAAMC,EAAerJ,SAAS2E,cAAc,OACtC2E,EAAiBtJ,SAAS2E,cAAc,KACxC4E,EAAqBvJ,SAAS2E,cAAc,KAC5C6E,EAAqBxJ,SAAS2E,cAAc,OAElD0E,EAAanF,IAAM/K,KAAKmO,kBAAkB7B,SAC1C4D,EAAaI,IAAMtQ,KAAKmO,kBAAkBnJ,KAC1CkL,EAAaxG,UAAY,8BAEzByG,EAAeI,UAAYvQ,KAAKmO,kBAAkBnJ,KAClDmL,EAAezG,UAAY,6BAE3B0G,EAAmBG,UAAYvQ,KAAKmO,kBAAkB5B,YACtD6D,EAAmB1G,UAAY,oCAE/B2G,EAAmB3G,UAAY,gCAC/B2G,EAAmBG,YAAYL,GAC/BE,EAAmBG,YAAYJ,GAE/BH,EAAwB5E,QAAQ6E,EAAcG,EAClD,CAEO,aAAAI,GACHzQ,KAAK6J,8BACL,IAAApG,MAAK,EAAAC,OAAA,sBAA8B,CAC/BvD,GAAIH,KAAKmO,kBAAkBT,OAC3B1I,KAAMhF,KAAKmO,kBAAkBnJ,MAAQ,GACrCC,eAAgB,mBAExB,E,wHAhHO,EADP,UAZSiJ,GAaF,sBC7BJ,MAAMwC,GAGT,WAAA3P,GAIA,KAAO4P,WAAoBtB,IAAsB,O,EAAA,K,EAAA,K,EAAA,YAC7C,MAAM1D,QAAe,IAAAjK,OAAM,EAAAC,eAAA,WAA2B0N,GAEtDrP,KAAK2L,OAAOiF,aAAajF,EAC7B,E,yMAAA,EAPI3L,KAAK2L,OAASvK,GAAYC,IAAI,WAClC,ECVG,IAAKwP,GAAL,CAAKA,IACRA,EAAA,OAAS,SACTA,EAAA,eAAiB,2BACjBA,EAAA,WAAa,cACbA,EAAA,QAAU,WACVA,EAAA,UAAY,aACZA,EAAA,aAAe,iBACfA,EAAA,SAAW,WACXA,EAAA,SAAW,YARHA,GAAL,CAAKA,IAAA,I,2NCkBL,MAAMC,GAAN,cAOH,KAAOjD,WAA0B,CAC7BjQ,cAAe,EAAAN,eACfyT,gBAAiB,EAAAvT,kBAGrB,KAAOwT,+BAAiC,EAAAtT,gBAAA,OAAgB,CAKxD,eAAcuT,CACVlR,EACA+P,EACA3F,EACA+G,EACA7G,GAEA,MAAM8G,EAAY,IAAIL,IAEhB,OACF3D,EAAM,OACNK,EAAM,gBACND,EAAe,WACfF,EAAU,OACVK,EAAM,iBACNE,EAAgB,0BAChBwD,EAAyB,UACzBtE,GACAgD,GAEE,UACFtO,EAAS,YACTuD,EAAW,WACXsM,EAAU,iBACVC,EAAgB,gBAChBC,EACAC,YAAY,MAAEzE,EAAK,cAAE0E,GAAe,KACpCC,EAAI,WACJF,GACAzR,EAEE4R,EAAU,GAAGC,OAAOC,SAASC,aAAajL,SAASgL,SAASE,WAC5DC,EAAWtE,GAAUlM,EAE3B2P,EAAUjE,QAAUC,EACpBgE,EAAU3D,OAASA,EACnB2D,EAAU7D,kBAAoBC,EAC9B4D,EAAU/D,YAAcC,EACxB8D,EAAU1D,QAAUuE,EACpBb,EAAUxD,mBAAqBwD,EAAUc,UACrCrE,EACAoE,EACA3H,GAEJ8G,EAAUe,6BAA+Bd,GAA6B,EAAA3T,cAGtE,MAAM0U,EAAUhB,EAAUiB,UAAUrS,EAAMmR,GAAemB,WA2BzD,OAzBAlB,EAAUrO,QAAU,CAChBkC,KAAMD,EACNqH,IAAKuF,EAAQW,OAAOjB,GACpBhF,UAAW8E,EAAUoB,gBAAgBf,GACrCjF,YAAa+E,EACb9E,cAAe+E,EAAgBpR,GAC/B0M,WAAYC,EACZC,MAAOA,GAAS0E,EAChBe,SAAUL,GAGVT,EAAKrN,OAAS,EACd8M,EAAUrO,QAAQ2P,SAAWtB,EAAUuB,gBAAgB3S,GAEvDoR,EAAUrO,QAAQ8J,IAAM4E,EAAW5E,IAGnCzC,IAAmB,EAAAzM,gBAAA,WACnByT,EAAUH,+BAAiC7G,GAG/CgH,EAAUnD,UAAY,WAClBmD,EAAUwB,eAAe5S,EAC7B,EAEOoR,CACX,CAEQ,SAAAiB,CAAUrS,EAAgBmR,GAC9B,MAAM,aAAE0B,EAAY,KAAElB,GAAS3R,EAE/B,GAAImR,EAAe,CACf,MAAM2B,EAAcnB,EAAKxL,MAAM4M,GAAQA,EAAIC,QAAU7B,IACrD,GAAI2B,EACA,OAAOA,EAAYG,kBAAoBnC,GAAkBoC,MAEjE,CAEA,OAAQL,CACZ,CAEQ,cAAAD,CAAe5S,GACnB,MAAMmT,EAAU,CACZ/S,GAAIJ,EAAKyB,UACTwD,KAAMjF,EAAKgF,YACXE,eAAgB,IAEpB,IAAAxB,MAAK,EAAAC,OAAA,yB,yHAAiC,IAAKwP,GAC/C,CAEQ,SAAAjB,CAAUrE,EAA0BF,EAAgBrD,GAExD,IAAI8I,EAAc,eAAezF,IAKjC,OAJIrD,IACA8I,EAAc,GAAGA,wBAAkC9I,KAGhD,GANKuD,GAAoB,mBAMhBuF,GACpB,CAEQ,eAAAT,CAAgB3S,GACpB,MAAMqT,EAAWrT,EAAKqT,SAEtB,OAAOrT,EAAK2R,KAAK2B,QAAO,CAACC,EAAwBR,KAC7CQ,EAAW3K,KAAK,CACZ3D,KAAMhF,KAAKuT,eAAeT,EAAKM,IAAa,GAC5C/G,UAAWrM,KAAKuS,gBAAgBO,GAChClG,IAAKkG,EAAIlG,IACT4G,gBAAiBV,EAAIW,QAAQC,cAG1BJ,IACR,GACP,CAEQ,cAAAC,CAAeT,EAAeM,GAClC,OAAIA,EACON,EAAIa,OAAOtP,QAAUyO,EAAIa,OAAO,GAAG3O,KAGvC8N,EAAIc,MAAMvP,QAAUyO,EAAIc,MAAM,GAAG3M,KAC5C,CAEQ,eAAAsL,CAAgBO,GACpB,MAAMnB,EAAU,GAAGC,OAAOC,SAASC,aAAajL,SAASgL,SAASE,YAC5D,kBAAE8B,EAAiB,mBAAEC,GAAuBhB,EAElD,OAAIe,GAAqBA,EAAkB9I,IAChC4G,EAAQW,OAAOuB,EAAkB9I,KAGxC+I,GAAsBA,EAAmB/I,IAClC4G,EAAQW,OAAOwB,EAAmB/I,KAGtC,EACX,E,scC/KG,MAAMgJ,GAQT,WAAAhT,CAAYiT,GAPA,KAAOvS,SAAuB,GAC9B,KAAOD,UAAoB,GAC3B,KAAO0P,cAAwB,GAE/B,KAAO/G,eAAyB,GAQ5C,KAAO8J,gBAAmBzS,IACtBxB,KAAKwB,UAAYA,CAAS,EAI9B,KAAO0I,kBAAqBC,IACxBnK,KAAKmK,eAAiBA,CAAc,EAIxC,KAAO+J,iBAAoBnB,IACvB/S,KAAKkR,cAAgB6B,CAAK,EAI9B,KAAO3I,oBAAuBC,IAC1BrK,KAAKqK,iBAAmBA,CAAgB,EAI5C,KAAOtI,YAAeN,IAClB,MAAM0S,EAAiB,IAAInU,KAAKyB,YAAaA,GAE7CzB,KAAKyB,SAAW0S,EAAejQ,QAC3B,CAACpB,EAASS,EAAO6Q,IACbA,EAAIC,WAAWC,GAAMA,EAAE9S,YAAcsB,EAAQtB,cAAe+B,GACnE,EAGL,KAAOsB,eAAkBrD,GACXxB,KAAKyB,SAASyE,MAAMqO,GAAmBA,EAAK/S,YAAcA,IAlCpExB,KAAKgU,cAAgBA,CACzB,CAmCO,sBAAAQ,CAAuB/S,GAlDlC,MAmDQ,MAAM,qBACFqO,EACA2E,OAASC,QAAS5H,GAAW,KAC7B6H,GACA3U,KAAKgU,cAAcrI,OAEjBiJ,EAA6B,SAAA9E,EAAqB+E,yBAArB,IAAyC3Q,QACvE4Q,GAAsBA,EAAkBtH,SAAWmH,EAAKnH,SAO7D,OALI,MAAAoH,OAAA,EAAAA,EAA4BvQ,QAAS,IACrCyL,EAAqBtC,OAASoH,EAA2B,GAAGG,qBAC5DjF,EAAqBzC,WAAauH,EAA2B,GAAGxH,aAG7D0D,GAAoBG,SACvBxP,EAAS,I,2HACT,IAAKqO,G,QAAL,CAA2BhD,gBAC3B9M,KAAKmK,eACLnK,KAAKkR,cACLlR,KAAKqK,kB,KAEb,EAlEmB,IAAnB,cADS0J,GACU,wBACA,IAAnB,cAFSA,GAEU,yBACA,IAAnB,cAHSA,GAGU,6BACA,IAAnB,cAJSA,GAIU,6BACA,IAAnB,cALSA,GAKU,8BACA,IAAnB,cANSA,GAMU,gCAOZ,IADP,UAZSA,GAaF,+BAKA,IADP,UAjBSA,GAkBF,iCAKA,IADP,UAtBSA,GAuBF,gCAKA,IADP,UA3BSA,GA4BF,mCAKA,IADP,UAhCSA,GAiCF,2B,kgBC9BJ,MAAMiB,GAIF,YAAApE,CAAajF,GAChB3L,KAAK2L,OAAS,SAAK3L,KAAK2L,QAAWA,EACvC,EALmB,IAAnB,cADSqJ,GACU,sBAGZ,IADP,UAHSA,GAIF,4B,0UCTJ,MAAMC,GAA4B,qBAkElC,MAAMC,GAMT,WAAAnU,CAAYiJ,EAAsBmL,EAAqBC,GAuBvD,KAAUC,OAAmBxP,GAAsB,0BAC/C,IAAIyP,EAAyB,CAAEvV,KAAM,CAAC,EAAQwV,eAAgB,CAAC,GAE/D,IACID,QAAiBtV,KAAKwV,cAAcH,OAAUxP,EAClD,CAAE,MAAO4P,GACLzV,KAAK0V,YAAYD,EAAG,SAAU5P,EAClC,CAEA,OAAOyP,CACX,IAEA,KAAUjU,IAAM,CACZ,KAEC,aAFD,KAEC,cAFDwE,GACA,iBAAE8P,EAAmB,IAAG,YAAEC,GAAc,GAA2B,CAAC,GAEpE,IAAIN,EAAyB,CAAEvV,KAAM,CAAC,EAAQwV,eAAgB,CAAC,GAE/D,IACID,QAAiBtV,KAAKwV,cAAcnU,IAAOwE,EAAS,CAChD8P,mBACAC,eAER,CAAE,MAAOH,GACLzV,KAAK0V,YAAYD,EAAG,MAAO5P,EAC/B,CAEA,OAAOyP,CACX,IAEA,KAAUO,MAAkBhQ,GAAsB,0BAC9C,IAAIyP,EAAyB,CAAEvV,KAAM,CAAC,EAAQwV,eAAgB,CAAC,GAE/D,IACID,QAAiBtV,KAAKwV,cAAcK,MAAShQ,EACjD,CAAE,MAAO4P,GACLzV,KAAK0V,YAAYD,EAAG,QAAS5P,EACjC,CAEA,OAAOyP,CACX,IAEA,KAAUQ,KAAiBjQ,GAAsB,0BAC7C,IAAIyP,EAAyB,CAAEvV,KAAM,CAAC,EAAQwV,eAAgB,CAAC,GAC/D,IACID,QAAiBtV,KAAKwV,cAAcM,KAAQjQ,EAChD,CAAE,MAAO4P,GACLzV,KAAK0V,YAAYD,EAAG,OAAQ5P,EAChC,CAEA,OAAOyP,CACX,IACA,KAAUS,IAAgBlQ,GAAsB,0BAC5C,IAAIyP,EAAyB,CAAEvV,KAAM,CAAC,EAAQwV,eAAgB,CAAC,GAE/D,IACID,QAAiBtV,KAAKwV,cAAcO,IAAOlQ,EAC/C,CAAE,MAAO4P,GACLzV,KAAK0V,YAAYD,EAAG,MAAO5P,EAC/B,CAEA,OAAOyP,CACX,IAEA,KAAQI,YAAc,CAACD,EAAUO,EAAqBC,KAClDjW,KAAKkW,OAAOC,MAAM,CACdC,YAAa,GAAAC,YAAA,IACbC,QAAS,GAAGb,IACZ5P,QAAS,CACL0Q,QAAS,CACLC,UAAW,YAAa,mBAAoB,4BAC5CP,kBACAD,eAEJG,MAAOV,IAEb,EAlGFzV,KAAKwV,cAAgBxL,EAAYwL,cACjCxV,KAAKyW,eAAiBzM,EAAYyM,eAClCzW,KAAKkW,OAAS,IAAI,GAAAQ,UAAU,CAAEvB,cAAaC,kBAC/C,CAEO,SAAAuB,CAAUC,GACb5W,KAAKwV,cAAcqB,iBAAiBD,EACxC,CAEO,YAAAE,CAAaC,GAChB/W,KAAKwV,cAAcwB,mBAAmBD,EAC1C,CAEO,cAAAE,CAAeC,GACdA,EACAlX,KAAK2W,UAAU,CACX,CAAC1B,IAA4B,GAAGiC,MAGpClX,KAAK8W,aAAa7B,GAE1B,E,gNCjDG,MAAMkC,WAAgCjC,GAGzC,WAAAnU,CAAY4K,EAAoCwJ,EAAqBC,GACjElT,MAAMyJ,EAAQwJ,EAAaC,GAC3BpV,KAAK2L,OAASA,CAClB,CAEQ,QAAAyL,CAASC,EAAmBC,GAChC,MAAM,WAAEjK,EAAU,OAAEG,EAAM,OAAEL,GAAWnN,KAAK2L,OAAO3B,YAAY2B,OAAOmE,qBAChEyH,EAAgBF,EAAQnP,KAAK,KAEnC,MAAO,GAAG,EAAAlK,4BAA4BqP,OAAgBG,aAAkB+J,KAAiBD,YAAmBnK,GAChH,CAEa,qBAAAqK,CAAsBH,GAAwD,iCACvF,IACI,MAAMjL,EAAMpM,KAAKoX,SAASC,EAAS,WAKnC,aAJ8DrX,KAAKwV,cAAcnU,IAAI,CACjF+K,SAGYrM,KAAK0X,OACzB,CAAE,MAAOC,GACL,MAAMA,CACV,CACJ,IAEa,cAAAC,CAAejK,GAA8C,iCACtE,IACI,MAAMtB,EAAMpM,KAAKoX,SAAS,CAAC1J,GAAS,WAGpC,aAFuD1N,KAAKwV,cAAcnU,IAAI,CAAE+K,SAEhErM,KAAK0X,OACzB,CAAE,MAAOC,GACL,MAAMA,CACV,CACJ,K,qMC3EG,MAAME,GAIT,WAAA7W,CAAYS,GAgBZ,KAAOP,QAAU,KAAY,O,EAAA,K,EAAA,K,EAAA,YACzB,MAAMQ,QAAiB,IAAAC,OAAM,EAAAC,eAAA,iBAAiC,CAC1DC,SAAU,CAAEC,WAAY,CAAC7B,KAAKwB,cAG5BqW,EAA4C7X,KAAK8B,kBAAkB0S,uBACzD/S,GAGhBzB,KAAK8X,cAAcD,EACvB,E,yMAAA,EAzBI7X,KAAKwB,UAAYA,EACjBxB,KAAK8B,kBAAoBV,GAAYC,IAAI,sBAC7C,CAEQ,aAAAyW,CAAcD,GAClBjG,OAAO5B,IAAM4B,OAAO5B,KAAO,YACtBA,IAAI+H,EAAI/H,IAAI+H,GAAK,IAAIpP,KAAKqP,UAC7B,EACApG,OAAO5B,IAAI,SAAU6H,GACvB,MAAMI,EAAgBpR,SAASU,cAAc,wBACzC0Q,GACAA,EAAcC,UAAUC,OAAO,SAEvC,EAjBmB,IAAnB,cADSP,GACU,iCACA,IAAnB,cAFSA,GAEU,yBCZhB,MAAMQ,GAAN,cACH,KAAOnX,QAAU,KAEb,MAAMoX,EAAiBxR,SAASU,cAAc,uBAE1C8Q,GACAA,EAAeC,eAAe,CAC1BC,SAAU,SACVC,MAAO,SAEf,CACJ,ECNG,MAAMC,GAGT,WAAA1X,CAAY2X,GAIZ,KAAOzX,QAAU,KACb,MAAM0K,EAAS3L,KAAKgK,YAAY2B,OAC1BiC,EACFjC,EAAOmE,sBAAwBnE,EAAOmE,qBAAqBlC,iBACzD+K,EAAuC9R,SAASU,cAClD,kCAEE,WAAEmR,GAAe1Y,KACjB4Y,EAAaF,GAAcA,EAAWE,WACtCC,EAAoB,GAAGjL,gBAA+B8K,EAAWvY,KACnEwY,EACAA,EAAiBG,QAIrBlH,OAAOC,SAASkH,OAAOH,GAAcC,EAAkB,EAlBvD7Y,KAAKgK,YAAc5I,GAAYC,IAAI,iBACnCrB,KAAK0Y,WAAaA,CACtB,ECPG,MAAMM,GAMT,WAAAjY,CAAYS,EAAmBuR,GAM/B,KAAO9R,QAAU,KACbjB,KAAK8B,kBAAkBmS,gBAAgBjU,KAAKwB,WAC5CxB,KAAK8B,kBAAkBoS,iBAAiBlU,KAAK+S,MAAM,EAPnD/S,KAAK8B,kBAAoBV,GAAYC,IAAI,uBACzCrB,KAAKwB,UAAYA,EACjBxB,KAAK+S,MAAQA,CACjB,ECTG,MAAMkG,GAIT,WAAAlY,CAAY6P,GAKZ,KAAO3P,QAAU,KAA2B,O,EAAA,K,EAAA,K,EAAA,YACxCjB,KAAKgK,YAAY4G,aAAa,CAC1Bd,qBAAsB9P,KAAKkZ,WAEnC,E,yMAAA,EARIlZ,KAAKgK,YAAc5I,GAAYC,IAAI,iBACnCrB,KAAKkZ,UAAYtI,CACrB,E,gNCCG,MAAMuI,GAGT,WAAApY,CAAYkB,GAIZ,KAAOmX,wBAAiC5X,GAAsB,0BAC1D,MAAM6X,EAAiC,IAAIzB,GAA+BpW,SACpE6X,EAA+BpY,SACzC,IAEA,KAAOqY,uBAAyB,MACU,IAAIlB,IACZnX,SAAS,EAG3C,KAAOsY,wBAA2Bb,IACS,IAAID,GAA0BC,GACtCzX,SAAS,EAG5C,KAAOuY,kBAAoB,EAAGhY,YAAWuR,YACJ,IAAIiG,GAAyBxX,EAAWuR,GAChD9R,SAAS,EAGtC,KAAOwY,mBAA4B9N,GAAgC,0BAC/D,MAAM+N,EAA4B,IAAIT,GAA0BtN,SAC1D+N,EAA0BzY,SACpC,IAEA,KAAO0Y,kBAA2BtC,GAAsB,0BACpD,OAAOrX,KAAKiC,kBAAkB2X,kBAAkBvC,EACpD,IA9BIrX,KAAKiC,kBAAoBA,CAC7B,E,uYCbG,MAAM4X,GAGT,WAAA9Y,CAAY4K,GAFA,KAAOA,OAAiB,CAAC,EAGjC3L,KAAK4Q,aAAajF,EACtB,CAGO,YAAAiF,CAAajF,GAChB3L,KAAK2L,O,yHAAS,IAAKA,EACvB,EATmB,IAAnB,cADSkO,GACU,sBAOZ,IADP,UAPSA,GAQF,4BCTJ,MAAMhc,GAAN,cAEH,KAAO8E,cAAwB,EAI/B,eAAcsO,CAASlR,GACnB,MAAM+Z,EAAgB,IAAIjc,GAM1B,OALAic,EAAcpM,OAAS3N,EAAK0N,QAC5BqM,EAAcnX,cAAgBpC,EAAuBR,EAAKga,OAAOC,gBAAkB,GACnFF,EAAcrX,YAAc1C,EAAKga,OAAOE,aACxCH,EAAcI,kBAAoBna,EAAKga,OAAOI,mBAEvCL,CACX,CAEA,oBAAWM,GACP,OAAQpa,KAAK2C,cAAgB,EAAA1E,sBAAyB,GAC1D,ECpBG,MAAMoc,GAIT,eAAcpJ,CAASlR,GACnB,MAAMua,EAAS,IAAID,IAEfE,SAAS,SAAEnW,GACXoW,SAAS,OAAErW,IACXpE,EAKJ,OAHAua,EAAOlW,SAAWA,EAClBkW,EAAOnW,OAASA,EAETmW,CACX,E,8sBCYG,MAAMG,GAQT,WAAA1Z,GANA,KAAQ2Z,kBAA8B,GAEtC,KAAQC,gBAAqC,GAEjC,KAAOhW,eAAkC,CAAC,EAMtD,KAAOiV,kBAAqB/X,GACjB7B,KAAK4a,mBAAmB/Y,GAGnC,KAAOmB,iBAAoBxB,GAChBxB,KAAK4Z,kBAAkB,CAACpY,IAGnC,KAAO6B,kBAA2B7B,GAAsB,0BACpD,MAAOqZ,SAA+C7a,KAAK8a,OAAOnD,eAAenW,GAEjF,OAAOqZ,EAAiBzX,QAAQ2X,KAAKT,GAA4BD,GAAOpJ,SAASqJ,IACrF,IAGA,KAAQU,oBAAsB,IAAY,0BACtC,MAAMN,EAAoB1a,KAAK0a,kBACzBC,EAAkB3a,KAAK2a,gBAG7B,GAFA3a,KAAK2a,gBAAkB,GAEnBD,EAAkBrW,OAAQ,CAC1BrE,KAAK0a,kBAAoB,GAEzB,MAAM3a,QAAaC,KAAK8a,OAAOtD,sBAAsBkD,GAC/C/V,EAAiB,MAAK3E,KAAK2E,gBAEjC3E,KAAK2E,eAAiB5E,EAAKsT,QAAO,CAAC4H,EAAaC,KAC5CD,EAAYC,EAASzN,SAAW5P,GAAcoT,SAASiK,GAEhDD,IACRtW,EACP,CAEA3E,KAAKmb,gBAAgBR,EACzB,IAEA,KAAQS,cAAiBvZ,GACd,IAAI4J,SAAQ,CAAC4P,EAAUC,KAC1Btb,KAAK2a,gBAAgBhS,KAAK,CACtB0S,WACAC,WACAzZ,cACF,IAIV,KAAQ+Y,mBAAsB/Y,IAC1B,MAAM0Z,EAAgBvb,KAAKwb,wBAAwB3Z,GAEnD,OAAI0Z,EAAclX,QACdoX,aAAazb,KAAK0b,qBAElB1b,KAAK0a,kBAAoB,IAAI,IAAIiB,IAAI,IAAI3b,KAAK0a,qBAAsBa,KACpEvb,KAAK0b,oBAAsBE,WACvB5b,KAAKgb,oBA9EkB,KAkFpBhb,KAAKob,cAAcvZ,IAGvB7B,KAAK6b,uBAAuBha,EAAW,EAGlD,KAAQsZ,gBAAmBR,IACvBA,EAAgBpS,QAAQvI,KAAK8b,eAAe,EAGhD,KAAQA,eAAkBC,IACtB,MAAMC,EAAiBhc,KAAK6b,uBAAuBE,EAAQla,YAE3Dka,EAAQV,SAASW,EAAe,EA1EhChc,KAAK8a,OAAS1Z,GAAYC,IAAI,yBAClC,CA4EQ,sBAAAwa,CAAuBha,GAC3B,OAAOA,EAAWwR,QAAO,CAAC4I,EAA8Bza,KACpD,MAAMoB,EAAgB5C,KAAK2E,eAAenD,GACpC0a,EAAe,MAAKD,GAI1B,OAFAC,EAAa1a,GAAaoB,GAAiB5C,KAAKmc,eAAe3a,GAExD0a,CAAY,GACpB,CAAC,EACR,CAEQ,uBAAAV,CAAwB3Z,GAC5B,OAAOA,EAAWwR,QAAO,CAAC4H,EAAuBzZ,KAC7C,MAAM+Z,EAAgB,IAAIN,GAM1B,OAJKjb,KAAK2E,eAAenD,IACrB+Z,EAAc5S,KAAKnH,GAGhB+Z,CAAa,GACrB,GACP,CAEQ,cAAAY,CAAezO,GACnB,OAAO7P,GAAcoT,SAAS,CAC1BxD,QAASC,EACTqM,OAAQ,CACJC,eAAgB,EAAA/a,uBAChBgb,aAAc,EAAA/a,qBACdib,mBAAoB,EAAAhb,6BAGhC,EAhHmB,IAAnB,cANSsb,GAMU,8BAqBX,IADR,UA1BSA,GA2BD,mCCpDL,MAAM2B,GAIT,WAAArb,CAAYsO,GAKZ,KAAOpO,QAAU,KAAY,O,EAAA,K,EAAA,K,EAAA,kBACnBjB,KAAKqc,iBAAiB1L,WAAW3Q,KAAKqP,QAChD,E,yMAAA,EANIrP,KAAKqc,iBAAmBjb,GAAYC,IAAI,sBACxCrB,KAAKqP,QAAUA,CACnB,ECMG,MAAMjO,GAAc,IAAI,EAAAkb,UAElBC,GAAaC,IACtBpb,GAAYuK,OAAS6Q,CAAU,EAGnC,SAAeC,GAAmB9Q,GAAoB,O,EAAA,K,EAAA,K,EAAA,YAClD4Q,GAAU5Q,GAEVvK,GAAYC,IAAI,0BAChB,MAAMqb,EAAU,IAAIN,GAAoC,CAAC,uBAAwB,QAAS,eACpFM,EAAQzb,SAClB,E,yMAAA,CAEAG,GACKub,SAAS,iBAA2BC,GAAM,IAAI/C,GAAY+C,EAAEjR,UAC5DgR,SAAS,YAAsBC,GAAM,IAAI5H,KACzC2H,SAAS,sBAA+B,IAAM,IAAIjM,KAClDiM,SACG,0BACCC,GAAM,IAAIzD,GAAqByD,EAAEvb,IAAI,0BAEzCsb,SACG,2BACA,IAAM,IAAIE,EAAA,EAAsBJ,MAEnCE,SACG,gCACAvb,GAAY0b,SACPF,GACG,IAAI5a,EACA4a,EAAEvb,IAAI,uBACNub,EAAEvb,IAAI,2BAIrBsb,SACG,iCACAvb,GAAY0b,SACPF,GACG,IAAI7S,EACA6S,EAAEvb,IAAI,YACNub,EAAEvb,IAAI,2BAIrBsb,SAAS,0BAAoCC,IAC1C,MAAMjR,EAAS,CACX6J,cAAeoH,EAAEvb,IAAI,mBACrB2I,YAAa4S,EAAEvb,IAAI,kBAEjB0b,EAA2B,yBAC3BC,GAA8B,QAAkBD,GAEtD,OAAO,IAAI5F,GACPxL,EACAoR,EACAC,EACH,IAEJL,SAAS,mBAA6BC,GAC5B,qBAEVD,SACG,uBACCC,GAAM,IAAI7I,GAAkB6I,EAAEvb,IAAI,eAEtCsb,SAAS,uBAAiCC,GAAM,IAAInC,KACpDkC,SACG,iCACCC,GAAM,IAAI1O,GAA4B0O,EAAEvb,IAAI,oBAGrD,MAAM,WAAE4b,KCzFsBC,GDyFO9b,GCzFP,CAE1B6b,WAAajY,GAAkB,CAE3BY,EACAO,EACAgX,KAEA,MAAMC,EAAepY,GAAQmB,EAEvBkX,EAAW,WACb,MAAM/F,EAAW4F,GAAU7b,IAAI+b,GAC/B,IAAK9F,EACD,MAAM,IAAIgG,MAAM,iBAAiBF,qBAGrC,OAAO9F,CACX,EACA,IAAIiG,EAAqBJ,GAAc,CAAC,EACnCA,EAMDI,EAAmBlc,IAAMgc,GALzBE,EAAqB,CACjBlc,IAAKgc,GAETtX,OAAOyX,eAAe5X,EAAQO,EAAKoX,GAGvC,IA1BqB,IAACL,E","sources":["webpack://elc-service-ratings-reviews/./src/internal/constants/PowerReviews.ts","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/ViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/ComputeRoundedValueFor.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingSelectedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/ProductReview.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingsLoadedUseCase.tsx","webpack://elc-service-ratings-reviews/./src/internal/controllers/ProductRatingViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/GenerateRandomIntegerUpTo.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/NoValue.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/ServiceReviews.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/RatingsReviewsBaseController.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/ProductReviewsViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/utils/UsableValues.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewProduct.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewDetails.ts","webpack://elc-service-ratings-reviews/./src/internal/controllers/ReviewDetailsViewController.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/ConfigRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/constants/InventoryStatuses.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/PowerReviewsProduct.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/ProductRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/Config.ts","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/Api.ts","webpack://elc-service-ratings-reviews/./src/api/RatingsAndReviewsApiSdk.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/PowerReviewsInitializedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/ReadReviewsClickedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/WriteReviewClickedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/ProductFullLoadedUseCase.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/UpdateReviewConfigUseCase.ts","webpack://elc-service-ratings-reviews/./src/service-setup/ServiceBusController.ts","webpack://elc-service-ratings-reviews/./src/service-setup/ConfigStore.tsx","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/ReviewSnippet.ts","webpack://elc-service-ratings-reviews/./src/internal/domain/entities/Review.ts","webpack://elc-service-ratings-reviews/./src/internal/repositories/RatingsRepository.ts","webpack://elc-service-ratings-reviews/./src/internal/use-cases/RatingsReviewsServiceStartedUseCase.ts","webpack://elc-service-ratings-reviews/./src/service-setup/diContainer.tsx","webpack://elc-service-ratings-reviews/./node_modules/@estee/elc-service/src/decorators/Decorators.ts"],"sourcesContent":["export const PRODUCT_REVIEWS_CLASS = 'js-reviews-wrapper';\nexport const ENTER_KEY = 'Enter';\nexport const ENTER_KEY_CODE = 'NumpadEnter';\nexport const REVIEW_DISPLAY = 'pr-review-display';\nexport const REVIEW_SNIPPET = 'pr-review-snippet';\nexport const QUESTION_DISPLAY = 'pr-questiondisplay';\nexport const SNAPSHOT_TYPE = 'SIMPLE';\nexport const enum PAGINATION_TYPE {\n DEFAULT = 'DEFAULT',\n VERTICAL = 'VERTICAL'\n}\nexport const REVIEW_COMPONENTS = {\n ReviewDisplay: REVIEW_DISPLAY,\n ReviewSnippet: REVIEW_SNIPPET\n};\nexport const AVERAGE_RATING = 'averageRating';\nexport const POWER_REVIEWS_SCRIPT = '//ui.powerreviews.com/stable/4.1/ui.js';\nexport const POWER_REVIEWS_API_LINK = 'https://readservices-b2c.powerreviews.com';\nexport const TOTAL_NUMBER_OF_STARS = 5;\nexport const HELPFUL_YES_CLASS = 'pr-helpful-yes';\nexport const HELPFUL_NO_CLASS = 'pr-helpful-no';\nexport const FLAG_REVIEW_CLASS = 'pr-rd-flag-review-container';\nexport const SORT_BY_ID = 'pr-rd-sort-by';\nexport const MULTI_SELECT_CLASS = 'pr-multiselect';\nexport const MULTI_SELECT_ITEM_CLASS = 'pr-multiselect-item';\nexport const MULTI_SELECT_BUTTON_LABEL_CLASS = 'pr-multiselect-button-label';\nexport const REVIEWS_SEARCH_CLASS = 'pr-rd-search-reviews-input';\nexport const REVIEWS_SEARCH_BUTTON_CLASS = 'pr-rd-search-reviews-icon-button';\nexport const ASK_AND_ANSWER_BUTTON_ID = 'pr-question-form-link';\nexport const ASK_AND_ANSWER_FORM_ID = 'pr-question-form-content';\nexport const ASK_AND_ANSWER_SEARCH_CLASS = 'pr-qa-display-searchbar';\nexport const ASK_AND_ANSWER_SEARCH_BUTTON_CLASS = 'pr-qa-search-btn';\nexport const ASK_AND_ANSWER_SORT_BY_ID = 'pr-qa-sort-by';\nexport const ASK_AND_ANSWER_SHOW_MORE_CLASS = 'pr-qa-display-show-more-questions';\nexport const DEFAULT_AVERAGE_RATING = 0;\nexport const DEFAULT_REVIEW_COUNT = 0;\nexport const DEFAULT_ANSWERED_QUESTIONS = 0;\nexport const DEFAULT_REVIEW_TITLE = 'Reviews';\nexport const REVIEW_SNAPSHOT_ID = 'pr-review-snapshot';\nexport const REVIEWS_RATING_CLASS = 'pr-histogram-stars';\nexport const REVIEWS_PAGINATION_NEXT_BUTTON = 'pr-rd-pagination-btn--next';\nexport const REVIEWS_PAGINATION_PREV_BUTTON = 'pr-rd-pagination-btn--prev';\nexport const REVIEWS_ACTIVE_RATING_FILTER_SELECTOR = '[class*=pr-hist-filter]';\nexport enum ReviewPaginationOption {\n NEXT = 'next',\n PREVIOUS = 'previous'\n}\n\nexport enum ReviewClickEventSelectors {\n WRITE_REVIEW = '.pr-snippet-write-review-link',\n REVIEW_HELPFUL_YES = '#pr-review-display .pr-helpful-yes',\n REVIEW_HELPFUL_NO = '#pr-review-display .pr-helpful-no',\n FLAG_REVIEW = '.pr-rd-flag-review-container',\n MULTI_SELECT = '.pr-multiselect-item',\n REVIEW_SEARCH = '.pr-rd-search-reviews-icon-button',\n ASK_AND_ANSWER_BUTTON = '#pr-question-form-link',\n ASK_AND_ANSWER_SEARCH = '.pr-qa-search-btn',\n ASK_AND_ANSWER_HELPFUL_YES = '#pr-questiondisplay .pr-helpful-yes',\n ASK_AND_ANSWER_HELPFUL_NO = '#pr-questiondisplay .pr-helpful-no',\n ASK_AND_ANSWER_SHOW_MORE = '.pr-qa-display-show-more-questions',\n REVIEWS_RATING = '.pr-histogram-stars',\n REVIEWS_PAGINATION = '.pr-rd-pagination-btn'\n}\n","import { observable } from 'mobx';\nimport {\n IComponentViewController,\n IViewControllerData,\n ViewControllerLoadedMethod\n} from '@estee/elc-universal-utils';\n\nexport class ViewController implements IComponentViewController {\n public id?: string;\n public dataState?: IViewControllerData;\n public loaded?: ViewControllerLoadedMethod;\n public configMergeStrategy?: Function;\n @observable public isLoading: boolean = true;\n\n public setSSRState = (data?: IViewControllerData) => {\n this.dataState = data;\n };\n\n public setId = (id?: string) => {\n this.id = id && btoa(unescape(encodeURIComponent(id)));\n };\n\n public get data(): IViewControllerData {\n return {};\n }\n}\n","const DEFAULT_NUMBER_OF_DIGITS = 1;\n\nexport const computeRoundedValueFor = (\n number: number,\n numberOfDigits: number = DEFAULT_NUMBER_OF_DIGITS\n) => {\n const roundMultiplier = Math.pow(10, numberOfDigits);\n\n return Math.round(number * roundMultiplier) / roundMultiplier;\n};\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ProductRatingViewController } from '../controllers/ProductRatingViewController';\n\nexport class RatingSelectedUseCase {\n private selectedIndex: number;\n private productRatingViewController: ProductRatingViewController;\n\n constructor(selectedIndex: number) {\n this.selectedIndex = selectedIndex;\n this.productRatingViewController = diContainer.get(\n serviceNames.productRatingViewController\n );\n }\n\n public execute = () => {\n this.productRatingViewController.setRating(this.selectedIndex);\n };\n}\n","// tslint:disable-next-line:export-name\nexport const DEFAULT_NUMBER_OF_STARS = 5;\nexport const REVIEW_CATEGORY = 'product reviews / ask answer';\n","import { query, serviceQueries } from '@estee/elc-service-bus';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { observable } from 'mobx';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { IProduct } from '~interfaces/IRating';\n\nexport class RatingsLoadedUseCase {\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n\n constructor(productId: string) {\n this.productId = productId;\n this.productRepository = diContainer.get(serviceNames.productRepository);\n }\n\n public execute = async () => {\n // tslint:disable-next-line: await-promise\n const products = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: {\n productIds: [this.productId]\n }\n });\n\n this.productRepository.setProducts(products as IProduct[]);\n };\n}\n","import { ViewController } from '@estee/elc-service';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { observable, computed, action } from 'mobx';\nimport { AVERAGE_RATING } from '~constants/PowerReviews';\nimport { computeRoundedValueFor } from '~utils/ComputeRoundedValueFor';\nimport { IProduct } from '~interfaces/IRating';\nimport { RatingSelectedUseCase } from '../use-cases/RatingSelectedUseCase';\nimport { DEFAULT_NUMBER_OF_STARS, REVIEW_CATEGORY } from '../constants/ProductReview';\nimport { RatingsLoadedUseCase } from '../use-cases/RatingsLoadedUseCase';\nimport { ProductRepository } from '../repositories/ProductRepository';\nimport { NO_VALUE } from '../constants/NoValue';\nimport { RatingsRepository } from '../repositories/RatingsRepository';\nimport { Review } from '../domain/entities/Review';\nimport { ISocialProofReviewConfig } from '~exported/product-rating/ProductRating';\nimport { generateRandomIntegerUpTo } from '~utils/GenerateRandomIntegerUpTo';\n\nexport interface IProductRatingViewControllerInitializeProps {\n productId: string;\n numberOfStars: number;\n productRating?: number;\n reviewsNumber?: number;\n product: IProduct;\n socialProofReviews: ISocialProofReviewConfig;\n}\n\ninterface IProductRating {\n averageRating: number;\n reviewCount: number;\n}\n\nexport class ProductRatingViewController extends ViewController {\n @observable public selectedRatingIndex: number = -1;\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n @observable private numberOfStars: number = DEFAULT_NUMBER_OF_STARS;\n @observable public numberOfReviews: number;\n @observable private ratingsRepository: RatingsRepository;\n @observable private hasLoaded: boolean = false;\n @observable private productItem: IProduct;\n private defaultRating: IProductRating;\n @observable private reviews: Review[];\n @observable private socialProofReviewConfig: ISocialProofReviewConfig;\n\n constructor(productRepository: ProductRepository, ratingsRepository: RatingsRepository) {\n super();\n this.productRepository = productRepository;\n this.ratingsRepository = ratingsRepository;\n }\n\n @computed\n public get data() {\n return {\n selectedRatingIndex: this.selectedRatingIndex,\n percentageRating: this.percentageRating,\n onSelectRating: this.onSelectRating,\n onReadReviewsClick: this.onReadReviewsClick,\n onWriteReviewClick: this.onWriteReviewClick,\n numberOfReviews: this.rating?.reviewCount,\n averageRating: this.rating?.averageRating,\n loaded: this.hasLoaded,\n reviews: this.reviews,\n filteredSocialProofReview: this.filteredSocialProofReview\n };\n }\n\n @computed\n public get rating(): IProductRating {\n return (\n this.ratingsRepository.productRatings[this.productId] ||\n this.productLevelReviews ||\n this.defaultRating\n );\n }\n\n @computed\n public get product() {\n return this.productItem || this.productRepository.getProductById(this.productId);\n }\n\n @action\n public loaded = async (props: IProductRatingViewControllerInitializeProps) => {\n this.isLoading = true;\n\n this.defaultRating = {\n reviewCount: props.reviewsNumber || 0,\n averageRating: computeRoundedValueFor(props.productRating || 0)\n };\n\n this.productItem = props.product || null;\n\n const { numberOfStars, productId } = props;\n this.numberOfStars = numberOfStars;\n this.productId = productId;\n\n if (!props.product) {\n const ratingsLoadedUseCase = new RatingsLoadedUseCase(this.productId);\n await ratingsLoadedUseCase.execute();\n }\n this.ratingsRepository.getProductRating(productId);\n\n this.socialProofReviewConfig = props.socialProofReviews;\n if (this.socialProofReviewConfig?.enabled) {\n this.reviews = await this.ratingsRepository.getProductReviews(this.productId);\n }\n\n this.isLoading = false;\n this.hasLoaded = true;\n };\n\n @computed\n private get percentageRating() {\n const defaultVal = undefined;\n\n if (this.rating && AVERAGE_RATING in this.rating) {\n const { averageRating } = this.rating;\n\n return averageRating === NO_VALUE\n ? defaultVal\n : (averageRating * 100) / this.numberOfStars;\n }\n\n return defaultVal;\n }\n\n @action\n public onSelectRating = (index: number) => {\n this.selectedRatingIndex = index;\n\n const ratingSelectedUseCase = new RatingSelectedUseCase(index);\n ratingSelectedUseCase.execute();\n };\n\n @action\n public onReadReviewsClick = () => {\n emit(events.READ_REVIEWS_LINK_CLICKED, this.getReviewPayload());\n };\n\n @action\n public onWriteReviewClick = () => {\n emit(events.WRITE_REVIEWS_LINK_CLICKED, this.getReviewPayload());\n };\n\n @computed\n private get productLevelReviews() {\n if (!this.product) {\n return null;\n }\n\n return {\n reviewCount: this.product.reviews.numberOfReviews,\n averageRating: this.product.reviews.averageRating\n };\n }\n\n private getReviewPayload() {\n const { productId, displayName } = this.product;\n\n return {\n id: productId,\n name: displayName,\n reviewCategory: REVIEW_CATEGORY\n };\n }\n\n @action\n public setRating = (index: number) => {\n this.numberOfReviews = this.numberOfReviews + 1;\n };\n\n private getReviewHeadline = (maxCharacters: number) => {\n const { minNumberOfStars } = this.socialProofReviewConfig || {};\n const filteredReviews = this.reviews?.filter(\n ({ rating, headline }) => rating >= minNumberOfStars && headline.length <= maxCharacters\n );\n\n return filteredReviews?.[generateRandomIntegerUpTo(filteredReviews?.length)]?.headline;\n };\n\n @computed\n public get filteredSocialProofReview() {\n const { maxNumberOfCharacters } = this.socialProofReviewConfig || {};\n\n return {\n desktopHeadline: this.getReviewHeadline(maxNumberOfCharacters?.longHeadline) ?? '',\n mobileHeadline: this.getReviewHeadline(maxNumberOfCharacters?.shortHeadline) ?? ''\n };\n }\n}\n","export const generateRandomIntegerUpTo = (max: number) => Math.floor(Math.random() * max);\n","// tslint:disable:export-name\nexport const NO_VALUE: number = -3.1415926535;\n","export const SERVICE_REVIEWS_CLASS = 'elc-review-detail-wrapper';\nexport const REVIEW_CATEGORY = 'service reviews';\n","import { ViewController } from '@estee/elc-service';\nimport { emit, events } from '@estee/elc-service-bus';\nimport * as PowerReviewsConstants from '~constants/PowerReviews';\nimport { IReviewsPayload } from '~interfaces/IReviews';\nimport { SERVICE_REVIEWS_CLASS } from '~constants/ServiceReviews';\n\nexport interface IEventHandlerType {\n id: string;\n name: string;\n reviewCategory: string;\n}\n\nexport class RatingsReviewsBaseController extends ViewController {\n private productReviewsContainer: HTMLElement | null;\n private eventHandlerData: IEventHandlerType;\n\n public addReviewsEventHandlers(eventHandlerData: IEventHandlerType) {\n this.eventHandlerData = eventHandlerData;\n this.productReviewsContainer = (\n document.querySelector(\n `.${PowerReviewsConstants.PRODUCT_REVIEWS_CLASS}, .${SERVICE_REVIEWS_CLASS}`\n )\n );\n if (!this.productReviewsContainer) {\n return;\n }\n this.productReviewsContainer.addEventListener('click', this.handleReviewsClickEventHandler);\n this.productReviewsContainer.addEventListener(\n 'change',\n this.handleReviewsChangeEventHandler\n );\n this.productReviewsContainer.addEventListener('keyup', this.handleReviewsKeyupEventHandler);\n }\n\n private handleReviewsClickEventHandler = (event: MouseEvent) => {\n const { id, name, reviewCategory } = this.eventHandlerData;\n const eventTarget = event.target;\n\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory\n };\n\n const selector = Object.keys(PowerReviewsConstants.ReviewClickEventSelectors).find(\n (key) => {\n return !!eventTarget.closest(\n PowerReviewsConstants.ReviewClickEventSelectors[\n key as keyof typeof PowerReviewsConstants.ReviewClickEventSelectors\n ]\n );\n }\n );\n if (selector) {\n this.handleReviewClickEvents[\n PowerReviewsConstants.ReviewClickEventSelectors[\n selector as keyof typeof PowerReviewsConstants.ReviewClickEventSelectors\n ]\n ]({ eventTarget, payload });\n }\n };\n\n private handleReviewClickEvents: {\n [key in PowerReviewsConstants.ReviewClickEventSelectors]: (params: {\n eventTarget: HTMLElement;\n payload: IReviewsPayload;\n }) => void;\n } = {\n [PowerReviewsConstants.ReviewClickEventSelectors.WRITE_REVIEW]: (params) => {\n emit(events.WRITE_REVIEW_STARTED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_HELPFUL_YES]: (params) => {\n emit(events.REVIEWS_HELPFUL_YES_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_HELPFUL_NO]: (params) => {\n emit(events.REVIEWS_HELPFUL_NO_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.FLAG_REVIEW]: (params) => {\n emit(events.REVIEWS_FLAG_REVIEW_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.MULTI_SELECT]: (params) => {\n this.handleMultiSelectItem(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEW_SEARCH]: (params) => {\n this.handleReviewsSearch(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_BUTTON]: (params) => {\n this.handleAskAndAnswerButton(params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_SEARCH]: (params) => {\n this.handleAskAndAnswerSearch(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_HELPFUL_YES]: (params) => {\n emit(events.ASK_AND_ANSWER_HELPFUL_YES_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_HELPFUL_NO]: (params) => {\n emit(events.ASK_AND_ANSWER_HELPFUL_NO_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.ASK_AND_ANSWER_SHOW_MORE]: (params) => {\n emit(events.ASK_AND_ANSWER_SHOW_MORE_CLICKED, params.payload);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_RATING]: (params) => {\n this.handleReviewsRating(params.eventTarget);\n },\n [PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_PAGINATION]: (params) => {\n this.handleReviewsPagination(params.eventTarget);\n }\n };\n\n private handleAskAndAnswerButton = (payload: IReviewsPayload) => {\n if (!document.getElementById(PowerReviewsConstants.ASK_AND_ANSWER_FORM_ID)) {\n emit(events.ASK_AND_ANSWER_CLICKED, payload);\n }\n };\n\n private handleReviewsChangeEventHandler = (event: Event) => {\n const eventTarget = event.target;\n const { id, name, reviewCategory } = this.eventHandlerData;\n const { SORT_BY_ID, ASK_AND_ANSWER_SORT_BY_ID } = PowerReviewsConstants;\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: (eventTarget).value\n };\n switch (eventTarget && eventTarget.id) {\n case SORT_BY_ID: {\n emit(events.REVIEWS_SORT_BY_CHANGED, payload);\n break;\n }\n case ASK_AND_ANSWER_SORT_BY_ID: {\n emit(events.ASK_AND_ANSWERS_SORT_BY_CHANGED, payload);\n break;\n }\n default:\n }\n };\n\n private handleReviewsKeyupEventHandler = (event: KeyboardEvent) => {\n const eventTarget = event.target;\n const { REVIEWS_SEARCH_CLASS, ASK_AND_ANSWER_SEARCH_CLASS, ENTER_KEY, ENTER_KEY_CODE } =\n PowerReviewsConstants;\n const isEnterKey = event.code === ENTER_KEY_CODE || event.key === ENTER_KEY;\n\n if (!!eventTarget.closest(`.${REVIEWS_SEARCH_CLASS}`) && isEnterKey) {\n this.handleReviewsSearch(eventTarget);\n } else if (!!eventTarget.closest(`.${ASK_AND_ANSWER_SEARCH_CLASS}`) && isEnterKey) {\n this.handleAskAndAnswerSearch(eventTarget);\n }\n };\n\n private handleMultiSelectItem(eventTarget: HTMLElement) {\n const { MULTI_SELECT_CLASS, MULTI_SELECT_ITEM_CLASS } = PowerReviewsConstants;\n const multiSelectParent = eventTarget && eventTarget.closest(`.${MULTI_SELECT_CLASS}`);\n const currentItem = eventTarget && eventTarget.closest(`.${MULTI_SELECT_ITEM_CLASS}`);\n const { id, name, reviewCategory } = this.eventHandlerData;\n\n if (currentItem && currentItem.hasAttribute('data-selected')) {\n currentItem.removeAttribute('data-selected');\n\n return;\n }\n currentItem && currentItem.setAttribute('data-selected', '');\n\n const selectedFlags = this.getMultiSelectedItems(multiSelectParent);\n const multiSelectButtonText = this.getMultiSelectButtonText(multiSelectParent);\n\n if (selectedFlags.length > 0) {\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: `${multiSelectButtonText} | ${selectedFlags.join(',')}`\n };\n emit(events.REVIEWS_FILTER_CLICKED, payload);\n }\n }\n\n private getMultiSelectButtonText(multiSelectParent: Element | null) {\n const multiSelectButton =\n multiSelectParent &&\n multiSelectParent.querySelector(\n `.${PowerReviewsConstants.MULTI_SELECT_BUTTON_LABEL_CLASS}`\n );\n\n return multiSelectButton && multiSelectButton.textContent;\n }\n\n private getMultiSelectedItems(multiSelectParent: Element | null) {\n const multiSelectItems =\n multiSelectParent &&\n multiSelectParent.querySelectorAll(`.${PowerReviewsConstants.MULTI_SELECT_ITEM_CLASS}`);\n const selectedFlags: string[] = [];\n multiSelectItems &&\n multiSelectItems.forEach((selectItem) => {\n if (selectItem.hasAttribute('data-selected')) {\n const selectedFlagContainer = selectItem && selectItem.querySelector('span');\n const selectedFlagText =\n selectedFlagContainer && selectedFlagContainer.textContent;\n selectedFlagText && selectedFlags.push(selectedFlagText);\n }\n });\n\n return selectedFlags;\n }\n\n private handleReviewsSearch(eventTarget: HTMLElement) {\n const searchParent =\n eventTarget && eventTarget.closest(`.${PowerReviewsConstants.REVIEWS_SEARCH_CLASS}`);\n const searchBox = searchParent && searchParent.querySelector('input');\n const searchValue = searchBox && searchBox.value;\n const { id, name, reviewCategory } = this.eventHandlerData;\n if (!searchValue) {\n return;\n }\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: searchValue\n };\n emit(events.REVIEWS_SEARCH_CLICKED, payload);\n }\n\n private handleAskAndAnswerSearch(eventTarget: HTMLElement) {\n const searchParent =\n eventTarget &&\n eventTarget.closest(`.${PowerReviewsConstants.ASK_AND_ANSWER_SEARCH_CLASS}`);\n const searchBox = searchParent && searchParent.querySelector('input');\n const searchValue = searchBox && searchBox.value;\n const { id, name, reviewCategory } = this.eventHandlerData;\n if (!searchValue) {\n return;\n }\n const payload: IReviewsPayload = {\n id,\n name,\n reviewCategory,\n selectedValue: searchValue\n };\n emit(events.ASK_AND_ANSWER_SEARCH_CLICKED, payload);\n }\n\n private handleReviewsRating(eventTarget: HTMLElement) {\n const isActiveFilter = !!eventTarget.closest(PowerReviewsConstants.REVIEWS_ACTIVE_RATING_FILTER_SELECTOR);\n\n let selectedValue;\n\n if (!isActiveFilter) {\n const ratingsElements = document.getElementsByClassName(\n PowerReviewsConstants.REVIEWS_RATING_CLASS\n );\n const ratingsElementsArray = Array.from(ratingsElements);\n\n const targetRatingElement = eventTarget.closest(\n PowerReviewsConstants.ReviewClickEventSelectors.REVIEWS_RATING\n );\n\n if (targetRatingElement) {\n const ratingIndex = ratingsElementsArray.indexOf(targetRatingElement);\n const rating = PowerReviewsConstants.TOTAL_NUMBER_OF_STARS - ratingIndex;\n\n selectedValue = `${rating} star`;\n\n const payload: IReviewsPayload = {\n ...this.eventHandlerData,\n selectedValue\n };\n\n emit(events.REVIEWS_RATING_CLICKED, payload);\n }\n }\n }\n\n private emitReviewsPaginationClicked(\n optionSelection: PowerReviewsConstants.ReviewPaginationOption\n ) {\n const payload: IReviewsPayload = {\n ...this.eventHandlerData,\n selectedValue: optionSelection\n };\n\n emit(events.REVIEWS_PAGINATION_CLICKED, payload);\n }\n\n private handleReviewsPagination(eventTarget: HTMLElement) {\n const isNextButton = eventTarget.className.includes(\n PowerReviewsConstants.REVIEWS_PAGINATION_NEXT_BUTTON\n );\n\n const isPrevButton = eventTarget.className.includes(\n PowerReviewsConstants.REVIEWS_PAGINATION_PREV_BUTTON\n );\n\n if (isNextButton) {\n this.emitReviewsPaginationClicked(PowerReviewsConstants.ReviewPaginationOption.NEXT);\n } else if (isPrevButton) {\n this.emitReviewsPaginationClicked(\n PowerReviewsConstants.ReviewPaginationOption.PREVIOUS\n );\n }\n }\n\n public removeReviewsEventHandlers() {\n if (!this.productReviewsContainer) {\n return;\n }\n this.productReviewsContainer.removeEventListener(\n 'click',\n this.handleReviewsClickEventHandler\n );\n this.productReviewsContainer.removeEventListener(\n 'change',\n this.handleReviewsChangeEventHandler\n );\n this.productReviewsContainer.removeEventListener(\n 'keyup',\n this.handleReviewsKeyupEventHandler\n );\n }\n}\n","import { emit, events } from '@estee/elc-service-bus';\nimport { observable, computed, action } from 'mobx';\nimport { ConfigStore } from '~setup/ConfigStore';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport * as Constants from '~constants/PowerReviews';\nimport { IRatingsReviewsConfig } from '~interfaces/IRating';\nimport { RatingsLoadedUseCase } from '~use-cases/RatingsLoadedUseCase';\nimport { IProductReviews } from '~exported/product-reviews/ProductReviews';\nimport { RatingsReviewsBaseController } from './RatingsReviewsBaseController';\nimport { REVIEW_CATEGORY } from '~constants/ProductReview';\n\nexport class ProductReviewsViewController extends RatingsReviewsBaseController {\n @observable public isLoading: boolean = true;\n @observable public config: IRatingsReviewsConfig;\n @observable public productRepository: ProductRepository;\n @observable public powerReviewsScript: HTMLScriptElement;\n @observable public activeTab: string = 'tab-1';\n\n constructor(configStore: ConfigStore, productRepository: ProductRepository) {\n super();\n this.config = configStore.config;\n this.productRepository = productRepository;\n }\n\n public initialize(props: IProductReviews) {\n const { config } = props;\n this.config = { ...this.config, ...config };\n }\n\n @computed\n get data() {\n return {\n isLoading: this.isLoading,\n activeTab: this.activeTab\n };\n }\n\n @computed\n public get productId() {\n return this.productRepository.productId || this.config.productId;\n }\n\n @computed\n public get product() {\n return this.productRepository.getProductById(this.productId);\n }\n\n @computed\n public get numberOfReviewsValue(): number {\n return this.product && this.product.reviews && this.product.reviews.numberOfReviews;\n }\n\n @action\n public setPaginationType = (paginationType: string) => {\n this.productRepository.setPaginationType(paginationType);\n };\n\n @action\n public setPrDisclosureCode = (prDisclosureCode: string) => {\n this.productRepository.setPrDisclosureCode(prDisclosureCode);\n };\n\n @action\n public onTabClick = (event: React.MouseEvent) => {\n const target = event.target;\n this.activeTab = target.dataset.tab || '';\n };\n\n @action\n public loadReviews = (powerReviewsScript: HTMLScriptElement) => {\n this.isLoading = false;\n // tslint:disable-next-line: no-floating-promises\n this.loaded().then(() => {\n this.loadPowerReviewsScripts(powerReviewsScript);\n this.addReviewsEventHandlers({\n id: this.productId,\n name: this.product?.displayName || '',\n reviewCategory: REVIEW_CATEGORY\n });\n });\n };\n\n public handleProductReviewsUnmount = () => {\n this.removeReviewsEventHandlers();\n };\n\n @action\n public loadPowerReviewsScripts = (powerReviewsScript: HTMLScriptElement) => {\n powerReviewsScript.type = 'text/javascript';\n powerReviewsScript.src = Constants.POWER_REVIEWS_SCRIPT;\n powerReviewsScript.defer = true;\n powerReviewsScript.async = true;\n powerReviewsScript.onload = () => {\n this.emitReviewsInit();\n };\n document.body.prepend(powerReviewsScript);\n\n this.powerReviewsScript = powerReviewsScript;\n };\n\n public showReviews = () => {\n const prScript = document.createElement('script');\n if (!this.powerReviewsScript) {\n this.loadReviews(prScript);\n }\n };\n\n public loaded = async () => {\n if (this.productId) {\n const ratingsLoadedUseCase = new RatingsLoadedUseCase(this.productId);\n await ratingsLoadedUseCase.execute();\n }\n\n return Promise.resolve();\n };\n\n public emitReviewsInit = () => {\n emit(events.SPP_POWER_REVIEWS_INIT, this.productId);\n };\n}\n","export interface ICopyUsableValues {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport const copyUsableValues = (source: ICopyUsableValues, target: ICopyUsableValues) => {\n Object.keys(source).forEach((key) => {\n if (source[key] !== null && source[key] !== undefined) {\n target[key] = source[key];\n }\n });\n};\n","import { copyUsableValues } from '../../utils/UsableValues';\r\nimport { IReviewDetailsData } from './ReviewDetails';\r\n\r\nexport class ReviewProduct {\r\n public name: string;\r\n public image_url: string;\r\n public description: string;\r\n public category_name: string;\r\n public url: string;\r\n public manufacturer_id?: string;\r\n public price?: string;\r\n public upc?: string;\r\n public brand_name?: string;\r\n public in_stock?: boolean;\r\n\r\n public static toJson(data: IReviewDetailsData) {\r\n const reviewProduct = new ReviewProduct();\r\n const mappingData = {\r\n name: data.name,\r\n url: data.url,\r\n image_url: data.imageUrl,\r\n description: data.description,\r\n category_name: data.categoryName,\r\n manufacturer_id: data.manufacturerId,\r\n upc: data.upc,\r\n brand_name: data.brandName,\r\n price: data.price\r\n };\r\n copyUsableValues(mappingData, reviewProduct);\r\n\r\n return reviewProduct;\r\n }\r\n}\r\n","import { ReviewProduct } from './ReviewProduct';\nimport { copyUsableValues } from '../../utils/UsableValues';\n\ninterface IReviewComponents {\n ReviewSnippet?: string;\n ReviewImageSnippet?: string;\n ReviewDetails?: string;\n}\n\nexport interface IReviewDetailsData {\n apiKey: string;\n merchantId: string;\n merchantGroupId: string;\n locale: string;\n pageId: string;\n name: string;\n imageUrl: string;\n description: string;\n categoryName: string;\n manufacturerId?: string;\n upc?: string;\n brandName?: string;\n price?: string;\n inStock?: boolean;\n url: string;\n reviewWrapperUrl: string;\n components?: IReviewComponents;\n onRender?(): boolean;\n onSubmit?(): boolean;\n}\n\nexport class ReviewDetails {\n public api_key: string;\n public merchant_id: string;\n public merchant_group_id: string;\n public locale: string;\n public page_id: string;\n public product: string;\n public review_wrapper_url: string;\n public components: IReviewComponents;\n public on_render: void;\n public on_submit: void;\n\n public static toJson(data: IReviewDetailsData) {\n const reviewDetails = new ReviewDetails();\n const mappingData = {\n api_key: data.apiKey,\n merchant_id: data.merchantId,\n merchant_group_id: data.merchantGroupId,\n locale: data.locale,\n page_id: data.pageId,\n product: ReviewProduct.toJson(data),\n review_wrapper_url: data.reviewWrapperUrl,\n components: data.components,\n on_render: data.onRender,\n on_submit: data.onSubmit\n };\n copyUsableValues(mappingData, reviewDetails);\n\n return reviewDetails;\n }\n}\n","import { action } from 'mobx';\nimport {\n POWER_REVIEWS_SCRIPT,\n REVIEW_COMPONENTS,\n REVIEW_SNAPSHOT_ID\n} from '~constants/PowerReviews';\nimport { IReviewDetailsData, ReviewDetails } from '~domain/entities/ReviewDetails';\nimport { IReviewDetailsConfig } from '~exported/review-details/ReviewDetails';\nimport { ConfigStore } from '~setup/ConfigStore';\nimport { RatingsReviewsBaseController } from './RatingsReviewsBaseController';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { REVIEW_CATEGORY } from '~constants/ServiceReviews';\nimport { IPowerReviews } from '~interfaces/IPowerReviews';\n\ndeclare let pwr: IPowerReviews;\n\ninterface IReviewDetailsControllerData {\n config: IReviewDetailsConfig;\n reviewDetailsRef: React.RefObject;\n}\n\nexport class ReviewDetailsViewController extends RatingsReviewsBaseController {\n private isReviewLoaded: boolean;\n private reviewDetailsData: IReviewDetailsData;\n private configs: ConfigStore;\n private reviewDetailsRef: React.RefObject;\n private isProductInfoVisible: boolean;\n\n constructor(configStore: ConfigStore) {\n super();\n this.configs = configStore;\n }\n\n @action\n public loaded = async (props: IReviewDetailsControllerData) => {\n this.reviewDetailsData = props.config;\n const payload = {\n id: this.reviewDetailsData.pageId,\n name: this.reviewDetailsData.name,\n reviewCategory: REVIEW_CATEGORY\n };\n this.reviewDetailsRef = props.reviewDetailsRef;\n this.isProductInfoVisible = props.config.showPageInfo;\n this.showReviewOverlay();\n this.addReviewsEventHandlers(payload);\n emit(events.REVIEW_OVERLAY_OPENED, payload);\n };\n\n private showReviewOverlay() {\n if (this.isReviewLoaded) {\n this.renderOverlay();\n\n return;\n }\n this.loadPowerReviews();\n }\n\n private loadPowerReviews() {\n const script = document.getElementsByTagName('script')[0];\n const powerReviewsScript = document.createElement('script');\n powerReviewsScript.type = 'text/javascript';\n powerReviewsScript.async = true;\n powerReviewsScript.src = POWER_REVIEWS_SCRIPT;\n powerReviewsScript.onload = () => {\n this.isReviewLoaded = true;\n this.showReviewOverlay();\n };\n\n script.parentNode && script.parentNode.insertBefore(powerReviewsScript, script);\n }\n\n private renderOverlay() {\n const reviewsConfig = {\n ...this.configs.config.ratingsReviewsConfig,\n components: REVIEW_COMPONENTS\n };\n const reviewDisplayParams = ReviewDetails.toJson({\n ...reviewsConfig,\n ...this.reviewDetailsData\n });\n pwr('render', reviewDisplayParams);\n this.isProductInfoVisible && this.observeReviewDetails();\n }\n\n private observeReviewDetails = () => {\n const reviewDetailsContainer = this.reviewDetailsRef.current;\n if (reviewDetailsContainer === null) {\n return;\n }\n const mutationObserver: MutationObserver = new MutationObserver(this.onReviewDetailsLoaded);\n const config = {\n childList: true,\n subtree: true\n };\n\n mutationObserver.observe(reviewDetailsContainer, config);\n };\n\n private onReviewDetailsLoaded = (\n mutationList: MutationRecord[],\n mutationObserver: MutationObserver\n ) => {\n for (const mutation of mutationList) {\n if ((mutation.target).querySelector(`#${REVIEW_SNAPSHOT_ID}`)) {\n this.appendProductDetails();\n mutationObserver.disconnect();\n break;\n }\n }\n };\n\n // Hacky code to inject product/service info into review details as Power Reviews doesn't support this\n private appendProductDetails() {\n const reviewSnapShotContainer = document.getElementById(REVIEW_SNAPSHOT_ID);\n if (!reviewSnapShotContainer) {\n return;\n }\n const imageElement = document.createElement('img');\n const productElement = document.createElement('p');\n const descriptionElement = document.createElement('p');\n const productInfoWrapper = document.createElement('div');\n\n imageElement.src = this.reviewDetailsData.imageUrl;\n imageElement.alt = this.reviewDetailsData.name;\n imageElement.className = 'elc-pr-review-product-image';\n\n productElement.innerHTML = this.reviewDetailsData.name;\n productElement.className = 'elc-pr-review-product-name';\n\n descriptionElement.innerHTML = this.reviewDetailsData.description;\n descriptionElement.className = 'elc-pr-review-product-description';\n\n productInfoWrapper.className = 'elc-pr-review-product-wrapper';\n productInfoWrapper.appendChild(productElement);\n productInfoWrapper.appendChild(descriptionElement);\n\n reviewSnapShotContainer.prepend(imageElement, productInfoWrapper);\n }\n\n public handleUnmount() {\n this.removeReviewsEventHandlers();\n emit(events.REVIEW_OVERLAY_CLOSED, {\n id: this.reviewDetailsData.pageId,\n name: this.reviewDetailsData.name || '',\n reviewCategory: 'service reviews'\n });\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\nimport { Config } from '~domain/entities/Config';\n\nexport class ConfigRepository {\n private config: Config;\n\n constructor() {\n this.config = diContainer.get(serviceNames.config);\n }\n\n public getConfigs = async (configs: string[]) => {\n const config = await query(serviceQueries.GET_CONFIG, configs);\n\n this.config.updateConfig(config);\n };\n}\n","export enum InventoryStatuses {\n Active = 'Active',\n TempOutOfStock = 'Temporarily out of stock',\n ComingSoon = 'Coming Soon',\n SoldOut = 'Sold Out',\n FreePromo = 'Free Promo',\n DoNotDisplay = 'Do Not Display',\n Inactive = 'Inactive',\n PreOrder = 'Pre Order'\n}\n","import {\n IProduct,\n IVariant,\n IRatingsReviewsConfig,\n IComponents,\n IPRProductProduct,\n ISkuData\n} from '../../interfaces/IRating';\nimport {\n REVIEW_DISPLAY,\n QUESTION_DISPLAY,\n SNAPSHOT_TYPE,\n PAGINATION_TYPE\n} from '../../constants/PowerReviews';\nimport { emit, events } from '@estee/elc-service-bus';\nimport { REVIEW_CATEGORY } from '../../constants/ServiceReviews';\nimport { InventoryStatuses } from '../../constants/InventoryStatuses';\n\nexport class PowerReviewsProduct {\n public api_key: string;\n public locale: string;\n public merchant_group_id: string;\n public merchant_id: string;\n public page_id: string;\n public review_wrapper_url: string;\n public components: IComponents = {\n ReviewDisplay: REVIEW_DISPLAY,\n QuestionDisplay: QUESTION_DISPLAY\n };\n public REVIEW_DISPLAY_SNAPSHOT_TYPE: string;\n public REVIEW_DISPLAY_PAGINATION_TYPE = PAGINATION_TYPE.DEFAULT;\n public variants: IVariant[];\n public product: IPRProductProduct;\n public on_submit: () => void;\n\n public static fromJson(\n data: IProduct,\n ratingsReviewsConfig: IRatingsReviewsConfig,\n paginationType: string,\n selectedSkuId?: string,\n prDisclosureCode?: string\n ): PowerReviewsProduct {\n const prProduct = new PowerReviewsProduct();\n\n const {\n apiKey,\n locale,\n merchantGroupId,\n merchantId,\n pageId,\n reviewWrapperUrl,\n reviewDisplaySnapshotType,\n brandName\n } = ratingsReviewsConfig;\n\n const {\n productId,\n displayName,\n productUrl,\n shortDescription,\n defaultCategory,\n defaultSku: { price, originalPrice },\n skus,\n defaultSku\n } = data;\n\n const baseUrl = `${window.location.protocol}//${document.location.hostname}`;\n const prPageId = pageId || productId;\n\n prProduct.api_key = apiKey;\n prProduct.locale = locale;\n prProduct.merchant_group_id = merchantGroupId;\n prProduct.merchant_id = merchantId;\n prProduct.page_id = prPageId;\n prProduct.review_wrapper_url = prProduct.reviewUrl(\n reviewWrapperUrl,\n prPageId,\n prDisclosureCode\n );\n prProduct.REVIEW_DISPLAY_SNAPSHOT_TYPE = reviewDisplaySnapshotType || SNAPSHOT_TYPE;\n\n // Converting boolean to string as requested by PowerReviews\n const inStock = prProduct.isInStock(data, selectedSkuId).toString();\n\n prProduct.product = {\n name: displayName,\n url: baseUrl.concat(productUrl),\n image_url: prProduct.getDefaultImage(defaultSku),\n description: shortDescription,\n category_name: defaultCategory.id,\n brand_name: brandName,\n price: price || originalPrice,\n in_stock: inStock\n };\n\n if (skus.length > 1) {\n prProduct.product.variants = prProduct.productVariants(data);\n } else {\n prProduct.product.upc = defaultSku.upc;\n }\n\n if (paginationType === PAGINATION_TYPE.VERTICAL) {\n prProduct.REVIEW_DISPLAY_PAGINATION_TYPE = paginationType;\n }\n\n prProduct.on_submit = function () {\n prProduct.onPrFormSubmit(data);\n };\n\n return prProduct;\n }\n\n private isInStock(data: IProduct, selectedSkuId?: string) {\n const { isOutOfStock, skus } = data;\n\n if (selectedSkuId) {\n const selectedSku = skus.find((sku) => sku.skuId === selectedSkuId);\n if (selectedSku) {\n return selectedSku.inventoryStatus === InventoryStatuses.Active;\n }\n }\n\n return !isOutOfStock;\n }\n\n private onPrFormSubmit(data: IProduct) {\n const payLoad = {\n id: data.productId,\n name: data.displayName,\n reviewCategory: REVIEW_CATEGORY\n };\n emit(events.ASK_AND_ANSWER_SUBMITTED, { ...payLoad });\n }\n\n private reviewUrl(reviewWrapperUrl: string, pageId: string, prDisclosureCode?: string): string {\n const url = reviewWrapperUrl || '/review/create';\n let queryString = `?pr_page_id=${pageId}`;\n if (prDisclosureCode) {\n queryString = `${queryString}&pr_disclosure_code=${prDisclosureCode}`;\n }\n\n return `${url}${queryString}`;\n }\n\n private productVariants(data: IProduct) {\n const isShaded = data.isShaded;\n\n return data.skus.reduce((variantAcc: IVariant[], sku) => {\n variantAcc.push({\n name: this.getVariantName(sku, isShaded) || '',\n image_url: this.getDefaultImage(sku),\n upc: sku.upc,\n page_id_variant: sku.perlgem.SKU_BASE_ID\n });\n\n return variantAcc;\n }, []);\n }\n\n private getVariantName(sku: ISkuData, isShaded: boolean) {\n if (isShaded) {\n return sku.shades.length && sku.shades[0].name;\n }\n\n return sku.sizes.length && sku.sizes[0].value;\n }\n\n private getDefaultImage(sku: ISkuData) {\n const baseUrl = `${window.location.protocol}//${document.location.hostname}`;\n const { defaultLargeImage, defaultMediumImage } = sku;\n\n if (defaultLargeImage && defaultLargeImage.src) {\n return baseUrl.concat(defaultLargeImage.src);\n }\n\n if (defaultMediumImage && defaultMediumImage.src) {\n return baseUrl.concat(defaultMediumImage.src);\n }\n\n return '';\n }\n}\n","import { action, observable } from 'mobx';\nimport { IProduct } from '../interfaces/IRating';\nimport { PowerReviewsProduct } from '../domain/entities/PowerReviewsProduct';\nimport { Config } from '../domain/entities/Config';\n\nexport class ProductRepository {\n @observable public products: IProduct[] = [];\n @observable public productId: string = '';\n @observable public selectedSkuId: string = '';\n @observable public configService: Config;\n @observable public paginationType: string = '';\n @observable public prDisclosureCode: string;\n\n constructor(configService: Config) {\n this.configService = configService;\n }\n\n @action\n public updateProductId = (productId: string) => {\n this.productId = productId;\n };\n\n @action\n public setPaginationType = (paginationType: string) => {\n this.paginationType = paginationType;\n };\n\n @action\n public setSelectedSkuId = (skuId: string) => {\n this.selectedSkuId = skuId;\n };\n\n @action\n public setPrDisclosureCode = (prDisclosureCode: string) => {\n this.prDisclosureCode = prDisclosureCode;\n };\n\n @action\n public setProducts = (products: IProduct[]) => {\n const listOfProducts = [...this.products, ...products];\n\n this.products = listOfProducts.filter(\n (product, index, arr) =>\n arr.findIndex((i) => i.productId === product.productId) === index\n );\n };\n\n public getProductById = (productId: string) =>\n this.products.find((prod: IProduct) => prod.productId === productId);\n\n public getPowerReviewsProduct(products: IProduct[]) {\n const {\n ratingsReviewsConfig,\n brand: { literal: brandName },\n i18n\n } = this.configService.config;\n\n const localeDependentIdsFiltered = ratingsReviewsConfig.localeDependentIds?.filter(\n (localeDependentId) => localeDependentId.locale === i18n.locale\n );\n if (localeDependentIdsFiltered?.length > 0) {\n ratingsReviewsConfig.locale = localeDependentIdsFiltered[0].power_reviews_locale;\n ratingsReviewsConfig.merchantId = localeDependentIdsFiltered[0].merchant_id;\n }\n\n return PowerReviewsProduct.fromJson(\n products[0],\n { ...ratingsReviewsConfig, brandName },\n this.paginationType,\n this.selectedSkuId,\n this.prDisclosureCode\n );\n }\n}\n","import { observable, action } from 'mobx';\nimport { IBrand, IRatingsReviewsConfig, Ii18n } from '../../interfaces/IRating';\n\nexport interface IConfig {\n ratingsReviewsConfig: IRatingsReviewsConfig;\n brand: IBrand;\n i18n: Ii18n;\n}\nexport class Config {\n @observable public config: IConfig;\n\n @action\n public updateConfig(config: Partial) {\n this.config = { ...this.config, ...config };\n }\n}\n","import { HeaderType, HeaderObject, root } from '@estee/elc-universal-utils';\nimport { ELCLogger, TriggerType } from '@estee/elc-logging';\n\nexport const AUTHORIZATION_HEADER_NAME = 'AuthorizationToken';\nexport const BUSINESS_UNIT_HEADER_NAME = 'Business-Unit';\n\nexport interface IError {\n status: number;\n}\nexport interface IDataMapperOperations {\n [key: string]: Function | undefined;\n request?(request: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n response?(response: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n }): {};\n}\nexport interface IDataMappings {\n [key: string]: IDataMapperOperations;\n}\nexport interface IResponse {\n data: T;\n reponseHeaders: Headers | {};\n}\nexport interface IPayload {\n url: string;\n body?: {};\n options?: {};\n headers?: {};\n returnAsPlainText?: boolean;\n}\nexport interface IGetPayload {\n url: string;\n options?: {};\n headers?: {};\n params?: {};\n}\nexport interface IRequestOptions {\n debounceInterval?: number;\n bypassCache?: boolean;\n}\nexport interface IHttpTransport {\n addGlobalHeaders(header: HeaderObject): void;\n removeGlobalHeader(headerName: string): void;\n delete(payload: string | IPayload): Promise>;\n post(payload: IPayload): Promise>;\n patch(payload: IPayload): Promise>;\n put(payload: IPayload): Promise>;\n get(payload: string | IGetPayload, IRequestOptions?: IRequestOptions): Promise>;\n}\nexport interface IDataMapper {\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapRequest(name: string, request: Object): {};\n // eslint-disable-next-line @typescript-eslint/ban-types\n mapResponse(name: string, response: Object): {};\n dataMappings?: IDataMappings;\n}\n\nexport interface IConfig {\n cartId?: string;\n httpTransport: IHttpTransport;\n dataMapper?: IDataMapper;\n businessUnitId?: string;\n drupalDomain?: string;\n}\n\nexport class Api {\n protected bearerToken: string;\n protected httpTransport: IHttpTransport;\n protected businessUnitId: string | undefined;\n private logger: ELCLogger;\n\n constructor(configStore: IConfig, serviceName: string, serviceVersion: string) {\n this.httpTransport = configStore.httpTransport;\n this.businessUnitId = configStore.businessUnitId;\n this.logger = new ELCLogger({ serviceName, serviceVersion });\n }\n\n public addHeader(header: HeaderObject) {\n this.httpTransport.addGlobalHeaders(header);\n }\n\n public removeHeader(headerName: HeaderType) {\n this.httpTransport.removeGlobalHeader(headerName);\n }\n\n public setBearerToken(bearerToken: string) {\n if (bearerToken) {\n this.addHeader({\n [AUTHORIZATION_HEADER_NAME]: `${bearerToken}`\n });\n } else {\n this.removeHeader(AUTHORIZATION_HEADER_NAME);\n }\n }\n protected delete = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.delete(payload);\n } catch (e) {\n this.handleError(e, 'delete', payload);\n }\n\n return response;\n };\n\n protected get = async (\n payload: IGetPayload | string,\n { debounceInterval = 200, bypassCache = false }: IRequestOptions = {}\n ) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.get(payload, {\n debounceInterval,\n bypassCache\n });\n } catch (e) {\n this.handleError(e, 'get', payload);\n }\n\n return response;\n };\n\n protected patch = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.patch(payload);\n } catch (e) {\n this.handleError(e, 'patch', payload);\n }\n\n return response;\n };\n\n protected post = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n try {\n response = await this.httpTransport.post(payload);\n } catch (e) {\n this.handleError(e, 'post', payload);\n }\n\n return response;\n };\n protected put = async (payload: IPayload) => {\n let response: IResponse = { data: {} as T, reponseHeaders: {} };\n\n try {\n response = await this.httpTransport.put(payload);\n } catch (e) {\n this.handleError(e, 'put', payload);\n }\n\n return response;\n };\n\n private handleError = (e: Error, requestType: string, originalPayload: IPayload | string) => {\n this.logger.error({\n triggerType: TriggerType.api,\n message: `${e}`,\n payload: {\n context: {\n subdomain: root.site && root.site.client && root.site.client.subdomain,\n originalPayload,\n requestType\n },\n error: e\n }\n });\n };\n}\n","import { Api, IConfig } from '@estee/elc-service';\nimport { POWER_REVIEWS_API_LINK } from '../internal/constants/PowerReviews';\nimport { ConfigStore } from '../service-setup/ConfigStore';\n\nenum ApiResource {\n Snippet = 'snippet',\n Reviews = 'reviews'\n}\n\nexport interface IReviewSnippetApiSdkConfig extends IConfig {\n configStore: ConfigStore;\n}\n\ninterface IResultData {\n data: {\n results: T[];\n };\n}\n\nexport interface IRatingSnippetsApiResult {\n page_id: string;\n rollup: IRollupJsonData;\n}\n\nexport interface IReviewsApiResult {\n page_id: string;\n reviews: IReviewJsonData[];\n}\n\nexport interface IReviewJsonData {\n details: IReviewDetailsJsonData;\n metrics: IReviewMetricsJsonData;\n}\n\ninterface IReviewMetricsJsonData {\n rating: number;\n}\n\ninterface IReviewDetailsJsonData {\n headline: string;\n}\n\ninterface IRollupJsonData {\n average_rating: number;\n review_count: number;\n answered_questions: number;\n}\n\nexport class RatingsAndReviewsApiSdk extends Api {\n private config: IReviewSnippetApiSdkConfig;\n\n constructor(config: IReviewSnippetApiSdkConfig, serviceName: string, serviceVersion: string) {\n super(config, serviceName, serviceVersion);\n this.config = config;\n }\n\n private buildUrl(pageIds: string[], resource: ApiResource) {\n const { merchantId, locale, apiKey } = this.config.configStore.config.ratingsReviewsConfig;\n const joinedPageIds = pageIds.join(',');\n\n return `${POWER_REVIEWS_API_LINK}/m/${merchantId}/l/${locale}/product/${joinedPageIds}/${resource}?apikey=${apiKey}`;\n }\n\n public async getRatingSnippetsData(pageIds: string[]): Promise {\n try {\n const url = this.buildUrl(pageIds, ApiResource.Snippet);\n const response: IResultData = await this.httpTransport.get({\n url\n });\n\n return response.data.results;\n } catch (err) {\n throw err;\n }\n }\n\n public async getReviewsData(pageId: string): Promise {\n try {\n const url = this.buildUrl([pageId], ApiResource.Reviews);\n const response: IResultData = await this.httpTransport.get({ url });\n\n return response.data.results;\n } catch (err) {\n throw err;\n }\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { observable } from 'mobx';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { IPowerReviews, IPowerReviewsWindow, IPowerReviewsProduct, IProduct } from '~interfaces/IRating';\nimport { query, serviceQueries } from '@estee/elc-service-bus';\n\ndeclare let pwr: IPowerReviews;\ndeclare let window: IPowerReviewsWindow;\n\nexport class PowerReviewsInitializedUseCase {\n @observable public productRepository: ProductRepository;\n @observable public productId: string;\n\n constructor(productId: string) {\n this.productId = productId;\n this.productRepository = diContainer.get(serviceNames.productRepository);\n }\n\n private renderReviews(powerReviewsProduct: IPowerReviewsProduct) {\n window.pwr = window.pwr || function () {\n (pwr.q = pwr.q || []).push(arguments);\n };\n window.pwr('render', powerReviewsProduct);\n const reviewSection = document.querySelector('.spp-reviews-wrapper');\n if (reviewSection) {\n reviewSection.classList.remove('hidden');\n }\n }\n\n public execute = async () => {\n const products = await query(serviceQueries.GET_PRODUCT_DATA, {\n filterBy: { productIds: [this.productId] }\n });\n\n const powerReviewsProduct: IPowerReviewsProduct = this.productRepository.getPowerReviewsProduct(\n products\n );\n\n this.renderReviews(powerReviewsProduct);\n };\n}\n","export class ReadReviewsClickedUseCase {\n public execute = () => {\n // This class name is being passed by the Drupal file sd_spp_reviews_v1.mustache\n const reviewsSection = document.querySelector('.js-product-reviews');\n\n if (reviewsSection) {\n reviewsSection.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n }\n };\n}\n","import { ConfigStore } from '~setup/ConfigStore';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { IReviewsPayload } from '~interfaces/IReviews';\n\nexport class WriteReviewClickedUseCase {\n private reviewInfo: IReviewsPayload;\n private configStore: ConfigStore;\n constructor(reviewInfo: IReviewsPayload) {\n this.configStore = diContainer.get(serviceNames.configStore);\n this.reviewInfo = reviewInfo;\n }\n public execute = () => {\n const config = this.configStore.config;\n const reviewWrapperUrl =\n config.ratingsReviewsConfig && config.ratingsReviewsConfig.reviewWrapperUrl;\n const createReviewLink: HTMLElement | null = document.querySelector(\n '.pr-snippet-write-review-link'\n );\n const { reviewInfo } = this;\n const reviewLink = reviewInfo && reviewInfo.reviewLink;\n const defaultReviewPath = `${reviewWrapperUrl}?pr_page_id=${reviewInfo.id}`;\n if (createReviewLink) {\n createReviewLink.click();\n\n return;\n }\n window.location.assign(reviewLink || defaultReviewPath);\n };\n}\n","import { ProductRepository } from '~repositories/ProductRepository';\nimport { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\n\nexport class ProductFullLoadedUseCase {\n private productRepository: ProductRepository;\n private productId: string;\n private skuId: string;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(productId: string, skuId: string) {\n this.productRepository = diContainer.get(serviceNames.productRepository);\n this.productId = productId;\n this.skuId = skuId;\n }\n\n public execute = () => {\n this.productRepository.updateProductId(this.productId);\n this.productRepository.setSelectedSkuId(this.skuId);\n };\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ConfigStore } from '../../service-setup/ConfigStore';\nimport { IReviewUpdateConfig } from '../../internal/interfaces/IReviewUpdateConfig';\n\nexport class UpdateReviewConfigUseCase {\n private configStore: ConfigStore;\n private newConfig: IReviewUpdateConfig;\n\n constructor(updateConfig: IReviewUpdateConfig) {\n this.configStore = diContainer.get(serviceNames.configStore);\n this.newConfig = updateConfig;\n }\n\n public execute = async (): Promise => {\n this.configStore.updateConfig({\n ratingsReviewsConfig: this.newConfig\n });\n };\n}\n","import { PowerReviewsInitializedUseCase } from '~use-cases/PowerReviewsInitializedUseCase';\nimport { ReadReviewsClickedUseCase } from '~use-cases/ReadReviewsClickedUseCase';\nimport { WriteReviewClickedUseCase } from '~use-cases/WriteReviewClickedUseCase';\nimport { ProductFullLoadedUseCase } from '~use-cases/ProductFullLoadedUseCase';\nimport { UpdateReviewConfigUseCase } from '~use-cases/UpdateReviewConfigUseCase';\nimport { IReviewUpdateConfig } from '../internal/interfaces/IReviewUpdateConfig';\nimport { IReviewsPayload } from '~interfaces/IReviews';\nimport { RatingsRepository } from '~repositories/RatingsRepository';\n\ninterface IProductFullLoaded {\n productId: string;\n skuId: string;\n}\nexport class ServiceBusController {\n private ratingsRepository: RatingsRepository;\n\n constructor(ratingsRepository: RatingsRepository) {\n this.ratingsRepository = ratingsRepository;\n }\n\n public powerReviewsInitialized = async (productId: string) => {\n const powerReviewsInitializedUseCase = new PowerReviewsInitializedUseCase(productId);\n await powerReviewsInitializedUseCase.execute();\n };\n\n public readReviewsLinkClicked = () => {\n const readReviewsLinkClickedUseCase = new ReadReviewsClickedUseCase();\n readReviewsLinkClickedUseCase.execute();\n };\n\n public writeReviewsLinkClicked = (reviewInfo: IReviewsPayload) => {\n const writeReviewsLinkClickedUseCase = new WriteReviewClickedUseCase(reviewInfo);\n writeReviewsLinkClickedUseCase.execute();\n };\n\n public productFullLoaded = ({ productId, skuId }: IProductFullLoaded) => {\n const productFullLoadedUseCase = new ProductFullLoadedUseCase(productId, skuId);\n productFullLoadedUseCase.execute();\n };\n\n public updateReviewConfig = async (config: IReviewUpdateConfig) => {\n const updateReviewConfigUseCase = new UpdateReviewConfigUseCase(config);\n await updateReviewConfigUseCase.execute();\n };\n\n public getReviewSnippets = async (pageIds: string[]) => {\n return this.ratingsRepository.getProductsRating(pageIds);\n };\n}\n","import { observable, action } from 'mobx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Config = any;\n\nexport class ConfigStore {\n @observable public config: Config = {};\n\n constructor(config: Config) {\n this.updateConfig(config);\n }\n\n @action\n public updateConfig(config: Config) {\n this.config = { ...config };\n }\n}\n","import { IRatingSnippetsApiResult } from '../../../api/RatingsAndReviewsApiSdk';\nimport { TOTAL_NUMBER_OF_STARS } from '../../constants/PowerReviews';\nimport { computeRoundedValueFor } from '../../utils/ComputeRoundedValueFor';\n\nexport class ReviewSnippet {\n public pageId: string;\n public averageRating: number = 0;\n public reviewCount: number;\n public answeredQuestions: number;\n\n public static fromJson(data: IRatingSnippetsApiResult): ReviewSnippet {\n const reviewSnippet = new ReviewSnippet();\n reviewSnippet.pageId = data.page_id;\n reviewSnippet.averageRating = computeRoundedValueFor(data.rollup.average_rating || 0);\n reviewSnippet.reviewCount = data.rollup.review_count;\n reviewSnippet.answeredQuestions = data.rollup.answered_questions;\n\n return reviewSnippet;\n }\n\n public get reviewPercentage() {\n return (this.averageRating / TOTAL_NUMBER_OF_STARS) * 100;\n }\n}\n","import { IReviewJsonData } from '../../../api/RatingsAndReviewsApiSdk';\n\nexport class Review {\n public headline: string;\n public rating: number;\n\n public static fromJson(data: IReviewJsonData) {\n const review = new Review();\n const {\n details: { headline },\n metrics: { rating }\n } = data;\n\n review.headline = headline;\n review.rating = rating;\n\n return review;\n }\n}\n","import { action, observable } from 'mobx';\n\nimport {\n IReviewJsonData,\n IReviewsApiResult,\n RatingsAndReviewsApiSdk\n} from '../../api/RatingsAndReviewsApiSdk';\nimport { diContainer } from '../../service-setup/diContainer';\nimport serviceNames from '../../../src/service-setup/RatingsReviewsService';\nimport { ReviewSnippet } from '../domain/entities/ReviewSnippet';\nimport { Review } from '../domain/entities/Review';\nimport {\n DEFAULT_ANSWERED_QUESTIONS,\n DEFAULT_AVERAGE_RATING,\n DEFAULT_REVIEW_COUNT\n} from '../constants/PowerReviews';\n\nconst RATINGS_FETCH_DEBOUNCE_TIMEOUT = 300;\n\ninterface IProductsRating {\n [key: string]: ReviewSnippet;\n}\n\ninterface IStashedPromise {\n resolver(productsSnippet: IProductsRating): void;\n rejecter(): void;\n productIds: string[];\n}\n\nexport class RatingsRepository {\n private apiSdk: RatingsAndReviewsApiSdk;\n private stashedProductIds: string[] = [];\n private ratingsQueryTimeout: number;\n private stashedPromises: IStashedPromise[] = [];\n\n @observable public productRatings: IProductsRating = {};\n\n constructor() {\n this.apiSdk = diContainer.get(serviceNames.ratingsReviewsApiSdk);\n }\n\n public getProductsRating = (productIds: string[]) => {\n return this.debounceGetRatings(productIds);\n };\n\n public getProductRating = (productId: string) => {\n return this.getProductsRating([productId]);\n };\n\n public getProductReviews = async (productId: string) => {\n const [reviewsApiResult]: IReviewsApiResult[] = await this.apiSdk.getReviewsData(productId);\n\n return reviewsApiResult.reviews.map((review: IReviewJsonData) => Review.fromJson(review));\n };\n\n @action\n private fetchProductsRating = async () => {\n const stashedProductIds = this.stashedProductIds;\n const stashedPromises = this.stashedPromises;\n this.stashedPromises = [];\n\n if (stashedProductIds.length) {\n this.stashedProductIds = [];\n\n const data = await this.apiSdk.getRatingSnippetsData(stashedProductIds);\n const productRatings = { ...this.productRatings };\n\n this.productRatings = data.reduce((accumulator, dataItem) => {\n accumulator[dataItem.page_id] = ReviewSnippet.fromJson(dataItem);\n\n return accumulator;\n }, productRatings);\n }\n\n this.resolvePromises(stashedPromises);\n };\n\n private createPromise = (productIds: string[]) => {\n return new Promise((resolver, rejecter) => {\n this.stashedPromises.push({\n resolver,\n rejecter,\n productIds\n });\n });\n };\n\n private debounceGetRatings = (productIds: string[]) => {\n const newProductIds = this.getNewProductIdsToStash(productIds);\n\n if (newProductIds.length) {\n clearTimeout(this.ratingsQueryTimeout);\n\n this.stashedProductIds = [...new Set([...this.stashedProductIds, ...newProductIds])];\n this.ratingsQueryTimeout = setTimeout(\n this.fetchProductsRating,\n RATINGS_FETCH_DEBOUNCE_TIMEOUT\n );\n\n return this.createPromise(productIds);\n }\n\n return this.getProductsRatingsById(productIds);\n };\n\n private resolvePromises = (stashedPromises: IStashedPromise[]) => {\n stashedPromises.forEach(this.resolvePromise);\n };\n\n private resolvePromise = (promise: IStashedPromise) => {\n const productReviews = this.getProductsRatingsById(promise.productIds);\n\n promise.resolver(productReviews);\n };\n\n private getProductsRatingsById(productIds: string[]) {\n return productIds.reduce((ratingsList: IProductsRating, productId) => {\n const productRating = this.productRatings[productId];\n const _ratingsList = { ...ratingsList };\n\n _ratingsList[productId] = productRating || this.getEmptyRating(productId);\n\n return _ratingsList;\n }, {});\n }\n\n private getNewProductIdsToStash(productIds: string[]) {\n return productIds.reduce((accumulator: string[], productId) => {\n const newProductIds = [...accumulator];\n\n if (!this.productRatings[productId]) {\n newProductIds.push(productId);\n }\n\n return newProductIds;\n }, []);\n }\n\n private getEmptyRating(pageId: string): ReviewSnippet {\n return ReviewSnippet.fromJson({\n page_id: pageId,\n rollup: {\n average_rating: DEFAULT_AVERAGE_RATING,\n review_count: DEFAULT_REVIEW_COUNT,\n answered_questions: DEFAULT_ANSWERED_QUESTIONS\n }\n });\n }\n}\n","import { diContainer } from '~setup/diContainer';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { ConfigRepository } from '~repositories/ConfigRepository';\n\nexport class RatingsReviewsServiceStartedUseCase {\n private configRepository: ConfigRepository;\n private configs: string[];\n\n constructor(configs: string[]) {\n this.configRepository = diContainer.get(serviceNames.configRepository);\n this.configs = configs;\n }\n\n public execute = async () => {\n await this.configRepository.getConfigs(this.configs);\n };\n}\n","import { root, getServiceVersion, IAppConfig } from '@estee/elc-universal-utils';\nimport { getDecorators } from '@estee/elc-service';\nimport { Container } from 'hypo-container';\nimport { ProductRatingViewController } from '~controllers/ProductRatingViewController';\nimport { ProductReviewsViewController } from '~controllers/ProductReviewsViewController';\nimport { ReviewDetailsViewController } from '~controllers/ReviewDetailsViewController';\nimport { ConfigRepository } from '~repositories/ConfigRepository';\nimport { ProductRepository } from '~repositories/ProductRepository';\nimport { Config } from '~domain/entities/Config';\nimport { RatingsAndReviewsApiSdk } from '~api/RatingsAndReviewsApiSdk';\nimport { ServiceBusController } from './ServiceBusController';\nimport { RatingsReviewsService } from './RatingsReviewsService';\nimport { ConfigStore } from './ConfigStore';\nimport { RatingsRepository } from '~repositories/RatingsRepository';\nimport serviceNames from '~setup/RatingsReviewsService';\nimport { RatingsReviewsServiceStartedUseCase } from '~use-cases/RatingsReviewsServiceStartedUseCase';\n\nexport const diContainer = new Container();\n\nexport const setConfig = (configJSON: IAppConfig) => {\n diContainer.config = configJSON;\n};\n\nasync function serviceInitializer(config: IAppConfig) {\n setConfig(config);\n\n diContainer.get(serviceNames.serviceBusController);\n const useCase = new RatingsReviewsServiceStartedUseCase(['ratingsReviewsConfig', 'brand', 'i18n']);\n await useCase.execute();\n}\n\ndiContainer\n .register(serviceNames.configStore, (c) => new ConfigStore(c.config))\n .register(serviceNames.config, (c) => new Config())\n .register(serviceNames.configRepository, () => new ConfigRepository())\n .register(\n serviceNames.serviceBusController,\n (c) => new ServiceBusController(c.get(serviceNames.ratingsRepository))\n )\n .register(\n serviceNames.ratingsReviewsService,\n () => new RatingsReviewsService(serviceInitializer)\n )\n .register(\n serviceNames.productRatingViewController,\n diContainer.factory(\n (c) =>\n new ProductRatingViewController(\n c.get(serviceNames.productRepository),\n c.get(serviceNames.ratingsRepository)\n )\n )\n )\n .register(\n serviceNames.productReviewsViewController,\n diContainer.factory(\n (c) =>\n new ProductReviewsViewController(\n c.get(serviceNames.config),\n c.get(serviceNames.productRepository)\n )\n )\n )\n .register(serviceNames.ratingsReviewsApiSdk, (c) => {\n const config = {\n httpTransport: c.get(serviceNames.httpTransport),\n configStore: c.get(serviceNames.configStore)\n };\n const reviewSnippetServiceName = serviceNames.ratingsReviewsApiSdk;\n const reviewSnippetServiceVersion = getServiceVersion(reviewSnippetServiceName);\n\n return new RatingsAndReviewsApiSdk(\n config,\n reviewSnippetServiceName,\n reviewSnippetServiceVersion\n );\n })\n .register(serviceNames.httpTransport, (c) => {\n return root.HttpTransport;\n })\n .register(\n serviceNames.productRepository,\n (c) => new ProductRepository(c.get(serviceNames.config))\n )\n .register(serviceNames.ratingsRepository, (c) => new RatingsRepository())\n .register(\n serviceNames.reviewDetailsViewController,\n (c) => new ReviewDetailsViewController(c.get(serviceNames.configStore))\n );\n\nconst { lazyInject } = getDecorators(diContainer);\n\nexport { lazyInject };\n","import { Container } from 'hypo-container';\nexport const getDecorators = (container: Container) => ({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lazyInject: (name?: string) => (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target: any,\n key: string,\n descriptor?: PropertyDescriptor\n ) => {\n const resourceName = name || key;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sbGetter = function (this: any) {\n const resource = container.get(resourceName);\n if (!resource) {\n throw new Error(`The requested ${resourceName} does not exists`);\n }\n\n return resource;\n };\n let propertyDescriptor = descriptor || {};\n if (!descriptor) {\n propertyDescriptor = {\n get: sbGetter\n };\n Object.defineProperty(target, key, propertyDescriptor);\n } else {\n propertyDescriptor.get = sbGetter;\n }\n }\n});\n"],"names":["PRODUCT_REVIEWS_CLASS","ENTER_KEY","ENTER_KEY_CODE","REVIEW_DISPLAY","REVIEW_SNIPPET","QUESTION_DISPLAY","SNAPSHOT_TYPE","PAGINATION_TYPE","REVIEW_COMPONENTS","ReviewDisplay","ReviewSnippet","AVERAGE_RATING","POWER_REVIEWS_SCRIPT","POWER_REVIEWS_API_LINK","TOTAL_NUMBER_OF_STARS","HELPFUL_YES_CLASS","HELPFUL_NO_CLASS","FLAG_REVIEW_CLASS","SORT_BY_ID","MULTI_SELECT_CLASS","MULTI_SELECT_ITEM_CLASS","MULTI_SELECT_BUTTON_LABEL_CLASS","REVIEWS_SEARCH_CLASS","REVIEWS_SEARCH_BUTTON_CLASS","ASK_AND_ANSWER_BUTTON_ID","ASK_AND_ANSWER_FORM_ID","ASK_AND_ANSWER_SEARCH_CLASS","ASK_AND_ANSWER_SEARCH_BUTTON_CLASS","ASK_AND_ANSWER_SORT_BY_ID","ASK_AND_ANSWER_SHOW_MORE_CLASS","DEFAULT_AVERAGE_RATING","DEFAULT_REVIEW_COUNT","DEFAULT_ANSWERED_QUESTIONS","DEFAULT_REVIEW_TITLE","REVIEW_SNAPSHOT_ID","REVIEWS_RATING_CLASS","REVIEWS_PAGINATION_NEXT_BUTTON","REVIEWS_PAGINATION_PREV_BUTTON","REVIEWS_ACTIVE_RATING_FILTER_SELECTOR","ReviewPaginationOption","ReviewClickEventSelectors","ViewController","isLoading","setSSRState","data","this","dataState","setId","id","btoa","unescape","encodeURIComponent","computeRoundedValueFor","number","numberOfDigits","roundMultiplier","Math","pow","round","RatingSelectedUseCase","constructor","selectedIndex","execute","productRatingViewController","setRating","diContainer","get","REVIEW_CATEGORY","RatingsLoadedUseCase","productId","products","query","serviceQueries","filterBy","productIds","productRepository","setProducts","ProductRatingViewController","ratingsRepository","super","selectedRatingIndex","numberOfStars","hasLoaded","loaded","props","defaultRating","reviewCount","reviewsNumber","averageRating","productRating","productItem","product","ratingsLoadedUseCase","getProductRating","socialProofReviewConfig","socialProofReviews","enabled","reviews","getProductReviews","onSelectRating","index","onReadReviewsClick","emit","events","getReviewPayload","onWriteReviewClick","numberOfReviews","getReviewHeadline","maxCharacters","minNumberOfStars","filteredReviews","filter","rating","headline","length","max","floor","random","percentageRating","filteredSocialProofReview","productRatings","productLevelReviews","getProductById","defaultVal","displayName","name","reviewCategory","maxNumberOfCharacters","desktopHeadline","longHeadline","mobileHeadline","shortHeadline","RatingsReviewsBaseController","handleReviewsClickEventHandler","event","eventHandlerData","eventTarget","target","payload","selector","Object","keys","PowerReviews","find","key","closest","handleReviewClickEvents","params","handleMultiSelectItem","handleReviewsSearch","handleAskAndAnswerButton","handleAskAndAnswerSearch","handleReviewsRating","handleReviewsPagination","document","getElementById","handleReviewsChangeEventHandler","selectedValue","value","handleReviewsKeyupEventHandler","isEnterKey","code","addReviewsEventHandlers","productReviewsContainer","querySelector","addEventListener","multiSelectParent","currentItem","hasAttribute","removeAttribute","setAttribute","selectedFlags","getMultiSelectedItems","multiSelectButtonText","getMultiSelectButtonText","join","multiSelectButton","textContent","multiSelectItems","querySelectorAll","forEach","selectItem","selectedFlagContainer","selectedFlagText","push","searchParent","searchBox","searchValue","ratingsElements","getElementsByClassName","ratingsElementsArray","Array","from","targetRatingElement","ratingIndex","indexOf","emitReviewsPaginationClicked","optionSelection","isNextButton","className","includes","isPrevButton","removeReviewsEventHandlers","removeEventListener","ProductReviewsViewController","configStore","activeTab","setPaginationType","paginationType","setPrDisclosureCode","prDisclosureCode","onTabClick","dataset","tab","loadReviews","powerReviewsScript","then","loadPowerReviewsScripts","handleProductReviewsUnmount","type","src","defer","async","onload","emitReviewsInit","body","prepend","showReviews","prScript","createElement","Promise","resolve","config","initialize","numberOfReviewsValue","copyUsableValues","source","ReviewProduct","toJson","reviewProduct","mappingData","url","image_url","imageUrl","description","category_name","categoryName","manufacturer_id","manufacturerId","upc","brand_name","brandName","price","ReviewDetails","reviewDetails","api_key","apiKey","merchant_id","merchantId","merchant_group_id","merchantGroupId","locale","page_id","pageId","review_wrapper_url","reviewWrapperUrl","components","on_render","onRender","on_submit","onSubmit","ReviewDetailsViewController","reviewDetailsData","reviewDetailsRef","isProductInfoVisible","showPageInfo","showReviewOverlay","observeReviewDetails","reviewDetailsContainer","current","MutationObserver","onReviewDetailsLoaded","observe","childList","subtree","mutationList","mutationObserver","mutation","appendProductDetails","disconnect","configs","isReviewLoaded","renderOverlay","loadPowerReviews","script","getElementsByTagName","parentNode","insertBefore","reviewsConfig","ratingsReviewsConfig","reviewDisplayParams","pwr","reviewSnapShotContainer","imageElement","productElement","descriptionElement","productInfoWrapper","alt","innerHTML","appendChild","handleUnmount","ConfigRepository","getConfigs","updateConfig","InventoryStatuses","PowerReviewsProduct","QuestionDisplay","REVIEW_DISPLAY_PAGINATION_TYPE","fromJson","selectedSkuId","prProduct","reviewDisplaySnapshotType","productUrl","shortDescription","defaultCategory","defaultSku","originalPrice","skus","baseUrl","window","location","protocol","hostname","prPageId","reviewUrl","REVIEW_DISPLAY_SNAPSHOT_TYPE","inStock","isInStock","toString","concat","getDefaultImage","in_stock","variants","productVariants","onPrFormSubmit","isOutOfStock","selectedSku","sku","skuId","inventoryStatus","Active","payLoad","queryString","isShaded","reduce","variantAcc","getVariantName","page_id_variant","perlgem","SKU_BASE_ID","shades","sizes","defaultLargeImage","defaultMediumImage","ProductRepository","configService","updateProductId","setSelectedSkuId","listOfProducts","arr","findIndex","i","prod","getPowerReviewsProduct","brand","literal","i18n","localeDependentIdsFiltered","localeDependentIds","localeDependentId","power_reviews_locale","Config","AUTHORIZATION_HEADER_NAME","Api","serviceName","serviceVersion","delete","response","reponseHeaders","httpTransport","e","handleError","debounceInterval","bypassCache","patch","post","put","requestType","originalPayload","logger","error","triggerType","TriggerType","message","context","subdomain","businessUnitId","ELCLogger","addHeader","header","addGlobalHeaders","removeHeader","headerName","removeGlobalHeader","setBearerToken","bearerToken","RatingsAndReviewsApiSdk","buildUrl","pageIds","resource","joinedPageIds","getRatingSnippetsData","results","err","getReviewsData","PowerReviewsInitializedUseCase","powerReviewsProduct","renderReviews","q","arguments","reviewSection","classList","remove","ReadReviewsClickedUseCase","reviewsSection","scrollIntoView","behavior","block","WriteReviewClickedUseCase","reviewInfo","createReviewLink","reviewLink","defaultReviewPath","click","assign","ProductFullLoadedUseCase","UpdateReviewConfigUseCase","newConfig","ServiceBusController","powerReviewsInitialized","powerReviewsInitializedUseCase","readReviewsLinkClicked","writeReviewsLinkClicked","productFullLoaded","updateReviewConfig","updateReviewConfigUseCase","getReviewSnippets","getProductsRating","ConfigStore","reviewSnippet","rollup","average_rating","review_count","answeredQuestions","answered_questions","reviewPercentage","Review","review","details","metrics","RatingsRepository","stashedProductIds","stashedPromises","debounceGetRatings","reviewsApiResult","apiSdk","map","fetchProductsRating","accumulator","dataItem","resolvePromises","createPromise","resolver","rejecter","newProductIds","getNewProductIdsToStash","clearTimeout","ratingsQueryTimeout","Set","setTimeout","getProductsRatingsById","resolvePromise","promise","productReviews","ratingsList","_ratingsList","getEmptyRating","RatingsReviewsServiceStartedUseCase","configRepository","Container","setConfig","configJSON","serviceInitializer","useCase","register","c","RatingsReviewsService","factory","reviewSnippetServiceName","reviewSnippetServiceVersion","lazyInject","container","descriptor","resourceName","sbGetter","Error","propertyDescriptor","defineProperty"],"sourceRoot":""}