{"version":3,"sources":["utils/createResource.ts","api/index.ts","utils/createResourceHook.ts","utils/createApiHook.ts","utils/gameUtils.ts","api/api.ts","utils/index.ts","components/Avatar/helpers.ts","components/Avatar/AvatarBase.tsx","components/Avatar/Avatar.tsx","components/Avatar/AvatarList.tsx","components/GamesList/GameListCard.tsx","components/GamesList/GameListSection.tsx","components/GamesList/GamesList.tsx","components/GamesPage/GamesPage.tsx","hooks/useGames.ts","hooks/useMatches.ts","context/GlobalStateProvider.tsx","hooks/usePageTitle.ts","hooks/useGlobalState.ts","containers/GamesPageContainer.tsx","components/SquaresGrid/SquaresGridCell.tsx","components/SquaresGrid/SquaresGridRow.tsx","components/SquaresGrid/SquaresGrid.tsx","components/GameGrid/GameGrid.tsx","components/MatchesList/MatchesList.tsx","components/PlayersList/PlayersList.tsx","components/Tabs/Tabs.tsx","components/GamePage/GamePage.tsx","containers/GamePageContainer.tsx","hooks/useRoute.ts","hooks/useGame.ts","components/LoadingIndicator/LoadingIndicator.tsx","components/Page/PageContent.tsx","components/Page/PageHeader.tsx","components/Page/Page.tsx","containers/PageContainer.tsx","serviceWorker.ts","index.tsx","App.tsx"],"names":["createResource","fetch","options","completeOptions","Object","assign","hashInput","input","ResourceImpl","D_a_duelsquares_duelsquares_DuelSquares_UI_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__","this","cache","SubscribableCache","cacheEntry","getCacheEntry","status","promise","error","value","Promise","resolve","undefined","set","callback","subscribe","get","newCacheEntry","then","cacheKey","Map","eventEmitter","EventEmitter","key","eventName","getEventName","emit","_this","listener","on","off","concat","_api__WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","d","__webpack_exports__","createResourceHook","resource","hook","hashedInput","resourceValue","read","_useState","useState","_useState2","D_a_duelsquares_duelsquares_DuelSquares_UI_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","setValue","useEffect","newValue","createApiHook","useResource","pollIntervalId","pollRefCount","pollInterval","window","setInterval","D_a_duelsquares_duelsquares_DuelSquares_UI_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__","D_a_duelsquares_duelsquares_DuelSquares_UI_node_modules_babel_preset_react_app_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","a","mark","_callee","wrap","_context","prev","next","sent","write","stop","isDisposed","clearInterval","getUniquePlayers","game","uniq","flatten","players","filter","player","getPayoutsAsArray","gameType","payoutPerRound","getWinningsPerSquare","matches","winnings","range","map","Array","fill","iterateGameMatches","match","x","y","payout","round","getWinningPlayerByMatch","winningPlayers","globalId","console","log","score1","score2","getWinningsInfoByPlayer","infoByPlayer","forEach","numberOfSquares","buyIn","profit","costPerSquare","iteratee","xByWinningNumbers","winningTeamNumbers","winningNumber","index","yByLosingNumbers","losingTeamNumbers","losingNumber","completed","_ref","_ref2","winningTeamScore","losingTeamDigit","api","listGames","_listGames","year","response","axios","abrupt","data","_x","apply","arguments","getGame","_getGame","_callee2","name","_context2","_x2","_x3","listMatches","_listMatches","_callee3","_context3","_x4","_createResourceHook__WEBPACK_IMPORTED_MODULE_1__","_createApiHook__WEBPACK_IMPORTED_MODULE_2__","_types__WEBPACK_IMPORTED_MODULE_3__","o","_gameUtils__WEBPACK_IMPORTED_MODULE_4__","getInitials","memoize","initials","toUpperCase","replace","length","namePieces","split","numberOfWords","getBackgroundColor","str","hash","i","charCodeAt","color","toString","substr","stringToColor","getTextColor","backgroundColor","_colorToRgb","colorAsHex","indexOf","slice","Error","r","parseInt","g","b","colorToRgb","_colorToRgb2","slicedToArray","classes","root","css","_templateObject","container","_templateObject2","text","_templateObject3","AvatarBase","props","tooltip","textColor","colorCssClass","_templateObject4","react_default","createElement","className","cx","title","Avatar","AvatarBase_AvatarBase","AvatarList_templateObject","AvatarList","names","count","overflow","overflowText","Avatar_Avatar","link","GameListCard_templateObject","card","GameListCard_templateObject2","cardBody","GameListCard_templateObject3","gameNotStartedMessage","GameListCard_templateObject4","GamesListCard","displayName","subtitle","payoutString","join","react_router_dom","to","Card","CardBody","CardTitle","CardSubtitle","gameStarted","AvatarList_AvatarList","section","GameListSection_templateObject","GameListSection_templateObject2","GameListSection_templateObject3","GamesListSection","games","Fragment","Container","fluid","Row","Col","xs","md","lg","xl","GameListCard_GamesListCard","GamesList","sections","GameListSection_GamesListSection","GamesPage","gamesByYear","years","keys","sort","reverse","GamesList_GamesList","useGames","useMatches","GlobalStateContext","React","createContext","GlobalStateProvider","_React$Component","classCallCheck","possibleConstructorReturn","getPrototypeOf","call","state","globalState","setGlobalState","setState","inherits","createClass","Provider","children","Component","usePageTitle","initialValue","_useContext","useContext","useCallback","objectSpread","defineProperty","entry","useGlobalState","useSetPageTitle","newPageTitle","_usePageTitle","_usePageTitle2","setPageTitle","GamesPageContainer","currentYear","Date","getFullYear","GamesPage_GamesPage","cell","SquaresGridCell_templateObject","pointer","SquaresGridCell_templateObject2","SquaresGridCell","onClick","onMouseEnter","onMouseLeave","SquaresGridRow","numberCell","SquaresGrid_templateObject","divider","SquaresGrid_templateObject2","winnerLabel","SquaresGrid_templateObject3","loserLabel","SquaresGrid_templateObject4","SquaresGrid","topNumbers","leftNumbers","cellRange","leftNumberIndex","SquaresGridRow_SquaresGridRow","SquaresGridCell_SquaresGridCell","topName","leftName","rowNumber","columnNumber","renderCell","Cell","selected","GameGrid_templateObject","hover","GameGrid_templateObject2","GameGrid_templateObject3","GameGrid_templateObject4","green","_templateObject5","GameGrid","selectedPlayer","setSelectedPlayer","_useState3","_useState4","hoveredPlayer","setHoveredPlayer","useMemo","team1Name","team2Name","SquaresGrid_SquaresGrid","cellClassName","cellPlayer","isCellHovered","isCellSelected","winner","MatchesList_templateObject","team","MatchesList_templateObject2","MatchesList","roundNames","sortedMatches","orderBy","isCompletedPage","winningPlayersByMatch","headerText","Table","striped","team1LogoUrl","team1LogoUri","team2LogoUrl","team2LogoUri","team1ClassName","team2ClassName","team1Winner","team2Winner","team1Seed","team2Seed","winningPlayer","winningAmount","detailsText","currentPeriod","currentClock","src","team1","team2","PlayersList_templateObject","red","PlayersList_templateObject2","PlayersList","winningsInfoByPlayer","sortedWinningsInfo","items","info","winningsClassName","profitClassName","Tabs_templateObject","Tabs_templateObject2","Tabs","tabs","activeTabIndex","setActiveTabIndex","ButtonGroup","tab","Button","outline","TabContent","activeTab","TabPane","tabId","renderContent","GamePage","completedMatches","liveMatches","GameGrid_GameGrid","MatchesList_MatchesList","push","PlayersList_PlayersList","Tabs_Tabs","GamePageContainer","_useRouteParams","useReactRouter","params","foundGame","find","useGame","GamePage_GamePage","LoadingIndicator","Spinner","PageContent_templateObject","nav","PageHeader_templateObject","brand","PageHeader_templateObject2","pageTitle","PageHeader_templateObject3","breadcrumbs","PageHeader_templateObject4","Page","Header","Content","PageContainer","Page_Page","react","fallback","LoadingIndicator_LoadingIndicator","Boolean","location","hostname","ReactDOM","render","GlobalStateProvider_GlobalStateProvider","PageContainer_PageContainer","react_router","exact","path","component","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"8JAyCO,SAASA,EACZC,EACAC,GAEA,IAIMC,EAAkBC,OAAOC,OAAO,GAJkB,CACpDC,UAAW,SAACC,GAAD,OAAWA,IAGgCL,GAC1D,OAAO,IAAIM,EAAaP,EAAOE,OAG7BK,aAMF,SAAAA,EAAYP,EAA4BC,GAAkCE,OAAAK,EAAA,EAAAL,CAAAM,KAAAF,GAAAE,KALnEJ,eAKkE,EAAAI,KAHjET,WAGiE,EAAAS,KAFjEC,WAEiE,EACrED,KAAKT,MAAQA,EACbS,KAAKJ,UAAYJ,EAAQI,UACzBI,KAAKC,MAAQ,IAAIC,EAAkBV,EAAQI,4DAGnCC,GACR,IAAMM,EAAaH,KAAKI,cAAcP,GAEtC,OAAQM,EAAWE,QACf,IAAK,UACD,MAAMF,EAAWG,QAErB,IAAK,WACD,MAAMH,EAAWI,MAErB,IAAK,WACD,OAAOJ,EAAWK,qCAIjBX,EAAcW,GACvB,IAAML,EAAgC,CAClCG,QAASG,QAAQC,QAAQF,GACzBH,OAAQ,WACRG,QACAD,WAAOI,GAGXX,KAAKC,MAAMW,IAAIf,EAAOM,qCAGTN,EAAcgB,GAC3B,OAAOb,KAAKC,MAAMa,UAAUjB,EAAO,SAACM,GACN,aAAtBA,EAAWE,QACXQ,EAASV,EAAWK,+CAKVX,GAClB,IAAMM,EAAaH,KAAKC,MAAMc,IAAIlB,GAClC,GAAIM,EACA,OAAOA,EAGX,IAAMG,EAAUN,KAAKT,MAAMM,GAErBmB,EAAmC,CACrCV,UACAD,OAAQ,UACRG,WAAOG,EACPJ,WAAOI,GAgBX,OAbAL,EAAQW,KACJ,SAACT,GACGQ,EAAcR,MAAQA,EACtBQ,EAAcX,OAAS,YAE3B,SAACE,GACGS,EAAcT,MAAQA,EACtBS,EAAcX,OAAS,aAI/BL,KAAKC,MAAMW,IAAIf,EAAOmB,GAEfA,WAITd,aAIF,SAAAA,EAAoBgB,GAAwCxB,OAAAK,EAAA,EAAAL,CAAAM,KAAAE,GAAAF,KAAAkB,WAAAlB,KAHpDC,MAAiC,IAAIkB,IAGcnB,KAFnDoB,aAAe,IAAIC,oDAIhBC,GACP,IAAMJ,EAAWlB,KAAKkB,SAASI,GAC/B,OAAOtB,KAAKC,MAAMc,IAAIG,+BAGfI,EAAQd,GACf,IAAMU,EAAWlB,KAAKkB,SAASI,GAC/BtB,KAAKC,MAAMW,IAAIM,EAAUV,GACzB,IAAMe,EAAYvB,KAAKwB,aAAaF,GACpCtB,KAAKoB,aAAaK,KAAKF,EAAWf,qCAGrBc,EAAQT,GAA0C,IAAAa,EAAA1B,KACzDuB,EAAYvB,KAAKwB,aAAaF,GAE9BK,EAAW,SAACnB,GAAD,OAAcK,EAASL,IAGxC,OAFAR,KAAKoB,aAAaQ,GAAGL,EAAWI,GAEzB,WACHD,EAAKN,aAAaS,IAAIN,EAAWI,yCAIpBL,GACjB,SAAAQ,OAAU9B,KAAKkB,SAASI,8CCjKhC,IAAAS,EAAAC,EAAA,IAAAA,EAAAC,EAAAC,EAAA,wBAAAH,EAAA,IAAAC,EAAA,gGCeO,SAASG,EACZ5C,EACAC,GAEA,IAAM4C,EAAW9C,YAAeC,EAAOC,GAEjC6C,EAAO,SAACxC,GACV,IAAMyC,EAAcF,EAASxC,UAAUC,GACjC0C,EAAgBH,EAASI,KAAK3C,GAFF4C,EAGRC,mBAASH,GAHDI,EAAAjD,OAAAkD,EAAA,EAAAlD,CAAA+C,EAAA,GAG3BjC,EAH2BmC,EAAA,GAGpBE,EAHoBF,EAAA,GAWlC,OANAG,oBAAU,WACNV,EAAStB,UAAUjB,EAAO,SAACkD,GACvBF,EAASE,MAEd,CAACT,IAEG9B,GAKX,OAFA6B,EAAKD,SAAWA,EAETC,+GCrBJ,SAASW,EACZzD,EACAC,GAEA,IAAMyD,EAAcd,6BAAmB5C,EAAOC,GACxC4C,EAAWa,EAAYb,SAEzBc,EAAiB,EACjBC,EAAe,EAkCnB,OAhCa,SAACtD,GACV,IAAMW,EAAQyC,EAAYpD,GA4B1B,OA1BAiD,oBAAU,WACN,GAAItD,GAAWA,EAAQ4D,aAAc,CACZ,IAAjBD,IACAD,EAAiBG,OAAOC,YAAP5D,OAAA6D,EAAA,EAAA7D,CAAA8D,EAAAC,EAAAC,KAAmB,SAAAC,IAAA,IAAAZ,EAAA,OAAAS,EAAAC,EAAAG,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAE,KAAA,EACTxE,EAAMM,GADG,OAC1BkD,EAD0Bc,EAAAG,KAEhC5B,EAAS6B,MAAMpE,EAAOkD,GAFU,wBAAAc,EAAAK,SAAAP,MAGjCnE,EAAQ4D,eAGfD,IAEA,IAAIgB,GAAa,EACjB,OAAO,WACEA,IACDA,GAAa,EAIQ,MAFrBhB,GAGIE,OAAOe,cAAclB,OAKtC,CAACd,EAASxC,UAAUC,KAEhBW,4OC3CR,SAAS6D,EAAiBC,GAC7B,OAAOC,eAAKC,kBAAQF,EAAKG,SAASC,OAAO,SAAAC,GAAM,QAAMA,KAGlD,SAASC,EAAkBN,GAC9B,MAAsB,mBAAlBA,EAAKO,SACE,CACHP,EAAKQ,eAAe,GACpBR,EAAKQ,eAAe,GACpBR,EAAKQ,eAAe,GACpBR,EAAKQ,eAAe,GACpBR,EAAKQ,eAAe,GACpBR,EAAKQ,eAAe,IAGjB,CAACR,EAAKQ,eAAe,GAAMR,EAAKQ,eAAe,GAAMR,EAAKQ,eAAe,GAAMR,EAAKQ,eAAe,IAI3G,SAASC,EAAqBT,EAAYU,GAC7C,IAAMC,EAAWC,gBAAM,IAAIC,IAAI,kBAAMC,MAAM,IAAIC,KAAK,KAOpD,OALAC,EAAmBhB,EAAMU,EAAS,SAACO,EAAOC,EAAGC,GACzC,IAAMC,EAASpB,EAAKQ,eAAL,GAAAhD,OAAuByD,EAAMI,QAC5CV,EAASO,GAAGC,IAAMC,IAGfT,EAGJ,SAASW,EAAwBtB,EAAYU,GAChD,IAAMa,EAAqC,GAO3C,OALAP,EAAmBhB,EAAMU,EAAS,SAACO,EAAOC,EAAGC,GACzCI,EAAeN,EAAMO,UAAYxB,EAAKG,QAAQe,GAAGC,GACjDM,QAAQC,IAAI,KAAMT,EAAMU,OAAQV,EAAMW,OAAQV,EAAGC,KAG9CI,EAGJ,SAASM,EAAwB7B,EAAYU,GAChD,IAAMoB,EAA+C,GA4BrD,OA1BA9B,EAAKG,QAAQ4B,QAAQ,SAAA5B,GACjBA,EAAQ4B,QAAQ,SAAA1B,GACPyB,EAAazB,KACdyB,EAAazB,GAAU,CACnBA,SACA2B,gBAAiB,EACjBC,MAAO,EACPtB,SAAU,EACVuB,OAAQ,IAIhBJ,EAAazB,GAAQ2B,iBAAmB,EACxCF,EAAazB,GAAQ4B,OAASjC,EAAKmC,cACnCL,EAAazB,GAAQ6B,QAAUlC,EAAKmC,kBAI5CnB,EAAmBhB,EAAMU,EAAS,SAACO,EAAOC,EAAGC,GACzC,IAAMC,EAASpB,EAAKQ,eAAL,GAAAhD,OAAuByD,EAAMI,QACtChB,EAASL,EAAKG,QAAQe,GAAGC,GAE/BW,EAAazB,GAAQM,UAAYS,EACjCU,EAAazB,GAAQ6B,QAAUd,IAG5BU,EAGX,SAASd,EAAmBhB,EAAYU,EAAkB0B,GACtD,IAAMC,EAA8C,GACpDrC,EAAKsC,mBAAmBzB,IAAI,SAAC0B,EAAeC,GACxCH,EAAkBE,GAAiBC,IAGvC,IAAMC,EAA6C,GACnDzC,EAAK0C,kBAAkB7B,IAAI,SAAC8B,EAAcH,GACtCC,EAAiBE,GAAgBH,IAErCf,QAAQC,IAAIe,IAEX/B,GAAW,IACPN,OAAO,SAAAa,GAAK,OAAIA,EAAM2B,WAA8B,MAAhB3B,EAAMU,aAAkCtF,GAAhB4E,EAAMU,QAAyC,MAAhBV,EAAMW,aAAkCvF,GAAhB4E,EAAMW,SACzHG,QAAQ,SAAAd,GACL,IADc4B,EACI5B,EAAMU,OAASV,EAAMW,QAA4B,cAAlB5B,EAAKO,SAEhD,CAACU,EAAMU,OAAQV,EAAMW,QACrB,CAACX,EAAMW,OAAQX,EAAMU,QAJbmB,EAAA1H,OAAAkD,EAAA,EAAAlD,CAAAyH,EAAA,GAEPE,EAFOD,EAAA,GAORE,EAPQF,EAAA,GAO4B,GAEpC5B,EAAImB,EAHeU,EAAmB,IAItC5B,EAAIsB,EAAiBO,GAG3BZ,EAASnB,EAAOE,EAAGD,qHC7GlB+B,EAAM,CACfC,UAAS,eAAAC,EAAA/H,OAAA6D,EAAA,EAAA7D,CAAA8D,EAAAC,EAAAC,KAAE,SAAAC,EAAO+D,GAAP,IAAAC,EAAA,OAAAnE,EAAAC,EAAAG,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAE,KAAA,EACgB6D,IAAM7G,IAAN,cAAAe,OAA2C4F,EAA3C,WADhB,cACDC,EADC9D,EAAAG,KAAAH,EAAAgE,OAAA,SAEAF,EAASG,KAAKtH,OAFd,wBAAAqD,EAAAK,SAAAP,MAAF,gBAAAoE,GAAA,OAAAN,EAAAO,MAAAhI,KAAAiI,YAAA,GAKTC,QAAO,eAAAC,EAAAzI,OAAA6D,EAAA,EAAA7D,CAAA8D,EAAAC,EAAAC,KAAE,SAAA0E,EAAOV,EAAcW,GAArB,IAAAV,EAAA,OAAAnE,EAAAC,EAAAG,KAAA,SAAA0E,GAAA,cAAAA,EAAAxE,KAAAwE,EAAAvE,MAAA,cAAAuE,EAAAvE,KAAA,EACkB6D,IAAM7G,IAAN,cAAAe,OAA8B4F,EAA9B,WAAA5F,OAA4CuG,IAD9D,cACCV,EADDW,EAAAtE,KAAAsE,EAAAT,OAAA,SAEEF,EAASG,MAFX,wBAAAQ,EAAApE,SAAAkE,MAAF,gBAAAG,EAAAC,GAAA,OAAAL,EAAAH,MAAAhI,KAAAiI,YAAA,GAKPQ,YAAW,eAAAC,EAAAhJ,OAAA6D,EAAA,EAAA7D,CAAA8D,EAAAC,EAAAC,KAAE,SAAAiF,EAAOjB,GAAP,IAAAC,EAAA,OAAAnE,EAAAC,EAAAG,KAAA,SAAAgF,GAAA,cAAAA,EAAA9E,KAAA8E,EAAA7E,MAAA,cAAA6E,EAAA7E,KAAA,EACc6D,IAAM7G,IAAN,cAAAe,OAA4C4F,EAA5C,aADd,cACHC,EADGiB,EAAA5E,KAAA4E,EAAAf,OAAA,SAEFF,EAASG,KAAKtH,OAFZ,wBAAAoI,EAAA1E,SAAAyE,MAAF,gBAAAE,GAAA,OAAAH,EAAAV,MAAAhI,KAAAiI,YAAA,2FCdfjG,EAAA,QAAA8G,EAAA9G,EAAA,IAAAA,EAAAC,EAAAC,EAAA,uCAAA4G,EAAA,QAAAC,EAAA/G,EAAA,IAAAA,EAAAC,EAAAC,EAAA,kCAAA6G,EAAA,QAAAC,EAAAhH,EAAA,IAAAA,EAAAiH,EAAAD,EAAA,sBAAAhH,EAAAC,EAAAC,EAAA,sCAAA8G,EAAA,oBAAAhH,EAAAiH,EAAAD,EAAA,qBAAAhH,EAAAC,EAAAC,EAAA,qCAAA8G,EAAA,mBAAAhH,EAAAiH,EAAAD,EAAA,4BAAAhH,EAAAC,EAAAC,EAAA,4CAAA8G,EAAA,0BAAAhH,EAAAiH,EAAAD,EAAA,4BAAAhH,EAAAC,EAAAC,EAAA,4CAAA8G,EAAA,0BAAAhH,EAAAiH,EAAAD,EAAA,yBAAAhH,EAAAC,EAAAC,EAAA,yCAAA8G,EAAA,2BAAAE,EAAAlH,EAAA,IAAAA,EAAAC,EAAAC,EAAA,sCAAAgH,EAAA,IAAAlH,EAAAC,EAAAC,EAAA,qCAAAgH,EAAA,IAAAlH,EAAAC,EAAAC,EAAA,4CAAAgH,EAAA,IAAAlH,EAAAC,EAAAC,EAAA,4CAAAgH,EAAA,IAAAlH,EAAAC,EAAAC,EAAA,yCAAAgH,EAAA,uMCOaC,EAAcC,kBACvB,SAACf,GAGG,IAAIgB,EAEJ,IAJAhB,GAAQA,GAAQ,IAAIiB,cAAcC,QAAQ,cAAe,KAIhDC,QAAU,EACfH,EAAWhB,MACR,CACH,IAAMoB,EAAapB,EAAKqB,MAAM,KACxBC,EAAgBF,EAAWD,OAGjCH,IAFqBM,EAAgB,EAAIF,EAAW,GAAG,GAAK,KAEhC,MADRE,EAAgB,EAAIF,EAAWE,EAAgB,GAAG,GAAK,KACzB,IAGtD,OAAON,EAASG,OAASH,EAAW,MAI/BO,EAAqBR,kBAC9B,SAACf,GAKG,OAJIA,EAAKmB,QAAU,IACfnB,EAAOA,EAAOA,EAAOA,GAgBjC,SAAuBwB,GAEnB,IADA,IAAIC,EAAO,EACFC,EAAI,EAAGA,EAAIF,EAAIL,OAAQO,IAC5BD,EAAOD,EAAIG,WAAWD,KAAOD,GAAQ,GAAKA,GAI9C,IADA,IAAIG,EAAQ,IACHF,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,IAAMvJ,EAASsJ,GAAa,EAAJC,EAAU,IAClCE,IAAU,KAAOzJ,EAAM0J,SAAS,KAAKC,QAAQ,GAGjD,OAAOF,EAzBIG,CAAc/B,KAIhBgC,EAAejB,kBACxB,SAACkB,GAAoC,IAAAC,EAwBzC,SAAoBC,GACgB,IAA5BA,EAAWC,QAAQ,OACnBD,EAAaA,EAAWE,MAAM,IAIR,IAAtBF,EAAWhB,SACXgB,EAAaA,EAAW,GAAKA,EAAW,GAAKA,EAAW,GAAKA,EAAW,GAAKA,EAAW,GAAKA,EAAW,IAG5G,GAA0B,IAAtBA,EAAWhB,OACX,MAAM,IAAImB,MAAM,qBAGpB,IAAMC,EAAIC,SAASL,EAAWE,MAAM,EAAG,GAAI,IACrCI,EAAID,SAASL,EAAWE,MAAM,EAAG,GAAI,IACrCK,EAAIF,SAASL,EAAWE,MAAM,EAAG,GAAI,IAE3C,MAAO,CAACE,EAAGE,EAAGC,GAzCQC,CAAWV,GADIW,EAAAvL,OAAAwL,EAAA,EAAAxL,CAAA6K,EAAA,GAGjC,MADyB,KAFQU,EAAA,GAEI,KAFJA,EAAA,GAEgB,KAFhBA,EAAA,GAEwB,IACnC,UAAY,smBC/B1C,IAAME,EAAU,CACZC,KAAMC,YAAFC,KAIJC,UAAWF,YAAFG,KAOTC,KAAMJ,YAAFK,MAQKC,EAAa,SAACC,GACvB,IAAMH,EAAOG,EAAMH,KACbI,EAAUD,EAAMC,SAAWJ,EAE3BnB,EAAkBsB,EAAMtB,iBAAmB,UAC3CwB,EAAYzB,EAAaC,GAEzByB,EAAgBV,YAAHW,IACK1B,EACXwB,GAGb,OACIG,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,EAAQC,MACpBa,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWC,YAAGjB,EAAQI,UAAWQ,GAAgBM,MAAOR,GACzDI,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,EAAQM,MAAOA,MCrClCa,EAAS,SAACV,GAAuB,IAClCvD,EAASuD,EAATvD,KAEFgB,EAAWF,EAAYd,GACvBiC,EAAkBV,EAAmBvB,GAE3C,OAAO4D,EAAAxI,EAAAyI,cAACK,EAAD,CAAYd,KAAMpC,EAAUwC,QAASxD,EAAMiC,gBAAiBA,8ICJvE,IAAMa,EAAU,CACZC,KAAMC,YAAFmB,MAOKC,EAAa,SAACb,GAA2B,IAC1Cc,EAAiBd,EAAjBc,MAAOC,EAAUf,EAAVe,MAETC,EAAWF,EAAMlD,OAASmD,EAC1BE,EAAY,IAAA/K,OAAO8K,GAEzB,OACIX,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,EAAQC,MACnBsB,EAAMhC,MAAM,EAAGiC,GAAOxH,IAAI,SAACkD,GACxB,OAAO4D,EAAAxI,EAAAyI,cAACY,EAAD,CAAQxL,IAAK+G,EAAMA,KAAMA,MAEnCuE,EAAW,GAAKX,EAAAxI,EAAAyI,cAACK,EAAD,CAAYd,KAAMoB,whCChB/C,IAAM1B,EAAU,CACZ4B,KAAM1B,YAAF2B,KAKJC,KAAM5B,YAAF6B,KAmBJC,SAAU9B,YAAF+B,KAQRC,sBAAuBhC,YAAFiC,MAKZC,EAAgB,SAAC3B,GAA8B,IAChDtH,EAASsH,EAATtH,KAEJ+H,EAAQ/H,EAAKkJ,YACK,mBAAlBlJ,EAAKO,SACLwH,EAAQ/H,EAAKkJ,YAAc,qBACF,cAAlBlJ,EAAKO,WACZwH,EAAQ/H,EAAKkJ,YAAc,iBAG/B,IAAMC,EAAQ,IAAA3L,OAAOwC,EAAKmC,cAAZ,eAERhC,EAAUJ,2BAAiBC,GAE3BoJ,EAAe9I,4BAAkBN,GAClCa,IAAI,SAACO,GAAD,MAAY,IAAMA,IACtBiI,KAAK,OAEV,OACI1B,EAAAxI,EAAAyI,cAAC0B,EAAA,EAAD,CAAMzB,UAAWhB,EAAQ4B,KAAMc,GAAE,UAAA/L,OAAYwC,EAAKoD,KAAjB,WAAA5F,OAA+BwC,EAAK+D,OACjE4D,EAAAxI,EAAAyI,cAAC4B,EAAA,EAAD,CAAM3B,UAAWhB,EAAQ8B,MACrBhB,EAAAxI,EAAAyI,cAAC6B,EAAA,EAAD,CAAU5B,UAAWhB,EAAQgC,UACzBlB,EAAAxI,EAAAyI,cAAA,WACID,EAAAxI,EAAAyI,cAAC8B,EAAA,EAAD,KACI/B,EAAAxI,EAAAyI,cAAA,UAAKG,IAETJ,EAAAxI,EAAAyI,cAAC+B,EAAA,EAAD,KAAeR,IAEnBxB,EAAAxI,EAAAyI,cAAA,OAAKC,UAAU,qBACXF,EAAAxI,EAAAyI,cAAA,qBACAD,EAAAxI,EAAAyI,cAAA,YAAOwB,IAEXzB,EAAAxI,EAAAyI,cAAA,WACID,EAAAxI,EAAAyI,cAAA,qBACC5H,EAAK4J,YACFjC,EAAAxI,EAAAyI,cAACiC,EAAD,CAAYzB,MAAOjI,EAASkI,MAAO,IAEnCV,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,EAAQkC,uBAAxB,2WC7E5B,IAAMlC,EAAU,CACZiD,QAAS/C,YAAFgD,KAIPhC,MAAOhB,YAAFiD,KAIL/C,UAAWF,YAAFkD,MAMAC,EAAmB,SAAC5C,GAAiC,IACtDS,EAAiBT,EAAjBS,MAAOoC,EAAU7C,EAAV6C,MAEf,OACIxC,EAAAxI,EAAAyI,cAACD,EAAAxI,EAAMiL,SAAP,KACKD,GAASA,EAAMjF,QACZyC,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,EAAQiD,SACpBnC,EAAAxI,EAAAyI,cAAA,MAAIC,UAAWhB,EAAQkB,OAAQA,GAC/BJ,EAAAxI,EAAAyI,cAACyC,EAAA,EAAD,CAAWC,OAAO,EAAMzC,UAAWhB,EAAQI,WACvCU,EAAAxI,EAAAyI,cAAC2C,EAAA,EAAD,KACKJ,EAAMtJ,IAAI,SAACb,GACR,OACI2H,EAAAxI,EAAAyI,cAAC4C,EAAA,EAAD,CAAKxN,IAAKgD,EAAK+D,KAAM0G,GAAG,KAAKC,GAAG,IAAIC,GAAG,IAAIC,GAAG,KAC1CjD,EAAAxI,EAAAyI,cAACiD,EAAD,CAAe7N,IAAKgD,EAAK+D,KAAM/D,KAAMA,YChChE8K,EAAY,SAACxD,GAA0B,IACxCyD,EAAazD,EAAbyD,SAER,OACIpD,EAAAxI,EAAAyI,cAACD,EAAAxI,EAAMiL,SAAP,KACKW,EAASlK,IAAI,SAACiJ,GACX,OAAOnC,EAAAxI,EAAAyI,cAACoD,EAAD,CAAkBhO,IAAK8M,EAAQ/B,MAAOA,MAAO+B,EAAQ/B,MAAOoC,MAAOL,EAAQK,YCJrFc,EAAY,SAAC3D,GAA0B,IACxC4D,EAAgB5D,EAAhB4D,YAEFC,EAAQ/P,OAAOgQ,KAAKF,GAC1BC,EAAME,OAAOC,UAEb,IAAMP,EAAWI,EACZ/K,OAAO,SAACgD,GACL,QAAS8H,EAAY9H,GAAM8B,SAE9BrE,IAAI,SAACuC,GACF,MAAO,CACH2E,MAAO3E,EACP+G,MAAOe,EAAY9H,MAI/B,OAAOuE,EAAAxI,EAAAyI,cAAC2D,EAAD,CAAWR,SAAUA,aCvBnBS,EAAW9M,wBAAc,SAAC0E,GAAD,OAAkBH,MAAIC,UAAUE,KCAzDqI,EAAa/M,wBAAc,SAAC0E,GAAD,OAAkBH,MAAIkB,YAAYf,IAAO,CAC7EtE,aAAc,iECQL4M,GAAqBC,IAAMC,cAAuC,MAMlEC,GAAb,SAAAC,GACI,SAAAD,EAAYvE,GAAiC,IAAAlK,EAAA,OAAAhC,OAAA2Q,EAAA,EAAA3Q,CAAAM,KAAAmQ,IACzCzO,EAAAhC,OAAA4Q,GAAA,EAAA5Q,CAAAM,KAAAN,OAAA6Q,GAAA,EAAA7Q,CAAAyQ,GAAAK,KAAAxQ,KAAM4L,KAED6E,MAAQ,CACTC,YAAa,GACbC,eAAgB,SAACF,GAAD,OAAW/O,EAAKkP,SAAS,CAAEF,YAAaD,MALnB/O,EADjD,OAAAhC,OAAAmR,GAAA,EAAAnR,CAAAyQ,EAAAC,GAAA1Q,OAAAoR,EAAA,EAAApR,CAAAyQ,EAAA,EAAA7O,IAAA,SAAAd,MAAA,WAWQ,OAAOyL,EAAAxI,EAAAyI,cAAC8D,GAAmBe,SAApB,CAA6BvQ,MAAOR,KAAKyQ,OAAQzQ,KAAK4L,MAAMoF,cAX3Eb,EAAA,CAAyCF,IAAMgB,WCflCC,GAAe,WACxB,OCD0B,SAAI5P,EAAa6P,GAA6C,IAAAC,EAChDC,qBAAWrB,IAA3CU,EADgFU,EAChFV,YAAaC,EADmES,EACnET,eAEf9N,EAAWyO,sBACb,SAACvO,GACG4N,EAAejR,OAAA6R,EAAA,EAAA7R,CAAA,GACRgR,EADOhR,OAAA8R,EAAA,EAAA9R,CAAA,GAET4B,EAAM,CAAEd,MAAOuC,OAGxB,CAACzB,IAGCmQ,EAAQf,EAAYpP,GAU1B,OARAwB,oBAAU,WACD2O,GACD5O,EAASsO,IAEd,CAAC7P,IAIG,CAFOmQ,EAAQA,EAAMjR,MAAQ2Q,EAErBtO,GDtBR6O,CAAe,YAAa,KAG1BC,GAAkB,SAACC,GAA+B,IAAAC,EACzBX,KADyBY,EAAApS,OAAAwL,EAAA,EAAAxL,CAAAmS,EAAA,GACzCE,GADyCD,EAAA,GAAAA,EAAA,IAE3DhP,oBAAU,kBAAMiP,EAAaH,IAAe,CAACA,yBEH1C,IAAMI,GAAqB,WAI9B,IAHA,IAAMC,GAAc,IAAIC,MAAOC,cACzB3C,EAAkC,GAE/B9H,EAAO,KAAMA,GAAQuK,EAAavK,IAAQ,CAC/C,IAAM+G,EAAQqB,EAASpI,EAAKwC,YAAYxF,OAAO,SAAAJ,GAAI,OAAIA,EAAK4J,cAC5DsB,EAAY9H,GAAQ+G,EAKxB,OAFAkD,GAAgB,SAET1F,EAAAxI,EAAAyI,cAACkG,EAAD,CAAW5C,YAAaA,uWCNnC,IAAMrE,GAAU,CACZkH,KAAMhH,YAAFiH,MASJC,QAASlH,YAAFmH,OAKEC,GAAkB,SAAC7G,GAC5B,IAAMO,EAAYC,YAAGjB,GAAQkH,KAAMzG,EAAMO,UAAWP,EAAM8G,SAAWvH,GAAQoH,SAE7E,OACItG,EAAAxI,EAAAyI,cAAA,MACIC,UAAWA,EACXuG,QAAS9G,EAAM8G,QACfC,aAAc/G,EAAM+G,aACpBC,aAAchH,EAAMgH,cAEnBhH,EAAMoF,WC9BN6B,GAAiB,SAACjH,GAC3B,OAAOK,EAAAxI,EAAAyI,cAAA,UAAKN,EAAMoF,yxBCQtB,IAAM7F,GAAU,CACZ2H,WAAYzH,YAAF0H,MAOVC,QAAS3H,YAAF4H,MAMPC,YAAa7H,YAAF8H,MAQXC,WAAY/H,YAAFgI,OASDC,GAAc,SAAC1H,GACxB,IAAM2H,EAAa3H,EAAM2H,YAAc,GACjCC,EAAc5H,EAAM4H,aAAe,GACnCC,EAAYvO,gBAAM,IAEpBwO,EAAkB,EAEtB,OACIzH,EAAAxI,EAAAyI,cAAA,aACID,EAAAxI,EAAAyI,cAAA,aACID,EAAAxI,EAAAyI,cAACyH,GAAD,KACI1H,EAAAxI,EAAAyI,cAAC0H,GAAD,CAAiBzH,UAAWhB,GAAQ2H,YAChC7G,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQ+H,aAActH,EAAMiI,SAC5C5H,EAAAxI,EAAAyI,cAAA,MAAIC,UAAWhB,GAAQ6H,UACvB/G,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQiI,YAAaxH,EAAMkI,WAE9CL,EAAUtO,IAAI,SAAC2B,GACZ,OACImF,EAAAxI,EAAAyI,cAAC0H,GAAD,CAAiBzH,UAAWhB,GAAQ2H,WAAYxR,IAAKwF,GAChDyM,EAAWzM,OAK3B2M,EAAUtO,IAAI,SAAC4O,GACZ,OACI9H,EAAAxI,EAAAyI,cAACyH,GAAD,CAAgBrS,IAAKyS,GACjB9H,EAAAxI,EAAAyI,cAAC0H,GAAD,CAAiBzH,UAAWhB,GAAQ2H,WAAYxR,IAAKoS,GAChDF,EAAYE,MAEhBD,EAAUtO,IAAI,SAAC6O,GACZ,OAAOpI,EAAMqI,WAAWF,EAAWC,2qBAUnEV,GAAYY,KAAOzB,GC5EnB,IAAMtH,GAAU,CACZgJ,SAAU9I,YAAF+I,MAIRC,MAAOhJ,YAAFiJ,MAIL3P,OAAQ0G,YAAFkJ,MASNtP,SAAUoG,YAAFmJ,MAKRC,MAAOpJ,YAAFqJ,OAKIC,GAAW,SAAC/I,GAAyB,IACtCtH,EAAkBsH,EAAlBtH,KAAMU,EAAY4G,EAAZ5G,QADgCvC,EAGFC,mBAAwB,MAHtBC,EAAAjD,OAAAwL,EAAA,EAAAxL,CAAA+C,EAAA,GAGvCmS,EAHuCjS,EAAA,GAGvBkS,EAHuBlS,EAAA,GAAAmS,EAIJpS,mBAAwB,MAJpBqS,EAAArV,OAAAwL,EAAA,EAAAxL,CAAAoV,EAAA,GAIvCE,EAJuCD,EAAA,GAIxBE,EAJwBF,EAAA,GAMxC9P,EAAWiQ,kBAAQ,kBAAMnQ,+BAAqBT,EAAMU,IAAU,CAACV,EAAMU,IAEvE6O,EAAU,SACVC,EAAW,QAMf,MALsB,cAAlBxP,EAAKO,WACLgP,EAAUvP,EAAK6Q,UACfrB,EAAWxP,EAAK8Q,WAIhBnJ,EAAAxI,EAAAyI,cAACmJ,GAAD,CACI9B,WAAYjP,EAAKsC,mBACjB4M,YAAalP,EAAK0C,kBAClB6M,QAASA,EACTC,SAAUA,EACVG,WAAY,SAACzO,EAAGC,GACZ,IAEI6P,EAFEC,EAAajR,EAAKG,QAAQe,GAAGC,GAInC,GAAIuP,EAAe,CACf,IAAMQ,EAAgBD,GAAcP,GAAiBO,IAAeP,EACpEM,EAAgBlJ,YAAGkJ,EAAeE,GAAiBrK,GAAQkJ,OAG/D,GAAIO,EAAgB,CAChB,IAAMa,EAAiBF,GAAcX,GAAkBW,IAAeX,EACtEU,EAAgBlJ,YAAGkJ,EAAeG,GAAkBtK,GAAQgJ,UAGhE,OACIlI,EAAAxI,EAAAyI,cAACmJ,GAAYnB,KAAb,CACI/H,UAAWmJ,EACX5C,QAAS,kBAAMmC,EAAkBvQ,EAAKG,QAAQe,GAAGC,KACjDkN,aAAc,kBAAMsC,EAAiB3Q,EAAKG,QAAQe,GAAGC,KACrDmN,aAAc,kBAAMqC,EAAiB,QAErChJ,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQxG,QAAS4Q,GACjCtJ,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWC,YAAGjB,GAAQlG,WAAYA,EAASO,GAAGC,IAAM0F,GAAQsJ,QAC5DxP,EAASO,GAAGC,GAAZ,IAAA3D,OAAqBmD,EAASO,GAAGC,IAAO,sXCtErE,IAAM0F,GAAU,CACZuK,OAAQrK,YAAFsK,MAINC,KAAMvK,YAAFwK,OAYKC,GAAc,SAAClK,GAA4B,IAC5CtH,EAAkBsH,EAAlBtH,KAAMU,EAAY4G,EAAZ5G,QAEV+Q,EAAuB,GAEL,mBAAlBzR,EAAKO,SACLkR,EAAa,CAAC,UAAW,UAAW,UAAW,gBAAiB,cAAe,aAAc,gBACpE,cAAlBzR,EAAKO,WACZkR,EAAa,CAAC,GAAI,gBAAiB,YAAa,gBAAiB,gBAGrE,IAAMC,EAAgBd,kBAAQ,WAC1B,OAAOe,kBAAQjR,EAAS,CAAC,SAAU,CAAC,UACrC,CAACV,EAAMU,IAEJkR,KAAkBF,GAAiBA,EAAcxM,OAAS,IAAIwM,EAAc,GAAG9O,UAE/EiP,EAAwBjB,kBAAQ,kBAAMtP,kCAAwBtB,EAAM0R,IAAgB,CAAC1R,EAAM0R,IAE3FI,EAAaF,EAAkB,0BAA4B,eAEjE,OACIjK,EAAAxI,EAAAyI,cAACmK,GAAA,EAAD,CAAOC,SAAS,GACZrK,EAAAxI,EAAAyI,cAAA,aACID,EAAAxI,EAAAyI,cAAA,UACID,EAAAxI,EAAAyI,cAAA,mBACAD,EAAAxI,EAAAyI,cAAA,mBACAD,EAAAxI,EAAAyI,cAAA,UAAKkK,KAGbnK,EAAAxI,EAAAyI,cAAA,aACK8J,EAAc7Q,IAAI,SAACI,GAGhB,IAAMgR,EAAehR,EAAMiR,aACrBC,EAAelR,EAAMmR,aAEvBC,EAAiB,GACjBC,EAAiB,GAEC,mBAAlBtS,EAAKO,UAAiCqR,IACtCS,EAAiBpR,EAAMsR,YAAc1L,GAAQuK,OAAS,GACtDkB,EAAiBrR,EAAMuR,YAAc3L,GAAQuK,OAAS,IAG1D,IAAMqB,EAAcxR,EAAMwR,UAAYxR,EAAMwR,UAAY,GAClDC,EAAczR,EAAMyR,UAAYzR,EAAMyR,UAAY,GAElDC,EAAgBd,EAAsB5Q,EAAMO,UAC5CoR,EAAgB5S,EAAKQ,eAAL,GAAAhD,OAAuByD,EAAMI,QAE/CwR,EAAc,GAEdjB,EAEAiB,EADkBD,EAAgB,KAAOD,EAClB,GAAAnV,OAAMmV,EAAN,OAAAnV,OAAyBoV,EAAzB,KAA4C,IAG/DC,EADwB,aAAxB5R,EAAM6R,cACQ,WAEH,GAAAtV,OAAMyD,EAAM8R,aAAZ,OAAAvV,OAA8ByD,EAAM6R,eAIvD,IAAMnR,EAA0B,MAAhBV,EAAMU,aAAkCtF,GAAhB4E,EAAMU,OAAuBV,EAAMU,OAAS,MAC9EC,EAA0B,MAAhBX,EAAMW,aAAkCvF,GAAhB4E,EAAMW,OAAuBX,EAAMW,OAAS,MAEpF,OACI+F,EAAAxI,EAAAyI,cAAA,MAAI5K,IAAKiE,EAAMO,UACXmG,EAAAxI,EAAAyI,cAAA,UAAK6J,EAAWxQ,EAAMI,QAAUJ,EAAMI,OACtCsG,EAAAxI,EAAAyI,cAAA,UACID,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWC,YAAGjB,GAAQyK,KAAMe,IAC5B9L,SAAStF,EAAMmC,KAAM,KAAO,MAAQ6O,GACjCtK,EAAAxI,EAAAyI,cAAA,OAAKC,UAAU,qBAAqBmL,IAAKf,IAE7CtK,EAAAxI,EAAAyI,cAAA,eAAApK,OAAUiV,EAAV,KAAAjV,OAAuByD,EAAMgS,MAA7B,OAAAzV,OAAwCmE,KAE5CgG,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWC,YAAGjB,GAAQyK,KAAMgB,IAC5B/L,SAAStF,EAAMmC,KAAM,KAAO,MAAQ+O,GACjCxK,EAAAxI,EAAAyI,cAAA,OAAKC,UAAU,qBAAqBmL,IAAKb,IAE7CxK,EAAAxI,EAAAyI,cAAA,eAAApK,OAAUkV,EAAV,KAAAlV,OAAuByD,EAAMiS,MAA7B,OAAA1V,OAAwCoE,MAGhD+F,EAAAxI,EAAAyI,cAAA,UAAKiL,+MCtGjC,IAAMhM,GAAU,CACZsJ,MAAOpJ,YAAFoM,MAILC,IAAKrM,YAAFsM,OAKMC,GAAc,SAAChM,GAA4B,IAC5CtH,EAAkBsH,EAAlBtH,KAAMU,EAAY4G,EAAZ5G,QAER6S,EAAuB3C,kBAAQ,kBAAM/O,kCAAwB7B,EAAMU,IAAU,CAACV,EAAMU,IAEpF8S,EAAqB5C,kBAAQ,WAC/B,IAAM6C,EAAQrY,OAAOgQ,KAAKmI,GAAsB1S,IAAI,SAACR,GAAD,OAAYkT,EAAqBlT,KAErF,OADAsR,kBAAQ8B,EAAO,CAAC,YAAa,CAAC,SACvBA,GACR,CAACF,IAEJ,OACI5L,EAAAxI,EAAAyI,cAACmK,GAAA,EAAD,CAAOC,SAAS,GACZrK,EAAAxI,EAAAyI,cAAA,aACID,EAAAxI,EAAAyI,cAAA,UACID,EAAAxI,EAAAyI,cAAA,qBACAD,EAAAxI,EAAAyI,cAAA,qBACAD,EAAAxI,EAAAyI,cAAA,sBACAD,EAAAxI,EAAAyI,cAAA,sBAGRD,EAAAxI,EAAAyI,cAAA,aACK4L,EAAmB3S,IAAI,SAAC6S,GACrB,IAAMC,EAAoBD,EAAK/S,SAAW,EAAIkG,GAAQsJ,MAAQ,GACxDyD,EAAkBF,EAAKxR,OAAS,EAAI2E,GAAQsJ,MAAQuD,EAAKxR,OAAS,EAAI2E,GAAQuM,IAAM,GAE1F,OACIzL,EAAAxI,EAAAyI,cAAA,MAAI5K,IAAK0W,EAAKrT,QACVsH,EAAAxI,EAAAyI,cAAA,UAAK8L,EAAKrT,QACVsH,EAAAxI,EAAAyI,cAAA,UAAK8L,EAAK1R,iBACV2F,EAAAxI,EAAAyI,cAAA,MAAIC,UAAW8L,GAAf,IAAAnW,OAAuCkW,EAAK/S,WAC5CgH,EAAAxI,EAAAyI,cAAA,MAAIC,UAAW+L,GAAf,IAAApW,OAAqCkW,EAAKxR,2SCzCtE,IAAM2E,GAAU,CACZC,KAAMC,YAAF8M,MAMJ9L,MAAOhB,YAAF+M,OAKIC,GAAO,SAACzM,GAAqB,IAC9B0M,EAAS1M,EAAT0M,KAD8B7V,EAGMC,mBAAS,GAHfC,EAAAjD,OAAAwL,EAAA,EAAAxL,CAAA+C,EAAA,GAG/B8V,EAH+B5V,EAAA,GAGf6V,EAHe7V,EAAA,GAKtC,OACIsJ,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQC,MACpBa,EAAAxI,EAAAyI,cAACuM,GAAA,EAAD,KACKH,EAAKnT,IAAI,SAACuT,EAAK5R,GACZ,OACImF,EAAAxI,EAAAyI,cAACyM,GAAA,EAAD,CACIrX,IAAKwF,EACL8R,SAAS,EACT3O,MAAM,OACNkC,UAAWC,YAAGjB,GAAQkB,MAAOkM,IAAmBzR,EAAQ,SAAW,IACnE4L,QAAS,kBAAM8F,EAAkB1R,KAEhC4R,EAAIrM,UAKrBJ,EAAAxI,EAAAyI,cAAC2M,GAAA,EAAD,CAAYC,UAAWP,GAClBD,EAAKnT,IAAI,SAACuT,EAAK5R,GACZ,OACImF,EAAAxI,EAAAyI,cAAC6M,GAAA,EAAD,CAASzX,IAAKwF,EAAOkS,MAAOlS,GACvB4R,EAAIO,sBCtCpBC,GAAW,SAACtN,GAAyB,IACtCtH,EAAkBsH,EAAlBtH,KAAMU,EAAY4G,EAAZ5G,QAERmU,EAAmBnU,EAAQN,OAAO,SAAAa,GAAK,OAAIA,EAAM2B,YACjDkS,EAAcpU,EAAQN,OAAO,SAAAa,GAAK,OAAKA,EAAM2B,YAE7CoR,EAAc,CAChB,CACIjM,MAAO,OACP4M,cAAe,WACX,OAAOhN,EAAAxI,EAAAyI,cAACmN,GAAD,CAAU/U,KAAMA,EAAMU,QAASA,MAG9C,CACIqH,MAAyB,mBAAlB/H,EAAKO,SAAgC,iBAAmB,UAC/DoU,cAAe,WACX,OAAOhN,EAAAxI,EAAAyI,cAACoN,GAAD,CAAahV,KAAMA,EAAMU,QAASmU,OAqBrD,OAhBMC,GAAeA,EAAY5P,OAAS,GACtC8O,EAAKiB,KAAK,CACNlN,MAAyB,mBAAlB/H,EAAKO,SAAgC,aAAe,eAC3DoU,cAAe,WACX,OAAOhN,EAAAxI,EAAAyI,cAACoN,GAAD,CAAahV,KAAMA,EAAMU,QAASoU,OAKrDd,EAAKiB,KAAK,CACNlN,MAAO,UACP4M,cAAe,WACX,OAAOhN,EAAAxI,EAAAyI,cAACsN,GAAD,CAAalV,KAAMA,EAAMU,QAASmU,OAK7ClN,EAAAxI,EAAAyI,cAACD,EAAAxI,EAAMiL,SAAP,KACIzC,EAAAxI,EAAAyI,cAACuN,GAAD,CAAMnB,KAAMA,MC/CXoB,GAAoB,WAAM,IAAAC,ECFjBC,OAAVrU,MACKsU,ODELnS,EAD2BiS,EAC3BjS,KAEFpD,EELa,SAACoD,EAAcW,GAClC,IAEMyR,EAFQhK,EAASpI,GAECqS,KAAK,SAACzV,GAAD,OAAUA,EAAKoD,OAASA,GAAQpD,EAAK+D,OAASA,IAE3E,IAAKyR,EACD,MAAM,IAAInP,MAAJ,QAAA7I,OAAkB4F,EAAlB,KAAA5F,OAA0BuG,EAA1B,gBAGV,OAAOyR,EFJME,CAAQtS,EAHciS,EACrBtR,MAGRrD,EAAU+K,EAAWrI,GAAMhD,OAAO,SAACa,GAAD,OAAWA,EAAMV,WAAaP,EAAKO,WAEvEwH,EAAQ/H,EAAKkJ,YASjB,MARsB,mBAAlBlJ,EAAKO,SACLwH,EAAQ/H,EAAKkJ,YAAc,qBACF,cAAlBlJ,EAAKO,WACZwH,EAAQ/H,EAAKkJ,YAAc,iBAG/BmE,GAAgBtF,GAETJ,EAAAxI,EAAAyI,cAAC+N,GAAD,CAAU3V,KAAMA,EAAMU,QAASA,eGjB7BkV,GAAmB,WAC5B,OAAOjO,EAAAxI,EAAAyI,cAACiO,GAAA,EAAD,CAASlQ,MAAM,gNCG1B,IAAMkB,GAAU,CACZC,KAAMC,YAAF+O,gyCCOR,IAAMjP,GAAU,CACZkP,IAAKhP,YAAFiP,MASHC,MAAOlP,YAAFmP,MAeLC,UAAWpP,YAAFqP,MAMTC,YAAatP,YAAFuP,OCtCFC,GAAO,SAACjP,GACjB,OAAOK,EAAAxI,EAAAyI,cAACD,EAAAxI,EAAMiL,SAAP,KAAiB9C,EAAMoF,WAGlC6J,GAAKC,OD2DqB,SAAClP,GAA2B,IAC1C2O,EAAqB3O,EAArB2O,MAAOE,EAAc7O,EAAd6O,UAEf,OACIxO,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQkP,KACpBpO,EAAAxI,EAAAyI,cAAC0B,EAAA,EAAD,CAAMC,GAAG,IAAI1B,UAAWhB,GAAQoP,OAC5BtO,EAAAxI,EAAAyI,cAAA,UAAKqO,IAETtO,EAAAxI,EAAAyI,cAAA,MAAIC,UAAWhB,GAAQsP,WAAYA,KClE/CI,GAAKE,QFGsB,SAACnP,GACxB,OAAOK,EAAAxI,EAAAyI,cAAA,OAAKC,UAAWhB,GAAQC,MAAOQ,EAAMoF,WGRzC,IAAMgK,GAAgB,SAACpP,GAAqB,IACvCoF,EAAapF,EAAboF,SADuCa,EAG3BX,KAAbuJ,EAHwC/a,OAAAwL,EAAA,EAAAxL,CAAAmS,EAAA,MAK/C,OACI5F,EAAAxI,EAAAyI,cAAC+O,GAAD,KACIhP,EAAAxI,EAAAyI,cAAC+O,GAAKH,OAAN,CAAaP,MAAM,eAAeE,UAAWA,IAC7CxO,EAAAxI,EAAAyI,cAAC+O,GAAKF,QAAN,KACI9O,EAAAxI,EAAAyI,cAACgP,EAAA,SAAD,CAAUC,SAAUlP,EAAAxI,EAAAyI,cAACkP,GAAD,OAAuBpK,MCNvCqK,QACa,cAA7BhY,OAAOiY,SAASC,UAEiB,UAA7BlY,OAAOiY,SAASC,UAEhBlY,OAAOiY,SAASC,SAAShW,MAAM,2DCXvCiW,IAASC,OAAOxP,EAAAxI,EAAAyI,cCAG,WACf,OACID,EAAAxI,EAAAyI,cAACwP,GAAD,KACIzP,EAAAxI,EAAAyI,cAAC0B,EAAA,EAAD,KACI3B,EAAAxI,EAAAyI,cAACyP,GAAD,KACI1P,EAAAxI,EAAAyI,cAAC0P,EAAA,OAAD,KACI3P,EAAAxI,EAAAyI,cAAC0P,EAAA,MAAD,CAAOC,OAAO,EAAMC,KAAK,IAAIC,UAAW/J,KACxC/F,EAAAxI,EAAAyI,cAAC0P,EAAA,MAAD,CAAOE,KAAK,2BAA2BC,UAAWrC,KAClDzN,EAAAxI,EAAAyI,cAAC0P,EAAA,SAAD,CAAU/N,GAAG,WDRrB,MAASmO,SAASC,eAAe,SDyHzC,kBAAmBC,WACnBA,UAAUC,cAAcC,MAAMnb,KAAK,SAACob,GAChCA,EAAaC","file":"static/js/main.590c5a3a.chunk.js","sourcesContent":["import EventEmitter from \"eventemitter3\";\r\n\r\n/**********************************************************************************************************************\r\n * Experimental react-cache implementation\r\n ***********************************************************************************************************************\r\n * This is an alternate implementation of https://github.com/facebook/react/tree/master/packages/react-cache\r\n * that adds adds functionality to (1) write new values to the cache and (2) subscribe to cache changes.\r\n *\r\n * Note that this will most likely be obsolete in the future once the Context.write feature is finalized,\r\n * and this code should be updated to use the official react-cache package at that time.\r\n **********************************************************************************************************************/\r\n\r\n/* tslint:disable max-classes-per-file*/\r\n\r\nexport interface Resource {\r\n read: (input: Input) => Value;\r\n write: (input: Input, value: Value) => void;\r\n subscribe: (input: Input, callback: (value: Value) => void) => () => void;\r\n hashInput(input: Input): string | number;\r\n}\r\n\r\nexport interface ResourceOptions {\r\n hashInput: (input: Input) => string | number;\r\n}\r\n\r\nexport type Fetch = (input: Input) => PromiseLike;\r\n\r\ninterface CacheEntry {\r\n promise: PromiseLike;\r\n status: \"pending\" | \"resolved\" | \"rejected\";\r\n value: Value;\r\n error: any;\r\n}\r\n\r\nexport function createResource(\r\n fetch: Fetch,\r\n): Resource;\r\nexport function createResource(\r\n fetch: Fetch,\r\n options: ResourceOptions,\r\n): Resource;\r\nexport function createResource(\r\n fetch: Fetch,\r\n options?: ResourceOptions,\r\n): Resource {\r\n const defaultOptions: Partial> = {\r\n hashInput: (input) => input as any,\r\n };\r\n\r\n const completeOptions = Object.assign({}, defaultOptions, options);\r\n return new ResourceImpl(fetch, completeOptions);\r\n}\r\n\r\nclass ResourceImpl implements Resource {\r\n public hashInput: (input: Input) => string | number;\r\n\r\n private fetch: Fetch;\r\n private cache: SubscribableCache>;\r\n\r\n constructor(fetch: Fetch, options: ResourceOptions) {\r\n this.fetch = fetch;\r\n this.hashInput = options.hashInput;\r\n this.cache = new SubscribableCache(options.hashInput);\r\n }\r\n\r\n public read(input: Input): Value {\r\n const cacheEntry = this.getCacheEntry(input);\r\n\r\n switch (cacheEntry.status) {\r\n case \"pending\":\r\n throw cacheEntry.promise;\r\n\r\n case \"rejected\":\r\n throw cacheEntry.error;\r\n\r\n case \"resolved\":\r\n return cacheEntry.value;\r\n }\r\n }\r\n\r\n public write(input: Input, value: Value) {\r\n const cacheEntry: CacheEntry = {\r\n promise: Promise.resolve(value),\r\n status: \"resolved\",\r\n value,\r\n error: undefined,\r\n };\r\n\r\n this.cache.set(input, cacheEntry);\r\n }\r\n\r\n public subscribe(input: Input, callback: (value: Value) => void): () => void {\r\n return this.cache.subscribe(input, (cacheEntry) => {\r\n if (cacheEntry.status === \"resolved\") {\r\n callback(cacheEntry.value);\r\n }\r\n });\r\n }\r\n\r\n private getCacheEntry(input: Input): CacheEntry {\r\n const cacheEntry = this.cache.get(input);\r\n if (cacheEntry) {\r\n return cacheEntry;\r\n }\r\n\r\n const promise = this.fetch(input);\r\n\r\n const newCacheEntry: CacheEntry = {\r\n promise,\r\n status: \"pending\",\r\n value: undefined as any,\r\n error: undefined,\r\n };\r\n\r\n promise.then(\r\n (value) => {\r\n newCacheEntry.value = value;\r\n newCacheEntry.status = \"resolved\";\r\n },\r\n (error) => {\r\n newCacheEntry.error = error;\r\n newCacheEntry.status = \"rejected\";\r\n },\r\n );\r\n\r\n this.cache.set(input, newCacheEntry);\r\n\r\n return newCacheEntry;\r\n }\r\n}\r\n\r\nclass SubscribableCache {\r\n private cache: Map = new Map();\r\n private eventEmitter = new EventEmitter();\r\n\r\n constructor(private cacheKey: (key: K) => string | number) {}\r\n\r\n public get(key: K): V | undefined {\r\n const cacheKey = this.cacheKey(key);\r\n return this.cache.get(cacheKey);\r\n }\r\n\r\n public set(key: K, value: V): void {\r\n const cacheKey = this.cacheKey(key);\r\n this.cache.set(cacheKey, value);\r\n const eventName = this.getEventName(key);\r\n this.eventEmitter.emit(eventName, value);\r\n }\r\n\r\n public subscribe(key: K, callback: (value: V) => void): () => void {\r\n const eventName = this.getEventName(key);\r\n\r\n const listener = (value: V) => callback(value);\r\n this.eventEmitter.on(eventName, listener);\r\n\r\n return () => {\r\n this.eventEmitter.off(eventName, listener);\r\n };\r\n }\r\n\r\n private getEventName(key: K): string {\r\n return `${this.cacheKey(key)}`;\r\n }\r\n}\r\n","export * from \"./api\";\r\nexport * from \"./contracts\";\r\n","import { useEffect, useState } from \"react\";\r\nimport { createResource, Fetch, Resource, ResourceOptions } from \"./createResource\";\r\n\r\nexport interface ResourceHook {\r\n (input: Input): Value;\r\n resource: Resource;\r\n}\r\n\r\nexport function createResourceHook(\r\n fetch: Fetch,\r\n): ResourceHook;\r\nexport function createResourceHook(\r\n fetch: Fetch,\r\n options: ResourceOptions,\r\n): ResourceHook;\r\nexport function createResourceHook(\r\n fetch: Fetch,\r\n options?: ResourceOptions,\r\n): ResourceHook {\r\n const resource = createResource(fetch, options as ResourceOptions);\r\n\r\n const hook = (input: Input): Value => {\r\n const hashedInput = resource.hashInput(input);\r\n const resourceValue = resource.read(input);\r\n const [value, setValue] = useState(resourceValue);\r\n\r\n useEffect(() => {\r\n resource.subscribe(input, (newValue) => {\r\n setValue(newValue);\r\n });\r\n }, [hashedInput]);\r\n\r\n return value;\r\n };\r\n\r\n hook.resource = resource;\r\n\r\n return hook;\r\n}\r\n","import { useEffect } from \"react\";\r\nimport { createResourceHook } from \".\";\r\nimport { Fetch, ResourceOptions } from \"./createResource\";\r\n\r\nexport interface ApiHookOptions {\r\n pollInterval?: number;\r\n}\r\n\r\nexport function createApiHook(\r\n fetch: Fetch,\r\n options?: ApiHookOptions,\r\n): (input: Input) => Value;\r\nexport function createApiHook(\r\n fetch: Fetch,\r\n options: ApiHookOptions & ResourceOptions,\r\n): (input: Input) => Value;\r\nexport function createApiHook(\r\n fetch: Fetch,\r\n options?: ApiHookOptions | (ApiHookOptions & ResourceOptions),\r\n): (input: Input) => Value {\r\n const useResource = createResourceHook(fetch, options as ResourceOptions);\r\n const resource = useResource.resource;\r\n\r\n let pollIntervalId = 0;\r\n let pollRefCount = 0;\r\n\r\n const hook = (input: Input): Value => {\r\n const value = useResource(input);\r\n\r\n useEffect(() => {\r\n if (options && options.pollInterval) {\r\n if (pollRefCount === 0) {\r\n pollIntervalId = window.setInterval(async () => {\r\n const newValue = await fetch(input);\r\n resource.write(input, newValue);\r\n }, options.pollInterval);\r\n }\r\n\r\n pollRefCount++;\r\n\r\n let isDisposed = false;\r\n return () => {\r\n if (!isDisposed) {\r\n isDisposed = true;\r\n\r\n pollRefCount--;\r\n\r\n if (pollRefCount === 0) {\r\n window.clearInterval(pollIntervalId);\r\n }\r\n }\r\n };\r\n }\r\n }, [resource.hashInput(input)]);\r\n\r\n return value;\r\n };\r\n\r\n return hook;\r\n}\r\n","import { flatten, range, uniq } from \"lodash\";\r\nimport { Dictionary, NumberDictionary } from \".\";\r\nimport { Game, Match } from \"../api\";\r\n\r\nexport interface PlayerWinningsInfo {\r\n player: string;\r\n numberOfSquares: number;\r\n buyIn: number;\r\n winnings: number;\r\n profit: number;\r\n}\r\n\r\nexport function getUniquePlayers(game: Game): string[] {\r\n return uniq(flatten(game.players).filter(player => !!player));\r\n}\r\n\r\nexport function getPayoutsAsArray(game: Game): number[] {\r\n if (game.gameType === \"NCAATournament\") {\r\n return [\r\n game.payoutPerRound[\"1\"],\r\n game.payoutPerRound[\"2\"],\r\n game.payoutPerRound[\"3\"],\r\n game.payoutPerRound[\"4\"],\r\n game.payoutPerRound[\"5\"],\r\n game.payoutPerRound[\"6\"]\r\n ];\r\n } else {\r\n return [game.payoutPerRound[\"1\"], game.payoutPerRound[\"2\"], game.payoutPerRound[\"3\"], game.payoutPerRound[\"4\"]];\r\n }\r\n}\r\n\r\nexport function getWinningsPerSquare(game: Game, matches: Match[]): number[][] {\r\n const winnings = range(10).map(() => Array(10).fill(0));\r\n\r\n iterateGameMatches(game, matches, (match, x, y) => {\r\n const payout = game.payoutPerRound[`${match.round}`];\r\n winnings[x][y] += payout;\r\n });\r\n\r\n return winnings;\r\n}\r\n\r\nexport function getWinningPlayerByMatch(game: Game, matches: Match[]): Dictionary {\r\n const winningPlayers: Dictionary = {};\r\n\r\n iterateGameMatches(game, matches, (match, x, y) => {\r\n winningPlayers[match.globalId] = game.players[x][y];\r\n console.log(\"XY\", match.score1, match.score2, x, y);\r\n });\r\n\r\n return winningPlayers;\r\n}\r\n\r\nexport function getWinningsInfoByPlayer(game: Game, matches: Match[]): Dictionary {\r\n const infoByPlayer: Dictionary = {};\r\n\r\n game.players.forEach(players => {\r\n players.forEach(player => {\r\n if (!infoByPlayer[player]) {\r\n infoByPlayer[player] = {\r\n player,\r\n numberOfSquares: 0,\r\n buyIn: 0,\r\n winnings: 0,\r\n profit: 0\r\n };\r\n }\r\n\r\n infoByPlayer[player].numberOfSquares += 1;\r\n infoByPlayer[player].buyIn += game.costPerSquare;\r\n infoByPlayer[player].profit -= game.costPerSquare;\r\n });\r\n });\r\n\r\n iterateGameMatches(game, matches, (match, x, y) => {\r\n const payout = game.payoutPerRound[`${match.round}`];\r\n const player = game.players[x][y];\r\n\r\n infoByPlayer[player].winnings += payout;\r\n infoByPlayer[player].profit += payout;\r\n });\r\n\r\n return infoByPlayer;\r\n}\r\n\r\nfunction iterateGameMatches(game: Game, matches: Match[], iteratee: (match: Match, x: number, y: number) => void) {\r\n const xByWinningNumbers: NumberDictionary = {};\r\n game.winningTeamNumbers.map((winningNumber, index) => {\r\n xByWinningNumbers[winningNumber] = index;\r\n });\r\n\r\n const yByLosingNumbers: NumberDictionary = {};\r\n game.losingTeamNumbers.map((losingNumber, index) => {\r\n yByLosingNumbers[losingNumber] = index;\r\n });\r\n console.log(yByLosingNumbers);\r\n\r\n (matches || [])\r\n .filter(match => match.completed && (match.score1 != null && match.score1 != undefined) && (match.score2 != null && match.score2 != undefined))\r\n .forEach(match => {\r\n const useScore1 = match.score1 > match.score2 || game.gameType === \"SuperBowl\";\r\n const [winningTeamScore, losingTeamScore] = useScore1\r\n ? [match.score1, match.score2]\r\n : [match.score2, match.score1];\r\n\r\n const winningTeamDigit = winningTeamScore % 10;\r\n const losingTeamDigit = losingTeamScore % 10;\r\n\r\n const x = xByWinningNumbers[winningTeamDigit];\r\n const y = yByLosingNumbers[losingTeamDigit];\r\n\r\n // TODO: X and Y are backwards. Fix at some point!\r\n iteratee(match, y, x);\r\n });\r\n}\r\n","import axios from \"axios\";\r\nimport { Game, Match } from \"./contracts\";\r\n\r\nexport const api = {\r\n listGames: async (year: string): Promise => {\r\n const response = await axios.get<{ value: Game[] }>(`/api/years/${year}/games`);\r\n return response.data.value;\r\n },\r\n\r\n getGame: async (year: string, name: string): Promise => {\r\n const response = await axios.get(`/api/years/${year}/games/${name}`);\r\n return response.data;\r\n },\r\n\r\n listMatches: async (year: string): Promise => {\r\n const response = await axios.get<{ value: Match[] }>(`/api/years/${year}/matches`);\r\n return response.data.value;\r\n },\r\n};\r\n","export * from \"./createResource\";\r\nexport * from \"./createResourceHook\";\r\nexport * from \"./createApiHook\";\r\nexport * from \"./types\";\r\nexport * from \"./gameUtils\";\r\n","import { memoize } from \"lodash\";\r\n\r\nexport interface AvatarColors {\r\n backgroundColor: string;\r\n textColor: string;\r\n}\r\n\r\nexport const getInitials = memoize(\r\n (name: string): string => {\r\n name = (name || \"\").toUpperCase().replace(/[^a-zA-Z ]/g, \"\");\r\n\r\n let initials: string;\r\n\r\n if (name.length <= 2) {\r\n initials = name;\r\n } else {\r\n const namePieces = name.split(\" \");\r\n const numberOfWords = namePieces.length;\r\n const firstInitial = numberOfWords > 0 ? namePieces[0][0] : \"\";\r\n const lastInitial = numberOfWords > 1 ? namePieces[numberOfWords - 1][0] : \"\";\r\n initials = (firstInitial || \"\") + (lastInitial || \"\");\r\n }\r\n\r\n return initials.length ? initials : \"?\";\r\n },\r\n);\r\n\r\nexport const getBackgroundColor = memoize(\r\n (name: string): string => {\r\n if (name.length <= 3) {\r\n name = name + name + name;\r\n }\r\n\r\n return stringToColor(name);\r\n },\r\n);\r\n\r\nexport const getTextColor = memoize(\r\n (backgroundColor: string): string => {\r\n const [r, g, b] = colorToRgb(backgroundColor);\r\n const isColorLight = r * 0.299 + g * 0.587 + b * 0.114 > 186;\r\n return isColorLight ? \"#000000\" : \"#FFFFFF\";\r\n },\r\n);\r\n\r\n/* tslint:disable:no-bitwise */\r\nfunction stringToColor(str: string) {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\r\n }\r\n\r\n let color = \"#\";\r\n for (let i = 0; i < 3; i++) {\r\n const value = (hash >> (i * 8)) & 0xff;\r\n color += (\"00\" + value.toString(16)).substr(-2);\r\n }\r\n\r\n return color;\r\n}\r\n/* tslint:enable:no-bitwise */\r\n\r\nfunction colorToRgb(colorAsHex: string): [number, number, number] {\r\n if (colorAsHex.indexOf(\"#\") === 0) {\r\n colorAsHex = colorAsHex.slice(1);\r\n }\r\n\r\n // convert 3-digit hex to 6-digits.\r\n if (colorAsHex.length === 3) {\r\n colorAsHex = colorAsHex[0] + colorAsHex[0] + colorAsHex[1] + colorAsHex[1] + colorAsHex[2] + colorAsHex[2];\r\n }\r\n\r\n if (colorAsHex.length !== 6) {\r\n throw new Error(\"Invalid HEX color\");\r\n }\r\n\r\n const r = parseInt(colorAsHex.slice(0, 2), 16);\r\n const g = parseInt(colorAsHex.slice(2, 4), 16);\r\n const b = parseInt(colorAsHex.slice(4, 6), 16);\r\n\r\n return [r, g, b];\r\n}\r\n","import { css, cx } from \"emotion\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { getTextColor } from \"./helpers\";\r\n\r\nexport interface AvatarBaseProps {\r\n text: string;\r\n tooltip?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\nconst classes = {\r\n root: css`\r\n display: inline-block;\r\n `,\r\n\r\n container: css`\r\n display: table;\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n `,\r\n\r\n text: css`\r\n display: table-cell;\r\n text-align: center;\r\n vertical-align: middle;\r\n font-size: 18px;\r\n `,\r\n};\r\n\r\nexport const AvatarBase = (props: AvatarBaseProps) => {\r\n const text = props.text;\r\n const tooltip = props.tooltip || text;\r\n\r\n const backgroundColor = props.backgroundColor || \"#E5E7E9\";\r\n const textColor = getTextColor(backgroundColor);\r\n\r\n const colorCssClass = css`\r\n background-color: ${backgroundColor};\r\n color: ${textColor};\r\n `;\r\n\r\n return (\r\n
\r\n
\r\n
{text}
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { ReactNode } from \"react\";\r\nimport { AvatarBase } from \"./AvatarBase\";\r\nimport { getBackgroundColor, getInitials } from \"./helpers\";\r\n\r\nexport interface AvatarProps {\r\n name: string;\r\n}\r\n\r\nexport const Avatar = (props: AvatarProps) => {\r\n const { name } = props;\r\n\r\n const initials = getInitials(name);\r\n const backgroundColor = getBackgroundColor(name);\r\n\r\n return ;\r\n};\r\n","import { css } from \"emotion\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { Avatar } from \".\";\r\nimport { AvatarBase } from \"./AvatarBase\";\r\n\r\nexport interface AvatarListProps {\r\n names: string[];\r\n count: number;\r\n}\r\n\r\nconst classes = {\r\n root: css`\r\n & > div {\r\n margin-right: 6px;\r\n }\r\n `,\r\n};\r\n\r\nexport const AvatarList = (props: AvatarListProps) => {\r\n const { names, count } = props;\r\n\r\n const overflow = names.length - count;\r\n const overflowText = `+${overflow}`;\r\n\r\n return (\r\n
\r\n {names.slice(0, count).map((name) => {\r\n return ;\r\n })}\r\n {overflow > 0 && }\r\n
\r\n );\r\n};\r\n","import { css } from \"emotion\";\r\nimport { flatten, uniq } from \"lodash\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Card, CardBody, CardSubtitle, CardTitle } from \"reactstrap\";\r\nimport { Game } from \"../../api\";\r\nimport { getPayoutsAsArray, getUniquePlayers } from \"../../utils\";\r\nimport { AvatarList } from \"../Avatar/AvatarList\";\r\n\r\nexport interface GamesListCardProps {\r\n game: Game;\r\n}\r\n\r\nconst classes = {\r\n link: css`\r\n color: inherit !important;\r\n text-decoration: none !important;\r\n `,\r\n\r\n card: css`\r\n margin-bottom: 16px;\r\n box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14),\r\n 0px 2px 1px -1px rgba(0, 0, 0, 0.12);\r\n cursor: pointer;\r\n\r\n &:hover {\r\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14),\r\n 0px 1px 14px 0px rgba(0, 0, 0, 0.12);\r\n }\r\n\r\n h6 {\r\n margin-bottom: 16px;\r\n font-size: 14px;\r\n color: grey;\r\n text-transform: uppercase;\r\n }\r\n `,\r\n\r\n cardBody: css`\r\n font-size: 14px;\r\n\r\n > div {\r\n margin-bottom: 32px;\r\n }\r\n `,\r\n\r\n gameNotStartedMessage: css`\r\n font-style: italic;\r\n `,\r\n};\r\n\r\nexport const GamesListCard = (props: GamesListCardProps) => {\r\n const { game } = props;\r\n\r\n let title = game.displayName;\r\n if (game.gameType === \"NCAATournament\") {\r\n title = game.displayName + \" - NCAA Tournament\";\r\n } else if (game.gameType === \"SuperBowl\") {\r\n title = game.displayName + \" - Super Bowl\";\r\n }\r\n\r\n const subtitle = `$${game.costPerSquare} per square`;\r\n\r\n const players = getUniquePlayers(game);\r\n\r\n const payoutString = getPayoutsAsArray(game)\r\n .map((payout) => \"$\" + payout)\r\n .join(\" / \");\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n

