{"version":3,"sources":["webpack://fxsWidgets/../src/js/widgets/calendar-common/constants/dateOptions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/localizationActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/store.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/components/ReleaseCountdown.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/helpers/formatDate.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/helpers/render.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/constants/defaultValues.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/eventActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/historicalActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/upcomingActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/helpers/release.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/pushActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/index.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/actions/pastEventActions.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/components/CurrentOrNextRelease.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/components/PreviousRelease.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/components/RecentAndNextContainer.js","webpack://fxsWidgets/../src/js/widgets/calendar-recent-next/index.js","webpack://fxsWidgets/../src/js/widgets/calendar-common/helpers/formatDate.js"],"names":["DATE_OPTIONS","weekday","year","month","day","translations","fetchLocalizations","_ref","store","storeCulture","getState","config","culture","toLowerCase","currentCulture","hasOwnProperty","default","_x","apply","arguments","INITIAL_STATE","calendarApiUrl","CALENDAR_API_URL","timezoneOffset","eventId","marginInHours","event","data","isFetching","fetchError","historical","upcoming","pushConnectionError","isPast","convertCulture","input","Object","keys","includes","ReleaseCountdown","_Component","props","_this","_callSuper","renderCountdown","bind","_inherits","key","value","days","hours","minutes","translate","this","h","class","_ref2","date","onCountdownFinished","Countdown","updateIntervalSeconds","renderSpinner","Spinner","Component","connectWithTranslations","getDateString","locale","split","dateString","toLocaleDateString","replace","pr","Intl","PluralRules","type","getOrdinalDay","select","getDate","splitted","toLocaleTimeString","hour","minute","hour12","renderNumerical","unit","potency","prefix","suffix","renderPotency","concat","potencyTranslations","result","DEFAULT_RENDER_VALUE","received","setState","error","values","mapped","map","x","_objectSpread","convertDateToTimezone","dateUtc","length","actual","revised","ratioDeviation","isBetterThanExpected","isCurrentOrNextRelease","release","Math","abs","differenceInHours","nowDate","mergeRelease","isBetter","mergeReleaseDeviation","subscribeToReleaseUpdates","eventDateId","channels","name","callback","message","EventDateId","_store$getState","releaseValuesReceived","Actual","Revised","IsBetter","_store$getState2","releaseDeviationReceived","RatioDeviation","subscribeToPush","ex","console","log","fetchEvent","_store$getState$confi","eventFetchError","requested","cacheFetch","then","response","ok","json","status","catch","err","fetchHistoricalData","url","fetch","fetchUpcomingData","state","updateIsPast","newPast","CurrentOrNextRelease","_classCallCheck","showSpinners","showSpinnerTimeout","hideSpinnerTimeout","renderDataValue","setShowSpinnersTimeout","setHideSpinnersTimeout","renderCurrent","nextProps","diffSeconds","differenceInSeconds","SPINNER_DURATION_SECONDS","clearTimeout","secondsBeforeIsOver","_this2","setTimeout","_this3","renderValue","showSpinner","_this$props","IconCaretRight","toFixed","consensus","colspan","actions","number","renderNumericalHelper","IconInfoCircle","RecentAndNextContainer","currentOrNextRelease","previousRelease","hideModalConnectionError","nextHistorical","nextUpcoming","id","dir","WidgetError","Modal","handleClose","sectionClassName","PreviousRelease","CalendarRecentNextWidget","createCustomStore","createStore","Provider"],"mappings":"kHAAA,kCAAO,IAAMA,EAAe,CACxBC,QAAS,QACTC,KAAM,UACNC,MAAO,QACPC,IAAK,U,mtTCJIC,EAAe,CACxB,GAAM,kBAAM,iCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,SAAU,kBAAM,kCAAqF,EACrG,QAAS,kBAAM,kCAAmF,EAClG,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,kCAA6E,EACzF,GAAM,kBAAM,iCAA6E,GAGhFC,EAAkB,e,EAAAC,G,EAAG,UAAOC,GACrC,IAAMC,EAAeD,EAAME,WAAWC,OAAOC,QACvCA,EAAUH,EAAeA,EAAaI,cAAgB,KAEtDC,EAAiBT,EAAaU,eAAeH,GAAWA,EAAU,KAGxE,MAAO,CAAEP,oBAFyBA,EAAaS,MAEJE,QAC/C,E,+KAAC,gBAR8BC,GAAA,OAAAV,EAAAW,MAAA,KAAAC,UAAA,KCdzBC,EAAgB,CAClBT,OAAQ,CACJC,QAAS,KACTS,eAAgBC,qCAChBC,eAAgB,EAChBC,QAAS,KACTC,cAAe,IAEnBpB,aAAc,KAEdqB,MAAO,CACHC,KAAM,KACNC,YAAY,EACZC,YAAY,GAEhBC,WAAY,CACRH,KAAM,KACNC,YAAY,EACZC,YAAY,GAEhBE,SAAU,CACNJ,KAAM,KACNC,YAAY,EACZC,YAAY,GAGhBG,qBAAqB,EAErBC,QAAQ,GAGNC,EAAiB,SAACC,GAKpB,OAHIA,GAASC,OAAOC,KAAKhC,GAAciC,SAASH,EAAMtB,eAC5CsB,EAAMtB,cACN,IAEd,E,qCCnCM0B,GAAgB,SAAAC,GAClB,SAAAD,EAAYE,GAAO,IAAAC,EAEwC,OADvDA,EAAAC,EAAA,KAAAJ,EAAA,CAAME,KACDG,gBAAkBF,EAAKE,gBAAgBC,KAAIH,GAAOA,CAC3D,CAAC,O,qRAAAI,CAAAP,EAAAC,G,EAAAD,G,EAAA,EAAAQ,IAAA,kBAAAC,MAED,SAAAzC,GAA0C,IAAxB0C,EAAI1C,EAAJ0C,KAAMC,EAAK3C,EAAL2C,MAAOC,EAAO5C,EAAP4C,QACnBC,EAAcC,KAAKZ,MAAnBW,UACR,OACIE,YAAA,YACK,IACDA,YAAA,QAAMC,MAAM,uBACPH,EAAU,mBAAoB,KAEnCE,YAAA,QAAMC,MAAM,uCAAuCN,EAAO,GAAKA,EAAK,KACpEK,YAAA,QAAMC,MAAM,uBACPN,EAAO,GAEEG,EADG,GAARH,EACe,cACA,aAAe,KAGvCK,YAAA,QAAMC,MAAM,uCAAuCL,EAAQ,GAAKA,EAAM,KACtEI,YAAA,QAAMC,MAAM,uBACPL,EAAQ,GACHE,EADkB,GAATF,EACC,eACA,cAAgB,KAEpCI,YAAA,QAAMC,MAAM,uCAAuCJ,EAAQ,KAC3DG,YAAA,QAAMC,MAAM,uBAEFH,EADM,GAAXD,EACe,iBACA,iBAIhC,GAAC,CAAAJ,IAAA,SAAAC,MAED,SAAAQ,GAAkE,IAAzDC,EAAID,EAAJC,KAAMC,EAAmBF,EAAnBE,oBAA+BnC,EAAciC,EAAxB7C,OAAUY,eAC1C,OACI+B,YAACK,IAAS,CACNF,KAAMA,EACNlC,eAAgBA,EAChBqC,sBAAuB,GACvBC,cAAe,kBAAMP,YAACQ,IAAO,KAAG,EAChClB,gBAAiBS,KAAKT,gBACtBc,oBAAqBA,GAGjC,M,yFAAC,CAjDiB,CAASK,aAoDhBC,gBAAwB,SAAxBA,CAAkCzB,I,uCCtDpC0B,GAAgB,SAACR,EAAM7C,GAChC,GAAI6C,QACA,MAAO,GAGX,IAAIS,EAAStD,EAAQuD,MAAM,KAAK,GAC5BC,EAAaX,EACZY,mBAAmBH,EAAQlE,MAC3BsE,QAAQ,MAAO,IAEdC,EAAK,IAAIC,KAAKC,YAAYP,EAAQ,CAAEQ,KAAM,YAC1CtE,EAAMuE,aAAcJ,EAAGK,OAAOnB,EAAKoB,YAErCC,EAAWV,EAAWD,MAAM,KAiBhC,MAfc,MAAVD,IACAY,EAAS,IAAM1E,GAGnBgE,EACIU,EAAS,GACT,IACAA,EAAS,GACT,IACAA,EAAS,GACT,KACAA,EAAS,GACT,IACArB,EAAKsB,mBAAmB,GAAI,CAAEC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,GAGlF,EClCaC,GAAkB,SAACnC,EAAOoC,EAAMC,EAASjC,GAClD,GAAI,MAAOJ,EACP,MAAO,GAEX,IAAMsC,EAASF,GAAiB,MAATA,EAAeA,EAAO,GACvCG,EAAkB,MAATH,EAAe,MAAQI,GAAcH,EAASjC,GAE7D,MADe,GAAHqC,OAAMH,GAAU,IAAEG,OAAGzC,GAAKyC,OAAGF,GAAU,GAEvD,EAEMC,GAAgB,SAACH,EAASjC,GAC5B,GAAgB,OAAZiC,EACA,MAAO,GAEX,IAAMK,EAAsBtC,EAAU,WAClCuC,EAAS,GAGb,OAFID,GAAuBA,EAAoB3E,eAAesE,KAC1DM,EAASD,EAAoBL,IAC1BM,CACT,E,wBCnBWC,GAAuB,K,0BCM9BC,GAAW,SAACrF,EAAOwC,GACrBxC,EAAMsF,SAAS,CAAEpE,MAAO,CAAEC,KAAMqB,EAAOpB,YAAY,EAAOC,YAAY,IAC1E,EAEMkE,GAAQ,SAACvF,GACXA,EAAMsF,SAAS,CAAEpE,MAAO,CAAEC,KAAM,KAAMC,YAAY,EAAOC,YAAY,IACzE,ECNMgE,GAAW,SAACrF,EAAOwF,GACrB,IAAkBzE,EAAqBf,EAAME,WAArCC,OAAUY,eACZ0E,EAASD,EAAOE,KAAI,SAAAC,GAEtB,OADSC,IAAA,GAAQD,GAAC,IAAE1C,KAAM4C,aAAsBF,EAAEG,QAAS/E,IAE/D,IAEAf,EAAMsF,SAAS,CAAEhE,WAAY,CAAEH,KAAMsE,EAAQrE,YAAY,EAAOC,YAAY,IAChF,EAEMkE,GAAQ,SAACvF,GACXA,EAAMsF,SAAS,CAAEhE,WAAY,CAAEH,KAAM,KAAMC,YAAY,EAAOC,YAAY,IAC9E,ECZMgE,GAAW,SAACrF,EAAOwF,GACrB,IAAkBzE,EAAqBf,EAAME,WAArCC,OAAUY,eACdI,EAAO,GACPqE,GAA4B,IAAlBA,EAAOO,SACjB5E,EAAO,CAAAyE,IAAA,CACHI,OAAQ,KAAMC,QAAS,KAAMC,eAAgB,KAAMC,qBAAsB,MACtEX,EAAO,IAAE,IACZvC,KAAM4C,aAAsBL,EAAO,GAAGM,QAAS/E,OAIvDf,EAAMsF,SAAS,CAAE/D,SAAU,CAAEJ,OAAMC,YAAY,EAAOC,YAAY,IACtE,EAEMkE,GAAQ,SAACvF,GACXA,EAAMsF,SAAS,CAAE/D,SAAU,CAAEJ,KAAM,KAAMC,YAAY,EAAOC,YAAY,IAC5E,E,qCCnBa+E,GAAyB,SAACC,EAASlG,GAC5C,OAAKkG,GAAYlG,EAGJmG,KAAKC,IAAIC,KAAkBH,EAAQpD,KAAMwD,aAAQtG,EAAOY,kBAC/CZ,EAAOc,cAHlB,IAKf,ECPMyF,GAAe,SAACL,EAASL,EAAQC,EAASU,GAAQ,OAAAf,IAAA,GACjDS,GAAO,IACVL,OAAmB,OAAXA,EAAkBA,EAASK,EAAQL,OAC3CC,QAAqB,OAAZA,EAAmBA,EAAUI,EAAQJ,QAC9CE,qBAAsBQ,GAAQ,EAG5BC,GAAwB,SAACP,EAASH,GAAc,OAAAN,IAAA,GAC/CS,GAAO,IACVH,eAAmC,OAAnBA,EAA0BA,EAAiBG,EAAQH,gBAAc,EA6CxEW,GAA4B,SAAC7G,EAAO8G,GAC7C,IAAMC,EAAW,CACb,CACIC,KAAM,gBACNC,SAAU,SAACC,GACHA,EAAQC,cAAgBL,GA/Cd,SAAC9G,EAAOgG,EAAQC,EAASU,GACnD,IAAAS,EAAyCpH,EAAME,WAAvCqB,EAAQ6F,EAAR7F,SAAUD,EAAU8F,EAAV9F,WAEM,OAApBA,EAAWH,MAAiBiF,GAAuB9E,EAAWH,KAAK,GAFnCiG,EAANjH,QAG1BH,EAAMsF,SAAS,CAAEhE,WAAUsE,IAAA,GACpBtE,GAAU,IACbH,KAAM,CACFuF,GAAapF,EAAWH,KAAK,GAAI6E,EAAQC,EAASU,GAClDrF,EAAWH,KAAK,QAGC,OAAlBI,EAASJ,MAChBnB,EAAMsF,SAAS,CAAE/D,SAAQqE,IAAA,GAClBrE,GAAQ,IACXJ,KAAM,CACFuF,GAAanF,EAASJ,KAAK,GAAI6E,EAAQC,EAASU,OAIhE,CA6BoBU,CAAsBrH,EAAOkH,EAAQI,OAAQJ,EAAQK,QAASL,EAAQM,SAE9E,GAEJ,CACIR,KAAM,mBACNC,SAAU,SAACC,GACHA,EAAQC,cAAgBL,GAlCX,SAAC9G,EAAOkG,GACrC,IAAAuB,EAAyCzH,EAAME,WAAvCqB,EAAQkG,EAARlG,SAAUD,EAAUmG,EAAVnG,WAEM,OAApBA,EAAWH,MAAiBiF,GAAuB9E,EAAWH,KAAK,GAFnCsG,EAANtH,QAG1BH,EAAMsF,SAAS,CAAEhE,WAAUsE,IAAA,GACpBtE,GAAU,IACbH,KAAM,CACFyF,GAAsBtF,EAAWH,KAAK,GAAI+E,GAC1C5E,EAAWH,KAAK,QAGC,OAAlBI,EAASJ,MAChBnB,EAAMsF,SAAS,CAAE/D,SAAQqE,IAAA,GAClBrE,GAAQ,IACXJ,KAAM,CACFyF,GAAsBrF,EAASJ,KAAK,GAAI+E,OAIxD,CAgBoBwB,CAAyB1H,EAAOkH,EAAQS,eAEhD,IAIR,IACIC,aAAgB,cAAeb,EACnC,CAAE,MAAOc,GACLC,QAAQvC,MAAM,8BACduC,QAAQC,IAAIF,EAChB,CACJ,EC5Ee,YAAA7H,GAAK,MAAK,CACrBgI,WAAY,WAAK,OLMK,SAAChI,GACvB,IAAAiI,EAA6CjI,EAAME,WAAWC,OAAtDU,EAAcoH,EAAdpH,eAAgBT,EAAO6H,EAAP7H,QAASY,EAAOiH,EAAPjH,SAbnB,SAAChB,GACfA,EAAMsF,SAAS,CAAEpE,MAAO,CAAEC,KAAM,KAAMC,YAAY,EAAM8G,iBAAiB,IAC7E,CAaIC,CAAUnI,GACVoI,aAAW,GAADnD,OAAIpE,EAAc,KAAAoE,OAAI7E,EAAO,mBAAA6E,OAAkBjE,IACpDqH,MAAK,SAAAC,GACEA,EAASC,GACTD,EAASE,OAAOH,MAAK,SAAA7C,GAAM,OAAIH,GAASrF,EAAOwF,EAAO,IAC3B,MAApB8C,EAASG,QAChBpD,GAASrF,EAAO,IAChBuF,GAAMvF,IAENuF,GAAMvF,EAEd,IACC0I,OAAM,SAAAC,GACHb,QAAQvC,MAAMoD,GACdpD,GAAMvF,EACV,GACR,CKzByBgI,CAAWhI,EAAM,EACtC4I,oBAAqB,WAAK,OJWK,SAAC5I,IAlBlB,SAACA,GACfA,EAAMsF,SAAS,CAAEhE,WAAY,CAAEH,KAAM,KAAMC,YAAY,EAAMC,YAAY,IAC7E,CAiBI8G,CAAUnI,GAEV,IAAAiI,EAA6CjI,EAAME,WAAWC,OAAtCC,EAAO6H,EAAP7H,QAASY,EAAOiH,EAAPjH,QAC7B6H,EAAM,GAAH5D,OADegD,EAAdpH,eACmB,KAAAoE,OAAI7E,EAAO,mBAAA6E,OAAkBjE,EAAO,sBAE/D8H,MAAMD,GACDR,MAAK,SAAAC,GACEA,EAASC,GACTD,EAASE,OAAOH,MAAK,SAAA7C,GACjBH,GAASrF,EAAOwF,EACpB,IAC2B,MAApB8C,EAASG,QAChBpD,GAASrF,EAAO,IAChBuF,GAAMvF,IAENuF,GAAMvF,EAEd,IACC0I,OAAM,SAAAC,GACHb,QAAQvC,MAAMoD,GACdpD,GAAMvF,EACV,GACR,CIlCkC4I,CAAoB5I,EAAM,EACxD+I,kBAAmB,WAAK,OHcK,SAAC/I,GAC9B,IAAAiI,EAA6CjI,EAAME,WAAWC,OAAtDU,EAAcoH,EAAdpH,eAAgBT,EAAO6H,EAAP7H,QAASY,EAAOiH,EAAPjH,SAvBnB,SAAChB,GACfA,EAAMsF,SAAS,CAAE/D,SAAU,CAAEJ,KAAM,KAAMC,YAAY,EAAMC,YAAY,IAC3E,CAuBI8G,CAAUnI,GACV8I,MAAM,GAAD7D,OAAIpE,EAAc,KAAAoE,OAAI7E,EAAO,mBAAA6E,OAAkBjE,EAAO,qBACtDqH,MAAK,SAAAC,GACEA,EAASC,GACTD,EAASE,OAAOH,MAAK,SAAA7C,GACjBH,GAASrF,EAAOwF,EACpB,IAC2B,MAApB8C,EAASG,OAChBpD,GAASrF,EAAO,IAEhBuF,GAAMvF,EAEd,IACC0I,OAAM,SAAAC,GACHb,QAAQvC,MAAMoD,GACdpD,GAAMvF,EACV,GACR,CGlCgC+I,CAAkB/I,EAAM,EACpDF,mBAAoB,WAAK,OAAIA,EAAmBE,EAAM,EACtD6G,0BAA2B,SAACmC,EAAOlC,GAAW,OAAKD,GAA0B7G,EAAO8G,EAAY,EAChGmC,aAAc,SAACD,EAAOE,GAAO,OCbL,SAAClJ,EAAOkJ,GAChClJ,EAAMsF,SAAS,CAAE7D,OAAQyH,GAC7B,CDWsCD,CAAajJ,EAAOkJ,EAAQ,EAChE,EEFIC,GAAoB,SAAAnH,GACtB,SAAAmH,EAAYlH,GAAO,IAAAC,EAWoC,O,4FAXpCkH,CAAA,KAAAD,IACfjH,EAAAC,EAAA,KAAAgH,EAAA,CAAMlH,KACD+G,MAAQ,CAAEK,cAAc,GAE7BnH,EAAKoH,mBAAqB,KAC1BpH,EAAKqH,mBAAqB,KAE1BrH,EAAKsH,gBAAkBtH,EAAKsH,gBAAgBnH,KAAIH,GAChDA,EAAKuH,uBAAyBvH,EAAKuH,uBAAuBpH,KAAIH,GAC9DA,EAAKwH,uBAAyBxH,EAAKwH,uBAAuBrH,KAAIH,GAC9DA,EAAKgB,oBAAsBhB,EAAKgB,oBAAoBb,KAAIH,GACxDA,EAAKyH,cAAgBzH,EAAKyH,cAActH,KAAIH,GAAOA,CACvD,CAAC,O,qRAAAI,CAAA6G,EAAAnH,G,EAAAmH,G,EAAA,EAAA5G,IAAA,qBAAAC,MAED,WAAsB,GAAC,CAAAD,IAAA,4BAAAC,MAEvB,SAA0BoH,GACtB,GAAKA,EAAUvD,QAAf,CAEA,IAAMwD,EAAcC,KAChBF,EAAUvD,QAAQpD,KAClBwD,aAAQ5D,KAAKZ,MAAM9B,OAAOY,iBAExBsI,EACF/C,KAAKC,IAAIsD,GAAeE,GAE5BlH,KAAKyC,SAAS,CAAE+D,iBAChBxG,KAAKZ,MAAMgH,aAAaY,GAAe,GAEnCA,EAAcE,GACdlH,KAAK4G,uBAAuBI,GACrBR,GACPxG,KAAK6G,uBAAuBG,GAI5BhH,KAAKmG,MAAMK,cACkB,OAA7BO,EAAUvD,QAAQL,QACmB,OAArC4D,EAAUvD,QAAQH,iBAElBrD,KAAKyC,SAAS,CAAE+D,cAAc,IAC9BW,aAAanH,KAAK0G,oBAxBQ,CA0BlC,GAAC,CAAAhH,IAAA,yBAAAC,MAED,SAAuByH,GAAqB,IAAAC,EAAA,KACxCrH,KAAKyG,mBAAqBa,YAAW,WACjCD,EAAK5E,SAAS,CAAE+D,cAAc,IAC9Ba,EAAKR,wBACT,GAA0D,KAAtDO,EAAsBF,IAC9B,GAAC,CAAAxH,IAAA,yBAAAC,MAED,SAAuByH,GAAqB,IAAAG,EAAA,KACxCvH,KAAK0G,mBAAqBY,YAAW,WACjCC,EAAK9E,SAAS,CAAE+D,cAAc,GAClC,GAA0D,KAAtDY,EAAsBF,IAC9B,GAAC,CAAAxH,IAAA,sBAAAC,MAED,WACIwH,aAAanH,KAAK0G,oBAClB1G,KAAKZ,MAAMgH,cAAa,EAC5B,GAAC,CAAA1G,IAAA,kBAAAC,MAED,SAAgBA,EAAO6H,EAAaC,GAChC,GAAIA,EACA,OAAOxH,YAACQ,IAAO,MACZ,GAAc,OAAVd,EACP,OAAO4C,GAEP,IAAAmF,EAA6B1H,KAAKZ,MAA1Bf,EAAKqJ,EAALrJ,MACR,OACIA,GACAmJ,EAAY7H,EAAOtB,EAAM0D,KAAM1D,EAAM2D,QAHjB0F,EAAT3H,UAMvB,GAAC,CAAAL,IAAA,gBAAAC,MACD,SAAc6D,EAASgD,EAAczG,EAAWxC,GAC5C,OACI0C,YAAA,MAAIC,MAAM,mBACND,YAAA,MAAIC,MAAM,iCACND,YAAC0H,KAAc,OAEnB1H,YAAA,UACIA,YAAA,MAAIC,MAAM,qDACLH,EAAU,uBAEfE,YAAA,KAAGC,MAAM,kDACJsD,EACK5C,GAAc4C,EAAQpD,KAAM7C,GAC5BgF,KAGdtC,YAAA,MACIC,MAAK,8EAAAkC,OACDoB,GACiC,OAAjCA,EAAQF,uBACPE,EAAQF,qBACH,mBACA,sBAGTE,EACKxD,KAAK2G,gBACDnD,EAAQL,OACRrB,GACA0E,GAAmC,OAAnBhD,EAAQL,QAE5BZ,IAEVtC,YAAA,MAAIC,MAAM,8EACLsD,EACKxD,KAAK2G,gBACDnD,EAAQH,gBACR,SAAC1D,GAAK,OAAKA,GAASA,EAAMiI,QAAQ,EAAE,GACpCpB,GAA2C,OAA3BhD,EAAQH,gBAE5Bd,IAEVtC,YAAA,MAAIC,MAAM,8EACLsD,EACKxD,KAAK2G,gBACDnD,EAAQqE,UACR/F,IACA,GAEJS,IAEVtC,YAAA,WAGZ,GAAC,CAAAP,IAAA,SAAAC,MACD,SAAAzC,EAAAiD,GAAmE,IAA1DqD,EAAOtG,EAAPsG,QAASzD,EAAS7C,EAAT6C,UAAWxC,EAAOL,EAAPK,QACzB,OADwCL,EAAN0B,OAE9BoB,KAAK8G,cAActD,EAFoCrD,EAAZqG,aAEDzG,EAAWxC,GAErD0C,YAAA,UACIA,YAAA,WACAA,YAAA,MAAI6H,QAAS,EAAG5H,MAAM,kCACjBsD,GACGvD,YAAA,WACIA,YAAA,MAAIC,MAAM,sBACND,YAAA,QAAMC,MAAM,sCACPH,EAAU,gBAEfE,YAACf,GAAgB,CACbkB,KAAMoD,EAAQpD,KACdC,oBACIL,KAAKK,uBAIjBJ,YAAA,KAAGC,MAAM,4DACJU,GAAc4C,EAAQpD,KAAM7C,MAK7C0C,YAAA,WAGZ,M,yFAAC,CAjKqB,CAASS,aAmKpBC,gBAAwB,iBAAkBoH,GAA1CpH,CAAmD2F,I,aCrK5DxE,GAAkB,SAACkG,EAAQjG,EAAMC,EAASjC,GAC5C,OAAe,OAAXiI,EACOzF,GAEA0F,GAAsBD,EAAQjG,EAAMC,EAASjC,EAE5D,EA4EeY,gBAAwB,iBAAxBA,EA1ES,SAAHzD,GAOf,IANFmB,EAAKnB,EAALmB,MACAmF,EAAOtG,EAAPsG,QACAJ,EAAOlG,EAAPkG,QACArD,EAAS7C,EAAT6C,UACAzC,EAAMJ,EAANI,OACAsB,EAAM1B,EAAN0B,OAEA,OACIqB,YAAA,UACIA,YAAA,WACAA,YAAA,UACIA,YAAA,KAAGC,MAAM,kCACJH,EAAU,gBAEfE,YAAA,KAAGC,MAAM,kDACJsD,EACK5C,GAAc4C,EAAQpD,KAAM9C,EAAOC,SACnCgF,KAGdtC,YAAA,MAAIC,MAAM,cACND,YAAA,QACIC,MAAK,iBAAAkC,OACDxD,EAAS,sBAAwB,GAAE,sDAGtC4E,GAAWnF,EACNyD,GACgB,OAAZsB,EAAmBA,EAAUI,EAAQL,OACrC9E,EAAM0D,KACN1D,EAAM2D,QACNjC,GAEJwC,IAETa,GACGnD,YAAA,OAAKC,MAAM,oBACPD,YAACiI,KAAc,MACfjI,YAAA,QAAMC,MAAM,oBACRD,YAAA,QAAMC,MAAM,qBACPH,EAAU,cAAeyD,EAAQL,YAMtDlD,YAAA,MACIC,MAAK,iBAAAkC,OACDxD,EAAS,sBAAwB,GAAE,iEAGtC4E,GAAsC,OAA3BA,EAAQH,eACdG,EAAQH,eAAeuE,QAAQ,GAC/BrF,IAEVtC,YAAA,MACIC,MAAK,iBAAAkC,OACDxD,EAAS,sBAAwB,GAAE,iEAGtC4E,GAAWnF,EACNyD,GACI0B,EAAQqE,UACRxJ,EAAM0D,KACN1D,EAAM2D,QACNjC,GAEJwC,IAEVtC,YAAA,WAGZ,I,0BC/EMkI,I,UAAsB,SAAAhJ,GACxB,SAAAgJ,EAAY/I,GAAO,IAAAC,EAMb,O,4FANakH,CAAA,KAAA4B,IACf9I,EAAAC,EAAA,KAAA6I,EAAA,CAAM/I,KACD+G,MAAQ,CACTiC,qBAAsB,KACtBC,gBAAiB,KACjBC,0BAA0B,GAC5BjJ,CACN,CAAC,O,qRAAAI,CAAA0I,EAAAhJ,G,EAAAgJ,G,EAAA,EAAAzI,IAAA,qBAAAC,MAED,WACIK,KAAKZ,MAAMnC,qBACX+C,KAAKZ,MAAM+F,aACXnF,KAAKZ,MAAM2G,sBACX/F,KAAKZ,MAAM8G,mBACf,GAAC,CAAAxG,IAAA,4BAAAC,MAED,SAA0BoH,GACtB,IAAAW,EAAyC1H,KAAKZ,MAAtCX,EAAUiJ,EAAVjJ,WAAYC,EAAQgJ,EAARhJ,SACd6J,EAAiBxB,EAAUtI,WAC3B+J,EAAezB,EAAUrI,SAE3B0J,EAAuB,KACvBC,EAAkB,KAEM,OAAxBE,EAAejK,MAAuC,OAAtBkK,EAAalK,OACV,IAA/BiK,EAAejK,KAAK4E,QACpBkF,EACII,EAAalK,KAAK4E,OAAS,EAAIsF,EAAalK,KAAK,GAAK,KAC1D+J,EAAkB,MAGd9E,GAAuBgF,EAAejK,KAAK,GAdnBoJ,EAANpK,SAeW,IAA7BkL,EAAalK,KAAK4E,QAElBkF,EAAuBG,EAAejK,KAAK,GAC3C+J,EACIE,EAAejK,KAAK4E,OAAS,EACvBqF,EAAejK,KAAK,GACpB,OAEV8J,EAAuBI,EAAalK,KAAK,GACzC+J,EAAkBE,EAAejK,KAAK,KAK1C8J,GACiC,OAAhCA,EAAqBjF,QACsB,OAAxCiF,EAAqB/E,gBACN,OAAlB3E,EAASJ,MAAqC,OAApBG,EAAWH,MAEtC0B,KAAKZ,MAAM4E,0BAA0BoE,EAAqBK,KAIlEzI,KAAKyC,SAAS,CACV2F,uBACAC,mBAER,GAAC,CAAA3I,IAAA,SAAAC,MAED,SAAAzC,EAAAiD,GAGE,IAAAkH,EAAA,KAFIhJ,EAAKnB,EAALmB,MAAOI,EAAUvB,EAAVuB,WAAYC,EAAQxB,EAARwB,SAAUC,EAAmBzB,EAAnByB,oBAAqBoB,EAAS7C,EAAT6C,UAAWzC,EAAMJ,EAANI,OAC7D8K,EAAoBjI,EAApBiI,qBAAsBC,EAAelI,EAAfkI,gBAAiBC,EAAwBnI,EAAxBmI,yBAEnC/J,EACFF,EAAME,YAAcE,EAAWF,YAAcG,EAASH,WACpDC,EACFH,EAAMG,YAAcC,EAAWD,YAAcE,EAASF,WAEpD4E,EAAUgF,GAAwBA,EAAqBhF,QAC7D,OACInD,YAAA,OACIC,MAAM,sBACNwI,IAAG,GAAAtG,OAAKrC,EAAU,yBAA2B,MAAQ,SAEpDxB,IAAeC,GAAcyB,YAACQ,IAAO,MACrCjC,GACGyB,YAAC0I,KAAW,CACRtE,QACIpE,YAAA,SACKD,KAAKZ,MAAMW,UACR,2BAEJE,YAAA,WACCD,KAAKZ,MAAMW,UACR,8BAMnBpB,IAAwB2J,GACrBrI,YAAC2I,KAAK,CACFC,YAAa,kBACTxB,EAAK5E,SAAS,CAAE6F,0BAA0B,GAAO,EAErDQ,iBAAiB,uBAEhB/I,EAAU,yBAGjBvB,GACEyB,YAAA,SAAOC,MAAM,kBACTD,YAAA,aACIA,YAAA,UACIA,YAAA,UAAI,KACJA,YAAA,UAAI,KACJA,YAAA,UAAKF,EAAU,WACfE,YAAA,UACIA,YAAA,YACKF,EAAU,0BAEfE,YAAA,OAAKC,MAAM,oBACPD,YAACiI,KAAc,MACfjI,YAAA,QAAMC,MAAM,oBACRD,YAAA,QAAMC,MAAM,qBACXH,EACG,8BAMhBE,YAAA,UACIA,YAAA,QAAMC,MAAM,kBACPH,EAAU,cAEfE,YAAA,QAAMC,MAAM,mBACPH,EAAU,2BAGnBE,YAAA,aAGRA,YAAA,aACIA,YAAC8I,GAAe,CACZ1K,MAAOA,EAAMC,KACb8E,QAASA,EACTI,QAAS6E,IAEbpI,YAACqG,GAAoB,CACjBjI,MAAOA,GAASA,EAAMC,KACtBkF,QAAS4E,EACT7K,QAASD,EAAOC,YAO5C,M,yFAAC,CAxJuB,CAASmD,cA0JtBC,gBACX,2DACAoH,GAFWpH,CAGbwH,ICrJaa,UAfe,SAAA7J,GAC1B,SAAA6J,EAAY5J,GAAO,IAAAC,EAEgB,O,4FAFhBkH,CAAA,KAAAyC,IACf3J,EAAAC,EAAA,KAAA0J,EAAA,CAAM5J,KACDjC,MfkCO,SAACiC,GAIjB,OAHe6J,YAAkB7J,EAAOrB,EAAe,CACnDR,QAASsB,GAGjB,CevCqBqK,CAAY9J,GAAMC,CACnC,CAAC,O,qRAAAI,CAAAuJ,EAAA7J,G,EAAA6J,G,EAAA,EAAAtJ,IAAA,SAAAC,MAED,WACI,OACIM,YAACkJ,WAAQ,CAAChM,MAAO6C,KAAK7C,OAClB8C,YAACkI,GAAsB,MAGnC,M,yFAAC,CAZyB,CAASzH,Y,oCCLvC,kCAAO,IAeMY,EAAgB,SAACvE,GAC1B,OAAQA,GACJ,IAAK,MACD,MAAO,KACX,IAAK,MACD,MAAO,KACX,IAAK,MACD,MAAO,KACX,QACI,MAAO,KAEnB,C","file":"calendar-recent-next.4abbba63eb66df77a295.js","sourcesContent":["export const DATE_OPTIONS = {\r\n    weekday: \"short\",\r\n    year: \"numeric\",\r\n    month: \"short\",\r\n    day: \"numeric\",\r\n};","export const translations = {\r\n    \"ar\": () => import(/*webpackChunkName: 'calendar-recent-next-t-ar'*/\"../translations/ar\"),\r\n    \"de\": () => import(/*webpackChunkName: 'calendar-recent-next-t-de'*/\"../translations/de\"),\r\n    \"en\": () => import(/*webpackChunkName: 'calendar-recent-next-t-en'*/\"../translations/en\"),\r\n    \"es\": () => import(/*webpackChunkName: 'calendar-recent-next-t-es'*/\"../translations/es\"),\r\n    \"fr\": () => import(/*webpackChunkName: 'calendar-recent-next-t-fr'*/\"../translations/fr\"),\r\n    \"id\": () => import(/*webpackChunkName: 'calendar-recent-next-t-id'*/\"../translations/id\"),\r\n    \"ru\": () => import(/*webpackChunkName: 'calendar-recent-next-t-ru'*/\"../translations/ru\"),\r\n    \"tr\": () => import(/*webpackChunkName: 'calendar-recent-next-t-tr'*/\"../translations/tr\"),\r\n    \"zh-cht\": () => import(/*webpackChunkName: 'calendar-recent-next-t-zh-cht'*/\"../translations/zh-cht\"),\r\n    \"zh-cn\": () => import(/*webpackChunkName: 'calendar-recent-next-t-zh-cn'*/\"../translations/zh-cn\"),\r\n    \"vi\": () => import(/*webpackChunkName: 'calendar-recent-next-t-vi'*/\"../translations/vi\"),\r\n    \"fa\": () => import(/*webpackChunkName: 'calendar-recent-next-t-fa'*/\"../translations/fa\"),\r\n    \"pt\": () => import(/*webpackChunkName: 'calendar-recent-next-t-pt'*/\"../translations/pt\"),\r\n    \"cs\": () => import(/*webpackChunkName: 'calendar-recent-next-t-cs'*/\"../translations/cs\"),\r\n}\r\n\r\nexport const fetchLocalizations = async (store) => {\r\n    const storeCulture = store.getState().config.culture\r\n    const culture = storeCulture ? storeCulture.toLowerCase() : 'en'\r\n\r\n    const currentCulture = translations.hasOwnProperty(culture) ? culture : 'en'\r\n    const fetchedTranslations = await translations[currentCulture]()\r\n\r\n    return { translations: fetchedTranslations.default }\r\n}\r\n","import { createCustomStore } from \"../common/helpers/storeHelpers\";\r\nimport { translations } from \"./actions/localizationActions\";\r\n\r\nconst INITIAL_STATE = {\r\n    config: {\r\n        culture: \"en\",\r\n        calendarApiUrl: CALENDAR_API_URL,\r\n        timezoneOffset: 0,\r\n        eventId: null,\r\n        marginInHours: 24,\r\n    },\r\n    translations: null,\r\n\r\n    event: {\r\n        data: null,\r\n        isFetching: true,\r\n        fetchError: false,\r\n    },\r\n    historical: {\r\n        data: null,\r\n        isFetching: true,\r\n        fetchError: false,\r\n    },\r\n    upcoming: {\r\n        data: null,\r\n        isFetching: true,\r\n        fetchError: false,\r\n    },\r\n\r\n    pushConnectionError: false,\r\n\r\n    isPast: false,\r\n};\r\n\r\nconst convertCulture = (input) => {\r\n    const result =\r\n        input && Object.keys(translations).includes(input.toLowerCase())\r\n            ? input.toLowerCase()\r\n            : \"en\";\r\n    return result;\r\n};\r\n\r\nconst createStore = (props) => {\r\n    const result = createCustomStore(props, INITIAL_STATE, {\r\n        culture: convertCulture,\r\n    });\r\n    return result;\r\n};\r\n\r\nexport { createStore };\r\n","import { h, Component } from \"preact\";\r\nimport Countdown from \"../../common/components/Countdown\";\r\nimport Spinner from \"../../common/components/Spinner\";\r\nimport { connectWithTranslations } from \"../../common/helpers/translationsHelpers\";\r\n\r\nclass ReleaseCountdown extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.renderCountdown = this.renderCountdown.bind(this);\r\n    }\r\n\r\n    renderCountdown({ days, hours, minutes }) {\r\n        const { translate } = this.props;\r\n        return (\r\n            <span>\r\n                {\" \"}\r\n                <span class=\"fxs_txt_light_3_clr\">\r\n                    {translate(\"CountdownPrefix\")}{\" \"}\r\n                </span>\r\n                <span class=\"fxs_txt_lightest_clr fxs_txt_italic\">{days > 0 && days} </span>\r\n                <span class=\"fxs_txt_light_3_clr\">\r\n                    {days > 0 &&\r\n                        (days == 1\r\n                            ? translate(\"DaySingular\")\r\n                            : translate(\"DayPlural\"))}{\" \"}\r\n                            \r\n                </span>\r\n                <span class=\"fxs_txt_lightest_clr fxs_txt_italic\">{hours > 0 && hours} </span>\r\n                <span class=\"fxs_txt_light_3_clr\">\r\n                    {hours > 0 && (hours == 1\r\n                        ? translate(\"HourSingular\")\r\n                        : translate(\"HourPlural\"))}{\" \"}\r\n                </span>\r\n                <span class=\"fxs_txt_lightest_clr fxs_txt_italic\">{minutes} </span>\r\n                <span class=\"fxs_txt_light_3_clr\">\r\n                    {minutes == 1\r\n                        ? translate(\"MinuteSingular\")\r\n                        : translate(\"MinutePlural\")}\r\n                </span>\r\n            </span>\r\n        );\r\n    }\r\n\r\n    render({ date, onCountdownFinished, config: { timezoneOffset } }) {\r\n        return (\r\n            <Countdown\r\n                date={date}\r\n                timezoneOffset={timezoneOffset}\r\n                updateIntervalSeconds={60}\r\n                renderSpinner={() => <Spinner />}\r\n                renderCountdown={this.renderCountdown}\r\n                onCountdownFinished={onCountdownFinished}\r\n            />\r\n        );\r\n    }\r\n}\r\n\r\nexport default connectWithTranslations(\"config\")(ReleaseCountdown);\r\n","import { DATE_OPTIONS } from \"../../calendar-common/constants/dateOptions\";\r\nimport { getOrdinalDay } from \"../../calendar-common/helpers/formatDate\";\r\n\r\nexport const getDateString = (date, culture) => {\r\n    if (date === undefined || date === null) {\r\n        return \"\";\r\n    }\r\n\r\n    var locale = culture.split(\"-\")[0];\r\n    var dateString = date\r\n        .toLocaleDateString(locale, DATE_OPTIONS)\r\n        .replace(/,/gi, \"\");\r\n\r\n    const pr = new Intl.PluralRules(locale, { type: \"ordinal\" });\r\n    const day = getOrdinalDay(pr.select(date.getDate()));\r\n\r\n    var splitted = dateString.split(\" \");\r\n\r\n    if (locale == \"en\") {\r\n        splitted[2] += day;\r\n    }\r\n\r\n    dateString =\r\n        splitted[0] +\r\n        \" \" +\r\n        splitted[1] +\r\n        \" \" +\r\n        splitted[2] +\r\n        \", \" +\r\n        splitted[3] +\r\n        \" \" +\r\n        date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\r\n\r\n    return dateString;\r\n};\r\n","export const renderNumerical = (value, unit, potency, translate) => {\r\n    if (typeof value === 'undefined' || value === null)\r\n        return ''\r\n\r\n    const prefix = unit && unit !== '%' ? unit : ''\r\n    const suffix = unit === '%' ? ' % ' : renderPotency(potency, translate)\r\n    const result = `${prefix || ''}${value}${suffix || ''}`\r\n    return result\r\n}\r\n\r\nconst renderPotency = (potency, translate) => {\r\n    if (potency === null)\r\n        return ''\r\n\r\n    const potencyTranslations = translate(\"Potency\")\r\n    let result = ''\r\n    if (potencyTranslations && potencyTranslations.hasOwnProperty(potency))\r\n        result = potencyTranslations[potency]\r\n    return result\r\n  }","export const DEFAULT_RENDER_VALUE = '--'\r\n","import { cacheFetch } from '../../common/helpers/cacheFetchHelpers'\r\n\r\nconst requested = (store) => {\r\n    store.setState({ event: { data: null, isFetching: true, eventFetchError: false } })\r\n}\r\n\r\nconst received = (store, value) => {\r\n    store.setState({ event: { data: value, isFetching: false, fetchError: false } })\r\n}\r\n\r\nconst error = (store) => {\r\n    store.setState({ event: { data: null, isFetching: false, fetchError: true } })\r\n}\r\n\r\nexport const fetchEvent = (store) => {\r\n    const { calendarApiUrl, culture, eventId } = store.getState().config\r\n\r\n    requested(store)\r\n    cacheFetch(`${calendarApiUrl}/${culture}/api/v1/events/${eventId}`)\r\n        .then(response => {\r\n            if (response.ok) {\r\n                response.json().then(values => received(store, values))\r\n            } else if (response.status === 404) {\r\n                received(store, [])\r\n                error(store)\r\n            } else {\r\n                error(store)\r\n            }\r\n        })\r\n        .catch(err => {\r\n            console.error(err)\r\n            error(store)\r\n        })\r\n}\r\n","import { convertDateToTimezone } from '../../common/helpers/dateHelpers'\r\n\r\nconst requested = (store) => {\r\n    store.setState({ historical: { data: null, isFetching: true, fetchError: false } })\r\n}\r\n\r\nconst received = (store, values) => {\r\n    const { config: { timezoneOffset } } = store.getState()\r\n    const mapped = values.map(x => {\r\n        let value = { ...x, date: convertDateToTimezone(x.dateUtc, timezoneOffset) }\r\n        return value\r\n    })\r\n\r\n    store.setState({ historical: { data: mapped, isFetching: false, fetchError: false } })\r\n}\r\n\r\nconst error = (store) => {\r\n    store.setState({ historical: { data: null, isFetching: false, fetchError: true } })\r\n}\r\n\r\nexport const fetchHistoricalData = (store) => {\r\n    requested(store)\r\n\r\n    const { calendarApiUrl, culture, eventId } = store.getState().config\r\n    let url = `${calendarApiUrl}/${culture}/api/v1/events/${eventId}/historical?take=2`\r\n\r\n    fetch(url)\r\n        .then(response => {\r\n            if (response.ok) {\r\n                response.json().then(values => {\r\n                    received(store, values)\r\n                })\r\n            } else if (response.status === 404) {\r\n                received(store, [])\r\n                error(store)\r\n            } else {\r\n                error(store)\r\n            }\r\n        })\r\n        .catch(err => {\r\n            console.error(err)\r\n            error(store)\r\n        })\r\n}\r\n","import { convertDateToTimezone } from '../../common/helpers/dateHelpers'\r\n\r\nconst requested = (store) => {\r\n    store.setState({ upcoming: { data: null, isFetching: true, fetchError: false } })\r\n}\r\n\r\nconst received = (store, values) => {\r\n    const { config: { timezoneOffset } } = store.getState()\r\n    let data = []\r\n    if (values && values.length === 1) {\r\n        data = [{\r\n            actual: null, revised: null, ratioDeviation: null, isBetterThanExpected: null,\r\n            ...values[0],\r\n            date: convertDateToTimezone(values[0].dateUtc, timezoneOffset)\r\n        }]\r\n    }\r\n\r\n    store.setState({ upcoming: { data, isFetching: false, fetchError: false } })\r\n}\r\n\r\nconst error = (store) => {\r\n    store.setState({ upcoming: { data: null, isFetching: false, fetchError: true } })\r\n}\r\n\r\nexport const fetchUpcomingData = (store) => {\r\n    const { calendarApiUrl, culture, eventId } = store.getState().config\r\n\r\n    requested(store)\r\n    fetch(`${calendarApiUrl}/${culture}/api/v1/events/${eventId}/upcoming?take=1`)\r\n        .then(response => {\r\n            if (response.ok) {\r\n                response.json().then(values => {\r\n                    received(store, values)\r\n                })\r\n            } else if (response.status === 404) {\r\n                received(store, [])\r\n            } else {\r\n                error(store)\r\n            }\r\n        })\r\n        .catch(err => {\r\n            console.error(err)\r\n            error(store)\r\n        })\r\n}\r\n","import { differenceInHours } from 'date-fns'\r\nimport { nowDate } from '../../common/helpers/dateHelpers'\r\n\r\nexport const isCurrentOrNextRelease = (release, config) => {\r\n    if (!release || !config)\r\n        return null\r\n\r\n    const diff = Math.abs(differenceInHours(release.date, nowDate(config.timezoneOffset)))\r\n    const result = diff < config.marginInHours\r\n    return result\r\n}","import subscribeToPush from '../../common/helpers/subscribeToPush'\r\nimport { isCurrentOrNextRelease } from '../helpers'\r\n\r\nconst mergeRelease = (release, actual, revised, isBetter) => ({\r\n    ...release,\r\n    actual: actual !== null ? actual : release.actual,\r\n    revised: revised !== null ? revised : release.revised,\r\n    isBetterThanExpected: isBetter\r\n})\r\n\r\nconst mergeReleaseDeviation = (release, ratioDeviation) => ({\r\n    ...release,\r\n    ratioDeviation: ratioDeviation !== null ? ratioDeviation : release.ratioDeviation\r\n})\r\n\r\nconst releaseValuesReceived = (store, actual, revised, isBetter) => {\r\n    const { upcoming, historical, config } = store.getState()\r\n\r\n    if (historical.data !== null && isCurrentOrNextRelease(historical.data[0], config)) {\r\n        store.setState({ historical: {\r\n            ...historical,\r\n            data: [\r\n                mergeRelease(historical.data[0], actual, revised, isBetter),\r\n                historical.data[1]\r\n            ]\r\n        } })\r\n    } else if (upcoming.data !== null) {\r\n        store.setState({ upcoming: {\r\n            ...upcoming,\r\n            data: [\r\n                mergeRelease(upcoming.data[0], actual, revised, isBetter)\r\n            ]\r\n        } })\r\n    }\r\n}\r\n\r\nconst releaseDeviationReceived = (store, ratioDeviation) => {\r\n    const { upcoming, historical, config } = store.getState()\r\n\r\n    if (historical.data !== null && isCurrentOrNextRelease(historical.data[0], config)) {\r\n        store.setState({ historical: {\r\n            ...historical,\r\n            data: [\r\n                mergeReleaseDeviation(historical.data[0], ratioDeviation),\r\n                historical.data[1]\r\n            ]\r\n        } })\r\n    } else if (upcoming.data !== null) {\r\n        store.setState({ upcoming: {\r\n            ...upcoming,\r\n            data: [\r\n                mergeReleaseDeviation(upcoming.data[0], ratioDeviation)\r\n            ]\r\n        } })\r\n    }\r\n}\r\n\r\nexport const subscribeToReleaseUpdates = (store, eventDateId) => {\r\n    const channels = [\r\n        {\r\n            name: 'updatedValues',\r\n            callback: (message) => {\r\n                if (message.EventDateId === eventDateId) {\r\n                    releaseValuesReceived(store, message.Actual, message.Revised, message.IsBetter)\r\n                }\r\n            }\r\n        },\r\n        {\r\n            name: 'updatedDeviation',\r\n            callback: (message) => {\r\n                if (message.EventDateId === eventDateId) {\r\n                    releaseDeviationReceived(store, message.RatioDeviation)\r\n                }\r\n            }\r\n        }\r\n    ]\r\n\r\n    try {\r\n        subscribeToPush('calendarHub', channels)\r\n    } catch (ex) {\r\n        console.error('Could not connect to push.')\r\n        console.log(ex)\r\n    }\r\n}\r\n","import { fetchLocalizations } from './localizationActions'\r\nimport { fetchEvent } from './eventActions'\r\nimport { fetchHistoricalData } from './historicalActions'\r\nimport { fetchUpcomingData } from './upcomingActions'\r\nimport { subscribeToReleaseUpdates } from './pushActions'\r\nimport {updateIsPast} from './pastEventActions'\r\n\r\nexport default store => ({\r\n    fetchEvent: state => fetchEvent(store),\r\n    fetchHistoricalData: state => fetchHistoricalData(store),\r\n    fetchUpcomingData: state => fetchUpcomingData(store),\r\n    fetchLocalizations: state => fetchLocalizations(store),\r\n    subscribeToReleaseUpdates: (state, eventDateId) => subscribeToReleaseUpdates(store, eventDateId),\r\n    updateIsPast: (state, newPast) => updateIsPast(store, newPast),\r\n})","export const updateIsPast = (store, newPast) => {\r\n    store.setState({ isPast: newPast })\r\n}","import { h, Component } from \"preact\";\r\nimport ReleaseCountdown from \"./ReleaseCountdown\";\r\nimport Spinner from \"../../common/components/Spinner\";\r\nimport { connectWithTranslations } from \"../../common/helpers/translationsHelpers\";\r\nimport { nowDate } from \"../../common/helpers/dateHelpers\";\r\nimport { getDateString, renderNumerical } from \"../helpers\";\r\nimport { differenceInSeconds } from \"date-fns\";\r\nimport { DEFAULT_RENDER_VALUE } from \"../constants/defaultValues\";\r\nimport IconCaretRight from \"../../common/components/icons/IconCaretRight\";\r\nimport actions from \"../actions\";\r\nconst SPINNER_DURATION_SECONDS = 60;\r\n\r\nclass CurrentOrNextRelease extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = { showSpinners: false};\r\n\r\n        this.showSpinnerTimeout = null;\r\n        this.hideSpinnerTimeout = null;\r\n\r\n        this.renderDataValue = this.renderDataValue.bind(this);\r\n        this.setShowSpinnersTimeout = this.setShowSpinnersTimeout.bind(this);\r\n        this.setHideSpinnersTimeout = this.setHideSpinnersTimeout.bind(this);\r\n        this.onCountdownFinished = this.onCountdownFinished.bind(this);\r\n        this.renderCurrent = this.renderCurrent.bind(this);\r\n    }\r\n\r\n    componentWillMount() {}\r\n\r\n    componentWillReceiveProps(nextProps) {\r\n        if (!nextProps.release) return;\r\n\r\n        const diffSeconds = differenceInSeconds(\r\n            nextProps.release.date,\r\n            nowDate(this.props.config.timezoneOffset)\r\n        );\r\n        const showSpinners =\r\n            Math.abs(diffSeconds) < SPINNER_DURATION_SECONDS / 2;\r\n            \r\n        this.setState({ showSpinners });\r\n        this.props.updateIsPast(diffSeconds <= 0)\r\n\r\n        if (diffSeconds > SPINNER_DURATION_SECONDS / 2) {\r\n            this.setShowSpinnersTimeout(diffSeconds);\r\n        } else if (showSpinners) {\r\n            this.setHideSpinnersTimeout(diffSeconds);\r\n        }\r\n\r\n        if (\r\n            this.state.showSpinners &&\r\n            nextProps.release.actual !== null &&\r\n            nextProps.release.ratioDeviation !== null\r\n        ) {\r\n            this.setState({ showSpinners: false });\r\n            clearTimeout(this.hideSpinnerTimeout);\r\n        }\r\n    }\r\n\r\n    setShowSpinnersTimeout(secondsBeforeIsOver) {\r\n        this.showSpinnerTimeout = setTimeout(() => {\r\n            this.setState({ showSpinners: true });\r\n            this.setHideSpinnersTimeout();\r\n        }, (secondsBeforeIsOver - SPINNER_DURATION_SECONDS / 2) * 1000);\r\n    }\r\n\r\n    setHideSpinnersTimeout(secondsBeforeIsOver) {\r\n        this.hideSpinnerTimeout = setTimeout(() => {\r\n            this.setState({ showSpinners: false });\r\n        }, (secondsBeforeIsOver + SPINNER_DURATION_SECONDS / 2) * 1000);\r\n    }\r\n\r\n    onCountdownFinished() {\r\n        clearTimeout(this.hideSpinnerTimeout);\r\n        this.props.updateIsPast(true)\r\n    }\r\n\r\n    renderDataValue(value, renderValue, showSpinner) {\r\n        if (showSpinner) {\r\n            return <Spinner />;\r\n        } else if (value === null) {\r\n            return DEFAULT_RENDER_VALUE;\r\n        } else {\r\n            const { event, translate } = this.props;\r\n            return (\r\n                event &&\r\n                renderValue(value, event.unit, event.potency, translate)\r\n            );\r\n        }\r\n    }\r\n    renderCurrent(release, showSpinners, translate, culture) {\r\n        return (\r\n            <tr class=\"fxs_current_row\">\r\n                <td class=\"fxs_txt_highlight_light_4_clr\">\r\n                    <IconCaretRight />\r\n                </td>\r\n                <td>\r\n                    <h4 class=\"fxs_headline_from_small_to_medium fxs_resetMargin\">\r\n                        {translate(\"CurrentDataRelease\")}\r\n                    </h4>\r\n                    <p class=\"fxs_txt_size_xsmall fxs_resetMargin fxs_nowrap\">\r\n                        {release\r\n                            ? getDateString(release.date, culture)\r\n                            : DEFAULT_RENDER_VALUE}\r\n                    </p>\r\n                </td>\r\n                <td\r\n                    class={`fxs_txt_large  fxs_txt_weight_700 fxs_txt_center fxs_txt_italic fxs_nowrap ${\r\n                        release &&\r\n                        release.isBetterThanExpected !== null &&\r\n                        (release.isBetterThanExpected\r\n                            ? \"fxs_positive-txt\"\r\n                            : \"fxs_negative-txt\")\r\n                    }`}\r\n                >\r\n                    {release\r\n                        ? this.renderDataValue(\r\n                              release.actual,\r\n                              renderNumerical,\r\n                              showSpinners && release.actual === null\r\n                          )\r\n                        : DEFAULT_RENDER_VALUE}\r\n                </td>\r\n                <td class=\"fxs_txt_large  fxs_txt_weight_700 fxs_txt_center fxs_txt_italic fxs_nowrap\">\r\n                    {release\r\n                        ? this.renderDataValue(\r\n                              release.ratioDeviation,\r\n                              (value) => value && value.toFixed(2),\r\n                              showSpinners && release.ratioDeviation === null\r\n                          )\r\n                        : DEFAULT_RENDER_VALUE}\r\n                </td>\r\n                <td class=\"fxs_txt_large  fxs_txt_weight_700 fxs_txt_center fxs_txt_italic fxs_nowrap\">\r\n                    {release\r\n                        ? this.renderDataValue(\r\n                              release.consensus,\r\n                              renderNumerical,\r\n                              false\r\n                          )\r\n                        : DEFAULT_RENDER_VALUE}\r\n                </td>\r\n                <td></td>\r\n            </tr>\r\n        );\r\n    }\r\n    render({ release, translate, culture, isPast }, {  showSpinners }) {\r\n        return isPast ? (\r\n            this.renderCurrent(release, showSpinners, translate, culture)\r\n        ) : (\r\n            <tr>\r\n                <td></td>\r\n                <td colspan={4} class=\"fxs_bg_info_clr fxs_txt_center\">\r\n                    {release && (\r\n                        <div>\r\n                            <h3 class=\"fxs_next_countdown\">\r\n                                <span class=\"fxs_txt_light_3_clr fxs_txt_italic\">\r\n                                    {translate(\"NextRelease\")}\r\n                                </span>\r\n                                <ReleaseCountdown\r\n                                    date={release.date}\r\n                                    onCountdownFinished={\r\n                                        this.onCountdownFinished\r\n                                    }\r\n                                />\r\n                            </h3>\r\n                            <p class=\"fxs_txt_size_xsmall fxs_resetMargin fxs_txt_lightest_clr\">\r\n                                {getDateString(release.date, culture)}\r\n                            </p>\r\n                        </div>\r\n                    )}\r\n                </td>\r\n                <td></td>\r\n            </tr>\r\n        );\r\n    }\r\n}\r\nexport default connectWithTranslations(\"config, isPast\", actions)(CurrentOrNextRelease);\r\n","import { h } from \"preact\";\r\nimport FormattedDate from \"../../common/components/FormattedDate\";\r\nimport { connectWithTranslations } from \"../../common/helpers/translationsHelpers\";\r\nimport {\r\n    getDateString,\r\n    renderNumerical as renderNumericalHelper,\r\n} from \"../helpers\";\r\nimport { DEFAULT_RENDER_VALUE } from \"../constants/defaultValues\";\r\nimport IconInfoCircle from \"../../common/components/icons/IconInfoCircle\";\r\n\r\nconst renderNumerical = (number, unit, potency, translate) => {\r\n    if (number === null) {\r\n        return DEFAULT_RENDER_VALUE;\r\n    } else {\r\n        return renderNumericalHelper(number, unit, potency, translate);\r\n    }\r\n};\r\n\r\nconst PreviousRelease = ({\r\n    event,\r\n    release,\r\n    revised,\r\n    translate,\r\n    config,\r\n    isPast,\r\n}) => {\r\n    return (\r\n        <tr>\r\n            <td></td>\r\n            <td>\r\n                <p class=\"fxs_txt_large fxs_resetMargin \">\r\n                    {translate(\"LastRelease\")}\r\n                </p>\r\n                <p class=\"fxs_txt_size_xsmall fxs_resetMargin fxs_nowrap\">\r\n                    {release\r\n                        ? getDateString(release.date, config.culture)\r\n                        : DEFAULT_RENDER_VALUE}\r\n                </p>\r\n            </td>\r\n            <td class=\"fxs_nowrap\">\r\n                <span\r\n                    class={`fxs_txt_large ${\r\n                        isPast ? \"fxs_txt_light_1_clr\" : \"\"\r\n                    } fxs_txt_weight_700 fxs_txt_center fxs_txt_italic`}\r\n                >\r\n                    {release && event\r\n                        ? renderNumerical(\r\n                              revised !== null ? revised : release.actual,\r\n                              event.unit,\r\n                              event.potency,\r\n                              translate\r\n                          )\r\n                        : DEFAULT_RENDER_VALUE}\r\n                </span>\r\n                {revised && (\r\n                    <div class=\"fxs_next_tooltip\">\r\n                        <IconInfoCircle />\r\n                        <span class=\"fxs_next_content\">\r\n                            <span class=\"fxs_next_textnode\">\r\n                                {translate(\"RevisedFrom\", release.actual)}\r\n                            </span>\r\n                        </span>\r\n                    </div>\r\n                )}\r\n            </td>\r\n            <td\r\n                class={`fxs_txt_large ${\r\n                    isPast ? \"fxs_txt_light_1_clr\" : \"\"\r\n                } fxs_txt_weight_700 fxs_txt_center fxs_txt_italic fxs_nowrap`}\r\n            >\r\n                {release && release.ratioDeviation !== null\r\n                    ? release.ratioDeviation.toFixed(2)\r\n                    : DEFAULT_RENDER_VALUE}\r\n            </td>\r\n            <td\r\n                class={`fxs_txt_large ${\r\n                    isPast ? \"fxs_txt_light_1_clr\" : \"\"\r\n                } fxs_txt_weight_700 fxs_txt_center fxs_txt_italic fxs_nowrap`}\r\n            >\r\n                {release && event\r\n                    ? renderNumerical(\r\n                          release.consensus,\r\n                          event.unit,\r\n                          event.potency,\r\n                          translate\r\n                      )\r\n                    : DEFAULT_RENDER_VALUE}\r\n            </td>\r\n            <td></td>\r\n        </tr>\r\n    );\r\n};\r\nexport default connectWithTranslations(\"config, isPast\")(PreviousRelease);\r\n","import { h, Component } from \"preact\";\r\nimport CurrentOrNextRelease from \"./CurrentOrNextRelease\";\r\nimport PreviousRelease from \"./PreviousRelease\";\r\nimport actions from \"../actions\";\r\nimport { isCurrentOrNextRelease } from \"../helpers\";\r\nimport Spinner from \"../../common/components/Spinner\";\r\nimport WidgetError from \"../../common/components/WidgetError\";\r\nimport Modal from \"../../common/components/Modal\";\r\nimport { connectWithTranslations } from \"../../common/helpers/translationsHelpers\";\r\nimport { isMobileOnly } from \"react-device-detect\";\r\nimport IconInfoCircle from \"../../common/components/icons/IconInfoCircle\";\r\n\r\nclass RecentAndNextContainer extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            currentOrNextRelease: null,\r\n            previousRelease: null,\r\n            hideModalConnectionError: false,\r\n        };\r\n    }\r\n\r\n    componentWillMount() {\r\n        this.props.fetchLocalizations();\r\n        this.props.fetchEvent();\r\n        this.props.fetchHistoricalData();\r\n        this.props.fetchUpcomingData();\r\n    }\r\n\r\n    componentWillReceiveProps(nextProps) {\r\n        const { historical, upcoming, config } = this.props;\r\n        const nextHistorical = nextProps.historical;\r\n        const nextUpcoming = nextProps.upcoming;\r\n\r\n        let currentOrNextRelease = null;\r\n        let previousRelease = null;\r\n\r\n        if (nextHistorical.data !== null && nextUpcoming.data !== null) {\r\n            if (nextHistorical.data.length === 0) {\r\n                currentOrNextRelease =\r\n                    nextUpcoming.data.length > 0 ? nextUpcoming.data[0] : null;\r\n                previousRelease = null;\r\n            } else {\r\n                if (\r\n                    isCurrentOrNextRelease(nextHistorical.data[0], config) ||\r\n                    nextUpcoming.data.length === 0\r\n                ) {\r\n                    currentOrNextRelease = nextHistorical.data[0];\r\n                    previousRelease =\r\n                        nextHistorical.data.length > 1\r\n                            ? nextHistorical.data[1]\r\n                            : null;\r\n                } else {\r\n                    currentOrNextRelease = nextUpcoming.data[0];\r\n                    previousRelease = nextHistorical.data[0];\r\n                }\r\n            }\r\n\r\n            if (\r\n                currentOrNextRelease &&\r\n                (currentOrNextRelease.actual === null ||\r\n                    currentOrNextRelease.ratioDeviation === null) &&\r\n                (upcoming.data === null || historical.data === null)\r\n            ) {\r\n                this.props.subscribeToReleaseUpdates(currentOrNextRelease.id);\r\n            }\r\n        }\r\n\r\n        this.setState({\r\n            currentOrNextRelease,\r\n            previousRelease,\r\n        });\r\n    }\r\n\r\n    render(\r\n        { event, historical, upcoming, pushConnectionError, translate, config },\r\n        { currentOrNextRelease, previousRelease, hideModalConnectionError }\r\n    ) {\r\n        const isFetching =\r\n            event.isFetching || historical.isFetching || upcoming.isFetching;\r\n        const fetchError =\r\n            event.fetchError || historical.fetchError || upcoming.fetchError;\r\n\r\n        const revised = currentOrNextRelease && currentOrNextRelease.revised;\r\n        return (\r\n            <div\r\n                class=\"fxs_widget fxs_next\"\r\n                dir={`${translate(\"IsRightToLeftOriented\") ? \"rtl\" : \"auto\"}`}\r\n            >\r\n                {isFetching && !fetchError && <Spinner />}\r\n                {fetchError && (\r\n                    <WidgetError\r\n                        message={\r\n                            <p>\r\n                                {this.props.translate(\r\n                                    \"WidgetErrorMessageLine1\"\r\n                                )}\r\n                                <br />\r\n                                {this.props.translate(\r\n                                    \"WidgetErrorMessageLine2\"\r\n                                )}\r\n                            </p>\r\n                        }\r\n                    />\r\n                )}\r\n                {pushConnectionError && !hideModalConnectionError && (\r\n                    <Modal\r\n                        handleClose={() =>\r\n                            this.setState({ hideModalConnectionError: true })\r\n                        }\r\n                        sectionClassName=\"fxs_next_modal-main\"\r\n                    >\r\n                        {translate(\"ErrorConnectMessage\")}\r\n                    </Modal>\r\n                )}\r\n                {!fetchError && (\r\n                    <table class=\"fxs_next_table\">\r\n                        <thead>\r\n                            <tr>\r\n                                <th> </th>\r\n                                <th> </th>\r\n                                <th>{translate(\"Actual\")}</th>\r\n                                <th>\r\n                                    <span>\r\n                                        {translate(\"DeviationAbbreviation\")}\r\n                                    </span>\r\n                                    <div class=\"fxs_next_tooltip\">\r\n                                        <IconInfoCircle />\r\n                                        <span class=\"fxs_next_content\">\r\n                                            <span class=\"fxs_next_textnode\">\r\n                                            {translate(\r\n                                                \"HeaderDeviationTooltip\"\r\n                                            )}\r\n                                            </span>\r\n                                        </span>\r\n                                    </div>\r\n                                </th>\r\n                                <th>\r\n                                    <span class=\"fxs_hidden_680\">\r\n                                        {translate(\"Consensus\")}\r\n                                    </span>\r\n                                    <span class=\"fxs_visible_680\">\r\n                                        {translate(\"ConsensusAbbreviation\")}\r\n                                    </span>\r\n                                </th>\r\n                                <th></th>\r\n                            </tr>\r\n                        </thead>\r\n                        <tbody>\r\n                            <PreviousRelease\r\n                                event={event.data}\r\n                                revised={revised}\r\n                                release={previousRelease}\r\n                            />\r\n                            <CurrentOrNextRelease\r\n                                event={event && event.data}\r\n                                release={currentOrNextRelease}\r\n                                culture={config.culture}\r\n                            />\r\n                        </tbody>\r\n                    </table>\r\n                )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\nexport default connectWithTranslations(\r\n    \"event, historical, upcoming, pushConnectionError, config\",\r\n    actions\r\n)(RecentAndNextContainer);\r\n","import { h, Component } from 'preact'\r\nimport { Provider } from 'unistore/preact'\r\nimport { createStore } from './store'\r\nimport RecentAndNextContainer from './components/RecentAndNextContainer'\r\n\r\nclass CalendarRecentNextWidget extends Component {\r\n    constructor(props) {\r\n        super(props)\r\n        this.store = createStore(props)\r\n    }\r\n\r\n    render() {\r\n        return (\r\n            <Provider store={this.store}>\r\n                <RecentAndNextContainer />\r\n            </Provider>\r\n        )\r\n    }\r\n}\r\n\r\nexport default CalendarRecentNextWidget","export const getPostDateString = (date, culture) => {\r\n    if (date === undefined || date === null) {\r\n        return \"\";\r\n    }\r\n\r\n    var locale = culture.split('-')[0];\r\n    var month = new Intl.DateTimeFormat(locale, { month: 'long' }).format(date)\r\n    \r\n    var splittedDate = date.toString().split(\" \");\r\n    var splittedHours = splittedDate[4].split(\":\");\r\n    var eventDate = month + \" \" + splittedDate[2] + \", \" + splittedHours[0] + \":\" + splittedHours[1] + \" GMT\";\r\n\r\n    return eventDate;\r\n};\r\n\r\nexport const getOrdinalDay = (day) => {\r\n    switch (day) {\r\n        case \"one\":\r\n            return \"st\";\r\n        case \"two\":\r\n            return \"nd\";\r\n        case \"few\":\r\n            return \"rd\";\r\n        default:\r\n            return \"th\";\r\n    }\r\n};\r\n"],"sourceRoot":""}