{"version":3,"sources":["global/styles/iconStyles.ts","global/styles/styleConstants.ts","global/components/navs/NavbarMenu.tsx","global/helperFunctions/localStorage.ts","global/types/requestConstants.ts","Properties.ts","global/actions/handleResponse.ts","global/actions/actionNames.ts","global/actions/userActions.ts","global/container/NavList.tsx","global/components/navs/NavbarMenuItem.tsx","global/components/navs/AuthedNavbarMenuItem.tsx","global/components/Menu.tsx","images/AHA-Logo-White.png","global/styles/generalStyles.ts","global/styles/theme.ts","global/views/Template.tsx","global/actions/profilesActions.ts","global/components/gadgets/AppHeader.tsx","global/styles/buttonStyles.ts","images/PersonDefault.svg","global/helperFunctions/useLongPress.ts","global/components/profiles/FaceDisplay.tsx","global/components/profiles/EnrolmentItem.tsx","global/components/formInputs/SingleCheckBox.tsx","admin/actions/participantsActions.ts","global/components/profiles/PermanentPhotos.tsx","global/helperFunctions/useFetchImageForEnrolments.ts","global/reducers/profilesReducers.ts","global/helperFunctions/useSelectProfile.ts","ImagusComponents/Gadgets/ImagusFacePicker.tsx","global/components/Buttons/CancelButton.tsx","ImagusComponents/Gadgets/ImagusWebCam.tsx","global/components/Buttons/DraggableUploadButton.tsx","ImagusComponents/Gadgets/ImagusSampleImages.tsx","global/components/Buttons/CameraLabelButton.tsx","global/components/faceSearch/FaceUpload.tsx","images/samples/Abdel_Nasser_Assidi_0002.jpg","images/samples/George_HW_Bush_0006.jpg","images/samples/George_P_Bush_0002.jpg","images/samples/George_W_Bush_0042.jpg","images/samples/George_W_Bush_0098.jpg","images/samples/Michael_Jackson_0002.jpg","images/samples/Michael_Jackson_0004.jpg","global/components/Buttons/SubmitButton.tsx","global/helperFunctions/cropImageToFace.ts","global/components/ErrorDisplay.tsx","global/components/faceSearch/ImageUploadProcess.tsx","global/components/profiles/PhotoDetails.tsx","global/actions/faceSearchActions.ts","global/container/profiles/PhotoDisplayRedux.tsx","global/container/RedirectToLogin.tsx","global/container/UserAuth.tsx","global/views/Photo.tsx","global/actions/raceActions.ts","global/components/gadgets/ModalForm.tsx","global/components/formInputs/SingleTextField.tsx","ImagusComponents/FormInputs/ImagusSearchBar.tsx","global/components/race/RaceItem.tsx","global/helperFunctions/stringFunctions.ts","global/components/race/RaceList.tsx","ImagusComponents/Gadgets/ImagusRaceDrawer.tsx","global/components/gadgets/ConfirmationDialog.tsx","global/components/profiles/CreateProfileForm.tsx","global/container/profiles/CreateProfileFormRedux.tsx","global/components/race/RacePageLayout.tsx","global/container/race/RaceRedux.tsx","global/views/Race.tsx","global/container/user/UserProfileRedux.tsx","global/components/users/UserProfile.tsx","global/container/user/DeleteUserRedux.tsx","global/components/TermsAndConditions.tsx","global/components/users/ProfileSetting.tsx","global/components/users/PasswordStrengthBox.tsx","global/components/users/ChangePasswordForm.tsx","global/container/user/ChangePasswordRedux.tsx","global/views/Profile.tsx","images/AHA-Logo.png","global/container/SignupSuccess.tsx","global/components/users/LoginForm.tsx","global/views/Login.tsx","global/views/Signup.tsx","images/TracyWhiteBackground.png","ImagusComponents/Gadgets/CompleteMessage.tsx","global/components/users/ResetPasswordForm.tsx","global/views/ResetPassword.tsx","global/components/users/ForgotForm.tsx","global/views/Forgot.tsx","admin/components/ThemeRadio.tsx","admin/containers/ThemeSelector.tsx","admin/actions/siteActions.ts","admin/views/Themes.tsx","admin/components/EventItem.tsx","admin/components/EventList.tsx","admin/components/EventsPanel.tsx","admin/components/ParticipantsPageLayout.tsx","admin/containers/ParticipantsRedux.tsx","admin/views/Participants.tsx","admin/reducers/participantsReducers.ts","admin/reducers/siteReducers.ts","admin/reducers/index.ts","global/reducers/faceSearchReducers.ts","global/reducers/raceReducers.ts","global/reducers/userReducers.ts","global/reducers/index.ts","Store.ts","App.tsx","reportWebVitals.ts","index.tsx"],"names":["iconStyles","theme","createStyles","lightIcon","color","palette","primary","light","contrastText","shineIcon","main","greenIcon","inheritIcon","fill","mediumIcon","width","height","largeIcon","tinyIcon","BlackText","useStyles","makeStyles","root","display","margin","backgroundColor","drawer","flexShrink","position","zIndex","drawerClose","drawerPaper","transition","transitions","create","easing","sharp","duration","enteringScreen","drawerPaperClose","overflowX","drawerHeader","alignItems","padding","mixins","toolbar","justifyContent","header","logo","hide","title","lineHeight","common","white","marginLeft","wrap","NavBarWidth","marginRight","spacing","leavingScreen","breakpoints","down","wrapClose","NavBarCloseWidth","easeOut","menuButton","chroma","contrast","NavbarMenu","props","classes","useState","window","innerWidth","isDrawerOpen","setIsDrawerOpen","isHover","setIsHover","handleDrawerOpen","status","handleDrawerHover","className","Hidden","smDown","Drawer","classNames","variant","anchor","open","paper","alt","src","Typography","IconButton","onClick","ChevronLeft","List","onMouseEnter","onMouseLeave","menus","children","getStorage","name","localStorage","getItem","authHeader","token","Authorization","getInit","shouldCache","setCookie","headers","options","method","mode","postBody","data","body","JSON","stringify","console","log","putBody","deleteBody","handleResponse","response","responseType","blob","then","URL","createObjectURL","json","text","Promise","reject","api","errors","statusText","userLogout","SET_THEME","GET_ALL_EVENTS","GET_ALL_EVENT_RACES","GET_ALL_PARTICIPANTS","SET_UPDATING_PARTICIPANTS","SET_PARTICIPANTS_ENROLMENTS_IMAGE","SET_PARTICIPANTS_AVATAR","GET_PARTICIPANT_BY_ID","SET_FETCHING_AUTH","SET_AUTH","SET_USER","SET_ACTIVE_PROFILE","SET_FACE_IMAGE","LIST_PROFILES","ADD_PROFILE","DELETE_PROFILES","ADD_RUNNER","DELETE_RUNNER","SET_UPDATING","SAVE_TOKEN","DETECT_IMAGE","SET_LOADED_IMAGE","CLEAR_FORM","GET_RACES","UPDATE_RACE","SET_RACE_UPDATING","SET_SEARCH_QUERY","GET_SEARCH_RESULTS","Properties","userLogin","email","password","doneBack","failBack","formData","username","fetch","value","setItem","error","userDelete","userId","result","a","undefined","removeItem","location","href","NavList","to","icon","AccountCircle","label","key","PhotoLibrary","auth","People","Palette","ExitToApp","bind","menuItem","menuItemSelected","iconMargin","minWidth","textPadding","paddingLeft","paddingRight","NavbarMenuItem","MenuItem","selected","ListItemIcon","ListItemText","AuthedNavbarMenuItem","other","pathnameArray","useLocation","pathname","split","lastPath","length","Navbar","LinkNavbar","Menu","userInfo","useSelector","state","global","user","info","filter","item","au","roles","includes","IsUserAuthorizedForMenuItem","map","contentStyles","appHeader","background","default","borderBottom","content","flexGrow","panelStyles","appWrapper","appMain","appPanel","minHeight","border","clear","appPanelContent","appPanelTop","marginTop","headerStyles","headerWrapper","headerTitle","fontSize","fontStyle","fontWeight","letterSpacing","overflow","textOverflow","whiteSpace","actionItem","flex","inputStyles","labelFormControl","grey","labelFocused","labelError","labelDisabled","inputFont","inputRoot","marginBottom","inputDisabled","inputError","underline","borderBottomColor","borderError","borderColor","boxShadow","helper","textFieldFormLabel","textFieldInput","borderRadius","dark","bannerStyles","banner","warning","black","box","textAlign","opacity","drawerStyles","subRoot","ToolBarHeight","toolbarSearch","toolbarInside","DrawWidth","list","overflowY","formText","formRightBtnBlock","basePalette","blue","baseTheme","createMuiTheme","overrides","MuiTableHead","MuiTableBody","MuiAccordionDetails","MuiTooltip","tooltipPlacementBottom","tooltipPlacementTop","tooltipPlacementLeft","tooltipPlacementRight","MuiCard","MuiCardContent","paddingBottom","MuiListItem","button","blueTheme","themeName","secondary","darkTheme","contentBackgroundColor","Template","themeNameFromState","admin","site","themeList","index","findIndex","x","isMenuRequired","indexOf","fetchActiveProfile","profileId","dispatch","profile","uid","enrolments","dateOfBirth","type","activeProfile","getEnrolments","faceId","enrolmentId","imgUrl","faceImageUrl","updateProfile","newEnrolments","deleteEnrolments","accountId","results","leftMargin","AppHeader","actions","action","i","buttonStyles","darkBtn","linkBtn","primaryBtn","disabledBtn","lightBtn","preventDefault","e","isTouchEvent","touches","gridRoot","gridBlock","closeButton","right","top","cursor","gridImage","transform","left","maxHeight","maxWidth","float","displayChecked","short","checked","FaceDisplay","selectImage","onLongPress","delay","shouldPreventDefault","longPressTriggered","setLongPressTriggered","timeout","useRef","target","start","useCallback","persist","clonedEvent","addEventListener","passive","current","setTimeout","shouldTriggerClick","clearTimeout","removeEventListener","useLongPress","longClick","img","PersonImage","enrolItem","badgeContent","cardImage","EnrolmentItem","invalid","invalidChecked","SingleCheckBox","CheckNode","Checkbox","isInvalid","onChange","indeterminate","isIndeterminated","disabled","isDisabled","circle","checkedIcon","CheckNodeWithLabel","FormControlLabel","control","hasTitle","linkAtTheEnd","Link","handleLinkClicked","labelPlacement","labelPlace","getEventsByQuery","query","events","getProfileEnrolmentsImage","grid","paddingTop","titleBar","checkBox","PermanentPhotos","loading","setLoading","selecting","setSelecting","selectedIds","setSelectedIds","setEnrolments","useEffect","peoplePage","useDispatch","displayedEnrolments","getEnrolmentImages","faces","useFetchImageForEnrolments","selectionIndex","id","addOrRemoveSelection","currentList","push","splice","handleCheckBoxClick","event","enrolmentList","enrolment","GridListTile","CircularProgress","GridList","cols","column","cellHeight","edit","editClicked","Button","removePhoto","initialRunner","Array","initialProfilesState","profileIds","updating","useSelectProfile","profileList","profiles","setProfile","ids","getActiveProfile","container","canvas","backgroundSize","backgroundRepeat","square","fillOpacity","transformOrigin","transformBox","stroke","success","alignmentBaseline","textAnchor","eye","strokeWidth","ImagusFacePicker","imageUrl","setImageUrl","imageSize","setImageSize","setFaces","faceSelection","setFaceSelection","ref","loadImage","Image","onload","imgWidth","imgHeight","containerWidth","offsetWidth","loadFaces","ratio","face","centre","size","y","angle","eyes","mouth","nose","search","probability","searchName","changeEyeSelection","style","backgroundImage","eachFace","Math","max","toFixed","cx","cy","r","CancelButton","rightMargin","webcam","ImagusWebcam","webcamRef","captureCamera","capture","getScreenshot","audio","videoConstraints","facingMode","screenshotFormat","cancelCamera","fileUploadButton","fontFamily","textTransform","fileUploadText","fileUploadInput","DraggableUploadButton","dragged","setDragged","customPreventDefault","stopPropagation","htmlFor","draggable","onDragEnter","onDragLeave","onDragOver","onDrop","dataTransfer","files","file","uploadFileAction","accept","image","focusVisible","imageSrc","bottom","backgroundPosition","imageBackdrop","ImagusSampleImages","samples","sample","ButtonBase","focusRipple","loadSample","cancelSample","cameraButton","buttonText","hiddenItem","CameraLabelButton","enableCamera","helpText","tipsText","FaceUpload","forwardedRef","isCamera","isSample","isFromPermanent","panel","setPanel","useImperativeHandle","resetFaceUpload","resetForm","setDisplaySubmit","res","Blob","uploadFile","uploadDone","uploadFail","loadSampleImages","toDataURL","selectPermanent","Grid","xs","component","forwardRef","fullWidth","autoWidth","SubmitButton","isMainButton","radiusFromEyes","betweenEyes","abs","sqrt","distanceBetweenEyes","faceCentreFromEyes","x1","y1","x2","y2","setErrorMessage","errorType","errorMessage","ErrorDisplay","generalErrors","Object","keys","forEach","ImageUploadProcess","openDialog","setOpenDialog","setToken","setImage","selectedEye","setSelectedEye","setError","faceIndex","setFaceIndex","resetImageUploadProcess","setShowDetails","loadImageToCanvas","orientation","HTMLCanvasElement","url","faceEnrol","person","radius","document","createElement","ctx","getContext","drawImage","cropImageToFace","Date","now","toString","detectedFaces","permanent","enrolFace","addEnrolment","setImageError","message","imgList","Image1","Image2","Image3","Image4","Image5","Image6","Image7","fromPermanentList","disabledDialog","md","lg","profileName","errorList","shouldDisable","Dialog","disableBackdropClick","disableEscapeKeyDown","onClose","DialogContent","DialogActions","justify","photoPanel","approveIcon","denyIcon","PhotoDetails","showDetails","setErrors","count","setCount","checkDetails","selectedProfile","addEnrolmentFail","passThreshold","underThreshold","roundFloat","point","round","Number","EPSILON","passFrontalCheck","resultMetrics","matchFrontalThreshold","passBlurrinessCheck","matchBlurrinessThreshold","passConfidenceCheck","matchConfidenceThreshold","passPersonCheck","addEnrolmentsToProfile","allowRemoveProfile","handleEditButtonClick","handleDeleteDialog","shouldSaveToken","FormData","append","postInit","detectFaces","sectionHeader","enrolmentPanel","PhotoDisplayRedux","accountInfo","faceSearch","updateDone","getProfileEnrolments","enrolmentIds","handleUpdateCurrentProfile","RedirectToLogin","timeDelay","seconds","UserAuth","userRoles","hasPrinciple","fetchingAuth","shouldSetAuth","authenticated","authenticatied","authenticate","authentication","principles","requiredPrinciple","userPrinciples","hasPermission","isAuthenticated","Photo","permanentEnrolments","eachEnrolment","link","setAttribute","getDate","getMonth","slice","getFullYear","appendChild","click","parentNode","removeChild","fetchRace","races","eachRace","element","values","race","raceId","raceName","date","textColor","modalConent","modalBackdrop","DialogHeader","AppBar","Toolbar","disabledExit","aria-label","ModalForm","handleClickClose","handleModalStatus","notFullWidth","hideBackdrop","BackdropProps","darkBackdrop","disableExit","form","SingleTextField","FormControl","InputLabel","required","isRequired","formControl","focused","Input","input","endAdornment","inputType","autoComplete","autoFocus","loadingIcon","ImagusSearchBar","searchQuery","inputValue","setInputValue","currentTarget","handleSearch","InputAdornment","raceSelected","selectedTile","RaceItem","ListItem","selectRace","selectedRace","ListItemAvatar","Avatar","avatar","disableTypography","sideComponent","checkEmailFormat","val","test","initalPasswordStrength","number","lowercase","uppercase","space","checkPasswordStrength","passwordStrength","trim","compareItems","b","nameA","toUpperCase","comparison","RaceList","fetching","raceList","sort","selectedId","checkBoxes","ImagusRaceDrawer","setOpen","closed","toggleSearchBarDrawer","handleRaceSelect","warningIcon","verticalAlign","highlight","ConfirmationDialog","handleClose","handleCancel","aria-labelledby","aria-describedby","DialogTitle","actionWord","DialogContentText","itemName","extraWord","confirmFunction","CreateProfileForm","currentName","setName","handleSubmit","editName","onSubmitDone","onSubmitFail","createProfile","onSubmit","CreateProfileFormRedux","guid","newName","currentProfile","RacePageLayout","selectedRaceId","setSelectedRaceId","setSelectedRace","raceIndex","setRaceIndex","confirmDialogOpen","setConfirmDialogOpen","isProfileModalOpen","setIsProfileModalOpen","addToProfileDone","getCurrentEnrolments","raceEnrolments","enrolmentIndex","fetchRaces","find","enrolmentsIds","removeProfiles","RaceRedux","getRaces","updateRaceEnrolments","deleteEnroments","newEnrolmentIds","deleteEnrolmentIds","updateRaceEnrolment","participant","fetchProfileById","getRaceDetails","fetchRaceDetailsById","Race","participants","currentNameQuery","setCurrentNameQuery","getProfileList","nameFilter","fetchAllProfiles","downloadEnrolments","downloadFiles","UserProfileRedux","profileInfo","UserProfile","DeleteUserRedux","handleCancle","TermsAndConditions","contentTitleText","contentPanelBorder","centralPanel","settingBox","ProfileSetting","agreed","setAgreement","openModal","setOpenModal","openConfirm","setOpenConfirm","handleConfirm","borderRight","borderLeft","listStyleType","valid","PasswordStrengthBox","ChangePasswordForm","oldPassword","newPassword","newPasswordConfirm","passwords","setPasswords","setPasswordStrength","handleInputChange","handleNewPasswordInputChange","handlePasswordConfirm","checkedStrength","changePassword","submitDone","submitFail","ChangePasswordRedux","currentPassword","Profile","isModalOpen","setIsModalOpen","wrapper","hieght","formLogo","titleText","titleMargin","SignupSuccess","LogoImage","formLogoWrapper","textAlignLeft","iconBlock","formHint","formLink","textDecoration","switchText","bannerTitle","LoginForm","signUpDone","setSignUpDone","passwordRepeat","setUser","passwordDisplay","setPasswordDispaly","setId","handleFormSubmit","isSignup","userAction","signupDone","loginDone","param","next","URLSearchParams","get","parse","handleUserChange","usernameErrorHandler","emailErrorHandler","passwordRepeatErrorHandler","passwordErrorHandle","passwordStrengthErrorHandler","checkStrength","Login","Signup","userSignup","flagWrapper","verticalCenter","flagText","flagTitle","flagContent","checkMark","from","strokeDashoffset","strokeMiterlimit","strokeDasharray","animationName","animationDuration","animationDelay","animationTimingFunction","animationFillMode","animationIterationCount","check","strokeLinecap","para","marginBlockStart","marginBlockEnd","marginInlineStart","marginInlineEnd","CompleteMessage","isPageCenter","viewBox","points","intialInput","code","passwordConfirm","ResetPasswordForm","inputs","setInputs","completed","setCompleted","history","useHistory","handlePasswordChange","backToLogin","resetPassword","ResetPassword","ForgotForm","setEmail","forgotPassword","Forgot","err","blueLabel","darkLabel","ThemeRadio","matchDict","Radio","ThemeSelector","currentTheme","selectedValue","setSelectedValue","RadioGroup","row","Themes","EventItem","eventName","selectEvent","eventId","selectedEventId","EventList","eventList","EventsPanel","selectedEvent","setSelectedEvent","handleEventSearch","ParticipantsPageLayout","fetchEvents","ParticipantsRedux","Participants","initialParticipantsState","initialThemeState","reducers","combineReducers","profileIndex","p","initialFaceSearchState","imageToken","loadedImage","faceSearchingImage","faceSearchResult","searchResults","initialRaceState","initialUserState","currentRunners","currentProfiles","runners","composer","composeWithDevTools","applyMiddleware","thunkMiddleware","AdminReducers","GlobalReducers","Store","createStore","App","store","path","Global","Admin","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","getElementById"],"mappings":"0VAEaA,EAAa,SAACC,GAAD,OACxBC,YAAa,CACXC,UAAW,CACTC,MAAOH,EAAMI,QAAQC,QAAQC,MAC7B,UAAW,CACTH,MAAOH,EAAMI,QAAQC,QAAQE,eAGjCC,UAAW,CACTL,MAAOH,EAAMI,QAAQC,QAAQI,KAC7B,UAAW,CACTN,MAAOH,EAAMI,QAAQC,QAAQC,QAGjCI,UAAW,CACTP,MAAOH,EAAMI,QAAQC,QAAQI,MAE/BE,YAAa,CACXC,KAAM,eACNT,MAAO,gBAETU,WAAY,CACVC,MAAO,OACPC,OAAQ,QAEVC,UAAW,CACTF,MAAO,QACPC,OAAQ,SAEVE,SAAU,CACRH,MAAO,OACPC,OAAQ,WCnBDG,EAAY,U,0CCOnBC,EAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRF,EAAWC,IADJ,IAEVqB,KAAM,CACJC,QAAS,QACTC,OAAQ,SACRT,MAAO,OACPC,OAAQ,OACRS,gBAAiBxB,EAAMI,QAAQoB,iBAEjCC,OAAQ,CACNX,MDbqB,ICcrBC,OAAQ,OACRW,WAAY,EACZC,SAAU,QACVC,OAAQ,GAGVC,YAAa,CACXf,MDpB0B,ICsB5BgB,YAAa,CACXhB,MDxBqB,ICyBrBU,gBAAiBxB,EAAMI,QAAQC,QAAQI,KACvCsB,WAAY/B,EAAMgC,YAAYC,OAAO,QAAS,CAC5CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASC,kBAGzCC,iBAAkB,CAChBC,UAAW,SACXzB,MDhC0B,GCiC1BiB,WAAY/B,EAAMgC,YAAYC,OAAO,QAAS,CAC5CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASC,kBAGzCG,aAAa,yBACXlB,QAAS,OACTmB,WAAY,SACZC,QAAS,SACN1C,EAAM2C,OAAOC,SAJN,IAKVC,eAAgB,aAElBC,OAAQ,CACNhC,MAAO,OACPQ,QAAS,cACTmB,WAAY,SACZI,eAAgB,UAElBE,KAAM,CACJjC,MAAO,OACPC,OAAQ,QAEViC,KAAM,CACJ1B,QAAS,mBAEX2B,MAAO,CACLC,WAAY,OACZ/C,MAAOH,EAAMI,QAAQ+C,OAAOC,MAC5BC,WAAY,OAEdC,KAAK,aACHhC,QAAS,QACTR,MAAO,OACPC,OAAQ,OACRsC,WAAYE,IACZC,YAAaxD,EAAMyD,QAAQ,GAC3B1B,WAAY/B,EAAMgC,YAAYC,OAAO,SAAU,CAC7CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASsB,iBAEtC1D,EAAM2D,YAAYC,KAAK,MAAQ,CAC9BP,WAAYrD,EAAMyD,QAAQ,GAC1BD,YAAaxD,EAAMyD,QAAQ,KAG/BI,UAAU,aACRR,WAAYS,GACZ/B,WAAY/B,EAAMgC,YAAYC,OAAO,SAAU,CAC7CC,OAAQlC,EAAMgC,YAAYE,OAAO6B,QACjC3B,SAAUpC,EAAMgC,YAAYI,SAASC,kBAEtCrC,EAAM2D,YAAYC,KAAK,MAAQ,CAC9BP,WAAYrD,EAAMyD,QAAQ,GAC1BD,YAAaxD,EAAMyD,QAAQ,KAI/BO,WAAY,CACV7D,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQI,KAAM,SAAW,EACnD,QACA,eAYC0D,EAAa,SAACC,GACzB,IAAMC,EAAUlD,IADwC,EAEhBmD,mBAASC,OAAOC,WAAa,MAFb,mBAEjDC,EAFiD,KAEnCC,EAFmC,OAG1BJ,oBAAS,GAHiB,mBAGjDK,EAHiD,KAGxCC,EAHwC,KAKlDC,EAAmB,SAACC,GAAD,OAAqB,WAC5CJ,EAAgBI,KAGZC,EAAoB,SAACD,GAAD,OAAqB,WACxCL,GACHG,EAAWE,KAIf,OACE,sBAAKE,UAAWX,EAAQhD,KAAxB,UACE,cAAC4D,EAAA,EAAD,CAAQC,QAAM,EAAd,SACE,eAACC,EAAA,EAAD,CACEH,UAAWI,IAAWf,EAAQ5C,OAAT,eAClB4C,EAAQxC,aAAe4C,IAE1BY,QAAQ,YACRC,OAAO,OACPC,KAAMd,EACNJ,QAAS,CACPmB,MAAOJ,IAAWf,EAAQvC,YAAT,eACduC,EAAQ/B,kBAAoBmC,IAAiBE,KATpD,UAaE,sBAAKK,UAAWX,EAAQ7B,aAAxB,UACE,sBACEwC,UAAWI,IAAWf,EAAQvB,OAAT,eAClBuB,EAAQrB,MAAQyB,IAAiBE,IAFtC,UAKE,qBACEc,IAAKrB,EAAMnB,MACXyC,IAAKtB,EAAMrB,KACXiC,UAAWX,EAAQtB,OAErB,cAAC4C,EAAA,EAAD,CAAYN,QAAQ,YAAYL,UAAWX,EAAQpB,MAAnD,SACGmB,EAAMnB,WAGVwB,EACC,cAACmB,EAAA,EAAD,CAAYC,QAAShB,GAAiB,GAAtC,SACE,cAACiB,EAAA,EAAD,CAAiBd,UAAWX,EAAQL,eAGtC,cAAC4B,EAAA,EAAD,CAAYC,QAAShB,GAAiB,GAAtC,SACE,cAAC,IAAD,CAAUG,UAAWX,EAAQL,kBAInC,cAAC+B,EAAA,EAAD,CACEC,aAAcjB,GAAkB,GAChCkB,aAAclB,GAAkB,GAFlC,SAIGX,EAAM8B,aAIb,sBACElB,UAAWI,IAAWf,EAAQf,KAAT,eAClBe,EAAQR,WAAaY,IAF1B,SAKGL,EAAM+B,e,sEC/LFC,EAAa,SAACC,GACzB,OAAOC,aAAaC,QAAQF,ICMjBG,EAAa,WACxB,IAAIC,EDXGL,EAAW,SCYlB,OAAIK,EAAc,CAAEC,cAAe,UAAYD,GAEtC,IAwCEE,EAAU,WAGJ,IAFjBC,EAEgB,wDADhBC,EACgB,wDACZC,EAAUN,IAEVI,IACFE,EAAQ,iBAAmB,2BAG7B,IAAIC,EAAuB,CACzBC,OAAQ,MACRC,KAAM,OACNH,QAASA,GAMX,OAHID,IACFE,EAAO,YAAkB,WAEpBA,GA6EIG,EAAW,SACtBC,GAEiB,IADjBN,EACgB,wDACZC,EAAUN,IACdM,EAAQ,gBAAkB,mBAE1B,IAAIC,EAAuB,CACzBC,OAAQ,OACRC,KAAM,OACNG,KAAMC,KAAKC,UAAUH,GACrBL,QAASA,GAOX,OAJID,IACFE,EAAO,YAAkB,WAE3BQ,QAAQC,IAAIT,GACLA,GAGIU,EAAU,SACrBN,GAEiB,IADjBN,EACgB,wDACZC,EAAUN,IACdM,EAAQ,gBAAkB,mBAE1B,IAAIC,EAAuB,CACzBC,OAAQ,MACRC,KAAM,OACNG,KAAMC,KAAKC,UAAUH,GACrBL,QAASA,GAOX,OAJID,IACFE,EAAO,YAAkB,WAGpBA,GAGIW,EAAa,SACxBP,GAEiB,IADjBN,EACgB,wDACZC,EAAUN,IACdM,EAAQ,gBAAkB,mBAE1B,IAAIC,EAAuB,CACzBC,OAAQ,SACRC,KAAM,OACNG,KAAMC,KAAKC,UAAUH,GACrBL,QAASA,GAMX,OAHID,IACFE,EAAO,YAAkB,WAEpBA,GChNM,EACH,GCDCY,EAAiB,SAC5BC,GAES,IADTC,EACQ,uDADgE,OAGxE,OAAwB,MAApBD,EAAS9C,OACU,UAAjB+C,EACKD,EAASE,OAAOC,MAAK,SAACD,GAE3B,OADaE,IAAIC,gBAAgBH,MAGT,SAAjBD,EACFD,EAASM,OAAOH,MAAK,SAACG,GAC3B,OAAOA,KAEiB,SAAjBL,EACFD,EAASR,KACU,SAAjBS,EACFD,EAASO,OACU,UAAjBN,OACT,EAEOO,QAAQC,OAAO,CACpBC,IAAK,wBAKkB,MAApBV,EAAS9C,OAKW,MAApB8C,EAAS9C,QAAsC,MAApB8C,EAAS9C,OACpC8C,EAASM,OAAOH,MAAK,SAACG,GAC3B,OAAOE,QAAQC,OAAOH,EAAKK,WAKtBH,QAAQC,OAAO,CAAEC,IAAKV,EAAS9C,OAAS,IAAM8C,EAASY,kBAV9DC,MC/BSC,EAAoB,uBAGpBC,EAAiB,oCACjBC,EAAsB,mCACtBC,EAAuB,0CACvBC,EACX,+CACWC,EACX,uDACWC,EACX,4CACWC,GAAwB,2CAExBC,GAAoB,gCACpBC,GAAW,uBACXC,GAAW,uBAGXC,GAAqB,qCACrBC,GAAiB,iCACjBC,GAAgB,gCAChBC,GAAc,8BACdC,GAAkB,kCAClBC,GAAa,6BACbC,GAAgB,gCAEhBC,GAAe,gCAIfC,GAAa,+BACbC,GAAe,iCACfC,GAAmB,qCAGnBC,GAAa,+BAGbC,GAAY,yBACZC,GAAc,wBACdC,GAAoB,iCACpBC,GAAmB,gCACnBC,GAAqB,kCC3B5BhJ,GAAOiJ,EAEAC,GAAY,SACvBC,EACAC,EACAC,EACAC,GAUA,IAAIC,EAAkB,CACpBC,SAAUL,EACVC,SAAUA,GAGZ,OAAOK,MAAM,GAAD,OAAIzJ,GAAJ,uBAA+B6F,EAAS0D,IACjD7C,MAAK,SAACH,GAAD,OAAkCD,EAAeC,EAAU,WAChEG,MACC,SAACG,GLjCmB,IAAC7B,EAAc0E,EAAd1E,EKkCR,QLlCsB0E,EKkCb7C,ELjC1B5B,aAAa0E,QAAQ3E,EAAM0E,GKkCrBL,GAAYA,OAEd,SAACO,GACCN,GAAYA,EAASM,OAsDhBC,GAAa,SACxBC,EACAT,EACAC,GAMA,OAJApD,QAAQC,IAAI,iBACZD,QAAQC,IAAI,UAAW2D,GACvB1C,KAEOqC,MAAM,GAAD,OAAIzJ,GAAJ,wBAAgCqG,EAAWyD,IACpDpD,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,WACtDG,MACC,SAACqD,GACC7D,QAAQC,IAAI4D,GACZV,GAAYA,EAASU,MAEvB,SAACH,GACCN,GAAYA,EAASM,OAsGhBxC,GAAU,uCAAG,sBAAA4C,EAAA,+EACjBP,MAAM,GAAD,OAAIzJ,GAAJ,wBAAgC6F,OAASoE,GAAW,IAAOvD,MACrE,WLjNyB,IAAC1B,IKkNV,QLjNlBC,aAAaiF,WAAWlF,GKkNpB9B,OAAOiH,SAASC,KAAO,YAJH,2CAAH,qDC9MVC,GAA+B,CAC1C,CACEC,GAAI,UACJC,KAAM,cAACC,EAAA,EAAD,IACNC,MAAO,UACPC,IAAK,eACLlG,QAAS,MAGX,CACE8F,GAAI,QACJC,KAAM,cAACI,EAAA,EAAD,IACNF,MAAO,QACPC,IAAK,gBACLlG,QAAS,KACToG,KAAM,CAAC,UAGT,CACEN,GAAI,SACJC,KAAM,cAACM,EAAA,EAAD,IACNJ,MAAO,SACPC,IAAK,iBACLlG,QAAS,KACToG,KAAM,CAAC,UAST,CACEN,GAAI,QACJC,KAAM,cAACO,EAAA,EAAD,IACNL,MAAO,QACPC,IAAK,gBACLlG,QAAS,MAEX,CACE8F,GAAI,GACJC,KAAM,cAACQ,EAAA,EAAD,IACNN,MAAO,UACPC,IAAK,iBACLlG,QAAS4C,GAAW4D,UAAKf,K,wCC/CvBnK,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACXqM,SAAU,CACR,mBAAoB,CAClBnM,MAAOH,EAAMI,QAAQ+C,OAAOC,QAGhCmJ,iBAAkB,CAChB/K,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvC,mBAAoB,CAClBH,MAAOH,EAAMI,QAAQ+C,OAAOC,QAGhC+E,KAAM,GACNyD,KAAM,GACNY,WAAY,CACVC,SAAU,QAEZC,YAAa,CACXC,YAAa,GACbC,aAAc,SAcPC,GAAiB,SAACzI,GAC7B,IAAMC,EAAUlD,KAChB,OACE,eAAC2L,GAAA,EAAD,yBACE9H,UAAWX,EAAQiI,SACnBS,SAAU3I,EAAM2I,UACX3I,EAAMyB,QAAU,CAAEA,QAASzB,EAAMyB,SAAY,IAHpD,cAKGzB,EAAMwH,MACL,cAACoB,GAAA,EAAD,CACEhI,UAAWX,EAAQuH,KACnBvH,QAAS,CAAEhD,KAAMgD,EAAQmI,YAF3B,SAIGpI,EAAMwH,OAGX,cAACqB,GAAA,EAAD,CACE5I,QAAS,CAAEhE,QAASgE,EAAQ8D,KAAM9G,KAAMgD,EAAQqI,aAChDrM,QAAS+D,EAAM+D,YCnDV+E,GAAuB,SAAC9I,GAAsC,IACjEuH,EAAiBvH,EAAjBuH,GAAOwB,EADyD,aAC/C/I,EAD+C,QAKlEgJ,EAHWC,cAESC,SACKC,MAAM,KAC/BC,EAAWJ,EAAcA,EAAcK,OAAS,GAEhDC,EAAS,cAAC,GAAD,aAAgBX,SAAUS,IAAa7B,GAAQwB,IACxDQ,EAAahC,GAAM,cAAC,IAAD,CAAMA,GAAIA,EAAV,SAAe+B,IAExC,OAAO,cAAC,WAAD,UAAW/B,EAAKgC,EAAaD,KCRzBE,GAAO,SAACxJ,GACnB,IAAMyJ,EAAWC,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QAepE,OACE,cAAC,EAAD,CACE/H,SAAU/B,EAAM+B,SAChBpD,KClCS,6+HDmCTE,MAAM,eACNiD,MACE,cAAC,WAAD,UACGwF,GAAQyC,QAAO,SAAAC,GAAI,OApBQ,SAACA,GACnC,OAAGA,EAAKnC,QACH4B,GACsE,IAAhEO,EAAKnC,KAAKkC,QAAO,SAAAE,GAAE,OAAKR,EAASS,MAAMC,SAASF,MAAKZ,OAiBlCe,CAA4BJ,MAAQK,KAAI,SAACL,GAC/D,OACE,cAAC,GAAD,CACEjG,KAAMiG,EAAKtC,MAEXH,GAAIyC,EAAKzC,GACTC,KAAMwC,EAAKxC,KACX/F,QAASuI,EAAKvI,SAHTuI,EAAKtC,eE/Bb4C,GAAgB,SAAC1O,GAAD,OAC3BC,YAAa,CACX0O,UAAW,CAET7N,MAAO,OACP4B,QAAS,YACTlB,gBAAiBxB,EAAMI,QAAQwO,WAAWC,QAC1CC,aAAc,mCAEhBzN,KAAM,CACJP,MAAO,OACPC,OAAQ,QAEV6B,QAAS5C,EAAM2C,OAAOC,QACtBmM,QAAS,CACPC,SAAU,EACVxN,gBAAiBxB,EAAMI,QAAQwO,WAAWC,QAC1CnM,QAAS1C,EAAMyD,QAAQ,GACvBnC,QAAS,QACTC,OAAQ,gBAkBD0N,GAAc,SAACjP,GAAD,OACzBC,YAAa,CACXiP,WAAY,CACV5N,QAAS,QACTC,OAAQ,SACRT,MAAO,QAGTqO,QAAS,CACPrO,MAAO,OACPC,OAAQ,QAEVqO,SAAU,CACRC,UAAW,QACXT,WAAY5O,EAAMI,QAAQ+C,OAAOC,MACjCkM,OAAQ,OACRC,MAAO,OACPjO,QAAS,QACTC,OAAQ,WACRmB,QAAS,EACTf,SAAU,WACVb,MAAO,QAET0O,gBAAiB,CACflO,QAAS,QACTR,MAAO,OACPC,OAAQ,QAGV0O,YAAa,CACXC,UAAW,QAEb,sCAAuC,CACrCP,QAAS,CACPO,UAAW,YAKNC,GAAe,SAAC3P,GAAD,OAC1BC,YAAa,CACX0O,UAAW,CACTG,aAAc,aAAe9O,EAAMI,QAAQC,QAAQI,KACnDiC,QAAS,aAEXkN,cAAe,CACb7O,OAAQ,OACR0B,WAAY,SACZnB,QAAS,cACTuB,eAAgB,gBAChB/B,MAAO,QAET+O,YAAa,CACXC,SAAU,SACVC,UAAW,UACXC,WAAY,OACZC,cAAe,UACf/M,WAAY,OACZgN,SAAU,SACVC,aAAc,WACdC,WAAY,UAEdC,WAAY,CACVC,KAAM,eAICC,GAAc,SAACvQ,GAAD,OACzBC,YAAa,CACXuQ,iBAAkB,CAChBV,SAAU,YACVE,WAAY,IACZtN,QAAS,YAEXoJ,MAAO,CACL3L,MAAOH,EAAMI,QAAQC,QAAQC,MAC7B,iBAAkB,CAChBH,MAAOH,EAAMI,QAAQC,QAAQI,MAE/B,eAAgB,CACdN,MAAOH,EAAMI,QAAQ6K,MAAMxK,MAE7B,kBAAmB,CACjBN,MAAOH,EAAMI,QAAQqQ,KAAK,OAG9BC,aAAc,GACdC,WAAY,GACZC,cAAe,GAEfC,UAAW,CACTf,SAAU,YACVnD,YAAa,QAGfmE,UAAW,CACTpO,QAAS,EACTqO,aAAc/Q,EAAMyD,QAAQ,GAC5B,YAAa,CACXiM,UAAW1P,EAAMyD,QAAQ,KAG7BuN,cAAe,GACfC,WAAY,GAEZC,UAAW,CACT,WAAY,CACVC,kBAAmBnR,EAAMI,QAAQC,QAAQI,MAE3C,iBAAkB,CAChB0Q,kBAAmBnR,EAAMI,QAAQqQ,KAAK,KAAO,eAE/C,UAAW,CACTU,kBAAmBnR,EAAMI,QAAQC,QAAQI,OAG7C2Q,YAAa,CACXC,YAAarR,EAAMI,QAAQ6K,MAAMxK,KACjC,UAAW,CACT4Q,YAAarR,EAAMI,QAAQ6K,MAAMxK,KACjC6Q,UAAW,gBAAkBtR,EAAMI,QAAQ6K,MAAMxK,OAGrD8Q,OAAQ,CACN5E,YAAa,QAEf6E,mBAAoB,CAClB1B,SAAU,YACVE,WAAY,IACZtN,QAAS,YAGX+O,eAAgB,CACdC,aAAc,EACd9C,WAAY5O,EAAMI,QAAQ+C,OAAOC,MACjCkM,OAAQ,oBACRQ,SAAU,OACVpN,QAAS,YACT5B,MAAO,oBACP2L,SAAUzM,EAAMyD,QAAQ,GACxB1B,WAAY,+BACZ,UAAW,CACTsP,YAAarR,EAAMI,QAAQC,QAAQC,MACnCgR,UAAW,gBAAkBtR,EAAMI,QAAQC,QAAQsR,UAK9CC,GAAe,SAAC5R,GAAD,OAC1BC,YAAa,CACX4R,OAAQ,CACN/Q,MAAO,oBACPC,OAAQ,OACRQ,OAAQ,OACR,UAAW,CACTC,gBAAiBxB,EAAMI,QAAQ6K,MAAMxK,KACrCN,MAAOH,EAAMI,QAAQ+C,OAAOC,OAE9B,YAAa,CACX5B,gBAAiBxB,EAAMI,QAAQ0R,QAAQrR,KACvCN,MAAOH,EAAMI,QAAQ+C,OAAOC,OAE9B,SAAU,CACR5B,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpCtQ,MAAOH,EAAMI,QAAQ+C,OAAO4O,QAGhC9G,MAAO,GACP6G,QAAS,GACT5D,KAAM,GACN8D,IAAK,CACH1Q,QAAS,OACTmB,WAAY,SACZwP,UAAW,SACXpP,eAAgB,SAChBd,WAAY,0BACZqO,WAAY,WACZ1N,QAAS,OACT,aAAc,CACZvC,MAAO,UACP2P,SAAU,YACVE,WAAY,MACZ9M,WAAY,UAGhB6L,QAAS,GACT,qBAAsB,CACpB,KAAM,CACJmD,QAAS,GAEX,MAAO,CACLA,QAAS,GAEX,OAAQ,CACNA,QAAS,OAWJC,GAAe,SAACnS,GAAD,OAC1BC,YAAa,CACXoB,KAAM,CACJ2N,SAAU,EACVjO,OAAQ,OACRa,OAAQ,EACRsO,SAAU,SACVvO,SAAU,WACVL,QAAS,QAEX8Q,QAAS,CAEPrR,OAAQ,QAEVe,YAAa,CACXH,SAAU,WACVZ,OAAO,gBAAD,OAAkBsR,IAAlB,OACNvR,MAtBY,IAuBZyB,UAAW,SACXX,OAAQ,KACRG,WAAY/B,EAAMgC,YAAYC,OAAO,QAAS,CAC5CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASC,kBAGzCC,iBAAkB,CAChBC,UAAW,SACXR,WAAY/B,EAAMgC,YAAYC,OAAO,QAAS,CAC5CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASsB,gBAEvC5C,MAnCiB,IAsCnB8B,QAAS,CACPtB,QAAS,OACTmB,WAAY,SACZI,eAAgB,WAChBH,QAAS,QACT3B,OA7CgB,GA+ChBD,MAAO,UACPgO,aAAc,aAAe9O,EAAMI,QAAQqQ,KAAK,KAChD7O,OAAQ,KACRJ,gBAAiBxB,EAAMI,QAAQ+C,OAAOC,OAGxCkP,cAAe,CACbhR,QAAS,UACTR,MAAO,WAETyR,cAAe,CACbzR,MAAO0R,IACPnP,WAAY,EACZG,YAAa,GAGfiP,KAAM,CAEJ7Q,OAAQ,IACR8Q,UAAW,OACXnQ,UAAW,SACXxB,OAAQ,QAIVgO,QAAS,CAEPC,SAAU,EACVxN,gBAAiBxB,EAAMI,QAAQwO,WAAWC,QAC1CnM,QAAS1C,EAAMyD,QAAQ,GAEvBnC,QAAS,YA6GFqR,GAGgC,CAC3C7R,MAAO,OACPmR,UAAW,UAGAW,GAGgC,CAC3C9R,MAAO,OACPQ,QAAS,OACTuB,eAAgB,WAChBtB,OAAQ,a,oBC9ZJsR,GAAc,CAClB1P,OAAQ,CACN4O,MAAO7Q,EACPkC,MdzBqB,Wc2BvB6H,MAAO,CACLxK,Kd/BuB,UcgCvByD,SdjCqB,WcmCvB4N,QAAS,CACPrR,KdlCuB,WcoCzBqS,KAAM,CACJrS,Kd/BoB,YcmClBsS,GAAYC,KAAe,CAC/BC,UAAW,CACTC,aAAc,CACZ7R,KAAM,CACJyO,SAAU,cAGdqD,aAAc,CACZ9R,KAAM,CACJyO,SAAU,cAGdsD,oBAAqB,CACnB/R,KAAM,CACJC,QAAS,UAGb+R,WAAY,CACVC,uBAAwB,CACtBxD,SAAU,aAEZyD,oBAAqB,CACnBzD,SAAU,aAEZ0D,qBAAsB,CACpB1D,SAAU,aAEZ2D,sBAAuB,CACrB3D,SAAU,cAGd4D,QAAS,CACPrS,KAAM,CACJ6O,SAAU,YAGdyD,eAAgB,CACdtS,KAAM,CACJqB,QAAS,MACT,eAAgB,CACdkR,cAAe,SAIrBC,YAAa,CACXxS,KAAM,CACJ,gCAAiC,CAC/BG,gBAAiB,YAGrBsS,OAAQ,CACN,UAAW,CACTtS,gBAAiB,kBAOduS,GAAYf,KAAe,2BACnCD,IADkC,IAErCiB,UAAW,YACX5T,QAAQ,2BACHyS,IADE,IAELxS,QAAS,CACPC,MAAO,UACPG,KAAM,UACNkR,KAAM,UACNpR,aAAcW,GAEhB+S,UAAW,CACT3T,MAAO,UACPG,KAAM,UACNkR,KAAM,gBAKCuC,GAAYlB,KAAe,2BACnCD,IADkC,IAGrCiB,UAAW,YACX5T,QAAQ,2BACHyS,IADE,IAELxS,QAAS,CACPC,MAAO,UACPG,KAAM,UACNkR,KAAM,UACNpR,aAAcW,GAGhBiT,uBAAwB,YACxB3S,gBAAiB,cClIfL,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,eACRgP,GAAYjP,QAyCJoU,GAjCE,SAAChQ,GAChB,IAAMC,EAAUlD,KAEVkT,EAAqBvG,aACzB,SAACC,GAAD,OAAqBA,EAAMuG,MAAMC,KAAKP,aAElCQ,EAAY,CAACT,GAAWG,IAC1BO,EAAQD,EAAUE,WAAU,SAACC,GAAD,OAAOA,EAAEX,YAAcK,KACjDrU,EAAQwU,EAAUC,GAIlBrH,EADWC,cACcC,SAASC,MAAM,KACxCC,EAAWJ,EAAcA,EAAcK,OAAS,GAGhDmH,EADsB,CAAC,QAAS,SAAU,QAAS,SAAU,WACxBC,QAAQrH,GAAY,EAE/D,OACE,cAAC,IAAD,CAAkBxN,MAAOA,EAAzB,SACE,qBAAKgF,UAAWX,EAAQ6K,WAAxB,SACG0F,EACC,cAAC,WAAD,UACE,cAAC,GAAD,UAAOxQ,EAAM+B,aAGf,cAAC,WAAD,UAAW/B,EAAM+B,gB,UC3BrB9E,GAAOiJ,EAmFAwK,GAAqB,SAChCC,EACArK,EACAC,GAHgC,OAI7B,SAACqK,GAEJ,OADAzN,QAAQC,IAAIuN,GACLjK,MAAM,GAAD,OAAIzJ,GAAJ,2BAA2B0T,GAAapO,KACjDoB,KAAKJ,GACLI,MACC,SAACH,GACC,IAAIqN,EAAsB,CACxBC,IAAKtN,EAASmN,UACd1O,KAAMuB,EAASvB,KACf8O,WAAYvN,EAASuN,WAAavN,EAASuN,WAAa,GACxDC,YAAaxN,EAASwN,aAExB7N,QAAQC,IAAII,GACZoN,EAAS,CAAEK,KAAMhM,GAAoBiM,cAAeL,IACpDvK,GAAYA,EAAS9C,MAEvB,SAACqD,GACCN,GAAYA,EAASM,QAMhBsK,GAAgB,SAC3BC,EACAC,EACA/K,EACAC,GAJ2B,OAKxB,SAACqK,GAGJ,OAFAzN,QAAQC,IAAI,yBAA0BiO,GACtCT,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IAChCgG,MAAM,GAAD,OAAIzJ,GAAJ,2CAA2CmU,GAAU7O,KAC9DoB,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,YACtDG,MACC,SAAC2N,GACCV,EAAS,CACPK,KAAM/L,GACNmM,YAAaA,EACbD,OAAQA,EACRG,aAAcD,IAEhBV,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC4F,GAAYA,EAASgL,MAEvB,SAACzK,GACC+J,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC6F,GAAYA,EAASM,QAMhB2K,GAAgB,SAC3Bb,EACA1O,EACAwP,EACAC,EACAC,EACArL,EACAC,GAP2B,OAQxB,SAACqK,GACJ,IAAIpK,EAA+B,CACjCvE,KAAMA,EACN0O,UAAWA,EACXgB,UAAWA,GAYb,OATIF,EAAcpI,OAAS,IACzB7C,EAAQ,cAAoBiL,GAG1BC,EAAiBrI,OAAS,IAC5B7C,EAAQ,iBAAuBkL,GAGjCd,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IAChCgG,MAAMzJ,GAAO,mBAAqB0T,EAAWtN,EAAQmD,IACzD7C,KAAKJ,GACLI,MACC,SAACiO,GACChB,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC4F,GAAYA,EAASsL,MAEvB,SAAC/K,GACC+J,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC6F,GAAYA,EAASM,QC9LvB9J,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRF,EAAWC,IACX2P,GAAa3P,IAFN,IAGViW,WAAY,CACV5S,WAAY,QAEdiN,KAAM,CACJhP,QAAS,cACTmB,WAAY,gBAWLyT,GAAY,SAAC9R,GACxB,IAAMC,EAAUlD,KAChB,OACE,qBAAK6D,UAAWX,EAAQsK,UAAxB,SACE,sBAAK3J,UAAWX,EAAQuL,cAAxB,UACE,cAACjK,EAAA,EAAD,CAAYN,QAAQ,KAAKL,UAAWX,EAAQwL,YAA5C,SACGzL,EAAMnB,QAGRmB,EAAM+R,SACL,8BACG/R,EAAM+R,QAAQ1H,KAAI,SAAC2H,EAAmBC,GACrC,OACE,sBAAMrR,UAAWX,EAAQgM,WAAzB,SACG+F,GADuCC,c,UCnC7CC,GAAe,SAACtW,GAAD,OAC1BC,YAAa,CACXsW,QAAS,CAEPpW,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQI,KAAM,SAAW,EACnD,QACA,QACNe,gBAAiBxB,EAAMI,QAAQC,QAAQI,KACvC,UAAW,CACTe,gBAAiBxB,EAAMI,QAAQC,QAAQC,QAG3CkW,QAAS,CACPrW,MAAOH,EAAMI,QAAQC,QAAQC,MAC7B,UAAW,CACTH,MAAOH,EAAMI,QAAQC,QAAQE,aAC7BiB,gBAAiBxB,EAAMI,QAAQC,QAAQC,QAG3CmW,WAAY,CACVjV,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvCH,MAAOH,EAAMI,QAAQ+C,OAAOC,MAC5B0M,SAAU,YACVR,OAAQ,aAAetP,EAAMI,QAAQC,QAAQC,MAC7C,UAAW,CACTkB,gBAAiBxB,EAAMI,QAAQC,QAAQI,KACvCN,MAAOH,EAAMI,QAAQ+C,OAAOC,QAGhCsT,YAAa,CACXlV,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpCtQ,MAAOH,EAAMI,QAAQqQ,KAAK,MAE5BkG,SAAU,CACRnV,gBAAiBxB,EAAMI,QAAQ+C,OAAOC,MACtCjD,MAAOH,EAAMI,QAAQ+C,OAAO4O,MAC5BzC,OAAQ,aAAetP,EAAMI,QAAQC,QAAQC,MAC7C,UAAW,CACTkB,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvCH,MAAOH,EAAMI,QAAQC,QAAQE,kB,iDC3CtB,OAA0B,0CCEzC,SAASqW,GAAeC,IAQjB,SAAsBA,GAC3B,OAAOA,GAAK,YAAaA,GARpBC,CAAaD,IAEdA,EAAEE,QAAQtJ,OAAS,GAAKoJ,EAAED,gBAC5BC,EAAED,iBCSN,IAAMzV,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRF,EAAWC,IADJ,IAEVgX,SAAU,CACR/E,UAAW,SACXnR,MAAO,OACPC,OAAQ,OACRmP,SAAU,UAEZ+G,UAAW,CACTnW,MAAO,OACPC,OAAQ,OACRY,SAAU,YAEZuV,YAAa,CACXvV,SAAU,WACVwV,MAAO,OACPC,IAAK,OACL9V,QAAS,OACT+V,OAAQ,UACRlX,MAAO,UACPuC,QAAS,KAEX4U,UAAW,CACTxW,MAAO,OACPC,OAAQ,OACR0L,SAAU,UACV8K,UAAW,iBACXH,IAAK,KACLI,KAAM,KACNlI,OAAQ,OACRvN,WAAY/B,EAAMgC,YAAYC,OAAO,SAAU,CAC7CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASC,kBAGzC+L,KAAM,CACJtN,MAAO,OACPC,OAAQ,OACR0W,UAAW,UACXC,SAAU,UAEVC,MAAO,OACP,UAAW,CACT,iBAAkB,CAChBrW,QAAS,WAKfsW,eAAgB,CACd7V,WAAY/B,EAAMgC,YAAYC,OAAO,SAAU,CAC7CC,OAAQlC,EAAMgC,YAAYE,OAAOC,MACjCC,SAAUpC,EAAMgC,YAAYI,SAASyV,QAEvCvI,OAAQ,oBAGVwI,QAAS,SAcAC,GAAc,SAAC3T,GAC1B,IAAMC,EAAUlD,KAMV0E,EAAU,WACdzB,EAAM4T,aAAe5T,EAAM4T,YAAY5T,EAAMiC,QDtElC,YAGZ,IAFC4R,EAEF,EAFEA,YAAapS,EAEf,EAFeA,QAEf,yDADwD,GACxD,IADEqS,aACF,MADU,IACV,MADeC,4BACf,WACoD7T,oBAAS,GAD7D,mBACO8T,EADP,KAC2BC,EAD3B,KAEMC,EAAUC,mBACVC,EAASD,mBAETE,EAAQC,uBACZ,SAAC7B,GACCA,EAAE8B,UACF,IAAMC,EAAW,eAAQ/B,GAErBsB,GAAwBtB,EAAE2B,SAC5B3B,EAAE2B,OAAOK,iBAAiB,WAAYjC,GAAgB,CACpDkC,SAAS,IAEXN,EAAOO,QAAUlC,EAAE2B,QAGrBF,EAAQS,QAAUC,YAAW,WAC3Bf,EAAYW,GACZP,GAAsB,KACrBH,KAEL,CAACD,EAAaC,EAAOC,IAGjB5I,EAAQmJ,uBACZ,SACE7B,GAEI,IADJoC,IACG,yDACHX,EAAQS,SAAWG,aAAaZ,EAAQS,SACxCE,IAAuBb,IAAvB,OAA6CvS,QAA7C,IAA6CA,KAAUgR,IAEvDwB,GAAsB,GAElBF,GAAwBK,EAAOO,SACjCP,EAAOO,QAAQI,oBAAoB,WAAYvC,MAGnD,CAACuB,EAAsBtS,EAASuS,IC+BXgB,CAAa,CAAEnB,YARlB,SAACpB,GACnBzS,EAAMiV,WAAajV,EAAMiV,UAAUjV,EAAMiC,OAOQR,YAEnD,OACE,qBAAKb,UAAWX,EAAQ+J,KAAxB,SACE,qBACE1I,IAAKtB,EAAMkV,IAAMlV,EAAMkV,IAAMC,GAC7B9T,IAAI,YACJT,UAAWI,IACTf,EAAQiT,UACRlT,EAAM0T,SAAWzT,EAAQuT,gBAG3B/R,QAASA,OCzGX1E,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACXuZ,UAAW,CACT,UAAW,CACT,kBAAmB,CACjBtH,QAAS,KAKfuH,aAAc,GACdC,UAAW,CACT5Y,MAAO,QACPC,OAAQ,cAcD4Y,GAAgB,SAACvV,GAC5B,IAAMC,EAAUlD,KAD8C,EAE3BmD,qBAF2B,6BAiB9D,OACE,qBAAKU,UAAWX,EAAQmV,UAAxB,SACE,cAAC,GAAD,CACEF,IAAKlV,EAAMsR,OACXoC,QAAS1T,EAAM0T,QACfE,YAAa5T,EAAM4T,YACnBqB,UAAWjV,EAAMiV,UACjBhT,KAAMjC,EAAMiC,U,uECrCdlF,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRsQ,GAAYvQ,IADL,IAEVqB,KAAM,CACJlB,MAAOH,EAAMI,QAAQC,QAAQI,KAC7B,YAAa,CACXN,MAAOH,EAAMI,QAAQC,QAAQI,OAGjCqX,QAAS,GACT8B,QAAS,CACPzZ,MAAOH,EAAMI,QAAQ6K,MAAMxK,KAC3B,mBAAoB,CAClBN,MAAOH,EAAMI,QAAQ6K,MAAMxK,OAG/BoZ,eAAgB,SAuBPC,GAAiB,SAAC1V,GAC7B,IAAMC,EAAUlD,KAEV4Y,EACJ,cAACC,GAAA,EAAD,aACE3T,KAAMjC,EAAMiC,KACZyR,QAAS1T,EAAM0T,QACfzT,QACED,EAAMC,QACFD,EAAMC,QACN,CACEhD,KAAM+C,EAAM6V,UAAY5V,EAAQuV,QAAUvV,EAAQhD,KAClDyW,QAAS1T,EAAM6V,UACX5V,EAAQwV,eACRxV,EAAQyT,SAGpBoC,SAAU9V,EAAM8V,SAChBC,cAAe/V,EAAMgW,iBACrBC,SAAUjW,EAAMkW,YACXlW,EAAMmW,QAAU,CACnB3O,KAAM,cAAC,KAAD,IACN4O,YAAa,cAAC,KAAD,OASbC,EACJ,cAACC,GAAA,EAAD,CACEC,QAASZ,EACTjO,MACE1H,EAAMwW,SACJ,cAACjV,EAAA,EAAD,CAAYN,QAAQ,YAApB,SACGjB,EAAM2G,MAAQ,UAAY,aAG7B,eAACpF,EAAA,EAAD,WACGvB,EAAM0H,MACN1H,EAAMyW,cACL,cAACC,GAAA,EAAD,CAAMrP,KAAK,IAAI5F,QAhBF,WACvBzB,EAAM2W,mBAAqB3W,EAAM2W,qBAevB,SACG3W,EAAMyW,kBAMjBG,eAAgB5W,EAAM6W,WAAa7W,EAAM6W,WAAa,QAI1D,OAAO,cAAC,WAAD,UAAW7W,EAAM0H,MAAQ2O,EAAqBV,KCjGjD1Y,GAAOiJ,EAEA4Q,GAAmB,SAC9BC,EACAzQ,EACAC,GAH8B,OAI3B,SAACqK,GAEJ,OADAA,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IAC7CgG,MAAMzJ,GAAO,mCAAqC8Z,EAAOxU,KAC7DoB,KAAKJ,GACLI,MACC,SAACqD,GACC4J,EAAS,CAAEK,KAAM1M,EAAgByS,OAAQhQ,IACzC4J,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD4F,GAAYA,EAASU,MAEvB,SAACH,GACC+J,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD6F,GAAYA,EAASM,QAsDhBoQ,GAA4B,SACvCtG,EACAS,EACAC,EACA/K,EACAC,GALuC,OAMpC,SAACqK,GAEJ,OADAA,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IAC7CgG,MAAM,GAAD,OAAIzJ,GAAJ,2CAA2CmU,GAAU7O,KAC9DoB,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,YACtDG,MACC,SAAC2N,GACCV,EAAS,CACPK,KAAMtM,EACNgM,UAAWA,EACXU,YAAaA,EACbD,OAAQA,EACRG,aAAcD,IAEhBV,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD4F,GAAYA,EAASgL,MAEvB,SAACzK,GACC+J,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD6F,GAAYA,EAASM,QCzFvB9J,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRqW,GAAatW,IADN,IAEVsb,KAAM,CACJxa,MAAO,OACPC,OAAQ,OACRmP,SAAU,SACVvD,YAAa,OACb4O,WAAY,QAGdC,SAAU,CACR5M,WACE,0FAEF7N,OAAQ,OAGV6K,KAAM,CACJzL,MAAOH,EAAMI,QAAQ+C,OAAOC,OAG9BqY,SAAU,CACR9Z,SAAU,WACVwV,MAAO,OACPC,IAAK,OACL9V,QAAS,QACT+V,OAAQ,UACRlX,MAAOH,EAAMI,QAAQqQ,KAAK,KAC1B/N,QAAS,IACT,YAAa,CACXvC,MAAO,YAGX2X,QAAS,SAeA4D,GAAkB,SAACtX,GAC9B,IAAMC,EAAUlD,KADiD,EAEnCmD,oBAAS,GAF0B,mBAE1DqX,EAF0D,KAEjDC,EAFiD,OAG/BtX,oBAAS,GAHsB,mBAG1DuX,EAH0D,KAG/CC,EAH+C,OAI3BxX,mBAAwB,IAJG,mBAI1DyX,EAJ0D,KAI7CC,EAJ6C,OAK7B1X,mBAClCF,EAAM6Q,QAAQE,YANiD,mBAK1DA,EAL0D,KAK9C8G,EAL8C,KASjEC,qBAAU,WACRD,EAAc7X,EAAM6Q,QAAQE,YAC5ByG,GAAW,KACV,CAACxX,IC5EoC,SACxC2Q,EACAI,EACAgH,GAKA,IAAMnH,EAAWoH,cACXC,EAAsBlH,GAA0B,GACtD+G,qBAAU,WACW,OAAf/G,GAAuBkH,EAAoB5O,OAAS,GACtD6O,MAED,CAACD,IAEJ,IAAMC,EAAqB,WACzB,IAAK,IAAIjG,EAAI,EAAGA,EAAIgG,EAAoB5O,OAAQ4I,IAC9C,IAAKgG,EAAoBhG,GAAGkG,MAAM,GAAG7G,OAAQ,CAC3C,IAAIF,EAAS6G,EAAoBhG,GAAGkG,MAAM,GAAG/G,OAEzC2G,EACFd,GACEtG,EACAS,EACA6G,EAAoBhG,GAAGZ,YAHzB4F,CAIErG,GAEFO,GAAcC,EAAQ6G,EAAoBhG,GAAGZ,YAA7CF,CAA0DP,KDkDlEwH,CACEpY,EAAM6Q,QAAQC,IACd9Q,EAAM6Q,QAAQE,WACd/Q,EAAM+X,YAGR,IASMM,EAAiB,SAACC,GAEtB,OADYX,EAAYrH,WAAU,SAAC2B,GAAD,OAAOA,IAAMqG,MAS3CC,EAAuB,SAACD,GAC5BZ,GAAa,GACb,IAAIc,EAAW,aAAOb,GAClBtH,EAAQgI,EAAeC,GACvBjI,EAAQ,GAEVmI,EAAYC,KAAKH,GACjBV,EAAeY,KAGfA,EAAYE,OAAOrI,EAAO,GAC1BuH,EAAeY,GAEXA,EAAYnP,QAAU,GAAGqO,GAAa,KAIxCiB,EAAsB,SAACC,GAC3B,IAAM3W,EAAO2W,EAAMxE,OAAOnS,KAC1ByV,GAAa,GACba,EAAqBtW,IAkBnB4W,EAAoC,GAoCxC,OAlCEA,EADE9H,GAAcA,EAAW1H,OAAS,EACpB0H,EAAW1G,KACzB,SAACyO,GAAD,OACEA,EAAUX,OACR,eAACY,GAAA,EAAD,WACE,cAAC,GAAD,CACEzH,OAAQwH,EAAUX,MAAM,GAAG7G,OAC3BsC,YAAa2E,EAEb7E,QAAS2E,EAAeS,EAAUzH,cAAgB,EAClDpP,KAAM6W,EAAUzH,cAWlB,cAAC,GAAD,CACEpP,KAAM6W,EAAUzH,YAChBpR,QAAS,CAAEhD,KAAMgD,EAAQoX,SAAU3D,QAASzT,EAAQyT,SACpDA,QAAS2E,EAAeS,EAAUzH,cAAgB,EAClD8E,QAAM,EACNL,SAAU6C,MAtBK,aAAeG,EAAUzH,gBA4BlC,CAAC,cAAC,GAAD,GAAkB,yBAGjCkG,EACK,cAACyB,GAAA,EAAD,IAGL,qCACE,cAACC,GAAA,EAAD,CACEC,KAAMlZ,EAAMmZ,OACZC,WAAW,OACX/Z,QAAS,GACTuB,UAAWX,EAAQiX,KAJrB,SAMG2B,IAEF7Y,EAAMqZ,MACL,cAAC7X,EAAA,EAAD,CAAYC,QA3GI,WACtBzB,EAAMsZ,aAAetZ,EAAMsZ,eA0GrB,SACE,cAAC,KAAD,MAIH7B,GACC,cAAC8B,GAAA,EAAD,CACExd,MAAM,UACNkF,QAAQ,YAERL,UAAWI,IAAWf,EAAQkS,SAC9B1Q,QA5Ee,WACvB0B,QAAQC,IAAI,cACZpD,EAAMwZ,aACJxZ,EAAMwZ,YACJ7B,GACA,WACExU,QAAQC,IAAI,eA3ClBwU,EAAe,IACfF,GAAa,MA6CT,WACEvU,QAAQC,IAAI,mBA6DZ,kCErKGqW,GAAgB,CAC3B3I,IAAK,GACL7O,KAAM,GACN8O,WAAY,IAAI2I,OASZC,GAAsC,CAC1CC,WAAY,KACZ1I,cAAeuI,GACfI,UAAU,GChDCC,GAAmB,SAC9BnI,GAEA,IAAMoI,EAAcrQ,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,YAD5C,GAEAtQ,aACpB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,iBAEfhR,mBAAqBuZ,KAL7B,mBAKf5I,EALe,KAKNoJ,EALM,KAMhBrJ,EAAWoH,cAEjBF,qBAAU,WZ4CiB,IAC3B/Q,EACAT,EACAC,EY9CMoL,IAEGoI,EAAYH,WAiBfzW,QAAQC,IAAI,QZyBlB2D,EYvCQ4K,EZwCRrL,EYvCQ,SAAC4T,GACKA,EAAI7Q,OAAS,EACf8Q,EAAiBD,EAAI,IAGrB/W,QAAQC,IAAI,qBZmCxBmD,EYhCQ,WACEpD,QAAQC,IAAI,aZgCnB,SAACwN,GAyBJ,OAxBAzN,QAAQC,IAAI,kBAEZwN,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IAsBhCgG,MAAMzJ,GAAO,wBAA0B8J,EAAQxE,KACnDoB,MAAK,SAACH,GAAD,OAAwBD,EAAeC,MAC5CG,MACC,SAACH,GAECoN,EAAS,CAAEK,KAAM9L,GAAeyU,WADlBpW,IAEdoN,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC4F,GAAYA,EAAS9C,MAEvB,SAACqD,GACC+J,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC6F,GAAYA,EAASM,QYlEnB+J,MAKL,CAACe,IAEJ,IAAMwI,EAAmB,SAACxJ,GACxBD,GACEC,GACA,SAACE,GACCoJ,EAAWpJ,MAEb,WACE1N,QAAQC,IAAI,gBANhBsN,CAQEE,IAGJ,OAAOC,G,uGC3CH9T,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACXue,UAAW,CACT7c,SAAU,YAGZ8c,OAAQ,CACNC,eAAgB,QAChBC,iBAAkB,aAGpBC,OAAQ,CACNhe,KAAMZ,EAAMI,QAAQ+C,OAAOC,MAC3Byb,YAAa,IACbC,gBAAiB,SACjBC,aAAc,WACdC,OAAQhf,EAAMI,QAAQqQ,KAAK,KAC3B,aAAc,CACZuO,OAAQhf,EAAMI,QAAQ6e,QAAQ3e,QAGlCwC,OAAQ,CACNoc,kBAAmB,UACnBC,WAAY,SACZrP,SAAU,OACVE,WAAY,IACZpP,KAAMZ,EAAMI,QAAQqQ,KAAK,KACzB,aAAc,CACZ7P,KAAMZ,EAAMI,QAAQ6e,QAAQ3e,QAGhC8e,IAAK,CACHC,YAAa,EACbze,KAAMZ,EAAMI,QAAQqQ,KAAK,KACzBuO,OAAQhf,EAAMI,QAAQqQ,KAAK,KAC3B,aAAc,CACZuO,OAAQhf,EAAMI,QAAQ6e,QAAQ3e,MAC9BM,KAAMZ,EAAMI,QAAQ6e,QAAQ3e,QAGhCyM,SAAU,QAgDDuS,GAAmB,SAAClb,GAC/B,IAAMC,EAAUlD,KADoD,EAEpCmD,mBAAS,IAF2B,mBAE7Dib,EAF6D,KAEnDC,EAFmD,OAGlClb,mBAAS,CAAExD,MAAO,EAAGC,OAAQ,IAHK,mBAG7D0e,EAH6D,KAGlDC,EAHkD,OAI1Cpb,mBAAgC,IAJU,mBAI7DiY,EAJ6D,KAItDoD,EAJsD,OAK1Brb,qBAL0B,mBAK7Dsb,EAL6D,KAK9CC,EAL8C,KAM9DC,EAAMvH,iBAAuB,MAEnC2D,qBAAU,WACR6D,MACC,CAAC3b,EAAMmY,QAGV,IAAMwD,EAAY,WAChBP,EAAYpb,EAAMmb,UAClB,IAAIjG,EAAM,IAAI0G,MAEd1G,EAAI2G,OAAS,WACX,IAAMC,EAAW5G,EAAIxY,MACfqf,EAAY7G,EAAIvY,OAElBqf,EAAiB,EACjBN,EAAI/G,UACNqH,EAAiBN,EAAI/G,QAAQsH,aAG/B,IAAMvf,EAAQsf,EAGdV,EAAa,CAAE5e,MAAOA,EAAOC,OAFbqf,EAAiBD,EAAaD,IAG9CI,EAAUxf,EAAQof,IAEpB5G,EAAI5T,IAAMtB,EAAMmb,UAIZe,EAAY,SAACC,GACjB,IAAMhE,EAA+BnY,EAAMmY,MAAM9N,KAC/C,SAAC+R,GA4CC,MA3CiC,CAC/B5B,OAAQ,CACNnG,MAAO,CACL9D,EAAG6L,EAAKC,OAAO9L,EAAI4L,EAASC,EAAKE,KAAOH,EAAS,EACjDI,EAAGH,EAAKC,OAAOE,EAAIJ,EAASC,EAAKE,KAAOH,EAAS,GAEnDzf,MAAO0f,EAAKE,KAAOH,EACnBK,MAAOJ,EAAKI,OAEdC,KAAM,CACJrJ,KAAM,CACJ7C,EAAG6L,EAAKK,KAAKrJ,KAAK7C,EAAI4L,EACtBI,EAAGH,EAAKK,KAAKrJ,KAAKmJ,EAAIJ,GAExBpJ,MAAO,CACLxC,EAAG6L,EAAKK,KAAK1J,MAAMxC,EAAI4L,EACvBI,EAAGH,EAAKK,KAAK1J,MAAMwJ,EAAIJ,IAG3BO,MAAO,CACLtJ,KAAM,CACJ7C,EAAG6L,EAAKM,MAAMtJ,KAAK7C,EAAI4L,EACvBI,EAAGH,EAAKM,MAAMtJ,KAAKmJ,EAAIJ,GAEzBpJ,MAAO,CACLxC,EAAG6L,EAAKM,MAAM3J,MAAMxC,EAAI4L,EACxBI,EAAGH,EAAKM,MAAM3J,MAAMwJ,EAAIJ,IAG5BQ,KAAM,CACJpM,EAAG6L,EAAKO,KAAKpM,EAAI4L,EACjBI,EAAGH,EAAKO,KAAKJ,EAAIJ,GAEnBS,OAGER,EAAKQ,QAAU,CACbC,YAAaT,EAAKQ,OAAOC,YACzBC,WAAYV,EAAKQ,OAAOE,WACxBnM,UAAWyL,EAAKQ,OAAOjM,eAQ7BhI,EAA0B,KAC1BwP,EAAM9O,OAAS,IACjBV,EAAW,GAGb4S,EAASpD,GACQ,OAAbxP,IACF8S,EAAiB9S,GACjB3I,EAAM+c,mBAAmB/c,EAAMmY,MAAMxP,GAAU8T,KAAM9T,KASzD,OACE,qBAAK/H,UAAWX,EAAQma,UAAWsB,IAAKA,EAAxC,SACE,qBACE9a,UAAWX,EAAQoa,OACnB2C,MAAO,CACLC,gBAAiB,OAAS9B,EAAW,IACrCze,MAAO2e,EAAU3e,MACjBC,OAAQ0e,EAAU1e,QALtB,SAQE,qBAAKD,MAAM,OAAOC,OAAO,OAAzB,SACGwb,GACCA,EAAM9N,KAAI,SAAC6S,EAA0BjL,GACnC,OACE,oBAEExQ,QAAS,WArBN,IAAC4O,EAClBoL,EADkBpL,EAsBS4B,GApB3BjS,EAAM+c,mBAAmB/c,EAAMmY,MAAM9H,GAAOoM,KAAMpM,IAiBtC,UAOE,sBACEE,EAAG2M,EAAS1C,OAAOnG,MAAM9D,EACzBgM,EAAGW,EAAS1C,OAAOnG,MAAMkI,EACzB7f,MAAOwgB,EAAS1C,OAAO9d,MACvBC,OAAQugB,EAAS1C,OAAO9d,MACxBkE,UAAWI,IACTf,EAAQua,OACRvI,IAAMuJ,GAAiBvb,EAAQ0I,UAEjCqU,MAAO,CACL7J,UAAW,UAAY+J,EAAS1C,OAAOgC,MAAQ,OAC/CvB,YAAakC,KAAKC,IAAIF,EAAS1C,OAAO9d,MAAQ,IAAK,MAItDwgB,EAASN,QAAUM,EAASN,OAAOC,YAAc,IAChD,sBACEtM,EAAG2M,EAAS1C,OAAOnG,MAAM9D,EAAI2M,EAAS1C,OAAO9d,MAAQ,EACrD6f,EAAGW,EAAS1C,OAAOnG,MAAMkI,EAAIW,EAAS1C,OAAO9d,MAAQ,GACrDkE,UAAWI,IACTf,EAAQvB,OACRuT,IAAMuJ,GAAiBvb,EAAQ0I,UAEjCwK,UAAS,iBAAY+J,EAAS1C,OAAOgC,MAA5B,YACPU,EAAS1C,OAAOnG,MAAM9D,EAAI2M,EAAS1C,OAAO9d,MAAQ,EAD3C,aAEJwgB,EAAS1C,OAAOnG,MAAMkI,EAAI,GAFtB,KAPX,SAWGW,EAASN,OAAOE,WAAhB,YACoC,IAA9BI,EAASN,OAAOC,aAAmBQ,QAAQ,GADjD,QAML,wBACEC,GAAIJ,EAAST,KAAKrJ,KAAK7C,EACvBgN,GAAIL,EAAST,KAAKrJ,KAAKmJ,EACvBiB,EAA2B,IAAxBN,EAAS1C,OAAO9d,MACnBkE,UAAWI,IACTf,EAAQ+a,IACR/I,IAAMuJ,GAAiBvb,EAAQ0I,YAGnC,wBACE2U,GAAIJ,EAAST,KAAK1J,MAAMxC,EACxBgN,GAAIL,EAAST,KAAK1J,MAAMwJ,EACxBiB,EAA2B,IAAxBN,EAAS1C,OAAO9d,MACnBkE,UAAWI,IACTf,EAAQ+a,IACR/I,IAAMuJ,GAAiBvb,EAAQ0I,YAInC,wBACE2U,GAAIJ,EAASP,KAAKpM,EAClBgN,GAAIL,EAASP,KAAKJ,EAClBiB,EAA2B,IAAxBN,EAAS1C,OAAO9d,MACnBkE,UAAWI,IACTf,EAAQ+a,IACR/I,IAAMuJ,GAAiBvb,EAAQ0I,YAInC,wBACE2U,GAAIJ,EAASR,MAAMtJ,KAAK7C,EACxBgN,GAAIL,EAASR,MAAMtJ,KAAKmJ,EACxBiB,EAA2B,IAAxBN,EAAS1C,OAAO9d,MACnBkE,UAAWI,IACTf,EAAQ+a,IACR/I,IAAMuJ,GAAiBvb,EAAQ0I,YAGnC,wBACE2U,GAAIJ,EAASR,MAAM3J,MAAMxC,EACzBgN,GAAIL,EAASR,MAAM3J,MAAMwJ,EACzBiB,EAA2B,IAAxBN,EAAS1C,OAAO9d,MACnBkE,UAAWI,IACTf,EAAQ+a,IACR/I,IAAMuJ,GAAiBvb,EAAQ0I,cAnF9B,YAAcsJ,a,0CCrMxBwL,IAdKzgB,aAAW,SAACpB,GAC5BC,YAAa,2BACRqW,GAAatW,IADN,IAEV8hB,YAAa,CACXte,YAAa,cAUS,SAACY,GAK3B,OACE,cAACuZ,GAAA,EAAD,CAAQxd,MAAM,UAAU0F,QALN,WAClBzB,EAAMyB,WAIN,SACGzB,EAAMnB,MAAQmB,EAAMnB,MAAQ,aCf7B9B,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRqW,GAAatW,IACbD,EAAWC,IAFJ,IAGV+hB,OAAQ,CACNjhB,MAAO,OACPC,OAAQ,cAYDihB,GAAe,SAAC5d,GAC3B,IAAMC,EAAUlD,KACV8gB,EAAY1J,iBAAe,MAO3B2J,EAAgB9d,EAAM8d,cACtBC,EAAUzJ,uBAAY,WACZ,OAAduJ,GACwB,OAAtBA,EAAUlJ,SACVmJ,EAAcD,EAAUlJ,QAAQqJ,mBACjC,CAACH,EAAWC,IAEf,OACE,gCACE,cAAC,KAAD,CACEG,OAAO,EACPvC,IAAKmC,EACLK,iBAhBiB,CACrBC,WAAY,QAgBRvd,UAAWX,EAAQ0d,OACnBS,iBAAiB,eAEnB,eAAC7E,GAAA,EAAD,CACEtY,QAAQ,YACRgQ,KAAK,SACLgF,SAAUjW,EAAMkW,WAChBtV,UAAWX,EAAQkS,QACnB1Q,QAASsc,EALX,UAOE,cAAC,KAAD,CAAend,UAAWI,IAAWf,EAAQnE,aAP/C,kBAUA,cAAC,GAAD,CAAc2F,QAASzB,EAAMqe,mB,yCCtD7BthB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRqW,GAAatW,IACbD,EAAWC,IAFJ,IAGV0iB,iBAAkB,CAEhBC,WAAY,uCACZ3S,WAAY,IACZ9M,WAAY,KAGZnC,OAAQ,QACRZ,MAAOH,EAAMI,QAAQqQ,KAAK,KAC1BmS,cAAe,aACflgB,QAAS,SACTgP,aAAc,MACdJ,UAAW,aAAetR,EAAMI,QAAQC,QAAQI,KAChDwR,UAAW,SACXnR,MAAO,OACPU,gBAAiBxB,EAAMI,QAAQ+T,uBAC/B,uCAAwC,CACtCkD,OAAQ,UACR7V,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvCH,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQC,MAAO,SAAW,EACpD,QACA,SAER,WAAY,CACVgB,QAAS,UAGb+Y,SAAU,CACR7Y,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpC,uCAAwC,CACtC4G,OAAQ,cACR7V,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpCtQ,MAAOH,EAAMI,QAAQqQ,KAAK,MAE5B,WAAY,CACVnP,QAAS,UAGbuhB,eAAgB,CACd/S,SAAU,SACV5M,WAAY,QAEd4f,gBAAiB,CACf5Q,QAAS,EACTpR,MAAO,QACP,mBAAoB,CAClBuW,OAAQ,kBAWH0L,GAAwB,SACnC3e,GAEA,IAAMC,EAAUlD,KADb,EAE2BmD,oBAAS,GAFpC,mBAEI0e,EAFJ,KAEaC,EAFb,KAIGC,EAAuB,SAAClG,GAC5BA,EAAMpG,iBACNoG,EAAMmG,mBA8BR,OACE,gCACE,uBACEC,QAAQ,qBACRC,WAAW,EACXC,YAjCiB,SAACtG,GACtBkG,EAAqBlG,GACrBiG,GAAW,IAgCPM,YA7BiB,SAACvG,GACtBkG,EAAqBlG,GACrBiG,GAAW,IA4BPO,WAAYN,EACZO,OA1BY,SAACzG,GAEjB,GADAkG,EAAqBlG,GACjBA,EAAM0G,aAAaC,MAAO,CAC5B,IAAIC,EAAO5G,EAAM0G,aAAaC,MAAM,GACpCvf,EAAMyf,iBAAiBD,KAgBvB,SAQE,sBACE5e,UAAWI,IACTf,EAAQoS,WACRpS,EAAQqe,iBACRte,EAAMiW,UAAYhW,EAAQgW,UAJ9B,UAOE,uBAAMrV,UAAWX,EAAQwe,eAAzB,0BAEE,uBAFF,cAIE,uBAJF,wBAOCG,EACC,cAAC,KAAD,CAAUhe,UAAWX,EAAQrD,YAE7B,cAAC,KAAD,CAAiBgE,UAAWX,EAAQrD,iBAI1C,uBACEkZ,SAxCc,SAAC8C,GACnB,GAAIA,EAAMxE,OAAOmL,MAAO,CACtB,IAAIC,EAAO5G,EAAMxE,OAAOmL,MAAM,GAC9Bvf,EAAMyf,iBAAiBD,KAsCrBE,OAAO,UACPpH,GAAG,qBACHrH,KAAK,OACLrQ,UAAWX,EAAQye,gBACnBzI,SAAUjW,EAAMiW,e,UCxIlBlZ,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX8jB,MAAO,CACLpiB,SAAU,WACVb,MAAO,OACPC,OAAQ,OACR,0BAA2B,CACzBa,OAAQ,EACR,mBAAoB,CAClBsQ,QAAS,OAIf8R,aAAc,GAEdC,SAAU,CACRtiB,SAAU,WACV6V,KAAM,EACNL,MAAO,EACPC,IAAK,EACL8M,OAAQ,EACRxF,eAAgB,QAChByF,mBAAoB,cAEtBC,cAAe,CACbziB,SAAU,WACV6V,KAAM,EACNL,MAAO,EACPC,IAAK,EACL8M,OAAQ,EACR1iB,gBAAiBxB,EAAMI,QAAQ+C,OAAO4O,MACtCG,QAAS,GACTnQ,WAAY/B,EAAMgC,YAAYC,OAAO,iBAW9BoiB,GAAqB,SAACjgB,GACjC,IAAMC,EAAUlD,KAChB,OACE,sBAAKigB,MAAO,CAAEtgB,MAAO,OAAQC,OAAQ,QAArC,UACE,cAACsc,GAAA,EAAD,CACEG,WAAY,IACZF,KAAM,EACN7Z,QAAS,GACT2d,MAAO,CAAExN,cAAe,QAJ1B,SAMGxP,EAAMkgB,QAAQ7V,KAAI,SAAC8V,EAAgB9P,GAAjB,OACjB,cAAC0I,GAAA,EAAD,CAA2CG,KAAM,EAAjD,SACE,cAACkH,GAAA,EAAD,CACEC,aAAW,EACXzf,UAAWX,EAAQ0f,MACnBle,QAAS,kBAAMzB,EAAMsgB,WAAWH,IAHlC,SAKE,sBACEvf,UAAWX,EAAQ4f,SACnB7C,MAAO,CAAEC,gBAAgB,OAAD,OAASkD,EAAT,WARX,eAAiB9P,QAcxC,cAAC,GAAD,CAAc5O,QAASzB,EAAMugB,mB,qBCxE7BxjB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRqW,GAAatW,IACbD,EAAWC,IAFJ,IAGV4kB,aAAc,CAEZjC,WAAY,uCACZ3S,WAAY,IACZ9M,WAAY,KAIZnC,OAAQ,QACRZ,MAAOH,EAAMI,QAAQqQ,KAAK,KAC1BmS,cAAe,aACflgB,QAAS,SACTgP,aAAc,MACdJ,UAAW,aAAetR,EAAMI,QAAQC,QAAQI,KAChDwR,UAAW,SACXnR,MAAO,OACPU,gBAAiBxB,EAAMI,QAAQ+T,uBAC/B,uCAAwC,CACtCkD,OAAQ,UACR7V,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvCH,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQC,MAAO,SAAW,EACpD,QACA,SAER,WAAY,CACVgB,QAAS,UAGb+Y,SAAU,CACR7Y,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpC,uCAAwC,CACtC4G,OAAQ,cACR7V,gBAAiBxB,EAAMI,QAAQqQ,KAAK,KACpCtQ,MAAOH,EAAMI,QAAQqQ,KAAK,MAE5B,WAAY,CACVnP,QAAS,UAGbujB,WAAY,CACV/U,SAAU,SACV5M,WAAY,QAEd4hB,WAAY,CACV5S,QAAS,EACTpR,MAAO,QACP,mBAAoB,CAClBuW,OAAQ,kBAWH0N,GAAoB,SAAC3gB,GAChC,IAAMC,EAAUlD,KAWhB,OACE,gCACE,uBAAOiiB,QAAQ,gBAAgBvd,QAXf,SAACgR,GACdzS,EAAMiW,WACTxD,EAAED,iBACFC,EAAEsM,kBAEF/e,EAAM4gB,iBAMN,SACE,sBACEhgB,UAAWI,IACTf,EAAQoS,WACRpS,EAAQugB,aACRxgB,EAAMiW,UAAYhW,EAAQgW,UAJ9B,UAOE,uBAAMrV,UAAWX,EAAQwgB,WAAzB,sBACW,uBADX,kBAGA,uBACA,cAAC,KAAD,CAAiB7f,UAAWX,EAAQrD,iBAGxC,uBACE0b,GAAG,gBACHrC,SAAUjW,EAAMiW,SAChBrV,UAAWX,EAAQygB,WACnBzP,KAAK,eC5EPlU,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRF,EAAWC,IACXsW,GAAatW,IAFN,IAGV2S,YACAsS,SAAU,CACR9kB,MAAOH,EAAMI,QAAQC,QAAQC,MAC7BQ,MAAO,OACPmR,UAAW,OACXnC,SAAU,WACVpN,QAAS,OAGXwiB,SAAU,CACR/kB,MAAOH,EAAMI,QAAQ6K,MAAM3K,MAC3BQ,MAAO,OACPmR,UAAW,OACXnC,SAAU,WACVE,WAAY,IACZtN,QAAS,OAGXof,YAAa,CACXte,YAAa,aAmBb2hB,GAGF,SAAC/gB,EAA4BghB,GAC/B,IAAM/gB,EAAUlD,KADgC,EAElBmD,oBAAS,GAFS,mBAEzCqX,EAFyC,KAEhCC,EAFgC,OAGtBtX,mBAAS,CACjC+gB,UAAU,EACVC,UAAU,EACVC,iBAAiB,IAN6B,mBAGzCC,EAHyC,KAGlCC,EAHkC,KAShDC,8BAAoBN,GAAc,iBAAO,CACvCO,gBADuC,WAErCC,SAIJ,IAeMA,EAAY,WAChBH,EAAS,CAAEJ,UAAU,EAAOC,UAAU,EAAOC,iBAAiB,IAC9D3J,GAAW,GACXxX,EAAMyhB,kBAAoBzhB,EAAMyhB,kBAAiB,IAG7C3D,EAAa,uCAAG,WAAO/a,GAAP,eAAAkE,EAAA,sDACpBuQ,GAAW,GAEX9Q,MAAM3D,GACHY,MAAK,SAAC+d,GAAD,OAAmBA,EAAIhe,UAC5BC,MAAK,SAACD,GACL8b,EAAO,IAAImC,KAAK,CAACje,GAAO,CAAEuN,KAAM,eAChCjR,EAAM4hB,WAAWpC,EAAMqC,EAAYC,MAPnB,2CAAH,sDAWbC,EAAgB,uCAAG,WAAOzQ,GAAP,eAAArK,EAAA,sDACvBuQ,GAAW,GAEX9Q,MAAM4K,GACH3N,MAAK,SAAC+d,GAAD,OAAmBA,EAAIhe,UAC5BC,MAAK,SAACD,GAEL8b,EAAO,IAAImC,KAAK,CAACje,GAAO,CAAEuN,KAAM,eAEhCjR,EAAM4hB,WAAWpC,EAAMqC,EAAYC,MAThB,2CAAH,sDAuBhBD,EAAa,SAACxH,GACNA,EAAO2H,UAAU,cAC7BR,KAIIM,EAAa,WAEjBtK,GAAW,IAwFb,OApFID,EAEA,qBAAK3W,UAAWX,EAAQsO,SAAxB,SACE,cAACyK,GAAA,EAAD,MAGKoI,EAAMH,SAEb,cAAC,GAAD,CAAc5C,aAAcmD,EAAW1D,cAAeA,IAE/CsD,EAAMF,SAEb,cAAC,GAAD,CACEX,aAAciB,EACdlB,WAAYyB,EACZ7B,QAASlgB,EAAMkgB,UAGVkB,EAAMD,gBAEb,cAAC,GAAD,CACEZ,aAAciB,EACdlB,WA3CwB,SAAChP,GAG7BtR,EAAMiiB,gBAAgB3Q,GACtBkQ,KAwCItB,QAASlgB,EAAMkgB,UAKjB,8BACE,eAACgC,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAI/H,WAAS,EAA5B,UACE,cAAC8H,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAf,SACE,cAAC,GAAD,CACE1C,iBAAkBzf,EAAM4hB,WACxB3L,SAAUjW,EAAMiW,aAGpB,cAACiM,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAf,SAcE,cAAC,GAAD,CACEvB,aAtHW,WACrBS,EAAS,CAAEJ,UAAU,EAAMC,UAAU,EAAOC,iBAAiB,IAC7DnhB,EAAMyhB,kBAAoBzhB,EAAMyhB,kBAAiB,IAqHvCxL,SAAUjW,EAAMiW,aAIpB,eAAC1U,EAAA,EAAD,CACEN,QAAQ,UACRmhB,UAAU,MACVxhB,UAAWX,EAAQ6gB,SAHrB,gCAME,uBANF,wBAOE,uBAPF,wFASE,uBATF,6FA+BKuB,wBAAWtB,ICjPX,OAA0B,qDCA1B,OAA0B,gDCA1B,OAA0B,+CCA1B,OAA0B,+CCA1B,OAA0B,+CCA1B,OAA0B,iDCA1B,OAA0B,iDCUnChkB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRqW,GAAatW,IADN,IAEV0mB,UAAW,CACT5lB,MAAO,QAET6lB,UAAW,CACT7lB,MAAO,cAeA8lB,GAAe,SAACxiB,GAC3B,IAAMC,EAAUlD,KAMhB,OAAIiD,EAAMuX,QAEN,eAACgC,GAAA,EAAD,CACEtI,KAAMjR,EAAMyB,QAAU,SAAW,SACjCR,QAAQ,YACRlF,MAAM,UACNuc,GAAItY,EAAMsY,GAAKtY,EAAMsY,GAAK,YAC1B1X,UAAWI,IACTf,EAAQqS,YACRtS,EAAMsiB,WAAariB,EAAQqiB,WAC1BtiB,EAAMsiB,WAAariB,EAAQsiB,WAE9BtM,UAAU,EAVZ,UAYE,cAAC+C,GAAA,EAAD,CACEsD,KAAM,GACNvgB,MAAM,UACNihB,MAAO,CAAE5d,YAAa,SAf1B,gBAsBA,cAACma,GAAA,EAAD,CACEtI,KAAMjR,EAAMyB,QAAU,SAAW,SACjCR,QAAQ,YACRlF,MAAM,UACNuc,GAAItY,EAAMsY,GAAKtY,EAAMsY,GAAK,YAC1B1X,UAAWI,IACThB,EAAMyiB,cAAgBxiB,EAAQoS,YAC7BrS,EAAMyiB,cAAgBxiB,EAAQkS,QAC/BnS,EAAMsiB,WAAariB,EAAQqiB,WAC1BtiB,EAAMsiB,WAAariB,EAAQsiB,WAE9BtM,WAAUjW,EAAMiW,SAEhBxU,QAzCe,WACnBzB,EAAMyB,SAAWzB,EAAMyB,WA2BrB,SAeGzB,EAAMnB,MAAQmB,EAAMnB,MAAQ,YC/BxB6jB,GAAiB,SAACjG,GAC7B,IAAMkG,EAR2B,SAAClG,GAClC,IAAMlM,EAAI4M,KAAKyF,IAAInG,EAAKrJ,KAAK7C,EAAIkM,EAAK1J,MAAMxC,GACtCgM,EAAIY,KAAKyF,IAAInG,EAAKrJ,KAAKmJ,EAAIE,EAAK1J,MAAMwJ,GAE5C,OAAOY,KAAK0F,KAAKtS,EAAIA,EAAIgM,EAAIA,GAITuG,CAAoBrG,GACxC,OAAOkG,EAAcA,EAAc,GAGxBI,GAAqB,SAACtG,GACjC,IAAMuG,EAAKvG,EAAKrJ,KAAK7C,EACf0S,EAAKxG,EAAKrJ,KAAKmJ,EACf2G,EAAKzG,EAAK1J,MAAMxC,EAChB4S,EAAK1G,EAAK1J,MAAMwJ,EAWtB,MAAO,CACLhM,GAVUyS,EAAKE,GAAM,GAGXD,EAAKE,GAAM,EAQrB5G,GAVU0G,EAAKE,GAAM,GACXH,EAAKE,GAAM,I,qBCtDZE,GAAkB,SAC7Bjf,EACAkf,EACAC,GAQA,OANKA,GAAiC,KAAjBA,EAGnBnf,EAAOkf,GAAaC,SAFbnf,EAAOkf,GAKTlf,GAGHpH,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACR2R,GAAa5R,IACbD,EAAWC,IAFJ,IAGV8hB,YAAa,CACXte,YAAa,aASNmkB,GAAe,SAACvjB,GAC3B,IAAMC,EAAUlD,KACZymB,EAAoC,GAYxC,OAXAC,OAAOC,KAAK1jB,EAAMmE,QAAQwf,SAAQ,SAAChc,GAC7B3H,EAAMmE,OAAOwD,IACf6b,EAAc/K,KACZ,iCACGzY,EAAMmE,OAAOwD,GACd,yBAFS,iBAAmBA,OAQhC8b,OAAOC,KAAK1jB,EAAMmE,QAAQkF,OAAS,EAEnC,qBAAKzI,UAAWI,IAAWf,EAAQwN,OAAQxN,EAAQ4G,OAAnD,SACE,sBAAKjG,UAAWX,EAAQ2N,IAAxB,UACE,cAAC,KAAD,CACEhN,UAAWI,IAAWf,EAAQ1D,YAAa0D,EAAQyd,eAErD,sBAAM9c,UAAWX,EAAQ0K,QAAzB,SAAmC6Y,SAKlC,MCcLI,GAGF,SAAC5jB,EAAoCghB,GAAkB,IAAD,EAC1B9gB,oBAAS,GADiB,mBACjDqX,EADiD,KACxCC,EADwC,OAEpBtX,oBAAS,GAFW,mBAEjD2jB,EAFiD,KAErCC,EAFqC,OAG9B5jB,mBAAS,IAHqB,mBAGjDmC,EAHiD,KAG1C0hB,EAH0C,OAI9B7jB,qBAJ8B,mBAIjDyf,EAJiD,KAI1CqE,EAJ0C,OAKlB9jB,mBACpC,MANsD,mBAKjD+jB,EALiD,KAKpCC,EALoC,OAQ7BhkB,mBAAiCF,EAAMmE,QARV,mBAQzCggB,GARyC,aAStBjkB,mBAAS,GATa,mBASjDkkB,EATiD,KAStCC,EATsC,KAUlD3I,EAAMvH,iBAAyB,MACPzK,aAC5B,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,cAAcH,cACzD1H,OAOFiY,8BAAoBN,GAAc,iBAAO,CACvCsD,wBADuC,WALnC5I,EAAI/G,SACN+G,EAAI/G,QAAQ4M,kBAOZC,SAIJ,IAAMA,EAAY,WAChBwC,OAAS9c,GACT4c,GAAc,GACdtM,GAAW,GACX0M,EAAe,MACfG,EAAa,GACbN,EAAS,IAETI,EAAS,IACTnkB,EAAMyhB,kBAAoBzhB,EAAMyhB,kBAAiB,GACjDzhB,EAAMukB,gBAAkBvkB,EAAMukB,gBAAe,IAiBzCC,EAAoB,SAACniB,EAAemd,GAExCuE,EAAS1hB,GACTsZ,KAAU6D,EAAMqC,EAAY,CAAE4C,aAAa,EAAMpK,QAAQ,KAIrDwH,EAAa,SAACxH,GAClB,GAAIA,aAAkBqK,kBAAmB,CACvC,IAAMxP,EAAMmF,EAAO2H,UAAU,cAC7BgC,EAAS,CAAEW,IAAKzP,EAAKmF,OAAQA,IAC7Bra,EAAMukB,gBAAkBvkB,EAAMukB,gBAAe,GAC7C/M,GAAW,GACXsM,GAAc,KAKZhC,EAAa,SAACjb,GAClB2Q,GAAW,GAEX2M,EAAS,CAAExE,MAAO,uBAClBxc,QAAQC,IAAIyD,IAcR+d,EAAY,WAChB,GAAIX,EAAa,CACf,IAIQxH,EAAOwH,EACPY,EAAqB,CACzBpI,KAAMA,EACNJ,OAAQ0G,GAAmBtG,GAC3BqI,OAAQpC,GAAejG,IAGnBvH,EAAMyK,GF7KW,SAACzK,EAAwB2P,GACtD,IAAIxK,EAA4B0K,SAASC,cAAc,UACnDF,EAAS,EAETD,EAAOC,OACTA,EAASD,EAAOC,OACPD,EAAOvI,OAChBwI,EAASD,EAAOvI,KAAO,GAEzBjC,EAAO3d,MAAiB,EAATooB,EACfzK,EAAO1d,OAAkB,EAATmoB,EAEhB,IAAIG,EAAM5K,EAAO6K,WAAW,MAC5B,GAAID,EAAK,CACPA,EAAIE,UACFjQ,EACA2P,EAAOxI,OAAO9L,EAAIuU,EAClBD,EAAOxI,OAAOE,EAAIuI,EACT,EAATA,EACS,EAATA,EACA,EACA,EACS,EAATA,EACS,EAATA,GAEF,IAAInF,EAAQ,IAAI/D,MAGhB,OAFA+D,EAAMrH,GAAK,MACXqH,EAAMre,IAAM+Y,EAAO2H,YACZrC,EAET,OAAO,KE+IoByF,CAAgBzF,EAAMtF,OAAQwK,GAG7C/L,EAAgC,CACpCzH,YAAagU,KAAKC,MAAMC,WACxBljB,MAAOA,EACP8Y,SAAUjG,GAAOA,EAAI5T,IACrBmb,KAAMA,EACNE,KAAM3c,EAAMwlB,cAAcpB,GAAWzH,KACrCD,MAAO1c,EAAMwlB,cAAcpB,GAAW1H,MACtCJ,KAAMtc,EAAMwlB,cAAcpB,GAAW9H,KACrCmJ,UAAWzlB,EAAMylB,WAEfzlB,EAAM0lB,UACR1lB,EAAM0lB,UAAU5M,EAAW0I,GAE3BxhB,EAAM2lB,cAAgB3lB,EAAM2lB,aAAa7M,QAS7C8M,EAAc,qBAKZ7I,EAAqB,SAACN,EAA0BpM,GACpD6T,EAAezH,GACf4H,EAAahU,GACbrQ,EAAMqkB,cAAgBrkB,EAAMqkB,aAAahU,IAIrCuV,EAAgB,SAACC,GACrB1B,EAAS,CAAExE,MAAOkG,KA6BhBC,EAAyB,GA8B7B,OA7BI9lB,EAAMylB,UAERK,EAAU,CAACC,GAAQC,GAAQC,GAAQC,GAAQC,GAAQC,GAAQC,IAGvDrmB,EAAMsmB,mBACRtmB,EAAMsmB,kBAAkBjc,KAAI,SAACyO,GAC3B,GAAIA,EAAUX,MAAM,GAAG7G,OACrB,OAAOwU,EAAQrN,KAAKK,EAAUX,MAAM,GAAG7G,WAqB3CiG,EACK,cAACyB,GAAA,EAAD,IACE2G,EAEL3f,EAAMumB,eAEN,eAACrE,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAGC,GAAI,GAA9B,SACGzmB,EAAMwlB,cACL,cAAC,GAAD,CACErN,MAAOnY,EAAMwlB,cACbrK,SAAUwE,EAAMgF,IAChB1iB,KAAMjC,EAAM0mB,YACZ3J,mBAAoBA,IAGtB,cAAC/D,GAAA,EAAD,MAGJ,cAACkJ,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAGC,GAAI,GAA9B,SACE,cAAC,GAAD,CACEtiB,OACEsf,OAAOC,KAAK1jB,EAAMmE,QAAQsM,QAAQ,UAAY,EAC1CzQ,EAAMmE,OACN,OAIV,eAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACoQ,WAAS,EAApB,UACE,cAAC,GAAD,CAAc3Y,QAAS+f,IACvB,cAAC,GAAD,CACE3iB,MAAM,aACN4C,QAASmjB,EACT3O,SA7EU,WACpB,IAAM0Q,EAAYlD,OAAOC,KAAK1jB,EAAMmE,QAEpC,QAAyB,IAArBwiB,EAAUtd,QAAgBsd,EAAUlW,QAAQ,WAAa,IAGlC,IAArBkW,EAAUtd,OAuEIud,WAOhB,eAACC,GAAA,EAAD,CACEC,sBAAoB,EACpBC,sBAAoB,EACpB5lB,KAAM0iB,EACNmD,QAASxF,EACTc,WAAS,EACThP,SAAS,KANX,UAQE,cAAC2T,GAAA,EAAD,UACGjnB,EAAMwlB,cACL,cAAC,GAAD,CACErN,MAAOnY,EAAMwlB,cACbrK,SAAUwE,EAAMgF,IAChB1iB,KAAMjC,EAAM0mB,YACZ3J,mBAAoBA,IAGtB,cAAC/D,GAAA,EAAD,MAGJ,cAACkO,GAAA,EAAD,UACE,eAAChF,GAAA,EAAD,CAAM9H,WAAS,EAAf,UACE,cAAC8H,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQnE,EAAMmE,WAE9B,eAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACoQ,WAAS,EAAC/b,WAAW,WAAW8oB,QAAQ,WAAnD,UACE,cAAC,GAAD,CAAc1lB,QAAS+f,IACvB,cAAC,GAAD,CACE/f,QAASmjB,EACT3O,SAAUwN,OAAOC,KAAK1jB,EAAMmE,QAAQkF,OAAS,eAUzD,cAAC,GAAD,CACEuc,cAAeA,EACfhE,WAhPmB,SAACpC,GACxBhI,GAAW,GACXoO,EAAc,IACdzB,EAAS,IACTnkB,EAAM4hB,WACJpC,GACA,SAACnd,GAAD,OAAmBmiB,EAAkBniB,EAAOmd,KAC5CsC,IA0OE5B,QAAS4F,EACT7P,SAAUjW,EAAMiW,SAChBgM,gBA3I2B,SAAC3Q,GAChC,GAAItR,EAAMsmB,kBAAmB,CAC3B,IAAIjW,EAAQrQ,EAAMsmB,kBAAkBhW,WAClC,SAACwI,GAAD,OAAeA,EAAUX,MAAM,GAAG7G,SAAWA,KAE/CtR,EAAM2lB,cAAgB3lB,EAAM2lB,aAAa3lB,EAAMsmB,kBAAkBjW,IACjEmR,MAsIEiE,UAAWzlB,EAAMylB,UACjBhE,iBAAkBzhB,EAAMyhB,iBACxB/F,IAAKA,KAME2G,wBAAWuB,IC1VpB7mB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRgP,GAAYjP,IACZD,EAAWC,IACXsW,GAAatW,IAHN,IAIViD,MAAO,CACL+M,WAAY,KAGdiG,WAAY,CACV5S,WAAY,QAGdye,YAAa,CACXte,YAAa,QAEfuL,QAAS,CACP1L,WAAY,OACZyM,SAAU,WACV5M,WAAY,KAGdsoB,WAAY,CACVhqB,gBAAiBxB,EAAMI,QAAQ+T,uBAC/BpT,OAAQ,QACR2Q,aAAc,OACd5Q,MAAO,OAGT2qB,YAAa,CACXtrB,MAAO,WAITurB,SAAU,CACRvrB,MAAO,iBAeAwrB,GAAe,SAACvnB,GAC3B,IAAMC,EAAUlD,KAD4C,EAEtBmD,oBAAS,GAFa,mBAErDsnB,EAFqD,KAExCjD,EAFwC,OAG1BrkB,mBAAS,GAHiB,mBAGrDkkB,EAHqD,KAG1CC,EAH0C,OAIhCnkB,mBAAiC,IAJD,mBAIrDiE,EAJqD,KAI7CsjB,EAJ6C,OAKhBvnB,oBAAS,GALO,gCAOlCA,mBAAS,IAPyB,mBAOrDwnB,EAPqD,KAO9CC,EAP8C,KAS5D7P,qBAAU,WACJ4P,EACFE,IAEAD,EAAS,KAEV,CAAC3nB,EAAMmY,MAAOiM,EAAWpkB,EAAM6nB,kBAElC,IAcMC,EAAmB,SAACjhB,GACxB,IAAM1C,EAAS,GACmB,KAA9BnE,EAAM6nB,gBAAgB/W,IACxB2W,EACErE,GACEjf,EACA,QACAsf,OAAOC,KAAK7c,GAAOwC,OAAS,EACxB,+CACA,KAIRoe,EACErE,GACEjf,EACA,QACAsf,OAAOC,KAAK7c,GAAOwC,OAAS,EACxB,qCACA,KAIVoe,EAAUtjB,IAWN4jB,EACJ,gCACE,cAAC,KAAD,CAAWnnB,UAAWI,IAAWf,EAAQonB,aAAc3b,SAAS,UAChE,cAACnK,EAAA,EAAD,CACEN,QAAQ,QACR/D,QAAQ,SACR0D,UAAWX,EAAQ4R,WAHrB,uBAUEmW,EAAiB,SAACnC,GACtB,OACE,gCACE,cAAC,KAAD,CAAWjlB,UAAWI,IAAWf,EAAQqnB,UAAW5b,SAAS,UAC7D,cAACnK,EAAA,EAAD,CACEN,QAAQ,QACR/D,QAAQ,SACR0D,UAAWX,EAAQ4R,WAHrB,SAKGgU,QAaHoC,EAAa,SAACC,GAClB,OAAO/K,KAAKgL,MAAiC,KAA1BD,EAAQE,OAAOC,UAAkB,KAGhDC,EAAmB,SAAClM,GACxB,OAAOA,GAAQA,EAAKmM,cAAcC,uBAAyB,KAGvDC,EAAsB,SAACrM,GAC3B,OAAOA,GAAQA,EAAKmM,cAAcG,0BAA4B,KAG1DC,EAAsB,SAACvM,GAC3B,OAAOA,GAAQA,EAAKmM,cAAcK,0BAA4B,KAG1DC,EAAkB,SAACzM,GAGvB,GAFcA,EAAKQ,QAAUR,EAAKQ,OAAOC,YAAc,GAGrD,GAAIT,EAAKQ,OAAOjM,YAAc3Q,EAAM6nB,gBAAgB/W,IAClD,OAAO,OAGT,GAAI9Q,EAAM6nB,gBAAgB9W,WAAW1H,OAAS,EAC5C,OAAO,EAIX,OAAO,GAGHue,EAAe,WACnBzkB,QAAQC,IAAI,iBACZ,IAAMe,EAAS,GACY,IAAvBnE,EAAMmY,MAAM9O,OACdoe,EACErE,GACEjf,EACA,QACAnE,EAAMmY,MAAM9O,OAAS,EAAI,GAAK,wBAKlCoe,EACErE,GACEjf,EACA,QACAnE,EAAMmY,MAAM9O,OAAS,EAAI,GAAK,qBAIlCoe,EACErE,GACEjf,EACA,UACAmkB,EAAiBtoB,EAAMmY,MAAMiM,IAAc,GAAK,kBAGpDqD,EACErE,GACEjf,EACA,aACAskB,EAAoBzoB,EAAMmY,MAAMiM,IAAc,GAAK,qBAIvDhB,GACEjf,EACA,aACAwkB,EAAoB3oB,EAAMmY,MAAMiM,IAC5B,GACA,gCAGNhB,GACEjf,EACA,SACA0kB,EAAgB7oB,EAAMmY,MAAMiM,IAAc,GAAK,gBAGjDqD,EAAUtjB,KAId,OACE,eAAC+d,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAvB,SACE,cAAC,GAAD,CACEf,WAAW,EACXD,cAAexlB,EAAMmY,MACrByJ,WAAY5hB,EAAM4hB,WAClB2E,gBAAc,EACdlC,aArGiB,SAAChU,GACxBgU,EAAahU,IAqGPkU,eAnGqB,SAAC7jB,GAC5B6jB,EAAe7jB,IAmGTglB,UAnLc,SACpB5M,EACAxS,EACAC,GAEAvG,EAAM8oB,uBACJ,CAAChQ,IACD,WACExS,GAAYA,MAEdwhB,IA0KI3jB,OAAQA,EACRuiB,YAAa1mB,EAAM6nB,gBAAgB5lB,SAItCulB,GAAexnB,EAAMmY,MAAM9O,OAAS,GACnC,eAAC6Y,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAGpM,WAAS,EAAC/a,QAAS,EAA7C,UACE,eAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAvB,UACE,cAACjlB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,uCAOA,cAAC0C,EAAA,EAAD,CACEN,QAAQ,QACR/D,QAAQ,SACR0D,UAAWX,EAAQ4R,WAHrB,SAKG7R,EAAMmY,MAAM9O,YAIjB,eAAC6Y,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,4BAOA,eAACqjB,GAAA,EAAD,CAAM9H,WAAS,EAAf,UACE,cAAC8H,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,eAAC5gB,EAAA,EAAD,CACEN,QAAQ,QACR/D,QAAQ,SACR0D,UAAWX,EAAQ4R,WAHrB,iCAKuB,IACpBoW,EAAWjoB,EAAMmY,MAAMiM,GAAW3H,KAAKrJ,KAAK7C,GAN/C,IAMoD,IACjD0X,EAAWjoB,EAAMmY,MAAMiM,GAAW3H,KAAKrJ,KAAKmJ,QAGjD,cAAC2F,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,eAAC5gB,EAAA,EAAD,CACEN,QAAQ,QACR/D,QAAQ,SACR0D,UAAWX,EAAQ4R,WAHrB,kCAKwB,IACrBoW,EAAWjoB,EAAMmY,MAAMiM,GAAW3H,KAAK1J,MAAMxC,GANhD,IAMqD,IAClD0X,EAAWjoB,EAAMmY,MAAMiM,GAAW3H,KAAK1J,MAAMwJ,cAOtD,eAAC2F,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,8BAOC4pB,EAAoBzoB,EAAMmY,MAAMiM,IAC7B2D,EACAC,EAAe,sBAIrB,eAAC9F,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,+BAOC8pB,EAAoB3oB,EAAMmY,MAAMiM,IAC7B2D,EACAC,EAAe,mCAGrB,eAAC9F,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,4BAOCypB,EAAiBtoB,EAAMmY,MAAMiM,IAC1B2D,EACAC,EAAe,gCAGrB,eAAC9F,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,2BAOCgqB,EAAgB7oB,EAAMmY,MAAMiM,IACzB2D,EACAC,EAAe,iDAItBR,GAAsC,IAAvBxnB,EAAMmY,MAAM9O,SAC5B,cAAC6Y,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,IAExBxmB,EAAM+oB,oBACL,cAAC7G,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAGpM,WAAS,EAAC+M,QAAQ,WAA5C,SACE,eAACjF,GAAA,EAAD,CAAMlY,MAAI,EAAV,UACE,eAACuP,GAAA,EAAD,CACE3Y,UAAWI,IAAWf,EAAQkS,QAASlS,EAAQyd,aAC/Cjc,QAjQkB,WAC5BzB,EAAMgpB,uBAAyBhpB,EAAMgpB,uBAAsB,IA8PnD,UAIG,IACD,cAAC,KAAD,IALF,uBAQA,eAACzP,GAAA,EAAD,CACE3Y,UAAWI,IAAWf,EAAQkS,SAC9B1Q,QA7QoB,WAC9BzB,EAAMipB,oBAAsBjpB,EAAMipB,oBAAmB,IA0Q7C,UAIG,IACD,cAAC,KAAD,IALF,6BCtYNhsB,GAAOiJ,EAOA0b,GAAa,SACxBpC,EACA0J,EACA5iB,EACAC,GAJwB,OAKrB,SAACqK,GACJ,IAAIpK,EAAW,IAAI2iB,SAEnB,OADA3iB,EAAS4iB,OAAO,QAAS5J,GAClB9Y,MAAMzJ,GAAO,iB7CJE,SACtB8F,GAEiB,IADjBN,EACgB,wDACZE,EAAuB,CACzBC,OAAQ,OACRC,KAAM,OACNG,KAAMD,EACNL,QAASN,KAOX,OAJIK,IACFE,EAAO,YAAkB,WAGpBA,E6CX+B0mB,CAAS7iB,IAC5C7C,KAAKJ,GACLI,MACC,SAACtB,GACK6mB,GACFtY,EAAS,CAAEK,KAAMxL,GAAYpD,MAAOA,IAEtCiE,GAAYA,EAASjE,MAEvB,SAACwE,GACCN,GAAYA,EAASM,QAMhByiB,GAAc,SACzBjnB,EACAiE,EACAC,GAHyB,OAItB,SAACqK,GACJ,OAAOlK,MAAMzJ,GAAO,kBAAoBoF,EAAQ,kBAAmBE,KAChEoB,KAAKJ,GACLI,MACC,SAACqD,GACC4J,EAAS,CAAEK,KAAMvL,GAAc8f,cAAexe,IAC9CV,GAAYA,EAASU,MAEvB,SAACH,GACCN,GAAYA,EAASM,QCrBvB9J,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRyO,GAAc1O,IACdiP,GAAYjP,IACZsW,GAAatW,IAHN,IAKV2tB,cAAe,CACbnsB,gBAAiBxB,EAAMI,QAAQC,QAAQC,MACvCgP,OAAQ,kBACRoC,aAAc,OACdvR,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQC,MAAO,SAAW,EACpD,QACA,QACNqM,YAAa,QAGf6e,WAAY,CACVhqB,gBAAiBxB,EAAMI,QAAQ+T,uBAC/BpT,OAAQ,OACR2Q,aAAc,OACdnQ,OAAQ,aAGVqsB,eAAgB,CACdlc,aAAc,OACd3Q,OAAQ,cASD8sB,GAAoB,SAACzpB,GAAuC,IAAD,EACxCE,oBAAS,GAD+B,mBAEhEwpB,GAFgE,UAElDhgB,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,SAIjEoH,GAHcxH,aAClB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAASJ,cAEvBlQ,aACpB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,kBAGvCiH,EAAQzO,aACZ,SAACC,GAAD,OAAqBA,EAAMC,OAAO+f,WAAWnE,iBAGzCvlB,EAAUlD,KACV6T,EAAWoH,cACjB8B,GAAgB,OAAC4P,QAAD,IAACA,OAAD,EAACA,EAAapR,IAU9B,IA6DMsR,EAAa,WACjBC,EAAqB3Y,EAAcJ,MAmB/B+Y,EAAuB,SAAClZ,GAC5B,IAAII,EAAmC,GAIvC,OAHAL,GAAmBC,GAAW,SAACE,GAC7BE,EAAaF,EAAQE,aADvBL,CAEGE,GACIG,GAGT,OAAKG,EAID,sBAAKtQ,UAAWX,EAAQ+K,SAAxB,UACE,cAACzJ,EAAA,EAAD,CAAYN,QAAQ,KAAKL,UAAWX,EAAQspB,cAA5C,6BAGA,qBACE3oB,UAAWI,IAAWf,EAAQmL,gBAAiBnL,EAAQmnB,YADzD,SAIE,cAAC,GAAD,CACEvW,QAASK,EACTiI,OAAQ,GACRK,YAvCU,SAClBsQ,EACAxjB,EACAC,IAhEiC,SACjCkL,EACAC,EACApL,EACAC,GAEAmjB,GACElY,GACEN,EAAcJ,IACdI,EAAcjP,KACdwP,EACAC,EACAgY,EAAYpR,GACZhS,EACAC,EAPFiL,CAQEZ,GAmDJmZ,CACE,GACAD,GACA,WACEF,IACAtjB,GAAYA,MAEdC,QA+BE,cAAChF,EAAA,EAAD,CAAYN,QAAQ,KAAKL,UAAWX,EAAQspB,cAA5C,+BAGA,qBACE3oB,UAAWI,IACTf,EAAQmL,gBACRnL,EAAQ0K,QACR1K,EAAQupB,gBAJZ,SAOE,cAAC,GAAD,CACErR,MAAOA,EACPyJ,WAlGe,SACvBpC,EACAlZ,EACAC,GAEAqb,GACEpC,GACA,GACA,SAACnd,GAAD,OACEinB,GACEjnB,GACA,SAAC2E,GACCV,EAASjE,EAAO2E,KAElBT,EALF+iB,CAME1Y,KACJrK,EAXFqb,CAYEhR,IAkFMkY,uBA/EqB,SAC7BrX,EACAnL,EACAC,GAEAiL,GACEN,EAAcJ,IACdI,EAAcjP,KACdwP,EACA,QACAvK,GACA,WACE0iB,IACAtjB,GAAYA,MAEdC,EAVFiL,CAWEZ,IAgEMiX,gBAAiB3W,SAhClB,cAAC8H,GAAA,EAAD,KC7KEgR,GAAkB,SAAChqB,GAc9B,OAbA8X,qBAAU,WACR,GAAI9X,EAAMiqB,UAAW,CAEnB,IAAIC,EAAoC,IAAlBlqB,EAAMiqB,UAE5BrV,YAAW,WACTzU,OAAOiH,SAASC,KAAO,aACtB6iB,QAEH/pB,OAAOiH,SAASC,KAAO,aAIpB,MCMI8iB,GAAW,SAACnqB,GACvB,IAAM6J,EAAOH,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,QACrDugB,EAAYvgB,EAAKC,MAAQD,EAAKC,KAAKI,MAEnC0G,EAAWoH,cAEbqS,GAAe,EAEnBvS,qBAAU,YACJjO,GAASA,EAAKygB,cAAiBzgB,EAAKhC,M5C0JhB,eAC1B0iB,IAD0B,yDAE1BjkB,EAF0B,uCAG1BC,EAH0B,8CAIvB,SAACqK,GAEJ,OADAA,EAAS,CAAEK,KAAMnM,GAAmBpE,QAAQ,IACrCgG,MAAM,GAAD,OAAIzJ,GAAJ,8BAAsCsF,KAC/CoB,KAAKJ,GACLI,MACC,SAACG,GACKymB,IACF3Z,EAAS,CAAEK,KAAMlM,GAAUylB,eAAe,IAC1C5Z,EAAS,CAAEK,KAAMnM,GAAmBpE,QAAQ,IAC5CkQ,EAAS,CAAEK,KAAMjM,GAAU6E,KAAM/F,KAEnCwC,GAAYA,EAASxC,MAEvB,SAACK,GACKomB,IACF3Z,EAAS,CAAEK,KAAMlM,GAAU0lB,gBAAgB,IAC3C7Z,EAAS,CAAEK,KAAMnM,GAAmBpE,QAAQ,KAE9C6F,GAAYA,EAASpC,O4C/KvBumB,EAAa,EAAbA,CAAmB9Z,KAEpB,IAEH,IAMI+Z,GAAiB,EACjB9gB,GAAsB,OAAdA,EAAKhC,OACG,IAAdgC,EAAKhC,OACP8iB,GAAiB,EACb3qB,EAAM4qB,aA1Ca,SAC3BC,EACAC,GAEA,IAAKD,EACH,OAAO,EAEP,GAAIC,EACF,IAAK,IAAI7Y,EAAI,EAAGA,EAAI6Y,EAAezhB,OAAQ4I,IACzC,GAAI4Y,IAAsBC,EAAe7Y,GACvC,OAAO,EAKf,OAAO,EAkBA8Y,CAUqB/qB,EAAM4qB,WAVFR,KAC5BC,GAAe,KAcnB,IAAIW,GAAkB,EAGtB,OAFIL,GAAkBN,IAAcW,GAAkB,GAElDA,EACKhrB,EAAM+B,UAEC,IAAd8H,EAAKhC,MACiB,OAAtBgC,EAAKygB,cACLzgB,EAAKygB,cACS,OAAdF,EAEO,KAEA,cAAC,GAAD,KC/CLrtB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRyO,GAAc1O,IACdiP,GAAYjP,IACZsW,GAAatW,IAHN,IAIV8hB,YAAa,CACXte,YAAa,aAKN6rB,GAAQ,WACnB,IAAMhrB,EAAUlD,KAMVmU,GAHiBxH,aACrB,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QAEnBJ,aACpB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,kBAGzCga,EAA4C,GAChDha,EAAcH,WAAW1G,KAAI,SAAC8gB,GAC5B,GAAIA,EAAc1F,UAChB,OAAOyF,EAAoBzS,KAAK0S,MAInBnT,cAyBjB,OACE,cAAC,GAAD,CAAU4S,WAAW,QAArB,SACE,sBAAKhqB,UAAWX,EAAQhD,KAAxB,UACE,cAAC,GAAD,CACE4B,MAAM,SACN+B,UAAWX,EAAQsK,UACnBwH,QAAS,CACP,cAACwH,GAAA,EAAD,CACEtI,KAAK,SACLhQ,QAAQ,YACRlF,MAAM,UACN6E,UAAWI,IAAWf,EAAQkS,QAASlS,EAAQyd,aAC/Cjc,QAAS,kBpCsIrBkP,EoCtI6CO,EAAcJ,IpC0I3D3N,QAAQC,IAAI,qBACLsD,MAAMzJ,GAAO,oBAAsB0T,EAAWpO,KAClDoB,MAAK,SAACH,GAAD,OAAwBA,EAASE,UACtCC,MACC,SAACqD,GAAY,IAAD,EACJ2d,EAAMxkB,OAAOyD,IAAIC,gBAAgBmD,GACjCokB,EAAOrG,SAASC,cAAc,KACpCoG,EAAK/jB,KAAOsd,EACZyG,EAAKC,aACH,WADF,sBAEgB,IAAIhG,MAAOiG,WAF3B,QAGI,KAAM,IAAIjG,MAAOkG,YACjBC,OAAO,IAJX,QAIgB,IAAInG,MAAOoG,cAJ3B,SAMA1G,SAAS/hB,KAAK0oB,YAAYN,GAC1BA,EAAKO,QACL,UAAAP,EAAKQ,kBAAL,SAAiBC,YAAYT,GAC7B9kB,GAAYA,EAASU,MAEvB,WACE7D,QAAQC,IAAI,SACZmD,GAAYA,OA1Ba,IAC/BoK,EACArK,EACAC,GoC7IU,yCAYJ,cAAC,GAAD,UClFFtJ,GAAOiJ,EAiEA4lB,GAAY,SACvBnb,EACAoG,EACAzQ,EACAC,GAJuB,OAKpB,SAACqK,GAEJ,OADAA,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IACrCgG,MACLzJ,GAAO,gBAAkB0T,EAAY,sBAAwBoG,EAC7DxU,KAECoB,KAAKJ,GACLI,MACC,SAACqD,GACC,IAAI+kB,EAAqB,GAEzB/kB,EAAOqD,KAAI,SAAC2hB,GACV,IAAInT,EAA+B,GACnCmT,EAASlC,aAAanG,SAAQ,SAACsI,GAC7B,OAAQpT,EAAa,uBAChBA,GADgB,aAEhB4K,OAAOyI,OAAOD,QAGrB9oB,QAAQC,IAAIyV,GAEZ,IAAMsT,EAAa,CACjBC,OAAQJ,EAASI,OACjBC,SAAUL,EAASK,SACnBC,KAAMN,EAASM,KACfxC,aAAcjR,GAGhB,OAAQkT,EAAK,uBAAOA,GAAP,CAAcI,OAG7Bvb,EAAS,CAAEK,KAAMjL,GAAkB+Q,MAAOA,IAC1CnG,EAAS,CAAEK,KAAMhL,GAAoB8lB,MAAOA,IAC5Cnb,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IAC5C4F,GAAYA,EAASylB,MAEvB,SAACllB,GACC+J,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IAC5C6F,GAAYA,EAASM,Q,wCC1GvB9J,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX0wB,UAAW,CACTxwB,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQI,KAAM,SAAW,EACnD,QACA,SAGRwC,MAAO,CACLqN,KAAM,GAERsgB,YAAa,CACXlhB,UAAW,QAGbmhB,cAAe,CACbrvB,gBAAiBxB,EAAMI,QAAQ+C,OAAO4O,YAatC+e,GAAe,SAAC1sB,GACpB,IAAMC,EAAUlD,KAEhB,OACE,cAAC4vB,GAAA,EAAD,CAAQpvB,SAAS,WAAWxB,MAAM,UAAlC,SACE,eAAC6wB,GAAA,EAAD,WACE,cAACrrB,EAAA,EAAD,CACEN,QAAQ,KACRL,UAAWI,IAAWf,EAAQpB,MAAOoB,EAAQssB,WAF/C,SAIGvsB,EAAMnB,SAEPmB,EAAM6sB,cACN,cAACrrB,EAAA,EAAD,CACEZ,UAAWX,EAAQssB,UACnB9qB,QAASzB,EAAMgnB,QACf8F,aAAW,QAHb,SAKE,cAAC,KAAD,YAmBCC,GAAY,SAAC/sB,GACxB,IAAMC,EAAUlD,KAEViwB,EAAmB,WACvBhtB,EAAMitB,qBAGR,OACE,eAACpG,GAAA,EAAD,CACEC,sBAAoB,EACpB3lB,KAAMnB,EAAMmB,KACZ6lB,QAASgG,EACT1K,WAAWtiB,EAAMktB,aACjBC,aAAcntB,EAAMmtB,aACpBC,cACEptB,EAAMqtB,aAAe,CAAEptB,QAAS,CAAEhD,KAAMgD,EAAQwsB,gBAAoB,GAEtEnZ,SAAS,KATX,UAWE,cAAC,GAAD,CACE0T,QAASgG,EACTnuB,MAAOmB,EAAMnB,MACbguB,aAAc7sB,EAAMstB,cAEtB,cAACrG,GAAA,EAAD,CACErmB,UAAU,WACVX,QAAS,CAAEhD,KAAMgD,EAAQusB,aAF3B,SAIGxsB,EAAMutB,W,qGCrGTxwB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,eACRsQ,GAAYvQ,QAwBN4xB,GAAkB,SAACxtB,GAC9B,IAAMC,EAAUlD,KAGhB,OACE,eAAC0wB,GAAA,EAAD,CAAanL,WAAW,EAAMrM,SAAUjW,EAAMkW,WAA9C,UACmB,KAAhBlW,EAAM0H,OACL,cAACgmB,GAAA,EAAD,CACE1O,QAAShf,EAAMiC,KACf0rB,SAAU3tB,EAAM4tB,WAChB/mB,MAAO7G,EAAM6V,UAEb5V,QAAS,CACPhD,KAAMgD,EAAQyH,MACdmmB,YAAa5tB,EAAQmM,iBACrB0hB,QAAS7tB,EAAQqM,aACjBzF,MAAO5G,EAAQsM,WACf0J,SAAUhW,EAAQuM,eAVtB,SAaGxM,EAAM0H,QAIX,cAACqmB,GAAA,EAAD,CACEzV,GAAItY,EAAMiC,KACVA,KAAMjC,EAAMiC,KACZ0E,MAAO3G,EAAM2G,MAEb1G,QAAS,CACPhD,KAAMgD,EAAQyM,UACdshB,MAAO/tB,EAAQwM,UACfK,UAAW7M,EAAQ6M,UACnBjG,MAAO5G,EAAQ4M,WACfoJ,SAAUhW,EAAQ2M,eAEpB/F,MAAO7G,EAAM6V,UACbC,SAlCe,SAACrD,GAAD,OAA0BzS,EAAM8V,SAASrD,IAmCxDwb,aAAcjuB,EAAMiuB,aACpBhY,SAAUjW,EAAMkW,WAChBjF,KAAMjR,EAAMkuB,UACZC,aAAcnuB,EAAM2G,MACpBgnB,SAAU3tB,EAAM4tB,WAChBQ,UAAWpuB,EAAMouB,gBClEnBrxB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRF,EAAWC,IADJ,IAEVyyB,YAAa,CACX3xB,MAAO,OACPC,OAAQ,cAWD2xB,GAAkB,SAACtuB,GAC9B,IAAMC,EAAUlD,KADiD,EAE7BmD,mBAASF,EAAMuuB,aAAe,IAFD,mBAE1DC,EAF0D,KAE9CC,EAF8C,OAGnCvuB,oBAAS,GAH0B,mBAG1DqX,EAH0D,UASjE,OACE,cAAC,WAAD,UACE,cAAC,GAAD,CACE7P,MAAM,YACNzF,KAAK,aACL0E,MAAO6nB,EACPN,UAAU,OACVpY,SAXe,SAACrD,GACpBgc,EAAchc,EAAEic,cAAc/nB,OAC9B3G,EAAM2uB,aAAalc,EAAEic,cAAc/nB,QAU/BsnB,aACE,cAACW,GAAA,EAAD,CAAgBrxB,SAAS,MAAzB,SACGga,EACC,cAACyB,GAAA,EAAD,CACEsD,KAAM,GACNvgB,MAAM,UACN6E,UAAWX,EAAQouB,cAGrB,cAAC7sB,EAAA,EAAD,UACE,cAAC,KAAD,CAAYZ,UAAWX,EAAQ3D,qB,kDC1CzCS,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACXgzB,aAAc,CACZjjB,WAAY,KAGd/M,MAAO,CACLnC,MAAO,OACPsP,WAAY,SACZF,SAAU,SACVC,aAAc,WACdzN,QAAS,UAGXwwB,aAAc,CACZ1xB,gBAAiB,kBAYV2xB,GAAW,SAAC/uB,GACvB,IAAMC,EAAUlD,KACV6T,EAAWoH,cAOjB,OANAF,qBAAU,WjCwEoB,IAC9BnH,EiCxEM3Q,EAAMmsB,KAAKpb,WAAW1H,OAAS,IjCwErCsH,EiCvEqB3Q,EAAMmsB,KAAKrb,IjC0E7B,SAACF,GACJ,OAAOlK,MAAM,GAAD,OAAIzJ,GAAJ,0BAA0B0T,EAA1B,UAA6CpO,KACtDoB,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,YACtDG,MAAK,SAACwX,GACLvK,EAAS,CACPK,KAAMrM,EACNuW,SAAUA,EACVxK,UAAWA,SiCjFoBC,KAElC,CAAC5Q,EAAMmsB,OAGR,eAAC6C,GAAA,EAAD,CACEtf,QAAM,EACNjO,QAAS,kBAAMzB,EAAMivB,WAAWjvB,EAAMmsB,KAAKrb,MAC3ClQ,UAAWI,IACThB,EAAMkvB,eAAiBlvB,EAAMmsB,KAAKrb,KAAO7Q,EAAQ6uB,cAJrD,UAOE,cAACK,GAAA,EAAD,UACE,cAACC,GAAA,EAAD,CAAQ9tB,IAAKtB,EAAMmsB,KAAKkD,OAASrvB,EAAMmsB,KAAKkD,OAAS,OAEvD,cAACxmB,GAAA,EAAD,yBACE5M,QAAS+D,EAAMmsB,KAAKlqB,KACpBqtB,mBAAiB,GACZtvB,EAAMuvB,cAAgB,CAAE1f,UAAW7P,EAAMuvB,eAAkB,IAHlE,IAIE3uB,UAAWI,IACTf,EAAQpB,MACRmB,EAAMkvB,eAAiBlvB,EAAMmsB,KAAKrb,KAAO7Q,EAAQ4uB,qBC9D9CW,GAAmB,SAACC,GAC/B,MAAO,sEAAsEC,KAC3ED,IAYSE,GAA2C,CACtDC,QAAQ,EACRC,WAAW,EACXC,WAAW,EACXzmB,QAAQ,EACR0mB,OAAO,GAGIC,GAAwB,SACnCC,EACAR,GA2BA,MAzBI,KAAKC,KAAKD,GACZQ,EAAgB,QAAa,EAE7BA,EAAgB,QAAa,EAE3B,QAAQP,KAAKD,GACfQ,EAAgB,WAAgB,EAEhCA,EAAgB,WAAgB,EAE9B,QAAQP,KAAKD,GACfQ,EAAgB,WAAgB,EAEhCA,EAAgB,WAAgB,EAE9BR,EAAIS,OAAO7mB,QAAU,EACvB4mB,EAAgB,QAAa,EAE7BA,EAAgB,QAAa,EAE3B,MAAMP,KAAKD,GACbQ,EAAgB,OAAY,EAE5BA,EAAgB,OAAY,EAEvBA,GAGIE,GAAe,SAAClpB,EAAempB,GAC1C,IAAMC,EAAQppB,EAAEhF,KAAKquB,cAGjBC,EAAa,EAKjB,OAPcH,EAAEnuB,KAAKquB,cAGTD,IACVE,GAAc,GAGTA,GClDHxzB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRkS,GAAanS,IACbD,EAAWC,QAWL40B,GAAW,SAACxwB,GACvB,IAAMC,EAAUlD,KAGV0zB,EAAW/mB,aACf,SAACC,GAAD,OAAqBA,EAAMC,OAAOmiB,MAAMlS,YAGpC6W,EAAW1wB,EAAM0wB,UAAY1wB,EAAM0wB,SAASC,KAAKR,IAEnDpE,EACF2E,GACAA,EAASrmB,KAAI,SAAC8hB,EAAkBla,GAC9B,OACE,cAAC,GAAD,CAEEka,KAAMA,EACN+C,aAAclvB,EAAM4wB,WACpB3B,WAAYjvB,EAAMivB,WAClBM,cAAevvB,EAAMuvB,eAJhB,QAAUtd,MA6BvB,OApBIwe,EACF1E,EAAQ,CACN,eAACiD,GAAA,EAAD,WACE,cAACpmB,GAAA,EAAD,UACE,cAACoQ,GAAA,EAAD,CAAkBsD,KAAM,OAE1B,cAACzT,GAAA,EAAD,CAAc5M,QAAQ,+BAJT,oBAOE,OAAV8vB,GAAkBA,EAAM1iB,QAAU,KAC3C0iB,EAAQ,CACN,eAACiD,GAAA,EAAD,WACE,cAACpmB,GAAA,EAAD,UACE,cAAC,KAAD,MAEF,cAACC,GAAA,EAAD,CAAc5M,QAAQ,wBAJT,sBASZ,cAAC0F,EAAA,EAAD,CAAMf,UAAWX,EAAQoO,KAAzB,SAAgC0d,KC/DnChvB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRkS,GAAanS,IACbD,EAAWC,IAFJ,IAGVgD,KAAM,CACJ1B,QAAS,QAEX2zB,WAAY,CACVtoB,YAAa,cAYNuoB,GAAmB,SAAC9wB,GAC/B,IAAMC,EAAUlD,KADoD,EAE5CmD,oBAAS,GAFmC,mBAE7DiB,EAF6D,KAEvD4vB,EAFuD,OAGrB7wB,mBAAS,CACtD8wB,QAAQ,EACR7vB,MAAM,IAL4D,mBAQ9D8vB,GAR8D,UAQtC,WAC5BF,GAAS5vB,KASX,OACE,cAACJ,EAAA,EAAD,CACEE,QAAQ,YACRhB,QAAS,CACPmB,MAAOJ,IACLf,EAAQvC,aACPyD,GAAQlB,EAAQ/B,mBALvB,SASE,eAAC,WAAD,WACE,sBAAK0C,UAAWX,EAAQzB,QAAxB,UACE,qBACEoC,UAAWI,IAAWf,EAAQiO,eAAgB/M,GAAQlB,EAAQrB,MADhE,SAGE,cAAC,GAAD,CAAiB2vB,YAAY,GAAGI,aAAc3uB,EAAM2uB,iBAErDxtB,EACC,cAACK,EAAA,EAAD,CAAYC,QAASwvB,EAArB,SACE,cAAC,KAAD,CAAiBrwB,UAAWX,EAAQ3D,cAGtC,cAACkF,EAAA,EAAD,CAAYC,QAASwvB,EAArB,SACE,cAAC,KAAD,CAAkBrwB,UAAWX,EAAQ3D,iBAsB1C6E,GACC,cAAC,GAAD,CACEuvB,SAAU1wB,EAAM0wB,SAChBzB,WAAYjvB,EAAMkxB,iBAClBN,WAAY5wB,EAAM4wB,mB,yCCtFxB7zB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRqW,GAAatW,IADN,IAEVu1B,YAAa,CACX/xB,YAAa,OACbgyB,cAAe,UAEjBzmB,QAAS,CACPiB,WAAY,IACZF,SAAU,YAEZ2lB,UAAW,CACTt1B,MAAOH,EAAMI,QAAQ6T,UAAUxT,YAcxBi1B,GAAqB,SAACtxB,GACjC,IAAMC,EAAUlD,KAEVw0B,EAAc,WAClBvxB,EAAMwxB,gBAQR,OACE,eAAC3K,GAAA,EAAD,CACE1lB,KAAMnB,EAAMmB,KACZ6lB,QAASuK,EACTE,kBAAgB,sBAChBC,mBAAiB,2BACjBpP,WAAW,EALb,UAOE,eAACqP,GAAA,EAAD,CAAarZ,GAAG,4BAAhB,UACGtY,EAAM4xB,WACL,cAAC,KAAD,CAAU71B,MAAM,YAAY6E,UAAWX,EAAQkxB,cAE/C,cAAC,KAAD,CAAap1B,MAAM,YAAY6E,UAAWX,EAAQkxB,cAJtD,WAMWnxB,EAAM4xB,cAEjB,cAAC3K,GAAA,EAAD,UACE,eAAC4K,GAAA,EAAD,CACEvZ,GAAG,wBACH1X,UAAWX,EAAQ0K,QAFrB,2BAIiB,IACf,+BAAO3K,EAAM4xB,WAAa5xB,EAAM4xB,WAAa,WAAiB,IAC9D,4BAAI5xB,EAAM8xB,WAAc,IACvB9xB,EAAM+xB,UAAY/xB,EAAM+xB,UAAY,gBAPvC,SAUF,eAAC7K,GAAA,EAAD,WACE,cAAC,GAAD,CAAczlB,QAAS8vB,IACvB,cAAChY,GAAA,EAAD,CAAQtI,KAAK,SAAShQ,QAAQ,YAAYQ,QAlC1B,WACpBzB,EAAMgyB,kBACNT,KAgCI,4BC5EFx0B,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX2S,0BAYSyjB,GAAoB,SAACjyB,GAChC,IAAMC,EAAUlD,KADsD,EAE9CmD,mBAASF,EAAMqZ,KAAOrZ,EAAMkyB,YAAc,IAFI,mBAE/DjwB,EAF+D,KAEzDkwB,EAFyD,OAGxCjyB,oBAAS,GAH+B,mBAG/DqX,EAH+D,KAGtDC,EAHsD,OAI1CtX,mBAAiC,IAJS,mBAI/DiE,EAJ+D,KAIvDsjB,EAJuD,KAWhE2K,EAAY,uCAAG,WAAO3f,GAAP,SAAAxL,EAAA,sDACnBwL,EAAED,iBACFC,EAAEsM,kBAEiC,IAA/B0E,OAAOC,KAAKvf,GAAQkF,SACtBmO,GAAW,GACPxX,EAAMqZ,KACRrZ,EAAMqyB,SAASpwB,EAAMqwB,EAAcC,GAEnCvyB,EAAMwyB,cAAcvwB,EAAMqwB,EAAcC,IATzB,2CAAH,sDAcZD,EAAe,WACnBtyB,EAAMgnB,WAGFuL,EAAe,SAAC1rB,GACpB4gB,EAAU5gB,GACV2Q,GAAW,IAGb,OACE,sBAAMib,UAAYlb,GAAW6a,QAAiBlrB,EAA9C,SACE,eAACgb,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,OACNzF,KAAK,OACLisB,UAAU,SACVvnB,MAAO1E,EACP6T,SArCgB,SAACrD,GACzB,IAAM9L,EAAQ8L,EAAE2B,OAAOzN,MACvBwrB,EAAQxrB,IAoCAynB,WAAS,MAGb,cAAClM,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQA,MAExB,cAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,qBAAKvhB,UAAWX,EAAQuO,kBAAxB,SACE,cAAC,GAAD,CAAc+I,QAASA,cC3DtBmb,GAAyB,SACpC1yB,GAEA,IAAM+G,EAAS/G,EAAM+G,OACf6J,EAAWoH,cAyBjB,OACE,cAAC,GAAD,CACEqB,KAAMrZ,EAAMqZ,KACZ2N,QAAShnB,EAAMgnB,QACfwL,cA5BwB,SAC1BvwB,EACAqE,EACAC,I/CWyB,SAC3BtE,EACA0P,EACArL,EACAC,GAJ2B,OAKxB,SAACqK,GACJ,IAAIpK,EAAyB,CAC3BvE,KAAMA,EACN0P,UAAWA,GAGb,OADAf,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IAChCgG,MAAM,GAAD,OAAIzJ,GAAJ,mBAA2B6F,EAAS0D,IAC7C7C,KAAKJ,GACLI,MACC,SAACgN,GACCC,EAAS,CAAEK,KAAM7L,GAAa0L,IAAKH,EAAUgiB,OAC7C/hB,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,IACvC4F,GAAYA,OAEd,SAACO,GACCN,GAAYA,EAASM,GACrB+J,EAAS,CAAEK,KAAMzL,GAAc9E,QAAQ,Q+C9B3C8xB,CAAcvwB,EAAM8E,EAAST,EAAUC,EAAvCisB,CAAiD5hB,IAwB/CyhB,SArBsB,SACxBO,EACAtsB,EACAC,GAEAiL,GACExR,EAAM6yB,eAAe/hB,IACrB8hB,EACA,GACA,QACA1rB,EACAZ,EACAC,EAPFiL,CAQEZ,IASAshB,YAAalyB,EAAM6yB,eAAe5wB,QCnBlClF,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRkS,GAAanS,IACbD,EAAWC,IACX2P,GAAa3P,IAHN,IAIVgD,KAAM,CACJ1B,QAAS,QAGX2B,MAAO,CACL+M,WAAY,WAqBLknB,GAAiB,SAAC9yB,GAC7B,IAAMC,EAAUlD,KADgD,EAGpBmD,mBAAS,IAHW,mBAGzD6yB,EAHyD,KAGzCC,EAHyC,OAIxB9yB,qBAJwB,mBAIzDgvB,EAJyD,KAI3C+D,EAJ2C,OAM9B/yB,qBAN8B,mBAMzDgzB,EANyD,KAM9CC,EAN8C,OAOtCjzB,oBAAS,GAP6B,gCAQdA,oBAAS,IARK,mBAQzDkzB,EARyD,KAQtCC,EARsC,OAUZnzB,oBAAS,GAVG,mBAUzDozB,EAVyD,KAUrCC,EAVqC,KAuB1DtK,EAAqB,SAACvoB,GAC1B2yB,EAAqB3yB,IAwCjBooB,EAAyB,SAC7BrX,EACAnL,EACAC,GAE0BvG,EAAM+Q,WAChC5N,QAAQC,IAAI8rB,GACZ/rB,QAAQC,IAAIqO,GACZzR,EAAMwR,cACJuhB,EACA7D,EAAcjtB,KACdwP,EACA,IACA,SAACG,GACC4hB,EAAiB5hB,GACjBtL,GAAYA,MAEdC,IAIEitB,EAAmB,SAAC/hB,GAUxBtO,QAAQC,IAAI,YACZpD,EAAMyzB,qBAAqBV,IAuFzBW,EAAuC,GAE3C,GAAuB,KAAnBX,EAAuB,CAAC,IAAD,EACrBG,EAAS,UAAGlzB,EAAM0wB,gBAAT,aAAG,EAAgBpgB,WAAU,SAACkN,GAAD,OAAOA,EAAE1M,MAAQiiB,UACzC7rB,IAAdgsB,GAA2BA,GAAa,GAC1ClzB,EAAM0wB,UACJ1wB,EAAM0wB,SAASwC,GAAWniB,WAAW1G,KAAI,SAACiO,GACxC,IAAIqb,EAAiB3zB,EAAM+Q,WAAWT,WACpC,SAACmC,GAAD,OAAOA,EAAEpB,cAAgBiH,EAAGjH,eAE1BsiB,GAAkB,GACpBD,EAAejb,KAAKzY,EAAM+Q,WAAW4iB,OAM/C,OACE,sBAAK/yB,UAAWI,IAAWf,EAAQhD,KAAMgD,EAAQ+N,SAAjD,UAEE,cAACnN,EAAA,EAAD,CAAQC,QAAM,EAAd,SACE,cAAC,GAAD,CACE6tB,aAAc3uB,EAAM4zB,WACpBlD,SAAU1wB,EAAM0wB,SAChBQ,iBAnMiB,SAAC9E,GAExB,IAAID,EADJ6G,EAAkB5G,GAEdpsB,EAAM0wB,WACRvE,EAAOnsB,EAAM0wB,SAASmD,MAAK,SAAC1H,GAAD,OAAUA,EAAKrb,MAAQsb,KAClD+G,EAAanzB,EAAM0wB,SAASpgB,WAAU,SAAC6b,GAAD,OAAUA,EAAKrb,MAAQsb,OAG/D6G,EAAgB9G,IA4LVyE,WAAYmC,MAQhB,sBAAMnyB,UAAWX,EAAQ0K,QAAzB,SACG3K,EAAM0wB,eAA0BxpB,IAAdgsB,GAejB,eAAChR,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEhK,MAAOnY,EAAM2pB,WAAWnE,cACxB5D,WAAY5hB,EAAM4hB,WAClBkH,uBAAwBA,EACxBjB,gBAAiB7nB,EAAM0wB,SAASwC,GAChCjK,mBAAoBA,EACpBD,sBAtEgB,SAACtoB,GAC7B6yB,EAAsB7yB,IAsEVqoB,oBAAkB,MAItB,cAAC7G,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,eAAC5gB,EAAA,EAAD,CACEN,QAAQ,YACR/D,QAAQ,SACR0D,UAAWX,EAAQpB,MAHrB,gCAKsBmB,EAAM0wB,SAASwC,GAAWjxB,UAGlD,cAACigB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIqE,GAAI,EAAvB,SACE,cAAC,GAAD,CACE3V,QAAS7Q,EAAM0wB,SAASwC,GACxB/Z,OAAQ,EACRK,YA/JM,SAClBsa,EACAxtB,EACAC,GAEAvG,EAAMwR,cACJuhB,EACA7D,EAAcjtB,KACd,GACA6xB,GACA,WACE9zB,EAAMyzB,qBAAqBV,GAC3BzsB,GAAYA,MAEdC,IAkJUwR,YAAU,WAOpB,cAAC,GAAD,CACE5W,KAAMiyB,EACN5B,aAAc,kBAAMvI,GAAmB,IACvC+I,gBA1GsB,WAC1BhyB,EAAM+zB,eAAe,CAAChB,IAAiB,WAxIvCI,OAAajsB,GACb+rB,OAAgB/rB,GAChB8rB,EAAkB,IAwIhBhzB,EAAM4zB,WAAW,QAwGf9B,SAAQ,OAAE5C,QAAF,IAAEA,OAAF,EAAEA,EAAcjtB,OAGzBjC,EAAM0wB,eAA0BxpB,IAAdgsB,GACjB,cAAC,GAAD,CACEr0B,MAAM,oBACNsC,KAAMmyB,EACNrG,kBAAmB,kBAAMsG,GAAsB,IAC/ChG,KACE,cAAC,GAAD,CACEvG,QA1Gc,WACxBuM,GAAsB,GAEtBvzB,EAAM4zB,WAAW,IAAI,SAAC5sB,GACpBmsB,EAAansB,EAAOsJ,WAAU,SAAC6b,GAAD,OAAUA,EAAKrb,MAAQiiB,UAuG7C1Z,MAAI,EACJtS,OAAQ/G,EAAM6J,KAAKyO,GACnBua,eAAgB7yB,EAAM0wB,SAASwC,WCrThCc,GAAY,SAACh0B,GAA+B,IAAD,EAC9BE,oBAAS,GADqB,mBAIhDwpB,GAJgD,UAIlChgB,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,SAEjE+G,EAAUnH,aACd,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,iBAEvCH,EAAarH,aACjB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,cAAcH,cAErD4Y,EAAajgB,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAO+f,cAC3D/Y,EAAWoH,cAEjB8B,GAAgB,OAAC4P,QAAD,IAACA,OAAD,EAACA,EAAapR,IAK9BR,qBAAU,WACR9X,EAAMi0B,SAAS,MACd,IAIH,IAqHI/I,EAA4C,GAQhD,OAPAna,EAAW1G,KAAI,SAACoI,GACd,GAAIA,EAAEgT,WAAahT,EAAE0F,MAAM,GAAG7G,OAC5B,OAAO4Z,EAAoBzS,KAAKhG,MAMlC,cAAC,GAAD,CACE5I,KAAM6f,EACNgH,SAAU1wB,EAAM+rB,MAChB6H,WAAY5zB,EAAMi0B,SAClBljB,WAAYA,EACZS,cAtGwB,SAC1Bb,EACA1O,EACAwP,EACAC,EACApL,EACAC,GAEApD,QAAQC,IAAI,YAAauN,GACzBxN,QAAQC,IAAI,OAAQnB,GACpBkB,QAAQC,IAAI,aAAcqO,GAC1BiY,GACElY,GACEb,EACA1O,EACAwP,EACAC,OACAxK,EACAZ,EACAC,EAPFiL,CAQEZ,IAmFFsjB,qBAhF8B,SAChC9H,EACA3a,EACAC,EACApL,EACAC,IZiB+B,SACjC6lB,EACAzb,EACAc,EACA0iB,EACA7tB,EACAC,GANiC,OAO9B,SAACqK,GACJ,IAAIpK,EAA+B,CACjC4tB,gBAAiB3iB,EACjB4iB,mBAAoBF,EACpBxjB,UAAWA,GAOb,OAJAxN,QAAQC,IAAIoD,GAEZoK,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IAC5CyC,QAAQC,IAAIgpB,GACL1lB,MACLzJ,GAAO,gBAAkBmvB,EAAS,cAClC/oB,EAAQmD,IAEP7C,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,YACtDG,MACC,WAEEiN,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IAC5C4F,GAAYA,OAEd,SAACO,GACC+J,EAAS,CAAEK,KAAMlL,GAAmBrF,QAAQ,IAC5C6F,GAAYA,EAASM,OY7CzBytB,CACElI,EACAvb,EAAQC,IACRW,EACAC,EACApL,EAEAC,EAPF+tB,CAQE1jB,IAiEA6iB,qBAxByB,SAAC9iB,GAC5B,IAAII,EAAmC,GAIvC,OzClH4B,SAC9BJ,EACArK,EACAC,GAH8B,OAI3B,SAACqK,GACJ,OAAOlK,MAAM,GAAD,OAAIzJ,GAAJ,2BAA2B0T,GAAapO,KACjDoB,KAAKJ,GACLI,MACC,SAACH,GACC,IAAIqN,EAAsB,CACxBC,IAAKtN,EAASmN,UACd1O,KAAMuB,EAASvB,KACf8O,WAAYvN,EAASuN,WAAavN,EAASuN,WAAa,GACxDC,YAAaxN,EAASwN,aAExB7N,QAAQC,IAAII,GACZoN,EAAS,CAAEK,KAAMpM,GAAuB0vB,YAAa1jB,IACrDvK,GAAYA,EAASuK,MAEvB,SAAChK,GACCN,GAAYA,EAASM,OyC2FzB2tB,CAAiB7jB,GAAW,SAACE,GAC3BE,EAAaF,EAAQE,aADvByjB,CAEG5jB,GACIG,GAoBL0jB,eAtIuB,SACzBrI,EACA9lB,EACAC,IZrBgC,SAClC6lB,EACAzb,EACArK,EACAC,GAJkC,OAK/B,SAACqK,GAEJ,OADAzN,QAAQC,IAAIgpB,EAAQzb,GACbjK,MACLzJ,GAAO,gBAAkBmvB,EAAS,sBAAwBzb,EAC1DpO,KAECoB,KAAKJ,GACLI,MACC,SAACqD,GACC,IAAI6R,EAA+B,GACnC7R,EAAO8iB,aAAanG,SAAQ,SAACsI,GAC3B,OAAQpT,EAAa,uBAChBA,GADgB,aAEhB4K,OAAOyI,OAAOD,QAGrB9oB,QAAQC,IAAIyV,GAEZ,IAAMsT,EAAa,CACjBC,OAAQplB,EAAOolB,OACfC,SAAUrlB,EAAOqlB,SACjBC,KAAMtlB,EAAOslB,KACbxC,aAAcjR,GAEhBjI,EAAS,CAAEK,KAAMnL,GAAaqmB,KAAMA,IACpC7lB,GAAYA,EAAS6lB,MAEvB,SAACtlB,GACCN,GAAYA,EAASM,OYVzB6tB,CAAqBtI,EAAQvb,EAAQC,IAAKxK,EAAUC,EAApDmuB,CAA8D9jB,IAkI5DmjB,eA5CyB,SAC3Bna,EACAtT,EACAC,IjDiD0B,SAC5BqT,EACAtT,EACAC,GAH4B,OAIzB,SAACqK,GAEJ,OADAA,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IAC7CgG,MAAMzJ,GAAO,mBAAoBqG,EAAWsW,IAChDjW,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,YACtDG,MACC,WACEiN,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD4F,GAAYA,OAEd,SAACO,GACC+J,EAAS,CAAEK,KAAMvM,EAA2BhE,QAAQ,IACpD6F,GAAYA,EAASM,OiD9DzBktB,CAAena,EAAYtT,EAAUC,EAArCwtB,CAA+CnjB,IAwC7C+Y,WAAYA,EACZ/H,WAlEqB,SACvBpC,EACAlZ,EACAC,GAEAqb,GACEpC,GACA,GACA,SAACnd,GAAD,OACEinB,GACEjnB,GACA,WACEiE,EAASjE,KAEXkE,EALF+iB,CAME1Y,KACJrK,EAXFqb,CAYEhR,IAkDAsa,oBAAqBA,EACrBxE,YAAa7V,EAAQ5O,QCtLrBlF,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRyO,GAAc1O,IACdiP,GAAYjP,IACZsW,GAAatW,IAHN,IAKVqB,KAAM,CACJlB,MAAOH,EAAMI,QAAQC,QAAQI,MAG/BqhB,YAAa,CACXte,YAAa,aAKNu1B,GAAO,WAClB,IAAM10B,EAAUlD,KADQ,EAE4BmD,oBAAS,GAFrC,mBAEjBozB,EAFiB,KAEGC,EAFH,KAGlBxH,EAAQriB,aACZ,SAACC,GAAD,OAAqBA,EAAMuG,MAAM0kB,aAAaA,gBAE1CnrB,EAAWC,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QAC9D6H,EAAYlI,EAAWA,EAAS6O,GAAK,GACrC1H,EAAWoH,cACX9G,EAAgBxH,aACpB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,iBAVrB,EAYwBhR,mBAAS,IAZjC,mBAYjB20B,EAZiB,KAYCC,EAZD,KAalBC,EAAiB,SACrBhe,EACAzQ,EACAC,GAEAuuB,EAAoB/d,G1CbQ,SAC9B2Q,EACAsN,EACA1uB,EACAC,GAJ8B,OAK3B,SAACqK,GACJ,OAAOlK,MACL,UAAGzJ,GAAH,sCAAqCyqB,EAArC,gBAA2DsN,EAC3DzyB,KAECoB,KAAKJ,GACLI,MACC,SAACH,GACCoN,EAAS,CAAEK,KAAMxM,EAAsBmwB,aAAcpxB,IACrD8C,GAAYA,EAAS9C,MAEvB,SAACqD,GACCN,GAAYA,EAASM,O0CFzBouB,CAAiB,IAAMle,EAAOzQ,EAAUC,EAAxC0uB,CAAkDrkB,IAQ9CskB,EAAqB,SAAC5uB,EAAqBC,I1CwEtB,SAC3BmhB,EACAsN,EACA1uB,EAAqBC,GACdG,MAAMzJ,GAAO,mBAAP,gBAAqCyqB,EAArC,gBAA2DsN,EAAYzyB,KACjFoB,MAAK,SAACH,GAAD,OAAwBA,EAASE,UACtCC,MACC,SAACqD,GAAY,IAAD,EACJ2d,EAAMxkB,OAAOyD,IAAIC,gBAAgBmD,GACjCokB,EAAOrG,SAASC,cAAc,KACpCoG,EAAK/jB,KAAOsd,EACZyG,EAAKC,aACH,WADF,sBAEgB,IAAIhG,MAAOiG,WAF3B,QAGI,KAAM,IAAIjG,MAAOkG,YACjBC,OAAO,IAJX,QAIgB,IAAInG,MAAOoG,cAJ3B,SAMA1G,SAAS/hB,KAAK0oB,YAAYN,GAC1BA,EAAKO,QACL,UAAAP,EAAKQ,kBAAL,SAAiBC,YAAYT,GAC7B9kB,GAAYA,EAASU,MAEvB,WACE7D,QAAQC,IAAI,SACZmD,GAAYA,O0C/FhB4uB,CAAc,IAAMN,EAAkBvuB,EAAUC,IAGlD,OACE,cAAC,GAAD,CAAUqkB,WAAW,QAArB,SACE,sBAAKhqB,UAAWX,EAAQhD,KAAxB,UACE,cAAC,GAAD,CACE4B,MAAM,SACNkT,QAAS,CACP,cAACwH,GAAA,EAAD,CACEtI,KAAK,SACLhQ,QAAQ,YACRlF,MAAM,UACN6E,UAAWI,IAAWf,EAAQkS,QAASlS,EAAQyd,aAC/Cjc,QAAS,kBAAMyzB,KALjB,iCASA,cAAC3b,GAAA,EAAD,CACEtI,KAAK,SACLhQ,QAAQ,YACRlF,MAAM,UACN6E,UAAWX,EAAQkS,QACnB1Q,QAAS,kBAAM8xB,GAAsB,IALvC,+BAYJ,qBAAK3yB,UAAWX,EAAQ+K,SAAxB,SACE,sBAAKpK,UAAWX,EAAQmL,gBAAxB,UACE,cAAC,GAAD,CAAW2gB,MAAOA,EAAOkI,SAAUc,IAEnC,cAAC,GAAD,CACEl2B,MAAM,iBACNsC,KAAMmyB,EACNjG,cAAY,EACZC,aAAW,EACXL,kBAAmB,kBAAMsG,GAAsB,IAC/ChG,KACE,cAAC,GAAD,CACEvG,QAhDY,WAC1BuM,GAAsB,GACtBwB,EAAe,KA+CDhuB,OAAQ4K,EACRkhB,eAAgB3hB,iBC3FrBkkB,GAAmB,SAACp1B,GAC/B,OACE,eAACuB,EAAA,EAAD,uCAAsCvB,EAAMq1B,YAAYpzB,SCR/CqzB,GAAc,SAACt1B,GAC1B,OACE,cAACkiB,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,SACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACGniB,EAAMq1B,YACL,cAAC,GAAD,CAAkBA,YAAar1B,EAAMq1B,cAErC,cAACrc,GAAA,EAAD,CAAkBjd,MAAM,UAAUugB,KAAM,UCNrCiZ,GAAkB,SAACv1B,GAC9B,IAAMyJ,EAAWC,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QAapE,OACE,cAAC,GAAD,CACE3I,KAAMnB,EAAMmB,KACZqwB,aAAcxxB,EAAMw1B,aACpBxD,gBAfe,WACjBvoB,GACE3C,GACE2C,EAAS6O,IACT,eACA,SAACzR,GACC1D,QAAQC,IAAIyD,UCjBT4uB,GAAqB,WAChC,OACE,eAAC,WAAD,WACE,cAACl0B,EAAA,EAAD,CAAYN,QAAQ,KAApB,kCACA,cAACM,EAAA,EAAD,CAAYN,QAAQ,QAApB,8mLCgBAlE,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,+DACRyO,GAAc1O,IACdiP,GAAYjP,IACZ2P,GAAa3P,IACbsW,GAAatW,IAJN,IAKV85B,iBAAkB,CAChBhqB,SAAU,OACVC,UAAW,UACXC,WAAY,IACZC,cAAe,UACf/M,WAAY,QAEd7B,KAAM,CACJlB,MAAOH,EAAMI,QAAQC,QAAQI,MAE/BmZ,QAAS,CACPzZ,MAAOH,EAAMI,QAAQ6K,MAAMxK,MAG7Bs5B,mBAAoB,CAClBrqB,UAAW,OACXJ,OAAQ,kBACRoC,aAAc,OACd5Q,MAAO,OACPU,gBAAiBxB,EAAMI,QAAQ+T,wBAGjC6lB,aAAc,CACZz4B,OAAQ,aACRT,MAAO,OAETm5B,WAAY,CACVv3B,QAAS,mBAOFw3B,GAAiB,SAAC91B,GAC7B,IAAMC,EAAUlD,KADgD,EAEjCmD,oBAAS,GAFwB,mBAEzD61B,EAFyD,KAEjDC,EAFiD,OAG9B91B,oBAAS,GAHqB,mBAGzD+1B,EAHyD,KAG9CC,EAH8C,OAI1Bh2B,oBAAS,GAJiB,mBAIzDi2B,EAJyD,KAI5CC,EAJ4C,KAK1D3sB,EAAWC,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QA0BpE,OACE,sBAAKlJ,UAAWI,IAAWf,EAAQ8K,QAAS9K,EAAQ21B,cAApD,UACE,cAACr0B,EAAA,EAAD,CAAYX,UAAWX,EAAQwL,YAA/B,qBACA,qBAAK7K,UAAWX,EAAQ+K,SAAxB,SACE,qBAAKpK,UAAWX,EAAQ01B,mBAAxB,SACE,sBACE/0B,UAAWI,IAAWf,EAAQmL,gBAAiBnL,EAAQ41B,YADzD,UAGE,cAACt0B,EAAA,EAAD,CAAYX,UAAWX,EAAQy1B,iBAA/B,kCAGA,cAAC,GAAD,CACEzzB,KAAK,SACLyR,QAASqiB,EACTjgB,SAtCgB,SAACrD,GAC3BujB,EAAavjB,EAAE2B,OAAOV,UAsCZhM,MAAM,iCACN+O,aAAa,+BACbE,kBArCY,WACtBuf,GAAa,MAsCL,cAAC30B,EAAA,EAAD,CAAYX,UAAWX,EAAQy1B,iBAA/B,iCAGA,cAACn0B,EAAA,EAAD,CAAYN,QAAQ,YAApB,mDAGA,cAACyV,GAAA,EAAD,CAAMrP,KAAK,IAAIyF,UAAU,SAASrL,QArChB,WAC1B20B,GAAe,IAoCP,+BAGA,cAAC,GAAD,CACEj1B,KAAMg1B,EACNX,aAtCS,WACnBY,GAAe,IAsCLC,cAnCgB,WAC1B5sB,GAAY3C,GAAW2C,EAAS6O,OAoCxB,cAAC,GAAD,CACEzZ,MAAM,qBACNsC,KAAM80B,EACNhJ,kBApDa,WACvBiJ,GAAa,IAoDH3I,KAAM,cAAC,GAAD,iBC5HdxwB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRF,EAAWC,IADJ,IAEVqB,KAAM,CACJM,SAAU,WACVb,MAAO,MACP2L,SAAU,QACV/J,QAAS,WACTgP,aAAc,OACdpC,OAAQ,aAAetP,EAAMI,QAAQqQ,KAAK,KAC1CjP,gBAAiB,mBACjB8P,UAAW,sBACX,WAAY,CACV3P,SAAU,WACVuiB,OAAQ,OACRnV,QAAS,KACToI,MAAO,OACPujB,YAAa,yBACb5rB,aAAc,cAAgB9O,EAAMI,QAAQqQ,KAAK,KACjDkqB,WAAY,0BAEd,UAAW,CACTh5B,SAAU,WACVuiB,OAAQ,OACRnV,QAAS,KACToI,MAAO,OACPujB,YAAa,yBACb5rB,aAAc,8BACd6rB,WAAY,0BAEd,WAAY,CACVp5B,OAAQ,YACRyO,WAAY,OACZF,SAAU,aAEZ,OAAQ,CACNpN,QAAS,EACTnB,OAAQ,EACRq5B,cAAe,OACf,OAAQ,CACN75B,OAAQ,OACRsO,UAAW,OACXnM,WAAY,OACZ4M,SAAU,UACV,QAAS,CACP0lB,cAAe,SAIrB,aAAc,CACZr1B,MAAOH,EAAMI,QAAQ6K,MAAMxK,MAE7B,WAAY,CACVN,MAAOH,EAAMI,QAAQ6e,QAAQxe,OAGjCwC,MAAO,GACP2W,QAAS,GACTihB,MAAO,SASEC,GAAsB,SAAC12B,GAClC,IAAMC,EAAUlD,KAQhB,OAJI0mB,OAAOyI,OAAOlsB,EAAMiwB,kBAAkB9lB,UAAS,IAAYnK,EAAMqG,SAMjE,sBAAKzF,UAAWX,EAAQhD,KAAxB,UACE,qBAAK2D,UAAWX,EAAQpB,MAAxB,6BACA,+BACE,qBACE+B,UACEZ,EAAMiwB,iBAAiB5mB,OAASpJ,EAAQw2B,MAAQx2B,EAAQuV,QAF5D,UAKGxV,EAAMiwB,iBAAiB5mB,OACtB,cAAC,KAAD,CAAUzI,UAAWX,EAAQpD,WAE7B,cAAC,KAAD,CAAW+D,UAAWX,EAAQpD,WARlC,YAUW,qDAEX,qBACE+D,UACEZ,EAAMiwB,iBAAiBH,UAAY7vB,EAAQw2B,MAAQx2B,EAAQuV,QAF/D,UAKGxV,EAAMiwB,iBAAiBH,UACtB,cAAC,KAAD,CAAUlvB,UAAWX,EAAQpD,WAE7B,cAAC,KAAD,CAAW+D,UAAWX,EAAQpD,WARlC,YAUW,6DAEX,qBACE+D,UACEZ,EAAMiwB,iBAAiBJ,UAAY5vB,EAAQw2B,MAAQx2B,EAAQuV,QAF/D,UAKGxV,EAAMiwB,iBAAiBJ,UACtB,cAAC,KAAD,CAAUjvB,UAAWX,EAAQpD,WAE7B,cAAC,KAAD,CAAW+D,UAAWX,EAAQpD,WARlC,YAUW,6DAEX,qBACE+D,UACEZ,EAAMiwB,iBAAiBL,OAAS3vB,EAAQw2B,MAAQx2B,EAAQuV,QAF5D,UAKGxV,EAAMiwB,iBAAiBL,OACtB,cAAC,KAAD,CAAUhvB,UAAWX,EAAQpD,WAE7B,cAAC,KAAD,CAAW+D,UAAWX,EAAQpD,WARlC,YAUW,mDAEX,qBACE+D,UACEZ,EAAMiwB,iBAAiBF,MAAQ9vB,EAAQw2B,MAAQx2B,EAAQuV,QAF3D,UAKGxV,EAAMiwB,iBAAiBF,MACtB,cAAC,KAAD,CAAUnvB,UAAWX,EAAQpD,WAE7B,cAAC,KAAD,CAAW+D,UAAWX,EAAQpD,WARlC,MAUK,yDAKC,MCzIVE,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX2S,0BAeSmoB,GAAqB,SAAC32B,GACjC,IAAMC,EAAUlD,KADwD,EAE1CmD,oBAAS,GAFiC,mBAEjEqX,EAFiE,KAExDC,EAFwD,OAGtCtX,mBAAuB,CACvD02B,YAAa,GACbC,YAAa,GACbC,mBAAoB,KANkD,mBAGjEC,EAHiE,KAGtDC,EAHsD,OASxB92B,mBAA2B,CACzE0vB,QAAQ,EACRvmB,QAAQ,EACRymB,WAAW,EACXD,WAAW,EACXE,OAAO,IAd+D,mBASjEE,EATiE,KAS/CgH,EAT+C,OAgB5C/2B,mBAAiC,IAhBW,mBAgBjEiE,EAhBiE,KAgBzDsjB,EAhByD,KAkBlEyP,EAAoB,SAACzkB,GACzB,IAAMxQ,EAAOwQ,EAAE2B,OAAOnS,KAChB0E,EAAQ8L,EAAE2B,OAAOzN,MACvBqwB,EAAa,2BAAKD,GAAN,kBAAkB90B,EAAO0E,KAExB,gBAAT1E,GAEFwlB,EAAUrE,GAAgBjf,EAAQ,kBAAmB,KAG1C,gBAATlC,GACFk1B,EAA6BxwB,GAGlB,uBAAT1E,GACFm1B,EAAsBzwB,IAIpBwwB,EAA+B,SAACxwB,GAEpC,IAAM0wB,EAAkBrH,GAAsBC,EAAkBtpB,GAChEswB,EAAoBI,GACpBl0B,QAAQC,IAAIi0B,GACR5T,OAAOyI,OAAOmL,GAAiBltB,UAAS,GAC1Csd,EACErE,GAAgBjf,EAAQ,mBAAoB,4BAG9Cif,GAAgBjf,EAAQ,mBAAoB,IAK1C4yB,EAAUD,oBACZC,EAAUD,qBAAuBnwB,EAEjCyc,GAAgBjf,EAAQ,WAAY,2BAEpCif,GAAgBjf,EAAQ,WAAY,KAIlCizB,EAAwB,SAACzwB,GAEvBA,GAASA,IAAUowB,EAAUF,YACjCzT,GAAgBjf,EAAQ,WAAY,2BAEpCif,GAAgBjf,EAAQ,WAAY,KAIlCiuB,EAAY,uCAAG,WAAO3f,GAAP,SAAAxL,EAAA,sDACnBwL,EAAED,iBACFC,EAAEsM,kBAEiC,IAA/B0E,OAAOC,KAAKvf,GAAQkF,SACtBmO,GAAW,GACXxX,EAAMs3B,eACJP,EAAUH,YACVG,EAAUF,YACVU,EACAC,IAVe,2CAAH,sDAeZD,EAAa,WACjBv3B,EAAMgnB,WAGFwQ,EAAa,SAAC3wB,GAElB4gB,EAAU5gB,GACV2Q,GAAW,IAGb,OACE,sBAAMib,UAAYlb,GAAW6a,QAAiBlrB,EAA9C,SACE,eAACgb,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,eACNzF,KAAK,cACLisB,UAAU,WACVvnB,MAAOowB,EAAUH,YACjB9gB,SAAUohB,MAKd,eAAChV,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC,GAAD,CACEza,MAAM,eACNzF,KAAK,cACLisB,UAAU,WACVvnB,MAAOowB,EAAUF,YACjB/gB,SAAUohB,IAGZ,cAAC,GAAD,CACE7wB,SAAU0wB,EAAUF,YACpB5G,iBAAkBA,OAGtB,cAAC/N,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,uBACNzF,KAAK,qBACLisB,UAAU,WACVvnB,MAAOowB,EAAUD,mBACjBhhB,SAAUohB,EACVtJ,YAAU,MAId,cAAC1L,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQA,MAExB,cAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,sBAAKvhB,UAAWX,EAAQuO,kBAAxB,UACE,cAAC,GAAD,CAAc/M,QAASzB,EAAMgnB,UAC7B,cAAC,GAAD,CACEzP,QAASA,EACTtB,SAAUwN,OAAOC,KAAKvf,GAAQkF,OAAS,eCrKxCouB,GAAsB,SAACz3B,GASlC,OACE,cAAC,GAAD,CACEgnB,QAAShnB,EAAMgnB,QACfsQ,eAXyB,SAC3BV,EACAC,EACAvwB,EACAC,InE8G0B,SAC5BqwB,EACAC,EACAvwB,EACAC,GAOOG,MAAMzJ,GAAO,yBAA0BoG,EALV,CAClCwzB,YAAaA,EACba,gBAAiBd,KAIhBjzB,MAAK,SAAC+d,GAAD,OAAmBne,EAAeme,EAAK,WAC5C/d,MACC,WACE2C,GAAYA,OAEd,SAACO,GACCN,GAAYA,EAASM,MmE9HzBywB,CAAeV,EAAaC,EAAavwB,EAAUC,OCejDxJ,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRqW,GAAatW,IADN,IAGVqB,KAAM,CACJlB,MAAOH,EAAMI,QAAQC,QAAQI,MAG/BqhB,YAAa,CACXte,YAAa,aAKNu4B,GAAU,WACrB,IAAM13B,EAAUlD,KADW,EAEWmD,oBAAS,GAFpB,mBAEpB03B,EAFoB,KAEPC,EAFO,OAGyB33B,oBAAS,GAHlC,mBAGpBozB,EAHoB,KAGAC,EAHA,KAIrB9pB,EAAWC,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QAC9D6H,EAAYlI,EAAWA,EAAS6O,GAAK,GAErCyB,EAAcrQ,aAClB,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAASJ,cAEvC/I,EAAUnH,aACd,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,iBAGvCN,EAAWoH,cAcjB,OAZA8B,GAAiBnI,GACjBmG,qBAAU,WACJiC,IACyB,IAAvBA,EAAY1Q,OACdkqB,GAAsB,IAEtBpwB,QAAQC,IAAI,eACZsN,GAAmBqJ,EAAY,GAA/BrJ,CAAmCE,OAGtC,CAACmJ,IAGF,cAAC,GAAD,UACE,eAAC,WAAD,WACE,cAAC,GAAD,CACElb,MAAO,UACP+B,UAAWX,EAAQhD,KACnB8U,QAAS,CACP,cAACwH,GAAA,EAAD,CACEtI,KAAK,SACLhQ,QAAQ,YACRlF,MAAM,UACN6E,UAAWI,IAAWf,EAAQkS,QAASlS,EAAQyd,aAC/Cjc,QAAS,kBAAMo2B,GAAe,IALhC,6BASA,cAACte,GAAA,EAAD,CACEtI,KAAK,SACLhQ,QAAQ,YACRlF,MAAM,UACN6E,UAAWX,EAAQkS,QACnB1Q,QAAS,kBAAM8xB,GAAsB,IALvC,+BAWJ,cAAC,GAAD,CAAa8B,YAAaxkB,IAC1B,cAAC,GAAD,IACA,cAAC,GAAD,CACEhS,MAAM,qBACNsC,KAAMy2B,EACN3K,kBAAmB,kBAAM4K,GAAe,IACxCtK,KAAM,cAAC,GAAD,CAAqBvG,QAAS,kBAAM6Q,GAAe,QAG3D,cAAC,GAAD,CACEh5B,MAAM,iBACNsC,KAAMmyB,EACNjG,cAAY,EACZC,aAAW,EACXL,kBAAmB,kBAAMsG,GAAsB,IAC/ChG,KACE,cAAC,GAAD,CACEvG,QAAS,kBAAMuM,GAAsB,IACrCxsB,OAAQ4K,EACRkhB,eAAgBhiB,Y,wGCtHf,OAA0B,qCCoBnC9T,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRgP,GAAYjP,IACZD,EAAWC,IAFJ,IAGV2S,YACAupB,QAAS,CACPp7B,MAAO,OACP4W,SAAU,QACVnW,OAAQ,WACRC,gBAAiB,UACjBT,OAAQ,OACRuO,OAAQ,mBAEVmI,UAAW,CACT0kB,OAAQ,QAEVC,SAAU,CACRt7B,MAAO,OACPS,OAAQ,OACRmB,QAAS,OACT3B,OAAQ,OACR4W,MAAO,QAET0kB,UAAW,CACTl8B,MAAOH,EAAMI,QAAQ+C,OAAO4O,OAE9BuqB,YAAa,CACXvrB,aAAc,QAEhByU,MAAO,CACL1kB,MAAO,MACPS,OAAQ,cAUDg7B,GAAgB,SAACn4B,GAC5B,IAAMC,EAAUlD,KAD8C,EAEhCmD,oBAAS,GAFuB,mBAEvDqX,EAFuD,KAE9CC,EAF8C,KAG7C9N,aACf,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAASH,YAE5B7B,cAqBjB,OANAF,qBAAU,WACRlD,YAAW,WACT4C,GAAW,KACV,OACF,CAACxX,IAGF,qBAAKY,UAAWI,IAAWf,EAAQ8K,QAAS9K,EAAQoT,WAApD,SACE,sBAAKzS,UAAWX,EAAQ63B,QAAxB,UACE,qBAAKx2B,IAAK82B,GAAWx3B,UAAWX,EAAQ+3B,SAAU32B,IAAI,SACtD,qBAAKT,UAAWI,IAAWf,EAAQmhB,MAAOnhB,EAAQsO,UAAlD,SACE,eAAC2T,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAf,SACE,cAAC,KAAD,CACEnF,MAAO,CAAEjhB,MAAO,UAAWW,MAAO,OAAQC,OAAQ,YAGtD,cAACulB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC5gB,EAAA,EAAD,CACEN,QAAQ,KACRL,UAAWI,IAAWf,EAAQg4B,UAAWh4B,EAAQi4B,aAFnD,4CASN,cAAC32B,EAAA,EAAD,CAAYN,QAAQ,YAAYL,UAAWX,EAAQsO,SAAnD,4CAGEgJ,GAAW,cAAC,GAAD,UC1Efxa,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRF,EAAWC,IACXuQ,GAAYvQ,IACZ4R,GAAa5R,IAHN,IAIV2S,YACAC,qBACAspB,QAAS,CACPp7B,MAAO,OACP4W,SAAU,QACVnW,OAAQ,SAGRC,gBAAiB,UACjBT,OAAQ,OACRuO,OAAQ,mBAEVmtB,gBAAiB,CACf37B,MAAO,OACP4W,SAAU,QACVnW,OAAQ,SAER0Q,UAAW,SACXzQ,gBAAiB,UACjBT,OAAQ,QAEVq7B,SAAU,CACR76B,OAAQ,SACRT,MAAO,MACP4B,QAAS,OACT3B,OAAQ,OACR0W,UAAW,QACXE,MAAO,QAETpI,MAAO,CACLA,MAAO,QAET8sB,UAAW,CACTl8B,MAAOH,EAAMI,QAAQ+C,OAAO4O,OAE9B2qB,cAAe,CACb57B,MAAO,OACPmR,UAAW,QAEbqqB,YAAa,CACXvrB,aAAc,QAEhB4rB,UAAW,CACT57B,OAAQ,OACRmC,WAAY,SAEd05B,SAAU,CACR7sB,UAAW,SACXnD,aAAc,QAEhBiwB,SAAU,CACR18B,MAAOH,EAAMI,QAAQC,QAAQI,KAC7Bq8B,eAAgB,YAChB9sB,WAAY,KAEdwV,MAAO,CACL1kB,MAAO,MACPS,OAAQ,QAEVw7B,WAAY,CACVhtB,UAAW,UAEbitB,YAAa,CACXx7B,gBAAiBxB,EAAMI,QAAQ+C,OAAO4O,MACtC5R,MAAOH,EAAMI,QAAQ+C,OAAOC,MAC5BrC,OAAQ,cAUDk8B,GAAY,SAAC74B,GAA8B,MAE1BE,mBAAiC,IAFP,mBAE/CiE,EAF+C,KAEvCsjB,EAFuC,OAGxBvnB,oBAAS,GAHe,mBAG/CqX,EAH+C,KAGtCC,EAHsC,OAUlBtX,oBAAS,GAVS,mBAU/C44B,EAV+C,KAUnCC,EAVmC,OAW9B74B,mBAAS,CAC/BuG,SAAU,GACVJ,SAAU,GACV2yB,eAAgB,GAChB5yB,MAAO,KAf6C,mBAW/CyD,EAX+C,KAWzCovB,EAXyC,OAkBR/4B,oBAAS,GAlBD,mBAkB/Cg5B,EAlB+C,KAkB9BC,EAlB8B,OAmBNj5B,mBAA2B,CACzE0vB,QAAQ,EACRvmB,QAAQ,EACRymB,WAAW,EACXD,WAAW,EACXE,OAAO,IAxB6C,mBAmB/CE,EAnB+C,KAmB7BgH,EAnB6B,OA0BlC/2B,mBAAS,IA1ByB,mBA0B/CoY,EA1B+C,KA0B3C8gB,EA1B2C,KA6BhDn5B,GAFW+X,cAEDjb,MAGVs8B,EAAgB,uCAAG,WAAOzgB,GAAP,SAAA3R,EAAA,sDACvB2R,EAAMpG,iBACNoG,EAAMmG,kBAENvH,GAAW,GACPxX,EAAMs5B,SAERt5B,EAAMu5B,WAIJ1vB,EAAKpD,SAASypB,OACdrmB,EAAKxD,SAAS6pB,OACdrmB,EAAKzD,MAAM8pB,OACXsJ,EACAhC,GAIFx3B,EAAMu5B,WACJ1vB,EAAKzD,MAAM8pB,OACXrmB,EAAKxD,SAAS6pB,OACduJ,EACAjC,GAvBmB,2CAAH,sDA4BhBiC,EAAY,WAChB,IAAMC,EAAQv5B,OAAOiH,SAASwV,OAGxB+c,EAFc,IAAIC,gBAAgBF,GAEfG,IAAI,QAG3B15B,OAAOiH,SAASC,KAFdsyB,GAKqB,WAIrBnC,EAAa,SAACrzB,GAClBsjB,EAAUtjB,GACVqT,GAAW,IAGPgiB,EAAa,SAAC9X,GAClB,IAAM7X,EAAO5G,KAAK62B,MAAMpY,GACxB0X,EAAMvvB,EAAKyO,IACXygB,GAAc,IAGVgB,EAAmB,SAACnhB,GACxB,IAAM3W,EAAO2W,EAAMxE,OAAOnS,KACpB0E,EAAQiS,EAAMxE,OAAOzN,MAC3BsyB,GAAQ,SAACtvB,GAAD,mBAAC,eAAgBA,GAAjB,kBAAyB1H,EAAO0E,OAExC8gB,EAAUrE,GAAgBjf,EAAQ,cAAe,KAEpC,aAATlC,GACF+3B,EAAqBrzB,GAGV,UAAT1E,GACFg4B,EAAkBtzB,GAGP,mBAAT1E,GACFi4B,EAA2BvzB,GAGhB,aAAT1E,IACFk4B,EAAoBxzB,GAChB3G,EAAMs5B,UACRc,EAA6BzzB,KAK7BqzB,EAAuB,SAACrzB,GAC5B8gB,EACErE,GACEjf,EACA,WpBtOC,yBAAyBurB,KoBuOL/oB,GAEjB,GADA,sEAMJuzB,EAA6B,SAACvzB,GAClC,IAAIE,GAAQ,EAENF,GAASkD,EAAKxD,WAAaM,IAC/BE,GAAQ,GAGV4gB,EACErE,GAAgBjf,EAAQ,WAAY0C,EAAQ,yBAA2B,MAIrEszB,EAAsB,SAACxzB,GAC3B,IAAIE,GAAQ,EACNgD,EAAKmvB,gBAAkBnvB,EAAKmvB,iBAAmBryB,IACnDE,GAAQ,GAGV4gB,EACErE,GAAgBjf,EAAQ,WAAY0C,EAAQ,yBAA2B,MAIrEuzB,EAA+B,SAACzzB,GACpC,IAAIE,GAAQ,EAENwzB,EAAgBrK,GAAsBC,EAAkBtpB,GAC9DswB,EAAoBoD,GAEhB5W,OAAOyI,OAAOmO,GAAelwB,UAAS,IAAYxD,IACpDE,GAAQ,GAGV4gB,EACErE,GACEjf,EACA,mBACA0C,EAAQ,4BAA8B,MAKtCozB,EAAoB,SAACtzB,GACzB8gB,EACErE,GACEjf,EACA,QACEwC,IAAU6oB,GAAiB7oB,GAAS,uBAAyB,MAIrE,OAAImyB,GAAcxgB,EACT,cAAC,GAAD,CAAerW,KAAM4H,EAAKpD,SAAUkK,UAAW2H,IAGpD,sBAAK1X,UAAWX,EAAQ63B,QAAxB,UACE,qBAAKl3B,UAAWX,EAAQo4B,gBAAxB,SACE,qBACE/2B,IAAK82B,GACLx3B,UAAWX,EAAQ+3B,SACnB32B,IAAI,sBAGR,qBAAKT,UAAWX,EAAQkL,QACxB,qBAAKvK,UAAWX,EAAQsO,SAAxB,SACE,cAAChN,EAAA,EAAD,CACEN,QAAQ,KACRL,UAAWI,IAAWf,EAAQg4B,UAAWh4B,EAAQi4B,aAFnD,SAIGl4B,EAAMs5B,SAAW,uBAAyB,cAG/C,qBAAK14B,UAAWI,IAAWf,EAAQ24B,YAAa34B,EAAQ2N,KAAxD,SACE,cAACrM,EAAA,EAAD,CAAYN,QAAQ,YAApB,2CAIF,sBACEwxB,UAAYlb,GAAW8hB,QAAqBnyB,EAC5CtG,UAAWX,EAAQmhB,MAFrB,SAIE,eAACc,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,eAAC,WAAD,WACGW,EAAMs5B,UACL,qCACG,IACD,cAACpX,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IACTf,EAAQ3D,UACR2D,EAAQxD,gBAId,cAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,WACNzF,KAAK,WACLisB,UAAU,OACVvnB,MAAOkD,EAAKpD,SACZqP,SAAUikB,SA4BlB,cAAC7X,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IAAWf,EAAQ3D,UAAW2D,EAAQxD,gBAGrD,cAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,QACNzF,KAAK,QACLisB,UAAU,QACVvnB,MAAOkD,EAAKzD,MACZ0P,SAAUikB,EACVnM,WAAY5tB,EAAMs5B,aAGtB,cAACpX,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IAAWf,EAAQ3D,UAAW2D,EAAQxD,gBAGrD,eAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,UACE,cAAC,GAAD,CACEza,MAAM,WACNzF,KAAK,WACL2rB,YAAY,EACZjnB,MAAOkD,EAAKxD,SACZyP,SAAUikB,EACV7L,UAAWgL,EAAkB,OAAS,WACtCjL,aACE,cAACW,GAAA,EAAD,CAAgBrxB,SAAS,MAAzB,SACE,cAACiE,EAAA,EAAD,CACEZ,UAAWX,EAAQ3D,UACnBmF,QAAS,kBAAM03B,GAAoBD,IAFrC,SAIGA,EACC,cAAC,KAAD,IAEA,cAAC,KAAD,UAMTl5B,EAAMs5B,UACL,cAAC,GAAD,CACEjzB,SAAUwD,EAAKxD,SACf4pB,iBAAkBA,OAIxB,cAAC/N,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IACdniB,EAAMs5B,UACL,cAACpX,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,mBACNzF,KAAK,iBACL0E,MAAOkD,EAAKmvB,eACZ9K,UAAU,WACVpY,SAAUikB,EACVnM,YAAY,SAKpB,cAAC1L,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQA,MAExB,eAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIvhB,UAAWX,EAAQi4B,YAAtC,UACE,cAAC,GAAD,CACE3gB,QAASA,EACT1Y,MAAOmB,EAAMs5B,SAAW,SAAW,QACnChX,WAAS,EACTG,cAAY,EACZxM,SAAUwN,OAAOC,KAAKvf,GAAQkF,OAAS,IAGzC,eAAC9H,EAAA,EAAD,CACEN,QAAQ,YACRL,UAAWI,IAAWf,EAAQg4B,UAAWh4B,EAAQq4B,eAFnD,UAIE,sBAAM13B,UAAWX,EAAQu4B,SAAzB,mCACA,cAAC,IAAD,CAAMjxB,GAAG,UAAU3G,UAAWX,EAAQw4B,SAAtC,8BAKJ,cAACvW,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACGniB,EAAMs5B,SACL,eAAC/3B,EAAA,EAAD,CACEN,QAAQ,YACRL,UAAWI,IACTf,EAAQg4B,UACRh4B,EAAQq4B,eAJZ,UAOE,sBAAM13B,UAAWX,EAAQu4B,SAAzB,sCAGA,cAAC,IAAD,CAAMjxB,GAAG,SAAS3G,UAAWX,EAAQw4B,SAArC,sBAKF,eAACl3B,EAAA,EAAD,CACEN,QAAQ,YACRL,UAAWI,IACTf,EAAQg4B,UACRh4B,EAAQq4B,eAJZ,UAOE,sBAAM13B,UAAWX,EAAQu4B,SAAzB,oCAGA,cAAC,IAAD,CAAMjxB,GAAG,UAAU3G,UAAWX,EAAQw4B,SAAtC,mCC5dZ17B,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRgP,GAAYjP,IADL,IAEVyX,UAAW,CACT1W,OAAQ,QAGV2B,QAAS,CACP6Y,WAAY,cAYLmjB,GAAQ,WACnB,IAAMr6B,EAAUlD,KAWhB,OACE,qBACE6D,UAAWI,IACTf,EAAQ8K,QACR9K,EAAQoT,UACRpT,EAAQ3B,SAJZ,SAOE,cAAC,GAAD,CAAWi7B,WAjBS,SACtBnzB,EACAC,EACAC,EACAC,GAEAJ,GAAUC,EAAOC,EAAUC,EAAUC,SC7BnCxJ,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRgP,GAAYjP,IADL,IAEVyX,UAAW,CACT0kB,OAAQ,SAEVz5B,QAAS,CACP6Y,WAAY,cAKLojB,GAAS,WACpB,IAAMt6B,EAAUlD,KAkBhB,OACE,qBACE6D,UAAWI,IACTf,EAAQ8K,QACR9K,EAAQoT,UACRpT,EAAQ3B,SAJZ,SAOE,cAAC,GAAD,CAAWi7B,WAxBU,SACvB9yB,EACAJ,EACAD,EACAE,EACAC,IzEwBsB,SACxBE,EACAJ,EACAD,EACAE,EACAC,GAEA,IAAIC,EAAiB,CACnBC,SAAUA,EACVJ,SAAUA,EACVD,MAAOA,GAGFM,MAAM,GAAD,OAAIzJ,GAAJ,gCAAwC6F,EAAS0D,IAC1D7C,MAAK,SAACH,GAAD,OAAwBD,EAAeC,EAAU,WACtDG,MACC,SAACqD,GACCV,GAAYA,EAASU,MAEvB,SAACH,GACCN,GAAYA,EAASM,MyE1CzB2zB,CAAW/zB,EAAUJ,EAAUD,EAAOE,EAAUC,IAiBL+yB,UAAQ,O,qBC9CxC,OAA0B,iDCMnCv8B,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRqW,GAAatW,IADN,IAEV6+B,YAAa,CACXjwB,WAAY5O,EAAMI,QAAQC,QAAQC,MAClCoR,aAAc,OACdvR,MACE8D,IAAOC,SAASlE,EAAMI,QAAQC,QAAQC,MAAO,SAAW,EACpD,QACA,QACNQ,MAAO,OACP4B,QAAS,YACTQ,WAAY,QAEd47B,eAAgB,CACdpvB,UAAW,OAEbqvB,SAAU,CACR9sB,UAAW,UAEb+sB,UAAW,CACTlvB,SAAU,WACVE,WAAY,IACZ9M,WAAY,QAEd+7B,YAAa,CACX7uB,WAAY,YAEd0D,OAAQ,CACNpE,UAAW,QAEbwvB,UAAW,CACTp+B,MAAO,QACPQ,QAAS,QACTC,OAAQ,UAEV,kBAAmB,CACjB49B,KAAM,CACJC,iBAAkB,KAEpBzzB,GAAI,CACFyzB,iBAAkB,IAGtB,uBAAwB,CACtBD,KAAM,CACJC,kBAAmB,KAErBzzB,GAAI,CACFyzB,iBAAkB,MAGtB7kB,OAAQ,CACN3Z,KAAM,OACNoe,OAAQ,UACRK,YAAa,EACbggB,iBAAkB,GAClBC,gBAAiB,IACjBF,iBAAkB,EAClBG,cAAe,QACfC,kBAAmB,OACnBC,eAAgB,QAChBC,wBAAyB,cACzBC,kBAAmB,WACnBC,wBAAyB,WAE3BC,MAAO,CACLj/B,KAAM,OACNoe,OAAQ,UACRK,YAAa,GACbggB,iBAAkB,GAClBS,cAAe,QACfR,gBAAiB,IACjBF,kBAAmB,IACnBG,cAAe,aACfC,kBAAmB,OACnBC,eAAgB,QAChBC,wBAAyB,cACzBC,kBAAmB,WACnBC,wBAAyB,WAE3B,iCAAkC,CAEhCC,MAAO,CACLT,iBAAkB,IAGtB,wEAAyE,CAEvES,MAAO,CACLT,iBAAkB,IAGtBW,KAAM,CACJz+B,QAAS,QACT0+B,iBAAkB,MAClBC,eAAgB,MAChBC,kBAAmB,MACnBC,gBAAiB,aAYVC,GAAkB,SAACh8B,GAC9B,IAAMC,EAAUlD,KAMhB,OACE,qBACE6D,UAAWI,IACTf,EAAQw6B,YACRz6B,EAAMi8B,cAAgBh8B,EAAQy6B,gBAHlC,SAME,sBAAK95B,UAAWX,EAAQ06B,SAAxB,UACE,sBAAM/5B,UAAWX,EAAQ26B,UAAzB,SAAqC56B,EAAMnB,QAC3C,uBACA,sBAAKq9B,QAAQ,kBAAkBt7B,UAAWX,EAAQ66B,UAAlD,UACE,wBAAQl6B,UAAWX,EAAQkW,OAAQmH,GAAG,OAAOC,GAAG,OAAOC,EAAE,SACzD,0BACE5c,UAAWX,EAAQw7B,MACnBU,OAAO,uCAGX,qBAAKv7B,UAAWX,EAAQ46B,YAAxB,SACG76B,EAAM2K,QAAQxB,MAAM,QAAQkB,KAAI,SAACL,EAAciI,GAAf,OAC/B,sBAAMrR,UAAWX,EAAQ07B,KAAzB,SACG3xB,GADiCiI,QAKvCjS,EAAMyB,SACL,cAAC8X,GAAA,EAAD,CACExd,MAAM,UACNkF,QAAQ,YACRgQ,KAAK,SACLrQ,UAAWI,IAAWf,EAAQsS,SAAUtS,EAAQyP,QAChDjO,QAlCU,SAACgR,GACnBzS,EAAMyB,WA4BA,sBCjHJ1E,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRsQ,GAAYvQ,IACZD,EAAWC,IAFJ,IAGV2S,YACAC,qBACAspB,QAAS,CACPp7B,MAAO,OACP4W,SAAU,QACVnW,OAAQ,WAERC,gBAAiB,UACjBT,OAAQ,OACRuO,OAAQ,mBAEV8sB,SAAU,CACRt7B,MAAO,OACPS,OAAQ,OACRmB,QAAS,OACT3B,OAAQ,OACR0W,UAAW,QACXE,MAAO,QAETpI,MAAO,CACLA,MAAO,QAET8sB,UAAW,CACTl8B,MAAOH,EAAMI,QAAQ+C,OAAO4O,OAE9B2qB,cAAe,CACb57B,MAAO,OACPmR,UAAW,QAEbqqB,YAAa,CACXvrB,aAAc,QAEhB4rB,UAAW,CACT57B,OAAQ,OACRmC,WAAY,SAEd05B,SAAU,CACR7sB,UAAW,SACXnD,aAAc,QAEhBiwB,SAAU,CACR18B,MAAOH,EAAMI,QAAQC,QAAQI,KAC7Bq8B,eAAgB,YAChB9sB,WAAY,KAEdwV,MAAO,CACL1kB,MAAO,MACPS,OAAQ,QAEVw7B,WAAY,CACVhtB,UAAW,UAEbitB,YAAa,CACXx7B,gBAAiBxB,EAAMI,QAAQ+C,OAAO4O,MACtC5R,MAAOH,EAAMI,QAAQ+C,OAAOC,MAC5BrC,OAAQ,cAgBRy/B,GAAyB,CAC7Bh2B,MAAO,GACPi2B,KAAM,GACNh2B,SAAU,GACVi2B,gBAAiB,IAGNC,GAAoB,SAACv8B,GAChC,IAAMC,EAAUlD,KADsD,EAE1CmD,mBAAoBk8B,IAFsB,mBAE/DI,EAF+D,KAEvDC,EAFuD,OAGxCv8B,oBAAS,GAH+B,mBAG/DqX,EAH+D,aAIpCrX,oBAAS,IAJ2B,mBAI/Dw8B,EAJ+D,KAIpDC,EAJoD,OAKtBz8B,mBAC9CyvB,IANoE,mBAK/DM,EAL+D,KAK7CgH,EAL6C,OAQ1C/2B,mBAAiC,IARS,mBAQ/DiE,EAR+D,KAQvDsjB,EARuD,KAUhEmV,EAAUC,cASVtF,EAAa,WACjBoF,GAAa,IAETnF,EAAa,SAAC3wB,GAClB4gB,EAAU5gB,IAGNqwB,EAAoB,SAACzkB,GACzB,IAAMxQ,EAAOwQ,EAAEic,cAAczsB,KACvB0E,EAAQ8L,EAAEic,cAAc/nB,MAE9B81B,EAAU,2BAAKD,GAAN,kBAAev6B,EAAO0E,KAC/B8gB,EAAUrE,GAAgBjf,EAAQ,QAAS,KAC3CsjB,EAAUrE,GAAgBjf,EAAQ,QAAS,KAC9B,aAATlC,GACF66B,EAAqBn2B,GAGV,oBAAT1E,GACFm1B,EAAsBzwB,IAIpBm2B,EAAuB,SAACn2B,GAE5B,IAAM0zB,EAAgBrK,GAAsBC,EAAkBtpB,GAC9DswB,EAAoBoD,GAChB5W,OAAOyI,OAAOmO,GAAelwB,UAAS,IAAYxD,EACpD8gB,EAAUrE,GAAgBjf,EAAQ,WAAY,4BAE9CsjB,EAAUrE,GAAgBjf,EAAQ,WAAY,KAI1CwC,GAASA,IAAU61B,EAAOF,gBAC9B7U,EAAUrE,GAAgBjf,EAAQ,WAAY,2BAE9CsjB,EAAUrE,GAAgBjf,EAAQ,WAAY,MAI5CizB,EAAwB,SAACzwB,GACvBA,GAASA,IAAU61B,EAAOn2B,SAC9BohB,EAAUrE,GAAgBjf,EAAQ,WAAY,2BAE9CsjB,EAAUrE,GAAgBjf,EAAQ,WAAY,MAI5C44B,EAAc,WAClBH,EAAQnkB,KAAK,YAGf,OAAIikB,EAEA,eAACxa,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IACf,cAACD,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEtjB,MAAM,OACN8L,QAAQ,gCACRlJ,QAASs7B,EACTd,cAAY,SAOlB,sBAAKr7B,UAAWX,EAAQ63B,QAAxB,UACE,qBAAKx2B,IAAK82B,GAAWx3B,UAAWX,EAAQ+3B,SAAU32B,IAAI,eACtD,qBAAKT,UAAWX,EAAQkL,QACxB,qBAAKvK,UAAWX,EAAQsO,SAAxB,SACE,cAAChN,EAAA,EAAD,CACEN,QAAQ,KACRL,UAAWI,IAAWf,EAAQg4B,UAAWh4B,EAAQi4B,aAFnD,mCAOF,sBACEzF,UAAYlb,GAxFC,SAAC9E,GACpBA,EAAED,iBACFC,EAAEsM,kBAFmC,IAG7B3Y,EAA0Bo2B,EAA1Bp2B,MAAOi2B,EAAmBG,EAAnBH,KAAMh2B,EAAam2B,EAAbn2B,SACrBrG,EAAMg9B,cAAc52B,EAAOi2B,EAAMh2B,EAAUkxB,EAAYC,UAoFTtwB,EACxCtG,UAAWX,EAAQmhB,MAFrB,SAIE,eAACc,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IAAWf,EAAQ3D,UAAW2D,EAAQxD,gBAGrD,cAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,gBACNzF,KAAK,QACLisB,UAAU,OACVvnB,MAAO61B,EAAOp2B,MACd0P,SAAUohB,MAGd,cAAChV,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IAAWf,EAAQ3D,UAAW2D,EAAQxD,gBAGrD,cAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,oBACNzF,KAAK,OACL6T,SAAUohB,EACVhJ,UAAU,WAGd,cAAChM,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IACf,eAACD,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAf,UACE,cAAC,GAAD,CACEza,MAAM,eACNzF,KAAK,WACLisB,UAAU,WACVvnB,MAAO61B,EAAOn2B,SACdyP,SAAUohB,EACVtJ,YAAU,IAEZ,cAAC,GAAD,CACEvnB,SAAUm2B,EAAOn2B,SACjB4pB,iBAAkBA,OAGtB,cAAC/N,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IAEf,cAACD,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAf,SACE,cAAC,GAAD,CACEza,MAAM,mBACNzF,KAAK,kBACLisB,UAAU,WACVvnB,MAAO61B,EAAOF,gBACdxmB,SAAUohB,EACVtJ,YAAU,MAGd,cAAC1L,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQA,MAExB,cAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAIvhB,UAAWX,EAAQi4B,YAAtC,SACE,sBAAKt3B,UAAWX,EAAQuO,kBAAxB,UACE,cAAC,GAAD,CAAc/M,QAASs7B,IACvB,cAAC,GAAD,CACExlB,QAASA,EACT1Y,MAAM,iBACNoX,SAAUwN,OAAOC,KAAKvf,GAAQkF,OAAS,kBCxR5C4zB,GAAgB,WAU3B,OAAO,cAAC,GAAD,CAAmBD,cATE,SAC1B52B,EACA/D,EACAw0B,EACAvwB,EACAC,I7EyIyB,SAC3BH,EACA/D,EACAw0B,EACAvwB,EACAC,GAQOG,MAAMzJ,GAAO,+BAAgCoG,EANjB,CACjC+C,MAAOA,EACP/D,MAAOA,EACPgE,SAAUwwB,KAITlzB,MAAK,SAAC+d,GAAD,OAAmBne,EAAeme,EAAK,WAC5C/d,MACC,WACE2C,GAAYA,OAEd,SAACO,GACCN,GAAYA,EAASM,M6E3JzBm2B,CAAc52B,EAAO/D,EAAOw0B,EAAavwB,EAAUC,OC2BjDxJ,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,mDACRF,EAAWC,IACXuQ,GAAYvQ,IACZ4R,GAAa5R,IAHN,IAIV2S,YACAC,qBACAspB,QAAS,CACPp7B,MAAO,OACP4W,SAAU,QACVnW,OAAQ,WAERC,gBAAiB,UACjBT,OAAQ,OACRuO,OAAQ,mBAEV8sB,SAAU,CACRt7B,MAAO,OACPS,OAAQ,OACRmB,QAAS,OACT3B,OAAQ,OACR0W,UAAW,QACXE,MAAO,QAETpI,MAAO,CACLA,MAAO,QAET8sB,UAAW,CACTl8B,MAAOH,EAAMI,QAAQ+C,OAAO4O,OAE9B2qB,cAAe,CACb57B,MAAO,OACPmR,UAAW,QAEbqqB,YAAa,CACXvrB,aAAc,QAEhB4rB,UAAW,CACT57B,OAAQ,OACRmC,WAAY,SAEd05B,SAAU,CACR7sB,UAAW,SACXnD,aAAc,QAEhBiwB,SAAU,CACR18B,MAAOH,EAAMI,QAAQC,QAAQI,KAC7Bq8B,eAAgB,YAChB9sB,WAAY,KAEdwV,MAAO,CACL1kB,MAAO,MACPS,OAAQ,QAEVw7B,WAAY,CACVhtB,UAAW,UAEbitB,YAAa,CACXx7B,gBAAiBxB,EAAMI,QAAQ+C,OAAO4O,MACtC5R,MAAOH,EAAMI,QAAQ+C,OAAOC,MAC5BrC,OAAQ,cASDugC,GAAa,SAACl9B,GACzB,IAAMC,EAAUlD,KADwC,EAG5BmD,mBAAiC,IAHL,mBAGjDiE,EAHiD,KAGzCsjB,EAHyC,OAI1BvnB,oBAAS,GAJiB,mBAIjDqX,EAJiD,KAIxCC,EAJwC,OAM9BtX,mBAAS,IANqB,mBAMjDkG,EANiD,KAM1C+2B,EAN0C,KAQlDP,EAAUC,cAGVxD,EAAgB,uCAAG,WAAOzgB,GAAP,SAAA3R,EAAA,sDACvB2R,EAAMpG,iBACNoG,EAAMmG,kBACNvH,GAAW,GACXxX,EAAMo9B,eAAeh3B,EAAOmxB,EAAYC,GAJjB,2CAAH,sDAOhBD,EAAa,WACjBqF,EAAQnkB,KAAK,YAGT+e,EAAa,SAACrzB,GAClBsjB,EAAUtjB,GACVqT,GAAW,IAaPyiB,EAAoB,SAACtzB,GACzB8gB,EACErE,GACEjf,EACA,QACEwC,IAAU6oB,GAAiB7oB,GAAS,uBAAyB,MAKrE,OACE,sBAAK/F,UAAWX,EAAQ63B,QAAxB,UACE,qBAAKx2B,IAAK82B,GAAWx3B,UAAWX,EAAQ+3B,SAAU32B,IAAI,oBACtD,qBAAKT,UAAWX,EAAQkL,QACxB,qBAAKvK,UAAWX,EAAQsO,SAAxB,SACE,cAAChN,EAAA,EAAD,CACEN,QAAQ,KACRL,UAAWI,IAAWf,EAAQg4B,UAAWh4B,EAAQi4B,aAFnD,qCAOF,qBAAKt3B,UAAWI,IAAWf,EAAQ2N,KAAnC,SACE,cAACrM,EAAA,EAAD,CAAYN,QAAQ,YAApB,mIAKF,sBACEwxB,UAAYlb,GAAW8hB,QAAqBnyB,EAC5CtG,UAAWX,EAAQmhB,MAFrB,SAIE,eAACc,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,UACE,eAAC,WAAD,WACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQs4B,UAArC,SACE,cAAC,KAAD,CACE33B,UAAWI,IAAWf,EAAQ3D,UAAW2D,EAAQxD,gBAGrD,cAACylB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CACEza,MAAM,QACNzF,KAAK,QACLisB,UAAU,QACVvnB,MAAOP,EACP0P,SAnDW,SAAC8C,GACxB,IAAMjS,EAAQiS,EAAMxE,OAAOzN,MAC3Bw2B,EAASx2B,GACTszB,EAAkBtzB,IAiDNinB,YAAU,SAIhB,cAAC1L,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,cAAC,GAAD,CAAche,OAAQA,MAExB,cAAC+d,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IACf,cAACD,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQi4B,YAArC,SACE,cAAC,GAAD,CAAcz2B,QAjEJ,WAClBm7B,EAAQnkB,KAAK,gBAkEP,cAACyJ,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,IACf,cAACD,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,EAAGvhB,UAAWX,EAAQi4B,YAArC,SACE,cAAC,GAAD,CACE3gB,QAASA,EACT1Y,MAAM,aACNyjB,WAAS,EACTG,cAAY,EACZxM,SAAUwN,OAAOC,KAAKvf,GAAQkF,OAAS,eC7MxCg0B,GAAS,WAQpB,OAAO,cAAC,GAAD,CAAYD,eAPM,SACvBh3B,EACAE,EACAC,I/EqK0B,SAC5BH,EACAE,EACAC,GAEOG,MAAMzJ,GAAO,gCAAiC6F,EAASsD,IAC3DzC,MAAK,SAAC+d,GAAD,OAAmBne,EAAeme,EAAK,WAC5C/d,MACC,WACE2C,GAAYA,OAEd,SAACg3B,GACC/2B,GAAYA,EAAS+2B,M+E/KzBF,CAAeh3B,EAAOE,EAAUC,O,oBCG9BxJ,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX0hC,UAAW,CACTngC,gBAAiBuS,GAAU3T,QAAQC,QAAQI,KAC3CN,MACE8D,IAAOC,SAAS6P,GAAU3T,QAAQC,QAAQI,KAAM,SAAW,EACvD,QACA,SAGRmhC,UAAW,CACTpgC,gBAAiB0S,GAAU9T,QAAQC,QAAQI,KAC3CN,MACE8D,IAAOC,SAASgQ,GAAU9T,QAAQC,QAAQI,KAAM,SAAW,EACvD,QACA,SAGRqL,MAAO,CACLhL,MAAO,IACPC,OAAQ,GACRkR,UAAW,SACXP,aAAc,MACdhP,QAAS,WACTpB,QAAS,gBAEX6G,KAAM,CACJ2H,SAAU,UACV5M,WAAY,aASL2+B,GAAa,SAACz9B,GACzB,IAAMC,EAAUlD,KACV2gC,EAAmE,CACvEhvB,KAAM,CAAE/H,MAAO,YAAaqW,MAAO/c,EAAQs9B,WAC3ChwB,KAAM,CAAE5G,MAAO,YAAaqW,MAAO/c,EAAQu9B,YAG7C,OACE,cAAClnB,GAAA,EAAD,CACE3P,MAAO+2B,EAAU19B,EAAMpE,OAAO+K,MAC9B4P,QAAS,cAAConB,GAAA,EAAD,IACTj2B,MACE,sBACE9G,UAAWI,IAAW08B,EAAU19B,EAAMpE,OAAOohB,MAAO/c,EAAQyH,OAD9D,SAGE,sBAAM9G,UAAWX,EAAQ8D,KAAzB,SAAgC25B,EAAU19B,EAAMpE,OAAO+K,UAG3DiQ,eAAe,SC3DRgnB,GAAgB,WAC3B,IAAMC,EAAen0B,aACnB,SAACC,GAAD,OAAqBA,EAAMuG,MAAMC,KAAKP,aAOlCgB,EAAWoH,cATgB,EAWS9X,mBAAS29B,GAXlB,mBAW1BC,EAX0B,KAWXC,EAXW,KAkBjC,OACE,cAAC7b,GAAA,EAAD,CAAM9H,WAAS,EAAC/a,QAAS,EAAzB,SACE,cAAC6iB,GAAA,EAAD,CAAMlY,MAAI,EAACmY,GAAI,GAAf,SACE,eAAC6b,GAAA,EAAD,CAAYr3B,MAAOm3B,EAAehoB,SARnB,SAAC8C,GCpBG,IAAChJ,EDqBxBmuB,EAAiBnlB,EAAMxE,OAAOzN,OAC9BiK,GCtBwBhB,EDsBHgJ,EAAMxE,OAAOzN,MCrB7B,CACLsK,KAAM3M,EACNsL,UAAWA,MDyBmDquB,KAAG,EAA7D,UACE,cAAC,GAAD,CAAYriC,MAAM,SAClB,cAAC,GAAD,CAAYA,MAAM,iBE5BtBmB,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,eACRgP,GAAYjP,QAGNsiC,GAAS,WACpB,IAAMj+B,EAAUlD,KAChB,OACE,sBAAK6D,UAAWX,EAAQ8K,QAAxB,UACE,cAAC,GAAD,CAAWlM,MAAM,qBACjB,qBAAK+B,UAAWX,EAAQ+K,SAAxB,SACE,qBAAKpK,UAAWX,EAAQmL,gBAAxB,SACE,cAAC,GAAD,YCVJrO,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,CACX8M,SAAU,CACRiD,WAAY,KAGd/M,MAAO,CACLnC,MAAO,OACPsP,WAAY,SACZF,SAAU,SACVC,aAAc,WACdzN,QAAS,eAWF6/B,GAAY,SAACn+B,GACxB,IAAMC,EAAUlD,KAEhB,OACE,cAACiyB,GAAA,EAAD,CAAUtf,QAAM,EAAhB,SACE,cAAC7G,GAAA,EAAD,CACE5M,QAAS+D,EAAM4Y,MAAMwlB,UACrB38B,QAAS,kBAAMzB,EAAMq+B,YAAYr+B,EAAM4Y,MAAM0lB,UAC7ChP,mBAAiB,EACjB1uB,UAAWI,IACTf,EAAQpB,MACRmB,EAAMu+B,kBAAoBv+B,EAAM4Y,MAAM0lB,SAAWr+B,EAAQ0I,eCvB7D5L,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRkS,GAAanS,IACbD,EAAWC,QAUL4iC,GAAY,SAACx+B,GACxB,IAAMC,EAAUlD,KAEZia,EACFhX,EAAMy+B,WACNz+B,EAAMy+B,UAAUp0B,KAAI,SAACuO,EAAkB3G,GACrC,OACE,cAAC,GAAD,CAEE2G,MAAOA,EACPylB,YAAar+B,EAAMq+B,YACnBE,gBAAiBv+B,EAAMu+B,gBAAkBv+B,EAAMu+B,gBAAkB,IAH5D,SAAWtsB,MAmBxB,OAXc,MAAV+E,IACFA,EAAS,CACP,eAACgY,GAAA,EAAD,WACE,cAACpmB,GAAA,EAAD,UACE,cAAC,KAAD,MAEF,cAACC,GAAA,EAAD,CAAc5M,QAAQ,qBAJV,oBASX,cAAC0F,EAAA,EAAD,CAAMf,UAAWX,EAAQoO,KAAzB,SAAgC2I,KC3CnCja,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,uCACRkS,GAAanS,IACbD,EAAWC,IAFJ,IAGVgD,KAAM,CACJ1B,QAAS,cAUFwhC,GAAc,SAAC1+B,GAC1B,IAAMC,EAAUlD,KAD0C,EAElCmD,oBAAS,GAFyB,mBAEnDiB,EAFmD,KAE7C4vB,EAF6C,OAGZ7wB,mBAAS,IAHG,gCAIhBA,sBAJgB,mBAInDy+B,EAJmD,KAIpCC,EAJoC,KAMpD3N,EAAwB,WAC5BF,GAAS5vB,IAWX,OACE,sBAAKP,UAAWX,EAAQhD,KAAxB,UACE,cAAC8D,EAAA,EAAD,CACEE,QAAQ,YACRhB,QAAS,CACPmB,MAAOJ,IACLf,EAAQvC,aACPyD,GAAQlB,EAAQ/B,mBALvB,SASE,eAAC,WAAD,WACE,sBAAK0C,UAAWX,EAAQzB,QAAxB,UACE,qBACEoC,UAAWI,IACTf,EAAQiO,eACP/M,GAAQlB,EAAQrB,MAHrB,SAME,cAAC,GAAD,CACE2vB,YAAY,GACZI,aAAc3uB,EAAM6+B,sBAGvB19B,EACC,cAACK,EAAA,EAAD,CAAYC,QAASwvB,EAArB,SACE,cAAC,KAAD,CAAiBrwB,UAAWX,EAAQ3D,cAGtC,cAACkF,EAAA,EAAD,CAAYC,QAASwvB,EAArB,SACE,cAAC,KAAD,CAAkBrwB,UAAWX,EAAQ3D,iBAI1C6E,GACC,cAAC,GAAD,CACEs9B,UAAWz+B,EAAMy+B,UACjBJ,YA7Cc,SAACC,GACzB,IAAI1lB,EACA5Y,EAAMy+B,YACR7lB,EAAQ5Y,EAAMy+B,UAAU5K,MAAK,SAACjb,GAAD,OAAWA,EAAM0lB,UAAYA,MAE5DM,EAAiBhmB,IAyCP2lB,gBAAe,OAAEI,QAAF,IAAEA,OAAF,EAAEA,EAAeL,eAKxC,sBAAM19B,UAAWX,EAAQ0K,cChFzB5N,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,2BACRkS,GAAanS,IACbiP,GAAYjP,QAWNkjC,GAAyB,SACpC9+B,GAEA,IAAMC,EAAUlD,KADb,EAEyCmD,mBAAS,IAFlD,gCAGqCA,sBAHrC,6BAcH,OACE,qBAAKU,UAAWX,EAAQhD,KAAxB,SAOE,cAAC,GAAD,CACE4hC,kBAAmB7+B,EAAM++B,YACzBN,UAAWz+B,EAAMy+B,eCzCZO,GAAoB,WAC/B,IAAMtV,EAAchgB,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOC,KAAKC,QACjE+G,EAAUnH,aACd,SAACC,GAAD,OAAqBA,EAAMC,OAAOoQ,SAAS9I,iBAGvC6a,EAAQriB,aAAY,SAACC,GAAD,OAAqBA,EAAMC,OAAOmiB,MAAM2E,YAC5D1Z,EAAStN,aACb,SAACC,GAAD,OAAqBA,EAAMuG,MAAM0kB,aAAa5d,UAE1CpG,EAAWoH,cA8BjB,OAbA8B,GAAgB,OAAC4P,QAAD,IAACA,OAAD,EAACA,EAAapR,IAG9BR,qBAAU,WACJjH,EAAQC,KACVgb,GAAUjb,EAAQC,IAAK,GAAvBgb,CAA2Blb,KAE5B,CAACC,EAAQC,MAEZgH,qBAAU,WACRhB,GAAiB,GAAjBA,CAAqBlG,KACpB,IAGD,cAAC,GAAD,CACE8f,SAAU3E,EACV6H,WAhCa,SACf7c,EACAzQ,EACAC,GAEAulB,GAAUjb,EAAQC,IAAKiG,EAAOzQ,EAAUC,EAAxCulB,CAAkDlb,IA4BhDmuB,YAzBc,SAChBhoB,EACAzQ,EACAC,GAEAuQ,GAAiBC,EAAOzQ,EAAUC,EAAlCuQ,CAA4ClG,IAqB1C6tB,UAAWznB,KC/CXja,GAAYC,aAAW,SAACpB,GAAD,OAC3BC,YAAa,eACRyO,GAAc1O,QAIRqjC,GAAe,WAC1B,IAAMh/B,EAAUlD,KAChB,OACE,cAAC,GAAD,UACE,sBAAK6D,UAAWX,EAAQhD,KAAxB,UACE,cAAC,GAAD,CAAW4B,MAAM,iBACjB,cAAC,GAAD,U,mBCEFqgC,GAA8C,CAClDloB,OAAQ,KACR6C,UAAU,EACV+a,aAAc,KACd7I,MAAO,IChBHoT,GAA+B,CACnCvvB,UAAW,aCAEwvB,GALEC,2BAAgB,CAC/BlvB,KDO0B,WAGtB,IAFJxG,EAEG,uDAFKw1B,GACRptB,EACG,uCACH,OAAQA,EAAQd,MACd,KAAK3M,EACH,OAA0B,OAAtByN,EAAQnC,UACH,2BACFjG,GADL,IAEEiG,UAAWmC,EAAQnC,YAGhBjG,EACT,QACE,OAAOA,ICpBXirB,aFqBkC,WAG9B,IAFJjrB,EAEG,uDAFKu1B,GACRntB,EACG,uCACH,OAAQA,EAAQd,MACd,KAAKvM,EACH,YAAuBwC,IAAnB6K,EAAQrR,OACH,2BACFiJ,GADL,IAEEkQ,SAAU9H,EAAQrR,SAGfiJ,EAGT,KAAKpF,EACH,YAAuB2C,IAAnB6K,EAAQiF,OAED,2BACFrN,GADL,IAEEqN,OAAQjF,EAAQiF,SAIfrN,EAGT,KAAKnF,EACH,YAAsB0C,IAAlB6K,EAAQga,MACH,2BACFpiB,GADL,IAEEoiB,MAAOha,EAAQga,QAGZpiB,EAGT,KAAKlF,EACH,YAA6ByC,IAAzB6K,EAAQ6iB,aACH,2BACFjrB,GADL,IAEEirB,aAAc7iB,EAAQ6iB,eAGnBjrB,EAGT,KAAKhF,EACH,QAC0BuC,IAAxB6K,EAAQV,kBACWnK,IAAnB6K,EAAQX,aACclK,IAAtB6K,EAAQpB,UACR,CACA,IAAIqJ,EAAWrQ,EAAMirB,aAAN,aAAyBjrB,EAAMirB,cAAgB,GAC1D0K,EAAetlB,EAAS1J,WAC1B,SAACivB,GAAD,OAAOA,EAAEzuB,MAAQiB,EAAQpB,aAG3B,GAAI2uB,GAAgB,EAAG,CACrB,IAAIzuB,EAAUmJ,EAASslB,GACnBvuB,EAAaF,EAAQE,WAAR,aAAyBF,EAAQE,YAAc,GAC5D4iB,EAAiB5iB,EAAWT,WAC9B,SAAC2B,GAAD,OAAOA,EAAEZ,cAAgBU,EAAQV,eAGnC,GAAIsiB,GAAkB,EAAG,CAEvB,IAAI7a,EAAY/H,EAAW4iB,GAEvBxb,EAAQW,EAAUX,MAAV,aAAsBW,EAAUX,OAAS,GACjDiM,EAAYjM,EAAM7H,WAAU,SAAC2B,GAAD,OAAOA,EAAEb,SAAWW,EAAQX,UAExDgT,GAAa,EAGfjM,EAAMiM,GAAW9S,OAASS,EAAQR,aAIlC4G,EAAMM,KAAK,CACTrH,OAAQW,EAAQX,OAChBE,OAAQS,EAAQR,mBAGf,CAGL,IAAI6K,EAAmB,CACrBhL,OAAQW,EAAQX,OAChBE,OAAQS,EAAQR,cAElBR,EAAW0H,KAAK,CACdpH,YAAaU,EAAQV,YACrB8G,MAAO,CAACiE,KAMZ,OAFApC,EAASslB,GAAgBzuB,EAElB,2BACFlH,GADL,IAEEirB,aAAc5a,KAIpB,OAAOrQ,EAGT,KAAK/E,EACH,GAAyB,OAArBmN,EAAQoJ,UAA2C,OAAtBpJ,EAAQpB,UAAoB,CAC3D,IAAIikB,EAAejrB,EAAMirB,aAAN,aAAyBjrB,EAAMirB,cAAgB,GAC9DvkB,EAAQukB,EAAatkB,WAAU,SAACivB,GAAD,OAAOA,EAAEzuB,MAAQiB,EAAQpB,aAC5D,GAAIN,GAAS,EAAG,CACd,IAAIkkB,EAAcK,EAAavkB,GAG/B,OAFAkkB,EAAYlF,OAAStd,EAAQoJ,SAEtB,2BACFxR,GADL,IAEEirB,aAAcA,KAIpB,OAAOjrB,EAET,KAAK9E,GACH,GAA4B,OAAxBkN,EAAQwiB,YAAsB,CAChC,IAAIK,EAAejrB,EAAMirB,aAAN,aAAyBjrB,EAAMirB,cAAgB,GAC9DvkB,EAAQukB,EAAatkB,WACvB,SAACivB,GAAD,OAAOA,EAAEzuB,MAAQiB,EAAQwiB,YAAYzjB,OASvC,OANIT,GAAS,EACXukB,EAAavkB,GAAS0B,EAAQwiB,YAE9BK,EAAanc,KAAK1G,EAAQwiB,aAGrB,2BACF5qB,GADL,IAEEirB,aAAcA,IAGlB,OAAOjrB,EAET,QACE,OAAOA,MGvJP61B,GAA0C,CAC9CC,WAAY,GACZC,YAAa,GACbla,cAAe,GACfma,mBAAoB,GACpBC,iBAAkB,CAAEC,cAAe,GAAIx9B,MAAO,KCC1Cy9B,GAA+B,CACnCpP,SAAU,KACV7W,UAAU,EACV0U,YAAa,ICXTwR,GAA8B,CAClCj2B,KAAM,KACNwgB,aAAc,KACdziB,MAAM,GCVOu3B,GANEC,2BAAgB,CAC/Bx1B,KDkB0B,WAGtB,IAFJF,EAEG,uDAFKo2B,GACRhuB,EACG,uCACH,OAAQA,EAAQd,MACd,KAAKnM,GACH,OAAuB,OAAnBiN,EAAQrR,OACH,2BACFiJ,GADL,IAEE2gB,aAAcvY,EAAQrR,SAGnBiJ,EAET,KAAK5E,GACH,OAA8B,OAA1BgN,EAAQyY,cACH,2BACF7gB,GADL,IAEE9B,KAAMkK,EAAQyY,gBAGX7gB,EAET,KAAK3E,GACH,OAAqB,OAAjB+M,EAAQlI,KACH,2BACFF,GADL,IAEEG,KAAMiI,EAAQlI,OAGXF,EAET,QACE,OAAOA,IClDXqQ,S5EiD8B,WAG1B,IAFJrQ,EAEG,uDAFKgQ,GACR5H,EACG,uCACH,OAAQA,EAAQd,MACd,KAAK9L,GACH,QAA2B+B,IAAvB6K,EAAQ6H,WAA0B,CAKpC,IAJA,IAAIomB,EAAgCr2B,EAAMiQ,WAAN,aAC5BjQ,EAAMiQ,YACV,GAHgC,WAK3B3H,GAEK+tB,EAAe1vB,WACzB,SAACgI,GAAD,OAAQA,IAAOvG,EAAQ6H,WAAW3H,MAExB,GAEV+tB,EAAevnB,KAAK1G,EAAQ6H,WAAW3H,KAPlCA,EAAI,EAAGA,EAAIF,EAAQ6H,WAAWvQ,OAAQ4I,IAAM,EAA5CA,GAUT,OAAO,2BACFtI,GADL,IAEEiQ,WAAYomB,IAGhB,OAAOr2B,EAET,KAAKrE,GACH,QAAmB4B,IAAf6K,EAAQuG,GAAkB,CAC5B,IAAI2nB,EAAkBt2B,EAAMiQ,WAAN,aAAuBjQ,EAAMiQ,YAAc,GAC7DvJ,EAAQ4vB,EAAgB3vB,WAAU,SAACgI,GAAD,OAAQA,IAAOvG,EAAQuG,MAS7D,OAPIjI,GAAS,GAKX4vB,EAAgBxnB,KAAK1G,EAAQuG,IAExB,2BACF3O,GADL,IAEEiQ,WAAYqmB,IAGhB,OAAOt2B,EAET,KAAKpE,GACH,QAAoB2B,IAAhB6K,EAAQjB,IAAmB,CAC7B,IAAIkvB,EAAiBr2B,EAAMiQ,WAAN,aAAuBjQ,EAAMiQ,YAAc,GAC5DvJ,EAAQ2vB,EAAe1vB,WAAU,SAACgI,GAAD,OAAQA,IAAOvG,EAAQjB,OAG5D,OADAkvB,EAAetnB,OAAOrI,EAAO,GACtB,2BACF1G,GADL,IAEEiQ,WAAYomB,IAGhB,OAAOr2B,EAET,KAAKvE,GACH,GAAoB,OAAhB2M,EAAQjB,IAAc,CACxB,IAAImvB,EAAkBt2B,EAAMiQ,WAAN,aAAuBjQ,EAAMiQ,YAAc,GAEjE,OADAqmB,EAAgBxnB,KAAK1G,EAAQjB,KACtB,2BACFnH,GADL,IAEEiQ,WAAYqmB,IAGhB,OAAOt2B,EACT,KAAKtE,GACH,YAAwB6B,IAApB6K,EAAQmuB,QACH,2BACFv2B,GADL,IAGEiQ,WAAY,IAAIF,QAGb/P,EAET,KAAKnE,GACH,YAAuB0B,IAAnB6K,EAAQrR,OACH,2BACFiJ,GADL,IAEEkQ,SAAU9H,EAAQrR,SAGfiJ,EAET,KAAK1E,GACH,YAA8BiC,IAA1B6K,EAAQb,cACH,2BACFvH,GADL,IAEEuH,cAAea,EAAQb,gBAGpBvH,EAET,KAAKzE,GACH,QAA4BgC,IAAxB6K,EAAQV,kBAAgDnK,IAAnB6K,EAAQX,OAAsB,CAErE,IAAIP,EAAO,eAAQlH,EAAMuH,eACrBH,EAAaF,EAAQE,WAAR,aAAyBF,EAAQE,YAAc,GAC5D4iB,EAAiB5iB,EAAWT,WAC9B,SAAC2B,GAAD,OAAOA,EAAEZ,cAAgBU,EAAQV,eAGnC,GAAIsiB,GAAkB,EAAG,CAEvB,IAAI7a,EAAY/H,EAAW4iB,GAEvBxb,EAAQW,EAAUX,MAAV,aAAsBW,EAAUX,OAAS,GACjDiM,EAAYjM,EAAM7H,WAAU,SAAC2B,GAAD,OAAOA,EAAEb,SAAWW,EAAQX,UAExDgT,GAAa,EAGfjM,EAAMiM,GAAW9S,OAASS,EAAQR,aAIlC4G,EAAMM,KAAK,CACTrH,OAAQW,EAAQX,OAChBE,OAAQS,EAAQR,eAIpBuH,EAAUX,MAAQA,EAElBpH,EAAW4iB,GAAkB7a,MACxB,CAGL,IAAIsD,EAAmB,CACrBhL,OAAQW,EAAQX,OAChBE,OAAQS,EAAQR,cAElBR,EAAW0H,KAAK,CACdpH,YAAaU,EAAQV,YACrB8G,MAAO,CAACiE,KAMZ,OAFAvL,EAAQE,WAAaA,EAEd,2BACFpH,GADL,IAEEuH,cAAeL,IAGnB,OAAOlH,EACT,QACE,OAAOA,I4ExMXggB,WHoBgC,WAG5B,IAFJhgB,EAEG,uDAFK61B,GACRztB,EACG,uCACH,OAAQA,EAAQd,MACd,KAAKxL,GACH,OAAsB,OAAlBsM,EAAQ1P,MACH,2BACFsH,GADL,IAEE81B,WAAY1tB,EAAQ1P,QAGjBsH,EAET,KAAKhE,GACH,OAAsB,OAAlBoM,EAAQ4N,MACH,2BACFhW,GADL,IAEE+1B,YAAa3tB,EAAQ4N,QAGlBhW,EAET,KAAKjE,GACH,OAA8B,OAA1BqM,EAAQyT,cACH,2BACF7b,GADL,IAEE6b,cAAezT,EAAQyT,gBAGpB7b,EAET,KAAK/D,GACH,OAAO,eAAK45B,IACd,QACE,OAAO71B,IGtDXoiB,MFuB0B,WAGtB,IAFJpiB,EAEG,uDAFKm2B,GACR/tB,EACG,uCACH,OAAQA,EAAQd,MACd,KAAKpL,GACH,OAAsB,OAAlBkM,EAAQga,OAAkBha,EAAQga,MAAM1iB,OAAS,EAC5C,2BACFM,GADL,IAEE+mB,SAAU3e,EAAQga,QAGfpiB,EAET,KAAK7D,GACH,GAAqB,OAAjBiM,EAAQoa,KAAe,CAEzB,IAAIJ,EAAQpiB,EAAM+mB,SAAN,aAAqB/mB,EAAM+mB,UAAY,GAC/CwC,EAAYnH,EAAMzb,WACpB,SAACkN,GAAD,OAAOA,EAAE4O,SAAWra,EAAQoa,KAAKC,UAUnC,OAPI8G,GAAa,EAEfnH,EAAMmH,GAAanhB,EAAQoa,KAE3BJ,EAAMtT,KAAK1G,EAAQoa,MAGd,2BACFxiB,GADL,IAEE+mB,SAAU3E,IAGd,OAAOpiB,EAGT,KAAK1D,GACH,GAAsB,OAAlB8L,EAAQga,MAAgB,CAC1B,IAAI2E,EAAwB,GAE5B,OADA3e,EAAQga,MAAM1hB,KAAI,SAAC8hB,GAAD,OAAgBuE,EAASjY,KAAK0T,MACzC,2BACFxiB,GADL,IAEE+mB,SAAUA,IAGd,OAAO/mB,EAGT,KAAK5D,GACH,OAAuB,OAAnBgM,EAAQrR,OACH,2BACFiJ,GADL,IAEEkQ,SAAU9H,EAAQrR,SAGfiJ,EAGT,KAAK3D,GACH,YAAsBkB,IAAlB6K,EAAQgF,MACH,2BACFpN,GADL,IAEE4kB,YAAaxc,EAAQgF,QAGlBpN,EAGT,QACE,OAAOA,M,UGjGPw2B,GAAWC,+BAAoBC,2BAAgBC,OAE/ClB,GAAWC,2BAAgB,CAC/BnvB,MAAOqwB,GACP32B,OAAQ42B,KAMKC,GAHDC,uBAAYtB,GAAUe,ICsBrBQ,OAzBf,WACE,OACE,cAAC,IAAD,CAAUC,MAAOH,GAAjB,SACE,cAAC,IAAD,UAEE,cAAC,GAAD,UACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOI,KAAK,SAASze,UAAW0e,KAChC,cAAC,IAAD,CAAOD,KAAK,SAASze,UAAW0e,KAChC,cAAC,IAAD,CAAOD,KAAK,UAAUze,UAAW0e,KACjC,cAAC,IAAD,CAAOD,KAAK,SAASze,UAAW0e,KAChC,cAAC,IAAD,CAAOD,KAAK,UAAUze,UAAW0e,KACjC,cAAC,IAAD,CAAOD,KAAK,WAAWze,UAAW0e,KAClC,cAAC,IAAD,CAAOD,KAAK,SAASze,UAAW2e,KAChC,cAAC,IAAD,CAAOF,KAAK,eAAeze,UAAW2e,KACtC,cAAC,IAAD,CAAOC,OAAK,EAACH,KAAK,UAAUze,UAAW0e,KAEvC,cAAC,IAAD,CAAUv5B,GAAG,qBCbV05B,GAZS,SAACC,GACnBA,GAAeA,aAAuBC,UACxC,8BAAqBx9B,MAAK,YAAkD,IAA/Cy9B,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,OCHdO,IAASC,OAAO,cAAC,GAAD,IAAS3c,SAAS4c,eAAe,SAUjDV,O","file":"static/js/main.8e7137d5.chunk.js","sourcesContent":["import { createStyles, Theme } from \"@material-ui/core\";\r\n\r\nexport const iconStyles = (theme: Theme) =>\r\n createStyles({\r\n lightIcon: {\r\n color: theme.palette.primary.light,\r\n \"&:hover\": {\r\n color: theme.palette.primary.contrastText,\r\n },\r\n },\r\n shineIcon: {\r\n color: theme.palette.primary.main,\r\n \"&:hover\": {\r\n color: theme.palette.primary.light,\r\n },\r\n },\r\n greenIcon: {\r\n color: theme.palette.primary.main,\r\n },\r\n inheritIcon: {\r\n fill: \"currentColor\",\r\n color: \"currentColor\",\r\n },\r\n mediumIcon: {\r\n width: \"30px\",\r\n height: \"30px\",\r\n },\r\n largeIcon: {\r\n width: \"100px\",\r\n height: \"100px\",\r\n },\r\n tinyIcon: {\r\n width: \"20px\",\r\n height: \"20px\",\r\n },\r\n });\r\n","export const PrimaryGreen = \"#009c3f\";\r\nexport const SecondaryGreen = \"#32af65\";\r\nexport const ThirdGreen = \"#66c38b\";\r\nexport const DarkGreen = \"#007c32\";\r\n\r\nexport const PrimaryRed = \"#9c005d\";\r\nexport const LightRed = \"#af327d\";\r\nexport const DardRed = \"#7c004a\";\r\n\r\nexport const ValidText = \"#3a7d34\";\r\nexport const InvalidText = \"#ec3f41\";\r\nexport const WarningText = \"#FFAB00\";\r\n\r\nexport const WhiteText = \"#ffffff\";\r\nexport const BlackText = \"#000000\";\r\nexport const GreyText = \"#8a8a8a\";\r\nexport const GreyLightText = \"#dddddd\";\r\nexport const BlueText = \"#23BEBE\";\r\n\r\nexport const NavBarWidth = 248;\r\nexport const NavBarCloseWidth = 64;\r\nexport const DrawerWidth = 240;\r\nexport const ToolBarHeight = 80;\r\n","import React, { ReactNode, useState } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n createStyles,\r\n Drawer,\r\n Hidden,\r\n IconButton,\r\n List,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\n\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport { NavBarCloseWidth, NavBarWidth } from \"../../styles/styleConstants\";\r\nimport {\r\n ChevronLeft as ChevronLeftIcon,\r\n Menu as MenuIcon,\r\n} from \"@material-ui/icons\";\r\nimport chroma from \"chroma-js\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n root: {\r\n display: \"block\",\r\n margin: \"0 auto\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: theme.palette.backgroundColor,\r\n },\r\n drawer: {\r\n width: NavBarWidth,\r\n height: \"100%\",\r\n flexShrink: 0,\r\n position: \"fixed\",\r\n zIndex: 2,\r\n },\r\n\r\n drawerClose: {\r\n width: NavBarCloseWidth,\r\n },\r\n drawerPaper: {\r\n width: NavBarWidth,\r\n backgroundColor: theme.palette.primary.main,\r\n transition: theme.transitions.create(\"width\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerPaperClose: {\r\n overflowX: \"hidden\",\r\n width: NavBarCloseWidth,\r\n transition: theme.transitions.create(\"width\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n padding: \"0 8px\",\r\n ...theme.mixins.toolbar,\r\n justifyContent: \"flex-end\",\r\n },\r\n header: {\r\n width: \"100%\",\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n logo: {\r\n width: \"38px\",\r\n height: \"38px\",\r\n },\r\n hide: {\r\n display: \"none !IMPORTANT\",\r\n },\r\n title: {\r\n lineHeight: \"38px\",\r\n color: theme.palette.common.white,\r\n marginLeft: \"8px\",\r\n },\r\n wrap: {\r\n display: \"block\",\r\n width: \"auto\",\r\n height: \"100%\",\r\n marginLeft: NavBarWidth + 16,\r\n marginRight: theme.spacing(2),\r\n transition: theme.transitions.create(\"margin\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n },\r\n wrapClose: {\r\n marginLeft: NavBarCloseWidth + 16,\r\n transition: theme.transitions.create(\"margin\", {\r\n easing: theme.transitions.easing.easeOut,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n },\r\n },\r\n\r\n menuButton: {\r\n color:\r\n chroma.contrast(theme.palette.primary.main, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n })\r\n);\r\n\r\ntype NavbarMenuPropsType = {\r\n children: ReactNode;\r\n menus: ReactNode;\r\n logo: string;\r\n title: string;\r\n};\r\n\r\nexport const NavbarMenu = (props: NavbarMenuPropsType) => {\r\n const classes = useStyles();\r\n const [isDrawerOpen, setIsDrawerOpen] = useState(window.innerWidth > 1400);\r\n const [isHover, setIsHover] = useState(false);\r\n\r\n const handleDrawerOpen = (status: boolean) => () => {\r\n setIsDrawerOpen(status);\r\n };\r\n\r\n const handleDrawerHover = (status: boolean) => () => {\r\n if (!isDrawerOpen) {\r\n setIsHover(status);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n {props.title}\r\n \r\n
\r\n {isDrawerOpen ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n {props.menus}\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n \r\n );\r\n};\r\n","export const getAuthToken = () => {\r\n return getStorage(\"token\");\r\n};\r\n\r\nexport const getStorage = (name: string): string | null => {\r\n return localStorage.getItem(name);\r\n};\r\n\r\nexport const setStorage = (name: string, value: string): void => {\r\n localStorage.setItem(name, value);\r\n};\r\n\r\nexport const removeStorage = (name: string) => {\r\n localStorage.removeItem(name);\r\n};\r\n\r\nexport const setCookie = (cookieName: string, value: string): boolean => {\r\n document.cookie = cookieName + \"=\" + value + \";path=/\";\r\n return true;\r\n};\r\n\r\nexport const removeCookie = (cookieName: string): boolean => {\r\n document.cookie =\r\n cookieName + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;\";\r\n return true;\r\n};\r\n","import { getAuthToken } from \"../helperFunctions/localStorage\";\r\nimport { EnrolmentType } from \"../reducers/profilesReducers\";\r\nimport { EnrolmentInputType } from \"./faceSearchTypes\";\r\n\r\ninterface RequestOptions extends Record {\r\n method: string;\r\n mode: string;\r\n body?: FormData | string | undefined;\r\n headers: Record;\r\n}\r\n\r\nexport const authHeader = (): Record => {\r\n let token = getAuthToken();\r\n if (token) return { Authorization: \"Bearer \" + token };\r\n else {\r\n return {};\r\n }\r\n};\r\n\r\nexport const postInit = (\r\n data?: FormData,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let options: RequestInit = {\r\n method: \"POST\",\r\n mode: \"cors\",\r\n body: data,\r\n headers: authHeader(),\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n\r\n return options;\r\n};\r\n\r\nexport const putInit = (\r\n data?: FormData,\r\n setCookie: boolean = false\r\n): RequestOptions => {\r\n let options: RequestOptions = {\r\n method: \"PUT\",\r\n mode: \"cors\",\r\n body: data,\r\n headers: authHeader(),\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n\r\n return options;\r\n};\r\n\r\nexport const getInit = (\r\n shouldCache: boolean = false,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let headers = authHeader();\r\n\r\n if (shouldCache) {\r\n headers[\"Cache-Control\"] = \"public, max-age=2592000\";\r\n }\r\n\r\n let options: RequestInit = {\r\n method: \"GET\",\r\n mode: \"cors\",\r\n headers: headers,\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n return options;\r\n};\r\n\r\nexport const deleteInit = (\r\n data?: FormData,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let options: RequestInit = {\r\n method: \"DELETE\",\r\n mode: \"cors\",\r\n body: data,\r\n headers: authHeader(),\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n\r\n return options;\r\n};\r\n\r\n// export const postBody = (\r\n// data?: JSON,\r\n// setCookie: boolean = false\r\n// ): RequestOptions => {\r\n// let headers = authHeader();\r\n// headers[\"Content-Type\"] = \"application/json\";\r\n\r\n// let options: RequestOptions = {\r\n// method: \"POST\",\r\n// mode: \"cors\",\r\n// body: JSON.stringify(data),\r\n// headers: headers,\r\n// };\r\n\r\n// if (setCookie) {\r\n// options[\"credentials\"] = \"include\";\r\n// }\r\n\r\n// return options;\r\n// };\r\n\r\nexport interface Data {\r\n username?: string;\r\n password?: string;\r\n userId?: string;\r\n profileId?: string;\r\n name?: string;\r\n email?: string;\r\n details?: Array>;\r\n newEnrolments?: Array;\r\n deleteEnrolments?: Array;\r\n tags?: Array;\r\n passwordChangeModel?: PasswordChangeModel;\r\n updateProfileModel?: UpdateProfileModel;\r\n roleName?:string;\r\n}\r\n\r\nexport interface UpdateProfileModel extends Data {\r\n profileId: string;\r\n accountId?: string;\r\n name?: string;\r\n newEnrolments?: Array;\r\n deleteEnrolments?: Array;\r\n}\r\n\r\nexport interface PasswordChangeModel extends Data {\r\n newPassword: string;\r\n currentPassword: string;\r\n}\r\n\r\nexport interface ResetPasswordModel extends Data {\r\n email: string;\r\n token: string;\r\n password: string;\r\n}\r\n\r\nexport const postBody = (\r\n data?: Data | string,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let headers = authHeader();\r\n headers[\"Content-Type\"] = \"application/json\";\r\n\r\n let options: RequestInit = {\r\n method: \"POST\",\r\n mode: \"cors\",\r\n body: JSON.stringify(data),\r\n headers: headers,\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n console.log(options);\r\n return options;\r\n};\r\n\r\nexport const putBody = (\r\n data?: Data,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let headers = authHeader();\r\n headers[\"Content-Type\"] = \"application/json\";\r\n\r\n let options: RequestInit = {\r\n method: \"PUT\",\r\n mode: \"cors\",\r\n body: JSON.stringify(data),\r\n headers: headers,\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n\r\n return options;\r\n};\r\n\r\nexport const deleteBody = (\r\n data?: Data | string | Array,\r\n setCookie: boolean = false\r\n): RequestInit => {\r\n let headers = authHeader();\r\n headers[\"Content-Type\"] = \"application/json\";\r\n\r\n let options: RequestInit = {\r\n method: \"DELETE\",\r\n mode: \"cors\",\r\n body: JSON.stringify(data),\r\n headers: headers,\r\n };\r\n\r\n if (setCookie) {\r\n options[\"credentials\"] = \"include\";\r\n }\r\n return options;\r\n};\r\n","// eslint-disable-next-line import/no-anonymous-default-export\r\n// Deploy Properties\r\nexport default {\r\n api_root: \"\",\r\n doc_root: \"\",\r\n};\r\n","import { userLogout } from \"./userActions\";\r\n\r\nexport const handleResponse = (\r\n response: Response,\r\n responseType: \"HTML\" | \"JSON\" | \"TEXT\" | \"BUFFER\" | \"IMAGE\" | \"EMPTY\" = \"JSON\"\r\n): any => {\r\n //successfully get a response\r\n if (response.status === 200) {\r\n if (responseType === \"IMAGE\") {\r\n return response.blob().then((blob: Blob): string => {\r\n let objUrl = URL.createObjectURL(blob);\r\n return objUrl;\r\n });\r\n } else if (responseType === \"JSON\") {\r\n return response.json().then((json: JSON) => {\r\n return json;\r\n });\r\n } else if (responseType === \"TEXT\") {\r\n return response.body;\r\n } else if (responseType === \"HTML\") {\r\n return response.text();\r\n } else if (responseType === \"EMPTY\") {\r\n return;\r\n } else {\r\n return Promise.reject({\r\n api: \"Wrong Response Type\",\r\n });\r\n }\r\n }\r\n //unauthorised request detected by the api\r\n else if (response.status === 401) {\r\n //auto logout\r\n userLogout();\r\n }\r\n //content not found\r\n else if (response.status === 400 || response.status === 404) {\r\n return response.json().then((json) => {\r\n return Promise.reject(json.errors);\r\n });\r\n }\r\n //all others responses\r\n else\r\n return Promise.reject({ api: response.status + \" \" + response.statusText });\r\n};\r\n\r\n// export const handleResponse = (response: Response, responseType: \"HTML\") => {\r\n// return response.text();\r\n// };\r\n","//admin-site\r\nexport const SET_THEME: string = \"admin/site/SET_THEME\";\r\n\r\n//admin-participants\r\nexport const GET_ALL_EVENTS = \"admin/participants/GET_ALL_EVENTS\";\r\nexport const GET_ALL_EVENT_RACES = \"admin/participants/GET_ALL_RACES\";\r\nexport const GET_ALL_PARTICIPANTS = \"admin/participants/GET_ALL_PARTICIPANTS\";\r\nexport const SET_UPDATING_PARTICIPANTS =\r\n \"admin/participants/SET_UPDATING_PARTICIPANTS\";\r\nexport const SET_PARTICIPANTS_ENROLMENTS_IMAGE =\r\n \"admin/participants/SET_PARTICIPANTS_ENROLMENTS_IMAGE\";\r\nexport const SET_PARTICIPANTS_AVATAR =\r\n \"admin/participants/SET_PARTICIPANT_AVATAR\";\r\nexport const GET_PARTICIPANT_BY_ID = \"admin/participants/GET_PARTICIPANT_BY_ID\";\r\n//global-user\r\nexport const SET_FETCHING_AUTH = \"global/user/SET_FETCHING_AUTH\";\r\nexport const SET_AUTH = \"global/user/SET_AUTH\";\r\nexport const SET_USER = \"global/user/SET_USER\";\r\n\r\n//global-profiles\r\nexport const SET_ACTIVE_PROFILE = \"global/profiles/SET_ACTIVE_PROFILE\";\r\nexport const SET_FACE_IMAGE = \"global/profiles/SET_FACE_IMAGE\";\r\nexport const LIST_PROFILES = \"global/profiles/LIST_PROFILES\";\r\nexport const ADD_PROFILE = \"global/profiles/ADD_PROFILE\";\r\nexport const DELETE_PROFILES = \"global/profiles/DELETE_PROFILES\";\r\nexport const ADD_RUNNER = \"global/profiles/ADD_RUNNER\";\r\nexport const DELETE_RUNNER = \"global/profiles/DELETE_RUNNER\";\r\nexport const GET_AVATAR = \"global/profiles/GET_AVATAR\";\r\nexport const SET_UPDATING = \"global/profiles/SET_UPDATING;\";\r\nexport const UPDATE_PROFILE = \"global/profiles/UPDATE_PROFILE\";\r\n\r\n//global-facesearch\r\nexport const SAVE_TOKEN = \"global/faceSearch/SAVE_TOKEN\";\r\nexport const DETECT_IMAGE = \"global/faceSearch/DETECT_IMAGE\";\r\nexport const SET_LOADED_IMAGE = \"global/faceSearch/SET_LOADED_IMAGE\";\r\nexport const ADD_IMAGE_TO_FACE_SEARCH =\r\n \"global/faceSearch/ADD_IMAGE_TO_FACE_SEARCH\";\r\nexport const CLEAR_FORM = \"global/faceSearch/CLEAR_FORM\";\r\n\r\n//global-race\r\nexport const GET_RACES = \"global/races/GET_RACES\";\r\nexport const UPDATE_RACE = \"global/races/GET_RACE\";\r\nexport const SET_RACE_UPDATING = \"global/races/SET_RACE_UPDATING\";\r\nexport const SET_SEARCH_QUERY = \"global/races/SET_SEARCH_QUERY\";\r\nexport const GET_SEARCH_RESULTS = \"global/races/GET_SEARCH_RESULTS\";\r\nexport const UPDATE_RACE_ENROLMENTS = \"global/races/UPDATE_RACE_ENROLMENTS\";\r\n","import { Dispatch } from \"redux\";\r\nimport {\r\n Data,\r\n deleteBody,\r\n getInit,\r\n PasswordChangeModel,\r\n postBody,\r\n putBody,\r\n putInit,\r\n ResetPasswordModel,\r\n} from \"../types/requestConstants\";\r\nimport Properties from \"../../Properties\";\r\nimport { handleResponse } from \"./handleResponse\";\r\nimport { removeStorage, setStorage } from \"../helperFunctions/localStorage\";\r\nimport { SET_AUTH, SET_FETCHING_AUTH, SET_USER } from \"./actionNames\";\r\nimport { InfoType } from \"../reducers/userReducers\";\r\n\r\nconst root = Properties.api_root;\r\n\r\nexport const userLogin = (\r\n email: string,\r\n password: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n // let formData: Data = {\r\n // email: email,\r\n // password: password,\r\n // };\r\n // //return Error if no username or email is found\r\n // if (!email) {\r\n // return failBack && failBack({ credentials: \"Email is required\" });\r\n // }\r\n let formData: Data = {\r\n username: email,\r\n password: password\r\n }\r\n\r\n return fetch(`${root}/api/v2/users/login`, postBody(formData))\r\n .then((response: Response): Function => handleResponse(response, \"HTML\"))\r\n .then(\r\n (json: any): void => {\r\n setStorage(\"token\", json);\r\n doneBack && doneBack();\r\n },\r\n (error: any) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\nexport const userSignup = (\r\n username: string,\r\n password: string,\r\n email: string,\r\n doneBack: Function,\r\n failBack: Function\r\n) => {\r\n let formData: Data = {\r\n username: username,\r\n password: password,\r\n email: email,\r\n };\r\n\r\n return fetch(`${root}/api/v2/users/basic/register`, postBody(formData))\r\n .then((response: Response) => handleResponse(response, \"HTML\"))\r\n .then(\r\n (result: JSON) => {\r\n doneBack && doneBack(result);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\nexport const userAssignRole = (\r\n userId: string,\r\n roleName:string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n let formData: Data = {\r\n userId: userId,\r\n roleName: roleName\r\n };\r\n\r\n return fetch(`${root}/api/v1/roles/assign`, postBody(formData))\r\n .then(handleResponse)\r\n .then(\r\n (result) => {\r\n doneBack && doneBack(result);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n//delete current user\r\nexport const userDelete = (\r\n userId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n console.log(\"got to delete\");\r\n console.log(\"userId:\", userId);\r\n userLogout();\r\n\r\n return fetch(`${root}/api/v2/users/delete`, deleteBody(userId))\r\n .then((response: Response) => handleResponse(response, \"TEXT\"))\r\n .then(\r\n (result) => {\r\n console.log(result);\r\n doneBack && doneBack(result);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n//user change their own password\r\nexport const changePassword = (\r\n oldPassword: string,\r\n newPassword: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n let formData: PasswordChangeModel = {\r\n newPassword: newPassword,\r\n currentPassword: oldPassword,\r\n };\r\n\r\n return fetch(root + \"/api/v2/users/password\", putBody(formData))\r\n .then((res: Response) => handleResponse(res, \"TEXT\"))\r\n .then(\r\n () => {\r\n doneBack && doneBack();\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n//user reset password\r\nexport const resetPassword = (\r\n email: string,\r\n token: string,\r\n newPassword: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n let formData: ResetPasswordModel = {\r\n email: email,\r\n token: token,\r\n password: newPassword,\r\n };\r\n\r\n return fetch(root + \"/api/v2/users/password/reset\", putBody(formData))\r\n .then((res: Response) => handleResponse(res, \"TEXT\"))\r\n .then(\r\n () => {\r\n doneBack && doneBack();\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n//user request for token to be sent to email\r\nexport const forgotPassword = (\r\n email: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n return fetch(root + \"/api/v2/users/password/forgot\", postBody(email))\r\n .then((res: Response) => handleResponse(res, \"TEXT\"))\r\n .then(\r\n () => {\r\n doneBack && doneBack();\r\n },\r\n (err) => {\r\n failBack && failBack(err);\r\n }\r\n );\r\n};\r\n\r\nconst removeUserFromPeopleDB = (name: string) => {};\r\n\r\nexport const authenticate = (\r\n shouldSetAuth: boolean = true,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n dispatch({ type: SET_FETCHING_AUTH, status: true });\r\n return fetch(`${root}/api/v2/users/authenticate`, getInit())\r\n .then(handleResponse)\r\n .then(\r\n (json: JSON): void => {\r\n if (shouldSetAuth) {\r\n dispatch({ type: SET_AUTH, authenticated: true });\r\n dispatch({ type: SET_FETCHING_AUTH, status: false });\r\n dispatch({ type: SET_USER, user: json });\r\n }\r\n doneBack && doneBack(json);\r\n },\r\n (errors): void => {\r\n if (shouldSetAuth) {\r\n dispatch({ type: SET_AUTH, authenticatied: false });\r\n dispatch({ type: SET_FETCHING_AUTH, status: false });\r\n }\r\n failBack && failBack(errors);\r\n }\r\n );\r\n};\r\n\r\nexport const userLogout = async () => {\r\n return fetch(`${root}/api/v2/users/logout`, postBody(undefined, true)).then(\r\n () => {\r\n removeStorage(\"token\");\r\n window.location.href = \"login\";\r\n }\r\n );\r\n};\r\n","import {\r\n AccountCircle,\r\n DirectionsRun,\r\n ExitToApp,\r\n Palette,\r\n PhotoLibrary,\r\n SupervisorAccount as ParticipantIcon,\r\n LocalHotel as HotelIcon,\r\n People,\r\n} from \"@material-ui/icons\";\r\nimport { userLogout } from \"../actions/userActions\";\r\nimport { MenuItemType } from \"../types/MenuItemType\";\r\n\r\nexport const NavList: Array = [\r\n {\r\n to: \"profile\",\r\n icon: ,\r\n label: \"Profile\",\r\n key: \"link-to-home\",\r\n onClick: null,\r\n },\r\n\r\n {\r\n to: \"photo\",\r\n icon: ,\r\n label: \"Photo\",\r\n key: \"link-to-photo\",\r\n onClick: null,\r\n auth: [\"Basic\"],\r\n },\r\n\r\n {\r\n to: \"people\",\r\n icon: ,\r\n label: \"People\",\r\n key: \"link-to-people\",\r\n onClick: null,\r\n auth: [\"Admin\"],\r\n },\r\n // {\r\n // to: \"participant\",\r\n // icon: ,\r\n // label: \"Participant\",\r\n // key: \"link-to-participant\",\r\n // onClick: null,\r\n // },\r\n {\r\n to: \"theme\",\r\n icon: ,\r\n label: \"Theme\",\r\n key: \"link-to-theme\",\r\n onClick: null,\r\n },\r\n {\r\n to: \"\",\r\n icon: ,\r\n label: \"Log Out\",\r\n key: \"link-to-logout\",\r\n onClick: userLogout.bind(undefined),\r\n },\r\n];\r\n","import {\r\n createStyles,\r\n ListItemIcon,\r\n ListItemText,\r\n makeStyles,\r\n MenuItem,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport React, { ReactElement } from \"react\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n menuItem: {\r\n \"& $text, & $icon\": {\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n menuItemSelected: {\r\n backgroundColor: theme.palette.primary.light,\r\n \"& $text, & $icon\": {\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n text: {},\r\n icon: {},\r\n iconMargin: {\r\n minWidth: \"36px\",\r\n },\r\n textPadding: {\r\n paddingLeft: 16,\r\n paddingRight: 16,\r\n },\r\n })\r\n);\r\n\r\ntype NavbarMenuItemProps = {\r\n text: string;\r\n icon?: ReactElement;\r\n onClick?: any;\r\n selected?: boolean;\r\n isNested?: boolean;\r\n to?: string;\r\n};\r\n\r\nexport const NavbarMenuItem = (props: NavbarMenuItemProps) => {\r\n const classes = useStyles();\r\n return (\r\n \r\n {props.icon && (\r\n \r\n {props.icon}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { Fragment, ReactElement } from \"react\";\r\nimport { useLocation, Link } from \"react-router-dom\";\r\nimport { NavbarMenuItem } from \"./NavbarMenuItem\";\r\n\r\ntype AuthedNavbarMenuItemProps = {\r\n text: string;\r\n icon: ReactElement;\r\n auth?: Array;\r\n to?: string;\r\n onClick?: any;\r\n};\r\n\r\nexport const AuthedNavbarMenuItem = (props: AuthedNavbarMenuItemProps) => {\r\n const { to, ...other } = props;\r\n const location = useLocation();\r\n\r\n const pathname = location.pathname;\r\n const pathnameArray = pathname.split(\"/\");\r\n const lastPath = pathnameArray[pathnameArray.length - 1];\r\n\r\n const Navbar = ;\r\n const LinkNavbar = to && {Navbar};\r\n\r\n return {to ? LinkNavbar : Navbar};\r\n};\r\n","import React, { Fragment, ReactElement } from \"react\";\r\n\r\nimport LogoImage from \"../../images/AHA-Logo-White.png\";\r\n\r\nimport { NavbarMenu } from \"./navs/NavbarMenu\";\r\nimport { NavList } from \"../container/NavList\";\r\nimport { MenuItemType } from \"../types/MenuItemType\";\r\nimport { AuthedNavbarMenuItem } from \"./navs/AuthedNavbarMenuItem\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\n\r\ntype MenuPropsType = {\r\n children: ReactElement;\r\n};\r\n\r\nexport const Menu = (props: MenuPropsType) => {\r\n const userInfo = useSelector((state: AppState) => state.global.user.info);\r\n\r\n const IsUserAuthorizedForMenuItem = (item : MenuItemType) =>{\r\n if(item.auth){\r\n if(userInfo){\r\n return item.auth.filter(au => !userInfo.roles.includes(au)).length === 0\r\n }\r\n else{\r\n return false;\r\n }\r\n }\r\n else{\r\n return true\r\n }\r\n }\r\n return (\r\n \r\n {NavList.filter(item => IsUserAuthorizedForMenuItem(item) ).map((item: MenuItemType) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n }\r\n />\r\n );\r\n};\r\n","export default \"data:image/png;base64,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\"","import { createStyles, Theme } from \"@material-ui/core\";\r\nimport {\r\n CreateCSSProperties,\r\n CSSProperties,\r\n PropsFunc,\r\n withStyles,\r\n} from \"@material-ui/styles\";\r\n// import { CSSProperties } from \"@material-ui/core/styles/withStyles\";\r\n\r\nconst drawerWidth = 200;\r\n\r\nexport const contentStyles = (theme: Theme) =>\r\n createStyles({\r\n appHeader: {\r\n // width: `calc(100% - ${drawerWidth}px)`,\r\n width: \"100%\",\r\n padding: \"1rem 2rem\",\r\n backgroundColor: theme.palette.background.default,\r\n borderBottom: \"1px solid rgba(63, 63, 66, 0.2)\",\r\n },\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n toolbar: theme.mixins.toolbar,\r\n content: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing(3),\r\n display: \"block\",\r\n margin: \"10px auto\",\r\n },\r\n });\r\n\r\nexport const navBarStyles = (theme: Theme): any => {\r\n return {\r\n drawer: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n },\r\n\r\n drawerPaper: {\r\n width: drawerWidth,\r\n },\r\n toolbar: theme.mixins.toolbar,\r\n };\r\n};\r\n\r\nexport const panelStyles = (theme: Theme) =>\r\n createStyles({\r\n appWrapper: {\r\n display: \"block\",\r\n margin: \"0 auto\",\r\n width: \"100%\",\r\n // height: \"100%\",\r\n },\r\n appMain: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n appPanel: {\r\n minHeight: \"400px\",\r\n background: theme.palette.common.white,\r\n border: \"none\",\r\n clear: \"both\",\r\n display: \"block\",\r\n margin: \"24px 0 0\",\r\n padding: 0,\r\n position: \"relative\",\r\n width: \"100%\",\r\n },\r\n appPanelContent: {\r\n display: \"block\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n // margin: \"15px\",\r\n },\r\n appPanelTop: {\r\n marginTop: \"25px\",\r\n },\r\n \"@media screen and (max-width:959px)\": {\r\n appMain: {\r\n marginTop: \"65px\",\r\n },\r\n },\r\n });\r\n\r\nexport const headerStyles = (theme: Theme) =>\r\n createStyles({\r\n appHeader: {\r\n borderBottom: \"1px solid \" + theme.palette.primary.main,\r\n padding: \"24px 10px\",\r\n },\r\n headerWrapper: {\r\n height: \"32px\",\r\n alignItems: \"center\",\r\n display: \"inline-flex\",\r\n justifyContent: \"space-between\",\r\n width: \"100%\",\r\n },\r\n headerTitle: {\r\n fontSize: \"1.5rem\",\r\n fontStyle: \"inherit\",\r\n fontWeight: \"bold\",\r\n letterSpacing: \"-0.01em\",\r\n lineHeight: \"32px\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n actionItem: {\r\n flex: \"1 0 auto\",\r\n },\r\n });\r\n\r\nexport const inputStyles = (theme: Theme) =>\r\n createStyles({\r\n labelFormControl: {\r\n fontSize: \"1.0625rem\",\r\n fontWeight: 500,\r\n padding: \"10px 5px\",\r\n },\r\n label: {\r\n color: theme.palette.primary.light,\r\n \"&$labelFocused\": {\r\n color: theme.palette.primary.main,\r\n },\r\n \"&$labelError\": {\r\n color: theme.palette.error.main,\r\n },\r\n \"&$labelDisabled\": {\r\n color: theme.palette.grey[100],\r\n },\r\n },\r\n labelFocused: {},\r\n labelError: {},\r\n labelDisabled: {},\r\n\r\n inputFont: {\r\n fontSize: \"0.9375rem\",\r\n paddingLeft: \"20px\",\r\n },\r\n\r\n inputRoot: {\r\n padding: 0,\r\n marginBottom: theme.spacing(2),\r\n \"label + &\": {\r\n marginTop: theme.spacing(4),\r\n },\r\n },\r\n inputDisabled: {},\r\n inputError: {},\r\n\r\n underline: {\r\n \"&:before\": {\r\n borderBottomColor: theme.palette.primary.main,\r\n },\r\n \"&:hover:before\": {\r\n borderBottomColor: theme.palette.grey[500] + \" !IMPORTANT\",\r\n },\r\n \"&:after\": {\r\n borderBottomColor: theme.palette.primary.main,\r\n },\r\n },\r\n borderError: {\r\n borderColor: theme.palette.error.main,\r\n \"&:focus\": {\r\n borderColor: theme.palette.error.main,\r\n boxShadow: \"0 0 0 0.1rem \" + theme.palette.error.main,\r\n },\r\n },\r\n helper: {\r\n paddingLeft: \"20px\",\r\n },\r\n textFieldFormLabel: {\r\n fontSize: \"1.0625rem\",\r\n fontWeight: 500,\r\n padding: \"10px 5px\",\r\n },\r\n\r\n textFieldInput: {\r\n borderRadius: 4,\r\n background: theme.palette.common.white,\r\n border: \"1px solid #ced4da\",\r\n fontSize: \"1rem\",\r\n padding: \"10px 12px\",\r\n width: \"calc(100% - 24px)\",\r\n minWidth: theme.spacing(5),\r\n transition: \"box-shadow 0.25s ease-in-out\",\r\n \"&:focus\": {\r\n borderColor: theme.palette.primary.light,\r\n boxShadow: \"0 0 0 0.2rem \" + theme.palette.primary.dark,\r\n },\r\n },\r\n });\r\n\r\nexport const bannerStyles = (theme: Theme) =>\r\n createStyles({\r\n banner: {\r\n width: \"calc(100% - 32px)\",\r\n height: \"auto\",\r\n margin: \"16px\",\r\n \"&$error\": {\r\n backgroundColor: theme.palette.error.main,\r\n color: theme.palette.common.white,\r\n },\r\n \"&$warning\": {\r\n backgroundColor: theme.palette.warning.main,\r\n color: theme.palette.common.white,\r\n },\r\n \"&$info\": {\r\n backgroundColor: theme.palette.grey[300],\r\n color: theme.palette.common.black,\r\n },\r\n },\r\n error: {},\r\n warning: {},\r\n info: {},\r\n box: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n textAlign: \"center\",\r\n justifyContent: \"center\",\r\n transition: \"color 0.25s ease-in-out\",\r\n whiteSpace: \"pre-wrap\",\r\n padding: \"16px\",\r\n \"& $content\": {\r\n color: \"inherit\",\r\n fontSize: \"0.9375rem\",\r\n fontWeight: \"500\",\r\n lineHeight: \"1.5em\",\r\n },\r\n },\r\n content: {},\r\n \"@keyframes blinker\": {\r\n \"0%\": {\r\n opacity: 1.0,\r\n },\r\n \"50%\": {\r\n opacity: 0.0,\r\n },\r\n \"100%\": {\r\n opacity: 1.0,\r\n },\r\n },\r\n });\r\n\r\nconst ToolBarHeight = 80;\r\nconst DrawWidth = 300;\r\nconst DrawCloseWidth = 64;\r\nconst DrawWideWidth = 520;\r\nconst DrawMidWidth = 320;\r\n\r\nexport const drawerStyles = (theme: Theme) =>\r\n createStyles({\r\n root: {\r\n flexGrow: 1,\r\n height: \"100%\",\r\n zIndex: 1,\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n display: \"flex\",\r\n },\r\n subRoot: {\r\n // height: `calc(100vh - ${ToolBarHeight + 1}px)`,\r\n height: \"100%\",\r\n },\r\n drawerPaper: {\r\n position: \"relative\",\r\n height: `calc(100vh - ${ToolBarHeight + 30}px)`,\r\n width: DrawWidth,\r\n overflowX: \"hidden\",\r\n zIndex: 1800,\r\n transition: theme.transitions.create(\"width\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerPaperClose: {\r\n overflowX: \"hidden\",\r\n transition: theme.transitions.create(\"width\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n width: DrawCloseWidth,\r\n },\r\n\r\n toolbar: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n padding: \"0 8px\",\r\n height: ToolBarHeight,\r\n // position: \"absolute\",\r\n width: \"inherit\",\r\n borderBottom: \"1px solid \" + theme.palette.grey[300],\r\n zIndex: 1200,\r\n backgroundColor: theme.palette.common.white,\r\n },\r\n\r\n toolbarSearch: {\r\n display: \"inherit\",\r\n width: \"inherit\",\r\n },\r\n toolbarInside: {\r\n width: DrawWidth - 2,\r\n marginLeft: 1,\r\n marginRight: 1,\r\n },\r\n\r\n list: {\r\n // marginTop: ToolBarHeight,\r\n zIndex: 1000,\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n height: \"100%\",\r\n },\r\n\r\n //content of the page\r\n content: {\r\n // height: \"inherit\",\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.default,\r\n padding: theme.spacing(3),\r\n // marginTop: ToolBarHeight,\r\n display: \"block\",\r\n },\r\n });\r\n\r\nexport const tableStyles = (theme: Theme): any => {\r\n return {\r\n appTable: {\r\n overflow: \"auto\",\r\n width: \"100%\",\r\n \"& tr\": {\r\n \"&$active\": {\r\n background: \"#e0e0e0\",\r\n color: \"rgba(0,0,0,.87)\",\r\n },\r\n },\r\n \"&$noBorder\": {\r\n border: \"none\",\r\n \"& tr, & th, & td\": {\r\n border: \"none\",\r\n },\r\n },\r\n \"&$lightBorder\": {\r\n border: \"1px solid \" + theme.palette.grey[300],\r\n \"& tr, & th, & td\": {\r\n border: \"1px solid \" + theme.palette.grey[300],\r\n },\r\n },\r\n \"&$innerBorder\": {\r\n borderCollapse: \"collapse\",\r\n borderStyle: \"hidden\",\r\n \"& tr\": {\r\n border: \"1px solid \" + theme.palette.grey[300],\r\n },\r\n },\r\n \"&$center\": {\r\n \"& th, & td\": {\r\n textAlign: \"center\",\r\n },\r\n },\r\n \"&$colorTop\": {\r\n borderTop: \".2em solid \" + theme.palette.primary.light,\r\n },\r\n \"& $border\": {\r\n fontSize: \"0.875rem\",\r\n fontWeight: 600,\r\n },\r\n \"& $normal\": {\r\n fontSize: \"0.875rem\",\r\n },\r\n \"& $compact\": {\r\n padding: \"5px\",\r\n },\r\n \"& $short\": {\r\n paddingLeft: \"5px\",\r\n },\r\n \"& $slim\": {\r\n height: \"32px\",\r\n },\r\n \"& $top\": {\r\n verticalAlign: \"top\",\r\n },\r\n \"& $light\": {\r\n color: theme.palette.grey[300],\r\n },\r\n \"& $inlineDivider\": {\r\n borderTop: \"1px solid \" + theme.palette.primary.light,\r\n height: \"24px\",\r\n },\r\n },\r\n noBorder: {},\r\n lightBorder: {},\r\n innerBorder: {},\r\n center: {},\r\n colorTop: {},\r\n active: {},\r\n border: {},\r\n normal: {},\r\n compact: {},\r\n short: {},\r\n slim: {},\r\n top: {},\r\n light: {},\r\n inlineDivider: {},\r\n // blueShine: {},\r\n \"@media screen and (max-width:959px)\": {\r\n appTable: {\r\n \"& tr\": {\r\n width: \"auto !important\",\r\n display: \"block !important\",\r\n height: \"auto !important\",\r\n },\r\n \"& th, & td\": {\r\n width: \"auto !important\",\r\n display: \"block !important\",\r\n minHeight: \"30px\",\r\n },\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport const colorLabel = () => {\r\n return {\r\n borderRadius: \"2em\",\r\n display: \"inline-block\",\r\n padding: \"2px 12px\",\r\n };\r\n};\r\n\r\nexport const formText:\r\n | CSSProperties\r\n | CreateCSSProperties<{}>\r\n | PropsFunc<{}, CreateCSSProperties<{}>> = {\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n};\r\n\r\nexport const formRightBtnBlock:\r\n | CSSProperties\r\n | CreateCSSProperties<{}>\r\n | PropsFunc<{}, CreateCSSProperties<{}>> = {\r\n width: \"auto\",\r\n display: \"flex\",\r\n justifyContent: \"flex-end\",\r\n margin: \"0 2% 0 2%\",\r\n};\r\n","// @flow\r\nimport createMuiTheme from \"@material-ui/core/styles/createMuiTheme\";\r\n\r\nimport {\r\n WhiteText,\r\n BlackText,\r\n InvalidText,\r\n ValidText,\r\n WarningText,\r\n BlueText,\r\n} from \"./styleConstants\";\r\n\r\ndeclare module \"@material-ui/core/styles/createMuiTheme\" {\r\n interface ThemeOptions {\r\n themeName?: string;\r\n }\r\n interface Theme {\r\n themeName?: string;\r\n }\r\n}\r\n\r\ndeclare module \"@material-ui/core/styles/createPalette\" {\r\n interface PaletteOptions {\r\n main?: string;\r\n backgroundColor?: string;\r\n contentBackgroundColor?: string;\r\n }\r\n\r\n interface Palette {\r\n main?: PaletteColor;\r\n backgroundColor?: string;\r\n contentBackgroundColor?: string;\r\n }\r\n}\r\n\r\nconst basePalette = {\r\n common: {\r\n black: BlackText,\r\n white: WhiteText,\r\n },\r\n error: {\r\n main: InvalidText,\r\n contrast: ValidText,\r\n },\r\n warning: {\r\n main: WarningText,\r\n },\r\n blue: {\r\n main: BlueText,\r\n },\r\n};\r\n\r\nconst baseTheme = createMuiTheme({\r\n overrides: {\r\n MuiTableHead: {\r\n root: {\r\n fontSize: \"0.9375rem\",\r\n },\r\n },\r\n MuiTableBody: {\r\n root: {\r\n fontSize: \"0.9375rem\",\r\n },\r\n },\r\n MuiAccordionDetails: {\r\n root: {\r\n display: \"block\",\r\n },\r\n },\r\n MuiTooltip: {\r\n tooltipPlacementBottom: {\r\n fontSize: \"0.8125rem\",\r\n },\r\n tooltipPlacementTop: {\r\n fontSize: \"0.8125rem\",\r\n },\r\n tooltipPlacementLeft: {\r\n fontSize: \"0.8125rem\",\r\n },\r\n tooltipPlacementRight: {\r\n fontSize: \"0.8125rem\",\r\n },\r\n },\r\n MuiCard: {\r\n root: {\r\n overflow: \"visible\",\r\n },\r\n },\r\n MuiCardContent: {\r\n root: {\r\n padding: \"5px\",\r\n \"&:last-child\": {\r\n paddingBottom: \"5px\",\r\n },\r\n },\r\n },\r\n MuiListItem: {\r\n root: {\r\n \"&$selected, &$selected:hover \": {\r\n backgroundColor: \"#787c7f\",\r\n },\r\n },\r\n button: {\r\n \"&:hover\": {\r\n backgroundColor: \"#787c7f57\",\r\n },\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const blueTheme = createMuiTheme({\r\n ...baseTheme,\r\n themeName: \"blueTheme\",\r\n palette: {\r\n ...basePalette,\r\n primary: {\r\n light: \"#479bba\",\r\n main: \"#1a83a9\",\r\n dark: \"#146887\",\r\n contrastText: BlackText,\r\n },\r\n secondary: {\r\n light: \"#ba6647\",\r\n main: \"#a9401a\",\r\n dark: \"#873314\",\r\n },\r\n },\r\n});\r\n\r\nexport const darkTheme = createMuiTheme({\r\n ...baseTheme,\r\n\r\n themeName: \"darkTheme\",\r\n palette: {\r\n ...basePalette,\r\n primary: {\r\n light: \"#293a4a\",\r\n main: \"#192734\",\r\n dark: \"#1F2833\",\r\n contrastText: BlackText,\r\n },\r\n // backgroundColor: \"#19273430\",\r\n contentBackgroundColor: \"#1927342e\",\r\n backgroundColor: \"000000\",\r\n },\r\n});\r\n","import {\r\n createStyles,\r\n makeStyles,\r\n MuiThemeProvider,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { Fragment, ReactElement } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { AppState } from \"../../Store\";\r\nimport { Menu } from \"../components/Menu\";\r\nimport { panelStyles } from \"../styles/generalStyles\";\r\nimport { blueTheme, darkTheme } from \"../styles/theme\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n })\r\n);\r\n\r\ntype TemplatePropsType = {\r\n children: ReactElement;\r\n};\r\n\r\nconst Template = (props: TemplatePropsType) => {\r\n const classes = useStyles();\r\n //determine which theme to use\r\n const themeNameFromState = useSelector(\r\n (state: AppState) => state.admin.site.themeName\r\n );\r\n const themeList = [blueTheme, darkTheme];\r\n let index = themeList.findIndex((x) => x.themeName === themeNameFromState);\r\n const theme = themeList[index];\r\n\r\n //determine whether a menu is required\r\n const location = useLocation();\r\n const pathnameArray = location.pathname.split(\"/\");\r\n const lastPath = pathnameArray[pathnameArray.length - 1];\r\n\r\n const excludeFromMenuList = [\"login\", \"forgot\", \"reset\", \"signup\", \"success\"];\r\n const isMenuRequired = excludeFromMenuList.indexOf(lastPath) < 0;\r\n\r\n return (\r\n \r\n
\r\n {isMenuRequired ? (\r\n \r\n {props.children}\r\n \r\n ) : (\r\n {props.children}\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Template;\r\n","import { Dispatch } from \"redux\";\r\nimport Properties from \"../../Properties\";\r\nimport { RunnerType } from \"../reducers/profilesReducers\";\r\nimport { RunnerResponseModel } from \"../types/ApiReturnTypes\";\r\nimport { EnrolmentInputType } from \"../types/faceSearchTypes\";\r\nimport {\r\n Data,\r\n deleteBody,\r\n getInit,\r\n postBody,\r\n putBody,\r\n UpdateProfileModel,\r\n} from \"../types/requestConstants\";\r\nimport {\r\n ADD_PROFILE,\r\n LIST_PROFILES,\r\n SET_ACTIVE_PROFILE,\r\n SET_FACE_IMAGE,\r\n SET_UPDATING,\r\n SET_UPDATING_PARTICIPANTS,\r\n} from \"./actionNames\";\r\nimport { handleResponse } from \"./handleResponse\";\r\n\r\nconst root = Properties.api_root;\r\n\r\ninterface ProfileInput extends Data {\r\n name: string;\r\n accountId: string;\r\n}\r\ninterface Guid {\r\n guid: string;\r\n}\r\n/** Create profile */\r\nexport const createProfile = (\r\n name: string,\r\n accountId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n let formData: ProfileInput = {\r\n name: name,\r\n accountId: accountId,\r\n };\r\n dispatch({ type: SET_UPDATING, status: true });\r\n return fetch(`${root}/api/v2/profile`, postBody(formData))\r\n .then(handleResponse)\r\n .then(\r\n (profileId: Guid) => {\r\n dispatch({ type: ADD_PROFILE, uid: profileId.guid });\r\n dispatch({ type: SET_UPDATING, status: false });\r\n doneBack && doneBack();\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n dispatch({ type: SET_UPDATING, status: false });\r\n }\r\n );\r\n};\r\n\r\n/** Get all profiles associate with this account */\r\nexport const fetchProfiles = (\r\n userId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n console.log(\"about to fetch\");\r\n\r\n dispatch({ type: SET_UPDATING, status: true });\r\n // return fetch(\r\n // `${root}/api/v2/people/search?accountId=${accountId ? accountId : \"\"}`,\r\n // getInit()\r\n // )\r\n // .then(handleResponse)\r\n // .then(\r\n // (response) => {\r\n // //get the list of ids belong to this account\r\n // console.log(response);\r\n // let idArray = response.map((eachProfile: any) => eachProfile.uid);\r\n // dispatch({ type: LIST_PROFILES, profileIds: idArray });\r\n // dispatch({ type: SET_UPDATING, status: false });\r\n // doneBack && doneBack(response);\r\n // },\r\n // (error) => {\r\n // console.log(\"fetch fail: \", error);\r\n // dispatch({ type: SET_UPDATING, status: false });\r\n // failBack && failBack(error);\r\n // }\r\n // );\r\n\r\n return fetch(root + \"/api/v2/profile/user/\" + userId, getInit())\r\n .then((response: Response) => handleResponse(response))\r\n .then(\r\n (response: Array) => {\r\n let idArray = response;\r\n dispatch({ type: LIST_PROFILES, profileIds: idArray });\r\n dispatch({ type: SET_UPDATING, status: false });\r\n doneBack && doneBack(response);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/**Get the profile with the specified ID */\r\nexport const fetchActiveProfile = (\r\n profileId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n console.log(profileId);\r\n return fetch(`${root}/api/v2/profile/${profileId}`, getInit())\r\n .then(handleResponse)\r\n .then(\r\n (response) => {\r\n let profile: RunnerType = {\r\n uid: response.profileId,\r\n name: response.name,\r\n enrolments: response.enrolments ? response.enrolments : [],\r\n dateOfBirth: response.dateOfBirth,\r\n };\r\n console.log(response);\r\n dispatch({ type: SET_ACTIVE_PROFILE, activeProfile: profile });\r\n doneBack && doneBack(response);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/** Get enroled photos from faceId, enrolmentId, and profileId */\r\nexport const getEnrolments = (\r\n faceId: string,\r\n enrolmentId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n console.log(\"getting enrolment for \", enrolmentId);\r\n dispatch({ type: SET_UPDATING, status: true });\r\n return fetch(`${root}/api/v2/people/enrolments/faces/${faceId}`, getInit())\r\n .then((response: Response) => handleResponse(response, \"IMAGE\"))\r\n .then(\r\n (imgUrl) => {\r\n dispatch({\r\n type: SET_FACE_IMAGE,\r\n enrolmentId: enrolmentId,\r\n faceId: faceId,\r\n faceImageUrl: imgUrl,\r\n });\r\n dispatch({ type: SET_UPDATING, status: false });\r\n doneBack && doneBack(imgUrl);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/** Update current profile enrolment details */\r\nexport const updateProfile = (\r\n profileId: string,\r\n name: string,\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n accountId?: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n let formData: UpdateProfileModel = {\r\n name: name,\r\n profileId: profileId,\r\n accountId: accountId,\r\n };\r\n\r\n if (newEnrolments.length > 0) {\r\n formData[\"newEnrolments\"] = newEnrolments;\r\n }\r\n\r\n if (deleteEnrolments.length > 0) {\r\n formData[\"deleteEnrolments\"] = deleteEnrolments;\r\n }\r\n\r\n dispatch({ type: SET_UPDATING, status: true });\r\n return fetch(root + \"/api/v2/profile/\" + profileId, putBody(formData))\r\n .then(handleResponse)\r\n .then(\r\n (results: Array) => {\r\n dispatch({ type: SET_UPDATING, status: false });\r\n doneBack && doneBack(results);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\ninterface RemoveProfileType extends Data {\r\n profileIds: Array;\r\n}\r\n\r\nexport const removeProfiles = (\r\n profileIds: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: true });\r\n return fetch(root + \"/api/v2/profile/\", deleteBody(profileIds))\r\n .then((response: Response) => handleResponse(response, \"EMPTY\"))\r\n .then(\r\n () => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n doneBack && doneBack();\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\nexport const downloadFilesById = (\r\n profileId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => {\r\n console.log(\"about to download\");\r\n return fetch(root + \"/api/v1/download/\" + profileId, getInit())\r\n .then((response: Response) => response.blob())\r\n .then(\r\n (result) => {\r\n const url = window.URL.createObjectURL(result);\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.setAttribute(\r\n \"download\",\r\n `enrolments_${new Date().getDate()}${(\r\n \"0\" + new Date().getMonth()\r\n ).slice(-2)}${new Date().getFullYear()}.zip`\r\n );\r\n document.body.appendChild(link);\r\n link.click();\r\n link.parentNode?.removeChild(link);\r\n doneBack && doneBack(result);\r\n },\r\n () => {\r\n console.log(\"error\");\r\n failBack && failBack();\r\n }\r\n );\r\n};\r\n","import { createStyles, makeStyles, Theme, Typography } from \"@material-ui/core\";\r\nimport { ReactNode } from \"react\";\r\nimport { headerStyles } from \"../../styles/generalStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n ...headerStyles(theme),\r\n leftMargin: {\r\n marginLeft: \"10px\",\r\n },\r\n flex: {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n },\r\n })\r\n);\r\n\r\ntype AppHeaderPropType = {\r\n title?: string;\r\n className?: string;\r\n actions?: Array;\r\n};\r\n\r\nexport const AppHeader = (props: AppHeaderPropType) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n
\r\n \r\n {props.title}\r\n \r\n\r\n {props.actions && (\r\n
\r\n {props.actions.map((action: ReactNode, i: number) => {\r\n return (\r\n \r\n {action}\r\n \r\n );\r\n })}\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n","import { createStyles, Theme } from \"@material-ui/core\";\r\nimport chroma from \"chroma-js\";\r\n\r\nexport const buttonStyles = (theme: Theme) =>\r\n createStyles({\r\n darkBtn: {\r\n // color: theme.palette.primary.contrastText,\r\n color:\r\n chroma.contrast(theme.palette.primary.main, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n backgroundColor: theme.palette.primary.main,\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.primary.light,\r\n },\r\n },\r\n linkBtn: {\r\n color: theme.palette.primary.light,\r\n \"&:hover\": {\r\n color: theme.palette.primary.contrastText,\r\n backgroundColor: theme.palette.primary.light,\r\n },\r\n },\r\n primaryBtn: {\r\n backgroundColor: theme.palette.primary.light,\r\n color: theme.palette.common.white,\r\n fontSize: \"0.9375rem\",\r\n border: \"3px solid \" + theme.palette.primary.light,\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.common.white,\r\n },\r\n },\r\n disabledBtn: {\r\n backgroundColor: theme.palette.grey[400],\r\n color: theme.palette.grey[500],\r\n },\r\n lightBtn: {\r\n backgroundColor: theme.palette.common.white,\r\n color: theme.palette.common.black,\r\n border: \"1px solid \" + theme.palette.primary.light,\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.primary.light,\r\n color: theme.palette.primary.contrastText,\r\n },\r\n },\r\n });\r\n","export default __webpack_public_path__ + \"static/media/PersonDefault.9e8c6e58.svg\";","import { useCallback, useRef, useState } from \"react\";\r\n\r\nfunction preventDefault(e: Event) {\r\n if (!isTouchEvent(e)) return;\r\n\r\n if (e.touches.length < 2 && e.preventDefault) {\r\n e.preventDefault();\r\n }\r\n}\r\n\r\nexport function isTouchEvent(e: Event): e is TouchEvent {\r\n return e && \"touches\" in e;\r\n}\r\n\r\ninterface PressHandlers {\r\n onLongPress: (e: React.MouseEvent | React.TouchEvent) => void;\r\n onClick?: (e: React.MouseEvent | React.TouchEvent) => void;\r\n}\r\n\r\ninterface Options {\r\n delay?: number;\r\n shouldPreventDefault?: boolean;\r\n}\r\n\r\n/** Custom hook to define long press action */\r\nexport default function useLongPress(\r\n { onLongPress, onClick }: PressHandlers,\r\n { delay = 300, shouldPreventDefault = true }: Options = {}\r\n) {\r\n const [longPressTriggered, setLongPressTriggered] = useState(false);\r\n const timeout = useRef();\r\n const target = useRef();\r\n\r\n const start = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n e.persist();\r\n const clonedEvent = { ...e };\r\n\r\n if (shouldPreventDefault && e.target) {\r\n e.target.addEventListener(\"touchend\", preventDefault, {\r\n passive: false,\r\n });\r\n target.current = e.target;\r\n }\r\n\r\n timeout.current = setTimeout(() => {\r\n onLongPress(clonedEvent);\r\n setLongPressTriggered(true);\r\n }, delay);\r\n },\r\n [onLongPress, delay, shouldPreventDefault]\r\n );\r\n\r\n const clear = useCallback(\r\n (\r\n e: React.MouseEvent | React.TouchEvent,\r\n shouldTriggerClick = true\r\n ) => {\r\n timeout.current && clearTimeout(timeout.current);\r\n shouldTriggerClick && !longPressTriggered && onClick?.(e);\r\n\r\n setLongPressTriggered(false);\r\n\r\n if (shouldPreventDefault && target.current) {\r\n target.current.removeEventListener(\"touchend\", preventDefault);\r\n }\r\n },\r\n [shouldPreventDefault, onClick, longPressTriggered]\r\n );\r\n\r\n return {\r\n onMouseDown: (e: React.MouseEvent) => start(e),\r\n onTouchStart: (e: React.TouchEvent) => start(e),\r\n onMouseUp: (e: React.MouseEvent) => clear(e),\r\n onMouseLeave: (e: React.MouseEvent) => clear(e, false),\r\n onTouchEnd: (e: React.TouchEvent) => clear(e),\r\n };\r\n}\r\n","import React from \"react\";\r\nimport {\r\n createStyles,\r\n GridList,\r\n GridListTile,\r\n IconButton,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport RemoveIcon from \"@material-ui/icons/Cancel\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport PersonImage from \"../../../images/PersonDefault.svg\";\r\nimport useLongPress from \"../../helperFunctions/useLongPress\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n gridRoot: {\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n gridBlock: {\r\n width: \"100%\",\r\n height: \"auto\",\r\n position: \"relative\",\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: \"-1px\",\r\n top: \"-1px\",\r\n display: \"none\",\r\n cursor: \"pointer\",\r\n color: \"#e100ff\",\r\n padding: \"0\",\r\n },\r\n gridImage: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n minWidth: \"inherit\",\r\n transform: \"translateY(0%)\",\r\n top: \"0%\",\r\n left: \"0%\",\r\n border: \"none\",\r\n transition: theme.transitions.create(\"border\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n item: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n maxHeight: \"150.8px\",\r\n maxWidth: \"150.8px\",\r\n // margin: \"0 15px 15px 0\",\r\n float: \"left\",\r\n \"&:hover\": {\r\n \"& $closeButton\": {\r\n display: \"block\",\r\n },\r\n },\r\n },\r\n\r\n displayChecked: {\r\n transition: theme.transitions.create(\"border\", {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.short,\r\n }),\r\n border: \"10px solid black\",\r\n },\r\n\r\n checked: {},\r\n })\r\n);\r\n\r\ntype FaceDisplayPropsType = {\r\n img?: string | undefined;\r\n longClick?: Function;\r\n isZoomIn?: boolean;\r\n checked?: boolean;\r\n selectImage?: Function;\r\n permanent?: boolean;\r\n name?: string;\r\n};\r\n\r\nexport const FaceDisplay = (props: FaceDisplayPropsType) => {\r\n const classes = useStyles();\r\n\r\n const onLongPress = (e: React.MouseEvent | React.TouchEvent) => {\r\n props.longClick && props.longClick(props.name);\r\n };\r\n\r\n const onClick = () => {\r\n props.selectImage && props.selectImage(props.name);\r\n };\r\n\r\n const longPressEvent = useLongPress({ onLongPress, onClick });\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { Theme } from \"@material-ui/core\";\r\nimport { FaceDisplay } from \"./FaceDisplay\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n enrolItem: {\r\n \"&:hover\": {\r\n \"& $badgeContent\": {\r\n opacity: 0,\r\n },\r\n },\r\n // width: \"150px\",\r\n },\r\n badgeContent: {},\r\n cardImage: {\r\n width: \"375px\",\r\n height: \"375px\",\r\n },\r\n })\r\n);\r\n\r\ntype EnrolmentItemPropsType = {\r\n imgUrl: string | undefined;\r\n removePhoto?: Function;\r\n checked?: boolean;\r\n selectImage?: Function;\r\n longClick?: Function;\r\n name?: string;\r\n};\r\n\r\nexport const EnrolmentItem = (props: EnrolmentItemPropsType) => {\r\n const classes = useStyles();\r\n const [anchorElement, setAnchor] = useState();\r\n const open = !!anchorElement;\r\n\r\n const imageSelect = (event: React.MouseEvent) => {\r\n setAnchor(event.currentTarget);\r\n };\r\n\r\n const imageUnSelect = () => {\r\n setAnchor(null);\r\n };\r\n\r\n const handleImageClick = (e: React.MouseEvent) => {\r\n imageSelect(e);\r\n };\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 );\r\n};\r\n","import React, { ChangeEvent, Fragment, ReactNode } from \"react\";\r\nimport {\r\n Checkbox,\r\n CheckboxClassKey,\r\n createStyles,\r\n FormControl,\r\n FormControlLabel,\r\n InputLabel,\r\n Link,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport { ClassNameMap } from \"@material-ui/styles\";\r\nimport CircleChecked from \"@material-ui/icons/CheckCircle\";\r\nimport CircleUnchecked from \"@material-ui/icons/RadioButtonUnchecked\";\r\n\r\nimport { inputStyles } from \"../../styles/generalStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...inputStyles(theme),\r\n root: {\r\n color: theme.palette.primary.main,\r\n \"&$checked\": {\r\n color: theme.palette.primary.main,\r\n },\r\n },\r\n checked: {},\r\n invalid: {\r\n color: theme.palette.error.main,\r\n \"&$invalidChecked\": {\r\n color: theme.palette.error.main,\r\n },\r\n },\r\n invalidChecked: {},\r\n })\r\n);\r\n\r\ntype SingleCheckBoxPropsType = {\r\n checked: boolean;\r\n name: string;\r\n classes?: Partial> | undefined;\r\n value?: boolean;\r\n label?: string;\r\n linkAtTheEnd?: string;\r\n handleLinkClicked?: Function;\r\n labelPlace?: \"bottom\" | \"top\" | \"end\" | \"start\" | undefined;\r\n isInvalid?: boolean;\r\n isDisabled?: boolean;\r\n hasTitle?: boolean;\r\n isIndeterminated?: boolean;\r\n circle?: boolean;\r\n onChange:\r\n | ((event: ChangeEvent, checked: boolean) => void)\r\n | undefined;\r\n};\r\n\r\nexport const SingleCheckBox = (props: SingleCheckBoxPropsType) => {\r\n const classes = useStyles();\r\n\r\n const CheckNode = (\r\n ,\r\n checkedIcon: ,\r\n })}\r\n />\r\n );\r\n\r\n const handleClickEvent = () => {\r\n props.handleLinkClicked && props.handleLinkClicked();\r\n };\r\n\r\n const CheckNodeWithLabel = (\r\n \r\n {props.value ? \"Enabled\" : \"Disabled\"}\r\n \r\n ) : (\r\n \r\n {props.label}\r\n {props.linkAtTheEnd && (\r\n \r\n {props.linkAtTheEnd}\r\n \r\n )}\r\n \r\n )\r\n }\r\n labelPlacement={props.labelPlace ? props.labelPlace : \"end\"}\r\n />\r\n );\r\n\r\n return {props.label ? CheckNodeWithLabel : CheckNode};\r\n};\r\n","import { Dispatch } from \"redux\";\r\nimport {\r\n GET_ALL_EVENTS,\r\n GET_ALL_PARTICIPANTS,\r\n GET_PARTICIPANT_BY_ID,\r\n SET_PARTICIPANTS_AVATAR,\r\n SET_PARTICIPANTS_ENROLMENTS_IMAGE,\r\n SET_UPDATING_PARTICIPANTS,\r\n} from \"../../global/actions/actionNames\";\r\nimport { handleResponse } from \"../../global/actions/handleResponse\";\r\nimport { RunnerType } from \"../../global/reducers/profilesReducers\";\r\nimport { Data, deleteBody, getInit } from \"../../global/types/requestConstants\";\r\n\r\nimport Properties from \"../../Properties\";\r\nimport { EventType } from \"../types/participantsType\";\r\nconst root = Properties.api_root;\r\n\r\nexport const getEventsByQuery = (\r\n query: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: true });\r\n return fetch(root + \"/api/v2/event/search?nameFilter=\" + query, getInit())\r\n .then(handleResponse)\r\n .then(\r\n (result: Array) => {\r\n dispatch({ type: GET_ALL_EVENTS, events: result });\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n doneBack && doneBack(result);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/**Get all person ids from people database */\r\nexport const fetchAllProfiles = (\r\n count: number,\r\n nameFilter?: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n return fetch(\r\n `${root}/api/v2/people/search?rate=${count}&nameFilter=` + nameFilter,\r\n getInit()\r\n )\r\n .then(handleResponse)\r\n .then(\r\n (response) => {\r\n dispatch({ type: GET_ALL_PARTICIPANTS, participants: response });\r\n doneBack && doneBack(response);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\nexport const fetchProfileById = (\r\n profileId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n return fetch(`${root}/api/v2/profile/${profileId}`, getInit())\r\n .then(handleResponse)\r\n .then(\r\n (response) => {\r\n let profile: RunnerType = {\r\n uid: response.profileId,\r\n name: response.name,\r\n enrolments: response.enrolments ? response.enrolments : [],\r\n dateOfBirth: response.dateOfBirth,\r\n };\r\n console.log(response);\r\n dispatch({ type: GET_PARTICIPANT_BY_ID, participant: profile });\r\n doneBack && doneBack(profile);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/** get image for a profile enrolments */\r\nexport const getProfileEnrolmentsImage = (\r\n profileId: string,\r\n faceId: string,\r\n enrolmentId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: true });\r\n return fetch(`${root}/api/v2/people/enrolments/faces/${faceId}`, getInit())\r\n .then((response: Response) => handleResponse(response, \"IMAGE\"))\r\n .then(\r\n (imgUrl) => {\r\n dispatch({\r\n type: SET_PARTICIPANTS_ENROLMENTS_IMAGE,\r\n profileId: profileId,\r\n enrolmentId: enrolmentId,\r\n faceId: faceId,\r\n faceImageUrl: imgUrl,\r\n });\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n doneBack && doneBack(imgUrl);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_UPDATING_PARTICIPANTS, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/** get avatar for participant */\r\n\r\nexport const getProfileAvatar = (\r\n profileId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n return fetch(`${root}/api/v2/people/${profileId}/cover`, getInit())\r\n .then((response: Response) => handleResponse(response, \"IMAGE\"))\r\n .then((imageUrl) => {\r\n dispatch({\r\n type: SET_PARTICIPANTS_AVATAR,\r\n imageUrl: imageUrl,\r\n profileId: profileId,\r\n });\r\n });\r\n};\r\n\r\nexport const downloadFiles = (\r\n count: number,\r\n nameFilter?: string,\r\n doneBack?: Function, failBack?: Function) => {\r\n return fetch(root + \"/api/v1/download\" + `?rate=${count}&nameFilter=` + nameFilter, getInit())\r\n .then((response: Response) => response.blob())\r\n .then(\r\n (result) => {\r\n const url = window.URL.createObjectURL(result);\r\n const link = document.createElement(\"a\");\r\n link.href = url;\r\n link.setAttribute(\r\n \"download\",\r\n `enrolments_${new Date().getDate()}${(\r\n \"0\" + new Date().getMonth()\r\n ).slice(-2)}${new Date().getFullYear()}.zip`\r\n );\r\n document.body.appendChild(link);\r\n link.click();\r\n link.parentNode?.removeChild(link);\r\n doneBack && doneBack(result);\r\n },\r\n () => {\r\n console.log(\"error\");\r\n failBack && failBack();\r\n }\r\n );\r\n};\r\n","import React, { ChangeEvent, useEffect, useState } from \"react\";\r\nimport {\r\n Button,\r\n CircularProgress,\r\n createStyles,\r\n GridList,\r\n GridListTile,\r\n GridListTileBar,\r\n IconButton,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\nimport StarIcon from \"@material-ui/icons/Star\";\r\nimport { EnrolmentType, RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { EnrolmentItem } from \"./EnrolmentItem\";\r\nimport { SingleCheckBox } from \"../formInputs/SingleCheckBox\";\r\nimport classNames from \"classnames\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { FaceDisplay } from \"./FaceDisplay\";\r\nimport { useFetchImageForEnrolments } from \"../../helperFunctions/useFetchImageForEnrolments\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n grid: {\r\n width: \"100%\",\r\n height: \"auto\",\r\n overflow: \"hidden\",\r\n paddingLeft: \"15px\",\r\n paddingTop: \"15px\",\r\n },\r\n\r\n titleBar: {\r\n background:\r\n \"linear-gradient(to bottom, rgba(0,0,0,0.7) 0%, \" +\r\n \"rgba(0,0,0,0.3) 70%, rgba(0,0,0,0) 100%)\",\r\n height: \"20%\",\r\n },\r\n\r\n icon: {\r\n color: theme.palette.common.white,\r\n },\r\n\r\n checkBox: {\r\n position: \"absolute\",\r\n right: \"-1px\",\r\n top: \"-1px\",\r\n display: \"block\",\r\n cursor: \"pointer\",\r\n color: theme.palette.grey[400],\r\n padding: \"0\",\r\n \"&$checked\": {\r\n color: \"#2196f3\",\r\n },\r\n },\r\n checked: {},\r\n })\r\n);\r\n\r\ntype PermanentPhotoPropsType = {\r\n // enrolments: Array;\r\n profile: RunnerType;\r\n removePhoto?: Function;\r\n edit?: boolean;\r\n editClicked?: Function;\r\n column: number;\r\n displayTag?: boolean;\r\n peoplePage?: boolean;\r\n};\r\n\r\nexport const PermanentPhotos = (props: PermanentPhotoPropsType) => {\r\n const classes = useStyles();\r\n const [loading, setLoading] = useState(true);\r\n const [selecting, setSelecting] = useState(false);\r\n const [selectedIds, setSelectedIds] = useState>([]);\r\n const [enrolments, setEnrolments] = useState>(\r\n props.profile.enrolments\r\n );\r\n\r\n useEffect(() => {\r\n setEnrolments(props.profile.enrolments);\r\n setLoading(false);\r\n }, [props]);\r\n\r\n useFetchImageForEnrolments(\r\n props.profile.uid,\r\n props.profile.enrolments,\r\n props.peoplePage\r\n );\r\n\r\n const handleEditClick = () => {\r\n props.editClicked && props.editClicked();\r\n };\r\n\r\n const resetSelection = () => {\r\n setSelectedIds([]);\r\n setSelecting(false);\r\n };\r\n\r\n const selectionIndex = (id: string): number => {\r\n let index = selectedIds.findIndex((i) => i === id);\r\n return index;\r\n };\r\n\r\n // const toggleCheckBoxDisplay = (name: string) => {\r\n // setSelecting(!selecting);\r\n // addOrRemoveSelection(name);\r\n // };\r\n\r\n const addOrRemoveSelection = (id: string) => {\r\n setSelecting(true);\r\n let currentList = [...selectedIds];\r\n let index = selectionIndex(id);\r\n if (index < 0) {\r\n //added if not in selected\r\n currentList.push(id);\r\n setSelectedIds(currentList);\r\n } else {\r\n //remove if currently selected\r\n currentList.splice(index, 1);\r\n setSelectedIds(currentList);\r\n //remove selection checkboxes if no image is selected\r\n if (currentList.length <= 0) setSelecting(false);\r\n }\r\n };\r\n\r\n const handleCheckBoxClick = (event: ChangeEvent) => {\r\n const name = event.target.name;\r\n setSelecting(true);\r\n addOrRemoveSelection(name);\r\n };\r\n\r\n const removeSelections = () => {\r\n console.log(\"removing..\");\r\n props.removePhoto &&\r\n props.removePhoto(\r\n selectedIds,\r\n () => {\r\n console.log(\"remove done\");\r\n resetSelection();\r\n },\r\n () => {\r\n console.log(\"remove fail\");\r\n }\r\n );\r\n };\r\n\r\n let enrolmentList: Array = [];\r\n if (enrolments && enrolments.length > 0) {\r\n enrolmentList = enrolments.map(\r\n (enrolment) =>\r\n enrolment.faces && (\r\n \r\n -1}\r\n name={enrolment.enrolmentId}\r\n />\r\n {/* {props.displayTag && enrolment.permanent && (\r\n }\r\n classes={{ root: classes.titleBar }}\r\n />\r\n )} */}\r\n\r\n -1}\r\n circle\r\n onChange={handleCheckBoxClick}\r\n />\r\n \r\n )\r\n );\r\n } else {\r\n enrolmentList = [];\r\n }\r\n\r\n if (loading) {\r\n return ;\r\n } else\r\n return (\r\n <>\r\n \r\n {enrolmentList}\r\n \r\n {props.edit && (\r\n \r\n \r\n \r\n )}\r\n\r\n {selecting && (\r\n \r\n Remove selection\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { getProfileEnrolmentsImage } from \"../../admin/actions/participantsActions\";\r\nimport { AppState } from \"../../Store\";\r\nimport { getEnrolments } from \"../actions/profilesActions\";\r\nimport { EnrolmentType } from \"../reducers/profilesReducers\";\r\n\r\nexport const useFetchImageForEnrolments = (\r\n profileId: string,\r\n enrolments: Array | undefined,\r\n peoplePage?: boolean\r\n) => {\r\n // const enrolments = useSelector(\r\n // (state: AppState) => state.global.profiles.activeProfile.enrolments\r\n // );\r\n const dispatch = useDispatch();\r\n const displayedEnrolments = enrolments ? enrolments : [];\r\n useEffect(() => {\r\n if (enrolments !== null && displayedEnrolments.length > 0) {\r\n getEnrolmentImages();\r\n }\r\n }, [displayedEnrolments]);\r\n\r\n const getEnrolmentImages = () => {\r\n for (var i = 0; i < displayedEnrolments.length; i++) {\r\n if (!displayedEnrolments[i].faces[0].imgUrl) {\r\n let faceId = displayedEnrolments[i].faces[0].faceId;\r\n // getEnrolments(faceId, displayedEnrolments[i].enrolmentId)(dispatch);\r\n if (peoplePage) {\r\n getProfileEnrolmentsImage(\r\n profileId,\r\n faceId,\r\n displayedEnrolments[i].enrolmentId\r\n )(dispatch);\r\n } else {\r\n getEnrolments(faceId, displayedEnrolments[i].enrolmentId)(dispatch);\r\n }\r\n }\r\n }\r\n };\r\n};\r\n","import { ColorObject } from \"@material-ui/core\";\r\nimport {\r\n ADD_PROFILE,\r\n ADD_RUNNER,\r\n DELETE_PROFILES,\r\n DELETE_RUNNER,\r\n LIST_PROFILES,\r\n SET_ACTIVE_PROFILE,\r\n SET_FACE_IMAGE,\r\n SET_UPDATING,\r\n} from \"../actions/actionNames\";\r\nimport { Coordinate, PairCoordinateType } from \"../types/faceSearchTypes\";\r\nimport { ProfilesActionTypes } from \"../types/profilesTypes\";\r\n\r\nexport interface FaceIdType {\r\n faceId: string;\r\n imgUrl?: string;\r\n}\r\n\r\nexport interface EnrolmentType {\r\n enrolmentId: string;\r\n faces: Array;\r\n token?: string;\r\n imageUrl?: string;\r\n eyes?: PairCoordinateType;\r\n nose?: Coordinate;\r\n mouth?: PairCoordinateType;\r\n size?: number;\r\n permanent?: boolean;\r\n}\r\n\r\nexport interface RunnerType {\r\n uid: string;\r\n name: string;\r\n enrolments: Array;\r\n dateOfBirth?: Date;\r\n avatar?: string;\r\n}\r\n\r\nexport const initialRunner = {\r\n uid: \"\",\r\n name: \"\",\r\n enrolments: new Array(),\r\n};\r\n\r\nexport interface ProfilesState {\r\n profileIds: Array | null;\r\n activeProfile: RunnerType;\r\n updating: boolean;\r\n}\r\n\r\nconst initialProfilesState: ProfilesState = {\r\n profileIds: null,\r\n activeProfile: initialRunner,\r\n updating: false,\r\n};\r\n\r\nexport const profilesReducers = (\r\n state = initialProfilesState,\r\n actions: ProfilesActionTypes\r\n) => {\r\n switch (actions.type) {\r\n case LIST_PROFILES:\r\n if (actions.profileIds !== undefined) {\r\n let currentRunners: Array = state.profileIds\r\n ? [...state.profileIds]\r\n : [];\r\n //loop through current profiles list\r\n for (let i = 0; i < actions.profileIds.length; i++) {\r\n //check if a runner exist in the list\r\n let index = currentRunners.findIndex(\r\n (id) => id === actions.profileIds[i]\r\n );\r\n if (index < 0) {\r\n //if not, add to the list\r\n currentRunners.push(actions.profileIds[i]);\r\n }\r\n }\r\n return {\r\n ...state,\r\n profileIds: currentRunners,\r\n };\r\n }\r\n return state;\r\n\r\n case ADD_RUNNER:\r\n if (actions.id !== undefined) {\r\n let currentProfiles = state.profileIds ? [...state.profileIds] : [];\r\n let index = currentProfiles.findIndex((id) => id === actions.id);\r\n\r\n if (index > -1) {\r\n //runner is in the current list\r\n //do nothing for now\r\n } else {\r\n //add this runner to the lsit\r\n currentProfiles.push(actions.id);\r\n }\r\n return {\r\n ...state,\r\n profileIds: currentProfiles,\r\n };\r\n }\r\n return state;\r\n\r\n case DELETE_RUNNER:\r\n if (actions.uid !== undefined) {\r\n let currentRunners = state.profileIds ? [...state.profileIds] : [];\r\n let index = currentRunners.findIndex((id) => id === actions.uid);\r\n //removing the index which the uid has\r\n currentRunners.splice(index, 1);\r\n return {\r\n ...state,\r\n profileIds: currentRunners,\r\n };\r\n }\r\n return state;\r\n\r\n case ADD_PROFILE:\r\n if (actions.uid !== null) {\r\n let currentProfiles = state.profileIds ? [...state.profileIds] : [];\r\n currentProfiles.push(actions.uid);\r\n return {\r\n ...state,\r\n profileIds: currentProfiles,\r\n };\r\n }\r\n return state;\r\n case DELETE_PROFILES:\r\n if (actions.runners !== undefined) {\r\n return {\r\n ...state,\r\n //set profiles to a new empty array\r\n profileIds: new Array(),\r\n };\r\n }\r\n return state;\r\n\r\n case SET_UPDATING:\r\n if (actions.status !== undefined) {\r\n return {\r\n ...state,\r\n updating: actions.status,\r\n };\r\n }\r\n return state;\r\n\r\n case SET_ACTIVE_PROFILE:\r\n if (actions.activeProfile !== undefined) {\r\n return {\r\n ...state,\r\n activeProfile: actions.activeProfile,\r\n };\r\n }\r\n return state;\r\n\r\n case SET_FACE_IMAGE:\r\n if (actions.enrolmentId !== undefined && actions.faceId !== undefined) {\r\n //check if enrolment exist\r\n let profile = { ...state.activeProfile };\r\n let enrolments = profile.enrolments ? [...profile.enrolments] : [];\r\n let enrolmentIndex = enrolments.findIndex(\r\n (i) => i.enrolmentId === actions.enrolmentId\r\n );\r\n\r\n if (enrolmentIndex > -1) {\r\n //enrolment exists\r\n let enrolment = enrolments[enrolmentIndex];\r\n //check if the faceId exists in the facesArray\r\n let faces = enrolment.faces ? [...enrolment.faces] : [];\r\n let faceIndex = faces.findIndex((i) => i.faceId === actions.faceId);\r\n\r\n if (faceIndex > -1) {\r\n //faceId exists\r\n //add/replace the image associate to this faceId with a new image\r\n faces[faceIndex].imgUrl = actions.faceImageUrl;\r\n } else {\r\n //faceId does not exists\r\n //append faceId to facesArray and add an image\r\n faces.push({\r\n faceId: actions.faceId,\r\n imgUrl: actions.faceImageUrl,\r\n });\r\n }\r\n //change existed facesArray to the newly modified facesArray\r\n enrolment.faces = faces;\r\n //update the existed enrolment\r\n enrolments[enrolmentIndex] = enrolment;\r\n } else {\r\n //enrolment does not exist\r\n //create a new enrolment\r\n let face: FaceIdType = {\r\n faceId: actions.faceId,\r\n imgUrl: actions.faceImageUrl,\r\n };\r\n enrolments.push({\r\n enrolmentId: actions.enrolmentId,\r\n faces: [face],\r\n });\r\n }\r\n //update the profiles state\r\n profile.enrolments = enrolments;\r\n\r\n return {\r\n ...state,\r\n activeProfile: profile,\r\n };\r\n }\r\n return state;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\nimport { fetchActiveProfile, fetchProfiles } from \"../actions/profilesActions\";\r\nimport { initialRunner, RunnerType } from \"../reducers/profilesReducers\";\r\n\r\nexport const useSelectProfile = (\r\n accountId: string | null | undefined\r\n): RunnerType | null => {\r\n const profileList = useSelector((state: AppState) => state.global.profiles);\r\n const activeProfile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n const [profile, setProfile] = useState(initialRunner);\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n if (accountId) {\r\n //if no profile list\r\n if (!profileList.profileIds) {\r\n //fetch all profiles\r\n fetchProfiles(\r\n accountId,\r\n (ids: Array) => {\r\n if (ids.length > 0) {\r\n getActiveProfile(ids[0]);\r\n } else {\r\n //fail to fetch active profiles\r\n console.log(\"No profile found\");\r\n }\r\n },\r\n () => {\r\n console.log(\"hit fail\");\r\n }\r\n )(dispatch);\r\n } else {\r\n console.log(\"hit\");\r\n }\r\n }\r\n }, [accountId]);\r\n\r\n const getActiveProfile = (profileId: string) => {\r\n fetchActiveProfile(\r\n profileId,\r\n (profile: RunnerType) => {\r\n setProfile(profile);\r\n },\r\n () => {\r\n console.log(\"fetch fail\");\r\n }\r\n )(dispatch);\r\n };\r\n\r\n return profile;\r\n};\r\n","import { Theme } from \"@material-ui/core/styles\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport classNames from \"classnames\";\r\nimport { Search } from \"history\";\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n Coordinate,\r\n PairCoordinateType,\r\n} from \"../../global/types/faceSearchTypes\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n container: {\r\n position: \"relative\",\r\n },\r\n\r\n canvas: {\r\n backgroundSize: \"cover\",\r\n backgroundRepeat: \"no-repeat\",\r\n },\r\n\r\n square: {\r\n fill: theme.palette.common.white,\r\n fillOpacity: 0.05,\r\n transformOrigin: \"centre\",\r\n transformBox: \"fill-box\",\r\n stroke: theme.palette.grey[400],\r\n \"&$selected\": {\r\n stroke: theme.palette.success.light,\r\n },\r\n },\r\n header: {\r\n alignmentBaseline: \"central\",\r\n textAnchor: \"middle\",\r\n fontSize: \"1rem\",\r\n fontWeight: 500,\r\n fill: theme.palette.grey[400],\r\n \"&$selected\": {\r\n fill: theme.palette.success.light,\r\n },\r\n },\r\n eye: {\r\n strokeWidth: 1,\r\n fill: theme.palette.grey[400],\r\n stroke: theme.palette.grey[400],\r\n \"&$selected\": {\r\n stroke: theme.palette.success.light,\r\n fill: theme.palette.success.light,\r\n },\r\n },\r\n selected: {},\r\n })\r\n);\r\ntype SearchType = {\r\n probability: number;\r\n searchName: string;\r\n profileId: string;\r\n};\r\ntype SquareFaceType = {\r\n square: {\r\n start: Coordinate;\r\n width: number;\r\n angle: number;\r\n };\r\n eyes: PairCoordinateType;\r\n mouth: PairCoordinateType;\r\n nose: Coordinate;\r\n search: SearchType;\r\n};\r\n\r\ntype ResultMetricsType = {\r\n matchBlurrinessThreshold: number;\r\n matchConfidenceThreshold: number;\r\n matchFrontalThreshold: number;\r\n isFace: boolean;\r\n};\r\n\r\nexport type CircleFaceType = {\r\n eyes: PairCoordinateType;\r\n mouth: PairCoordinateType;\r\n nose: Coordinate;\r\n centre: Coordinate;\r\n size: number;\r\n search: SearchType;\r\n angle: number;\r\n blurriness: number;\r\n quality: number;\r\n resultMetrics: ResultMetricsType;\r\n frontalness: number;\r\n};\r\n\r\nexport type ImagusFacePickerPropsType = {\r\n imageUrl: string;\r\n faces: Array;\r\n name?: string;\r\n changeEyeSelection: Function;\r\n};\r\n\r\nexport const ImagusFacePicker = (props: ImagusFacePickerPropsType) => {\r\n const classes = useStyles();\r\n const [imageUrl, setImageUrl] = useState(\"\");\r\n const [imageSize, setImageSize] = useState({ width: 0, height: 0 });\r\n const [faces, setFaces] = useState>([]);\r\n const [faceSelection, setFaceSelection] = useState();\r\n const ref = useRef(null);\r\n\r\n useEffect(() => {\r\n loadImage();\r\n }, [props.faces]);\r\n\r\n /** Load selected image */\r\n const loadImage = () => {\r\n setImageUrl(props.imageUrl);\r\n let img = new Image();\r\n\r\n img.onload = () => {\r\n const imgWidth = img.width;\r\n const imgHeight = img.height;\r\n\r\n let containerWidth = 0;\r\n if (ref.current) {\r\n containerWidth = ref.current.offsetWidth;\r\n }\r\n\r\n const width = containerWidth;\r\n const height = (containerWidth * imgHeight) / imgWidth;\r\n\r\n setImageSize({ width: width, height: height });\r\n loadFaces(width / imgWidth);\r\n };\r\n img.src = props.imageUrl;\r\n };\r\n\r\n /** Detect faces in the image */\r\n const loadFaces = (ratio: number) => {\r\n const faces: Array = props.faces.map(\r\n (face: CircleFaceType) => {\r\n let squareFace: SquareFaceType = {\r\n square: {\r\n start: {\r\n x: face.centre.x * ratio - (face.size * ratio) / 2,\r\n y: face.centre.y * ratio - (face.size * ratio) / 2,\r\n },\r\n width: face.size * ratio,\r\n angle: face.angle,\r\n },\r\n eyes: {\r\n left: {\r\n x: face.eyes.left.x * ratio,\r\n y: face.eyes.left.y * ratio,\r\n },\r\n right: {\r\n x: face.eyes.right.x * ratio,\r\n y: face.eyes.right.y * ratio,\r\n },\r\n },\r\n mouth: {\r\n left: {\r\n x: face.mouth.left.x * ratio,\r\n y: face.mouth.left.y * ratio,\r\n },\r\n right: {\r\n x: face.mouth.right.x * ratio,\r\n y: face.mouth.right.y * ratio,\r\n },\r\n },\r\n nose: {\r\n x: face.nose.x * ratio,\r\n y: face.nose.y * ratio,\r\n },\r\n search:\r\n //only display the name if match the profile\r\n\r\n face.search && {\r\n probability: face.search.probability,\r\n searchName: face.search.searchName,\r\n profileId: face.search.profileId,\r\n },\r\n };\r\n\r\n return squareFace;\r\n }\r\n );\r\n\r\n let selected: number | null = null;\r\n if (faces.length > 0) {\r\n selected = 0;\r\n }\r\n\r\n setFaces(faces);\r\n if (selected !== null) {\r\n setFaceSelection(selected);\r\n props.changeEyeSelection(props.faces[selected].eyes, selected);\r\n }\r\n };\r\n\r\n const selectFace = (index: number) => {\r\n setFaceSelection(index);\r\n props.changeEyeSelection(props.faces[index].eyes, index);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n {faces &&\r\n faces.map((eachFace: SquareFaceType, i: number) => {\r\n return (\r\n {\r\n selectFace(i);\r\n }}\r\n >\r\n {/**Drawing the square around the face */}\r\n \r\n {/**Putting the name on the square if probability is > 0.5 */}\r\n {eachFace.search && eachFace.search.probability > 0.5 && (\r\n \r\n {eachFace.search.searchName +\r\n `(${(eachFace.search.probability * 100).toFixed(1)}%)`}\r\n \r\n )}\r\n\r\n {/**Drawing the eyes */}\r\n \r\n \r\n {/** Drawing the nose */}\r\n \r\n {/**Drawing the mouth */}\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n \r\n );\r\n};\r\n","import { Theme } from \"@material-ui/core\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => {\r\n createStyles({\r\n ...buttonStyles(theme),\r\n rightMargin: {\r\n marginRight: \"10px\",\r\n },\r\n });\r\n});\r\n\r\ntype CancelButtonPropsType = {\r\n onClick: Function;\r\n title?: string;\r\n};\r\n\r\nexport const CancelButton = (props: CancelButtonPropsType) => {\r\n const handleClick = () => {\r\n props.onClick();\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { Button, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport React from \"react\";\r\nimport { useCallback, useRef } from \"react\";\r\nimport Webcam from \"react-webcam\";\r\nimport { buttonStyles } from \"../../global/styles/buttonStyles\";\r\nimport AddAPhotoIcon from \"@material-ui/icons/AddAPhoto\";\r\nimport { CancelButton } from \"../../global/components/Buttons/CancelButton\";\r\nimport classNames from \"classnames\";\r\nimport { iconStyles } from \"../../global/styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n ...iconStyles(theme),\r\n webcam: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n })\r\n);\r\n\r\ntype ImagusWebcamPropsType = {\r\n captureCamera: Function;\r\n cancelCamera: Function;\r\n setError?: Function;\r\n isDisabled?: boolean;\r\n};\r\n\r\nexport const ImagusWebcam = (props: ImagusWebcamPropsType) => {\r\n const classes = useStyles();\r\n const webcamRef = useRef(null);\r\n\r\n // const capture = webcamRef.current.getScreenshot();\r\n const videoConstrain = {\r\n facingMode: \"user\",\r\n };\r\n\r\n const captureCamera = props.captureCamera;\r\n const capture = useCallback(() => {\r\n webcamRef !== null &&\r\n webcamRef.current !== null &&\r\n captureCamera(webcamRef.current.getScreenshot());\r\n }, [webcamRef, captureCamera]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n Say \"Cheese\"\r\n \r\n \r\n
\r\n );\r\n};\r\n","import { Button, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport CloudUploadIcon from \"@material-ui/icons/CloudUpload\";\r\nimport DoneIcon from \"@material-ui/icons/Done\";\r\nimport chroma from \"chroma-js\";\r\nimport classNames from \"classnames\";\r\nimport { useState } from \"react\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n ...iconStyles(theme),\r\n fileUploadButton: {\r\n //Mui-Button style (in used because MuiButton do not work with label)\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontWeight: 500,\r\n lineHeight: 1.75,\r\n\r\n //custom styling\r\n height: \"270px\",\r\n color: theme.palette.grey[500],\r\n textTransform: \"capitalize\",\r\n padding: \"22px 0\",\r\n borderRadius: \"3px\",\r\n boxShadow: \"0 0 0 1px \" + theme.palette.primary.main,\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n backgroundColor: theme.palette.contentBackgroundColor,\r\n \"&:hover, &.hover, &:active, &.active\": {\r\n cursor: \"pointer\",\r\n backgroundColor: theme.palette.primary.light,\r\n color:\r\n chroma.contrast(theme.palette.primary.light, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n \"& > SPAN\": {\r\n display: \"block\",\r\n },\r\n },\r\n disabled: {\r\n backgroundColor: theme.palette.grey[200],\r\n \"&:hover, &.hover, &:active, &.active\": {\r\n cursor: \"not-allowed\",\r\n backgroundColor: theme.palette.grey[200],\r\n color: theme.palette.grey[500],\r\n },\r\n \"& > SPAN\": {\r\n display: \"block\",\r\n },\r\n },\r\n fileUploadText: {\r\n fontSize: \"1.5rem\",\r\n lineHeight: \"30px\",\r\n },\r\n fileUploadInput: {\r\n opacity: 0,\r\n width: \"0.1px\",\r\n \"&:hover, &.hover\": {\r\n cursor: \"pointer\",\r\n },\r\n },\r\n })\r\n);\r\n\r\ntype DraggableUploadButtonPropsType = {\r\n uploadFileAction: Function;\r\n disabled?: boolean;\r\n};\r\n\r\nexport const DraggableUploadButton = (\r\n props: DraggableUploadButtonPropsType\r\n) => {\r\n const classes = useStyles();\r\n const [dragged, setDragged] = useState(false);\r\n\r\n const customPreventDefault = (event: React.DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n const inputDragEnter = (event: React.DragEvent) => {\r\n customPreventDefault(event);\r\n setDragged(true);\r\n };\r\n\r\n const inputDragLeave = (event: React.DragEvent) => {\r\n customPreventDefault(event);\r\n setDragged(false);\r\n };\r\n\r\n const inputDrop = (event: React.DragEvent) => {\r\n customPreventDefault(event);\r\n if (event.dataTransfer.files) {\r\n let file = event.dataTransfer.files[0];\r\n props.uploadFileAction(file);\r\n } else {\r\n //set error\r\n }\r\n };\r\n\r\n const inputChange = (event: React.ChangeEvent) => {\r\n if (event.target.files) {\r\n let file = event.target.files[0];\r\n props.uploadFileAction(file);\r\n } else {\r\n //set Error\r\n }\r\n };\r\n return (\r\n
\r\n \r\n \r\n \r\n Drag and Drop\r\n
\r\n Photo here.\r\n
\r\n Or Click to Upload\r\n
\r\n {dragged ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n ButtonBase,\r\n createStyles,\r\n GridList,\r\n GridListTile,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { CancelButton } from \"../../global/components/Buttons/CancelButton\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n image: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n \"&:hover, &$focusVisible\": {\r\n zIndex: 1,\r\n \"& $imageBackdrop\": {\r\n opacity: 0.15,\r\n },\r\n },\r\n },\r\n focusVisible: {},\r\n\r\n imageSrc: {\r\n position: \"absolute\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n backgroundSize: \"cover\",\r\n backgroundPosition: \"center 40%\",\r\n },\r\n imageBackdrop: {\r\n position: \"absolute\",\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n backgroundColor: theme.palette.common.black,\r\n opacity: 0.4,\r\n transition: theme.transitions.create(\"opacity\"),\r\n },\r\n })\r\n);\r\n\r\ntype ImagusSampleImagesPropsType = {\r\n samples: Array;\r\n loadSample: Function;\r\n cancelSample: Function;\r\n};\r\n\r\nexport const ImagusSampleImages = (props: ImagusSampleImagesPropsType) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n \r\n {props.samples.map((sample: string, index: number) => (\r\n \r\n props.loadSample(sample)}\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n
\r\n );\r\n};\r\n","import classNames from \"classnames\";\r\nimport chroma from \"chroma-js\";\r\nimport { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport PhotoCameraIcon from \"@material-ui/icons/PhotoCamera\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n ...iconStyles(theme),\r\n cameraButton: {\r\n //Mui-Button style (in used because MuiButton do not work with label)\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontWeight: 500,\r\n lineHeight: 1.75,\r\n\r\n //custom styling\r\n\r\n height: \"270px\",\r\n color: theme.palette.grey[500],\r\n textTransform: \"capitalize\",\r\n padding: \"22px 0\",\r\n borderRadius: \"3px\",\r\n boxShadow: \"0 0 0 1px \" + theme.palette.primary.main,\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n backgroundColor: theme.palette.contentBackgroundColor,\r\n \"&:hover, &.hover, &:active, &.active\": {\r\n cursor: \"pointer\",\r\n backgroundColor: theme.palette.primary.light,\r\n color:\r\n chroma.contrast(theme.palette.primary.light, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n \"& > SPAN\": {\r\n display: \"block\",\r\n },\r\n },\r\n disabled: {\r\n backgroundColor: theme.palette.grey[200],\r\n \"&:hover, &.hover, &:active, &.active\": {\r\n cursor: \"not-allowed\",\r\n backgroundColor: theme.palette.grey[200],\r\n color: theme.palette.grey[500],\r\n },\r\n \"& > SPAN\": {\r\n display: \"block\",\r\n },\r\n },\r\n buttonText: {\r\n fontSize: \"1.5rem\",\r\n lineHeight: \"30px\",\r\n },\r\n hiddenItem: {\r\n opacity: 0,\r\n width: \"0.1px\",\r\n \"&:hover, &.hover\": {\r\n cursor: \"pointer\",\r\n },\r\n },\r\n })\r\n);\r\n\r\ntype CameraLabelButtonPropsType = {\r\n enableCamera: Function;\r\n disabled?: boolean;\r\n};\r\n\r\nexport const CameraLabelButton = (props: CameraLabelButtonPropsType) => {\r\n const classes = useStyles();\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (!props.disabled) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n props.enableCamera();\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, {\r\n forwardRef,\r\n ForwardRefRenderFunction,\r\n useImperativeHandle,\r\n useState,\r\n} from \"react\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n Button,\r\n CircularProgress,\r\n Grid,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport PhotoCameraIcon from \"@material-ui/icons/PhotoCamera\";\r\n\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { ImagusWebcam } from \"../../../ImagusComponents/Gadgets/ImagusWebCam\";\r\nimport { DraggableUploadButton } from \"../Buttons/DraggableUploadButton\";\r\n\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport { formText } from \"../../styles/generalStyles\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { ImagusSampleImages } from \"../../../ImagusComponents/Gadgets/ImagusSampleImages\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { CameraLabelButton } from \"../Buttons/CameraLabelButton\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n ...buttonStyles(theme),\r\n formText,\r\n helpText: {\r\n color: theme.palette.primary.light,\r\n width: \"100%\",\r\n textAlign: \"left\",\r\n fontSize: \"0.875rem\",\r\n padding: \"5px\",\r\n },\r\n\r\n tipsText: {\r\n color: theme.palette.error.light,\r\n width: \"100%\",\r\n textAlign: \"left\",\r\n fontSize: \"0.875rem\",\r\n fontWeight: 500,\r\n padding: \"5px\",\r\n },\r\n\r\n rightMargin: {\r\n marginRight: \"5px\",\r\n },\r\n })\r\n);\r\n\r\ntype FaceUploadPropsType = {\r\n uploadFile: Function;\r\n samples: Array;\r\n setImageError: Function;\r\n disabled?: boolean;\r\n selectPermanent: Function;\r\n permanent?: boolean;\r\n setDisplaySubmit?: Function;\r\n};\r\n\r\ntype FaceUploadHandle = {\r\n resetFaceUpload: () => void;\r\n};\r\n\r\nconst FaceUpload: ForwardRefRenderFunction<\r\n FaceUploadHandle,\r\n FaceUploadPropsType\r\n> = (props: FaceUploadPropsType, forwardedRef) => {\r\n const classes = useStyles();\r\n const [loading, setLoading] = useState(false);\r\n const [panel, setPanel] = useState({\r\n isCamera: false,\r\n isSample: false,\r\n isFromPermanent: false,\r\n });\r\n\r\n useImperativeHandle(forwardedRef, () => ({\r\n resetFaceUpload() {\r\n resetForm();\r\n },\r\n }));\r\n\r\n const switchToCamera = () => {\r\n setPanel({ isCamera: true, isSample: false, isFromPermanent: false });\r\n props.setDisplaySubmit && props.setDisplaySubmit(false);\r\n };\r\n\r\n const switchToSamples = () => {\r\n setPanel({ isCamera: false, isSample: true, isFromPermanent: false });\r\n props.setDisplaySubmit && props.setDisplaySubmit(false);\r\n };\r\n\r\n const switchToPermanents = () => {\r\n setPanel({ isCamera: false, isSample: false, isFromPermanent: true });\r\n props.setDisplaySubmit && props.setDisplaySubmit(false);\r\n };\r\n\r\n const resetForm = () => {\r\n setPanel({ isCamera: false, isSample: false, isFromPermanent: false });\r\n setLoading(false);\r\n props.setDisplaySubmit && props.setDisplaySubmit(true);\r\n };\r\n\r\n const captureCamera = async (data: string) => {\r\n setLoading(true);\r\n let file;\r\n fetch(data)\r\n .then((res: Response) => res.blob())\r\n .then((blob: Blob) => {\r\n file = new Blob([blob], { type: \"image/jpeg\" });\r\n props.uploadFile(file, uploadDone, uploadFail);\r\n });\r\n };\r\n\r\n const loadSampleImages = async (imgUrl: string) => {\r\n setLoading(true);\r\n let file;\r\n fetch(imgUrl)\r\n .then((res: Response) => res.blob())\r\n .then((blob: Blob) => {\r\n //create a new blob with the url\r\n file = new Blob([blob], { type: \"image/jpeg\" });\r\n //upload the blob\r\n props.uploadFile(file, uploadDone, uploadFail);\r\n });\r\n };\r\n\r\n //---------handle select permanent-----------//\r\n const handleSelectPermanent = (imgUrl: string) => {\r\n // setLoading(true);\r\n //get the enrolmentId\r\n props.selectPermanent(imgUrl);\r\n resetForm();\r\n };\r\n\r\n //-------------------------------------------//\r\n\r\n const uploadDone = (canvas: HTMLCanvasElement) => {\r\n const img = canvas.toDataURL(\"image/jpeg\");\r\n resetForm();\r\n //set to the next process\r\n };\r\n\r\n const uploadFail = () => {\r\n //setError\r\n setLoading(false);\r\n };\r\n\r\n let content: JSX.Element;\r\n if (loading) {\r\n content = (\r\n
\r\n \r\n
\r\n );\r\n } else if (panel.isCamera) {\r\n content = (\r\n \r\n );\r\n } else if (panel.isSample) {\r\n content = (\r\n \r\n );\r\n } else if (panel.isFromPermanent) {\r\n content = (\r\n \r\n );\r\n } else {\r\n content = (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n Capture Photo\r\n */}\r\n \r\n \r\n\r\n \r\n Photo requirements:\r\n
* Good quality photos\r\n
* Uniform lighting with appropriate brightness and contrast to\r\n show natural skin tone\r\n
* Face centred and looking at the camera straight on; not\r\n tilted in any direction\r\n \r\n\r\n {/* \r\n {props.permanent ? \"Sample Gallery\" : \"From Permanent List\"}\r\n */}\r\n
\r\n
\r\n );\r\n }\r\n\r\n return content;\r\n};\r\n\r\nexport default forwardRef(FaceUpload);\r\n","export default __webpack_public_path__ + \"static/media/Abdel_Nasser_Assidi_0002.6d291a39.jpg\";","export default __webpack_public_path__ + \"static/media/George_HW_Bush_0006.041d2cad.jpg\";","export default __webpack_public_path__ + \"static/media/George_P_Bush_0002.248330dc.jpg\";","export default __webpack_public_path__ + \"static/media/George_W_Bush_0042.7cc9d094.jpg\";","export default __webpack_public_path__ + \"static/media/George_W_Bush_0098.d2afcec8.jpg\";","export default __webpack_public_path__ + \"static/media/Michael_Jackson_0002.efac34ee.jpg\";","export default __webpack_public_path__ + \"static/media/Michael_Jackson_0004.b6e1306e.jpg\";","import {\r\n Button,\r\n CircularProgress,\r\n createStyles,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n fullWidth: {\r\n width: \"100%\",\r\n },\r\n autoWidth: {\r\n width: \"auto\",\r\n },\r\n })\r\n);\r\n\r\ntype SubmitButtonPropsType = {\r\n loading?: boolean;\r\n disabled?: boolean;\r\n title?: string;\r\n fullWidth?: boolean;\r\n isMainButton?: boolean;\r\n id?: string;\r\n onClick?: Function;\r\n};\r\n\r\nexport const SubmitButton = (props: SubmitButtonPropsType) => {\r\n const classes = useStyles();\r\n\r\n const handleSubmit = () => {\r\n props.onClick && props.onClick();\r\n };\r\n\r\n if (props.loading) {\r\n return (\r\n \r\n \r\n Sending...\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n {props.title ? props.title : \"Submit\"}\r\n \r\n );\r\n }\r\n};\r\n","import {\r\n Coordinate,\r\n ImageType,\r\n PairCoordinateType,\r\n PersonType,\r\n} from \"../types/faceSearchTypes\";\r\n\r\nexport const cropImageToFace = (img: HTMLCanvasElement, person: PersonType) => {\r\n let canvas: HTMLCanvasElement = document.createElement(\"canvas\");\r\n let radius = 0;\r\n\r\n if (person.radius) {\r\n radius = person.radius;\r\n } else if (person.size) {\r\n radius = person.size / 2;\r\n }\r\n canvas.width = radius * 2;\r\n canvas.height = radius * 2;\r\n\r\n let ctx = canvas.getContext(\"2d\");\r\n if (ctx) {\r\n ctx.drawImage(\r\n img,\r\n person.centre.x - radius,\r\n person.centre.y - radius,\r\n radius * 2,\r\n radius * 2,\r\n 0,\r\n 0,\r\n radius * 2,\r\n radius * 2\r\n );\r\n let image = new Image();\r\n image.id = \"pic\";\r\n image.src = canvas.toDataURL();\r\n return image;\r\n }\r\n return null;\r\n};\r\n\r\nexport const distanceBetweenEyes = (eyes: PairCoordinateType): number => {\r\n const x = Math.abs(eyes.left.x - eyes.right.x);\r\n const y = Math.abs(eyes.left.y - eyes.right.y);\r\n\r\n return Math.sqrt(x * x + y * y);\r\n};\r\n\r\nexport const radiusFromEyes = (eyes: PairCoordinateType): number => {\r\n const betweenEyes = distanceBetweenEyes(eyes);\r\n return betweenEyes + betweenEyes / 2;\r\n};\r\n\r\nexport const faceCentreFromEyes = (eyes: PairCoordinateType): Coordinate => {\r\n const x1 = eyes.left.x;\r\n const y1 = eyes.left.y; // First diagonal point\r\n const x2 = eyes.right.x;\r\n const y2 = eyes.right.y; // Second diagonal point\r\n\r\n const xc = (x1 + x2) / 2;\r\n const yc = (y1 + y2) / 2; // Center point\r\n const xd = (x1 - x2) / 2;\r\n const yd = (y1 - y2) / 2; // Half-diagonal\r\n\r\n const x3 = xc + yd;\r\n const y3 = yc - xd;\r\n\r\n // return th corner of square\r\n return {\r\n x: x3,\r\n y: y3,\r\n };\r\n};\r\n\r\nexport const rotationFromEyes = (eyes: PairCoordinateType): number => {\r\n const run = eyes.left.x - eyes.right.x;\r\n const rise = eyes.left.y - eyes.right.y;\r\n\r\n return Math.atan2(rise, run) + Math.PI;\r\n};\r\n\r\nexport const relativeEyesFromFace = (radius: number): PairCoordinateType => {\r\n const centreOffset = radius / 3;\r\n\r\n return {\r\n left: {\r\n x: -centreOffset,\r\n y: -centreOffset,\r\n },\r\n right: {\r\n x: centreOffset,\r\n y: -centreOffset,\r\n },\r\n };\r\n};\r\n\r\nexport const toDegrees = (angle: number): number => {\r\n return angle * (180 / Math.PI);\r\n};\r\n\r\nexport const toRadians = (angle: number): number => {\r\n return angle * (Math.PI / 180);\r\n};\r\n\r\nexport const rotate = (\r\n center: Coordinate,\r\n rotatee: Coordinate,\r\n rads: number\r\n): Coordinate => {\r\n let rot: Coordinate = { x: 0, y: 0 };\r\n const cosA = Math.cos(rads);\r\n const sinA = Math.sin(rads);\r\n\r\n rot.x =\r\n center.x + cosA * (rotatee.x - center.x) - sinA * (rotatee.y - center.y);\r\n rot.y =\r\n center.y + sinA * (rotatee.x - center.x) + cosA * (rotatee.y - center.y);\r\n return rot;\r\n};\r\n\r\nexport const getEyes = (\r\n center: Coordinate,\r\n size: number,\r\n angle: number\r\n): PairCoordinateType => {\r\n // console.log(centre, size, angle)\r\n\r\n let eyes: PairCoordinateType = {\r\n left: { x: 0, y: 0 },\r\n right: { x: 0, y: 0 },\r\n };\r\n // set eye pos assuming angle of zero...\r\n eyes.left.x = center.x - size / 6.0;\r\n eyes.right.x = center.x + size / 6.0;\r\n eyes.left.y = center.y - size / 6.0;\r\n eyes.right.y = center.y - size / 6.0;\r\n\r\n const rads = (angle * Math.PI) / 180.0;\r\n\r\n eyes.left = rotate(center, eyes.left, rads);\r\n eyes.right = rotate(center, eyes.right, rads);\r\n\r\n return eyes;\r\n};\r\n","import { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport classNames from \"classnames\";\r\nimport { bannerStyles } from \"../styles/generalStyles\";\r\nimport { iconStyles } from \"../styles/iconStyles\";\r\n\r\nexport const setErrorMessage = (\r\n errors: Record,\r\n errorType: string,\r\n errorMessage: string\r\n): Record => {\r\n if (!errorMessage || errorMessage === \"\") {\r\n delete errors[errorType];\r\n } else {\r\n errors[errorType] = errorMessage;\r\n }\r\n\r\n return errors;\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...bannerStyles(theme),\r\n ...iconStyles(theme),\r\n rightMargin: {\r\n marginRight: \"5px\",\r\n },\r\n })\r\n);\r\n\r\ntype ErrorDisplayPropsType = {\r\n errors: Record;\r\n};\r\n\r\nexport const ErrorDisplay = (props: ErrorDisplayPropsType) => {\r\n const classes = useStyles();\r\n let generalErrors: Array = [];\r\n Object.keys(props.errors).forEach((key: string) => {\r\n if (props.errors[key]) {\r\n generalErrors.push(\r\n \r\n {props.errors[key]}\r\n
\r\n
\r\n );\r\n }\r\n });\r\n\r\n if (Object.keys(props.errors).length > 0) {\r\n return (\r\n
\r\n
\r\n \r\n {generalErrors}\r\n
\r\n
\r\n );\r\n } else {\r\n return null;\r\n }\r\n};\r\n","import React, {\r\n ElementRef,\r\n forwardRef,\r\n ForwardRefRenderFunction,\r\n Fragment,\r\n useEffect,\r\n useImperativeHandle,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport loadImage from \"blueimp-load-image\";\r\nimport {\r\n CircularProgress,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n Grid,\r\n} from \"@material-ui/core\";\r\n\r\nimport {\r\n CircleFaceType,\r\n ImagusFacePicker,\r\n} from \"../../../ImagusComponents/Gadgets/ImagusFacePicker\";\r\n\r\nimport FaceUpload from \"./FaceUpload\";\r\n\r\nimport Image1 from \"../../../images/samples/Abdel_Nasser_Assidi_0002.jpg\";\r\nimport Image2 from \"../../../images/samples/George_HW_Bush_0006.jpg\";\r\nimport Image3 from \"../../../images/samples/George_P_Bush_0002.jpg\";\r\nimport Image4 from \"../../../images/samples/George_W_Bush_0042.jpg\";\r\nimport Image5 from \"../../../images/samples/George_W_Bush_0098.jpg\";\r\nimport Image6 from \"../../../images/samples/Michael_Jackson_0002.jpg\";\r\nimport Image7 from \"../../../images/samples/Michael_Jackson_0004.jpg\";\r\n\r\nimport { CancelButton } from \"../Buttons/CancelButton\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport {\r\n EnrolmentInputType,\r\n ImageType,\r\n PairCoordinateType,\r\n PersonType,\r\n} from \"../../types/faceSearchTypes\";\r\nimport {\r\n cropImageToFace,\r\n faceCentreFromEyes,\r\n radiusFromEyes,\r\n} from \"../../helperFunctions/cropImageToFace\";\r\nimport { EnrolmentType } from \"../../reducers/profilesReducers\";\r\nimport { ErrorDisplay, setErrorMessage } from \"../ErrorDisplay\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\n\r\ntype ImageUploadProcessPropsType = {\r\n detectedFaces: Array;\r\n uploadFile: Function;\r\n errors: Record;\r\n addEnrolment?: Function;\r\n disabled?: boolean;\r\n profileName?: string;\r\n permanent?: boolean;\r\n fromPermanentList?: Array;\r\n disabledDialog?: boolean;\r\n setDisplaySubmit?: Function;\r\n setShowDetails?: Function;\r\n setImageErrors?: Function;\r\n setFaceIndex?: Function;\r\n enrolFace?: Function;\r\n};\r\ntype ImageUploadProcessHandle = {\r\n resetImageUploadProcess: () => void;\r\n};\r\n\r\ntype FaceUploadHandle = ElementRef;\r\n\r\nconst ImageUploadProcess: ForwardRefRenderFunction<\r\n ImageUploadProcessHandle,\r\n ImageUploadProcessPropsType\r\n> = (props: ImageUploadProcessPropsType, forwardedRef) => {\r\n const [loading, setLoading] = useState(false);\r\n const [openDialog, setOpenDialog] = useState(false);\r\n const [token, setToken] = useState(\"\");\r\n const [image, setImage] = useState();\r\n const [selectedEye, setSelectedEye] = useState(\r\n null\r\n );\r\n const [errors, setError] = useState>(props.errors);\r\n const [faceIndex, setFaceIndex] = useState(0);\r\n const ref = useRef(null);\r\n const currentTotalEnrolment = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile.enrolments\r\n ).length;\r\n const resetFaceUploadFromParent = () => {\r\n if (ref.current) {\r\n ref.current.resetFaceUpload();\r\n }\r\n };\r\n\r\n useImperativeHandle(forwardedRef, () => ({\r\n resetImageUploadProcess() {\r\n resetFaceUploadFromParent();\r\n resetForm();\r\n },\r\n }));\r\n\r\n const resetForm = () => {\r\n setImage(undefined);\r\n setOpenDialog(false);\r\n setLoading(false);\r\n setSelectedEye(null);\r\n setFaceIndex(0);\r\n setToken(\"\");\r\n\r\n setError({});\r\n props.setDisplaySubmit && props.setDisplaySubmit(true);\r\n props.setShowDetails && props.setShowDetails(false);\r\n };\r\n\r\n /** Upload the image => do face search */\r\n const handleUploadFile = (file: File) => {\r\n setLoading(true);\r\n setImageError(\"\");\r\n setError({});\r\n props.uploadFile(\r\n file,\r\n (token: string) => loadImageToCanvas(token, file),\r\n uploadFail\r\n );\r\n //todo: set image error\r\n };\r\n\r\n /** Dispaly result */\r\n const loadImageToCanvas = (token: string, file: File) => {\r\n // console.log(token);\r\n setToken(token);\r\n loadImage(file, uploadDone, { orientation: true, canvas: true });\r\n };\r\n\r\n /** Display image after search for face */\r\n const uploadDone = (canvas: HTMLCanvasElement | Event | HTMLImageElement) => {\r\n if (canvas instanceof HTMLCanvasElement) {\r\n const img = canvas.toDataURL(\"image/jpeg\");\r\n setImage({ url: img, canvas: canvas });\r\n props.setShowDetails && props.setShowDetails(true);\r\n setLoading(false);\r\n setOpenDialog(true);\r\n }\r\n };\r\n\r\n /** Failback for upload errors */\r\n const uploadFail = (error: string) => {\r\n setLoading(false);\r\n // setImageError(\"Not supported\");\r\n setError({ image: \"File not supported\" });\r\n console.log(error);\r\n };\r\n\r\n /** Return true if the photo matches the profile */\r\n const personCheck = (face: CircleFaceType): boolean => {\r\n return face.search.searchName === props.profileName;\r\n };\r\n\r\n /** Return true if the image passes the threshold */\r\n const blurrinessCheck = (face: CircleFaceType): boolean => {\r\n return face.blurriness >= 5.5;\r\n };\r\n\r\n /** Enrol face to DB */\r\n const faceEnrol = () => {\r\n if (selectedEye) {\r\n let validImage = true;\r\n let error: string = \"\";\r\n\r\n if (validImage) {\r\n const eyes = selectedEye;\r\n const person: PersonType = {\r\n eyes: eyes,\r\n centre: faceCentreFromEyes(eyes),\r\n radius: radiusFromEyes(eyes),\r\n };\r\n\r\n const img = image && cropImageToFace(image.canvas, person);\r\n\r\n //Create a temporary enrolment item\r\n const enrolment: EnrolmentInputType = {\r\n enrolmentId: Date.now().toString(),\r\n token: token,\r\n imageUrl: img && img.src,\r\n eyes: eyes,\r\n nose: props.detectedFaces[faceIndex].nose,\r\n mouth: props.detectedFaces[faceIndex].mouth,\r\n size: props.detectedFaces[faceIndex].size,\r\n permanent: props.permanent,\r\n };\r\n if (props.enrolFace) {\r\n props.enrolFace(enrolment, resetForm);\r\n } else {\r\n props.addEnrolment && props.addEnrolment(enrolment);\r\n }\r\n // resetForm();\r\n } else {\r\n setImageError(error);\r\n }\r\n } else {\r\n //set error\r\n // setError({ image: \"No face detected\" });\r\n setImageError(\"No face detected\");\r\n }\r\n };\r\n\r\n /**Change eye selection */\r\n const changeEyeSelection = (eyes: PairCoordinateType, index: number) => {\r\n setSelectedEye(eyes);\r\n setFaceIndex(index);\r\n props.setFaceIndex && props.setFaceIndex(index);\r\n };\r\n\r\n /** Set image errors */\r\n const setImageError = (message: string) => {\r\n setError({ image: message });\r\n };\r\n\r\n /** Handle user select from permanent list */\r\n const handlePermanentSelection = (imgUrl: string) => {\r\n if (props.fromPermanentList) {\r\n var index = props.fromPermanentList.findIndex(\r\n (enrolment) => enrolment.faces[0].imgUrl === imgUrl\r\n );\r\n props.addEnrolment && props.addEnrolment(props.fromPermanentList[index]);\r\n resetForm();\r\n }\r\n };\r\n\r\n /** Check whether should disable enrolment */\r\n const shouldDisable = (): boolean => {\r\n const errorList = Object.keys(props.errors);\r\n\r\n if (errorList.length === 1 && errorList.indexOf(\"person\") > -1) {\r\n return false;\r\n } else {\r\n if (errorList.length === 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let imgList: Array = [];\r\n if (props.permanent) {\r\n //if in permanent page, list the sample images\r\n imgList = [Image1, Image2, Image3, Image4, Image5, Image6, Image7];\r\n } else {\r\n //else display from permanent list\r\n if (props.fromPermanentList) {\r\n props.fromPermanentList.map((enrolment) => {\r\n if (enrolment.faces[0].imgUrl) {\r\n return imgList.push(enrolment.faces[0].imgUrl);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // const FacePicker = () => {\r\n // if (props.detectedFaces && image) {\r\n // props.setDisplaySubmit && props.setDisplaySubmit(false);\r\n // props.setShowDetails && props.setShowDetails(true);\r\n // return (\r\n // \r\n // );\r\n // } else return ;\r\n // };\r\n\r\n if (loading) {\r\n return ;\r\n } else if (image) {\r\n /** Display photo with face captured */\r\n if (props.disabledDialog) {\r\n return (\r\n \r\n \r\n {props.detectedFaces ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n -1\r\n ? props.errors\r\n : {}\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else\r\n return (\r\n \r\n \r\n {props.detectedFaces ? (\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 0}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n } else {\r\n /** Face Upload Process */\r\n return (\r\n \r\n );\r\n }\r\n};\r\n\r\nexport default forwardRef(ImageUploadProcess);\r\n","import {\r\n createStyles,\r\n Grid,\r\n Button,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { CircleFaceType } from \"../../../ImagusComponents/Gadgets/ImagusFacePicker\";\r\nimport { panelStyles } from \"../../styles/generalStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport CheckIcon from \"@material-ui/icons/CheckCircle\";\r\nimport CloseIcon from \"@material-ui/icons/Cancel\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\nimport classNames from \"classnames\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport ImageUploadProcess from \"../faceSearch/ImageUploadProcess\";\r\nimport { setErrorMessage } from \"../ErrorDisplay\";\r\nimport { EnrolmentInputType } from \"../../types/faceSearchTypes\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\nimport FaceUpload from \"../faceSearch/FaceUpload\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n ...iconStyles(theme),\r\n ...buttonStyles(theme),\r\n title: {\r\n fontWeight: 600,\r\n },\r\n\r\n leftMargin: {\r\n marginLeft: \"10px\",\r\n },\r\n\r\n rightMargin: {\r\n marginRight: \"10px\",\r\n },\r\n content: {\r\n marginLeft: \"10px\",\r\n fontSize: \"0.875rem\",\r\n lineHeight: 1.8,\r\n },\r\n\r\n photoPanel: {\r\n backgroundColor: theme.palette.contentBackgroundColor,\r\n height: \"185px\",\r\n borderRadius: \"25px\",\r\n width: \"50%\",\r\n },\r\n\r\n approveIcon: {\r\n color: \"#039487\",\r\n // backgroundColor: \"#039487\",\r\n },\r\n\r\n denyIcon: {\r\n color: \"#FF0000\",\r\n },\r\n })\r\n);\r\n\r\ntype PhotoDetailsPropsType = {\r\n faces: Array;\r\n uploadFile: Function;\r\n addEnrolmentsToProfile: Function;\r\n handleDeleteDialog?: Function;\r\n handleEditButtonClick?: Function;\r\n selectedProfile: RunnerType;\r\n allowRemoveProfile?: boolean;\r\n};\r\n\r\nexport const PhotoDetails = (props: PhotoDetailsPropsType) => {\r\n const classes = useStyles();\r\n const [showDetails, setShowDetails] = useState(false);\r\n const [faceIndex, setFaceIndex] = useState(0);\r\n const [errors, setErrors] = useState>({});\r\n const [showJumpButton, setShowJumpButton] = useState(false);\r\n /** used to skip first render */\r\n const [count, setCount] = useState(0);\r\n\r\n useEffect(() => {\r\n if (count) {\r\n checkDetails();\r\n } else {\r\n setCount(1);\r\n }\r\n }, [props.faces, faceIndex, props.selectedProfile]);\r\n\r\n const addEnrolments = (\r\n enrolment: EnrolmentInputType,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n props.addEnrolmentsToProfile(\r\n [enrolment],\r\n () => {\r\n doneBack && doneBack();\r\n },\r\n addEnrolmentFail\r\n );\r\n };\r\n\r\n const addEnrolmentFail = (error: Object) => {\r\n const errors = {} as Record;\r\n if (props.selectedProfile.uid === \"\") {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"image\",\r\n Object.keys(error).length > 0\r\n ? \"Please create a profile before submit photos\"\r\n : \"\"\r\n )\r\n );\r\n } else {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"image\",\r\n Object.keys(error).length > 0\r\n ? \"Photo has been previously enrolled\"\r\n : \"\"\r\n )\r\n );\r\n }\r\n setErrors(errors);\r\n };\r\n\r\n const handleRemoveButtonClick = () => {\r\n props.handleDeleteDialog && props.handleDeleteDialog(true);\r\n };\r\n\r\n const handleEditButtonClick = () => {\r\n props.handleEditButtonClick && props.handleEditButtonClick(true);\r\n };\r\n\r\n const passThreshold: JSX.Element = (\r\n
\r\n \r\n \r\n Passed\r\n \r\n
\r\n );\r\n\r\n const underThreshold = (message: string): JSX.Element => {\r\n return (\r\n
\r\n \r\n \r\n {message}\r\n \r\n
\r\n );\r\n };\r\n\r\n const handleFaceChange = (index: number) => {\r\n setFaceIndex(index);\r\n };\r\n const handleDisplayDetails = (status: boolean) => {\r\n setShowDetails(status);\r\n };\r\n\r\n const roundFloat = (point: number): number => {\r\n return Math.round((point + Number.EPSILON) * 100) / 100;\r\n };\r\n\r\n const passFrontalCheck = (face: CircleFaceType) => {\r\n return face && face.resultMetrics.matchFrontalThreshold >= 100;\r\n };\r\n\r\n const passBlurrinessCheck = (face: CircleFaceType) => {\r\n return face && face.resultMetrics.matchBlurrinessThreshold >= 100;\r\n };\r\n\r\n const passConfidenceCheck = (face: CircleFaceType) => {\r\n return face && face.resultMetrics.matchConfidenceThreshold >= 100;\r\n };\r\n\r\n const passPersonCheck = (face: CircleFaceType) => {\r\n const exist = face.search && face.search.probability > 0;\r\n\r\n if (exist) {\r\n if (face.search.profileId !== props.selectedProfile.uid) {\r\n return false;\r\n }\r\n } else {\r\n if (props.selectedProfile.enrolments.length > 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const checkDetails = () => {\r\n console.log(\"checking.....\");\r\n const errors = {} as Record;\r\n if (props.faces.length === 0) {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"image\",\r\n props.faces.length > 0 ? \"\" : \"Cannot detect face\"\r\n )\r\n );\r\n } else {\r\n //clear previous errors\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"image\",\r\n props.faces.length > 0 ? \"\" : \"No face detected\"\r\n )\r\n );\r\n\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"frontal\",\r\n passFrontalCheck(props.faces[faceIndex]) ? \"\" : \"Frontal Error\"\r\n )\r\n );\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"blurriness\",\r\n passBlurrinessCheck(props.faces[faceIndex]) ? \"\" : \"Image too blurry\"\r\n )\r\n );\r\n\r\n setErrorMessage(\r\n errors,\r\n \"confidence\",\r\n passConfidenceCheck(props.faces[faceIndex])\r\n ? \"\"\r\n : \"Bad contrast or bad lighting\"\r\n );\r\n\r\n setErrorMessage(\r\n errors,\r\n \"person\",\r\n passPersonCheck(props.faces[faceIndex]) ? \"\" : \"Person Error\"\r\n );\r\n\r\n setErrors(errors);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n {showDetails && props.faces.length > 0 && (\r\n \r\n \r\n \r\n Number of faces detected:\r\n \r\n \r\n {props.faces.length}\r\n \r\n \r\n {/** Eyes location */}\r\n \r\n \r\n Eye Locations:\r\n \r\n \r\n \r\n \r\n Left Eye Coordinate:{\" \"}\r\n {roundFloat(props.faces[faceIndex].eyes.left.x)},{\" \"}\r\n {roundFloat(props.faces[faceIndex].eyes.left.y)}\r\n \r\n \r\n \r\n \r\n Right Eye Coordinate:{\" \"}\r\n {roundFloat(props.faces[faceIndex].eyes.right.x)},{\" \"}\r\n {roundFloat(props.faces[faceIndex].eyes.right.y)}\r\n \r\n \r\n \r\n \r\n\r\n {/** Check for bluriness */}\r\n \r\n \r\n Bluriness Check:\r\n \r\n {passBlurrinessCheck(props.faces[faceIndex])\r\n ? passThreshold\r\n : underThreshold(\"Face too blurry\")}\r\n \r\n\r\n {/** Confidence */}\r\n \r\n \r\n Confidence Check:\r\n \r\n {passConfidenceCheck(props.faces[faceIndex])\r\n ? passThreshold\r\n : underThreshold(\"Bad lighting or bad contrast\")}\r\n \r\n {/** Frontal */}\r\n \r\n \r\n Frontal Check:\r\n \r\n {passFrontalCheck(props.faces[faceIndex])\r\n ? passThreshold\r\n : underThreshold(\"Non-frontal face detected\")}\r\n \r\n {/** Person Check */}\r\n \r\n \r\n Person Check:\r\n \r\n {passPersonCheck(props.faces[faceIndex])\r\n ? passThreshold\r\n : underThreshold(\"Face might not belong to this profile\")}\r\n \r\n \r\n )}\r\n {(!showDetails || props.faces.length === 0) && (\r\n \r\n )}\r\n {props.allowRemoveProfile && (\r\n \r\n \r\n \r\n {\" \"}\r\n \r\n Edit profile name\r\n \r\n \r\n {\" \"}\r\n \r\n Remove Profile\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { Dispatch } from \"redux\";\r\nimport { CircleFaceType } from \"../../ImagusComponents/Gadgets/ImagusFacePicker\";\r\nimport Properties from \"../../Properties\";\r\n// import { DetectedFace } from \"../reducers/faceSearchReducers\";\r\nimport { getInit, postInit } from \"../types/requestConstants\";\r\nimport { CLEAR_FORM, DETECT_IMAGE, SAVE_TOKEN } from \"./actionNames\";\r\nimport { handleResponse } from \"./handleResponse\";\r\n\r\nconst root = Properties.api_root;\r\n\r\nexport const clearForm = (dispatch: Dispatch) => {\r\n dispatch({ type: CLEAR_FORM });\r\n};\r\n\r\n/** Upload image to the database */\r\nexport const uploadFile = (\r\n file: File | Blob,\r\n shouldSaveToken: boolean,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n let formData = new FormData();\r\n formData.append(\"image\", file);\r\n return fetch(root + \"/api/v2/images\", postInit(formData))\r\n .then(handleResponse)\r\n .then(\r\n (token: string) => {\r\n if (shouldSaveToken) {\r\n dispatch({ type: SAVE_TOKEN, token: token });\r\n }\r\n doneBack && doneBack(token);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\n/** Detect faces from the given image token */\r\nexport const detectFaces = (\r\n token: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n return fetch(root + \"/api/v2/images/\" + token + \"/detect-profile\", getInit())\r\n .then(handleResponse)\r\n .then(\r\n (result: Array) => {\r\n dispatch({ type: DETECT_IMAGE, detectedFaces: result });\r\n doneBack && doneBack(result);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { PhotoDisplay } from \"../../components/profiles/PhotoDisplay\";\r\nimport {\r\n fetchActiveProfile,\r\n fetchProfiles,\r\n getEnrolments,\r\n updateProfile,\r\n} from \"../../actions/profilesActions\";\r\n\r\nimport { CircularProgress, Theme, Typography } from \"@material-ui/core\";\r\nimport { RunnerResponseModel } from \"../../types/ApiReturnTypes\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { contentStyles, panelStyles } from \"../../styles/generalStyles\";\r\nimport chroma from \"chroma-js\";\r\nimport classNames from \"classnames\";\r\nimport { PermanentPhotos } from \"../../components/profiles/PermanentPhotos\";\r\nimport { EnrolmentType, RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { act } from \"react-dom/test-utils\";\r\nimport { useSelectProfile } from \"../../helperFunctions/useSelectProfile\";\r\nimport { PhotoDetails } from \"../../components/profiles/PhotoDetails\";\r\nimport { profile } from \"node:console\";\r\nimport { uploadFile, detectFaces } from \"../../actions/faceSearchActions\";\r\nimport { EnrolmentInputType } from \"../../types/faceSearchTypes\";\r\nimport { CircleFaceType } from \"../../../ImagusComponents/Gadgets/ImagusFacePicker\";\r\nimport { useFetchImageForEnrolments } from \"../../helperFunctions/useFetchImageForEnrolments\";\r\nimport { fetchProfileById } from \"../../../admin/actions/participantsActions\";\r\nimport { useFetchImageForActiveProfile } from \"../../helperFunctions/useFetchImageForActiveProfile\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...contentStyles(theme),\r\n ...panelStyles(theme),\r\n ...buttonStyles(theme),\r\n\r\n sectionHeader: {\r\n backgroundColor: theme.palette.primary.light,\r\n border: \"1px solid black\",\r\n borderRadius: \"25px\",\r\n color:\r\n chroma.contrast(theme.palette.primary.light, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n paddingLeft: \"15px\",\r\n },\r\n\r\n photoPanel: {\r\n backgroundColor: theme.palette.contentBackgroundColor,\r\n height: \"auto\",\r\n borderRadius: \"25px\",\r\n margin: \"15px auto\",\r\n },\r\n\r\n enrolmentPanel: {\r\n borderRadius: \"25px\",\r\n height: \"100%\",\r\n },\r\n })\r\n);\r\n\r\ntype PhotoDisplayReduxPropsType = {\r\n removePhoto?: Function;\r\n};\r\n\r\nexport const PhotoDisplayRedux = (props: PhotoDisplayReduxPropsType) => {\r\n const [loading, setLoading] = useState(true);\r\n const accountInfo = useSelector((state: AppState) => state.global.user.info);\r\n const profileList = useSelector(\r\n (state: AppState) => state.global.profiles.profileIds\r\n );\r\n const activeProfile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n\r\n const faces = useSelector(\r\n (state: AppState) => state.global.faceSearch.detectedFaces\r\n );\r\n\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n useSelectProfile(accountInfo?.id);\r\n // useFetchImageForEnrolments(activeProfile.uid, activeProfile.enrolments);\r\n // useFetchImageForActiveProfile();\r\n // let permanentEnrolments: Array = [];\r\n // activeProfile.enrolments.map((eachEnrolment) => {\r\n // if (eachEnrolment.permanent) {\r\n // return permanentEnrolments.push(eachEnrolment);\r\n // }\r\n // });\r\n\r\n const fetchCurrentProfile = () => {\r\n fetchActiveProfile(activeProfile.uid)(dispatch);\r\n };\r\n\r\n const handleUpdateCurrentProfile = (\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n accountInfo &&\r\n updateProfile(\r\n activeProfile.uid,\r\n activeProfile.name,\r\n newEnrolments,\r\n deleteEnrolments,\r\n accountInfo.id,\r\n doneBack,\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const handleUploadFile = (\r\n file: File | Blob,\r\n doneBack: Function,\r\n failBack?: Function\r\n ) => {\r\n uploadFile(\r\n file,\r\n true,\r\n (token: string) =>\r\n detectFaces(\r\n token,\r\n (result: Array) => {\r\n doneBack(token, result);\r\n },\r\n failBack\r\n )(dispatch),\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const addEnrolmentsToProfile = (\r\n newEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n updateProfile(\r\n activeProfile.uid,\r\n activeProfile.name,\r\n newEnrolments,\r\n [],\r\n undefined,\r\n () => {\r\n updateDone();\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const updateDone = () => {\r\n getProfileEnrolments(activeProfile.uid);\r\n };\r\n\r\n const removePhoto = (\r\n enrolmentIds: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n handleUpdateCurrentProfile(\r\n [],\r\n enrolmentIds,\r\n () => {\r\n updateDone();\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n );\r\n };\r\n\r\n const getProfileEnrolments = (profileId: string): Array => {\r\n let enrolments: Array = [];\r\n fetchActiveProfile(profileId, (profile: RunnerType) => {\r\n enrolments = profile.enrolments;\r\n })(dispatch);\r\n return enrolments;\r\n };\r\n\r\n if (!activeProfile) {\r\n return ;\r\n } else {\r\n return (\r\n
\r\n \r\n Your enrolments\r\n \r\n \r\n {/** Permanent Photos */}\r\n \r\n {/* */}\r\n
\r\n \r\n Create enrolments\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n};\r\n","import { useEffect } from \"react\";\r\n\r\ntype RedirectToLoginPropsType = {\r\n /**\r\n * Number of seconds to delay for\r\n */\r\n timeDelay?: number;\r\n};\r\n\r\nexport const RedirectToLogin = (props: RedirectToLoginPropsType) => {\r\n useEffect(() => {\r\n if (props.timeDelay) {\r\n //timeDelay used for transfering from sign up success to login\r\n let seconds: number = props.timeDelay * 1000;\r\n\r\n setTimeout(() => {\r\n window.location.href = \"../login\";\r\n }, seconds);\r\n } else {\r\n window.location.href = \"./login\";\r\n }\r\n });\r\n\r\n return null;\r\n};\r\n","import { ReactElement, useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\nimport { authenticate } from \"../actions/userActions\";\r\nimport { RedirectToLogin } from \"./RedirectToLogin\";\r\n\r\ntype UserAuthPropsType = {\r\n children: ReactElement;\r\n principles?: string;\r\n};\r\n\r\nexport const hasPermission = (\r\n requiredPrinciple: string | undefined,\r\n userPrinciples: Array | null\r\n): boolean => {\r\n if (!requiredPrinciple) {\r\n return true;\r\n } else {\r\n if (userPrinciples) {\r\n for (var i = 0; i < userPrinciples.length; i++) {\r\n if (requiredPrinciple === userPrinciples[i]) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const UserAuth = (props: UserAuthPropsType) => {\r\n const user = useSelector((state: AppState) => state.global.user);\r\n const userRoles = user.info && user.info.roles;\r\n // const [hasPrincicple, setHasPrinciple] = useState(true);\r\n const dispatch = useDispatch();\r\n\r\n let hasPrinciple = true;\r\n\r\n useEffect(() => {\r\n if (user && !user.fetchingAuth && !user.auth) {\r\n authenticate(true)(dispatch);\r\n }\r\n }, []);\r\n\r\n const handlePermissionCheck = (principle: string) => {\r\n if (!hasPermission(principle, userRoles)) {\r\n hasPrinciple = false;\r\n }\r\n };\r\n\r\n let authentication = false;\r\n if (user && user.auth !== null) {\r\n if (user.auth === true) {\r\n authentication = true;\r\n if (props.principles) {\r\n handlePermissionCheck(props.principles);\r\n }\r\n }\r\n }\r\n\r\n let isAuthenticated = false;\r\n if (authentication && hasPrinciple) isAuthenticated = true;\r\n\r\n if (isAuthenticated) {\r\n return props.children;\r\n } else if (\r\n user.auth === false ||\r\n user.fetchingAuth === null ||\r\n user.fetchingAuth ||\r\n userRoles === null\r\n ) {\r\n return null;\r\n } else {\r\n return ;\r\n }\r\n};\r\n","import { Button, createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\nimport { detectFaces, uploadFile } from \"../actions/faceSearchActions\";\r\nimport {\r\n downloadFilesById,\r\n fetchActiveProfile,\r\n updateProfile,\r\n} from \"../actions/profilesActions\";\r\n\r\nimport { AppHeader } from \"../components/gadgets/AppHeader\";\r\nimport { AppHeaderSubtitle } from \"../components/gadgets/AppHeaderSubtitle\";\r\nimport { ModalForm } from \"../components/gadgets/ModalForm\";\r\n\r\nimport { PermanentPhotoFormRedux } from \"../container/profiles/PermanentPhotoFormRedux\";\r\nimport { PhotoDisplayRedux } from \"../container/profiles/PhotoDisplayRedux\";\r\nimport { UserAuth } from \"../container/UserAuth\";\r\nimport { EnrolmentType } from \"../reducers/profilesReducers\";\r\nimport { buttonStyles } from \"../styles/buttonStyles\";\r\nimport { contentStyles, panelStyles } from \"../styles/generalStyles\";\r\nimport { EnrolmentInputType } from \"../types/faceSearchTypes\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...contentStyles(theme),\r\n ...panelStyles(theme),\r\n ...buttonStyles(theme),\r\n rightMargin: {\r\n marginRight: \"5px\",\r\n },\r\n })\r\n);\r\n\r\nexport const Photo = () => {\r\n const classes = useStyles();\r\n // const [openAddForm, setOpenAddForm] = useState(false);\r\n\r\n const accountDetails = useSelector(\r\n (state: AppState) => state.global.user.info\r\n );\r\n const activeProfile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n\r\n let permanentEnrolments: Array = [];\r\n activeProfile.enrolments.map((eachEnrolment) => {\r\n if (eachEnrolment.permanent) {\r\n return permanentEnrolments.push(eachEnrolment);\r\n }\r\n });\r\n\r\n const dispatch = useDispatch();\r\n\r\n const handleUpdateProfile = (\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n const profileName = activeProfile.name;\r\n console.log(activeProfile);\r\n accountDetails &&\r\n updateProfile(\r\n activeProfile.uid,\r\n profileName,\r\n newEnrolments,\r\n deleteEnrolments,\r\n accountDetails.id,\r\n () => {\r\n //fetch new enrolments\r\n fetchActiveProfile(activeProfile.uid, doneBack, failBack)(dispatch);\r\n },\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n return (\r\n \r\n
\r\n downloadFilesById(activeProfile.uid)}\r\n >\r\n Download your enrolments\r\n ,\r\n ]}\r\n />\r\n {/* */}\r\n \r\n {/* \r\n {\r\n setOpenAddForm(false);\r\n }}\r\n form={\r\n setOpenAddForm(false)}\r\n permanent={true}\r\n updateEnrolment={handleUpdateProfile}\r\n enrolments={permanentEnrolments}\r\n />\r\n }\r\n /> */}\r\n
\r\n
\r\n );\r\n};\r\n","import { DeleteRounded } from \"@material-ui/icons\";\r\nimport { Dispatch } from \"redux\";\r\nimport Properties from \"../../Properties\";\r\nimport { compareItems } from \"../helperFunctions/stringFunctions\";\r\nimport { Race } from \"../reducers/raceReducers\";\r\nimport { RaceReturnModel } from \"../types/ApiReturnTypes\";\r\nimport { Data, getInit, postBody, putBody } from \"../types/requestConstants\";\r\nimport {\r\n UPDATE_RACE,\r\n GET_RACES,\r\n GET_SEARCH_RESULTS,\r\n SET_RACE_UPDATING,\r\n SET_SEARCH_QUERY,\r\n} from \"./actionNames\";\r\nimport { handleResponse } from \"./handleResponse\";\r\n\r\nconst root = Properties.api_root;\r\n\r\n// export const getRegisteredRaces = (\r\n// profileId: string,\r\n// doneBack?: Function,\r\n// failBack?: Function\r\n// ) => (dispatch: Dispatch) => {\r\n// dispatch({ type: SET_RACE_UPDATING, status: true });\r\n// return fetch(root + \"/api/v2/profile/\" + profileId + \"/races\", getInit())\r\n// .then(handleResponse)\r\n// .then(\r\n\r\n// races.map((eachRace: Race) => {\r\n// return dispatch({ type: UPDATE_RACE, race: eachRace });\r\n// });\r\n\r\n// dispatch({ type: SET_RACE_UPDATING, status: false });\r\n// doneBack && doneBack(races);\r\n// },\r\n// (error) => {\r\n// dispatch({ type: SET_RACE_UPDATING, status: false });\r\n// failBack && failBack(error);\r\n// }\r\n// );\r\n// };\r\n\r\n/** Get current race details given raceID and current profileId */\r\nexport const fetchRaceDetailsById = (\r\n raceId: string,\r\n profileId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n console.log(raceId, profileId);\r\n return fetch(\r\n root + \"/api/v2/race/\" + raceId + \"/profile?profileId=\" + profileId,\r\n getInit()\r\n )\r\n .then(handleResponse)\r\n .then(\r\n (result: RaceReturnModel) => {\r\n let enrolmentList: Array = [];\r\n result.enrolmentIds.forEach((element) => {\r\n return (enrolmentList = [\r\n ...enrolmentList,\r\n ...Object.values(element),\r\n ]);\r\n });\r\n console.log(enrolmentList);\r\n\r\n const race: Race = {\r\n raceId: result.raceId,\r\n raceName: result.raceName,\r\n date: result.date,\r\n enrolmentIds: enrolmentList,\r\n };\r\n dispatch({ type: UPDATE_RACE, race: race });\r\n doneBack && doneBack(race);\r\n },\r\n (error) => {\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\nexport const fetchRace = (\r\n profileId: string,\r\n query: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n dispatch({ type: SET_RACE_UPDATING, status: true });\r\n return fetch(\r\n root + \"/api/v2/race/\" + profileId + \"/search?nameFilter=\" + query,\r\n getInit()\r\n )\r\n .then(handleResponse)\r\n .then(\r\n (result: Array) => {\r\n let races: Array = [];\r\n //Create the enrolmentId Array\r\n result.map((eachRace) => {\r\n let enrolmentList: Array = [];\r\n eachRace.enrolmentIds.forEach((element) => {\r\n return (enrolmentList = [\r\n ...enrolmentList,\r\n ...Object.values(element),\r\n ]);\r\n });\r\n console.log(enrolmentList);\r\n\r\n const race: Race = {\r\n raceId: eachRace.raceId,\r\n raceName: eachRace.raceName,\r\n date: eachRace.date,\r\n enrolmentIds: enrolmentList,\r\n };\r\n\r\n return (races = [...races, race]);\r\n });\r\n\r\n dispatch({ type: SET_SEARCH_QUERY, query: query });\r\n dispatch({ type: GET_SEARCH_RESULTS, races: races });\r\n dispatch({ type: SET_RACE_UPDATING, status: false });\r\n doneBack && doneBack(races);\r\n },\r\n (error) => {\r\n dispatch({ type: SET_RACE_UPDATING, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n\r\ninterface EnrolmentRaceInput extends Data {\r\n newEnrolmentIds: Array;\r\n deleteEnrolmentIds: Array;\r\n profileId: string;\r\n}\r\n\r\nexport const updateRaceEnrolment = (\r\n raceId: string,\r\n profileId: string,\r\n newEnrolments: Array,\r\n deleteEnroments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n) => (dispatch: Dispatch) => {\r\n let formData: EnrolmentRaceInput = {\r\n newEnrolmentIds: newEnrolments,\r\n deleteEnrolmentIds: deleteEnroments,\r\n profileId: profileId,\r\n };\r\n\r\n console.log(formData);\r\n\r\n dispatch({ type: SET_RACE_UPDATING, status: true });\r\n console.log(raceId);\r\n return fetch(\r\n root + \"/api/v2/race/\" + raceId + \"/enrolments\",\r\n putBody(formData)\r\n )\r\n .then((response: Response) => handleResponse(response, \"EMPTY\"))\r\n .then(\r\n () => {\r\n // dispatch({ type: GET_RACE, race: res });\r\n dispatch({ type: SET_RACE_UPDATING, status: false });\r\n doneBack && doneBack();\r\n },\r\n (error) => {\r\n dispatch({ type: SET_RACE_UPDATING, status: false });\r\n failBack && failBack(error);\r\n }\r\n );\r\n};\r\n","import {\r\n AppBar,\r\n BackdropClassKey,\r\n BackdropProps,\r\n createStyles,\r\n Dialog,\r\n DialogContent,\r\n IconButton,\r\n makeStyles,\r\n Theme,\r\n Toolbar,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport chroma from \"chroma-js\";\r\nimport classNames from \"classnames\";\r\nimport { ReactElement } from \"react\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n textColor: {\r\n color:\r\n chroma.contrast(theme.palette.primary.main, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n\r\n title: {\r\n flex: 1,\r\n },\r\n modalConent: {\r\n marginTop: \"70px\",\r\n },\r\n\r\n modalBackdrop: {\r\n backgroundColor: theme.palette.common.black,\r\n },\r\n })\r\n);\r\n\r\ntype DialogHeaderPropsType = {\r\n onClose:\r\n | ((event: React.MouseEvent) => void)\r\n | undefined;\r\n title: string;\r\n disabledExit?: boolean;\r\n};\r\n\r\nconst DialogHeader = (props: DialogHeaderPropsType): JSX.Element => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n \r\n {props.title}\r\n \r\n {!props.disabledExit && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\ntype GeneralModalFormPropsType = {\r\n open: boolean;\r\n handleModalStatus: Function;\r\n title: string;\r\n form: ReactElement;\r\n notFullWidth?: boolean;\r\n hideBackdrop?: boolean;\r\n darkBackdrop?: boolean;\r\n disableExit?: boolean;\r\n};\r\n\r\nexport const ModalForm = (props: GeneralModalFormPropsType) => {\r\n const classes = useStyles();\r\n // const handleClickOpen = () => props.handleModalStatus(true);\r\n const handleClickClose = () => {\r\n props.handleModalStatus();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {props.form}\r\n \r\n \r\n );\r\n};\r\n","import {\r\n createStyles,\r\n FormControl,\r\n Input,\r\n InputLabel,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport { ReactElement } from \"react\";\r\nimport { inputStyles } from \"../../styles/generalStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...inputStyles(theme),\r\n })\r\n);\r\n\r\ntype SingleTextFieldPropsType = {\r\n label: string;\r\n name: string;\r\n value?: string;\r\n inputType: string;\r\n onChange: Function;\r\n className?: string;\r\n isRequired?: boolean;\r\n isInvalid?: boolean;\r\n isAutoFocus?: boolean;\r\n isDisabled?: boolean;\r\n onBlur?: Function;\r\n onFocus?: Function;\r\n onEnter?: Function;\r\n endAdornment?: ReactElement;\r\n helper?: string;\r\n inputStyle?: string;\r\n autoFocus?: boolean;\r\n};\r\n\r\nexport const SingleTextField = (props: SingleTextFieldPropsType) => {\r\n const classes = useStyles();\r\n\r\n const handleChange = (e: React.ChangeEvent) => props.onChange(e);\r\n return (\r\n \r\n {props.label !== \"\" && (\r\n \r\n {props.label}\r\n \r\n )}\r\n\r\n \r\n \r\n );\r\n};\r\n","import {\r\n CircularProgress,\r\n IconButton,\r\n InputAdornment,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { Fragment, useState } from \"react\";\r\nimport SearchIcon from \"@material-ui/icons/Search\";\r\nimport ChevronLeftIcon from \"@material-ui/icons/ChevronLeft\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\nimport { SingleTextField } from \"../../global/components/formInputs/SingleTextField\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { iconStyles } from \"../../global/styles/iconStyles\";\r\nimport { SingleCheckBox } from \"../../global/components/formInputs/SingleCheckBox\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n loadingIcon: {\r\n width: \"24px\",\r\n height: \"24px\",\r\n },\r\n })\r\n);\r\n\r\ntype ImagusSearchBarPropType = {\r\n updating?: string;\r\n searchQuery: string;\r\n handleSearch: Function;\r\n};\r\n\r\nexport const ImagusSearchBar = (props: ImagusSearchBarPropType) => {\r\n const classes = useStyles();\r\n const [inputValue, setInputValue] = useState(props.searchQuery || \"\");\r\n const [loading, setLoading] = useState(false);\r\n\r\n const handleChange = (e: React.ChangeEvent) => {\r\n setInputValue(e.currentTarget.value);\r\n props.handleSearch(e.currentTarget.value);\r\n };\r\n return (\r\n \r\n \r\n {loading ? (\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 {\r\n Avatar,\r\n ListItem,\r\n ListItemAvatar,\r\n ListItemText,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport classNames from \"classnames\";\r\nimport React, { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { getProfileAvatar } from \"../../../admin/actions/participantsActions\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { Race } from \"../../reducers/raceReducers\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n raceSelected: {\r\n fontWeight: 800,\r\n },\r\n\r\n title: {\r\n width: \"100%\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n padding: \"0 16px\",\r\n },\r\n\r\n selectedTile: {\r\n backgroundColor: \"#787c7f38\",\r\n },\r\n })\r\n);\r\n\r\ntype RaceItemPropsType = {\r\n race: RunnerType;\r\n selectedRace: string;\r\n selectRace: Function;\r\n sideComponent?: JSX.Element;\r\n};\r\n\r\nexport const RaceItem = (props: RaceItemPropsType) => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n useEffect(() => {\r\n if (props.race.enrolments.length > 0) {\r\n getProfileAvatar(props.race.uid)(dispatch);\r\n }\r\n }, [props.race]);\r\n\r\n return (\r\n props.selectRace(props.race.uid)}\r\n className={classNames(\r\n props.selectedRace === props.race.uid && classes.selectedTile\r\n )}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { RunnerType } from \"../reducers/profilesReducers\";\r\nimport { Race } from \"../reducers/raceReducers\";\r\n\r\nexport const checkUserNameFormat = (val: string): boolean => {\r\n return /^[a-zA-Z0-9-._@+/\\\\]+$/.test(val);\r\n};\r\n\r\nexport const checkEmailFormat = (val: string): boolean => {\r\n return /^[a-z0-9][-a-z0-9.!#$%&'*+-=?^_`{|}~\\/]+@([-a-z0-9]+\\.)+[a-z]{2,5}$/.test(\r\n val\r\n );\r\n};\r\n\r\nexport type PasswordStrength = {\r\n number: boolean;\r\n lowercase: boolean;\r\n uppercase: boolean;\r\n length: boolean;\r\n space: boolean;\r\n};\r\n\r\nexport const initalPasswordStrength: PasswordStrength = {\r\n number: false,\r\n lowercase: false,\r\n uppercase: false,\r\n length: false,\r\n space: false,\r\n};\r\n\r\nexport const checkPasswordStrength = (\r\n passwordStrength: PasswordStrength,\r\n val: string\r\n): PasswordStrength => {\r\n if (/\\d/.test(val)) {\r\n passwordStrength[\"number\"] = true;\r\n } else {\r\n passwordStrength[\"number\"] = false;\r\n }\r\n if (/[a-z]/.test(val)) {\r\n passwordStrength[\"lowercase\"] = true;\r\n } else {\r\n passwordStrength[\"lowercase\"] = false;\r\n }\r\n if (/[A-Z]/.test(val)) {\r\n passwordStrength[\"uppercase\"] = true;\r\n } else {\r\n passwordStrength[\"uppercase\"] = false;\r\n }\r\n if (val.trim().length >= 8) {\r\n passwordStrength[\"length\"] = true;\r\n } else {\r\n passwordStrength[\"length\"] = false;\r\n }\r\n if (/\\s/g.test(val)) {\r\n passwordStrength[\"space\"] = false;\r\n } else {\r\n passwordStrength[\"space\"] = true;\r\n }\r\n return passwordStrength;\r\n};\r\n\r\nexport const compareItems = (a: RunnerType, b: RunnerType): number => {\r\n const nameA = a.name.toUpperCase();\r\n const nameB = b.name.toUpperCase();\r\n\r\n let comparison = 0;\r\n if (nameB > nameA) {\r\n comparison = -1;\r\n }\r\n\r\n return comparison;\r\n};\r\n","import React, { useState } from \"react\";\r\nimport {\r\n CircularProgress,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { Race } from \"../../reducers/raceReducers\";\r\nimport { drawerStyles } from \"../../styles/generalStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport { RaceItem } from \"./RaceItem\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { compareItems } from \"../../helperFunctions/stringFunctions\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...iconStyles(theme),\r\n })\r\n);\r\n\r\nexport type RaceListPropsType = {\r\n raceList: Array | null;\r\n selectRace: Function;\r\n selectedId: string;\r\n sideComponent?: JSX.Element;\r\n};\r\n\r\nexport const RaceList = (props: RaceListPropsType) => {\r\n const classes = useStyles();\r\n // const [loading, setLoading] = useState(false);\r\n\r\n const fetching = useSelector(\r\n (state: AppState) => state.global.races.updating\r\n );\r\n\r\n const raceList = props.raceList && props.raceList.sort(compareItems);\r\n\r\n let races =\r\n raceList &&\r\n raceList.map((race: RunnerType, i: number) => {\r\n return (\r\n \r\n );\r\n });\r\n\r\n if (fetching) {\r\n races = [\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n ];\r\n } else if (races === null || races.length <= 0) {\r\n races = [\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n ];\r\n }\r\n\r\n return {races};\r\n};\r\n","import React, { ChangeEvent, Fragment, useState } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { Drawer, IconButton, Theme } from \"@material-ui/core\";\r\nimport ChevronLeftIcon from \"@material-ui/icons/ChevronLeft\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport { drawerStyles } from \"../../global/styles/generalStyles\";\r\nimport { iconStyles } from \"../../global/styles/iconStyles\";\r\nimport { ImagusSearchBar } from \"../FormInputs/ImagusSearchBar\";\r\nimport { SingleCheckBox } from \"../../global/components/formInputs/SingleCheckBox\";\r\nimport { RaceList } from \"../../global/components/race/RaceList\";\r\nimport { Race } from \"../../global/reducers/raceReducers\";\r\nimport { Runtime } from \"node:inspector\";\r\nimport { RunnerType } from \"../../global/reducers/profilesReducers\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...iconStyles(theme),\r\n hide: {\r\n display: \"none\",\r\n },\r\n checkBoxes: {\r\n paddingLeft: \"15px\",\r\n },\r\n })\r\n);\r\n\r\ntype ImagusRaceDrawerPropsType = {\r\n handleSearch: Function;\r\n raceList: Array | null;\r\n handleRaceSelect: Function;\r\n selectedId: string;\r\n};\r\n\r\nexport const ImagusRaceDrawer = (props: ImagusRaceDrawerPropsType) => {\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(true);\r\n const [raceStatusSearch, setRaceStatusCheck] = useState({\r\n closed: false,\r\n open: false,\r\n });\r\n\r\n const toggleSearchBarDrawer = () => {\r\n setOpen(!open);\r\n };\r\n\r\n const handleCheckBoxClick = (e: ChangeEvent) => {\r\n const name = e.currentTarget.name;\r\n const value = e.currentTarget.checked;\r\n setRaceStatusCheck({ ...raceStatusSearch, [name]: value });\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n {open ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n {/* {open && (\r\n
\r\n \r\n\r\n \r\n
\r\n )} */}\r\n\r\n {open && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n","import {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Button,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\nimport InfoIcon from \"@material-ui/icons/Info\";\r\n\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport { CancelButton } from \"../Buttons/CancelButton\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n warningIcon: {\r\n marginRight: \"10px\",\r\n verticalAlign: \"middle\",\r\n },\r\n content: {\r\n fontWeight: 500,\r\n fontSize: \"1.125rem\",\r\n },\r\n highlight: {\r\n color: theme.palette.secondary.main,\r\n },\r\n })\r\n);\r\n\r\ntype ConfirmationDialogPropsType = {\r\n open: boolean;\r\n handleCancel: Function;\r\n confirmFunction: Function;\r\n actionWord?: string;\r\n itemName?: string;\r\n extraWord?: string;\r\n};\r\n\r\nexport const ConfirmationDialog = (props: ConfirmationDialogPropsType) => {\r\n const classes = useStyles();\r\n\r\n const handleClose = () => {\r\n props.handleCancel();\r\n };\r\n\r\n const handleConfirm = () => {\r\n props.confirmFunction();\r\n handleClose();\r\n };\r\n\r\n return (\r\n \r\n \r\n {props.actionWord ? (\r\n \r\n ) : (\r\n \r\n )}\r\n Confirm {props.actionWord}\r\n \r\n \r\n \r\n Do you want to{\" \"}\r\n {props.actionWord ? props.actionWord : \"delete\"}{\" \"}\r\n {props.itemName}{\" \"}\r\n {props.extraWord ? props.extraWord : \"from the list\"}?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, FormEvent, useState } from \"react\";\r\nimport { createStyles, Grid, makeStyles, Theme } from \"@material-ui/core\";\r\nimport { SingleTextField } from \"../formInputs/SingleTextField\";\r\nimport { formRightBtnBlock } from \"../../styles/generalStyles\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { ErrorDisplay } from \"../ErrorDisplay\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n formRightBtnBlock,\r\n })\r\n);\r\n\r\ntype CreateProfileFormPropsType = {\r\n onClose: Function;\r\n createProfile: Function;\r\n editName: Function;\r\n edit?: boolean;\r\n currentName?: string;\r\n};\r\n\r\nexport const CreateProfileForm = (props: CreateProfileFormPropsType) => {\r\n const classes = useStyles();\r\n const [name, setName] = useState(props.edit ? props.currentName : \"\");\r\n const [loading, setLoading] = useState(false);\r\n const [errors, setErrors] = useState>({});\r\n\r\n const handleInputChange = (e: ChangeEvent) => {\r\n const value = e.target.value;\r\n setName(value);\r\n };\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (Object.keys(errors).length === 0) {\r\n setLoading(true);\r\n if (props.edit) {\r\n props.editName(name, onSubmitDone, onSubmitFail);\r\n } else {\r\n props.createProfile(name, onSubmitDone, onSubmitFail);\r\n }\r\n }\r\n };\r\n\r\n const onSubmitDone = () => {\r\n props.onClose();\r\n };\r\n\r\n const onSubmitFail = (error: Record) => {\r\n setErrors(error);\r\n setLoading(false);\r\n };\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 \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { createProfile, updateProfile } from \"../../actions/profilesActions\";\r\nimport { CreateProfileForm } from \"../../components/profiles/CreateProfileForm\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\n\r\ntype CreateProfileFormReduxPropsType = {\r\n onClose: Function;\r\n userId: string;\r\n edit?: boolean;\r\n currentProfile: RunnerType;\r\n};\r\n\r\nexport const CreateProfileFormRedux = (\r\n props: CreateProfileFormReduxPropsType\r\n) => {\r\n const userId = props.userId;\r\n const dispatch = useDispatch();\r\n const handleCreateProfile = (\r\n name: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n createProfile(name, userId!, doneBack, failBack)(dispatch);\r\n };\r\n\r\n const handleEditProfile = (\r\n newName: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n updateProfile(\r\n props.currentProfile.uid,\r\n newName,\r\n [],\r\n [],\r\n undefined,\r\n doneBack,\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, Fragment, useEffect, useState } from \"react\";\r\nimport {\r\n createStyles,\r\n Grid,\r\n Hidden,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\n\r\nimport { drawerStyles, headerStyles } from \"../../styles/generalStyles\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nimport { EnrolmentType, RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { ModalForm } from \"../gadgets/ModalForm\";\r\nimport { PermanentPhotoFormRedux } from \"../../container/profiles/PermanentPhotoFormRedux\";\r\nimport { EnrolmentInputType } from \"../../types/faceSearchTypes\";\r\n\r\nimport { ImagusRaceDrawer } from \"../../../ImagusComponents/Gadgets/ImagusRaceDrawer\";\r\nimport classNames from \"classnames\";\r\nimport { FaceSearchState } from \"../../reducers/faceSearchReducers\";\r\nimport { useFetchImageForRace } from \"../../helperFunctions/useFetchImagesForRace\";\r\nimport { updateProfile } from \"../../actions/profilesActions\";\r\nimport { PhotoDetails } from \"../profiles/PhotoDetails\";\r\nimport { PermanentPhotos } from \"../profiles/PermanentPhotos\";\r\nimport { useFetchImageForEnrolments } from \"../../helperFunctions/useFetchImageForEnrolments\";\r\nimport { ConfirmationDialog } from \"../gadgets/ConfirmationDialog\";\r\nimport { CreateProfileFormRedux } from \"../../container/profiles/CreateProfileFormRedux\";\r\nimport { InfoType } from \"../../reducers/userReducers\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...iconStyles(theme),\r\n ...headerStyles(theme),\r\n hide: {\r\n display: \"none\",\r\n },\r\n\r\n title: {\r\n fontWeight: 600,\r\n },\r\n })\r\n);\r\n\r\nexport type RacePageLayoutPropsType = {\r\n user: InfoType;\r\n raceList: Array | null;\r\n fetchRaces: Function;\r\n enrolments: Array;\r\n updateProfile: Function;\r\n updateRaceEnrolments: Function;\r\n getCurrentEnrolments: Function;\r\n getRaceDetails: Function;\r\n removeProfiles: Function;\r\n faceSearch: FaceSearchState;\r\n uploadFile: Function;\r\n permanentEnrolments?: Array;\r\n profileName?: string;\r\n};\r\n\r\nexport const RacePageLayout = (props: RacePageLayoutPropsType) => {\r\n const classes = useStyles();\r\n\r\n const [selectedRaceId, setSelectedRaceId] = useState(\"\");\r\n const [selectedRace, setSelectedRace] = useState();\r\n\r\n const [raceIndex, setRaceIndex] = useState();\r\n const [modal, setModal] = useState(false);\r\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\r\n\r\n const [isProfileModalOpen, setIsProfileModalOpen] = useState(false);\r\n\r\n const handleRaceSelect = (raceId: string) => {\r\n setSelectedRaceId(raceId);\r\n let race: RunnerType | undefined;\r\n if (props.raceList) {\r\n race = props.raceList.find((race) => race.uid === raceId);\r\n setRaceIndex(props.raceList.findIndex((race) => race.uid === raceId));\r\n }\r\n\r\n setSelectedRace(race);\r\n };\r\n\r\n const handleDeleteDialog = (status: boolean) => {\r\n setConfirmDialogOpen(status);\r\n };\r\n\r\n const resetSelection = () => {\r\n setRaceIndex(undefined);\r\n setSelectedRace(undefined);\r\n setSelectedRaceId(\"\");\r\n };\r\n\r\n const addToProfileFail = () => {};\r\n\r\n const addFromPermanentList = (\r\n newIdList: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n props.updateRaceEnrolments(\r\n selectedRaceId,\r\n newIdList,\r\n [],\r\n doneBack,\r\n failBack\r\n );\r\n };\r\n\r\n /** The process of adding enrolment from an item\r\n * --Add enrolment to profile\r\n * --If success, add to the item\r\n * --Else check if the enrolment exist in this item\r\n * --If not, proceed to add to the item\r\n */\r\n const addNewEnrolments = (\r\n newEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n addEnrolmentsToProfile(newEnrolments, doneBack, failBack);\r\n };\r\n\r\n /**Add Enrolments To profile */\r\n const addEnrolmentsToProfile = (\r\n newEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n const currentEnrolments = props.enrolments;\r\n console.log(selectedRace);\r\n console.log(newEnrolments);\r\n props.updateProfile(\r\n selectedRaceId,\r\n selectedRace!.name,\r\n newEnrolments,\r\n [],\r\n (results: Array) => {\r\n addToProfileDone(results);\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n );\r\n };\r\n\r\n const addToProfileDone = (newEnrolments: Array) => {\r\n //update the redux store\r\n // const currentEnrolmentIds = props\r\n // .getCurrentEnrolments()\r\n // .map((e: EnrolmentType) => e.enrolmentId);\r\n // //Filter out ids that were not included in the currentEnrolmentIds list\r\n // let newIdList: Array = newEnrolments.filter(\r\n // (ce) => !currentEnrolmentIds.includes(ce)\r\n // );\r\n // addEnrolmentsToItem(newIdList);\r\n console.log(\"add done\");\r\n props.getCurrentEnrolments(selectedRaceId);\r\n };\r\n\r\n const removePhoto = (\r\n enrolmentsIds: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n props.updateProfile(\r\n selectedRaceId,\r\n selectedRace!.name,\r\n [],\r\n enrolmentsIds,\r\n () => {\r\n props.getCurrentEnrolments(selectedRaceId);\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n );\r\n };\r\n\r\n /** Add enrolments to item (race, hotel, ...) */\r\n const addEnrolmentsToItem = (\r\n enrolmentIdList: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n props.updateRaceEnrolments(\r\n selectedRaceId,\r\n enrolmentIdList,\r\n [],\r\n () => {\r\n console.log(\"Add to this hotel successfull\");\r\n props.getRaceDetails(\r\n selectedRaceId,\r\n () => {\r\n console.log(\"get race success\");\r\n },\r\n (e: any) => {\r\n console.log(e);\r\n }\r\n );\r\n },\r\n (error: any) => {\r\n console.log(\"Add fail\", error);\r\n }\r\n );\r\n };\r\n\r\n /** Remove enrolments from item (race, hotel, ...) */\r\n const removeEnrolmentsFromItem = (\r\n enrolmentsIdList: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n props.updateRaceEnrolments(\r\n selectedRaceId,\r\n [],\r\n enrolmentsIdList,\r\n () => {\r\n props.getRaceDetails(selectedRaceId);\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n );\r\n };\r\n\r\n const handleRemoveProfile = () => {\r\n props.removeProfiles([selectedRaceId], () => {\r\n resetSelection();\r\n props.fetchRaces(\"\");\r\n });\r\n };\r\n\r\n const handleEditProfileName = (status: boolean) => {\r\n setIsProfileModalOpen(status);\r\n };\r\n\r\n const onEditProfileDone = () => {\r\n setIsProfileModalOpen(false);\r\n\r\n props.fetchRaces(\"\", (result: Array) => {\r\n setRaceIndex(result.findIndex((race) => race.uid === selectedRaceId));\r\n });\r\n };\r\n\r\n //Get a list of enrolments based on the id arrays from selected face\r\n let raceEnrolments: Array = [];\r\n\r\n if (selectedRaceId !== \"\") {\r\n let raceIndex = props.raceList?.findIndex((r) => r.uid === selectedRaceId);\r\n if (raceIndex !== undefined && raceIndex > -1) {\r\n props.raceList &&\r\n props.raceList[raceIndex].enrolments.map((id) => {\r\n let enrolmentIndex = props.enrolments.findIndex(\r\n (e) => e.enrolmentId === id.enrolmentId\r\n );\r\n if (enrolmentIndex > -1) {\r\n raceEnrolments.push(props.enrolments[enrolmentIndex]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {/** Drawer on normal screen */}\r\n \r\n \r\n \r\n\r\n {/**\r\n * To do:\r\n * Drawer on smaller and mobile screen */}\r\n {/** Main screen */}\r\n
\r\n {props.raceList && raceIndex !== undefined && (\r\n // setModal(true)}\r\n // // updateFromPermanents={addFromPermanentList}\r\n // addEnrolment={addNewEnrolments}\r\n // removeEnrolment={removeEnrolmentsFromItem}\r\n // faceSearch={props.faceSearch}\r\n // uploadFile={props.uploadFile}\r\n // permanentEnrolments={props.permanentEnrolments}\r\n // profileName={props.profileName}\r\n // />\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Photos uploaded to {props.raceList[raceIndex].name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n\r\n handleDeleteDialog(false)}\r\n confirmFunction={handleRemoveProfile}\r\n itemName={selectedRace?.name}\r\n />\r\n\r\n {props.raceList && raceIndex !== undefined && (\r\n setIsProfileModalOpen(false)}\r\n form={\r\n \r\n }\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n fetchAllProfiles,\r\n fetchProfileById,\r\n getProfileAvatar,\r\n} from \"../../../admin/actions/participantsActions\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { SET_SEARCH_QUERY } from \"../../actions/actionNames\";\r\nimport { uploadFile, detectFaces } from \"../../actions/faceSearchActions\";\r\nimport {\r\n fetchActiveProfile,\r\n removeProfiles,\r\n updateProfile,\r\n} from \"../../actions/profilesActions\";\r\nimport {\r\n fetchRace,\r\n fetchRaceDetailsById,\r\n updateRaceEnrolment,\r\n} from \"../../actions/raceActions\";\r\nimport { RacePageLayout } from \"../../components/race/RacePageLayout\";\r\nimport { useFetchAllProfiles } from \"../../helperFunctions/useFetchAllProfiles\";\r\n\r\nimport { useFetchRaces } from \"../../helperFunctions/useFetchRaces\";\r\nimport { useSelectProfile } from \"../../helperFunctions/useSelectProfile\";\r\nimport { EnrolmentType, RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { Race } from \"../../reducers/raceReducers\";\r\nimport { RunnerResponseModel } from \"../../types/ApiReturnTypes\";\r\nimport { EnrolmentInputType } from \"../../types/faceSearchTypes\";\r\n\r\ntype RaceReduxPropsType = {\r\n races: Array | null;\r\n getRaces: Function;\r\n};\r\n\r\nexport const RaceRedux = (props: RaceReduxPropsType) => {\r\n const [open, setOpen] = useState(false);\r\n\r\n //----------------Access Redux Store---------------//\r\n const accountInfo = useSelector((state: AppState) => state.global.user.info);\r\n // const races = useSelector((state: AppState) => state.global.races.raceList);\r\n const profile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n const enrolments = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile.enrolments\r\n );\r\n const faceSearch = useSelector((state: AppState) => state.global.faceSearch);\r\n const dispatch = useDispatch();\r\n\r\n useSelectProfile(accountInfo?.id);\r\n // useFetchRaces();\r\n // useFetchAllProfiles();\r\n // useFetchImage();\r\n\r\n useEffect(() => {\r\n props.getRaces(\"\");\r\n }, []);\r\n\r\n //----------------Call Apis---------------//\r\n\r\n const getRaceDetailsById = (\r\n raceId: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n fetchRaceDetailsById(raceId, profile.uid, doneBack, failBack)(dispatch);\r\n };\r\n\r\n const handleUpdateCurrentProfile = (\r\n name: string,\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n accountInfo &&\r\n updateProfile(\r\n profile.uid,\r\n name,\r\n newEnrolments,\r\n deleteEnrolments,\r\n undefined,\r\n () => {\r\n doneBack && doneBack();\r\n },\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const handleUpdateProfile = (\r\n profileId: string,\r\n name: string,\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n console.log(\"profileId\", profileId);\r\n console.log(\"name\", name);\r\n console.log(\"enrolments\", newEnrolments);\r\n accountInfo &&\r\n updateProfile(\r\n profileId,\r\n name,\r\n newEnrolments,\r\n deleteEnrolments,\r\n undefined,\r\n doneBack,\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const handleUpdateRaceEnrolment = (\r\n raceId: string,\r\n newEnrolments: Array,\r\n deleteEnrolments: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n //update race\r\n updateRaceEnrolment(\r\n raceId,\r\n profile.uid,\r\n newEnrolments,\r\n deleteEnrolments,\r\n doneBack,\r\n //if fail, remove enrolment from profile\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const handleUploadFile = (\r\n file: File | Blob,\r\n doneBack: Function,\r\n failBack?: Function\r\n ) => {\r\n uploadFile(\r\n file,\r\n true,\r\n (token: string) =>\r\n detectFaces(\r\n token,\r\n () => {\r\n doneBack(token);\r\n },\r\n failBack\r\n )(dispatch),\r\n failBack\r\n )(dispatch);\r\n };\r\n\r\n const handleRemoveProfiles = (\r\n profileIds: Array,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n removeProfiles(profileIds, doneBack, failBack)(dispatch);\r\n };\r\n\r\n /** Fetch current enrolments */\r\n const getCurrentEnrolmentList = (profileId: string): Array => {\r\n let enrolments: Array = [];\r\n fetchActiveProfile(profileId, () => {\r\n enrolments = profile.enrolments;\r\n })(dispatch);\r\n\r\n return enrolments;\r\n };\r\n\r\n const getProfileEnrolments = (profileId: string): Array => {\r\n let enrolments: Array = [];\r\n fetchProfileById(profileId, (profile: RunnerType) => {\r\n enrolments = profile.enrolments;\r\n })(dispatch);\r\n return enrolments;\r\n };\r\n\r\n let permanentEnrolments: Array = [];\r\n enrolments.map((e) => {\r\n if (e.permanent && e.faces[0].imgUrl) {\r\n return permanentEnrolments.push(e);\r\n }\r\n });\r\n\r\n //----------------Return---------------//\r\n return (\r\n \r\n );\r\n};\r\n","import { Button, createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport React, { useState } from \"react\";\r\nimport { RaceRedux } from \"../container/race/RaceRedux\";\r\nimport { contentStyles, panelStyles } from \"../styles/generalStyles\";\r\nimport { AppHeader } from \"../components/gadgets/AppHeader\";\r\nimport { UserAuth } from \"../container/UserAuth\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\nimport { RunnerType } from \"../reducers/profilesReducers\";\r\nimport { buttonStyles } from \"../styles/buttonStyles\";\r\nimport { ModalForm } from \"../components/gadgets/ModalForm\";\r\nimport { CreateProfileFormRedux } from \"../container/profiles/CreateProfileFormRedux\";\r\nimport {\r\n downloadFiles,\r\n fetchAllProfiles,\r\n} from \"../../admin/actions/participantsActions\";\r\nimport classNames from \"classnames\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...contentStyles(theme),\r\n ...panelStyles(theme),\r\n ...buttonStyles(theme),\r\n\r\n root: {\r\n color: theme.palette.primary.main,\r\n },\r\n\r\n rightMargin: {\r\n marginRight: \"5px\",\r\n },\r\n })\r\n);\r\n\r\nexport const Race = () => {\r\n const classes = useStyles();\r\n const [isProfileModalOpen, setIsProfileModalOpen] = useState(false);\r\n const races = useSelector(\r\n (state: AppState) => state.admin.participants.participants\r\n );\r\n const userInfo = useSelector((state: AppState) => state.global.user.info);\r\n const accountId = userInfo ? userInfo.id : \"\";\r\n const dispatch = useDispatch();\r\n const activeProfile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n const [currentNameQuery, setCurrentNameQuery] = useState(\"\");\r\n const getProfileList = (\r\n query: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n setCurrentNameQuery(query);\r\n\r\n fetchAllProfiles(1000, query, doneBack, failBack)(dispatch);\r\n };\r\n\r\n const onCreateProfileDone = () => {\r\n setIsProfileModalOpen(false);\r\n getProfileList(\"\");\r\n };\r\n\r\n const downloadEnrolments = (doneBack?: Function, failBack?: Function) => {\r\n downloadFiles(1000, currentNameQuery, doneBack, failBack);\r\n };\r\n\r\n return (\r\n \r\n
\r\n downloadEnrolments()}\r\n >\r\n Download enrolments\r\n ,\r\n setIsProfileModalOpen(true)}\r\n >\r\n Create profile\r\n ,\r\n ]}\r\n />\r\n\r\n
\r\n
\r\n \r\n\r\n setIsProfileModalOpen(false)}\r\n form={\r\n \r\n }\r\n />\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { InfoType } from \"../../reducers/userReducers\";\r\nimport {\r\n fetchActiveProfile,\r\n fetchProfiles,\r\n} from \"../../actions/profilesActions\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { profile } from \"console\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\n\r\ntype UserInfoPropsType = {\r\n profileInfo: RunnerType;\r\n};\r\n\r\nexport const UserProfileRedux = (props: UserInfoPropsType) => {\r\n return (\r\n This is the info page of {props.profileInfo.name}\r\n );\r\n\r\n // if (!activeProfile.uid) {\r\n // return Fetching profile...........;\r\n // } else {\r\n // return (\r\n // This is the info page of {activeProfile.name}\r\n // );\r\n // }\r\n};\r\n","import { CircularProgress, Grid, Typography } from \"@material-ui/core\";\r\nimport React from \"react\";\r\nimport { UserProfileRedux } from \"../../container/user/UserProfileRedux\";\r\nimport { RunnerType } from \"../../reducers/profilesReducers\";\r\nimport { InfoType } from \"../../reducers/userReducers\";\r\n\r\ntype UserProfilePropsType = {\r\n profileInfo: RunnerType | null;\r\n};\r\n\r\nexport const UserProfile = (props: UserProfilePropsType) => {\r\n return (\r\n \r\n \r\n {props.profileInfo ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { userDelete } from \"../../actions/userActions\";\r\nimport { ConfirmationDialog } from \"../../components/gadgets/ConfirmationDialog\";\r\n\r\ntype DeleteUserReduxType = {\r\n open: boolean;\r\n handleCancle: Function;\r\n handleConfirm: Function;\r\n};\r\n\r\nexport const DeleteUserRedux = (props: DeleteUserReduxType) => {\r\n const userInfo = useSelector((state: AppState) => state.global.user.info);\r\n\r\n const deleteUser = () => {\r\n userInfo &&\r\n userDelete(\r\n userInfo.id,\r\n () => {},\r\n (error: {}) => {\r\n console.log(error);\r\n }\r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { Typography } from \"@material-ui/core\";\r\nimport { Fragment } from \"react\";\r\n\r\nexport const TermsAndConditions = () => {\r\n return (\r\n \r\n Terms and Conditions\r\n \r\n 1. ACCEPTANCE THE USE OF LOREM IPSUM TERMS AND CONDITIONS Your access to\r\n and use of Lorem Ipsum (the app) is subject exclusively to these Terms\r\n and Conditions. You will not use the app for any purpose that is\r\n unlawful or prohibited by these Terms and Conditions. By using the app\r\n you are fully accepting the terms, conditions and disclaimers contained\r\n in this notice. If you do not accept these Terms and Conditions you must\r\n immediately stop using the app. 2. CREDIT CARD DETAILS All Lorem Ipsum\r\n purchases are managed by the individual App Stores (Apple, Google\r\n Windows) and Lorem Ipsum will never store your credit card information\r\n or make it available to any third parties. Any purchasing information\r\n provided will be provided directly from you to the respective App Store\r\n and you will be subject to their credit card policies. 3. LEGAL ADVICE\r\n The contents of Lorem Ipsum app do not constitute advice and should not\r\n be relied upon in making or refraining from making, any decision. All\r\n material contained on Lorem Ipsum is provided without any or warranty of\r\n any kind. You use the material on Lorem Ipsum at your own discretion 4.\r\n CHANGE OF USE Lorem Ipsum reserves the right to: 4.1 change or remove\r\n (temporarily or permanently) the app or any part of it without notice\r\n and you confirm that Lorem Ipsum shall not be liable to you for any such\r\n change or removal and. 4.2 change these Terms and Conditions at any\r\n time, and your continued use of the app following any changes shall be\r\n deemed to be your acceptance of such change. 5. LINKS TO THIRD PARTY\r\n APPS AND WEBSITES Lorem Ipsum app may include links to third party apps\r\n and websites that are controlled and maintained by others. Any link to\r\n other apps and websites is not an endorsement of such and you\r\n acknowledge and agree that we are not responsible for the content or\r\n availability of any such apps and websites. 6. COPYRIGHT 6.1 All\r\n copyright, trade marks and all other intellectual property rights in the\r\n app and its content (including without limitation the app design, text,\r\n graphics and all software and source codes connected with the app) are\r\n owned by or licensed to Lorem Ipsum or otherwise used by Lorem Ipsum as\r\n permitted by law. 6.2 In accessing the app you agree that you will\r\n access the content solely for your personal, non-commercial use. None of\r\n the content may be downloaded, copied, reproduced, transmitted, stored,\r\n sold or distributed without the prior written consent of the copyright\r\n holder. This excludes the downloading, copying and/or printing of pages\r\n of the app for personal, non-commercial home use only. 7. LINKS TO AND\r\n FROM OTHER APPS AND WEBSITES 7.1 Throughout this app you may find links\r\n to third party apps. The provision of a link to such an app does not\r\n mean that we endorse that app. If you visit any app via a link in this\r\n app you do so at your own risk. 7.2 Any party wishing to link to this\r\n app is entitled to do so provided that the conditions below are\r\n observed: (a) You do not seek to imply that we are endorsing the\r\n services or products of another party unless this has been agreed with\r\n us in writing; (b) You do not misrepresent your relationship with this\r\n app; and (c) The app from which you link to this app does not contain\r\n offensive or otherwise controversial content or, content that infringes\r\n any intellectual property rights or other rights of a third party. 7.3\r\n By linking to this app in breach of our terms, you shall indemnify us\r\n for any loss or damage suffered to this app as a result of such linking.\r\n 8. DISCLAIMERS AND LIMITATION OF LIABILITY 8.1 The app is provided on an\r\n AS IS and AS AVAILABLE basis without any representation or endorsement\r\n made and without warranty of any kind whether express or implied,\r\n including but not limited to the implied warranties of satisfactory\r\n quality, fitness for a particular purpose, non-infringement,\r\n compatibility, security and accuracy. 8.2 To the extent permitted by\r\n law, Lorem Ipsum will not be liable for any indirect or consequential\r\n loss or damage whatever (including without limitation loss of business,\r\n opportunity, data, profits) arising out of or in connection with the use\r\n of the app. 8.3 Lorem Ipsum makes no warranty that the functionality of\r\n the app will be uninterrupted or error free, that defects will be\r\n corrected or that the app or the server that makes it available are free\r\n of viruses or anything else which may be harmful or destructive. 8.4\r\n Nothing in these Terms and Conditions shall be construed so as to\r\n exclude or limit the liability of Lorem Ipsum for death or personal\r\n injury as a result of the negligence of Lorem Ipsum or that of its\r\n employees or agents. 9. INDEMNITY You agree to indemnify and hold Lorem\r\n Ipsum and its employees and agents harmless from and against all\r\n liabilities, legal fees, damages, losses, costs and other expenses in\r\n relation to any claims or actions brought against Lorem Ipsum arising\r\n out of any breach by you of these Terms and Conditions or other\r\n liabilities arising out of your use of this app. 10. SEVERANCE If any of\r\n these Terms and Conditions should be determined to be invalid, illegal\r\n or unenforceable for any reason by any court of competent jurisdiction\r\n then such Term or Condition shall be severed and the remaining Terms and\r\n Conditions shall survive and remain in full force and effect and\r\n continue to be binding and enforceable. 11. WAIVER If you breach these\r\n Conditions of Use and we take no action, we will still be entitled to\r\n use our rights and remedies in any other situation where you breach\r\n these Conditions of Use. 12. GOVERNING LAW These Terms and Conditions\r\n shall be governed by and construed in accordance with the law of and you\r\n hereby submit to the exclusive jurisdiction of the courts.\r\n \r\n \r\n );\r\n};\r\n","import {\r\n makeStyles,\r\n Theme,\r\n createStyles,\r\n Typography,\r\n Link,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport React, { ChangeEvent, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../../Store\";\r\nimport { userDelete } from \"../../actions/userActions\";\r\nimport { DeleteUserRedux } from \"../../container/user/DeleteUserRedux\";\r\nimport { buttonStyles } from \"../../styles/buttonStyles\";\r\nimport {\r\n contentStyles,\r\n panelStyles,\r\n headerStyles,\r\n} from \"../../styles/generalStyles\";\r\nimport { SingleCheckBox } from \"../formInputs/SingleCheckBox\";\r\nimport { ModalForm } from \"../gadgets/ModalForm\";\r\nimport { TermsAndConditions } from \"../TermsAndConditions\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...contentStyles(theme),\r\n ...panelStyles(theme),\r\n ...headerStyles(theme),\r\n ...buttonStyles(theme),\r\n contentTitleText: {\r\n fontSize: \"1rem\",\r\n fontStyle: \"inherit\",\r\n fontWeight: 500,\r\n letterSpacing: \"-0.01em\",\r\n lineHeight: \"32px\",\r\n },\r\n root: {\r\n color: theme.palette.primary.main,\r\n },\r\n invalid: {\r\n color: theme.palette.error.main,\r\n },\r\n\r\n contentPanelBorder: {\r\n marginTop: \"15px\",\r\n border: \"1px solid black\",\r\n borderRadius: \"25px\",\r\n width: \"auto\",\r\n backgroundColor: theme.palette.contentBackgroundColor,\r\n },\r\n\r\n centralPanel: {\r\n margin: \" 15px auto\",\r\n width: \"50%\",\r\n },\r\n settingBox: {\r\n padding: \"15px 15px\",\r\n },\r\n })\r\n);\r\n\r\ntype ProfileSettingPropsType = {};\r\n\r\nexport const ProfileSetting = (props: ProfileSettingPropsType) => {\r\n const classes = useStyles();\r\n const [agreed, setAgreement] = useState(false);\r\n const [openModal, setOpenModal] = useState(false);\r\n const [openConfirm, setOpenConfirm] = useState(false);\r\n const userInfo = useSelector((state: AppState) => state.global.user.info);\r\n\r\n const handleTickBoxChange = (e: ChangeEvent) => {\r\n setAgreement(e.target.checked);\r\n };\r\n\r\n const handleLinkClick = () => {\r\n setOpenModal(true);\r\n };\r\n\r\n const handleModalClose = () => {\r\n setOpenModal(false);\r\n };\r\n\r\n const handleDeleteClicked = () => {\r\n setOpenConfirm(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n setOpenConfirm(false);\r\n };\r\n\r\n const handleConfirmDelete = () => {\r\n userInfo && userDelete(userInfo.id);\r\n };\r\n\r\n return (\r\n
\r\n Setting\r\n
\r\n
\r\n \r\n \r\n Terms and Conditions\r\n \r\n \r\n \r\n Delete Your Account\r\n \r\n \r\n This will delete your account forever\r\n \r\n \r\n Proceed to delete\r\n \r\n \r\n }\r\n />\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport DoneIcon from \"@material-ui/icons/Done\";\r\n\r\nimport { PasswordStrength } from \"../../helperFunctions/stringFunctions\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n root: {\r\n position: \"relative\",\r\n width: \"40%\",\r\n minWidth: \"218px\",\r\n padding: \"5px 20px\",\r\n borderRadius: \"15px\",\r\n border: \"1px solid \" + theme.palette.grey[300],\r\n backgroundColor: \"rgb(238,238,238)\",\r\n boxShadow: \"5px 5px 5px #888888\",\r\n \"&:before\": {\r\n position: \"absolute\",\r\n bottom: \"100%\",\r\n content: \"''\",\r\n right: \"52px\",\r\n borderRight: \"17px solid transparent\",\r\n borderBottom: \"17px solid \" + theme.palette.grey[300],\r\n borderLeft: \"17px solid transparent\",\r\n },\r\n \"&:after\": {\r\n position: \"absolute\",\r\n bottom: \"100%\",\r\n content: \"''\",\r\n right: \"53px\",\r\n borderRight: \"16px solid transparent\",\r\n borderBottom: \"16px solid rgb(238,238,238)\",\r\n borderLeft: \"16px solid transparent\",\r\n },\r\n \"& $title\": {\r\n margin: \"0 0 5px 0\",\r\n fontWeight: \"bold\",\r\n fontSize: \"0.9375rem\",\r\n },\r\n \"& ul\": {\r\n padding: 0,\r\n margin: 0,\r\n listStyleType: \"none\",\r\n \"& li\": {\r\n height: \"24px\",\r\n minHeight: \"20px\",\r\n lineHeight: \"22px\",\r\n fontSize: \"0.75rem\",\r\n \"& SVG\": {\r\n verticalAlign: \"top\",\r\n },\r\n },\r\n },\r\n \"& $invalid\": {\r\n color: theme.palette.error.main,\r\n },\r\n \"& $valid\": {\r\n color: theme.palette.success.main,\r\n },\r\n },\r\n title: {},\r\n invalid: {},\r\n valid: {},\r\n })\r\n);\r\n\r\ntype PasswordStrengthBoxPropsType = {\r\n password: string;\r\n passwordStrength: PasswordStrength;\r\n};\r\n\r\nexport const PasswordStrengthBox = (props: PasswordStrengthBoxPropsType) => {\r\n const classes = useStyles();\r\n\r\n const shouldDisplay = (): boolean => {\r\n return (\r\n Object.values(props.passwordStrength).includes(false) && !!props.password\r\n );\r\n };\r\n\r\n if (shouldDisplay()) {\r\n return (\r\n
\r\n
Password Rules:
\r\n
    \r\n \r\n {props.passwordStrength.length ? (\r\n \r\n ) : (\r\n \r\n )}\r\n At least 8 characters\r\n \r\n \r\n {props.passwordStrength.uppercase ? (\r\n \r\n ) : (\r\n \r\n )}\r\n At least one uppercase letter\r\n \r\n \r\n {props.passwordStrength.lowercase ? (\r\n \r\n ) : (\r\n \r\n )}\r\n At least one lowercase letter\r\n \r\n \r\n {props.passwordStrength.number ? (\r\n \r\n ) : (\r\n \r\n )}\r\n At least one number\r\n \r\n \r\n {props.passwordStrength.space ? (\r\n \r\n ) : (\r\n \r\n )}\r\n No whitespace\r\n \r\n
\r\n
\r\n );\r\n } else return null;\r\n};\r\n","import { Grid, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport React, { ChangeEvent, FormEvent, useState } from \"react\";\r\nimport { SingleTextField } from \"../formInputs/SingleTextField\";\r\nimport { formRightBtnBlock } from \"../../styles/generalStyles\";\r\nimport { ErrorDisplay, setErrorMessage } from \"../ErrorDisplay\";\r\nimport { CancelButton } from \"../Buttons/CancelButton\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { PasswordStrengthBox } from \"./PasswordStrengthBox\";\r\nimport {\r\n checkPasswordStrength,\r\n PasswordStrength,\r\n} from \"../../helperFunctions/stringFunctions\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n formRightBtnBlock,\r\n })\r\n);\r\n\r\ntype PasswordType = {\r\n oldPassword: string;\r\n newPassword: string;\r\n newPasswordConfirm: string;\r\n};\r\n\r\ntype ChangePasswordFormPropsType = {\r\n onClose: Function;\r\n changePassword: Function;\r\n};\r\n\r\nexport const ChangePasswordForm = (props: ChangePasswordFormPropsType) => {\r\n const classes = useStyles();\r\n const [loading, setLoading] = useState(false);\r\n const [passwords, setPasswords] = useState({\r\n oldPassword: \"\",\r\n newPassword: \"\",\r\n newPasswordConfirm: \"\",\r\n });\r\n\r\n const [passwordStrength, setPasswordStrength] = useState({\r\n number: false,\r\n length: false,\r\n uppercase: false,\r\n lowercase: false,\r\n space: false,\r\n });\r\n const [errors, setErrors] = useState>({});\r\n\r\n const handleInputChange = (e: ChangeEvent) => {\r\n const name = e.target.name;\r\n const value = e.target.value;\r\n setPasswords({ ...passwords, [name]: value });\r\n\r\n if (name === \"oldPassword\") {\r\n //clear errors on input\r\n setErrors(setErrorMessage(errors, \"currentPassword\", \"\"));\r\n }\r\n\r\n if (name === \"newPassword\") {\r\n handleNewPasswordInputChange(value);\r\n }\r\n\r\n if (name === \"newPasswordConfirm\") {\r\n handlePasswordConfirm(value);\r\n }\r\n };\r\n\r\n const handleNewPasswordInputChange = (value: string) => {\r\n //check password strength\r\n const checkedStrength = checkPasswordStrength(passwordStrength, value);\r\n setPasswordStrength(checkedStrength);\r\n console.log(checkedStrength);\r\n if (Object.values(checkedStrength).includes(false)) {\r\n setErrors(\r\n setErrorMessage(errors, \"passwordStrength\", \"Invalid password format\")\r\n );\r\n } else {\r\n setErrorMessage(errors, \"passwordStrength\", \"\");\r\n }\r\n\r\n //check matching if new password exist\r\n if (\r\n !!passwords.newPasswordConfirm &&\r\n passwords.newPasswordConfirm !== value\r\n ) {\r\n setErrorMessage(errors, \"password\", \"Password do not matched\");\r\n } else {\r\n setErrorMessage(errors, \"password\", \"\");\r\n }\r\n };\r\n\r\n const handlePasswordConfirm = (value: string) => {\r\n //check matching\r\n if (!!value && value !== passwords.newPassword) {\r\n setErrorMessage(errors, \"password\", \"Password do not matched\");\r\n } else {\r\n setErrorMessage(errors, \"password\", \"\");\r\n }\r\n };\r\n\r\n const handleSubmit = async (e: FormEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (Object.keys(errors).length === 0) {\r\n setLoading(true);\r\n props.changePassword(\r\n passwords.oldPassword,\r\n passwords.newPassword,\r\n submitDone,\r\n submitFail\r\n );\r\n }\r\n };\r\n\r\n const submitDone = () => {\r\n props.onClose();\r\n };\r\n\r\n const submitFail = (error: Record) => {\r\n // setErrors({ errors: error });\r\n setErrors(error);\r\n setLoading(false);\r\n };\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 \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n 0}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { changePassword } from \"../../actions/userActions\";\r\nimport { ChangePasswordForm } from \"../../components/users/ChangePasswordForm\";\r\n\r\ntype ChangePasswordReduxPropsType = {\r\n onClose: Function;\r\n};\r\n\r\nexport const ChangePasswordRedux = (props: ChangePasswordReduxPropsType) => {\r\n const handlePasswordChange = (\r\n oldPassword: string,\r\n newPassword: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n changePassword(oldPassword, newPassword, doneBack, failBack);\r\n };\r\n return (\r\n \r\n );\r\n};\r\n","import {\r\n Button,\r\n CircularProgress,\r\n createStyles,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport React, { Fragment, useEffect, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { AppState } from \"../../Store\";\r\nimport { AppHeader } from \"../components/gadgets/AppHeader\";\r\nimport { UserProfile } from \"../components/users/UserProfile\";\r\nimport { UserAuth } from \"../container/UserAuth\";\r\nimport {\r\n contentStyles,\r\n headerStyles,\r\n panelStyles,\r\n} from \"../styles/generalStyles\";\r\nimport { buttonStyles } from \"../styles/buttonStyles\";\r\n\r\nimport { ProfileSetting } from \"../components/users/ProfileSetting\";\r\nimport { ModalForm } from \"../components/gadgets/ModalForm\";\r\nimport { ChangePasswordRedux } from \"../container/user/ChangePasswordRedux\";\r\nimport { useSelectProfile } from \"../helperFunctions/useSelectProfile\";\r\nimport { InfoType } from \"../reducers/userReducers\";\r\n\r\nimport { fetchActiveProfile, fetchProfiles } from \"../actions/profilesActions\";\r\nimport { CreateProfileFormRedux } from \"../container/profiles/CreateProfileFormRedux\";\r\nimport classNames from \"classnames\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n\r\n root: {\r\n color: theme.palette.primary.main,\r\n },\r\n\r\n rightMargin: {\r\n marginRight: \"5px\",\r\n },\r\n })\r\n);\r\n\r\nexport const Profile = () => {\r\n const classes = useStyles();\r\n const [isModalOpen, setIsModalOpen] = useState(false);\r\n const [isProfileModalOpen, setIsProfileModalOpen] = useState(false);\r\n const userInfo = useSelector((state: AppState) => state.global.user.info);\r\n const accountId = userInfo ? userInfo.id : \"\";\r\n // const profile = useSelectProfile(accountId);\r\n const profileList = useSelector(\r\n (state: AppState) => state.global.profiles.profileIds\r\n );\r\n const profile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n\r\n const dispatch = useDispatch();\r\n\r\n useSelectProfile(accountId);\r\n useEffect(() => {\r\n if (profileList) {\r\n if (profileList.length === 0) {\r\n setIsProfileModalOpen(true);\r\n } else {\r\n console.log(\"got to here\");\r\n fetchActiveProfile(profileList[0])(dispatch);\r\n }\r\n }\r\n }, [profileList]);\r\n\r\n return (\r\n \r\n \r\n setIsModalOpen(true)}\r\n >\r\n Change Password\r\n ,\r\n setIsProfileModalOpen(true)}\r\n >\r\n Create profile\r\n ,\r\n ]}\r\n />\r\n \r\n \r\n setIsModalOpen(false)}\r\n form={ setIsModalOpen(false)} />}\r\n />\r\n\r\n setIsProfileModalOpen(false)}\r\n form={\r\n setIsProfileModalOpen(false)}\r\n userId={accountId}\r\n currentProfile={profile}\r\n />\r\n }\r\n />\r\n \r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/AHA-Logo.e47f5b4d.png\";","import React, { useEffect, useState } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n createStyles,\r\n Grid,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\n\r\nimport LogoImage from \"../../images/AHA-Logo.png\";\r\nimport { panelStyles, formText } from \"../styles/generalStyles\";\r\nimport { iconStyles } from \"../styles/iconStyles\";\r\nimport { RedirectToLogin } from \"./RedirectToLogin\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n// import { addUserToPeopleDB } from \"../actions/profilesActions\";\r\n\r\nimport { AppState } from \"../../Store\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n ...iconStyles(theme),\r\n formText,\r\n wrapper: {\r\n width: \"100%\",\r\n maxWidth: \"480px\",\r\n margin: \"10% auto\",\r\n backgroundColor: \"inherit\",\r\n height: \"auto\",\r\n border: \"1px solid black\",\r\n },\r\n maxHeight: {\r\n hieght: \"auto\",\r\n },\r\n formLogo: {\r\n width: \"100%\",\r\n margin: \"2% 0\",\r\n padding: \"10px\",\r\n height: \"auto\",\r\n float: \"none\",\r\n },\r\n titleText: {\r\n color: theme.palette.common.black,\r\n },\r\n titleMargin: {\r\n marginBottom: \"30px\",\r\n },\r\n panel: {\r\n width: \"85%\",\r\n margin: \"auto\",\r\n },\r\n })\r\n);\r\n\r\ntype SignupSuccessPropsType = {\r\n name: string;\r\n profileId: string;\r\n};\r\n\r\nexport const SignupSuccess = (props: SignupSuccessPropsType) => {\r\n const classes = useStyles();\r\n const [loading, setLoading] = useState(true);\r\n const updating = useSelector(\r\n (state: AppState) => state.global.profiles.updating\r\n );\r\n const dispatch = useDispatch();\r\n // useEffect(() => {\r\n // addUserToPeopleDB(\r\n // props.name,\r\n // props.profileId,\r\n // () => {\r\n // setLoading(false);\r\n // },\r\n // (error: any) => {\r\n // console.log(error);\r\n // setLoading(false);\r\n // }\r\n // )(dispatch);\r\n // }, [dispatch, props]); //these will not change => only call api once\r\n\r\n useEffect(() => {\r\n setTimeout(() => {\r\n setLoading(false);\r\n }, 3000);\r\n }, [props]);\r\n\r\n return (\r\n
\r\n
\r\n \"Logo\"\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Registration Completed!\r\n \r\n \r\n \r\n
\r\n \r\n Redirecting to Login Page ...\r\n \r\n {!loading && }\r\n
\r\n
\r\n );\r\n};\r\n","import {\r\n createStyles,\r\n Grid,\r\n IconButton,\r\n InputAdornment,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport PersonIcon from \"@material-ui/icons/Person\";\r\nimport LockOutlinedIcon from \"@material-ui/icons/LockOutlined\";\r\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\r\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\r\nimport EmailIcon from \"@material-ui/icons/Email\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport {\r\n formText,\r\n formRightBtnBlock,\r\n inputStyles,\r\n bannerStyles,\r\n} from \"../../styles/generalStyles\";\r\nimport LogoImage from \"../../../images/AHA-Logo.png\";\r\nimport React, { ChangeEvent, FormEvent, Fragment, useState } from \"react\";\r\nimport { SingleTextField } from \"../formInputs/SingleTextField\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { ErrorDisplay, setErrorMessage } from \"../ErrorDisplay\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n checkEmailFormat,\r\n checkPasswordStrength,\r\n checkUserNameFormat,\r\n PasswordStrength,\r\n} from \"../../helperFunctions/stringFunctions\";\r\nimport { PasswordStrengthBox } from \"./PasswordStrengthBox\";\r\nimport { SignupSuccess } from \"../../container/SignupSuccess\";\r\nimport { useDispatch } from \"react-redux\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n ...inputStyles(theme),\r\n ...bannerStyles(theme),\r\n formText,\r\n formRightBtnBlock,\r\n wrapper: {\r\n width: \"100%\",\r\n maxWidth: \"480px\",\r\n margin: \"0 auto\",\r\n // paddingTop: \"50px\",\r\n\r\n backgroundColor: \"inherit\",\r\n height: \"auto\",\r\n border: \"1px solid black\",\r\n },\r\n formLogoWrapper: {\r\n width: \"100%\",\r\n maxWidth: \"480px\",\r\n margin: \"0 auto\",\r\n // paddingTop: \"50px\",\r\n textAlign: \"center\",\r\n backgroundColor: \"inherit\",\r\n height: \"auto\",\r\n },\r\n formLogo: {\r\n margin: \"0 auto\",\r\n width: \"50%\",\r\n padding: \"10px\",\r\n height: \"auto\",\r\n maxHeight: \"150px\",\r\n float: \"none\",\r\n },\r\n clear: {\r\n clear: \"both\",\r\n },\r\n titleText: {\r\n color: theme.palette.common.black,\r\n },\r\n textAlignLeft: {\r\n width: \"100%\",\r\n textAlign: \"left\",\r\n },\r\n titleMargin: {\r\n marginBottom: \"30px\",\r\n },\r\n iconBlock: {\r\n height: \"54px\",\r\n lineHeight: \"110px\",\r\n },\r\n formHint: {\r\n fontStyle: \"italic\",\r\n paddingRight: \"10px\",\r\n },\r\n formLink: {\r\n color: theme.palette.primary.main,\r\n textDecoration: \"underline\",\r\n fontWeight: 500,\r\n },\r\n panel: {\r\n width: \"85%\",\r\n margin: \"auto\",\r\n },\r\n switchText: {\r\n fontStyle: \"italic\",\r\n },\r\n bannerTitle: {\r\n backgroundColor: theme.palette.common.black,\r\n color: theme.palette.common.white,\r\n height: \"50px\",\r\n },\r\n })\r\n);\r\n\r\ntype LoginFormPropsType = {\r\n userAction: Function;\r\n isSignup?: boolean;\r\n};\r\n\r\nexport const LoginForm = (props: LoginFormPropsType) => {\r\n //states\r\n const [errors, setErrors] = useState>({});\r\n const [loading, setLoading] = useState(false);\r\n // const [username, setUsername] = useState(\"\");\r\n // const [user, setUser] = useState({\r\n // firstname: \"\",\r\n // lastname: \"\",\r\n // password: \"\",\r\n // });\r\n const [signUpDone, setSignUpDone] = useState(false);\r\n const [user, setUser] = useState({\r\n username: \"\",\r\n password: \"\",\r\n passwordRepeat: \"\",\r\n email: \"\",\r\n });\r\n\r\n const [passwordDisplay, setPasswordDispaly] = useState(false);\r\n const [passwordStrength, setPasswordStrength] = useState({\r\n number: false,\r\n length: false,\r\n uppercase: false,\r\n lowercase: false,\r\n space: false,\r\n });\r\n const [id, setId] = useState(\"\");\r\n const dispatch = useDispatch();\r\n\r\n const classes = useStyles();\r\n\r\n //functions\r\n const handleFormSubmit = async (event: FormEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n setLoading(true);\r\n if (props.isSignup) {\r\n //action for sign up\r\n props.userAction(\r\n //combining first name and last name to a single username\r\n //in order to use current api and database\r\n // user.firstname.trim().concat(user.lastname.trim()).trim(),\r\n user.username.trim(),\r\n user.password.trim(),\r\n user.email.trim(),\r\n signupDone,\r\n submitFail\r\n );\r\n } else {\r\n //action for login\r\n props.userAction(\r\n user.email.trim(),\r\n user.password.trim(),\r\n loginDone,\r\n submitFail\r\n );\r\n }\r\n };\r\n\r\n const loginDone = () => {\r\n const param = window.location.search;\r\n const searchParam = new URLSearchParams(param);\r\n //search for next parameter\r\n const next = searchParam.get(\"next\");\r\n if (next) {\r\n //if found, redirect to predefined location\r\n window.location.href = next;\r\n } else {\r\n //redirect to default location\r\n window.location.href = \"profile\";\r\n }\r\n };\r\n\r\n const submitFail = (errors: Record) => {\r\n setErrors(errors);\r\n setLoading(false);\r\n };\r\n\r\n const signupDone = (res: any) => {\r\n const user = JSON.parse(res);\r\n setId(user.id);\r\n setSignUpDone(true);\r\n };\r\n\r\n const handleUserChange = (event: ChangeEvent) => {\r\n const name = event.target.name;\r\n const value = event.target.value;\r\n setUser((state) => ({ ...state, [name]: value }));\r\n //clear credentials errors when user start input\r\n setErrors(setErrorMessage(errors, \"credentials\", \"\"));\r\n\r\n if (name === \"username\") {\r\n usernameErrorHandler(value);\r\n }\r\n\r\n if (name === \"email\") {\r\n emailErrorHandler(value);\r\n }\r\n\r\n if (name === \"passwordRepeat\") {\r\n passwordRepeatErrorHandler(value);\r\n }\r\n\r\n if (name === \"password\") {\r\n passwordErrorHandle(value);\r\n if (props.isSignup) {\r\n passwordStrengthErrorHandler(value);\r\n }\r\n }\r\n };\r\n\r\n const usernameErrorHandler = (value: string) => {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"userName\",\r\n !checkUserNameFormat(value)\r\n ? \"Username could only contains these characters: a-zA-Z0-9-._@+/\\\\\"\r\n : \"\"\r\n )\r\n );\r\n };\r\n\r\n const passwordRepeatErrorHandler = (value: string) => {\r\n let error = false;\r\n\r\n if (!!value && user.password !== value) {\r\n error = true;\r\n }\r\n\r\n setErrors(\r\n setErrorMessage(errors, \"password\", error ? \"Passwords do not match\" : \"\")\r\n );\r\n };\r\n\r\n const passwordErrorHandle = (value: string) => {\r\n let error = false;\r\n if (!!user.passwordRepeat && user.passwordRepeat !== value) {\r\n error = true;\r\n }\r\n\r\n setErrors(\r\n setErrorMessage(errors, \"password\", error ? \"Passwords do not match\" : \"\")\r\n );\r\n };\r\n\r\n const passwordStrengthErrorHandler = (value: string) => {\r\n let error = false;\r\n\r\n const checkStrength = checkPasswordStrength(passwordStrength, value);\r\n setPasswordStrength(checkStrength);\r\n\r\n if (Object.values(checkStrength).includes(false) && !!value) {\r\n error = true;\r\n }\r\n\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"passwordStrength\",\r\n error ? \"Password format incorrect\" : \"\"\r\n )\r\n );\r\n };\r\n\r\n const emailErrorHandler = (value: string) => {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"email\",\r\n !!value && !checkEmailFormat(value) ? \"Invalid email format\" : \"\"\r\n )\r\n );\r\n };\r\n if (signUpDone && id) {\r\n return ;\r\n } else\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n {props.isSignup ? \"Create a new account\" : \"Sign In\"}\r\n \r\n
\r\n
\r\n \r\n Face Capture Module for AHA\r\n \r\n
\r\n \r\n \r\n \r\n {props.isSignup && (\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 \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 \r\n \r\n \r\n setPasswordDispaly(!passwordDisplay)}\r\n >\r\n {passwordDisplay ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n }\r\n />\r\n {props.isSignup && (\r\n \r\n )}\r\n \r\n \r\n {props.isSignup && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n 0}\r\n />\r\n\r\n \r\n Forget your password?\r\n \r\n Reset Here\r\n \r\n \r\n \r\n \r\n {props.isSignup ? (\r\n \r\n \r\n Already have an account?\r\n \r\n \r\n Login\r\n \r\n \r\n ) : (\r\n \r\n \r\n Don't have an account?\r\n \r\n \r\n Sign Up\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport { panelStyles } from \"../styles/generalStyles\";\r\nimport { LoginForm } from \"../components/users/LoginForm\";\r\nimport { userLogin } from \"../actions/userActions\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n maxHeight: {\r\n height: \"100%\",\r\n },\r\n\r\n padding: {\r\n paddingTop: \"30px\",\r\n },\r\n\r\n // center: {\r\n // position: \"absolute\",\r\n // top: \"50%\",\r\n // left: \"50%\",\r\n // transform: \"translate(-50%, -55%)\",\r\n // },\r\n })\r\n);\r\n\r\nexport const Login = () => {\r\n const classes = useStyles();\r\n\r\n const handleUserLogin = (\r\n email: string,\r\n password: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n userLogin(email, password, doneBack, failBack);\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 { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport { panelStyles } from \"../styles/generalStyles\";\r\nimport { LoginForm } from \"../components/users/LoginForm\";\r\nimport { userAssignRole, userSignup } from \"../actions/userActions\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n maxHeight: {\r\n hieght: \"100vh\",\r\n },\r\n padding: {\r\n paddingTop: \"30px\",\r\n },\r\n })\r\n);\r\n\r\nexport const Signup = () => {\r\n const classes = useStyles();\r\n\r\n const handleUserSignup = (\r\n username: string,\r\n password: string,\r\n email: string,\r\n doneBack: Function,\r\n failBack: Function\r\n ) => {\r\n userSignup(username, password, email, doneBack, failBack);\r\n };\r\n\r\n const handleUserRoleSignup =(result: any) =>{\r\n console.log(\"here\", result);\r\n \r\n const user = JSON.parse(result);\r\n userAssignRole(user.id,\"Basic\");\r\n }\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/TracyWhiteBackground.ef9baf17.png\";","import { Button, createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport chroma from \"chroma-js\";\r\nimport classNames from \"classnames\";\r\nimport React from \"react\";\r\nimport { buttonStyles } from \"../../global/styles/buttonStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...buttonStyles(theme),\r\n flagWrapper: {\r\n background: theme.palette.primary.light,\r\n borderRadius: \"10px\",\r\n color:\r\n chroma.contrast(theme.palette.primary.light, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n width: \"100%\",\r\n padding: \"24px 20px\",\r\n lineHeight: \"30px\",\r\n },\r\n verticalCenter: {\r\n marginTop: \"15%\",\r\n },\r\n flagText: {\r\n textAlign: \"center\",\r\n },\r\n flagTitle: {\r\n fontSize: \"1.875rem\",\r\n fontWeight: 800,\r\n lineHeight: \"60px\",\r\n },\r\n flagContent: {\r\n whiteSpace: \"pre-wrap\",\r\n },\r\n button: {\r\n marginTop: \"15px\",\r\n },\r\n checkMark: {\r\n width: \"100px\",\r\n display: \"block\",\r\n margin: \"0 auto\",\r\n },\r\n \"@keyframes dash\": {\r\n from: {\r\n strokeDashoffset: 1000,\r\n },\r\n to: {\r\n strokeDashoffset: 0,\r\n },\r\n },\r\n \"@keyframes dashCheck\": {\r\n from: {\r\n strokeDashoffset: -100,\r\n },\r\n to: {\r\n strokeDashoffset: 900,\r\n },\r\n },\r\n circle: {\r\n fill: \"none\",\r\n stroke: \"#3a9d48\",\r\n strokeWidth: 9,\r\n strokeMiterlimit: 10,\r\n strokeDasharray: 1000,\r\n strokeDashoffset: 0,\r\n animationName: \"$dash\",\r\n animationDuration: \"0.9s\",\r\n animationDelay: \"0.35s\",\r\n animationTimingFunction: \"ease-in-out\",\r\n animationFillMode: \"forwards\",\r\n animationIterationCount: \"initial\",\r\n },\r\n check: {\r\n fill: \"none\",\r\n stroke: \"#3a9d48\",\r\n strokeWidth: 12,\r\n strokeMiterlimit: 10,\r\n strokeLinecap: \"round\",\r\n strokeDasharray: 1000,\r\n strokeDashoffset: -100,\r\n animationName: \"$dashCheck\",\r\n animationDuration: \"0.9s\",\r\n animationDelay: \"0.55s\",\r\n animationTimingFunction: \"ease-in-out\",\r\n animationFillMode: \"forwards\",\r\n animationIterationCount: \"initial\",\r\n },\r\n \"@supports (-ms-ime-align:auto)\": {\r\n /*Edge*/\r\n check: {\r\n strokeDashoffset: 0,\r\n },\r\n },\r\n \"@media all and (-ms-high-contrast: none), (-ms-high-contrast: active)\": {\r\n /*IE 10, 11*/\r\n check: {\r\n strokeDashoffset: 0,\r\n },\r\n },\r\n para: {\r\n display: \"block\",\r\n marginBlockStart: \"1em\",\r\n marginBlockEnd: \"1em\",\r\n marginInlineStart: \"0px\",\r\n marginInlineEnd: \"0px\",\r\n },\r\n })\r\n);\r\n\r\ntype CompleteMessagePropsType = {\r\n title: string;\r\n content: string;\r\n isPageCenter: boolean;\r\n onClick: Function;\r\n};\r\n\r\nexport const CompleteMessage = (props: CompleteMessagePropsType) => {\r\n const classes = useStyles();\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n props.onClick();\r\n };\r\n\r\n return (\r\n \r\n
\r\n {props.title}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {props.content.split(\"
\").map((item: string, i: number) => (\r\n \r\n {item}\r\n \r\n ))}\r\n
\r\n {props.onClick && (\r\n \r\n OK\r\n \r\n )}\r\n
\r\n \r\n );\r\n};\r\n","import { ChangeEvent, FormEvent, Fragment, useState } from \"react\";\r\nimport {\r\n createStyles,\r\n Grid,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\n\r\nimport EmailIcon from \"@material-ui/icons/Email\";\r\nimport LockOutlinedIcon from \"@material-ui/icons/LockOutlined\";\r\nimport VerifiedUserIcon from \"@material-ui/icons/VerifiedUser\";\r\n\r\nimport LogoImage from \"../../../images/TracyWhiteBackground.png\";\r\nimport {\r\n formText,\r\n formRightBtnBlock,\r\n inputStyles,\r\n bannerStyles,\r\n} from \"../../styles/generalStyles\";\r\nimport classNames from \"classnames\";\r\nimport { SingleTextField } from \"../formInputs/SingleTextField\";\r\nimport { PasswordStrengthBox } from \"./PasswordStrengthBox\";\r\nimport {\r\n checkPasswordStrength,\r\n initalPasswordStrength,\r\n PasswordStrength,\r\n} from \"../../helperFunctions/stringFunctions\";\r\nimport { ErrorDisplay, setErrorMessage } from \"../ErrorDisplay\";\r\nimport { CancelButton } from \"../Buttons/CancelButton\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { CompleteMessage } from \"../../../ImagusComponents/Gadgets/CompleteMessage\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...inputStyles(theme),\r\n ...iconStyles(theme),\r\n formText,\r\n formRightBtnBlock,\r\n wrapper: {\r\n width: \"100%\",\r\n maxWidth: \"520px\",\r\n margin: \"10% auto\",\r\n\r\n backgroundColor: \"inherit\",\r\n height: \"auto\",\r\n border: \"1px solid black\",\r\n },\r\n formLogo: {\r\n width: \"100%\",\r\n margin: \"2% 0\",\r\n padding: \"10px\",\r\n height: \"auto\",\r\n maxHeight: \"150px\",\r\n float: \"none\",\r\n },\r\n clear: {\r\n clear: \"both\",\r\n },\r\n titleText: {\r\n color: theme.palette.common.black,\r\n },\r\n textAlignLeft: {\r\n width: \"100%\",\r\n textAlign: \"left\",\r\n },\r\n titleMargin: {\r\n marginBottom: \"30px\",\r\n },\r\n iconBlock: {\r\n height: \"54px\",\r\n lineHeight: \"130px\",\r\n },\r\n formHint: {\r\n fontStyle: \"italic\",\r\n paddingRight: \"10px\",\r\n },\r\n formLink: {\r\n color: theme.palette.primary.main,\r\n textDecoration: \"underline\",\r\n fontWeight: 500,\r\n },\r\n panel: {\r\n width: \"85%\",\r\n margin: \"auto\",\r\n },\r\n switchText: {\r\n fontStyle: \"italic\",\r\n },\r\n bannerTitle: {\r\n backgroundColor: theme.palette.common.black,\r\n color: theme.palette.common.white,\r\n height: \"50px\",\r\n },\r\n })\r\n);\r\n\r\ntype ResetPasswordFormPropsType = {\r\n resetPassword: Function;\r\n};\r\n\r\ntype InputType = {\r\n email: string;\r\n code: string;\r\n password: string;\r\n passwordConfirm: string;\r\n};\r\n\r\nconst intialInput: InputType = {\r\n email: \"\",\r\n code: \"\",\r\n password: \"\",\r\n passwordConfirm: \"\",\r\n};\r\n\r\nexport const ResetPasswordForm = (props: ResetPasswordFormPropsType) => {\r\n const classes = useStyles();\r\n const [inputs, setInputs] = useState(intialInput);\r\n const [loading, setLoading] = useState(false);\r\n const [completed, setCompleted] = useState(false);\r\n const [passwordStrength, setPasswordStrength] = useState(\r\n initalPasswordStrength\r\n );\r\n const [errors, setErrors] = useState>({});\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (e: FormEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const { email, code, password } = inputs;\r\n props.resetPassword(email, code, password, submitDone, submitFail);\r\n };\r\n\r\n const submitDone = () => {\r\n setCompleted(true);\r\n };\r\n const submitFail = (error: Record) => {\r\n setErrors(error);\r\n };\r\n\r\n const handleInputChange = (e: ChangeEvent) => {\r\n const name = e.currentTarget.name;\r\n const value = e.currentTarget.value;\r\n\r\n setInputs({ ...inputs, [name]: value });\r\n setErrors(setErrorMessage(errors, \"token\", \"\"));\r\n setErrors(setErrorMessage(errors, \"email\", \"\"));\r\n if (name === \"password\") {\r\n handlePasswordChange(value);\r\n }\r\n\r\n if (name === \"passwordConfirm\") {\r\n handlePasswordConfirm(value);\r\n }\r\n };\r\n\r\n const handlePasswordChange = (value: string) => {\r\n //check strength\r\n const checkStrength = checkPasswordStrength(passwordStrength, value);\r\n setPasswordStrength(checkStrength);\r\n if (Object.values(checkStrength).includes(false) && !!value) {\r\n setErrors(setErrorMessage(errors, \"strength\", \"Invalid password format\"));\r\n } else {\r\n setErrors(setErrorMessage(errors, \"strength\", \"\"));\r\n }\r\n\r\n //check matching\r\n if (!!value && value !== inputs.passwordConfirm) {\r\n setErrors(setErrorMessage(errors, \"password\", \"Password did not match\"));\r\n } else {\r\n setErrors(setErrorMessage(errors, \"password\", \"\"));\r\n }\r\n };\r\n\r\n const handlePasswordConfirm = (value: string) => {\r\n if (!!value && value !== inputs.password) {\r\n setErrors(setErrorMessage(errors, \"password\", \"Password did not match\"));\r\n } else {\r\n setErrors(setErrorMessage(errors, \"password\", \"\"));\r\n }\r\n };\r\n\r\n const backToLogin = () => {\r\n history.push(\"./login\");\r\n };\r\n\r\n if (completed) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n } else\r\n return (\r\n
\r\n \"Tracy\r\n
\r\n
\r\n \r\n Reset Your Password\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 \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 \r\n \r\n \r\n
\r\n \r\n 0}\r\n />\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { resetPassword } from \"../actions/userActions\";\r\nimport { ResetPasswordForm } from \"../components/users/ResetPasswordForm\";\r\n\r\nexport const ResetPassword = () => {\r\n const handleResetPassword = (\r\n email: string,\r\n token: string,\r\n newPassword: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n resetPassword(email, token, newPassword, doneBack, failBack);\r\n };\r\n return ;\r\n};\r\n","import {\r\n createStyles,\r\n Grid,\r\n IconButton,\r\n InputAdornment,\r\n makeStyles,\r\n Theme,\r\n Typography,\r\n} from \"@material-ui/core\";\r\nimport classNames from \"classnames\";\r\nimport PersonIcon from \"@material-ui/icons/Person\";\r\nimport LockOutlinedIcon from \"@material-ui/icons/LockOutlined\";\r\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\r\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\r\nimport EmailIcon from \"@material-ui/icons/Email\";\r\nimport { iconStyles } from \"../../styles/iconStyles\";\r\nimport {\r\n formText,\r\n formRightBtnBlock,\r\n inputStyles,\r\n bannerStyles,\r\n} from \"../../styles/generalStyles\";\r\nimport LogoImage from \"../../../images/TracyWhiteBackground.png\";\r\nimport React, { ChangeEvent, FormEvent, Fragment, useState } from \"react\";\r\nimport { SingleTextField } from \"../formInputs/SingleTextField\";\r\nimport { SubmitButton } from \"../Buttons/SubmitButton\";\r\nimport { ErrorDisplay, setErrorMessage } from \"../ErrorDisplay\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport {\r\n checkEmailFormat,\r\n checkPasswordStrength,\r\n checkUserNameFormat,\r\n PasswordStrength,\r\n} from \"../../helperFunctions/stringFunctions\";\r\nimport { PasswordStrengthBox } from \"./PasswordStrengthBox\";\r\nimport { SignupSuccess } from \"../../container/SignupSuccess\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { CancelButton } from \"../Buttons/CancelButton\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...iconStyles(theme),\r\n ...inputStyles(theme),\r\n ...bannerStyles(theme),\r\n formText,\r\n formRightBtnBlock,\r\n wrapper: {\r\n width: \"100%\",\r\n maxWidth: \"480px\",\r\n margin: \"10% auto\",\r\n\r\n backgroundColor: \"inherit\",\r\n height: \"auto\",\r\n border: \"1px solid black\",\r\n },\r\n formLogo: {\r\n width: \"100%\",\r\n margin: \"2% 0\",\r\n padding: \"10px\",\r\n height: \"auto\",\r\n maxHeight: \"150px\",\r\n float: \"none\",\r\n },\r\n clear: {\r\n clear: \"both\",\r\n },\r\n titleText: {\r\n color: theme.palette.common.black,\r\n },\r\n textAlignLeft: {\r\n width: \"100%\",\r\n textAlign: \"left\",\r\n },\r\n titleMargin: {\r\n marginBottom: \"30px\",\r\n },\r\n iconBlock: {\r\n height: \"54px\",\r\n lineHeight: \"130px\",\r\n },\r\n formHint: {\r\n fontStyle: \"italic\",\r\n paddingRight: \"10px\",\r\n },\r\n formLink: {\r\n color: theme.palette.primary.main,\r\n textDecoration: \"underline\",\r\n fontWeight: 500,\r\n },\r\n panel: {\r\n width: \"85%\",\r\n margin: \"auto\",\r\n },\r\n switchText: {\r\n fontStyle: \"italic\",\r\n },\r\n bannerTitle: {\r\n backgroundColor: theme.palette.common.black,\r\n color: theme.palette.common.white,\r\n height: \"50px\",\r\n },\r\n })\r\n);\r\n\r\ntype ForgotFormPropsType = {\r\n forgotPassword: Function;\r\n};\r\n\r\nexport const ForgotForm = (props: ForgotFormPropsType) => {\r\n const classes = useStyles();\r\n //states\r\n const [errors, setErrors] = useState>({});\r\n const [loading, setLoading] = useState(false);\r\n\r\n const [email, setEmail] = useState(\"\");\r\n\r\n const history = useHistory();\r\n\r\n //functions\r\n const handleFormSubmit = async (event: FormEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n setLoading(true);\r\n props.forgotPassword(email, submitDone, submitFail);\r\n };\r\n\r\n const submitDone = () => {\r\n history.push(\"./reset\");\r\n };\r\n\r\n const submitFail = (errors: Record) => {\r\n setErrors(errors);\r\n setLoading(false);\r\n };\r\n\r\n const backToLogin = () => {\r\n history.push(\"./login\");\r\n };\r\n\r\n const handleUserChange = (event: ChangeEvent) => {\r\n const value = event.target.value;\r\n setEmail(value);\r\n emailErrorHandler(value);\r\n };\r\n\r\n const emailErrorHandler = (value: string) => {\r\n setErrors(\r\n setErrorMessage(\r\n errors,\r\n \"email\",\r\n !!value && !checkEmailFormat(value) ? \"Invalid email format\" : \"\"\r\n )\r\n );\r\n };\r\n\r\n return (\r\n
\r\n \"Finsh\r\n
\r\n
\r\n \r\n Forgot your Password?\r\n \r\n
\r\n
\r\n \r\n If you have forgot your password, please enter your email address and\r\n we'll send you a token to reset your password\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n 0}\r\n />\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { forgotPassword } from \"../actions/userActions\";\r\nimport { ForgotForm } from \"../components/users/ForgotForm\";\r\n\r\nexport const Forgot = () => {\r\n const handleFormSubmit = (\r\n email: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n forgotPassword(email, doneBack, failBack);\r\n };\r\n return ;\r\n};\r\n","import { blueTheme, darkTheme } from \"../../global/styles/theme\";\r\n\r\nimport {\r\n createStyles,\r\n FormControlLabel,\r\n makeStyles,\r\n Radio,\r\n Theme,\r\n} from \"@material-ui/core\";\r\n\r\nimport classNames from \"classnames\";\r\nimport chroma from \"chroma-js\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n blueLabel: {\r\n backgroundColor: blueTheme.palette.primary.main,\r\n color:\r\n chroma.contrast(blueTheme.palette.primary.main, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n\r\n darkLabel: {\r\n backgroundColor: darkTheme.palette.primary.main,\r\n color:\r\n chroma.contrast(darkTheme.palette.primary.main, \"white\") > 2\r\n ? \"white\"\r\n : \"black\",\r\n },\r\n\r\n label: {\r\n width: 150,\r\n height: 70,\r\n textAlign: \"center\",\r\n borderRadius: \"2em\",\r\n padding: \"2px 12px\",\r\n display: \"inline-block\",\r\n },\r\n text: {\r\n fontSize: \"1.25rem\",\r\n lineHeight: \"70px\",\r\n },\r\n })\r\n);\r\n\r\ntype ThemeRadioPropsType = {\r\n theme: string;\r\n};\r\n\r\nexport const ThemeRadio = (props: ThemeRadioPropsType) => {\r\n const classes = useStyles();\r\n const matchDict: { [index: string]: { value: string; style: string } } = {\r\n blue: { value: \"blueTheme\", style: classes.blueLabel },\r\n dark: { value: \"darkTheme\", style: classes.darkLabel },\r\n };\r\n\r\n return (\r\n }\r\n label={\r\n \r\n {matchDict[props.theme].value}\r\n \r\n }\r\n labelPlacement=\"top\"\r\n />\r\n );\r\n};\r\n","import { Grid, RadioGroup } from \"@material-ui/core\";\r\nimport React, { ChangeEvent, useState } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport { AppState } from \"../../Store\";\r\n\r\nimport { changeTheme } from \"../actions/siteActions\";\r\nimport { ThemeRadio } from \"../components/ThemeRadio\";\r\n\r\nexport const ThemeSelector = () => {\r\n const currentTheme = useSelector(\r\n (state: AppState) => state.admin.site.themeName\r\n );\r\n\r\n // const currentTheme = useSelector(\r\n // (state) => state.themeName\r\n // );\r\n\r\n const dispatch = useDispatch();\r\n\r\n const [selectedValue, setSelectedValue] = useState(currentTheme);\r\n\r\n const handleChange = (event: ChangeEvent): void => {\r\n setSelectedValue(event.target.value);\r\n dispatch(changeTheme(event.target.value));\r\n };\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","import { SET_THEME } from \"../../global/actions/actionNames\";\r\n\r\nexport const changeTheme = (themeName: string) => {\r\n return {\r\n type: SET_THEME,\r\n themeName: themeName,\r\n };\r\n};\r\n","import { createStyles, makeStyles, Theme } from \"@material-ui/core\";\r\nimport { AppHeader } from \"../../global/components/gadgets/AppHeader\";\r\nimport { panelStyles } from \"../../global/styles/generalStyles\";\r\nimport { ThemeSelector } from \"../containers/ThemeSelector\";\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...panelStyles(theme),\r\n })\r\n);\r\nexport const Themes = () => {\r\n const classes = useStyles();\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","import { ListItem, ListItemText, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport classNames from \"classnames\";\r\nimport React from \"react\";\r\nimport { EventType } from \"../types/participantsType\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n selected: {\r\n fontWeight: 800,\r\n },\r\n\r\n title: {\r\n width: \"100%\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n padding: \"0 16px\",\r\n },\r\n })\r\n);\r\n\r\ntype EventItemPropsType = {\r\n event: EventType;\r\n selectedEventId: string;\r\n selectEvent: Function;\r\n};\r\n\r\nexport const EventItem = (props: EventItemPropsType) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n props.selectEvent(props.event.eventId)}\r\n disableTypography\r\n className={classNames(\r\n classes.title,\r\n props.selectedEventId === props.event.eventId && classes.selected\r\n )}\r\n />\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {\r\n createStyles,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n makeStyles,\r\n Theme,\r\n} from \"@material-ui/core\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\nimport { EventType } from \"../types/participantsType\";\r\nimport { EventItem } from \"./EventItem\";\r\nimport { drawerStyles } from \"../../global/styles/generalStyles\";\r\nimport { iconStyles } from \"../../global/styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...iconStyles(theme),\r\n })\r\n);\r\n\r\ntype EventListPropsType = {\r\n eventList: Array | null;\r\n selectEvent: Function;\r\n selectedEventId: string | undefined;\r\n};\r\n\r\nexport const EventList = (props: EventListPropsType) => {\r\n const classes = useStyles();\r\n\r\n let events =\r\n props.eventList &&\r\n props.eventList.map((event: EventType, i: number) => {\r\n return (\r\n \r\n );\r\n });\r\n\r\n if (events == null) {\r\n events = [\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n ];\r\n }\r\n\r\n return {events};\r\n};\r\n","import React, { Fragment, useState } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { Drawer, IconButton, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport ChevronLeftIcon from \"@material-ui/icons/ChevronLeft\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\nimport { drawerStyles } from \"../../global/styles/generalStyles\";\r\nimport { ImagusSearchBar } from \"../../ImagusComponents/FormInputs/ImagusSearchBar\";\r\nimport { EventList } from \"./EventList\";\r\nimport { EventType } from \"../types/participantsType\";\r\nimport { RaceRedux } from \"../../global/container/race/RaceRedux\";\r\nimport { iconStyles } from \"../../global/styles/iconStyles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...iconStyles(theme),\r\n hide: {\r\n display: \"none\",\r\n },\r\n })\r\n);\r\n\r\ntype EventsPanelPropsType = {\r\n handleEventSearch: Function;\r\n eventList: Array | null;\r\n};\r\n\r\nexport const EventsPanel = (props: EventsPanelPropsType) => {\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(true);\r\n const [selectedEventId, setSelectedEventId] = useState(\"\");\r\n const [selectedEvent, setSelectedEvent] = useState();\r\n\r\n const toggleSearchBarDrawer = () => {\r\n setOpen(!open);\r\n };\r\n\r\n const handleEventSelect = (eventId: string) => {\r\n let event: EventType | undefined;\r\n if (props.eventList) {\r\n event = props.eventList.find((event) => event.eventId === eventId);\r\n }\r\n setSelectedEvent(event);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n {open ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n
\r\n {open && (\r\n \r\n )}\r\n \r\n \r\n
{/* */}
\r\n
\r\n );\r\n};\r\n","import { Hidden, Theme } from \"@material-ui/core\";\r\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\r\nimport React, { useState } from \"react\";\r\nimport { Race } from \"../../global/reducers/raceReducers\";\r\nimport { drawerStyles, panelStyles } from \"../../global/styles/generalStyles\";\r\nimport { ImagusRaceDrawer } from \"../../ImagusComponents/Gadgets/ImagusRaceDrawer\";\r\nimport { EventType } from \"../types/participantsType\";\r\nimport { EventsPanel } from \"./EventsPanel\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...drawerStyles(theme),\r\n ...panelStyles(theme),\r\n })\r\n);\r\n\r\ntype ParticipantsPageLayoutPropsType = {\r\n raceList: Array | null;\r\n fetchRaces: Function;\r\n fetchEvents: Function;\r\n eventList: Array | null;\r\n};\r\n\r\nexport const ParticipantsPageLayout = (\r\n props: ParticipantsPageLayoutPropsType\r\n) => {\r\n const classes = useStyles();\r\n const [selectedRaceId, setSelectedRaceId] = useState(\"\");\r\n const [selectedRace, setSelectedRace] = useState();\r\n\r\n const handleRaceSelect = (raceId: string) => {\r\n setSelectedRaceId(raceId);\r\n let race: Race | undefined;\r\n if (props.raceList) {\r\n race = props.raceList.find((race) => race.raceId === raceId);\r\n }\r\n setSelectedRace(race);\r\n };\r\n\r\n return (\r\n
\r\n {/* */}\r\n \r\n
\r\n );\r\n};\r\n","import React, { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { fetchRace } from \"../../global/actions/raceActions\";\r\nimport { useSelectProfile } from \"../../global/helperFunctions/useSelectProfile\";\r\nimport { AppState } from \"../../Store\";\r\nimport { getEventsByQuery } from \"../actions/participantsActions\";\r\nimport { ParticipantsPageLayout } from \"../components/ParticipantsPageLayout\";\r\n\r\nexport const ParticipantsRedux = () => {\r\n const accountInfo = useSelector((state: AppState) => state.global.user.info);\r\n const profile = useSelector(\r\n (state: AppState) => state.global.profiles.activeProfile\r\n );\r\n\r\n const races = useSelector((state: AppState) => state.global.races.raceList);\r\n const events = useSelector(\r\n (state: AppState) => state.admin.participants.events\r\n );\r\n const dispatch = useDispatch();\r\n const getRaces = (\r\n query: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n fetchRace(profile.uid, query, doneBack, failBack)(dispatch);\r\n };\r\n\r\n const getEvents = (\r\n query: string,\r\n doneBack?: Function,\r\n failBack?: Function\r\n ) => {\r\n getEventsByQuery(query, doneBack, failBack)(dispatch);\r\n };\r\n\r\n useSelectProfile(accountInfo?.id);\r\n\r\n //fetch races upon mounted\r\n useEffect(() => {\r\n if (profile.uid) {\r\n fetchRace(profile.uid, \"\")(dispatch);\r\n }\r\n }, [profile.uid]);\r\n\r\n useEffect(() => {\r\n getEventsByQuery(\"\")(dispatch);\r\n }, []);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { Theme, createStyles, makeStyles } from \"@material-ui/core\";\r\nimport { AppHeader } from \"../../global/components/gadgets/AppHeader\";\r\nimport { UserAuth } from \"../../global/container/UserAuth\";\r\nimport { contentStyles } from \"../../global/styles/generalStyles\";\r\nimport { ParticipantsRedux } from \"../containers/ParticipantsRedux\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n ...contentStyles(theme),\r\n })\r\n);\r\n\r\nexport const Participants = () => {\r\n const classes = useStyles();\r\n return (\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n","import {\r\n GET_ALL_EVENTS,\r\n GET_ALL_EVENT_RACES,\r\n GET_ALL_PARTICIPANTS,\r\n GET_PARTICIPANT_BY_ID,\r\n SET_PARTICIPANTS_AVATAR,\r\n SET_PARTICIPANTS_ENROLMENTS_IMAGE,\r\n SET_UPDATING_PARTICIPANTS,\r\n} from \"../../global/actions/actionNames\";\r\nimport { FaceIdType, RunnerType } from \"../../global/reducers/profilesReducers\";\r\nimport { Race } from \"../../global/reducers/raceReducers\";\r\nimport { EventType, ParticipantsActionType } from \"../types/participantsType\";\r\n\r\nexport interface ParticipantsState {\r\n events: Array | null;\r\n updating: boolean;\r\n participants: Array | null;\r\n races: Array;\r\n}\r\n\r\nconst initialParticipantsState: ParticipantsState = {\r\n events: null,\r\n updating: false,\r\n participants: null,\r\n races: [],\r\n};\r\n\r\nexport const participantsReducers = (\r\n state = initialParticipantsState,\r\n actions: ParticipantsActionType\r\n) => {\r\n switch (actions.type) {\r\n case SET_UPDATING_PARTICIPANTS: {\r\n if (actions.status !== undefined) {\r\n return {\r\n ...state,\r\n updating: actions.status,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case GET_ALL_EVENTS: {\r\n if (actions.events !== undefined) {\r\n {\r\n return {\r\n ...state,\r\n events: actions.events,\r\n };\r\n }\r\n }\r\n return state;\r\n }\r\n\r\n case GET_ALL_EVENT_RACES: {\r\n if (actions.races !== undefined) {\r\n return {\r\n ...state,\r\n races: actions.races,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case GET_ALL_PARTICIPANTS: {\r\n if (actions.participants !== undefined) {\r\n return {\r\n ...state,\r\n participants: actions.participants,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case SET_PARTICIPANTS_ENROLMENTS_IMAGE: {\r\n if (\r\n actions.enrolmentId !== undefined &&\r\n actions.faceId !== undefined &&\r\n actions.profileId !== undefined\r\n ) {\r\n let profiles = state.participants ? [...state.participants] : [];\r\n let profileIndex = profiles.findIndex(\r\n (p) => p.uid === actions.profileId\r\n );\r\n\r\n if (profileIndex > -1) {\r\n let profile = profiles[profileIndex];\r\n let enrolments = profile.enrolments ? [...profile.enrolments] : [];\r\n let enrolmentIndex = enrolments.findIndex(\r\n (i) => i.enrolmentId === actions.enrolmentId\r\n );\r\n\r\n if (enrolmentIndex > -1) {\r\n //enrolment exists\r\n let enrolment = enrolments[enrolmentIndex];\r\n //check if the faceId exists in the facesArray\r\n let faces = enrolment.faces ? [...enrolment.faces] : [];\r\n let faceIndex = faces.findIndex((i) => i.faceId === actions.faceId);\r\n\r\n if (faceIndex > -1) {\r\n //faceId exists\r\n //add/replace the image associate to this faceId with a new image\r\n faces[faceIndex].imgUrl = actions.faceImageUrl;\r\n } else {\r\n //faceId does not exists\r\n //append faceId to facesArray and add an image\r\n faces.push({\r\n faceId: actions.faceId,\r\n imgUrl: actions.faceImageUrl,\r\n });\r\n }\r\n } else {\r\n //enrolment does not exist\r\n //create a new enrolment\r\n let face: FaceIdType = {\r\n faceId: actions.faceId,\r\n imgUrl: actions.faceImageUrl,\r\n };\r\n enrolments.push({\r\n enrolmentId: actions.enrolmentId,\r\n faces: [face],\r\n });\r\n }\r\n\r\n profiles[profileIndex] = profile;\r\n\r\n return {\r\n ...state,\r\n participants: profiles,\r\n };\r\n }\r\n }\r\n return state;\r\n }\r\n\r\n case SET_PARTICIPANTS_AVATAR:\r\n if (actions.imageUrl !== null && actions.profileId !== null) {\r\n let participants = state.participants ? [...state.participants] : [];\r\n let index = participants.findIndex((p) => p.uid === actions.profileId);\r\n if (index > -1) {\r\n let participant = participants[index];\r\n participant.avatar = actions.imageUrl;\r\n\r\n return {\r\n ...state,\r\n participants: participants,\r\n };\r\n }\r\n }\r\n return state;\r\n\r\n case GET_PARTICIPANT_BY_ID:\r\n if (actions.participant !== null) {\r\n let participants = state.participants ? [...state.participants] : [];\r\n let index = participants.findIndex(\r\n (p) => p.uid === actions.participant.uid\r\n );\r\n\r\n if (index > -1) {\r\n participants[index] = actions.participant;\r\n } else {\r\n participants.push(actions.participant);\r\n }\r\n\r\n return {\r\n ...state,\r\n participants: participants,\r\n };\r\n }\r\n return state;\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { SET_THEME } from \"../../global/actions/actionNames\";\r\nimport { SiteActionTypes } from \"../types/siteTypes\";\r\n\r\n//Site Reducer's slice\r\nexport interface SiteState {\r\n themeName: string;\r\n}\r\n\r\nconst initialThemeState: SiteState = {\r\n themeName: \"darkTheme\",\r\n};\r\n\r\nexport const siteReducers = (\r\n state = initialThemeState,\r\n actions: SiteActionTypes\r\n) => {\r\n switch (actions.type) {\r\n case SET_THEME:\r\n if (actions.themeName !== null) {\r\n return {\r\n ...state,\r\n themeName: actions.themeName,\r\n };\r\n }\r\n return state;\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { combineReducers } from \"redux\";\r\nimport { participantsReducers } from \"./participantsReducers\";\r\nimport { siteReducers } from \"./siteReducers\";\r\n\r\nconst reducers = combineReducers({\r\n site: siteReducers,\r\n participants: participantsReducers,\r\n});\r\n\r\nexport default reducers;\r\n","import { CircleFaceType } from \"../../ImagusComponents/Gadgets/ImagusFacePicker\";\r\nimport {\r\n ADD_IMAGE_TO_FACE_SEARCH,\r\n CLEAR_FORM,\r\n DETECT_IMAGE,\r\n SAVE_TOKEN,\r\n SET_LOADED_IMAGE,\r\n} from \"../actions/actionNames\";\r\nimport {\r\n FaceSearchActionTypes,\r\n FaceSearchResult,\r\n} from \"../types/faceSearchTypes\";\r\n\r\nexport type FaceSearchState = {\r\n imageToken: string;\r\n loadedImage: string;\r\n detectedFaces: Array;\r\n faceSearchingImage: string;\r\n faceSearchResult: FaceSearchResult;\r\n};\r\n\r\nconst initialFaceSearchState: FaceSearchState = {\r\n imageToken: \"\",\r\n loadedImage: \"\",\r\n detectedFaces: [],\r\n faceSearchingImage: \"\",\r\n faceSearchResult: { searchResults: [], token: \"\" },\r\n};\r\n\r\nexport const faceSearchReducers = (\r\n state = initialFaceSearchState,\r\n actions: FaceSearchActionTypes\r\n) => {\r\n switch (actions.type) {\r\n case SAVE_TOKEN:\r\n if (actions.token !== null) {\r\n return {\r\n ...state,\r\n imageToken: actions.token,\r\n };\r\n }\r\n return state;\r\n\r\n case SET_LOADED_IMAGE:\r\n if (actions.image !== null) {\r\n return {\r\n ...state,\r\n loadedImage: actions.image,\r\n };\r\n }\r\n return state;\r\n\r\n case DETECT_IMAGE: {\r\n if (actions.detectedFaces !== null) {\r\n return {\r\n ...state,\r\n detectedFaces: actions.detectedFaces,\r\n };\r\n }\r\n return state;\r\n }\r\n case CLEAR_FORM:\r\n return { ...initialFaceSearchState };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n GET_RACES,\r\n UPDATE_RACE,\r\n SET_RACE_UPDATING,\r\n SET_SEARCH_QUERY,\r\n GET_SEARCH_RESULTS,\r\n} from \"../actions/actionNames\";\r\nimport { EnrolmentInputType } from \"../types/faceSearchTypes\";\r\nimport { RacesActionType } from \"../types/raceTypes\";\r\n\r\nimport { EnrolmentType } from \"./profilesReducers\";\r\n\r\nexport type Race = {\r\n raceId: string;\r\n eventId?: string;\r\n raceName: string;\r\n timerId?: string;\r\n date: Date;\r\n enrolmentIds: Array;\r\n};\r\n\r\nexport interface RacesState {\r\n raceList: Array | null;\r\n updating: boolean;\r\n searchQuery: string;\r\n}\r\n\r\nconst initialRaceState: RacesState = {\r\n raceList: null,\r\n updating: false,\r\n searchQuery: \"\",\r\n};\r\n\r\nexport const raceReducers = (\r\n state = initialRaceState,\r\n actions: RacesActionType\r\n) => {\r\n switch (actions.type) {\r\n case GET_RACES:\r\n if (actions.races !== null && actions.races.length > 0) {\r\n return {\r\n ...state,\r\n raceList: actions.races,\r\n };\r\n }\r\n return state;\r\n\r\n case UPDATE_RACE: {\r\n if (actions.race !== null) {\r\n //check if race is already exist\r\n let races = state.raceList ? [...state.raceList] : [];\r\n let raceIndex = races.findIndex(\r\n (r) => r.raceId === actions.race.raceId\r\n );\r\n\r\n if (raceIndex > -1) {\r\n //replace the current race with the new one\r\n races[raceIndex] = actions.race;\r\n } else {\r\n races.push(actions.race);\r\n }\r\n\r\n return {\r\n ...state,\r\n raceList: races,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case GET_SEARCH_RESULTS: {\r\n if (actions.races !== null) {\r\n let raceList: Array = [];\r\n actions.races.map((race: Race) => raceList.push(race));\r\n return {\r\n ...state,\r\n raceList: raceList,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case SET_RACE_UPDATING: {\r\n if (actions.status !== null) {\r\n return {\r\n ...state,\r\n updating: actions.status,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n case SET_SEARCH_QUERY: {\r\n if (actions.query !== undefined) {\r\n return {\r\n ...state,\r\n searchQuery: actions.query,\r\n };\r\n }\r\n return state;\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { SET_AUTH, SET_FETCHING_AUTH, SET_USER } from \"../actions/actionNames\";\r\nimport { UserActionTypes } from \"../types/userTypes\";\r\n\r\nexport interface InfoType {\r\n id: string;\r\n name: string;\r\n email: string;\r\n roles:Array;\r\n}\r\n\r\nexport interface UserState {\r\n /**Information regarding the username */\r\n info: InfoType | null;\r\n /** to prevent exessive api calls */\r\n fetchingAuth: boolean | null;\r\n /**authentication status */\r\n auth: boolean | null;\r\n}\r\n\r\nconst initialUserState: UserState = {\r\n info: null,\r\n fetchingAuth: null,\r\n auth: false,\r\n};\r\n\r\nexport const userReducers = (\r\n state = initialUserState,\r\n actions: UserActionTypes\r\n) => {\r\n switch (actions.type) {\r\n case SET_FETCHING_AUTH:\r\n if (actions.status !== null) {\r\n return {\r\n ...state,\r\n fetchingAuth: actions.status,\r\n };\r\n }\r\n return state;\r\n\r\n case SET_AUTH:\r\n if (actions.authenticated !== null) {\r\n return {\r\n ...state,\r\n auth: actions.authenticated,\r\n };\r\n }\r\n return state;\r\n\r\n case SET_USER:\r\n if (actions.user !== null) {\r\n return {\r\n ...state,\r\n info: actions.user,\r\n };\r\n }\r\n return state;\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { combineReducers } from \"redux\";\r\nimport { faceSearchReducers } from \"./faceSearchReducers\";\r\nimport { profilesReducers } from \"./profilesReducers\";\r\nimport { raceReducers } from \"./raceReducers\";\r\nimport { userReducers } from \"./userReducers\";\r\n\r\nconst reducers = combineReducers({\r\n user: userReducers,\r\n profiles: profilesReducers,\r\n faceSearch: faceSearchReducers,\r\n races: raceReducers,\r\n});\r\nexport default reducers;\r\n","import { applyMiddleware, combineReducers, createStore } from \"redux\";\r\nimport thunkMiddleware from \"redux-thunk\";\r\nimport AdminReducers from \"./admin/reducers/index\";\r\nimport GlobalReducers from \"./global/reducers/index\";\r\nimport { composeWithDevTools } from \"redux-devtools-extension\";\r\n\r\nconst composer = composeWithDevTools(applyMiddleware(thunkMiddleware));\r\n\r\nconst reducers = combineReducers({\r\n admin: AdminReducers,\r\n global: GlobalReducers,\r\n});\r\n\r\nconst Store = createStore(reducers, composer);\r\n\r\nexport type AppState = ReturnType;\r\nexport default Store;\r\n","import React from \"react\";\r\nimport \"./App.css\";\r\n\r\nimport { BrowserRouter, Switch, Route, Redirect } from \"react-router-dom\";\r\nimport * as Global from \"./global/views\";\r\nimport * as Admin from \"./admin/views\";\r\n\r\nimport { Provider } from \"react-redux\";\r\nimport Store from \"./Store\";\r\n\r\nfunction 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 \r\n {/* */}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport App from \"./App\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n\r\n// function fancyLog() {\r\n// console.log(\"%c Rendered with \", \"background: purple; color: #FFF\");\r\n// console.log(store.getState());\r\n// }\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}