{title}

\r\n
\r\n {subtitle}\r\n
\r\n
\r\n
Payouts
\r\n {payoutString}\r\n
\r\n
\r\n
Players
\r\n {game.gameStarted ? (\r\n \r\n ) : (\r\n
Game not started
\r\n )}\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import { css } from \"emotion\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { Col, Container, Row } from \"reactstrap\";\r\nimport { Game } from \"../../api\";\r\nimport { GamesListCard } from \"./GameListCard\";\r\n\r\nexport interface GamesListSectionProps {\r\n title: string;\r\n games: Game[];\r\n}\r\n\r\nconst classes = {\r\n section: css`\r\n margin-bottom: 64px;\r\n `,\r\n\r\n title: css`\r\n margin-bottom: 32px;\r\n `,\r\n\r\n container: css`\r\n padding-left: 0;\r\n padding-right: 0;\r\n `,\r\n};\r\n\r\nexport const GamesListSection = (props: GamesListSectionProps) => {\r\n const { title, games } = props;\r\n\r\n return (\r\n \r\n {games && games.length && (\r\n
\r\n

{title}

\r\n \r\n \r\n {games.map((game) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { ReactNode } from \"react\";\r\nimport { GamesListSection, GamesListSectionProps } from \"./GameListSection\";\r\n\r\nexport interface GamesListProps {\r\n sections: GamesListSectionProps[];\r\n}\r\n\r\nexport const GamesList = (props: GamesListProps) => {\r\n const { sections } = props;\r\n\r\n return (\r\n \r\n {sections.map((section) => {\r\n return ;\r\n })}\r\n \r\n );\r\n};\r\n","import { Dictionary } from \"lodash\";\r\nimport React from \"react\";\r\nimport { Game } from \"../../api\";\r\nimport { GamesList } from \"../GamesList\";\r\n\r\nexport interface GamesPageProps {\r\n gamesByYear: Dictionary;\r\n}\r\n\r\nexport const GamesPage = (props: GamesPageProps) => {\r\n const { gamesByYear } = props;\r\n\r\n const years = Object.keys(gamesByYear);\r\n years.sort().reverse();\r\n\r\n const sections = years\r\n .filter((year) => {\r\n return !!gamesByYear[year].length;\r\n })\r\n .map((year) => {\r\n return {\r\n title: year,\r\n games: gamesByYear[year],\r\n };\r\n });\r\n\r\n return ;\r\n};\r\n","import { api } from \"../api\";\r\nimport { createApiHook } from \"../utils\";\r\n\r\nexport const useGames = createApiHook((year: string) => api.listGames(year));\r\n","import { api } from \"../api\";\r\nimport { createApiHook } from \"../utils\";\r\n\r\nexport const useMatches = createApiHook((year: string) => api.listMatches(year), {\r\n pollInterval: 30000,\r\n});\r\n","import React, { ReactNode } from \"react\";\r\nimport { Dictionary } from \"../utils\";\r\n\r\nexport interface GlobalStateContextValue {\r\n globalState: Dictionary;\r\n setGlobalState: (state: Dictionary) => void;\r\n}\r\n\r\nexport interface GlobalStateEntry {\r\n value: any;\r\n}\r\n\r\nexport const GlobalStateContext = React.createContext(null as any);\r\n\r\nexport interface GlobalStateProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport class GlobalStateProvider extends React.Component {\r\n constructor(props: GlobalStateProviderProps) {\r\n super(props);\r\n\r\n this.state = {\r\n globalState: {},\r\n setGlobalState: (state) => this.setState({ globalState: state }),\r\n };\r\n }\r\n\r\n public render() {\r\n return {this.props.children};\r\n }\r\n}\r\n","import { useContext, useEffect } from \"react\";\r\nimport { useGlobalState } from \"./useGlobalState\";\r\n\r\nexport const usePageTitle = (): [string, (pageTitle: string) => void] => {\r\n return useGlobalState(\"pageTitle\", \"\");\r\n};\r\n\r\nexport const useSetPageTitle = (newPageTitle: string): void => {\r\n const [pageTitle, setPageTitle] = usePageTitle();\r\n useEffect(() => setPageTitle(newPageTitle), [newPageTitle]);\r\n};\r\n","import { useCallback, useContext, useEffect } from \"react\";\r\nimport { GlobalStateContext } from \"../context/GlobalStateProvider\";\r\n\r\nexport const useGlobalState = (key: string, initialValue: T): [T, (value: T) => void] => {\r\n const { globalState, setGlobalState } = useContext(GlobalStateContext);\r\n\r\n const setValue = useCallback(\r\n (newValue: T) => {\r\n setGlobalState({\r\n ...globalState,\r\n [key]: { value: newValue },\r\n });\r\n },\r\n [key],\r\n );\r\n\r\n const entry = globalState[key];\r\n\r\n useEffect(() => {\r\n if (!entry) {\r\n setValue(initialValue);\r\n }\r\n }, [key]);\r\n\r\n const value = entry ? entry.value : initialValue;\r\n\r\n return [value, setValue];\r\n};\r\n","import { Dictionary } from \"lodash\";\r\nimport React from \"react\";\r\nimport { Game } from \"../api\";\r\nimport { GamesPage } from \"../components/GamesPage\";\r\nimport { useGames, useSetPageTitle } from \"../hooks\";\r\n\r\nexport const GamesPageContainer = () => {\r\n const currentYear = new Date().getFullYear();\r\n const gamesByYear: Dictionary = {};\r\n\r\n for (let year = 2018; year <= currentYear; year++) {\r\n const games = useGames(year.toString()).filter(game => game.gameStarted);\r\n gamesByYear[year] = games;\r\n }\r\n\r\n useSetPageTitle(\"Pools\");\r\n\r\n return ;\r\n};\r\n","import { css, cx } from \"emotion\";\r\nimport React, { MouseEventHandler, ReactNode } from \"react\";\r\n\r\nexport interface SquaresGridCellProps {\r\n children?: ReactNode;\r\n className?: string;\r\n onClick?: MouseEventHandler;\r\n onMouseEnter?: MouseEventHandler;\r\n onMouseLeave?: MouseEventHandler;\r\n}\r\n\r\nconst classes = {\r\n cell: css`\r\n position: relative;\r\n border: 1px solid #000000;\r\n width: 100px;\r\n height: 100px;\r\n text-align: center;\r\n vertical-align: middle;\r\n `,\r\n\r\n pointer: css`\r\n cursor: pointer;\r\n `\r\n};\r\n\r\nexport const SquaresGridCell = (props: SquaresGridCellProps) => {\r\n const className = cx(classes.cell, props.className, props.onClick && classes.pointer);\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n","import React, { ReactNode } from \"react\";\r\n\r\nexport interface SquaresGridRowProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const SquaresGridRow = (props: SquaresGridRowProps) => {\r\n return {props.children};\r\n};\r\n","import { css } from \"emotion\";\r\nimport { range } from \"lodash\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { Game } from \"../../api\";\r\nimport { SquaresGridCell } from \"./SquaresGridCell\";\r\nimport { SquaresGridRow } from \"./SquaresGridRow\";\r\n\r\nexport interface SquaresGridProps {\r\n topNumbers: number[];\r\n leftNumbers: number[];\r\n topName: string;\r\n leftName: string;\r\n renderCell: (x: number, y: number) => ReactNode | undefined;\r\n}\r\n\r\nconst classes = {\r\n numberCell: css`\r\n background-color: #cacfd2;\r\n color: #000000;\r\n font-size: 24px;\r\n font-weight: bold;\r\n `,\r\n\r\n divider: css`\r\n height: 2px;\r\n background-color: black;\r\n transform: rotate(45deg);\r\n `,\r\n\r\n winnerLabel: css`\r\n font-size: medium;\r\n transform: rotate(45deg);\r\n position: relative;\r\n left: 10px;\r\n top: 15px;\r\n `,\r\n\r\n loserLabel: css`\r\n font-size: medium;\r\n transform: rotate(45deg);\r\n position: relative;\r\n left: -12px;\r\n top: -15px;\r\n `,\r\n};\r\n\r\nexport const SquaresGrid = (props: SquaresGridProps) => {\r\n const topNumbers = props.topNumbers || [];\r\n const leftNumbers = props.leftNumbers || [];\r\n const cellRange = range(10);\r\n\r\n let leftNumberIndex = 0;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
{props.topName}
\r\n
\r\n
{props.leftName}
\r\n
\r\n {cellRange.map((index) => {\r\n return (\r\n \r\n {topNumbers[index]}\r\n \r\n );\r\n })}\r\n
\r\n {cellRange.map((rowNumber) => {\r\n return (\r\n \r\n \r\n {leftNumbers[leftNumberIndex++]}\r\n \r\n {cellRange.map((columnNumber) => {\r\n return props.renderCell(rowNumber, columnNumber);\r\n })}\r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n};\r\n\r\nSquaresGrid.Cell = SquaresGridCell;\r\n","import { css, cx } from \"emotion\";\r\nimport React, { ReactNode, useMemo, useState } from \"react\";\r\nimport { Game, Match } from \"../../api\";\r\nimport { getWinningsPerSquare } from \"../../utils\";\r\nimport { SquaresGrid } from \"../SquaresGrid\";\r\n\r\nexport interface GameGridProps {\r\n game: Game;\r\n matches: Match[];\r\n}\r\n\r\nconst classes = {\r\n selected: css`\r\n background-color: lightgreen;\r\n `,\r\n\r\n hover: css`\r\n background-color: #eeeeee;\r\n `,\r\n\r\n player: css`\r\n position: absolute;\r\n top: 8px;\r\n left: 0;\r\n right: 0;\r\n margin: 0 auto;\r\n font-size: 14px;\r\n `,\r\n\r\n winnings: css`\r\n margin-top: 16px;\r\n font-size: 24px;\r\n `,\r\n\r\n green: css`\r\n color: green;\r\n `,\r\n};\r\n\r\nexport const GameGrid = (props: GameGridProps) => {\r\n const { game, matches } = props;\r\n\r\n const [selectedPlayer, setSelectedPlayer] = useState(null);\r\n const [hoveredPlayer, setHoveredPlayer] = useState(null);\r\n\r\n const winnings = useMemo(() => getWinningsPerSquare(game, matches), [game, matches]);\r\n\r\n let topName = \"WINNER\";\r\n let leftName = \"LOSER\";\r\n if (game.gameType === \"SuperBowl\") {\r\n topName = game.team1Name;\r\n leftName = game.team2Name;\r\n }\r\n\r\n return (\r\n {\r\n const cellPlayer = game.players[x][y];\r\n\r\n let cellClassName: string | undefined;\r\n\r\n if (hoveredPlayer) {\r\n const isCellHovered = cellPlayer && hoveredPlayer && cellPlayer === hoveredPlayer;\r\n cellClassName = cx(cellClassName, isCellHovered && classes.hover);\r\n }\r\n\r\n if (selectedPlayer) {\r\n const isCellSelected = cellPlayer && selectedPlayer && cellPlayer === selectedPlayer;\r\n cellClassName = cx(cellClassName, isCellSelected && classes.selected);\r\n }\r\n\r\n return (\r\n setSelectedPlayer(game.players[x][y])}\r\n onMouseEnter={() => setHoveredPlayer(game.players[x][y])}\r\n onMouseLeave={() => setHoveredPlayer(null)}\r\n >\r\n
{cellPlayer}
\r\n
\r\n {winnings[x][y] ? `$${winnings[x][y]}` : \"-\"}\r\n
\r\n \r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { css, cx } from \"emotion\";\r\nimport { orderBy } from \"lodash\";\r\nimport React, { ReactNode, useMemo } from \"react\";\r\nimport { Table } from \"reactstrap\";\r\nimport { Game, Match } from \"../../api\";\r\nimport { gamesResource } from \"../../data\";\r\nimport { getWinningPlayerByMatch } from \"../../utils\";\r\nimport { getTeamLogoUrl } from \"../../utils/teamsUtils\";\r\n\r\nexport interface MatchesListProps {\r\n game: Game;\r\n matches: Match[];\r\n}\r\n\r\nconst classes = {\r\n winner: css`\r\n font-weight: bold;\r\n `,\r\n\r\n team: css`\r\n line-height: 32px;\r\n margin-bottom: 16px;\r\n\r\n img {\r\n width: 32px;\r\n height: 32px;\r\n margin-right: 16px;\r\n }\r\n `,\r\n};\r\n\r\nexport const MatchesList = (props: MatchesListProps) => {\r\n const { game, matches } = props;\r\n\r\n let roundNames: string[] = [];\r\n\r\n if (game.gameType === \"NCAATournament\") {\r\n roundNames = [\"Play-in\", \"Round 1\", \"Round 2\", \"Sweet Sixteen\", \"Elite Eight\", \"Final Four\", \"Championship\"];\r\n } else if (game.gameType === \"SuperBowl\") {\r\n roundNames = [\"\", \"First Quarter\", \"Half Time\", \"Third Quarter\", \"Final Score\"];\r\n }\r\n\r\n const sortedMatches = useMemo(() => {\r\n return orderBy(matches, [\"round\"], [\"desc\"]);\r\n }, [game, matches]);\r\n\r\n const isCompletedPage = sortedMatches && sortedMatches.length > 0 ? sortedMatches[0].completed : false;\r\n\r\n const winningPlayersByMatch = useMemo(() => getWinningPlayerByMatch(game, sortedMatches), [game, sortedMatches]);\r\n\r\n const headerText = isCompletedPage ? \"Winning Player (Amount)\" : \"Live Details\";\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {sortedMatches.map((match) => {\r\n // const team1LogoUrl = getTeamLogoUrl(match.team1EspnId);\r\n // const team2LogoUrl = getTeamLogoUrl(match.team2EspnId);\r\n const team1LogoUrl = match.team1LogoUri;\r\n const team2LogoUrl = match.team2LogoUri;\r\n\r\n let team1ClassName = \"\";\r\n let team2ClassName = \"\";\r\n\r\n if (game.gameType === \"NCAATournament\" && isCompletedPage) {\r\n team1ClassName = match.team1Winner ? classes.winner : \"\";\r\n team2ClassName = match.team2Winner ? classes.winner : \"\";\r\n }\r\n\r\n const team1Seed = !!match.team1Seed ? match.team1Seed : \"\";\r\n const team2Seed = !!match.team2Seed ? match.team2Seed : \"\";\r\n\r\n const winningPlayer = winningPlayersByMatch[match.globalId];\r\n const winningAmount = game.payoutPerRound[`${match.round}`];\r\n\r\n let detailsText = \"\";\r\n\r\n if (isCompletedPage) {\r\n const hasAmount = winningAmount > 0 && !!winningPlayer;\r\n detailsText = hasAmount ? `${winningPlayer} ($${winningAmount})` : \"-\";\r\n } else {\r\n if (match.currentPeriod === \"HALFTIME\") {\r\n detailsText = \"Halftime\";\r\n } else {\r\n detailsText = `${match.currentClock} - ${match.currentPeriod}`;\r\n }\r\n }\r\n\r\n const score1 = (match.score1 != null || match.score1 != undefined) ? match.score1 : \"N/A\";\r\n const score2 = (match.score2 != null || match.score2 != undefined) ? match.score2 : \"N/A\";\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
RoundScore{headerText}
{roundNames[match.round] || match.round}\r\n
\r\n {parseInt(match.year, 10) >= 2019 && team1LogoUrl && (\r\n \r\n )}\r\n {`${team1Seed} ${match.team1} - ${score1}`}\r\n
\r\n
\r\n {parseInt(match.year, 10) >= 2019 && team2LogoUrl && (\r\n \r\n )}\r\n {`${team2Seed} ${match.team2} - ${score2}`}\r\n
\r\n
{detailsText}
\r\n );\r\n};\r\n","import { css } from \"emotion\";\r\nimport { orderBy } from \"lodash\";\r\nimport React, { ReactNode, useMemo } from \"react\";\r\nimport { Table } from \"reactstrap\";\r\nimport { Game, Match } from \"../../api\";\r\nimport { getWinningsInfoByPlayer } from \"../../utils\";\r\nimport { Icon } from \"../Icon/Icon\";\r\n\r\nexport interface PlayersListProps {\r\n game: Game;\r\n matches: Match[];\r\n}\r\n\r\nconst classes = {\r\n green: css`\r\n color: green;\r\n `,\r\n\r\n red: css`\r\n color: red;\r\n `,\r\n};\r\n\r\nexport const PlayersList = (props: PlayersListProps) => {\r\n const { game, matches } = props;\r\n\r\n const winningsInfoByPlayer = useMemo(() => getWinningsInfoByPlayer(game, matches), [game, matches]);\r\n\r\n const sortedWinningsInfo = useMemo(() => {\r\n const items = Object.keys(winningsInfoByPlayer).map((player) => winningsInfoByPlayer[player]);\r\n orderBy(items, [\"winnings\"], [\"desc\"]);\r\n return items;\r\n }, [winningsInfoByPlayer]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {sortedWinningsInfo.map((info) => {\r\n const winningsClassName = info.winnings > 0 ? classes.green : \"\";\r\n const profitClassName = info.profit > 0 ? classes.green : info.profit < 0 ? classes.red : \"\";\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
PlayersSquaresWinningsProfit
{info.player}{info.numberOfSquares}{`$${info.winnings}`}{`$${info.profit}`}
\r\n );\r\n};\r\n","import { css, cx } from \"emotion\";\r\nimport React, { ReactNode, useState } from \"react\";\r\nimport { Button, ButtonGroup, Nav, NavItem, NavLink, TabContent, TabPane } from \"reactstrap\";\r\n\r\nexport interface TabsProps {\r\n tabs: Tab[];\r\n}\r\n\r\nexport interface Tab {\r\n title: string;\r\n renderContent: () => ReactNode;\r\n}\r\n\r\nconst classes = {\r\n root: css`\r\n .tab-content {\r\n padding-top: 24px;\r\n }\r\n `,\r\n\r\n title: css`\r\n width: 150px;\r\n `,\r\n};\r\n\r\nexport const Tabs = (props: TabsProps) => {\r\n const { tabs } = props;\r\n\r\n const [activeTabIndex, setActiveTabIndex] = useState(0);\r\n\r\n return (\r\n
\r\n \r\n {tabs.map((tab, index) => {\r\n return (\r\n setActiveTabIndex(index)}\r\n >\r\n {tab.title}\r\n \r\n );\r\n })}\r\n \r\n \r\n {tabs.map((tab, index) => {\r\n return (\r\n \r\n {tab.renderContent()}\r\n \r\n );\r\n })}\r\n \r\n
\r\n );\r\n};\r\n","import { faTablets } from \"@fortawesome/free-solid-svg-icons\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { Game, Match } from \"../../api\";\r\nimport { GameGrid } from \"../GameGrid\";\r\nimport { MatchesList } from \"../MatchesList\";\r\nimport { PlayersList } from \"../PlayersList\";\r\nimport { Tab, Tabs } from \"../Tabs\";\r\n\r\nexport interface GamePageProps {\r\n game: Game;\r\n matches: Match[];\r\n}\r\n\r\nexport const GamePage = (props: GamePageProps) => {\r\n const { game, matches } = props;\r\n\r\n const completedMatches = matches.filter(match => match.completed);\r\n const liveMatches = matches.filter(match => !match.completed);\r\n\r\n const tabs: Tab[] = [\r\n {\r\n title: \"Grid\",\r\n renderContent: () => {\r\n return ;\r\n }\r\n },\r\n {\r\n title: game.gameType === \"NCAATournament\" ? \"Finished Games\" : \"Results\",\r\n renderContent: () => {\r\n return ;\r\n }\r\n }\r\n ];\r\n\r\n if (!!liveMatches && liveMatches.length > 0) {\r\n tabs.push({\r\n title: game.gameType === \"NCAATournament\" ? \"Live Games\" : \"Live Results\",\r\n renderContent: () => {\r\n return ;\r\n }\r\n });\r\n }\r\n\r\n tabs.push({\r\n title: \"Players\",\r\n renderContent: () => {\r\n return ;\r\n }\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { GamePage } from \"../components/GamePage\";\r\nimport { useGame, useRouteParams, useSetPageTitle } from \"../hooks\";\r\nimport { useMatches } from \"../hooks/useMatches\";\r\n\r\nexport const GamePageContainer = () => {\r\n const { year, name } = useRouteParams<{ year: string; name: string }>();\r\n\r\n const game = useGame(year, name);\r\n const matches = useMatches(year).filter((match) => match.gameType === game.gameType);\r\n\r\n let title = game.displayName;\r\n if (game.gameType === \"NCAATournament\") {\r\n title = game.displayName + \" - NCAA Tournament\";\r\n } else if (game.gameType === \"SuperBowl\") {\r\n title = game.displayName + \" - Super Bowl\";\r\n }\r\n\r\n useSetPageTitle(title);\r\n\r\n return ;\r\n};\r\n","import useReactRouter from \"use-react-router\";\r\n\r\nexport function useRouteParams(): TParams {\r\n const { match } = useReactRouter();\r\n return match.params;\r\n}\r\n\r\nexport function useRouteUrl(): string {\r\n const { match } = useReactRouter();\r\n return match.url;\r\n}\r\n\r\nexport function useRoutePath(): string {\r\n const { match } = useReactRouter();\r\n return match.path;\r\n}\r\n","import { Game } from \"../api\";\r\nimport { useGames } from \"./useGames\";\r\n\r\nexport const useGame = (year: string, name: string): Game => {\r\n const games = useGames(year);\r\n\r\n const foundGame = games.find((game) => game.year === year && game.name === name);\r\n\r\n if (!foundGame) {\r\n throw new Error(`Game ${year}-${name} not found!`);\r\n }\r\n\r\n return foundGame;\r\n};\r\n","import React from \"react\";\r\nimport { Spinner } from \"reactstrap\";\r\n\r\nexport const LoadingIndicator = () => {\r\n return ;\r\n};\r\n","import { css } from \"emotion\";\r\nimport React, { ReactNode } from \"react\";\r\n\r\nexport interface PageContentProps {\r\n children: ReactNode;\r\n}\r\n\r\nconst classes = {\r\n root: css`\r\n padding-top: 96px;\r\n padding-right: 48px;\r\n padding-left: 48px;\r\n padding-bottom: 48px;\r\n `,\r\n};\r\n\r\nexport const PageContent = (props: PageContentProps) => {\r\n return
{props.children}
;\r\n};\r\n","import { css } from \"emotion\";\r\nimport React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nexport interface PageHeaderProps {\r\n brand: string;\r\n pageTitle?: string;\r\n}\r\n\r\nexport interface PageHeaderBreadcrumb {\r\n text: string;\r\n path: string;\r\n active?: boolean;\r\n}\r\n\r\nconst classes = {\r\n nav: css`\r\n width: 100%;\r\n height: 64px;\r\n position: fixed;\r\n z-index: 10000;\r\n background-color: black;\r\n color: white;\r\n `,\r\n\r\n brand: css`\r\n display: inline-block;\r\n height: 100%;\r\n color: white !important;\r\n text-decoration: none !important;\r\n margin-left: 24px;\r\n margin-right: 24px;\r\n\r\n h1 {\r\n display: inline-block;\r\n line-height: 64px;\r\n font-size: 24px;\r\n }\r\n `,\r\n\r\n pageTitle: css`\r\n display: inline-block;\r\n color: white;\r\n font-size: 18px;\r\n `,\r\n\r\n breadcrumbs: css`\r\n display: inline-block;\r\n\r\n .breadcrumb {\r\n background: none;\r\n }\r\n\r\n .breadcrumb-item {\r\n a {\r\n color: white;\r\n font-size: 18px;\r\n text-decoration: none;\r\n }\r\n\r\n &.active {\r\n font-weight: bold;\r\n }\r\n }\r\n\r\n .breadcrumb-item + .breadcrumb-item::before {\r\n color: white;\r\n }\r\n `,\r\n};\r\n\r\nexport const PageHeader = (props: PageHeaderProps) => {\r\n const { brand, pageTitle } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { ReactNode } from \"react\";\r\nimport { PageContent } from \"./PageContent\";\r\nimport { PageHeader } from \"./PageHeader\";\r\n\r\nexport interface PageProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const Page = (props: PageProps) => {\r\n return {props.children};\r\n};\r\n\r\nPage.Header = PageHeader;\r\nPage.Content = PageContent;\r\n","import React, { ReactNode, Suspense } from \"react\";\r\nimport { LoadingIndicator } from \"../components/LoadingIndicator\";\r\nimport { Page } from \"../components/Page\";\r\nimport { usePageTitle } from \"../hooks\";\r\n\r\nexport interface PageProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const PageContainer = (props: PageProps) => {\r\n const { children } = props;\r\n\r\n const [pageTitle] = usePageTitle();\r\n\r\n return (\r\n \r\n \r\n \r\n }>{children}\r\n \r\n \r\n );\r\n};\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read http://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === \"localhost\" ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === \"[::1]\" ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\r\n);\r\n\r\ninterface Config {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n}\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL((process as { env: { [key: string]: string } }).env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener(\"load\", () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n \"This web app is being served cache-first by a service \" +\r\n \"worker. To learn more, visit http://bit.ly/CRA-PWA\",\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then((registration) => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === \"installed\") {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n \"New content is available and will be used when all \" +\r\n \"tabs for this page are closed. See http://bit.ly/CRA-PWA.\",\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log(\"Content is cached for offline use.\");\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch((error) => {\r\n console.error(\"Error during service worker registration:\", error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then((response) => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get(\"content-type\");\r\n if (response.status === 404 || (contentType != null && contentType.indexOf(\"javascript\") === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\"No internet connection found. App is running in offline mode.\");\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if (\"serviceWorker\" in navigator) {\r\n navigator.serviceWorker.ready.then((registration) => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import \"bootstrap/dist/css/bootstrap.min.css\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { App } from \"./App\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: http://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n","import React from \"react\";\r\nimport { BrowserRouter, Redirect, Route, Switch } from \"react-router-dom\";\r\n\r\nimport { GamePageContainer, GamesPageContainer, PageContainer } from \"./containers\";\r\nimport { GlobalStateProvider } from \"./context\";\r\n\r\nexport const App = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n"],"sourceRoot":""}