{"version":3,"sources":["assets/carparkwhere_banner_compressed_v3.gif","pages/Header/Header.js","styles/header.js","hooks/useLocationLoader.js","styles/inputArea.js","components/InputArea/LocationAutoComplete.js","constants/index.js","Store/StoreContext.js","Store/storeInits.js","Store/useStore.js","Store/index.js","components/InputArea/InputArea.js","utils/getCarparks.js","components/InputArea/ShowFieldButton.js","components/InputArea/InputAreaContainer.js","pages/Home/HomeMain.js","styles/home.js","pages/Results/CarparkMap.js","styles/carpark.js","components/CarparkList/CostBreakdownDialog.js","components/CarparkList/CarparkCard.js","components/Loading/index.js","styles/loading.js","components/CarparkList/CarparkList.js","components/CarparkList/CarparkListContainer.js","pages/Results/ResultsMain.js","styles/results.js","styles/about.js","pages/About/InfoCard.js","pages/About/index.js","pages/ContactUs/index.js","styles/app.js","styles/faq.js","pages/Faq/FaqAccordion.js","pages/Faq/index.js","pages/NotFound/index.js","App.js","styles/theme.js","Root.js","index.js"],"names":["module","exports","useStyles","makeStyles","root","flexDirection","width","title","flexGrow","mainButton","height","marginLeft","toolbarButtons","linkButton","margin","padding","backgroundColor","color","imageIcon","iconRoot","textAlign","marginRight","Header","classes","AppBar","position","className","elevation","Toolbar","Button","component","Link","to","search","query","a","axios","get","params","searchVal","returnGeom","getAddrDetails","pageNum","data","display","minHeight","paddingTop","props","factor","paddingBottom","theme","palette","text","secondary","alignItems","justifyContent","timeWrapper","marginTop","buttonHeader","input","borderColor","marginBottom","smallText","alignSelf","pickerInput","button","slider","showSearchButton","fontSize","fontWeight","transform","select","showInput","borderRadius","zIndex","inputArea","LocationAutoComplete","selectedAddress","handleSelectedAddress","setQuery","currLocation","useState","loading","setLoading","addr","mapResults","setMapResults","useEffect","results","finalResults","map","result","lat","LATITUDE","long","LONGITUDE","ADDRESS","getMapResults","useLocationLoader","useTheme","Autocomplete","id","options","value","freeSolo","onChange","event","newValue","inputValue","onInputChange","newInputValue","getOptionLabel","option","renderInput","TextField","label","variant","InputProps","durationOptions","Array","keys","i","distanceOptions","devInfo","name","desc","linkedIn","github","imgLink","gifMap","1","2","3","4","faqContent","answer","StoreContext","createContext","displayName","initialState","locationCapable","preLoaded","displayedCp","selectedCp","address","start","moment","format","HTML5_FMT","DATETIME_LOCAL","duration","radius","currentPos","reducer","state","action","payload","type","Object","assign","preloaded","useContext","CommonsContext","store","dispatch","StoreProvider","children","subappName","useReducer","Provider","inputarea","InputArea","selectedDate","handleDateChange","handleDurationChange","onSearchClick","defaultShowSearch","showHiddenElements","hideHiddenElements","handleRadius","setCurrLocationAsParam","setUseCurrLocation","useStore","generateRadiusLabel","index","newVal","toFixed","Paper","Container","IconButton","disabled","onClick","Typography","e","target","console","log","InputLabelProps","shrink","FormControl","InputLabel","htmlFor","Select","native","inputProps","opt","key","hours","minutes","generateDurationLabel","Slider","defaultValue","getAriaValueText","valueLabelFormat","aria-labelledby","valueLabelDisplay","step","marks","min","max","latStr","longStr","startTime","durationTime","date","parseFloat","durationString","toISOString","split","toLowerCase","post","res","ShowFieldButton","showInputArea","clickToToggleInput","size","InputAreaContainer","initialQuery","errorMsgHandler","history","useHistory","handleShowInputArea","carparkAction","parsedAddress","getCarparks","then","carparks","resString","JSON","stringify","sessionStorage","setItem","push","catch","err","response","alert","containerProps","navigator","geolocation","getCurrentPosition","currAddr","coords","latitude","longitude","code","message","length","found","Collapse","in","header","maxWidth","maxHeight","HomeMain","src","headerImg","alt","Google","client","slot","style","layout","RedIcon","L","Icon","iconUrl","iconRetinaUrl","iconAnchor","popupAnchor","iconSize","shadowUrl","shadowSize","shadowAnchor","BlueIcon","DefaultIcon","Default","CarparkMap","generateLat","generateLong","renderGmapLink","center","Map","zoom","TileLayer","attribution","url","cp","Lat","Long","Name","Marker","icon","openPopup","Popup","Cost","toString","href","Circle","stroke","fillOpacity","borderWidth","cardContent","costBreakdownList","paddingLeft","paddingRight","costBreakdown","redText","orangeText","greenText","blackText","cpName","lineHeight","descriptionContainer","priceContainer","priceText","bottom","right","carpark","CostBreakdownDialog","breakdown","parseTo12hr","timeStr","h","substr","hour","ampm","TableContainer","CardContent","Table","TableHead","TableRow","TableCell","TableBody","row","Description","Timerangestr","Start","End","CarparkCard","cpLots","cost","carparkType","gantryHeight","distance","lots","expanded","setExpanded","Card","Grid","container","item","xs","align","generateCPDescription","renderLotsInfo","CardActions","timeout","unmountOnExit","backdrop","paper","alignContent","top","gifloader","loader","Loading","setLoader","rng","Math","floor","random","Backdrop","open","frameBorder","LinearProgress","CarparkList","sortMode","handleChange","hideClosedCp","setHideClosedCp","closedCarparksExist","carparkList","disableTracksWidthCompensation","filter","IsRecommended","Type","GantryHeight","Distance","AvailableLots","CostBreakdownList","renderRecommended","Tabs","indicatorColor","textColor","aria-label","Tab","CarparkListContainer","setSortMode","setClosedCarparksExist","intermediateList","some","bd","IsClosed","slice","sort","b","componentProps","carparkRoot","locationButton","float","ResultsMain","getItem","parse","addrString","card","media","devText","paragraph","iconRow","about","InfoCard","person","reverse","info","CardMedia","gutterBottom","AboutUs","ContactUs","left","overflow","accordionList","faq","FaqAccordion","Accordion","AccordionSummary","expandIcon","aria-controls","heading","AccordionDetails","Faq","NotFound","App","disableGutters","app","path","exact","createMuiTheme","breakpoints","sm","light","main","dark","primary","typography","htmlFontSize","fontFamily","join","Root","ThemeProvider","utils","MomentUtils","ReactDOM","render","document","querySelector"],"mappings":"iGAAAA,EAAOC,QAAU,IAA0B,+D,gLCMrCC,EAAYC,YCLH,CACbC,KAAM,CACJC,cAAe,MACfC,MAAO,QAETC,MAAO,CACLC,SAAU,GAEZC,WAAY,CACVC,OAAQ,OACRJ,MAAO,OACPK,WAAY,OAEdC,eAAgB,CACdD,WAAY,QAEdE,WAAY,CACVC,OAAQ,UACRC,QAAS,kBACT,UAAW,CACTC,gBAAiB,mBACjBC,MAAO,UAGXC,UAAW,CACTR,OAAQ,QAEVS,SAAU,CACRC,UAAW,SACXC,YAAa,UDKFC,EA3BA,WACb,IAAMC,EAAUrB,IAChB,OACE,6BACE,kBAACsB,EAAA,EAAD,CAAQP,MAAM,UAAUQ,SAAS,SAASC,UAAWH,EAAQnB,KAAMuB,UAAW,GAC5E,kBAACC,EAAA,EAAD,KAIE,kBAACC,EAAA,EAAD,CAAQH,UAAWH,EAAQV,WAAYiB,UAAWC,IAAMd,MAAM,UAAUe,GAAG,KAA3E,UAGA,kBAACH,EAAA,EAAD,CAAQH,UAAWH,EAAQV,WAAYiB,UAAWC,IAAMd,MAAM,UAAUe,GAAG,UAA3E,SAGA,kBAACH,EAAA,EAAD,CAAQH,UAAWH,EAAQV,WAAYiB,UAAWC,IAAMd,MAAM,UAAUe,GAAG,QAA3E,OAGA,kBAACH,EAAA,EAAD,CAAQH,UAAWH,EAAQV,WAAYiB,UAAWC,IAAMd,MAAM,UAAUe,GAAG,YAA3E,kB,gMEvBGC,EAAM,uCAAG,WAAOC,GAAP,iBAAAC,EAAA,sEACCC,IAAMC,IACvB,sDACA,CACEC,OAAQ,CACNC,UAAWL,EACXM,WAAY,IACZC,eAAgB,IAChBC,QAAS,OARG,uBACbC,EADa,EACbA,KADa,kBAYbA,GAZa,2CAAH,sDCHJ,GACbvC,KAAM,CACJwC,QAAS,OACTvC,cAAe,SACfwC,UAAW,OACXC,WAAY,SAACC,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OACZC,cAAe,SAACF,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OACfrC,WAAY,EACZU,YAAa,EACbN,QAAS,WACTE,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,WAC3CC,WAAY,SACZC,eAAgB,UAElBC,YAAa,CACXC,UAAW,SAACV,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OACXJ,QAAS,OACTvC,cAAe,MACfC,MAAO,MACPiD,eAAgB,iBAElBG,aAAc,CACZd,QAAS,OACTvC,cAAe,MACfkD,eAAgB,iBAElBI,MAAO,CACL,4BAA6B,CAC3B1C,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7C,2BAA4B,CAC1B,aAAc,CACZO,YAAa,SAACb,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,WACjDpC,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7CpC,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7C/C,MAAO,MACPmD,UAAW,SAACV,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OACXa,aAAc,SAACd,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OACdrC,WAAY,EACZU,YAAa,GAEfyC,UAAW,CACTC,UAAW,aACXpD,WAAY,QAGdqD,YAAa,CACX,kBAAmB,CACjB/C,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7C,aAAc,CACZO,YAAa,SAACb,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,WACjDpC,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7C,UAAW,CACTpC,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,YAE7CpC,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,WAC3C/C,MAAO,MACPuD,aAAc,SAACd,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,QAEhBiB,OAAQ,CACNR,UAAW,SAACV,GAAD,gBAA6B,EAAfA,EAAMC,OAApB,OAEX1C,MAAO,OAET4D,OAAQ,CACN5D,MAAO,MACPW,MAAO,SAAC8B,GAAD,OAAWA,EAAMG,MAAMC,QAAQC,KAAKC,WAC3C,wBAAyB,CACvBI,UAAW,SAACV,GAAD,OAAWA,EAAMoB,iBAAmB,SAAW,IAE5D,oBAAqB,CACnB7D,MAAO,MACPK,WAAY,QAEd,4CAA6C,CAC3CyD,SAAU,SACVC,WAAY,IACZC,UAAW,2CAEb,0BAA2B,CACzBF,SAAU,SACVC,WAAY,MAGhBE,OAAQ,CACNjE,MAAO,OAETkE,UAAW,CACTC,aAAc,EACdnE,MAAO,OACPI,OAAQ,SACRqD,UAAW,SACXtC,SAAU,WACViD,OAAQ,QC1FNxE,EAAYC,YAAWwE,GA6CdC,EA3Cc,SAAC,GAA6E,IAA5EC,EAA2E,EAA3EA,gBAAiBC,EAA0D,EAA1DA,sBAAuB5C,EAAmC,EAAnCA,MAAO6C,EAA4B,EAA5BA,SAAUC,EAAkB,EAAlBA,aAAkB,EFSzE,SAAC9C,GAAW,IAAD,EACZ+C,oBAAS,GADG,mBACnCC,EADmC,KAC1BC,EAD0B,OAENF,mBAAS,CAAC,CAACG,KAAM,gBAFX,mBAEnCC,EAFmC,KAEvBC,EAFuB,KAuB1C,OApBAC,qBAAU,WAAM,4CACd,8BAAApD,EAAA,sEAEIgD,GAAW,GAFf,SAG0BlD,EAAOC,GAHjC,OAGUsD,EAHV,OAIIL,GAAW,GACLM,EAAeD,EAAQA,QAAQE,KAAI,SAACC,GAExC,MADY,CAACC,IAAKD,EAAOE,SAAUC,KAAMH,EAAOI,UAAWX,KAAMO,EAAOK,YAG1EV,EAAcG,GATlB,kDAWIN,GAAW,GACXG,EAAc,CAAC,CAACF,KAAM,eAZ1B,2DADc,sBAgBA,KAAVlD,GAhBW,WAAD,wBAiBZ+D,KAED,CAAC/D,IACG,CAACgD,EAASG,GE/Baa,CAAkBhE,GADwD,mBACjGgD,EADiG,KACxFG,EADwF,KAGlGnC,EAAQiD,cACR5E,EAAUrB,EAAU,CAACgD,UAC3B,OACE,kBAACkD,EAAA,EAAD,CACE1E,UAAWH,EAAQoC,MACnB0C,GAAG,iBACHC,QAASpB,EAAU,CAAC,CAACE,KAAM,aAAeC,EAC1CkB,MAAO1B,EACP2B,UAAQ,EACRC,SAAU,SAACC,EAAOC,GACZA,IAAa3B,GACfF,EAAsB6B,IAG1BC,WAAY1E,EACZ2E,cAAe,SAACH,EAAOI,GAChB9B,GACHD,EAAS+B,IAGbC,eAAgB,SAACC,GACf,OAAIA,EAAO5B,KACF4B,EAAO5B,KAET,IAET6B,YAAa,SAAC3E,GAAD,OAAa,kBAAC4E,EAAA,EAAD,iBACpB5E,EADoB,CAExB+D,GAAG,iBACHc,MAAM,yBACNC,QAAQ,WACRC,WAAU,eACL/E,EAAO+E,mB,QCzCPC,EAAkB,YAAIC,MAAM,IAAIC,QAAQ9B,KAAK,SAAC+B,GAAD,OAAW,GAAJA,KACpDC,EAAkB,YAAIH,MAAM,GAAGC,QAAQ9B,KAAK,SAAC+B,GAAD,OAAe,KAAPA,EAAE,MAEtDE,EAAU,CACrB,GAAM,CACJC,KAAM,WACNC,KAAM,yEACNC,SAAU,2CACVC,OAAQ,gCACRC,QAAS,eAEX,GAAM,CACJJ,KAAM,WACNC,KAAM,yDACNC,SAAU,wDACVC,OAAQ,6BACRC,QAAS,gBAIAC,EAAS,CACpBC,EAAG,wCACHC,EAAG,6CACHC,EAAG,yCACHC,EAAG,8CAKQC,EAAa,CACxB,CAAC/H,MAAM,4BAA8BgI,OAAO,2DAC5C,CAAChI,MAAM,gDAAkDgI,OAAO,oHAChE,CACEhI,MAAM,2EACNgI,OAAO,qqBAOT,CACEhI,MAAM,yFACNgI,OAAQ,mJC3CNC,EAAeC,wBAAc,MACnCD,EAAaE,YAAc,cAEZF,QCJFG,EAAe,CAC1BzD,SAAS,EACT0D,iBAAiB,EACjBC,WAAW,EACXlG,KAAM,GACNmG,YAAa,GACbC,WAAY,KACZzG,OAAQ,CACN0G,QAAS,GACTC,MAAOC,MAASC,OAAOD,IAAOE,UAAUC,gBACxCC,SAAU,GACVC,OAAQ,KAEVC,WAAY,MAGDC,EAAU,SAACC,EAAOC,GAAY,IAClCC,EAAWD,EAAXC,QACP,OAAQD,EAAOE,MACb,IAAK,6BAEH,OADAH,EAAMd,gBAAkBgB,EACjBE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,gBAEH,OADAA,EAAMM,UAAYJ,EACXE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,aAGH,OADAA,EAAM/G,KAAOiH,GAAW,GACjBE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,cAEH,OADAA,EAAMxE,QAAU0E,EACTE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,aAEH,OADAA,EAAMpH,OAASsH,EACRE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,mBAEH,OADAA,EAAMZ,YAAcc,EACbE,OAAOC,OAAO,GAAIL,GAC3B,IAAK,kBAEH,OADAA,EAAMX,WAAaa,EACZE,OAAOC,OAAO,GAAIL,GAC3B,QACE,OAAOA,ICzCE,aAAO,IAAD,EACOO,qBAAWC,GACrC,MAAO,CAACC,MAFW,EACZA,MACQC,SAFI,EACLA,WCCHC,EAAgB,SAAC,GAAiC,IAAhCC,EAA+B,EAA/BA,SAA+B,IAArBC,kBAAqB,MAAV,KAAU,EACxDA,IACF/B,EAAaE,YAAb,UAA8B6B,EAA9B,UAF0D,MAIlCC,qBAAWf,EAASd,GAJc,mBAIrDwB,EAJqD,KAI9CC,EAJ8C,KAK5D,OAAO,kBAAC,EAAaK,SAAd,CAAuBlE,MAAO,CAAC4D,QAAOC,aAAYE,ICCrDpK,GAAYC,YAAWuK,GA4HdC,GA1HG,SAAC,GAmBZ,IAlBLC,EAkBI,EAlBJA,aACAC,EAiBI,EAjBJA,iBACAvB,EAgBI,EAhBJA,SACAwB,EAeI,EAfJA,qBACAC,EAcI,EAdJA,cACA5G,EAaI,EAbJA,iBACAU,EAYI,EAZJA,gBACAC,EAWI,EAXJA,sBAGAkG,GAQI,EAVJC,mBAUI,EATJC,mBASI,EARJF,mBACAzB,EAOI,EAPJA,OACA4B,EAMI,EANJA,aACAjJ,EAKI,EALJA,MACA6C,EAII,EAJJA,SACAqG,EAGI,EAHJA,uBACApG,EAEI,EAFJA,aACAqG,EACI,EADJA,mBAEMnI,EAAQiD,cAER5E,EAAUrB,GAAU,CAACgD,QAAOF,OADnBgI,EAAoB,EAAI,EACG7G,qBACnCgG,EAASmB,IAATnB,MAIDoB,EAAsB,SAAChF,EAAOiF,GAClC,GAAIjF,EAAQ,IACV,MAAM,GAAN,OAAUA,EAAV,KAEA,IAAMkF,GAAUlF,EAAQ,KAAMmF,QAAQ,GACtC,MAAM,GAAN,OAAUD,EAAV,OAaJ,OACE,kBAACE,EAAA,EAAD,CAAOjK,UAAWH,EAAQnB,KAAM0B,UAAW8J,IAAWxE,QAAQ,YAC5D,yBAAK1F,UAAWH,EAAQiC,aACtB,kBAAC,EAAD,CAAsBqB,gBAAiBA,EAAiBC,sBAAuBA,EAAuB5C,MAAOA,EAAO6C,SAAUA,EAAUC,aAAcA,IACtJ,kBAAC6G,EAAA,EAAD,CAAY5K,MAAO+D,EAAe,YAAc,UAAW8G,UAAW3B,EAAMvB,gBAAiBmD,QAAS,WAC/F/G,EAGHqG,GAAmB,GAFnBD,MAKF,kBAAC,IAAD,QAGHpG,EAAe,kBAACgH,EAAA,EAAD,CAAY5E,QAAQ,YAAYnG,MAAM,YAAYS,UAAWH,EAAQuC,WAArE,+BAA2H,GAC3I,yBAAKpC,UAAWH,EAAQiC,aACtB,kBAAC0D,EAAA,EAAD,CACExF,UAAWH,EAAQyC,YACnBqC,GAAG,iBACHc,MAAM,aACNZ,MAAOqE,EACPf,KAAK,iBACLpD,SAAU,SAACwF,GACTpB,EAAiBoB,EAAEC,OAAO3F,OAC1B4F,QAAQC,IAAIH,EAAEC,OAAO3F,QAEvB8F,gBAAiB,CACfC,QAAQ,KAGZ,kBAACC,EAAA,EAAD,CAAa7K,UAAWH,EAAQgD,QAC9B,kBAACiI,EAAA,EAAD,CAAYC,QAAQ,qBAApB,YACA,kBAACC,EAAA,EAAD,CACEC,QAAM,EACNpG,MAAO+C,EACP7C,SAAU,SAACwF,GACTnB,EAAqBmB,EAAEC,OAAO3F,QAEhCqG,WAAY,CACVhF,KAAM,WACNvB,GAAI,2BAGLiB,EAAgB5B,KAAI,SAACmH,EAAKrB,GACzB,OAAO,4BAAQsB,IAAKtB,EAAOjF,MAAOsG,GArDhB,SAACtG,GAC7B,GAAIA,EAAQ,GACV,MAAM,GAAN,OAAUA,EAAV,OAEA,IAAM+C,EAAWJ,IAAOI,SAAS/C,EAAO,WACxC,MAAM,GAAN,OAAU+C,EAASyD,QAAnB,aAA+BzD,EAAS0D,UAAxC,KAgDgDC,CAAsBJ,UAKtE,yBAAKnL,UAAWH,EAAQ2C,QACtB,yBAAKxC,UAAWH,EAAQmC,cACtB,kBAACsI,EAAA,EAAD,uBAIF,kBAACkB,EAAA,EAAD,CACEC,aAAc,IACdlM,MAAM,UACNmM,iBA/EU,SAAC7G,GACjB,MAAM,GAAN,OAAUA,EAAV,MA+EM8G,iBAAkB9B,EAClBhF,MAAOgD,EACP9C,SAAU,SAACwF,EAAG1F,GAAJ,OAAc4E,EAAa5E,IACrC+G,kBAAgB,gBAChBC,kBAAkB,MAClBC,KAAM,IACNC,MAAO/F,EAAgBhC,KAAI,SAACa,GAC1B,MAAO,CAACA,QAAOY,MAAOoE,EAAoBhF,OAE5CmH,IAAK,IACLC,IAAK,QAGT,kBAAC9L,EAAA,EAAD,CAAQkK,QAAShB,EAAerJ,UAAWH,EAAQ0C,OAAQhD,MAAM,YAAYmG,QAAQ,aAArF,YC7HN,0CAAe,WAAOwG,EAAQC,EAASC,GAAxB,yCAAA3L,EAAA,6DAAmCmH,EAAnC,+BAA4C,GAAIC,EAAhD,+BAAuD,IAC9DwE,EAAe7E,IAAOI,SAASA,EAAU,WACzC0E,EAAO9E,IAAO4E,GAAW3E,SACzBvD,EAAMqI,WAAWL,GACjB9H,EAAOmI,WAAWJ,GAExBK,GADIA,EAAiBH,EAAaI,eACFC,MAAM,MAAM,GAAGC,cANlC,UAOKjM,IAAMkM,KAAN,UNXuE,GMWvE,mBAAwC,CAAC1I,MAAKE,OAAMyD,SAAQyE,OAAM1E,SAAU4E,IAPjF,eAOPK,EAPO,yBAQNA,GARM,4CAAf,0DCDMrO,GAAYC,YAAWuK,GAkBd8D,GAhBS,SAAC,GAAyC,IAAxCC,EAAuC,EAAvCA,cAAeC,EAAwB,EAAxBA,mBACjCxL,EAAQiD,cACR5E,EAAUrB,GAAU,CAACgD,UAC3B,OACE,kBAACrB,EAAA,EAAD,CACEkK,QAAS2C,EACThN,UAAWH,EAAQiD,UACnBmK,KAAK,QACLvH,QAAQ,YACRnG,MAAM,aAELwN,EAAgB,qBAAuB,yBCmL/BG,GAxLY,SAAC,GAA+C,IAKrEC,EALuB7D,EAA6C,EAA7CA,kBAA6C,IAA1B8D,uBAA0B,MAAV,KAAU,EAClEC,EAAUC,cADwD,EAE9C1D,IAAnBlB,EAFiE,EAEjEA,SAAUD,EAFuD,EAEvDA,MAFuD,EAGvBlF,mBAAS,IAHc,mBAGjEJ,EAHiE,KAGhDC,EAHgD,KAOtE+J,EADEhK,GACaA,EAAgBO,MAEhB,GATuD,MAW9CH,mBAAS4J,GAXqC,mBAWjE3M,EAXiE,KAW1D6C,EAX0D,OAY/BE,mBAASiE,MAASC,OAAOD,IAAOE,UAAUC,iBAZX,mBAYjEuB,EAZiE,KAYnDC,EAZmD,OAa/B5F,mBAAS,IAbsB,mBAajEqE,EAbiE,KAavDwB,EAbuD,OAc3B7F,mBAAS+F,GAdkB,mBAcjEyD,EAdiE,KAclDQ,EAdkD,OAe7BhK,oBAAS,GAfoB,mBAejED,EAfiE,KAenDqG,EAfmD,OAgBzCpG,mBAAS,KAhBgC,mBAgBjEsE,EAhBiE,KAgBzD4B,EAhByD,KAkBxE5F,qBAAU,WACHyF,IACHH,EAAiBV,EAAM7H,OAAO2G,OAC9B6B,EAAqBX,EAAM7H,OAAOgH,UAClCxE,EAAsBqF,EAAM7H,OAAO0G,YAEpC,CAACgC,EAAmBb,EAAM7H,OAAO2G,MAAOkB,EAAM7H,OAAOgH,SAAUa,EAAM7H,OAAO0G,QAASoB,EAAUD,EAAMvB,gBAAiBuB,EAAMH,YAE/H,IA6BMkF,EAAgB,SAACC,GACrBhD,QAAQC,IAAI,oBACZgD,GAAYD,EAAcvJ,IAAKuJ,EAAcrJ,KAAM8E,EAActB,EAAUC,GAAQ8F,MAAK,SAACd,GACvFnE,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCQ,EAAS,CAACP,KAAM,aAAcD,QAAS2E,EAAI5L,KAAK2M,WAChD,IAAMC,EAAYC,KAAKC,UAAU,CAAC9M,KAAM4L,EAAI5L,KAAK2M,WACjDI,eAAeC,QAAQ,UAAWJ,GAClCG,eAAeC,QAAQ,UAAWH,KAAKC,UAAUN,IACjD/E,EAAS,CAACP,KAAM,aAAcD,QAAS,CAACZ,QAASmG,EAAelG,MAAO2B,EAActB,WAAUC,YAC/Fa,EAAS,CAACP,KAAM,kBAAmBD,QAAS,OACxCoB,EACF+D,EAAQa,KAAK,YAEbX,GAAoB,MAErBY,OAAM,SAACC,GACR3D,QAAQC,IAAI0D,EAAIC,UAChB3F,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCoG,MAAM,+LACFlB,GACFA,EAAgB,qLA2ChBJ,EAAqB,WACpB1D,GACHiE,GAAqBR,IAInBwB,EAAiB,CACrBrF,eACAC,mBACAvB,WACA8B,uBAhD6B,WAC7BC,GAAmB,GAEnBjB,EAAS,CAACP,KAAM,cAAeD,SAAS,IACpCO,EAAMvB,kBACJ,gBAAiBsH,UAEnBA,UAAUC,YAAYC,oBAAmB,SAAS3O,GAChD,IAAM4O,EAAW,CACfzK,IAAKnE,EAAS6O,OAAOC,SACrBzK,KAAMrE,EAAS6O,OAAOE,UACtBpL,KAAM,yBAERN,EAAsBuL,GACtBjG,EAAS,CAACP,KAAM,cAAeD,SAAS,IACnCyG,EAASzK,KAAQyK,EAASvK,KAK7Bf,EAAS,0BAJTsG,GAAmB,GACnB2E,MAAM,oCACNjL,EAAS,QAIV,SAAC+K,GACFzE,GAAmB,GACnBjB,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCQ,EAAS,CAACP,KAAM,6BAA8BD,SAAS,IACtC,IAAbkG,EAAIW,MACNT,MAAM,yBAAD,OAA0BF,EAAIY,cAIvCtG,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCQ,EAAS,CAACP,KAAM,6BAA8BD,SAAS,IACvDoG,MAAM,2CAgBVlF,uBACAC,cAxGoB,SAACkB,GACrB7B,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCuC,QAAQC,IAAIvH,GAEP3C,GAAmB,KAAVA,EAIgC,IAAxC4H,OAAOtC,KAAK3C,GAAiB8L,QAA2C,IAA3B9L,EAAgB8L,OAC/D1O,EAAOC,GAAOmN,MAAK,SAACd,GAClB,GAAkB,IAAdA,EAAIqC,MACNZ,MAAM,yBAAD,OAA0B9N,EAA1B,MACLkI,EAAS,CAACP,KAAM,cAAeD,SAAS,QACnC,CACLuC,QAAQC,IAAImC,GACZ,IAAM5I,EAAS4I,EAAI/I,QAAQ,GACrB2J,EAAgB,CAACvJ,IAAKD,EAAOE,SAAUC,KAAMH,EAAOI,UAAWX,KAAMO,EAAOK,SAClFkJ,EAAcC,OAEfU,OAAM,SAACC,GACR3D,QAAQC,IAAI0D,GACZZ,EAAc,OAGhBA,EAAcrK,IAnBhBuF,EAAS,CAACP,KAAM,cAAeD,SAAS,IACxCoG,MAAM,+BAmGRvB,gBACAQ,sBACApK,kBACAC,wBACAkG,oBACAzB,SACA4B,eACAjJ,QACA6C,WACAC,eACAqG,sBAkBF,OACE,oCAfIL,EACK,kBAAC,GAAciF,GAGpB,oCACE,kBAAC,GAAD,CAAiBxB,cAAeA,EAAeC,mBAAoBA,IACnE,kBAACmC,EAAA,EAAD,CAAUC,GAAIrC,GACZ,kBAAC,GAAcwB,O,0CC7JrB/P,GAAYC,YCPH,CACbC,KAAM,CACJwC,QAAS,OACTvC,cAAe,SACfkD,eAAgB,SAChBD,WAAY,UAEd6D,MAAO,CACLrG,OAAQ,sBAGViQ,OAAQ,CACNC,SAAU,QACV1Q,MAAO,QACP,QAAS,CACP0Q,SAAU,OACVC,UAAW,QAEbnO,WAAY,UDgBDoO,GAzBE,WACf,IAAM3P,EAAUrB,KAChB,OACE,yBAAKwB,UAAWH,EAAQnB,MAEtB,kBAACwL,EAAA,EAAD,CAAWlK,UAAWH,EAAQwP,QAC5B,yBAAKI,IAAKC,KAAWC,IAAI,wBAI3B,kBAAC,GAAD,CAAWrG,mBAAiB,IAC5B,kBAACY,EAAA,EAAD,KAEE,kBAAC,KAAQ0F,OAAT,CACEC,OAAO,0BACPC,KAAK,aACLC,MAAO,CAAC7O,QAAS,SACjB8O,OAAO,aACPvI,OAAO,a,sEEpBXwI,GAAU,IAAIC,KAAEC,KAAK,CACzBC,QAAS,yBACTC,cAAe,yBACfC,WAAY,CAAC,GAAI,IACjBC,YAAa,CAAC,GAAI,IAClBC,SAAU,CAAC,GAAI,IACfC,UAAW,8BACXC,WAAY,CAAC,GAAI,IACjBC,aAAc,CAAC,GAAI,MAGfC,GAAW,IAAIV,KAAEC,KAAK,CAC1BC,QAAS,2BACTC,cAAe,2BACfC,WAAY,CAAC,GAAI,IACjBC,YAAa,CAAC,GAAI,IAClBC,SAAU,CAAC,GAAI,IACfC,UAAW,8BACXC,WAAY,CAAC,GAAI,IACjBC,aAAc,CAAC,GAAI,MAGfE,GAAc,IAAIX,KAAEC,KAAKW,QA4DhBC,GA1DI,WAAO,IACjBtI,EAASmB,IAATnB,MACDuI,EAAc,WAClB,OAAOvI,EAAM7H,OAAO0G,QAAQpD,IAAMqI,WAAW9D,EAAM7H,OAAO0G,QAAQpD,KAAO,QAGrE+M,EAAe,WACnB,OAAOxI,EAAM7H,OAAO0G,QAAQlD,KAAOmI,WAAW9D,EAAM7H,OAAO0G,QAAQlD,MAAQ,UAEvE8M,EAAiB,SAAChN,EAAKE,GAC3B,MAAM,sDAAN,OAA6DF,EAA7D,YAAoEE,EAApE,wBAEI+M,EAAS,CAACH,IAAeC,KAC/B,OACE,oCACE,kBAACG,GAAA,EAAD,CAAKD,OAAQA,EAAQE,KAAM,IACzB,kBAACC,GAAA,EAAD,CACEC,YAAY,0EACZC,IAAI,uDAEL/I,EAAMrB,YAAYpD,KAAI,SAACyN,EAAI3H,GAC1B,OAAIrB,EAAMpB,YACJoB,EAAMpB,WAAWnD,MAAQuN,EAAGC,KAAOjJ,EAAMpB,WAAWjD,OAASqN,EAAGE,MAAQlJ,EAAMpB,WAAWnB,OAASuL,EAAGG,MACvGnH,QAAQC,IAAIjC,EAAMpB,YAEhB,kBAACwK,GAAA,EAAD,CAAQC,KAAM7B,GAASlQ,SAAU,CAACwM,WAAWkF,EAAGC,KAAMnF,WAAWkF,EAAGE,OAAQtH,QAAS,SAACE,GAAD,OAAOA,EAAEC,OAAOuH,aAAa3G,IAAKtB,GACrH,kBAACkI,GAAA,EAAD,KACE,kBAAC1H,EAAA,EAAD,CAAY5E,QAAQ,aAAa+L,EAAGG,MACpC,kBAACtH,EAAA,EAAD,CAAY5E,QAAQ,aAApB,IAAkC+L,EAAGQ,KAAKjI,QAAQ,GAAGkI,YACrD,kBAAC/R,EAAA,EAAD,CAAQ8M,KAAK,QAAQvH,QAAQ,WAAWnG,MAAM,YAAY4S,KAAMjB,EAAeO,EAAGC,IAAKD,EAAGE,OAA1F,mBAOR,kBAACE,GAAA,EAAD,CAAQC,KAAMjB,GAAa9Q,SAAU,CAACwM,WAAWkF,EAAGC,KAAMnF,WAAWkF,EAAGE,OAAQtH,QAAS,SAACE,GAAD,OAAOA,EAAEC,OAAOuH,aAAa3G,IAAKtB,GACzH,kBAACkI,GAAA,EAAD,KACE,kBAAC1H,EAAA,EAAD,CAAY5E,QAAQ,aAAa+L,EAAGG,MACpC,kBAACtH,EAAA,EAAD,CAAY5E,QAAQ,aAApB,IAAkC+L,EAAGQ,KAAKjI,QAAQ,GAAGkI,YACrD,kBAAC/R,EAAA,EAAD,CAAQ8M,KAAK,QAAQvH,QAAQ,WAAWnG,MAAM,YAAY4S,KAAMjB,EAAeO,EAAGC,IAAKD,EAAGE,OAA1F,qBAMR,kBAACE,GAAA,EAAD,CAAQC,KAAMlB,GAAU7Q,SAAU,CAACiR,IAAeC,KAAiB5G,QAAS,SAACE,GAAD,OAAOA,EAAEC,OAAOuH,cAC1F,kBAACC,GAAA,EAAD,KACE,kBAAC1H,EAAA,EAAD,CAAY5E,QAAQ,aAApB,0BAIJ,kBAAC0M,GAAA,EAAD,CAAQjB,OAAQ,CAACH,IAAeC,KAAiB1R,MAAM,OAAOsI,OAAQY,EAAM7H,OAAOiH,QAAU,EAAGwK,QAAQ,EAAOC,YAAa,Q,sECnFrH,IACb5T,KAAM,CACJwC,QAAS,OACTvC,cAAe,SACfoD,UAAW,SACXR,cAAe,SACfgR,YAAa,EACbxP,aAAc,GAGhByP,YAAa,CACXtR,QAAS,OACTvC,cAAe,MACfkD,eAAgB,gBAChBT,WAAY,SACZG,cAAe,UAEjBkR,kBAAmB,CACjB7T,MAAO,OACP8T,YAAa,MACbC,aAAc,OAEhBC,cAAe,CACbhU,MAAO,OACPS,QAAS,SACTkC,cAAe,UAEjBsR,QAAS,CACPtT,MAAO,OAETuT,WAAY,CACVvT,MAAO,UAETwT,UAAW,CACTxT,MAAO,SAETyT,UAAW,CACTzT,MAAO,SAET0T,OAAQ,CACNvQ,SAAU,OACVC,WAAY,IACZuQ,WAAY,QAEdC,qBAAsB,CACpB/R,WAAY,QAEdgS,eAAgB,CACdrT,SAAU,YAEZsT,UAAW,CACT3Q,SAAU,OACV3C,SAAU,WACVuT,OAAQ,EACRC,MAAO,I,4DClDL/U,GAAYC,YAAW+U,IAwCdC,GAtCa,SAAC,GAAiB,IAAhBC,EAAe,EAAfA,UACtB7T,EAAUrB,KAEVmV,EAAc,SAACC,GACnB,IAAMC,GAAKD,EAAQE,OAAO,EAAG,GACvBC,EAAOF,EAAI,IAAM,GACjB7H,GAAO4H,EAAQE,OAAO,EAAG,GACzBE,EAAQH,EAAI,IAAY,KAANA,EAAY,KAAO,KAE3C,OADwB,IAAR7H,EAAa+H,EAAOC,EAAOD,EAAO,IAAM/H,EAAMgI,GAIhE,OACE,kBAAC9J,EAAA,EAAD,CAAWlK,UAAWH,EAAQ4S,mBAC5B,kBAACwB,GAAA,EAAD,CAAgBjU,UAAWH,EAAQ+S,cAAexS,UAAW8T,MAC3D,kBAACC,GAAA,EAAD,CAAOlH,KAAK,SACV,kBAACmH,GAAA,EAAD,KACE,kBAACC,GAAA,EAAD,KACE,kBAACC,GAAA,EAAD,aACA,kBAACA,GAAA,EAAD,oBACA,kBAACA,GAAA,EAAD,oBAGJ,kBAACC,GAAA,EAAD,KACGb,EAAU1P,KAAI,SAACwQ,EAAK1K,GAAN,OACb,kBAACuK,GAAA,EAAD,CAAUjJ,IAAKtB,GACb,kBAACwK,GAAA,EAAD,KAAYE,EAAIvC,KAAKjI,QAAQ,IAC7B,kBAACsK,GAAA,EAAD,KAAYE,EAAIC,aAChB,kBAACH,GAAA,EAAD,KAAYX,EAAYa,EAAIE,aAAaC,OAAzC,OAAqDhB,EAAYa,EAAIE,aAAaE,eC5B5FpW,GAAYC,YAAW+U,IA6EdqB,GA3EK,SAAC,GAAuF,IAO/EC,EAPP5O,EAAqF,EAArFA,KAAM6O,EAA+E,EAA/EA,KAAMC,EAAyE,EAAzEA,YAAaC,EAA4D,EAA5DA,aAAcC,EAA8C,EAA9CA,SAAUC,EAAoC,EAApCA,KAAMjR,EAA8B,EAA9BA,IAAKE,EAAyB,EAAzBA,KAAMwO,EAAmB,EAAnBA,cAC/ElK,EAAYkB,IAAZlB,SACD7I,EAAUrB,KAFyF,EAGzE+E,oBAAS,GAHgE,mBAGlG6R,EAHkG,KAGxFC,EAHwF,KAgCzG,OAAI9I,WAAWwI,GAAQ,GACrBtK,QAAQC,IAAI,4BAA6BqK,EAAM,QAAS7O,GACjD,IAIP,kBAACoP,GAAA,EAAD,CAAMtV,UAAWH,EAAQnB,KAAMgH,QAAQ,WAAW2E,QAAS,WACzDI,QAAQC,IAAI,cACZhC,EAAS,CAACP,KAAM,kBAAmBD,QAAS,OAC5CQ,EAAS,CAACP,KAAM,kBAAmBD,QAAS,CAAChE,MAAKE,OAAM8B,YAExD,kBAACgO,GAAA,EAAD,CAAalU,UAAWH,EAAQ2S,aAC9B,kBAAC+C,GAAA,EAAD,CAAMC,WAAS,GACb,kBAACD,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACpL,EAAA,EAAD,CAAY5E,QAAQ,YAAYnG,MAAM,cAAcoW,MAAM,OAAO3V,UAAWH,EAAQoT,QAAS/M,IAE/F,kBAACqP,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACpL,EAAA,EAAD,CAAY5E,QAAQ,YAAYiQ,MAAM,QA9BlB,SAACX,EAAaC,GAC1C,MAAmB,KAAfA,EACKD,EAEAA,EAAc,qBAAuBC,EAAe,IA0BPW,CAAsBZ,EAAYC,KAElF,kBAACM,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,EAAG1V,UAAWH,EAAQsT,sBACnC,kBAACoC,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACpL,EAAA,EAAD,CAAY5E,QAAQ,YAAYiQ,MAAM,QAAtC,aAAwDpJ,WAAW2I,GAAUlL,QAAQ,GAArF,MAEF,kBAACuL,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACpL,EAAA,EAAD,CAAY5E,QAAQ,YAAYiQ,MAAM,OAAO3V,WAjD9B8U,EAiD2DK,EAhDvE,KAATL,EACKjV,EAAQmT,UACN8B,GAAQ,IACVjV,EAAQkT,UACN+B,EAAO,KAAOA,GAAQ,GACxBjV,EAAQiT,WACNgC,EAAO,GACTjV,EAAQgT,aADV,IAVc,SAACiC,GACtB,MAAkB,KAAXA,EAAgB,mBAAhB,UAAwCA,EAAxC,mBAmDqFe,CAAeV,MAGrG,kBAACI,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,EAAG1V,UAAWH,EAAQuT,gBACnC,kBAAC9I,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,cAAcoW,MAAM,QAAQ3V,UAAWH,EAAQwT,WAA9E,IAA4F9G,WAAWwI,GAAM/K,QAAQ,OAI3H,kBAAC8L,GAAA,EAAD,CAAa9V,UAAWH,EAAQ2S,aAC9B,kBAACrS,EAAA,EAAD,CAAQ8M,KAAK,QAAQvH,QAAQ,WAAWnG,MAAM,YAAY6K,SAA4B,OAAlBwI,EAAwBvI,QAAS,kBAAMgL,GAAaD,KAAxH,kBACA,kBAACjV,EAAA,EAAD,CAAQ8M,KAAK,QAAQvH,QAAQ,WAAWnG,MAAM,YAAY4S,KAvCzC,SAACjO,EAAKE,GAC3B,MAAM,sDAAN,OAA6DF,EAA7D,YAAoEE,EAApE,uBAsCoE8M,CAAehN,EAAKE,GAAOoG,OAAO,UAAlG,iBAEF,kBAAC2E,EAAA,EAAD,CAAUC,GAAIgG,EAAUW,QAAQ,OAAOC,eAAa,GAClD,kBAAC,GAAD,CAAqBtC,UAAWd,O,8BCvElCpU,GAAYC,YCNH,CACbwX,SAAU,CACRjT,OAAQ,IACRpE,MAAO,QACPI,OAAQ,QACRM,gBAAiB,kBACjBC,MAAO,QAET2W,MAAO,CACLhV,QAAS,OACTxB,UAAW,SACXf,cAAe,SACfkD,eAAgB,SAChBsU,aAAc,SACdvX,MAAO,OACP0Q,SAAU,QACVlO,WAAY,OACZpC,OAAQ,QACRe,SAAU,WACVqW,IAAK,MACLxT,UAAW,oBAEbyT,UAAW,CACTjX,OAAQ,QAEVkX,OAAQ,CACN1X,MAAO,QACPI,OAAQ,OACR+D,aAAc,MACd3D,OAAQ,QAEVsC,KAAM,CACJS,aAAc,MACdJ,UAAW,UDKAwU,GA9BC,WAAO,IACd9N,EAASmB,IAATnB,MADa,EAEQlF,mBAAS,MAFjB,mBAEb+S,EAFa,KAELE,EAFK,KAGbhT,EAAWiF,EAAXjF,QACD3D,EAAUrB,KAQhB,OAPAqF,qBAAU,WACR,GAAI4E,EAAMjF,QAAS,CACjB,IAAMyI,EAAM7D,OAAOtC,KAAKS,GAAQ0I,OAC1BwH,EAAMC,KAAKC,MAAMD,KAAKE,UAAY3K,EAAM,EAAI,IAAO,EACzDuK,EAAUC,MAEX,CAAChO,EAAMjF,UAER,kBAACqT,GAAA,EAAD,CAAU7W,UAAWH,EAAQoW,SAAUa,KAAMtT,GAC3C,kBAACyG,EAAA,EAAD,CAAOjK,UAAWH,EAAQqW,OACxB,kBAACX,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACZc,EAAY,4BAAQ3X,MAAM,aAAa4Q,IAAKlJ,EAAO+P,GAAS1X,MAAM,MAAMI,OAAO,MAAM+X,YAAY,IAAI/W,UAAWH,EAAQwW,YAAuB,IAGlJ,kBAACd,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACsB,GAAA,EAAD,CAAgBzX,MAAM,YAAYS,UAAWH,EAAQyW,UAEvD,kBAACf,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACb,kBAACpL,EAAA,EAAD,CAAYtK,UAAWH,EAAQ6B,MAA/B,sCf1ByB,Ee0BsE+G,EAAM7H,OAAOiH,OAAS,IAArH,SEwCKoP,GA/DK,SAAC,GAAkF,IAAjFC,EAAgF,EAAhFA,SAAUC,EAAsE,EAAtEA,aAAcC,EAAwD,EAAxDA,aAAcC,EAA0C,EAA1CA,gBAAiBC,EAAyB,EAAzBA,oBACpE7O,EAASmB,IAATnB,MACD8O,EAAc9O,EAAMrB,YACnB5D,EAAiBiF,EAAjBjF,QAASvC,EAAQwH,EAARxH,KA8BhB,OAAOuC,EAAU,kBAAC,GAAD,MACf,kBAAC0G,EAAA,EAAD,CAAW6F,MAAO,CAAC/Q,OAAQ,OAAQ0T,YAAa,MAAOC,aAAc,QACnE,kBAAC,KAAD,CAAW6E,gCAA8B,EAACzH,MAAO,CAACnR,MAAO,OAAQI,OAAQ,SACvE,kBAACsL,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,cAAcwQ,MAAO,CAAChO,UAAW,SAAU2Q,YAAa,OAAQ/P,WAAY,QAA3G,uBACA,kBAACuH,EAAA,EAAD,KA3BoB,WACxB,IAAMuH,EALCxQ,EAAKwW,QAAO,SAAChG,GAClB,OAAOA,EAAGiG,iBAKZ,OAAOjG,EAAGxC,OAAS,EACjB,oCACImI,EAII,GAHF,kBAAC9M,EAAA,EAAD,CAAYlK,UAAWC,KAAMgK,QAAS,kBAAMgN,GAAgB,IAAO9X,MAAM,YAAYmG,QAAQ,WAA7F,wBAIJ,kBAAC,GAAD,CAAaQ,KAAMuL,EAAG,GAAGG,KAAMmD,KAAMtD,EAAG,GAAGQ,KAAM+C,YAAavD,EAAG,GAAGkG,KAAM1C,aAAcxD,EAAG,GAAGmG,aAAa1C,SAAUzD,EAAG,GAAGoG,SAAU1C,KAAM1D,EAAG,GAAGqG,cAC/I5T,IAAKuN,EAAG,GAAGC,IAAKtN,KAAMqN,EAAG,GAAGE,KAAMiB,cAAenB,EAAG,GAAGsG,qBAGzD,oCACE,kBAACzN,EAAA,EAAD,CAAY5E,QAAQ,aAApB,iCAEC4R,EACC,kBAAChN,EAAA,EAAD,CAAYlK,UAAWC,KAAMgK,QAAS,kBAAMgN,GAAgB,IAAQ9X,MAAM,YAAYmG,QAAQ,WAC5F,oKACe,IASlBsS,IAEH,kBAACC,GAAA,EAAD,CACEpT,MAAOqS,EACPnS,SAAUoS,EACVe,eAAe,UACfC,UAAU,UACVzS,QAAQ,YACR0S,aAAW,2BAEX,kBAACC,GAAA,EAAD,CAAK5S,MAAM,YACX,kBAAC4S,GAAA,EAAD,CAAK5S,MAAM,iBAEb,kBAACyE,EAAA,EAAD,KACGqN,EAAYvT,KAAI,SAACyN,EAAI3H,GAAL,OAAe,kBAAC,GAAD,CAC9BsB,IAAKtB,EAAO5D,KAAMuL,EAAGG,KAAMmD,KAAMtD,EAAGQ,KAAM+C,YAAavD,EAAGkG,KAAM1C,aAAcxD,EAAGmG,aAAc1C,SAAUzD,EAAGoG,SAAU1C,KAAM1D,EAAGqG,cAC/H5T,IAAKuN,EAAGC,IAAKtN,KAAMqN,EAAGE,KAAMiB,cAAenB,EAAGsG,2BCiB3CO,GAzEc,WAAO,IAAD,EACD/U,mBAAS,GADR,mBAC1B2T,EAD0B,KAChBqB,EADgB,OAEP3O,IAAnBnB,EAF0B,EAE1BA,MAAOC,EAFmB,EAEnBA,SAFmB,EAGqBnF,oBAAS,GAH9B,mBAG1B+T,EAH0B,KAGLkB,EAHK,OAIOjV,oBAAS,GAJhB,mBAI1B6T,EAJ0B,KAIZC,EAJY,KAMjCxT,qBAAU,WACR,IAAI4U,EAAmBhQ,EAAMxH,KAEzBmW,IACFqB,EAAmBA,EAAiBhB,QAAO,SAAChG,GAG1C,QAFkBA,EAAGsG,mBAAqB,IAExBW,MAAK,SAACC,GAItB,OAHIA,EAAGC,UACLJ,GAAuB,GAElBG,EAAGC,gBAIhB,IAAMC,EAAQnC,KAAK1K,IAAIyM,EAAiBxJ,OAAQ,IAEhD,OAAQiI,GACN,KAAK,EACHuB,EAAiBK,MAAK,SAACrY,EAAGsY,GAAJ,OAAUtY,EAAEwR,KAAO8G,EAAE9G,QAE3CwG,EAAmBA,EAAiBI,MAAM,EAAGA,GAC7CnQ,EAAS,CAACP,KAAM,mBAAoBD,QAAS,KAC7CQ,EAAS,CAACP,KAAM,mBAAoBD,QAASuQ,IAC7C,MACF,KAAK,EACHA,EAAiBK,MAAK,SAACrY,EAAGsY,GAAJ,OAAUtY,EAAEoX,SAAWkB,EAAElB,YAE/CY,EAAmBA,EAAiBI,MAAM,EAAGA,GAC7CnQ,EAAS,CAACP,KAAM,mBAAoBD,QAAS,KAC7CQ,EAAS,CAACP,KAAM,mBAAoBD,QAASuQ,IAE7C,MACF,QAEEA,EAAmBA,EAAiBI,MAAM,EAAGA,GAC7CnQ,EAAS,CAACP,KAAM,mBAAoBD,QAAS,KAC7CQ,EAAS,CAACP,KAAM,mBAAoBD,QAASuQ,OAEhD,CAAChQ,EAAMxH,KAAMiW,EAAUE,EAAc1O,IAGxC,IAKMsQ,EAAiB,CACrB9B,WACAC,aAPmB,SAACnS,EAAOC,GAC3BsT,EAAYtT,IAOZmS,eACAC,kBACAC,uBAEF,OACE,kBAAC,GAAgB0B,ICzDfxa,GAAYC,YCVH,CACbC,KAAM,CACJyC,UAAW,OACXD,QAAS,OACTvC,cAAe,UAEjBsa,YAAa,CACX,uBAAwB,CACtBra,MAAO,OACPI,OAAQ,SAGZka,eAAgB,CACd7W,UAAW,WACX1C,YAAa,SACboC,UAAW,UACXoX,MAAO,QACPnW,OAAQ,QD0BGoW,GA/BK,WAClB,IAAMvZ,EAAUrB,KADQ,EAEEoL,IAAnBnB,EAFiB,EAEjBA,MAAOC,EAFU,EAEVA,SAkBd,OAhBA7E,qBAAU,WACR,GAA0B,IAAtB4E,EAAMxH,KAAKgO,OAAc,CAC3B,IAAMpB,EAAYG,eAAeqL,QAAQ,WACzC,GAAIxL,EAAW,CACb,IAAM5M,EAAO6M,KAAKwL,MAAMzL,GACxBnF,EAAS,CAACP,KAAM,aAAcD,QAASjH,EAAKA,QAGhD,GAAiD,IAA7CmH,OAAOtC,KAAK2C,EAAM7H,OAAO0G,SAAS2H,OAAc,CAClD,IAAMsK,EAAavL,eAAeqL,QAAQ,WACtCE,IACF9Q,EAAM7H,OAAO0G,QAAUwG,KAAKwL,MAAMC,GAClC7Q,EAAS,CAACP,KAAM,aAAcD,QAASO,EAAM7H,aAGhD,CAAC8H,EAAUD,IAEZ,yBAAKzI,UAAWH,EAAQnB,MACtB,kBAAC,GAAD,CAAW4K,mBAAmB,IAC9B,yBAAKtJ,UAAWH,EAAQoZ,aACtB,kBAAC,GAAD,OAEF,kBAAC,GAAD,QEtCS,IACbva,KAAM,CACJwC,QAAS,OACTvC,cAAe,SACfkD,eAAgB,SAChBD,WAAY,UAEd/C,MAAO,CACLkD,UAAW,QAEbyX,KAAM,CACJ5a,MAAO,QACPI,OAAQ,QACRI,OAAQ,uBACRM,UAAW,SACXwB,QAAS,OACTvC,cAAe,UAEjB8a,MAAO,CACLza,OAAQ,QACRJ,MAAO,OACPQ,OAAQ,aAEVsa,QAAS,CACPta,OAAQ,UAEVua,UAAW,CACTva,OAAQ,aAEVwa,QAAS,CACP1Y,QAAS,OACTvC,cAAe,MACfS,OAAQ,OACRR,MAAO,MACPiD,eAAgB,kB,oDC3BdrD,GAAYC,YAAWob,IAoCdC,GAlCE,SAAC,GAAuB,IAAtBC,EAAqB,EAArBA,OACXla,GADgC,EAAbma,QACTxb,MACVyb,EAAOhU,EAAQ8T,GACrB,OACE,kBAACzE,GAAA,EAAD,CAAM5P,QAAQ,WAAW1F,UAAWH,EAAQ2Z,MAC1C,kBAACU,GAAA,EAAD,CACE9Z,UAAU,MACVJ,UAAWH,EAAQ4Z,MACnBhK,IAAKwK,EAAK3T,QACVzH,MAAOob,EAAK/T,OAEd,kBAACgO,GAAA,EAAD,CAAanE,MAAO,CAAC3O,WAAY,IAC/B,kBAACkJ,EAAA,EAAD,CAAY6P,cAAY,EAACzU,QAAQ,MAC9BuU,EAAK/T,MAER,yBAAKlG,UAAWH,EAAQ+Z,SACtB,kBAACvZ,GAAA,EAAD,CAAM8R,KAAM8H,EAAK7T,UACf,kBAAC,KAAD,OAEF,kBAAC/F,GAAA,EAAD,CAAM8R,KAAM8H,EAAK5T,QACf,kBAAC,KAAD,QAKJ,kBAACiE,EAAA,EAAD,CAAY5E,QAAQ,SACjBuU,EAAK9T,SC7BV3H,GAAYC,YAAWob,IAuBdO,GArBC,WACd,IAAMva,EAAUrB,KAChB,OACE,yBAAKwB,UAAWH,EAAQnB,MACtB,kBAAC4L,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,gBAAgB4a,cAAY,EAACna,UAAWH,EAAQhB,OAA/E,wBAEE,8BAEF,kBAACyL,EAAA,EAAD,CAAYqP,WAAS,EAAC3Z,UAAWH,EAAQ8Z,UAAWhE,MAAM,WvBc1C,g3BuBXhB,kBAACrL,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,gBAAgB4a,cAAY,EAACna,UAAWH,EAAQhB,OAA/E,aAEE,8BAEF,kBAAC,GAAD,CAAUkb,OAAO,KAAKC,SAAS,IAC/B,kBAAC,GAAD,CAAUD,OAAO,KAAKC,SAAS,M,UCDtBK,GAlBG,WAChB,OACE,yBAAKtK,MAAO,CAAC7O,QAAS,QAASnB,SAAU,WAAYf,OAAQ,SAC3D,kBAAC,sBAAD,CACE+Q,MAAO,CACLhQ,SAAU,WACVqW,IAAK,MACLkE,KAAM,MACN1b,MAAO,QACP0Q,SAAU,QACVtQ,OAAQ,OACRub,SAAU,UAEZ/I,IAAI,wDClBG,IACbtQ,QAAS,OACTC,UAAW,QACXmO,SAAU,QACV3Q,cAAe,SACfW,gBAAiB,WCLJ,IACbZ,KAAM,CACJwC,QAAS,OACTvC,cAAe,SACfkD,eAAgB,SAChBD,WAAY,UAEd4Y,cAAe,CACb5b,MAAO,OAETC,MAAO,CACLkD,UAAW,QAEb4X,UAAW,CACT/a,MAAO,MACPQ,OAAQ,c,mDCVNZ,GAAYC,YAAWgc,IAsBdC,GApBM,SAAC,GAAqB,IAApB7b,EAAmB,EAAnBA,MAAOgI,EAAY,EAAZA,OACtBhH,EAAUrB,KAChB,OACE,kBAACmc,GAAA,EAAD,KACE,kBAACC,GAAA,EAAD,CACEC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdnW,GAAG,kBAEH,kBAAC2F,EAAA,EAAD,CAAYtK,UAAWH,EAAQkb,QAASrV,QAAQ,MAAM7G,IAExD,kBAACmc,GAAA,EAAD,KACE,kBAAC1Q,EAAA,EAAD,KACGzD,MCdLrI,GAAYC,YAAWgc,IA+BdQ,GA7BH,WACV,IAAMpb,EAAUrB,KAChB,OACE,yBAAKwB,UAAWH,EAAQnB,MACtB,kBAAC4L,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,gBAAgB4a,cAAY,EAACna,UAAWH,EAAQhB,OAA/E,MAEE,8BAEF,yBAAKmB,UAAWH,EAAQ2a,eACrB5T,EAAW5C,KAAI,SAACyW,GAAD,OAAS,kBAAC,GAAD,CAAc5b,MAAO4b,EAAI5b,MAAOgI,OAAQ4T,EAAI5T,aAEvE,6BAAK,6BACL,kBAACyD,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,gBAAgB4a,cAAY,EAACna,UAAWH,EAAQhB,OAA/E,uBAEE,8BAEF,kBAACyL,EAAA,EAAD,CAAYqP,WAAS,EAAC3Z,UAAWH,EAAQ8Z,UAAWhE,MAAM,W5B0BjC,isB6B9CzBnX,GAAYC,YAAWob,IAiBdqB,GAfE,WACf,IAAMrb,EAAUrB,KAChB,OACE,yBAAKwB,UAAWH,EAAQnB,MACtB,kBAAC4L,EAAA,EAAD,CAAY5E,QAAQ,KAAKnG,MAAM,gBAAgB4a,cAAY,EAACna,UAAWH,EAAQhB,OAA/E,gBAEE,8BAEF,kBAACyL,EAAA,EAAD,CAAYqP,WAAS,EAAC3Z,UAAWH,EAAQ8Z,UAAWhE,MAAM,WAA1D,+BCoBSwF,GArBH,WAEV,OACE,kBAACjR,EAAA,EAAD,CAAWkR,gBAAc,EAACrL,MAAOsL,IAC/B,kBAAC,GAAD,MAEA,kBAAC,IAAD,KACE,kBAAC,EAAD,MACA,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAOC,KAAK,IAAIC,OAAK,EAACnb,UAAWoP,KACjC,kBAAC,IAAD,CAAO8L,KAAK,WAAWC,OAAK,EAACnb,UAAWgZ,KACxC,kBAAC,IAAD,CAAOkC,KAAK,SAASC,OAAK,EAACnb,UAAWga,KACtC,kBAAC,IAAD,CAAOkB,KAAK,OAAOC,OAAK,EAACnb,UAAW6a,KACpC,kBAAC,IAAD,CAAOK,KAAK,WAAWC,OAAK,EAACnb,UAAWia,KACxC,kBAAC,IAAD,CAAOja,UAAW8a,S,wCCUb1Z,GAnCDga,aAAe,CAC3BC,YAAa,CACX/F,GAAI,EACJgG,GAAI,KAENja,QAAS,CACPE,UAAW,CACTga,MAAO,UACPC,KAAM,UACNC,KAAM,WAERC,QAAS,CACPF,KAAM,UACND,MAAO,UACPE,KAAM,YAGVE,WAAY,CAEVC,aAAc,GACdC,WAAY,CACV,QACA,SACA,cACAC,KAAK,QCFIC,GAbF,SAAC,GAAgB,IAAfvT,EAAc,EAAdA,SACb,OACE,kBAAC,EAAD,KACE,kBAACwT,GAAA,EAAD,CAAe5a,MAAOA,IACpB,kBAAC,KAAD,CAAyB6a,MAAOC,MAC7B1T,MCXX2T,IAASC,OAAO,kBAAC,GAAD,KAAM,kBAAC,GAAD,OAAgBC,SAASC,cAAc,Y","file":"static/js/main.5fc4ed41.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/carparkwhere_banner_compressed_v3.89a72441.gif\";","import React from 'react';\nimport {Link} from 'react-router-dom';\nimport {AppBar, Toolbar, Button, makeStyles} from '@material-ui/core';\nimport header from '../../styles/header';\n\n\nconst useStyles = makeStyles(header);\n\nconst Header = () => {\n const classes = useStyles();\n return (\n
\n \n \n {/* \n \"carparkwhere\"/\n */}\n \n \n \n \n \n \n
\n );\n};\n\nexport default Header;\n","\nexport default {\n root: {\n flexDirection: 'row',\n width: '100%',\n },\n title: {\n flexGrow: 1,\n },\n mainButton: {\n height: '48px',\n width: '48px',\n marginLeft: '8px',\n },\n toolbarButtons: {\n marginLeft: 'auto',\n },\n linkButton: {\n margin: '0px 6px',\n padding: '6px 6px 3px 6px',\n '&:hover': {\n backgroundColor: 'rgba(0,0,0,0.09)',\n color: 'white',\n },\n },\n imageIcon: {\n height: '100%',\n },\n iconRoot: {\n textAlign: 'center',\n marginRight: '1rem',\n },\n};\n","import {useState, useEffect} from 'react';\nimport axios from 'axios';\n\nexport const search = async (query) => {\n const {data} = await axios.get(\n 'https://www.onemap.gov.sg/api/common/elastic/search',\n {\n params: {\n searchVal: query,\n returnGeom: 'Y',\n getAddrDetails: 'Y',\n pageNum: '1',\n },\n },\n );\n return data;\n};\n\nexport const useLocationLoader = (query) => {\n const [loading, setLoading] = useState(true);\n const [mapResults, setMapResults] = useState([{addr: 'No entries'}]);\n useEffect(() => {\n async function getMapResults() {\n try {\n setLoading(true);\n const results = await search(query);\n setLoading(false);\n const finalResults = results.results.map((result) => {\n const val = {lat: result.LATITUDE, long: result.LONGITUDE, addr: result.ADDRESS};\n return val;\n });\n setMapResults(finalResults);\n } catch {\n setLoading(false);\n setMapResults([{addr: 'Not found'}]);\n }\n }\n if (query !== '') {\n getMapResults();\n }\n }, [query]);\n return [loading, mapResults];\n};\n\n","export default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: '10vh',\n paddingTop: (props) => `${props.factor * 2}px`,\n paddingBottom: (props) => `${props.factor * 2}px`,\n marginLeft: 0,\n marginRight: 0,\n padding: '0.5rem 0',\n color: (props) => props.theme.palette.text.secondary,\n alignItems: 'center',\n justifyContent: 'center',\n },\n timeWrapper: {\n marginTop: (props) => `${props.factor * 3}px`,\n display: 'flex',\n flexDirection: 'row',\n width: '90%',\n justifyContent: 'space-between',\n },\n buttonHeader: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n input: {\n '& .MuiOutlinedInput-input': {\n color: (props) => props.theme.palette.text.secondary,\n },\n '& .MuiOutlinedInput-root': {\n '& fieldset': {\n borderColor: (props) => props.theme.palette.text.secondary,\n color: (props) => props.theme.palette.text.secondary,\n },\n color: (props) => props.theme.palette.text.secondary, // or black\n },\n width: '90%',\n marginTop: (props) => `${props.factor * 5}px`,\n marginBottom: (props) => `${props.factor * 2}px`,\n marginLeft: 0,\n marginRight: 0,\n },\n smallText: {\n alignSelf: 'flex-start',\n marginLeft: '7.5%',\n },\n\n pickerInput: {\n '& .MuiTextField': {\n color: (props) => props.theme.palette.text.secondary,\n },\n '& fieldset': {\n borderColor: (props) => props.theme.palette.text.secondary,\n color: (props) => props.theme.palette.text.secondary, // or black\n },\n '& input': {\n color: (props) => props.theme.palette.text.secondary, // or black\n },\n color: (props) => props.theme.palette.text.secondary, // or black\n width: '65%',\n marginBottom: (props) => `${props.factor * 2}px`,\n },\n button: {\n marginTop: (props) => `${props.factor * 2}px`,\n // color: (props) => props.theme.palette.text.secondary, // or black\n width: '60%',\n },\n slider: {\n width: '90%',\n color: (props) => props.theme.palette.text.secondary, // or black\n '& .MuiTypography-root': {\n marginTop: (props) => props.showSearchButton ? '0.6rem' : 0,\n },\n '& .MuiSlider-root': {\n width: '85%',\n marginLeft: '7.5%',\n },\n '& .MuiSlider-active .MuiSlider-valueLabel': {\n fontSize: '0.6rem',\n fontWeight: 400,\n transform: 'scale(1.6) translateY(-10px) !important',\n },\n '& .MuiSlider-valueLabel': {\n fontSize: '0.6rem',\n fontWeight: 400,\n },\n },\n select: {\n width: '30%',\n },\n showInput: {\n borderRadius: 0,\n width: 'auto',\n height: '1.4rem',\n alignSelf: 'center',\n position: 'absolute',\n zIndex: '501',\n },\n};\n","import React from 'react';\nimport {TextField, makeStyles, useTheme} from '@material-ui/core';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nimport {useLocationLoader} from '../../hooks/useLocationLoader';\nimport inputArea from '../../styles/inputArea';\n\nconst useStyles = makeStyles(inputArea);\n\nconst LocationAutoComplete = ({selectedAddress, handleSelectedAddress, query, setQuery, currLocation}) => {\n const [loading, mapResults] = useLocationLoader(query);\n\n const theme = useTheme();\n const classes = useStyles({theme});\n return (\n {\n if (newValue && !currLocation) {\n handleSelectedAddress(newValue);\n }\n }}\n inputValue={query}\n onInputChange={(event, newInputValue) => {\n if (!currLocation) {\n setQuery(newInputValue);\n }\n }}\n getOptionLabel={(option) => {\n if (option.addr) {\n return option.addr;\n }\n return '';\n }}\n renderInput={(params) => (\n )}\n />\n );\n};\n\nexport default LocationAutoComplete;\n","// Use fixed hostname during development environment i.e. npm start\nexport const baseUrl = process.env.NODE_ENV === 'development' ? 'http://localhost:8080/' : '';\n// Generate array of 30\nexport const durationOptions = [...Array(14).keys()].map( (i) => i * 30);\nexport const distanceOptions = [...Array(5).keys()].map( (i) => (i+1) * 500);\nexport const estimatedTimeFactor = 6;\nexport const devInfo = {\n 'ay': {\n name: 'Ang Yang',\n desc: 'Full-time software engineer, part-time Masters student at Georgia Tech',\n linkedIn: 'https://www.linkedin.com/in/yang-ang-025',\n github: 'https://github.com/AkaHitsuji',\n imgLink: 'angyang.png',\n },\n 'ds': {\n name: 'De Sheng',\n desc: 'DevOps engineer by trade, fullstack engineer by hobby.',\n linkedIn: 'https://www.linkedin.com/in/chuan-de-sheng-67a424136/',\n github: 'https://github.com/dschuan',\n imgLink: 'desheng.png',\n },\n};\n\nexport const gifMap = {\n 1: 'https://giphy.com/embed/NfY2xu127irrG',\n 2: 'https://giphy.com/embed/QBd2kLB5qDmysEXre9',\n 3: 'https://giphy.com/embed/12zV7u6Bh0vHpu',\n 4: 'https://giphy.com/embed/3ov9jWu7BuHufyLs7m',\n};\n\nexport const aboutInfo = `Carparkwhere is a free service that helps you find the NEAREST and CHEAPEST parking spots in Singapore. Carparkwhere looks through all car parking charges in Singapore, searching rates and lot availability from over 3600 carparks, including major Shopping Malls, Office Buildings, Hotels, HDB and URA carparks. We developed this service as we realised that there is no real, easy to access solution that finds the nearest carparks and calculates the cost given a specific time duration. This matters to cost conscious drivers as carpark costs can add up over time. Through testing this service with users we found that this solution can potentially save drivers up to 30% of the potential cost they will have paid for a more expensive carpark. We hope this service will be able to help users bridge that information gap, and make parking more accessible to all Singaporeans :)`;\n\nexport const faqContent = [\n {title: `Do you collect user data?`, answer: `We do not under any circumstance collect any user data.`},\n {title: `Why can't I find the place I'm searching for?`, answer: `For best results, search using postal codes. Our search engine is powered by onemap: https://www.onemap.sg/home/`},\n {\n title: `Why do you not have the details of the carpark at (insert location name)`,\n answer: `As we are a small 2 man team, we automate as much of the data gathering process as we can. \n We compile carpark information from known sources (government and commercial) and clean it into our own data format \n for our service to perform its calculations on. As such, the completeness of our information depends on the sources we get our information from. \n We do our best to keep this information up to date and as complete as possible. If you experience any discrepancy, \n or you have the details of a carpark you would like to be included in this service, do fill up the typeform under the contact page and we will attend to it \n as soon as possible!`,\n },\n {\n title: `This service is great! How can I support this initiative / contribute to this project?`,\n answer: 'You can reach out to us under the \"Contact Us\" tab above. We welcome all support and feedback! Thank you messages or reviews are also welcome!',\n },\n];\n\nexport const termsAndConditions = `Carparkwhere is a free service and we strive to be as accurate and as complete as possible, however, there may be gaps at times with the information we provide. In using this service, you will not hold the developers of this service liable for incorrect information provided, including but not limited to, incorrect carpark costs, incorrect opening and closing times, incorrect calculated costs, incorrect carpark descriptions. You will do your own due dilligence to ensure that the returned carpark information provided is accurate and complete, park within the hours specified by the owner of the carpark, and make payment for parking according to the information provided at the carpark location.`;\n","import {createContext} from 'react';\n\n// We are initializing null as we expect to implement commons overriding feature in the future\nconst StoreContext = createContext(null);\nStoreContext.displayName = 'GlobalStore';\n\nexport default StoreContext;\n","import moment from 'moment';\n\nexport const initialState = {\n loading: false,\n locationCapable: true,\n preLoaded: false,\n data: [],\n displayedCp: [],\n selectedCp: null,\n params: {\n address: {},\n start: moment().format(moment.HTML5_FMT.DATETIME_LOCAL),\n duration: 60,\n radius: 500,\n },\n currentPos: null,\n};\n\nexport const reducer = (state, action) => {\n const {payload} = action;\n switch (action.type) {\n case 'DETERMINE_LOCATION_CAPABLE':\n state.locationCapable = payload;\n return Object.assign({}, state);\n case 'SET_PRELOADED':\n state.preloaded = payload;\n return Object.assign({}, state);\n case 'STORE_DATA':\n // Initialize carpark with empty array if api returns null\n state.data = payload || [];\n return Object.assign({}, state);\n case 'SET_LOADING':\n state.loading = payload;\n return Object.assign({}, state);\n case 'SET_SEARCH':\n state.params = payload;\n return Object.assign({}, state);\n case 'SET_DISPLAYED_CP':\n state.displayedCp = payload;\n return Object.assign({}, state);\n case 'SET_SELECTED_CP':\n state.selectedCp = payload;\n return Object.assign({}, state);\n default:\n return state;\n }\n};\n\n","import {useContext} from 'react';\nimport CommonsContext from './StoreContext';\n\nexport default () => {\n const {store, dispatch} = useContext(CommonsContext);\n return {store, dispatch};\n};\n","import React, {useReducer} from 'react';\nimport StoreContext from './StoreContext';\nimport {initialState, reducer} from './storeInits';\n\n\nexport const StoreProvider = ({children, subappName=null}) => {\n if (subappName) {\n StoreContext.displayName = `${subappName}Store`;\n }\n const [store, dispatch] = useReducer(reducer, initialState);\n return {children};\n};\n\nexport {default as useStore} from './useStore';\n","import {Paper, Container, useTheme, makeStyles, IconButton, Button, Select, Slider, Typography, TextField, InputLabel, FormControl} from '@material-ui/core';\nimport LocationIcon from '@material-ui/icons/MyLocation';\n\nimport React from 'react';\nimport moment from 'moment';\n\nimport LocationAutoComplete from './LocationAutoComplete';\nimport {durationOptions, distanceOptions} from '../../constants';\nimport inputarea from '../../styles/inputArea';\nimport {useStore} from '../../Store';\n\nconst useStyles = makeStyles(inputarea);\n\nconst InputArea = ({\n selectedDate,\n handleDateChange,\n duration,\n handleDurationChange,\n onSearchClick,\n showSearchButton,\n selectedAddress,\n handleSelectedAddress,\n showHiddenElements,\n hideHiddenElements,\n defaultShowSearch,\n radius,\n handleRadius,\n query,\n setQuery,\n setCurrLocationAsParam,\n currLocation,\n setUseCurrLocation,\n}) => {\n const theme = useTheme();\n const factor = defaultShowSearch ? 6 : 8;\n const classes = useStyles({theme, factor, showSearchButton});\n const {store} = useStore();\n const valuetext = (value) => {\n return `${value}m`;\n };\n const generateRadiusLabel = (value, index) => {\n if (value < 1000) {\n return `${value}m`;\n } else {\n const newVal = (value / 1000).toFixed(1);\n return `${newVal}km`;\n }\n };\n\n const generateDurationLabel = (value) => {\n if (value < 60) {\n return `${value}min`;\n } else {\n const duration = moment.duration(value, 'minutes');\n return `${duration.hours()}h ${duration.minutes()}m`;\n }\n };\n\n return (\n \n
\n \n {\n if (!currLocation) {\n setCurrLocationAsParam();\n } else {\n setUseCurrLocation(false);\n }\n }}>\n \n \n
\n {currLocation ? Current Location being used : ''}\n
\n {\n handleDateChange(e.target.value);\n console.log(e.target.value);\n }}\n InputLabelProps={{\n shrink: true,\n }}\n />\n \n Duration\n {\n handleDurationChange(e.target.value);\n }}\n inputProps={{\n name: 'duration',\n id: 'duration-native-select',\n }}\n >\n {durationOptions.map((opt, index) => {\n return ;\n })}\n \n \n
\n
\n
\n \n Search radius\n \n
\n handleRadius(value)}\n aria-labelledby=\"radius-slider\"\n valueLabelDisplay=\"off\"\n step={500}\n marks={distanceOptions.map((value) => {\n return {value, label: generateRadiusLabel(value)};\n })}\n min={500}\n max={2500}\n />\n
\n \n
\n );\n};\n\nexport default InputArea;\n","import axios from 'axios';\nimport moment from 'moment';\n\nimport {baseUrl} from '../constants';\n\nexport default async (latStr, longStr, startTime, duration=60, radius=500) => {\n const durationTime = moment.duration(duration, 'minutes');\n const date = moment(startTime).format();\n const lat = parseFloat(latStr);\n const long = parseFloat(longStr);\n let durationString = durationTime.toISOString();\n durationString = durationString.split('PT')[1].toLowerCase();\n const res = await axios.post(`${baseUrl}api/getCarparks`, {lat, long, radius, date, duration: durationString});\n return res;\n};\n","import {Button, makeStyles, useTheme} from '@material-ui/core';\nimport React from 'react';\nimport inputarea from '../../styles/inputArea';\n\nconst useStyles = makeStyles(inputarea);\n\nconst ShowFieldButton = ({showInputArea, clickToToggleInput}) => {\n const theme = useTheme();\n const classes = useStyles({theme});\n return (\n \n {showInputArea ? 'Hide Search Fields' : 'Change Search Fields'}\n \n );\n};\n\nexport default ShowFieldButton;\n","import React, {useState, useEffect} from 'react';\nimport {Collapse} from '@material-ui/core';\nimport moment from 'moment';\nimport PropTypes from 'prop-types';\nimport InputArea from './InputArea';\nimport {useStore} from '../../Store';\nimport getCarparks from '../../utils/getCarparks';\nimport {search} from '../../hooks/useLocationLoader';\n\nimport {useHistory} from 'react-router-dom';\nimport ShowFieldButton from './ShowFieldButton';\n\nconst InputAreaContainer = ({defaultShowSearch, errorMsgHandler=null}) => {\n const history = useHistory();\n const {dispatch, store} = useStore();\n const [selectedAddress, handleSelectedAddress] = useState({});\n\n let initialQuery;\n if (selectedAddress) {\n initialQuery = selectedAddress.addr || '';\n } else {\n initialQuery = '';\n }\n const [query, setQuery] = useState(initialQuery);\n const [selectedDate, handleDateChange] = useState(moment().format(moment.HTML5_FMT.DATETIME_LOCAL));\n const [duration, handleDurationChange] = useState(60);\n const [showInputArea, handleShowInputArea] = useState(defaultShowSearch);\n const [currLocation, setUseCurrLocation] = useState(false);\n const [radius, handleRadius] = useState(500);\n\n useEffect(() => {\n if (!defaultShowSearch) {\n handleDateChange(store.params.start);\n handleDurationChange(store.params.duration);\n handleSelectedAddress(store.params.address);\n }\n }, [defaultShowSearch, store.params.start, store.params.duration, store.params.address, dispatch, store.locationCapable, store.preloaded]);\n\n const onSearchClick = (e) => {\n dispatch({type: 'SET_LOADING', payload: true});\n console.log(selectedAddress);\n\n if (!query || query === '') {\n dispatch({type: 'SET_LOADING', payload: false});\n alert('You have not set a query!');\n } else {\n if (Object.keys(selectedAddress).length === 0 || selectedAddress.length === 0) {\n search(query).then((res) => {\n if (res.found === 0) {\n alert(`No results found for \"${query}\"`);\n dispatch({type: 'SET_LOADING', payload: false});\n } else {\n console.log(res);\n const result = res.results[0];\n const parsedAddress = {lat: result.LATITUDE, long: result.LONGITUDE, addr: result.ADDRESS};\n carparkAction(parsedAddress);\n }\n }).catch((err) => {\n console.log(err);\n carparkAction({});\n });\n } else {\n carparkAction(selectedAddress);\n }\n }\n };\n\n const carparkAction = (parsedAddress) => {\n console.log('Getting carparks');\n getCarparks(parsedAddress.lat, parsedAddress.long, selectedDate, duration, radius).then((res) => {\n dispatch({type: 'SET_LOADING', payload: false});\n dispatch({type: 'STORE_DATA', payload: res.data.carparks});\n const resString = JSON.stringify({data: res.data.carparks});\n sessionStorage.setItem('results', resString);\n sessionStorage.setItem('address', JSON.stringify(parsedAddress));\n dispatch({type: 'SET_SEARCH', payload: {address: parsedAddress, start: selectedDate, duration, radius}});\n dispatch({type: 'SET_SELECTED_CP', payload: null});\n if (defaultShowSearch) {\n history.push('/results');\n } else {\n handleShowInputArea(false);\n }\n }).catch((err) => {\n console.log(err.response);\n dispatch({type: 'SET_LOADING', payload: false});\n alert('There was a problem getting carpark data. Please refresh page and try again. If problem persists, do drop us an email at carparkwhere2020@gmail.com with your search parameters. Thank you!');\n if (errorMsgHandler) {\n errorMsgHandler('Error getting carpark data. Please refresh page and try again. If problem persists, do drop us an email at carparkwhere2020@gmail.com with your search parameters. Thank you!');\n }\n });\n };\n\n const setCurrLocationAsParam = () => {\n setUseCurrLocation(true);\n // console.log('hello');\n dispatch({type: 'SET_LOADING', payload: false});\n if (store.locationCapable) {\n if ('geolocation' in navigator) {\n /* geolocation is available */\n navigator.geolocation.getCurrentPosition(function(position) {\n const currAddr = {\n lat: position.coords.latitude,\n long: position.coords.longitude,\n addr: 'Your current location',\n };\n handleSelectedAddress(currAddr);\n dispatch({type: 'SET_LOADING', payload: false});\n if (!currAddr.lat || !currAddr.long) {\n setUseCurrLocation(false);\n alert('Location query failed. Try again');\n setQuery('');\n } else {\n setQuery('Your current location');\n }\n }, (err) => {\n setUseCurrLocation(false);\n dispatch({type: 'SET_LOADING', payload: false});\n dispatch({type: 'DETERMINE_LOCATION_CAPABLE', payload: false});\n if (err.code === 1) {\n alert(`Location is disabled. ${err.message}`);\n }\n });\n } else {\n dispatch({type: 'SET_LOADING', payload: false});\n dispatch({type: 'DETERMINE_LOCATION_CAPABLE', payload: false});\n alert('Location is disabled on your device.');\n }\n }\n };\n\n const clickToToggleInput = () => {\n if (!defaultShowSearch) {\n handleShowInputArea(!showInputArea);\n }\n };\n\n const containerProps = {\n selectedDate,\n handleDateChange,\n duration,\n setCurrLocationAsParam,\n handleDurationChange,\n onSearchClick,\n showInputArea,\n handleShowInputArea,\n selectedAddress,\n handleSelectedAddress,\n defaultShowSearch,\n radius,\n handleRadius,\n query,\n setQuery,\n currLocation,\n setUseCurrLocation,\n };\n\n const returnComponent = () => {\n if (defaultShowSearch) {\n return ;\n } else {\n return (\n <>\n \n \n \n \n \n );\n }\n };\n\n return (\n <>\n {returnComponent()}\n \n );\n};\n\nInputAreaContainer.propTypes = {\n selectedDate: PropTypes.instanceOf(Date),\n handleDateChange: PropTypes.func,\n duration: PropTypes.number,\n handleDurationChange: PropTypes.func,\n onSearchClick: PropTypes.func,\n showInputArea: PropTypes.bool,\n selectedAddress: PropTypes.object,\n handleSelectedAddress: PropTypes.func,\n defaultShowSearch: PropTypes.bool,\n radius: PropTypes.number,\n handleRadius: PropTypes.func,\n query: PropTypes.string,\n setQuery: PropTypes.func,\n setCurrLocationAsParam: PropTypes.func,\n currLocation: PropTypes.bool,\n setUseCurrLocation: PropTypes.func,\n};\nexport default InputAreaContainer;\n","import {makeStyles, Container} from '@material-ui/core';\nimport React from 'react';\nimport InputArea from '../../components/InputArea';\nimport home from '../../styles/home';\nimport headerImg from '../../assets/carparkwhere_banner_compressed_v3.gif';\nimport AdSense from 'react-adsense';\n\nconst useStyles = makeStyles(home);\n\nconst HomeMain = () => {\n const classes = useStyles();\n return (\n
\n {/* CARPARK WHERE */}\n \n \"carparkwhere\n \n {/*
\n
*/}\n \n \n {/* Ad space */}\n \n \n
\n );\n};\n\nexport default HomeMain;\n","export default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n label: {\n margin: '3rem 0.5rem 3rem 0',\n },\n // desheng's naming convention MUST FOLLOW\n header: {\n maxWidth: '800px',\n width: '100vw',\n '& img': {\n maxWidth: '100%',\n maxHeight: '100%',\n },\n paddingTop: '10px',\n },\n // COLON NOT EQUAL. sagely advice mate\n};\n","import {Typography, Button} from '@material-ui/core';\n\nimport React from 'react';\nimport {Map, Marker, Popup, TileLayer, Circle} from 'react-leaflet';\nimport L from 'leaflet';\nimport {useStore} from '../../Store';\n\nconst RedIcon = new L.Icon({\n iconUrl: 'assets/custom-icon.svg',\n iconRetinaUrl: 'assets/custom-icon.svg',\n iconAnchor: [15, 40],\n popupAnchor: [5, -32],\n iconSize: [27, 58],\n shadowUrl: '../assets/marker-shadow.png',\n shadowSize: [55, 70],\n shadowAnchor: [15, 62],\n});\n\nconst BlueIcon = new L.Icon({\n iconUrl: 'assets/custom-icon-2.svg',\n iconRetinaUrl: 'assets/custom-icon-2.svg',\n iconAnchor: [15, 40],\n popupAnchor: [5, -32],\n iconSize: [27, 58],\n shadowUrl: '../assets/marker-shadow.png',\n shadowSize: [55, 70],\n shadowAnchor: [15, 62],\n});\n\nconst DefaultIcon = new L.Icon.Default();\n\nconst CarparkMap = () => {\n const {store} = useStore();\n const generateLat = () => {\n return store.params.address.lat ? parseFloat(store.params.address.lat) : 1.3521;\n };\n\n const generateLong = () => {\n return store.params.address.long ? parseFloat(store.params.address.long) : 103.8198;\n };\n const renderGmapLink = (lat, long) => {\n return `https://www.google.com/maps/dir/?api=1&destination=${lat},${long}&travelmode=driving`;\n };\n const center = [generateLat(), generateLong()];\n return (\n <>\n \n \n {store.displayedCp.map((cp, index) => {\n if (store.selectedCp) {\n if (store.selectedCp.lat === cp.Lat && store.selectedCp.long === cp.Long && store.selectedCp.name === cp.Name) {\n console.log(store.selectedCp);\n return (\n e.target.openPopup()} key={index}>\n \n {cp.Name}\n ${cp.Cost.toFixed(2).toString()}\n \n \n \n );\n }\n }\n return (\n e.target.openPopup()} key={index}>\n \n {cp.Name}\n ${cp.Cost.toFixed(2).toString()}\n \n \n \n );\n })}\n {/* Original search location */}\n e.target.openPopup()}>\n \n Your search location\n \n \n {/* Circle radius */}\n \n \n \n );\n};\n\nexport default CarparkMap;\n","export default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n marginTop: '0.6rem',\n paddingBottom: '0.5rem',\n borderWidth: 2,\n borderRadius: 5,\n // backgroundColor: '#ECECEC',\n },\n cardContent: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n paddingTop: '0.5rem',\n paddingBottom: '0.1rem',\n },\n costBreakdownList: {\n width: '100%',\n paddingLeft: '0px',\n paddingRight: '0px',\n },\n costBreakdown: {\n width: 'auto',\n padding: '0.5rem',\n paddingBottom: '0.1rem',\n },\n redText: {\n color: 'red',\n },\n orangeText: {\n color: 'orange',\n },\n greenText: {\n color: 'green',\n },\n blackText: {\n color: 'black',\n },\n cpName: {\n fontSize: '16px',\n fontWeight: 700,\n lineHeight: '20px',\n },\n descriptionContainer: {\n paddingTop: '10px',\n },\n priceContainer: {\n position: 'relative',\n },\n priceText: {\n fontSize: '30px',\n position: 'absolute',\n bottom: 0,\n right: 0,\n },\n\n};\n","import React from 'react';\nimport {Container, Table, TableHead, TableRow, TableCell, TableBody, TableContainer, makeStyles, CardContent} from '@material-ui/core';\nimport carpark from '../../styles/carpark';\n\nconst useStyles = makeStyles(carpark);\n\nconst CostBreakdownDialog = ({breakdown}) => {\n const classes = useStyles();\n\n const parseTo12hr = (timeStr) => {\n const h = +timeStr.substr(0, 2);\n const hour = h % 12 || 12;\n const min = +timeStr.substr(2, 4);\n const ampm = (h < 12 || h === 24) ? 'am' : 'pm';\n const result = (min === 0) ? hour + ampm : hour + ':' + min + ampm;\n return result;\n };\n\n return (\n \n \n \n \n \n Cost\n Description\n Timerange\n \n \n \n {breakdown.map((row, index) => (\n \n {row.Cost.toFixed(2)}\n {row.Description}\n {parseTo12hr(row.Timerangestr.Start)} to {parseTo12hr(row.Timerangestr.End)}\n \n ))}\n \n
\n
\n
\n );\n};\n\nexport default CostBreakdownDialog;\n","import React, {useState} from 'react';\nimport {Grid, Button, Card, Collapse, CardActions, CardContent, Typography, makeStyles} from '@material-ui/core';\nimport carpark from '../../styles/carpark';\nimport CostBreakdownDialog from './CostBreakdownDialog';\nimport {useStore} from '../../Store';\n\nconst useStyles = makeStyles(carpark);\n\nconst CarparkCard = ({name, cost, carparkType, gantryHeight, distance, lots, lat, long, costBreakdown}) => {\n const {dispatch} = useStore();\n const classes = useStyles();\n const [expanded, setExpanded] = useState(false);\n const renderLotsInfo = (cpLots) => {\n return cpLots === '' ? 'No live lot data' : `${cpLots} lots available`;\n };\n const generateTextColor = (cpLots) => {\n if (cpLots==='') {\n return classes.blackText;\n } else if (cpLots>=100) {\n return classes.greenText;\n } else if (cpLots<100 && cpLots>=50) {\n return classes.orangeText;\n } else if (cpLots<50) {\n return classes.redText;\n }\n };\n\n const generateCPDescription = (carparkType, gantryHeight) => {\n if (gantryHeight==='') {\n return carparkType\n } else {\n return carparkType + ' | Gantry Height: ' + gantryHeight + 'm'\n }\n }\n\n const renderGmapLink = (lat, long) => {\n return `https://www.google.com/maps/dir/?api=1&destination=${lat},${long}&travelmode=driving`;\n };\n\n\n if (parseFloat(cost) < 0) {\n console.log('Issue with parsing cost: ', cost, ' for ', name);\n return '';\n }\n\n return (\n {\n console.log('click card');\n dispatch({type: 'SET_SELECTED_CP', payload: null});\n dispatch({type: 'SET_SELECTED_CP', payload: {lat, long, name}});\n }}>\n \n \n \n {name}\n \n \n {generateCPDescription(carparkType,gantryHeight)}\n \n \n \n Distance: {parseFloat(distance).toFixed(2)}m\n \n \n {renderLotsInfo(lots)}\n \n \n \n ${parseFloat(cost).toFixed(2)}\n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default CarparkCard;\n","import {Grid, Paper, LinearProgress, Backdrop, makeStyles, Typography} from '@material-ui/core';\nimport React, {useState, useEffect} from 'react';\nimport {estimatedTimeFactor, gifMap} from '../../constants';\nimport loadingsheet from '../../styles/loading';\nimport {useStore} from '../../Store';\n\nconst useStyles = makeStyles(loadingsheet);\n\nconst Loading = () => {\n const {store} = useStore();\n const [loader, setLoader] = useState(null);\n const {loading} = store;\n const classes = useStyles();\n useEffect(() => {\n if (store.loading) {\n const max = Object.keys(gifMap).length;\n const rng = Math.floor(Math.random() * (max - 1 + 1) ) + 1;\n setLoader(rng);\n }\n }, [store.loading]);\n return (\n \n \n \n {setLoader ? : ''}\n\n \n \n \n \n \n Estimated search/calculation time: {estimatedTimeFactor * store.params.radius / 1000}s\n \n \n \n );\n};\n\nexport default Loading;\n","export default {\n backdrop: {\n zIndex: 1000,\n width: '100vw',\n height: '110vh',\n backgroundColor: 'rgba(0,0,0,0.3)',\n color: '#fff',\n },\n paper: {\n display: 'flex',\n textAlign: 'center',\n flexDirection: 'column',\n justifyContent: 'center',\n alignContent: 'center',\n width: '90vw',\n maxWidth: '500px',\n paddingTop: '50px',\n height: '250px',\n position: 'absolute',\n top: '45%',\n transform: 'translateY(-50%)',\n },\n gifloader: {\n margin: 'auto',\n },\n loader: {\n width: '300px',\n height: '10px',\n borderRadius: '5px',\n margin: 'auto',\n },\n text: {\n marginBottom: '20%',\n marginTop: '1rem',\n },\n};\n","import React from 'react';\nimport {Container, Tabs, Tab, Typography, Link} from '@material-ui/core';\n\nimport CarparkCard from './CarparkCard';\nimport Scrollbar from 'react-scrollbars-custom';\nimport Loading from '../Loading';\nimport {useStore} from '../../Store';\n\nconst CarparkList = ({sortMode, handleChange, hideClosedCp, setHideClosedCp, closedCarparksExist}) => {\n const {store} = useStore();\n const carparkList = store.displayedCp;\n const {loading, data} = store;\n\n const recommendedCarpark = () => {\n return data.filter((cp) => {\n return cp.IsRecommended;\n });\n };\n const renderRecommended = () => {\n const cp = recommendedCarpark();\n return cp.length > 0 ? (\n <>\n {!hideClosedCp ? (\n setHideClosedCp(true)} color=\"secondary\" variant=\"caption\">\n Hide Closed Carparks\n \n ) : ''}\n \n \n ) : (\n <>\n No recommended carparks found\n {/* Below condition is true if closed carparks are in the results and are filtered */}\n {closedCarparksExist ? (\n setHideClosedCp(false)} color=\"secondary\" variant=\"caption\">\n Returned results contain carparks that are closed within selected duration. Click to show these carparks but park at your own risk. \n ) : ''}\n );\n };\n\n return loading ? : (\n \n \n Recommended Carpark\n \n {renderRecommended()}\n \n \n \n \n \n \n {carparkList.map((cp, index) => )}\n \n \n\n \n\n );\n};\n\nexport default CarparkList;\n","import React, {useState, useEffect} from 'react';\nimport PropTypes from 'prop-types';\nimport {useStore} from '../../Store';\nimport CarparkList from './CarparkList';\n\n\nconst CarparkListContainer = () => {\n const [sortMode, setSortMode] = useState(0);\n const {store, dispatch} = useStore();\n const [closedCarparksExist, setClosedCarparksExist] = useState(false);\n const [hideClosedCp, setHideClosedCp] = useState(true);\n\n useEffect(() => {\n let intermediateList = store.data;\n // Handle logic of hiding/showing closed carparks\n if (hideClosedCp) {\n intermediateList = intermediateList.filter((cp) => {\n const breakdown = cp.CostBreakdownList || [];\n // Filter out carpark if any 1 of the cost breakdown is closed\n return !breakdown.some((bd) => {\n if (bd.IsClosed) {\n setClosedCarparksExist(true);\n }\n return bd.IsClosed;\n });\n });\n }\n const slice = Math.min(intermediateList.length, 10);\n // Handle the sorting mode of the resultant list\n switch (sortMode) {\n case 0:\n intermediateList.sort((a, b) => a.Cost - b.Cost);\n // Only select top 10 maximum carparks\n intermediateList = intermediateList.slice(0, slice);\n dispatch({type: 'SET_DISPLAYED_CP', payload: []});\n dispatch({type: 'SET_DISPLAYED_CP', payload: intermediateList});\n break;\n case 1:\n intermediateList.sort((a, b) => a.Distance - b.Distance);\n // Only select top 10 maximum carparks\n intermediateList = intermediateList.slice(0, slice);\n dispatch({type: 'SET_DISPLAYED_CP', payload: []});\n dispatch({type: 'SET_DISPLAYED_CP', payload: intermediateList});\n\n break;\n default:\n // Only select top 10 maximum carparks\n intermediateList = intermediateList.slice(0, slice);\n dispatch({type: 'SET_DISPLAYED_CP', payload: []});\n dispatch({type: 'SET_DISPLAYED_CP', payload: intermediateList});\n }\n }, [store.data, sortMode, hideClosedCp, dispatch]);\n\n // Function to update sortMode when tab changes\n const handleChange = (event, newValue) => {\n setSortMode(newValue);\n };\n\n\n const componentProps = {\n sortMode,\n handleChange,\n hideClosedCp,\n setHideClosedCp,\n closedCarparksExist,\n };\n return (\n \n );\n};\n\nCarparkListContainer.propTypes = {\n sortMode: PropTypes.number,\n handleChange: PropTypes.func,\n hideClosedCp: PropTypes.bool,\n setHideClosedCp: PropTypes.func,\n closedCarparksExist: PropTypes.bool,\n};\n\nexport default CarparkListContainer;\n","import {makeStyles} from '@material-ui/core';\n\nimport React, {useEffect} from 'react';\nimport InputArea from '../../components/InputArea';\nimport CarparkMap from './CarparkMap';\n\nimport results from '../../styles/results';\nimport CarparkList from '../../components/CarparkList';\nimport {useStore} from '../../Store';\n\nconst useStyles = makeStyles(results);\n\nconst ResultsMain = () => {\n const classes = useStyles();\n const {store, dispatch} = useStore();\n\n useEffect(() => {\n if (store.data.length === 0) {\n const resString = sessionStorage.getItem('results');\n if (resString) {\n const data = JSON.parse(resString);\n dispatch({type: 'STORE_DATA', payload: data.data});\n }\n }\n if (Object.keys(store.params.address).length === 0) {\n const addrString = sessionStorage.getItem('address');\n if (addrString) {\n store.params.address = JSON.parse(addrString);\n dispatch({type: 'SET_SEARCH', payload: store.params});\n }\n }\n }, [dispatch, store]);\n return (\n
\n \n
\n \n
\n \n
\n );\n};\n\nexport default ResultsMain;\n","export default {\n root: {\n minHeight: '95vh',\n display: 'flex',\n flexDirection: 'column',\n },\n carparkRoot: {\n '& .leaflet-container': {\n width: '100%',\n height: '50vh',\n },\n },\n locationButton: {\n alignSelf: 'flex-end',\n marginRight: '1.3rem',\n marginTop: '-4.5rem',\n float: 'right',\n zIndex: 9999,\n },\n};\n\n","export default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n title: {\n marginTop: '2rem',\n },\n card: {\n width: '250px',\n height: '300px',\n margin: '0 0.5rem 1rem 0.5rem',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n },\n media: {\n height: '120px',\n width: 'auto',\n margin: '1rem auto',\n },\n devText: {\n margin: '0 2rem',\n },\n paragraph: {\n margin: '1rem 2rem',\n },\n iconRow: {\n display: 'flex',\n flexDirection: 'row',\n margin: 'auto',\n width: '25%',\n justifyContent: 'space-between',\n },\n};\n","import {Typography, Card, CardContent, CardMedia, makeStyles, Link} from '@material-ui/core';\nimport React from 'react';\nimport about from '../../styles/about';\nimport {devInfo} from '../../constants';\nimport LinkedInIcon from '@material-ui/icons/LinkedIn';\nimport GitHubIcon from '@material-ui/icons/GitHub';\n\nconst useStyles = makeStyles(about);\n\nconst InfoCard = ({person, reverse}) => {\n const classes = useStyles();\n const info = devInfo[person];\n return (\n \n \n \n \n {info.name}\n \n
\n \n \n \n \n \n \n
\n\n\n \n {info.desc}\n \n
\n
\n\n );\n};\n\nexport default InfoCard;\n","import {Typography, makeStyles} from '@material-ui/core';\nimport React from 'react';\nimport about from '../../styles/about';\nimport InfoCard from './InfoCard';\nimport {aboutInfo} from '../../constants';\n\nconst useStyles = makeStyles(about);\n\nconst AboutUs = () => {\n const classes = useStyles();\n return (\n
\n \n What is carparkwhere?\n
\n
\n \n {aboutInfo}\n \n \n Developers\n
\n
\n \n \n
\n );\n};\n\nexport default AboutUs;\n","import React from 'react';\nimport {ReactTypeformEmbed} from 'react-typeform-embed';\n\n// const useStyles = makeStyles(faq);\n\nconst ContactUs = () => {\n return (\n
\n \n
\n );\n};\n\nexport default ContactUs;\n","export default {\n display: 'flex',\n minHeight: '100vh',\n maxWidth: '800px',\n flexDirection: 'column',\n backgroundColor: '#ffffff',\n};\n","export default {\n root: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n accordionList: {\n width: '90%',\n },\n title: {\n marginTop: '2rem',\n },\n paragraph: {\n width: '90%',\n margin: '1rem 1rem',\n },\n};\n","import {Typography, Accordion, AccordionSummary, AccordionDetails, makeStyles} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport React from 'react';\nimport faq from '../../styles/faq';\n\nconst useStyles = makeStyles(faq);\n\nconst FaqAccordion = ({title, answer}) => {\n const classes = useStyles();\n return (\n \n }\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n {title}\n \n \n \n {answer}\n \n \n \n );\n};\n\nexport default FaqAccordion;\n","import {Typography, makeStyles} from '@material-ui/core';\nimport React from 'react';\nimport faq from '../../styles/faq';\nimport FaqAccordion from './FaqAccordion';\nimport {faqContent, termsAndConditions} from '../../constants';\n\nconst useStyles = makeStyles(faq);\n\nconst Faq = () => {\n const classes = useStyles();\n return (\n
\n \n FAQ\n
\n
\n
\n {faqContent.map((faq) => )}\n
\n

\n \n Terms And Conditions\n
\n
\n \n {termsAndConditions}\n \n {/* \n Terms and Conditions paragraph 2\n \n \n Terms and Conditions paragraph 3\n */}\n
\n );\n};\n\nexport default Faq;\n","import {Typography, Card, makeStyles} from '@material-ui/core';\nimport React from 'react';\nimport about from '../../styles/about';\n\nconst useStyles = makeStyles(about);\n\nconst NotFound = () => {\n const classes = useStyles();\n return (\n
\n \n 404 Not Found\n
\n
\n \n This route does not exist\n \n
\n );\n};\n\nexport default NotFound;\n","import {Container} from '@material-ui/core';\nimport React from 'react';\nimport {BrowserRouter, Switch, Route} from 'react-router-dom';\nimport Header from './pages/Header';\nimport HomeMain from './pages/Home/HomeMain';\nimport ResultsMain from './pages/Results/ResultsMain';\nimport Loading from './components/Loading';\nimport AboutUs from './pages/About';\nimport ContactUs from './pages/ContactUs';\nimport app from './styles/app';\nimport Faq from './pages/Faq';\nimport NotFound from './pages/NotFound';\n\nconst App = () => {\n // Load store results from cookies if exist\n return (\n \n \n\n \n
\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n","import {createMuiTheme} from '@material-ui/core/styles';\n\nconst theme = createMuiTheme({\n breakpoints: {\n xs: 0,\n sm: 800,\n },\n palette: {\n secondary: {\n light: '#00796b',\n main: '#ce6a85',\n dark: '#002984',\n },\n primary: {\n main: '#293745',\n light: '#e0f2ee',\n dark: '#5e35b1',\n },\n },\n typography: {\n // h6: '2.5rem',\n htmlFontSize: 17,\n fontFamily: [\n 'Cairo',\n 'Roboto',\n 'sans-serif',\n ].join(','),\n },\n // overrides: {\n // MuiGrid: {\n // item: {\n // padding: 'auto',\n // }\n // }\n // }\n});\n\nexport default theme;\n","import React from 'react';\n// Local imports\nimport {StoreProvider} from './Store';\n\nimport {MuiPickersUtilsProvider} from '@material-ui/pickers';\n// pick a date util library\nimport MomentUtils from '@date-io/moment';\nimport {ThemeProvider} from '@material-ui/core';\nimport theme from './styles/theme';\n\n// Wrapper to allow root to access commons\nconst Root = ({children}) => {\n return (\n \n \n \n {children}\n \n \n \n\n );\n};\n\nexport default Root;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport App from './App';\nimport Root from './Root';\nReactDOM.render(, document.querySelector('#root'));\n"],"sourceRoot":""}