{"version":3,"sources":["registerServiceWorker.js","resources/images/york-logo-reversed.svg","common/components/cyc-logo/cyc-logo-svg.component.jsx","resources/images/york-logo-reversed.png","common/helpers/dom.helper.js","common/components/footer/footer.component.jsx","common/constants/my-account-urls.constants.js","common/components/with-authentication/with-authentication.component.jsx","common/components/progress-bar/progress-bar.component.jsx","common/components/route-handlers/site-breadcrumbs.component.jsx","common/components/page-header/page-header.component.jsx","common/components/document-title/document-title.component.jsx","common/components/accordion/accordion.component.jsx","common/components/accordion/accordion-collection.component.jsx","common/components/alert-message/alert-message.component.jsx","common/components/radio-list/radio-list.component.jsx","common/components/myaccount-page/my-account-page.component.jsx","common/hooks/use-previous.hook.js","common/constants/msg.constants.js","common/components/network-loader/network-loader.component.jsx","common/constants/file-input-component.constants.js","common/services/file-utilities.service.js","common/components/file-input/file-input.component.jsx","common/services/address.service.js","common/components/map-components/esri-location.service.js","common/containers/address-lookup/address-lookup.container.jsx","common/constants/bin-collections.constants.js","common/services/bin-collections.service.js","common/components/bin-collections/bin-collection.component.jsx","common/containers/bin-collections/bin-collections.container.jsx","common/components/summary-table/summary-table.component.jsx","common/components/error-page/error-page.component.jsx","common/components/site-loader/site-loader.component.jsx","common/components/error-handlers/error-label-handler.component.jsx","common/components/graffiti/offensive-graffiti-input.component.jsx","parking-services/parking-portal-error-page/parking-portal-error-page.component.jsx","common/components/error-handlers/error-box.component.jsx","common/components/error-handlers/network-catch-error.component.jsx","resources/new-styles/images/york-logo.svg","resources/images/hamburger_menu.svg","resources/new-styles/images/magnifying_glass.svg","common/components/header/flyout/flyout.component.jsx","common/components/header/site-search/site-search.component.jsx","common/components/header/header.component.jsx","common/components/error-handlers/error-boundary.component.jsx","common/components/route-handlers/continue-form-or-reroute.component.jsx","common/components/route-handlers/not-found.component.jsx","common/components/form-handlers/logged-in-updates.component.jsx","common/components/form-handlers/not-logged-in-updates.component.jsx","common/components/map-components/cyc-esri-map.importer.js","common/components/map-components/cyc-esri-map.component.jsx","common/containers/incident-forms/incident-form.container.jsx","common/components/form-components/additional-information.component.jsx","common/services/incident.service.js","common/contexts/user.context.js","common/constants/my-account-other.constants.js","common/constants/validation.constants.js","common/constants/category.constants.js","common/constants/map.constants.js","common/constants/feature-flag.constants.js","common/constants/incident-source.constants.js","common/helpers/yup-validation.helper.js","common/helpers/form.helper.js","common/helpers/feature-flags.helper.js","account/services/account.service.js","account/change-password/components/change-password-form.component.jsx","account/change-password/containers/change-password.container.jsx","account/change-password/components/change-password-success.component.jsx","account/account-details/components/account-details.component.jsx","account/account-details/containers/account-details.container.jsx","account/communication-preferences/containers/comm-preferences.container.jsx","account/change-email/components/email-change/change-email.component.jsx","account/change-email/containers/change-email.container.jsx","account/change-email/components/confirmation-page/change-email-confirmation.component.jsx","account/change-email/components/email-change-successful/change-email-success.component.jsx","account/change-phone/components/change-phone-number.component.jsx","account/change-phone/containers/change-phone-number.container.jsx","account/change-address/components/change-address.component.jsx","maintenance/maintenance.app.jsx","account/change-address/containers/change-address.container.jsx","account/change-address/components/change-address-success.component.jsx","account/forgot-password/components/email-sent/forgot-password-email-sent.component.jsx","account/forgot-password/components/forgot/forgot-password-form.component.jsx","account/forgot-password/components/reset/reset-password-form.component.jsx","account/forgot-password/services/forgot-password.service.js","account/forgot-password/containers/forgot/forgot-password.container.jsx","account/forgot-password/containers/reset/reset-password.container.jsx","account/change-name/components/change-name.component.js","account/change-name/containers/change-name.container.jsx","account/change-name/components/change-name-confirmation.component.js","account/account.router.jsx","registration/components/terms-and-conditions/terms-and-conditions.component.jsx","registration/components/register-form-step-one/reg-form-step-one.component.jsx","registration/components/register-form-step-two/reg-form-step-two.component.jsx","registration/components/register-form-step-three/reg-form-step-three.component.jsx","registration/components/register-successful/register-successful.component.jsx","registration/components/register-successful/register-successful-with-warning.component.jsx","registration/services/registration.service.js","registration/components/register-email-confirm/register-email-confirm.component.jsx","registration/form-config.js","registration/registration.app.jsx","common/services/session-activity.service.js","web-chat-details/components/web-chat/web-chat-form-my-account.component.jsx","sign-in/components/sign-in-form.component.jsx","sign-in/containers/sign-in.container.jsx","web-chat-details/web-chat-redirect.jsx","my-reports/components/report-search-input/report-search-input.component.jsx","my-reports/components/report-search-counter/report-search-counter.component.jsx","my-reports/components/report-search-results-table/report-search-results-table.component.jsx","my-reports/services/my-reports.service.js","my-reports/containers/index/MyReportsIndex.container.jsx","my-reports/constants/report.detail.items.js","my-reports/components/report-details/report-details.component.jsx","my-reports/components/report-details/additional-info.component.jsx","my-reports/components/report-details/communication-history.component.jsx","my-reports/containers/details/report-details.container.jsx","common/helpers/withRouter.hoc.js","my-reports/my-reports.router.jsx","my-reports/my-reports.app.jsx","dashboard/services/account.service.js","dashboard/components/accordion-internal/accordion-internal.component.jsx","dashboard/services/parking.service.js","dashboard/components/my-parking-services-accordion.component.jsx","dashboard/components/my-details-accordion.component.jsx","dashboard/components/my-reports-accordion.component.jsx","dashboard/components/my-refuse-and-recycling-accordion.component.jsx","dashboard/components/my-council-tax-accordion.component.jsx","dashboard/components/my-benefits-accordion.component.jsx","dashboard/containers/home/home-page.container.jsx","sign-in/sign-in.router.jsx","testing/containers/test-landing-page.container.jsx","testing/testing.app.jsx","incident-forms/street-lighting/form-config.js","incident-forms/components-shared/entry-page.component.jsx","incident-forms/helpers/unadopted-layer.helper.js","incident-forms/components-shared/location-page.component.jsx","incident-forms/components-shared/confirmation-page.component.jsx","common/helpers/react-router-helpers/RedirectWithWindowConfirm.js","incident-forms/components-shared/summary-page.component.jsx","resources/images/info_icon.svg","incident-forms/components-shared/existing-incidents-display/incidents-exist-display.component.jsx","incident-forms/street-lighting/components/problem-page.component.jsx","incident-forms/street-lighting/components/light-type-page.component.jsx","incident-forms/helpers/incident-layer-options-builder.helper.js","incident-forms/incident-form.reducer.js","incident-forms/helpers/header-text-from-url.helper.js","incident-forms/street-lighting/street-lighting.app.jsx","incident-forms/fly-tipping/form-config.js","incident-forms/fly-tipping/components/problem-page.component.jsx","incident-forms/fly-tipping/fly-tipping.app.jsx","incident-forms/street-cleaning/form-config.js","incident-forms/street-cleaning/components/problem-page.component.jsx","incident-forms/street-cleaning/street-cleaning.app.jsx","incident-forms/salt-bins-problems/form-config.js","incident-forms/salt-bins-problems/components/problem-page.component.jsx","incident-forms/salt-bins-problems/salt-bin-problems.app.jsx","incident-forms/road-and-pavement-problems/form-config.js","incident-forms/road-and-pavement-problems/components/problem-page.component.jsx","incident-forms/road-and-pavement-problems/road-and-pavement-problems.app.jsx","incident-forms/graffiti/form-config.js","incident-forms/graffiti/components/problem-page.component.jsx","incident-forms/graffiti/graffiti.app.jsx","incident-forms/water-and-drainage-problems/form-config.js","incident-forms/water-and-drainage-problems/components/problem-with-page.component.jsx","incident-forms/water-and-drainage-problems/components/problem-page-surface-water.component.jsx","incident-forms/water-and-drainage-problems/components/problem-page-non-surface-water.component.jsx","incident-forms/water-and-drainage-problems/water-and-drainage-problems.app.jsx","incident-forms/dog-and-litter-bins/form-config.js","incident-forms/dog-and-litter-bins/components/problem-page.component.jsx","incident-forms/dog-and-litter-bins/dog-and-litter-bins.app.jsx","incident-forms/street-furniture/form-config.js","incident-forms/street-furniture/components/problem-page.component.component.jsx","incident-forms/street-furniture/components/problem-page-after-location.component.jsx","incident-forms/street-furniture/street-furniture.app.jsx","incident-forms/road-and-street-sign/components/about-problem-page.component.jsx","incident-forms/road-and-street-sign/components/problem-page.component.jsx","incident-forms/road-and-street-sign/form-config.js","incident-forms/road-and-street-sign/road-and-street-sign.app.jsx","incident-forms/vegetation/form-config.js","incident-forms/vegetation/components/problem-with-page.component.jsx","incident-forms/vegetation/components/problem-page.component.jsx","incident-forms/vegetation/vegetation.app.jsx","incident-forms/incident-form.router.jsx","refuse-and-recycling/my-collections/containers/my-collections.container.jsx","common/components/bin-collections/recycle-logo.png","common/components/bin-collections/house-icon.svg","common/components/bin-collections/recycling-icon.svg","common/components/bin-collections/garden-icon.svg","common/components/bin-collections/bin-calendar.component.jsx","refuse-and-recycling/my-collections/containers/my-calendar.container.jsx","refuse-and-recycling/refuse-and-recycling.router.jsx","parking-services/parking-portal-customer-details.component.jsx","bin-collections/containers/bin-collections-lookup.container.jsx","bin-collections/bin-collections.app.jsx","site-router/site.router.jsx","common/components/dialog/confirm-dialog.component.jsx","common/components/dialog/auto-logout-dialog.component.jsx","common/constants/my-account-session.constants.js","app.jsx","index.js"],"names":["isLocalhost","Boolean","window","location","hostname","match","register","navigator","URL","process","origin","addEventListener","swUrl","fetch","then","response","status","headers","get","indexOf","serviceWorker","ready","registration","unregister","reload","registerValidSW","catch","console","log","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","state","controller","error","CycLogoSvgComponent","title","srcSet","logoSVG","type","src","alt","scrollToWindowTop","scrollTo","top","left","behavior","setInitialPosition","hash","setTimeout","id","replace","element","document","getElementById","scrollIntoView","scroll","changeUrlByStepNumberv6","step","formConfig","navigate","isFormStarted","setFormStarted","a","Error","url","stepUrls","FooterComponent","className","ButtonClasses","secondary","onClick","href","rel","Date","getFullYear","color","incidentFormRoot","refuseAndRecyclingRoot","binCollectionsRoot","clientMyAccountUrl","signIn","signInSuccessful","dashboard","root","step1","step2","step3","successful","emailConfirmation","streetLighting","step4","confirmation","streetCleaning","missingAssets","flyTipping","graffiti","roadAndPavementProblems","saltBinProblems","dogAndLitterBin","waterAndDrainageProblems","step5","streetFurniture","roadAndStreetSign","vegetation","account","password","change","changeSuccessful","forgot","emailSent","reset","email","phone","address","name","contactDetails","communicationPreferences","home","webchat","myReports","details","refuseAndRecycling","myCollections","myCalendar","testing","parkingPortalErrorPage","binCollections","calendar","calendarWithRoute","yorkMainWebsiteUrl","getIncidents","apiSettingName","apiMyAccountUrl","REGISTER","ACCOUNT","ACCOUNT_LOGIN","ACCOUNT_LOGOUT","ACCOUNT_FORGOT_PASSWORD","ACCOUNT_RESET_PASSWORD","MANAGE_CHANGE_PASSWORD","GET_CONTACT_DETAIL","GET_PRIMARY_ADDRESS","UPDATE_CONTACT_PREFERENCES","UPDATE_CONTACT_EMAIL_ADDRESS","UPDATE_CONTACT_PROFILE","UPDATE_CONTACT_ADDRESS","UPDATE_CONTACT_PHONE","UPDATE_CONTACT_NAME","CONFIRM_UPDATE_CONTACT_EMAIL_ADDRESS","INCIDENTS","CUSTOMER_INCIDENTS","GET_INCIDENT_DETAILS","UPDATE_INCIDENT","GET_INCIDENTS_BY_ASSET_ID","LIGHTING_INCIDENTS","STREET_CLEANING_INCIDENTS","FLY_TIPPING_INCIDENTS","GRAFFITI","ROAD_AND_PAVEMENT_PROBLEMS","SALT_BIN_PROBLEMS","DOG_AND_LITTER_BINS","WATER_AND_DRAINAGE_PROBLEMS","STREET_FURNITURE","ROAD_AND_STREET_SIGN","VEGETATION","GET_PARKING_VALIDATION_DATA","GET_PARKING_CUSTOMER_DETAILS","cycConfigurationUrls","WithAuthentication","children","useState","isAuthenticated","setIsAuthenticated","useNavigate","useEffect","authenticated","CYCServices","JWTAuth","ProgressBarComponent","totalSteps","currentStep","undefined","Fragment","style","width","Math","floor","SiteBreadcrumbsComponent","props","hasBreadcrumbs","breadcrumbs","LinkBreadcrumb","crumb","to","NonLinkBreadcrumb","ListItemBreadcrumb","Breadcrumbs","map","index","length","PageHeaderComponent","text","icon","passableCrumbs","useMemo","Icon","DocumentTitleComponent","propTypes","PropTypes","string","isRequired","oneOfType","node","arrayOf","AccordionComponent","expand","AccordionCollectionComponent","singleExpandMode","Children","toArray","expanded","setExpanded","child","cloneElement","e","newExpanded","fill","handleClick","AlertMessageComponent","RadioList","question","radioOptions","onChange","selectedItem","touched","errors","submitCount","tag","value","options","label","MyAccountPageComponent","classes","usePrevious","ref","useRef","current","msgConstants","NetworkLoaderComponent","request","isLoading","setIsLoading","hasError","setHasError","previousIsLoading","previousRequest","errorMessage","fileInputConstants","helpText","noFiles","withFiles","errorMessages","invalidFileType","exceedUploadSizeLimit","exceedUploadCountLimit","exceedFileNameCharacterLimit","fileEmpty","exception","fileReplaced","duplicateFile","maxFileUploadCount","maxFileUploadSize","maxFileNameCharacters","acceptedFileTypes","mediaType","suffix","getBase64","file","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","encoded","result","onerror","prepareFilesForSubmission","files","convertedFiles","getFile","item","content","fileInput","fileType","fileName","fileContent","push","all","truncateFileNameString","maxLength","fileExtension","split","pop","newFileName","substring","blob","Blob","lastModifiedDate","generateFileArraysForUpload","currentlySelectedFiles","newlySelectedFiles","filesToUpload","filesToRemove","filesToNotUpload","newlySelectedFilesLengths","currentlySelectedFilesLengths","combinedLengthsArray","Set","includes","indexesOfMatchingFilesInUploaded","i","forEach","FileInputComponent","uploadedFiles","onRemoveFile","onUploadFiles","setErrorMessages","inputRef","handleFileChange","target","filteredFiles","currentUploadLimit","filter","acceptedFileType","message","size","newFile","findIndex","uploadedFile","handleRemoveFile","useCallback","InvalidFiles","SelectedFiles","onRemoveFileClick","accept","x","toString","multiple","_cache","addressSources","fetchAddressArrayAsync","postcode","toUpperCase","axios","results","source","data","appInsights","trackException","properties","getStreetFromPoint","y","spatialReferenceWkid","uri","encodeURI","Address","splitter","find","join","trim","ex","getTOIDFromPoint","features","attributes","Toid","getParishFromPointAsync","NAME","getUSRNFromPoint","streetName","reference","usrn","getWardFromPoint","getPostcodeFromPointAsync","Full_Postcode","AddressLookupContainer","onAddressChange","onAddressSearch","onPostcodeChange","onValidationError","setPostcode","addresses","setAddresses","uprn","setUprn","loading","setLoading","handleAddressReset","handleSearchClick","trimmedPostcode","isValidPostcode","handleAddressChangeAsync","outOfYork","ward","easting","northing","onKeyPress","key","preventDefault","disabled","defaultValue","shortAddress","AppName","collectionClassNames","REFUSE","RECYCLING","GARDEN","collectionTypeTitles","webaspxDays","mon","tue","wed","thu","fri","sat","sun","getBinCollectionsForUPRNAsync","ConfigurationService","store","binCollectionsUrl","services","service","lastCollected","moment","nextCollection","binDescription","toLowerCase","frequency","day","getBinCalendarForUPRNAsync","binCalendarUrl","collections","date","sort","b","getCollectionLocationForUPRNAsync","binLocationUrl","groupBy","list","keyGetter","Map","collection","set","BinCollectionComponent","collectionStyle","constants","columnClass","serviceCount","isSame","format","wasteType","wasteCollectedFrom","collectedBy","BinCollectionsContainer","calendarUrl","setBinCollections","binState","setBinState","binLocation","setBinLocation","binData","collectionClone","isCentralCollection","isCommunal","collectionLocation","SummaryTableComponent","headerOne","headerTwo","linkHeader","rowData","col1","columnOne","col2","columnTwo","col3","link","onChangeClicked","TableClasses","restyle","GO_BACK","ErrorPageComponent","setReload","handleButtonClicked","primary","SiteLoaderComponent","ErrorLabelHandlerComponent","requiredInput","htmlFor","required","OffensiveGraffitiInputComponent","offensiveGraffiti","onOffensiveGraffitiChange","propType","bool","func","object","isRequried","number","ParkingPortalErrorPageComponent","history","ErrorBoxComponent","jumpButton","elements","getElementsByClassName","NetworkCatchErrorComponent","didCatchError","customMessage","componentDidMount","setState","render","this","React","Component","FlyoutComponent","open","onClose","c","SiteSearch","onSearch","searchTerm","setSearchTerm","noValidate","onSubmit","encodeURIComponent","placeholder","searchButtonSvg","SiteHeader","onLogOut","searchOpen","setSearchOpen","burgerMenuOpen","setBurgerMenuOpen","userContext","useContext","UserContext","handleLogOut","setStore","yorkLogoSvg","firstName","lastName","burgerMenuIcon","ErrorBoundaryComponent","componentDidCatch","info","stack","initialized","ContinueFormOrReRoute","formStarted","formCompleted","formStartUrl","formEndUrl","pathname","NotFoundComponent","LoggedInUpdatesComponent","goToMyAccount","NotLoggedInUpdatesComponent","onSignInClicked","onRegisterClicked","CycEsriMap","CycEsriMapComponent","locationObject","featureLayersOptionsProps","featureLayersOptions","incidentLayersOptions","getCurrentExtent","initialExtent","disableFreeSelect","enablePointSelectionAtZoomLevel","onMapClicked","getAllLayersDetailsOnClick","previousFeatureLayersOptions","setFeatureLayersOptions","initialFocus","setInitialFocus","street","parish","setLocation","basemapLayerOptions","popupTemplate","generateContent","mapPoint","getLocationDataFromPointAsync","locationData","shouldUpdateFeatureLayersOptions","option","layerId","streetPromise","EsriLocationService","toidPromise","wardPromise","postcodePromise","parishPromise","toid","newLocation","invalidClickOptions","disableClicking","onException","IncidentFormContainer","documentTitle","pageHeaderText","displayProgressBar","AdditionalInformationComponent","showCounter","maximumCount","onAdditionalInformationChange","headerText","hasHeader","hasHelpText","ShowLabel","ShowCounter","rows","createIncident","incident","USRN","assetId","ProductId","productId","CategoryId","problemId","parseInt","Easting","Northing","StreetName","RoadNumber","roadNumber","Ward","Parish","Postcode","Location","AssetDescription","assetDescription","AssetId","AdditionalInformation","additionalInformation","FileAttachments","StreetLightTypeId","lightingTypeId","BinsTypeId","binTypeId","Subject","subject","SizeOfWasteId","sizeOfWaste","SignTypeId","signTypeId","FlytippingOther","problemOther","OffensiveGraffiti","TOID","RoadDefectsTypeId","roadDefectTypeId","WaterDrainageTypeId","waterDrainageTypeId","RainedInLast2HoursId","hasItRained","DangerToRoadUserId","waterDangerToUser","RiskOfInternalFloodingId","riskOfInternalFlooding","ReoccurringProblemId","reocurringProblem","GullyType","gullyType","GullyNumber","gullyNumber","StreetFurnitureTypeId","streetFurnitureTypeId","VegetationTypeId","vegetationTypeId","AdditionalProblemInformation","additionalProblemInformation","apiUrl","config","Authorization","getToken","post","getIncidentDetails","referenceNumber","product","updateIncidentWithUser","secretReferenceNumber","incidentId","emailAddress","ReferenceNumber","SecretReferenceNumber","IncidentId","EmailAddress","put","updateIncident","updateDetails","UpdateNotes","updateNotes","getExistingIncidentsForAsset","optionalincidentsToIgnore","incidentResponse","assetHasLiveIncident","user","getProfile","given_name","family_name","createContext","myAccountHeaderText","PASSWORD_COMPLICATED_REGEX","POSTCODE_REGEX","ADDITIONAL_INFORMATION_MAX_LENGTH","categoryIdsSettingName","roadDefectTypeIdsSettingName","streetFurnitureSettingName","graffitiSettingName","vegetationSettingName","waterAndDrainageTypeSettingsNames","processCategoryIdsSettingName","categorySettingNames","parkingOnVerge","illegalCrossing","damagedOrRutted","obstruction","verge","collapsed","pothole","dippedOrCracking","unevenFlag","mud","damaged","missing","generalCondition","ancientMonument","barWall","fenceOrBoundaryWall","bridge","bollard","busShelterOrStop","bin","playEquipment","houseOrBuilding","sign","bench","utilityBox","asbestos","blackBags","buildingOrConstructionDebris","chemicalDrums","electricalEquipment","furniture","gardenWaste","whiteGoods","vehicleParts","tyres","other","categoriesToIgnoreInReports","settingName","drillDownArray","mapConstants","minimum","ChangeName","ReportDetailsOutcome","RefuseAndRecycling","MyCollections","UnadoptedLayerFlag","MissingAssetsFlag","DownForMaintenance","ParkingServices","incidentSourceIdsSettingName","incidentSourceSettingNames","equalTo","msg","Yup","test","exclusive","path","params","isValidTelephoneNumber","phoneNumber","numberToString","allowEmptyValue","isEnabled","flagState","AUTH_FAILURE_MESSAGE","postChangePasswordAsync","CurrentPassword","NewPassword","ConfirmPassword","newPasswordsMatch","getContactDetailAsync","withAddress","updateContactPreferencesAsync","shareContactDetails","ShareContactDetails","updateContactEmailAsync","newEmailAddress","NewEmailAddress","Password","updateContactNameAsync","updateContactAddressAsync","addressDetails","addressUrl","updateContactPhoneAsync","TelephoneNumber","ChangePasswordFormComponent","withFormik","mapPropsToValues","currentPassword","newPassword","confirmPassword","submitError","submitErrorMsg","handleRedirect","validationSchema","shape","min","matches","handleSubmit","values","setValues","setSubmitting","setFieldValue","resetForm","setFieldError","Object","keys","ChangePasswordContainer","navigation","ChangePasswordSuccessComponent","AccountDetailsComponent","accountDetails","setAccountDetails","primaryEmail","FeatureFlagsService","getFeatureFlagByName","featureFlagConstants","AccountDetailsContainer","accountDetailsPromise","setAccountDetailsPromise","CommunicationPreferenceContainer","componentLoadPromise","setComponentLoadPromise","setShareContactDetails","setSubmitError","ChangeEmailComponent","currentEmail","confirmEmail","onSuccessfulChange","notOneOf","res","ChangeEmailContainer","setCurrentEmail","currentEmailPromise","setCurrentEmailPromise","newEmail","ChangeEmailConfirmationComponent","ChangeEmailSuccessComponent","submitErrorMessage","setSubmitErrorMessage","useSearchParams","searchParams","userId","code","signOut","postEmailConfirmation","ChangePhonenumberComponent","telephone","pattern","ChangePhonenumberContainer","setPhoneNumber","phoneNumberPromise","setPhoneNumberPromise","newPhoneNumber","ChangeAddressComponent","currentAddress","onSumitSuccess","payload","selectedAddress","addressSource","outofYork","setErrors","setFieldTouched","MaintenanceApp","ChangeAddressContainer","currentAddressPromise","setCurrentAddressPromise","setCurrentAddress","ChangeAddressSuccessComponent","ForgotPasswordEmailSentComponent","ForgotPasswordFormComponent","autoComplete","ResetPasswordFormComponent","passwordChangeError","passwordChangeErrorMessage","passwordChangeSuccessful","form","assign","resetFormValues","err","urls","postForgotPasswordAsync","addressQuery","postResetPasswordAsync","ForgotPasswordContainer","promise","ResetPasswordContainer","setUserId","setCode","userIdFromUri","codeFromUri","ChangeNameComponent","ChangeNameContainer","setFirstName","setLastName","networkPromise","setNetworkPromise","ChangeNameConfirmationComponent","AccountRouterComponent","TermsAndConditionsComponent","RegistrationStepOneComponent","onSubmitSuccess","nullable","isSubmitting","errorBoxRef","isValid","createRef","previousSubmitCount","ReactDOM","findDOMNode","RegistrationStepTwoComponent","goToPrevious","IsValidComplexPassword","firstNameError","lastNameError","emailError","passwordError","confirmPasswordError","RegistrationStepThreeComponent","showAddressArray","addressArray","telephoneError","pending","done","RegisterSuccessfulComponent","onContinueClicked","extraSuccessfulContent","RegisterSuccessfulWithWarningComponent","currentPathRoot","signInLinkUrl","postRegistrationDataAsync","registrationForm","passwordsMatch","RegisterEmailConfirmComponent","emailConfirmSuccess","setEmailConfirmSuccess","confirmationCompleted","setConfirmationCompleted","search","baseUrl","RegistrationApp","useLocation","setCurrentStep","started","finished","formState","setFormState","setEmailAddress","setPassword","setConfirmPassword","submitRegistrationError","setSubmitRegistrationError","isExistingEmail","setIsExistingEmail","currentBasePath","finalString","splitString","findRegisterIndex","slice","getRegisterUrlPath","handleStepThreeSubmit","formSubmitData","telephoneNumber","onSuccessfulRegistration","isEmailConfirmed","formRouteInfo","appContent","session","bag","signOutPath","sessionOptions","sessionActivityService","endSession","clearInterval","sessionTickInterval","timingOutInterval","eventListeners","event","removeEventListener","eventHandler","latestTimeStamp","isIdle","handleSessionTick","isTimingOut","timeStamp","refreshCallback","elapsedTime","duration","timedOutCallback","warningDuration","isTimingOutCounter","setInterval","handleTimingOutCountdown","warningCallback","initialise","begin","now","rateLimit","asMilliseconds","beginSession","refresh","remove","end","triggerActivity","SignInFormComponent","onSuccessfulSignIn","registerLinkUrl","initialValues","signInUrl","handleSuccessfulSignIn","submitForm","authenticateAsync","success","enableReinitialize","emailHasError","passwordHasError","failed","allowReSubmit","SignInContainer","preSignInPath","WebChatRedirect","ReportSearchInputComponent","searchValue","setSearchValue","ReportSearchCounterComponent","currentMin","currentMax","max","ReportSearchResultsTableComponent","webchatSourceId","currentPage","setCurrentPage","sortOrder","setSortOrder","sortDescending","setSortDescending","sortClasses","sorted","reverse","start","renderingResults","handleSortClick","order","canShowPage","nextPage","inlineHeader","created","sourceId","outcome","colSpan","getReports","auth","categoryIdsToFilter","category","getDrillDownSettingValue","categoryId","createdTime","MyReportsIndexContainer","reports","setReports","reportsPromise","setReportsPromise","webChatSourceId","setWebChatSourceId","webchatSourceSettings","lowerCaseSearchValue","report","reportDetailsItems","productLookupName","reportItems","displayName","paramName","obj","entries","streetFurnitureSettings","ReportDetailsComponent","hideUploadPhoto","renderData","AdditionalInfoComponent","submitIncident","setAdditionalInformation","setUploadedFiles","submitIsDisabled","setSubmitIsDisabled","newFilesState","splice","CommunicationHistoryComponent","commHistory","dangerouslySetInnerHTML","__html","Child","withRouter","useParams","items","setIncident","setPromise","setErrorMessage","setWebchatSourceId","setHideUploadPhoto","hideAdditionalInformation","setHideAdditionalInformation","reportBreadcrumbs","getIncidentDetailsAsync","handleSubmitIncidentAsync","updatePromise","incidentDetailsPromise","overridingProduct","lookupName","template","incidentFieldValue","fileAttachments","communicationHistory","MyReportsRouter","MyReportsApp","getPrimaryAddressAsync","AccordionInternalComponent","linksToRender","callToActionLink","customCallToAction","firstColumnLinks","setFirstColumnLinks","secondColumnLinks","setSecondColumnLinks","halfLinksLength","round","ceil","linkUrl","linkText","isExternal","getParkingValidationData","MyParkingServicesAccordion","customer","keyhash","validationFormData","setValidationFormData","formReadyToPost","setFormReadyToPost","validateWspRef","handleSubmitValidateForm","dataToUpdate","submit","action","method","MyDetailsAccordion","myDetailsAccordion","MyReportsAccordion","MyRefuseAndRecyclingAccordion","MyCouncilTaxAccordion","MyBenefitsAccordion","HomePageContainer","visible","setVisible","fetchData","refuse","councilTax","benefits","parking","SignInRouter","goBackToPreviousLocation","goToPreviousLocation","TestLandingPage","TestingApp","FormConfiguration","featureLayerUrl","featureLayerId","userIsLoggedIn","infoAlertSubjectName","allowIncidentSelect","streetLightTypes","getIncidentsUrl","shouldDisplayBasedOnStep","urlHelper","steps","formSwitchUrl","missingAssetCheckBoxLabel","enablePointSelectionZoomLevels","streetLightingData","getEnvironmentSettingByName","missingAssetsLightTypes","missingAssetProductId","EntryPage","informationHeaderText","informationArray","goToNextPage","onResetForm","isUnadoptedRoad","feature","layer","unadoptedRoadStreetAndUsrnTable","getStreetAndUsrnTableForUnadoptedRoad","graphic","geometry","centroid","getUnadoptedRoadsFeatureOptions","mapUnadoptedLayerUrl","layerUrl","LocationPageComponent","locationSelected","locationSelectedValidationText","missingAssetsOptions","schema","oneOf","checked","goToNext","featureLayerOptions","clearLocationSelected","clearSelectedPoint","handleFeatureClicked","incidentExistsCheck","alert","incidentExistsAlertMessage","incidentLayerOptions","onIncidentSelected","useUnadoptedLayer","featurePopupTemplate","onFeatureClicked","locationSelectText","onMapSelected","handleSwitch","extraInformationUnderMap","additionalInformationHeaderText","showFileInputOnMapPage","showNextButton","propName","array","CheckOtherPropIsTrue","propToCheckAgainst","currentProp","ConfirmationPage","userLoggedIn","responseTimes","confirm","RedirectWithWindowConfirmV6","restartFormUrl","SummaryPageComponent","networkError","tableData","goToProblemPage","any","IncidentsExistDisplay","footerText","incidentsList","categorys","setCategoryAndDate","stringDate","findCategoryEntry","getcategoryId","getDateWithCorrectFormat","InfoIcon","generalHeader","productName","differentProblemFooter","workingToFixProblemFooter","cannotReportAnotherProblemFooter","ProblemPageComponent","onProblemTypeChange","possibleProblems","existingIncidents","previousIsSubmitting","errorBox","mapped","problem","filtered","filteredPossibleProblems","categoryIds","LightTypePageComponent","lightTypeId","lightTypes","onLightTypeChange","streetLightType","incidentLayersOptionsBuilder","mapIncidentDetailsToAttributes","mapIncidentLayerId","fields","mapIncidentDetailsToAttributesBuilder","faultType","toLocaleString","popupTemplateBuilder","mapIncidentLayerTitle","tableDataArray","nonTrData","showAlreadyReportedMessage","dataString","reportedMessage","header","FieldsBuilder","builder","alias","pushToBuilder","initialState","problemOtherId","missingAssetChecked","formData","incidentSubmitted","unitType","isAlternative","updateStateFields","updateFormDataFields","updateLocationObject","resetLocation","updateUploadFiles","removeUploadedFile","updateIncidentObject","actions","fieldNames","reducer","exisitingFiles","HeaderTextFromUrl","initialHeaderText","StreetLightingApp","setExistingIncidents","initState","useReducer","dispatch","indexOfStep","handleResetForm","ROAD_NAME","ROAD_NUMBER","WARD","PARISH","Item_Id","DESCRIPTION","LOCATION","UNIT_TYPE","getPossibleProblems","getType","val","lightingTypes","Services","sendUpdateIncidentWithUser","IncidentService","incidentsResult","hasProblemsLeftToReport","problems","hasProblemsLeft","problemsLeft","fieldsBuilder","addIncidentId","addFaultType","addAssetDescription","addCreatedTime","layerOptionsBuilder","handleAdditionalInformation","getMissingAssetOptions","featureFound","assetName","columnTwoClassName","buildTableData","userData","sizeOfWasteConst","SingleBlackBag","CarbootLoad","SmallvanLoad","LargevanLoad","Multiplevanloads","sizeOfWasteArray","getFlyTippingCategories","when","is","onSizeOfWasteChange","onProblemOtherChange","FlyTippingApp","mapIncidentsBuilder","flyTippingOther","flytippingOther","locationPageIncidentLayerOptions","addIncidentReferenceNumber","addWasteType","wasteSize","beforeYouBeginText","whatToReportText","streetCleaningCategories","StreetCleaningApp","addIssue","issue","getBuilderResult","getIncidentLayerOptions","testHeader","getSaltBinsCategories","SaltBinProblemsApp","cycleTrackId","defectTypes","cycleTrack","problemWithId","otherwise","notRequired","setPossibleProblems","generalConditionId","problemWith","categories","handleReset","onProblemWithChange","onProblemChange","goToPreviousPage","RoadAndPavementProblemsApp","isCycleTrackSelected","getFeatureLayerOptions","defectType","getGraffitiCategories","getProblemIdByName","problemName","utilityBoxId","onOffensiveGraffitiChanged","possibleGraffitiLocations","GraffitiApp","graffitiLocation","surfaceWaterQuestions","waterAndDrainageTypes","getTypeId","typeName","mapFeatureLayerId","mapFeatureLayerTitle","mapFeatureLayerUrl","sumaryQuestionNames","waterAndDrainageData","ProblemWithPageComponent","types","ProblemPageSurfaceWaterComponent","valuesObject","validationObject","onSurfaceWaterQuestionChange","ProblemPageNonSurfaceWaterComponent","floodedQuestions","areFloodedQuestionsRequired","typeDisplayName","problemCategories","onFloodedQuestionChange","WaterAndDrainageProblemsApp","gullyId","surfaceWaterId","isGullySelected","isSurfaceWaterSelected","customMapIncidentDetailsToAttributes","cat","featureType","waterDrainageType","itemId","TYPE","OBJECTID","serviceResult","surfaceWaterType","newProblemWithId","addFeatureType","featureLayer","getLocationSelectText","questionId","floodedId","flooded","selectedType","surfaceWaterQuestionsTable","categoryDisplayName","dogAndLitterBinsFeatureLayerId","dogAndLitterBinsFeatureLayerUrl","binTypes","binNames","isGraffiti","DogAndLitterBins","Street","toidValue","postcodeValue","usrnValue","parishValue","binType","BinType","problemType","alternative","isOffensive","locationColumn","additionalLocationInformationColumn","streetColumn","binTypeColumn","whatIsTheProblemColumn","uploadPhotoColumn","testName","getGraffitiSettings","getProblemTypes","getProductId","ProblemPageAfterLocationComponent","StreetFurnitureApp","problemTypes","graffitiSettings","arr","possibleProblemsBuilder","customId","checkAndReturnCategory","AboutProblemPageComponent","typeId","onSignTypeChange","possibleSignTypes","roadSignFeatureLayerId","roadSignFeatureLayerUrl","streetNameplatesFeatureLayerId","streetNameplatesFeatureLayerUrl","mapIncidentsUrl","signTypes","signTypesPure","RoadAndStreetSignApp","TEXT","signType","isRoadSign","road","normalLayers","featureLayerOptionsBuilder","getIdForProduct","vegetationTypes","beforeYouBeginHeadingText","uploadPhotoHelpText","disclaimer","onVegetationTypeChange","possibleVegetationTypes","selectedVegetationType","VegetationApp","IncidentFormRouter","MyCollectionsContainer","customerUprn","setCustomerUprn","customerAddress","setCustomerAddress","myGetContactDetails","RecyclingIconComponent","RecyclingIcon","RefuseIconComponent","RefuseIcon","GardenIconComponent","GardenIcon","BinCalendarComponent","setCollections","showSimpleCalendar","setShowSimpleCalendar","apiData","month","RoundComponent","RoundIcon","roundType","KeyComponent","media","RoundChangesWarningComponent","trackEvent","print","display","monthKey","collectionKey","RecycleLogo","MyCalendarContainer","RefuseAndRecyclingRouter","ParkingCustomerDetails","formRef","fullCustomerDetails","hashedFullCustomerDetails","setFormData","xml","handleAddressChange","BinCollectionsApp","SiteRouter","ConfirmDialog","isOpen","confirmText","cancelText","AutoLogoutDialog","remainingSeconds","timeRemaining","myAccountSessionConstants","App","createBrowserHistory","configurationLoaded","setConfigurationLoaded","featureFlagsLoaded","setFeatureFlagsLoaded","downForMaintenance","setDownForMaintenance","setSession","app_name","app_version","resetSessionState","handleSessionRefresh","renewToken","handleSessionWarning","AppStatus","initialiseApp","load","initialize","applicationInsightsKey","defaults","REACT_APP_CYC_FEATURE_FLAGS_SET","registerServiceWorker","severityLevel","SeverityLevel"],"mappings":"guFAUMA,EAAcC,QACW,cAA7BC,OAAOC,SAASC,UAEe,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAASC,MAAM,2DAGpB,SAASC,IACtB,GAA6C,kBAAmBC,UAAW,CAGzE,GADkB,IAAIC,IAAIC,GAAwBP,OAAOC,UAC3CO,SAAWR,OAAOC,SAASO,OAIvC,OAGFR,OAAOS,iBAAiB,QAAQ,WAC9B,IAAMC,EAAK,UAAMH,GAAN,sBAEPT,IAiDV,SAAiCY,GAE/BC,MAAMD,GACHE,MAAK,SAACC,GAEmB,MAApBA,EAASC,SAAkF,IAAhED,EAASE,QAAQC,IAAI,gBAAgBC,QAAQ,cAE1EZ,UAAUa,cAAcC,MAAMP,MAAK,SAACQ,GAClCA,EAAaC,aAAaT,MAAK,WAC7BZ,OAAOC,SAASqB,eAKpBC,EAAgBb,MAGnBc,OAAM,WACLC,QAAQC,IAAI,oEAjEVC,CAAwBjB,GAIxBL,UAAUa,cAAcC,MAAMP,MAAK,WACjCa,QAAQC,IACN,gHAMJH,EAAgBb,OAMxB,SAASa,EAAgBb,GACvBL,UAAUa,cACPd,SAASM,GACTE,MAAK,SAACQ,GACLA,EAAaQ,cAAgB,WAC3B,IAAMC,EAAmBT,EAAaU,WACtCD,EAAiBE,cAAgB,WACA,cAA3BF,EAAiBG,QACf3B,UAAUa,cAAce,WAK1BR,QAAQC,IAAI,6CAKZD,QAAQC,IAAI,4CAMrBF,OAAM,SAACU,GACNT,QAAQS,MAAM,4CAA6CA,M,kBC7ElD,MAA0B,+C,OCc1BC,EATa,kBAC1B,0BAASC,MAAM,iCAAf,UACE,wBAAQC,OAAQC,EAASC,KAAK,kBAC9B,qBAAKC,ICRM,61MDQQC,IAAI,uD,OEDdC,EAAoB,WAC/B1C,OAAO2C,SAAS,CAAEC,IAAK,EAAGC,KAAM,EAAGC,SAAU,YAIlCC,EAAqB,WAChC,IAAQC,EAAShD,OAAOC,SAAhB+C,KACJA,EAIFC,YAAW,WACT,IAAMC,EAAKF,EAAKG,QAAQ,IAAK,IACvBC,EAAUC,SAASC,eAAeJ,GACpCE,GAASA,EAAQG,mBACpB,GAEHvD,OAAOwD,OAAO,EAAG,IAaRC,EAAuB,uCAAG,WAAOC,EAAMC,EAAYC,EAAUV,EAAIW,EAAeC,GAAtD,eAAAC,EAAA,0DACjCF,EADiC,mBAE9BC,EAF8B,sBAER,IAAIE,MAAM,6EAFF,uBAG7BF,GAAe,GAHc,OAK/BG,EAAMf,EAAE,UAAMS,EAAWO,SAASR,GAA1B,YAAmCR,GAAOS,EAAWO,SAASR,GAC5EE,EAASK,GAN4B,2CAAH,gEC6CrBE,EA3ES,kBACtB,sBAAKC,UAAU,mBAAf,UACE,sBAAKA,UAAU,6BAAf,UACE,cAAC,IAAD,CACEA,UAAWC,IAAcC,UACzBC,QAAS,kBAAOvE,OAAOC,SAAW,oCAFpC,sBAKA,cAAC,IAAD,CAAiBmE,UAAWC,IAAcC,UAAWC,QAAS7B,EAAmBN,MAAM,cAAvF,SACE,sBAAMgC,UAAU,iCAGpB,qBAAKA,UAAU,0CAAf,SACE,+BACE,6BACE,oBAAGI,KAAK,sCAAsCpC,MAAM,WAAWqC,IAAI,WAAnE,UACE,sBAAML,UAAU,8BAChB,sBAAMA,UAAU,SAAhB,2BAGJ,6BACE,oBAAGI,KAAK,iDAAiDC,IAAI,WAA7D,UACE,sBAAML,UAAU,2BAA2BhC,MAAM,YACjD,sBAAMgC,UAAU,SAAhB,0BAGJ,6BACE,oBAAGI,KAAK,iCAAiCC,IAAI,WAA7C,UACE,sBAAML,UAAU,2BAA2BhC,MAAM,YACjD,sBAAMgC,UAAU,SAAhB,0BAGJ,6BACE,oBAAGI,KAAK,4CAA4CC,IAAI,WAAxD,UACE,sBAAML,UAAU,6BAA6BhC,MAAM,cACnD,sBAAMgC,UAAU,SAAhB,iCAMR,qBAAKA,UAAU,iBAAf,SACE,sBAAKA,UAAU,oCAAf,UACE,gCACE,+BACE,6BACE,mBAAGI,KAAK,oCAAR,0BAEF,6BACE,mBAAGA,KAAK,oCAAR,uBAEF,6BACE,mBAAGA,KAAK,gCAAR,oCAEF,6BACE,mBAAGA,KAAK,mCAAR,wBAEF,6BACE,mBAAGA,KAAK,wCAAR,gCAGJ,iDAAqB,IAAIE,MAAOC,cAAhC,+BAEF,qBAAKP,UAAU,sDAAf,SACE,mBAAGI,KAAK,sBAAR,SACE,qBAAKJ,UAAU,8CAAf,SACE,cAAC,EAAD,CAAqBQ,MAAM,6CCzE5BC,EAAmB,QACnBC,EAAyB,wBACzBC,EAAqB,mBAGrBC,EAAqB,CAChCC,OAAQ,WACR7E,SAAU,YACV8E,iBAAkB,sBAClBC,UAAW,aACX/D,aAAc,CACZgE,KAAM,YACNC,MAAO,YACPC,MAAO,YACPC,MAAO,cACPC,WAAY,cACZC,kBAAmB,iBAErBC,eAAgB,CACdN,KAAMP,wBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPI,MAAO,aACPC,aAAc,iBAEhBC,eAAgB,CACdT,KAAMP,wBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,iBAEhBE,cAAe,CACbV,KAAMP,uBACNa,eAAgB,mBAChBL,MAAO,YACPC,MAAO,YACPM,aAAc,iBAEhBG,WAAY,CACVX,KAAMP,oBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,iBAEhBI,SAAU,CACRZ,KAAMP,iBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,gBACdX,OAAQ,WACR7E,SAAU,aAEZ6F,wBAAyB,CACvBb,KAAMP,mCACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,iBAEhBM,gBAAiB,CACfd,KAAMP,0BACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,iBAEhBO,gBAAiB,CACff,KAAMP,4BACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPK,aAAc,iBAEhBQ,yBAA0B,CACxBhB,KAAMP,oCACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPI,MAAO,aACPU,MAAO,aACPT,aAAc,iBAEhBU,gBAAiB,CACflB,KAAMP,yBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPI,MAAO,aACPC,aAAc,iBAEhBW,kBAAmB,CACjBnB,KAAMP,6BACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPI,MAAO,aACPC,aAAc,iBAEhBY,WAAY,CACVpB,KAAMP,mBACNQ,MAAO,YACPC,MAAO,YACPC,MAAO,cACPI,MAAO,aACPC,aAAc,iBAEhBa,QAAS,CACPrB,KAAM,WACNsB,SAAU,CACRC,OAAQ,mBACRC,iBAAkB,8BAClBC,OAAQ,mBACRC,UAAW,8BACXC,MAAO,mBAETC,MAAO,CACLL,OAAQ,gBACRf,aAAc,6BACdJ,WAAY,4BAEdyB,MAAO,CACLN,OAAQ,iBAEVO,QAAS,CACPP,OAAQ,kBACRnB,WAAY,8BAEd2B,KAAM,CACJR,OAAQ,eACRf,aAAc,6BAEhBwB,eAAgB,mBAChBC,yBAA0B,8BAE5BC,KAAM,aACNC,QAAS,CACPnC,KAAM,WACNH,OAAQ,UACR7E,SAAU,oBAEZoH,UAAW,CACTpC,KAAM,cACNqC,QAAS,YAEXC,mBAAoB,CAClBC,cAAe7C,8CACf8C,WAAY9C,gDAEd+C,QAAS,CACPzC,KAAM,YAERlD,MAAO,SACP4F,uBAAwB,wBACxBC,eAAgB,CACd3C,KAAML,EACNiD,SAAU,YACVC,kBAAmBlD,8BAKVmD,EACL,2BADKA,EAED,mCAFCA,EAGY,kDAHZA,EAIM,0CAJNA,EAKM,kDAObC,EAAe,6BAERC,EAAiB,SAEjBC,EAAkB,CAC7BC,SAAU,wBACVC,QAAS,eACTC,cAAe,qBACfC,eAAgB,sBAChBC,wBAAyB,8BACzBC,uBAAwB,6BACxBC,uBAAwB,6BACxBC,mBAAoB,wBACpBC,oBAAqB,gCACrBC,2BAA4B,uCAC5BC,6BAA8B,iCAC9BC,uBAAwB,4BACxBC,uBAAwB,4BACxBC,qBAAsB,0BACtBC,oBAAqB,yBACrBC,qCAAsC,uCACtCC,UAAW,gBACXC,mBAAoB,+CACpBC,qBAAsB,mCACtBC,gBAAiB,+BACjBC,0BAA2B,0CAC3BvB,aAAc,CACZwB,mBAAoBxB,EAAe,qBACnCyB,0BAA2BzB,EAAe,qBAC1C0B,sBAAuB1B,EAAe,eACtC2B,SAAU3B,EAAe,YACzB4B,2BAA4B5B,EAAe,oCAC3C6B,kBAAmB7B,EAAe,eAClC8B,oBAAqB9B,EAAe,uBACpC+B,4BAA6B/B,EAAe,oCAC5CgC,iBAAkBhC,EAAe,gCACjCiC,qBAAsBjC,EAAe,kBACrCkC,WAAYlC,EAAe,eAE7BmC,4BAA6B,6BAC7BC,6BAA8B,+BAGnBC,EAED,gBC1MGC,EAfY,SAAC,GAAkB,IAAhBC,EAAe,EAAfA,SAC5B,EAA8CC,oBAAS,GAAvD,mBAAOC,EAAP,KAAwBC,EAAxB,KACMjH,EAAWkH,cASjB,OARAC,qBAAU,WACR,IAAMC,EAAgBC,cAAYC,QAAQN,kBAC1CC,EAAmBG,IACG,IAAlBA,GACFpH,EAASoB,EAAmBC,UAE7B,KAEqB,IAApB2F,EAAiCF,EAC9B,8BCMMS,G,OApBc,SAAC,GAAD,IAAGC,EAAH,EAAGA,WAAYC,EAAf,EAAeA,YAAf,OACX,IAAhBA,GACgB,OAAhBA,GACe,IAAfD,GACe,OAAfA,QACgBE,IAAhBD,QACeC,IAAfF,EACE,cAAC,IAAMG,SAAP,IAEA,eAAC,IAAMA,SAAP,WACE,qBAAKnH,UAAU,eAAf,SACE,qBAAKA,UAAU,uBAAuBoH,MAAO,CAAEC,MAAsB,IAAdJ,EAAqBD,EAAa,SAE3F,sCACO,4BAAIC,IADX,OAC+B,4BAAID,IADnC,aAC4D,8BAAIM,KAAKC,MAAqB,IAAdN,EAAqBD,GAArC,OAAuD,IADnH,oBCiESQ,G,cAvEkB,SAACC,GAChC,IAAMC,OAAuCR,IAAtBO,EAAME,YAGvBC,EAAiB,SAAC,GAAD,IAAGC,EAAH,EAAGA,MAAH,OACrB,cAAC,IAAD,CAAM7H,UAAU,+BAA+B8H,GAAID,EAAMhI,IAAzD,SACE,+BAAOgI,EAAM9E,UAKXgF,EAAoB,SAAC,GAAD,IAAGF,EAAH,EAAGA,MAAH,OAAe,+BAAOA,EAAM9E,QAEhDiF,EAAqB,SAAC,GAAkB,IAAhB1B,EAAe,EAAfA,SAC5B,OAAO,oBAAItG,UAAU,yBAAd,SAAwCsG,KAI3C2B,EAAc,SAAC,GAAD,IAAGN,EAAH,EAAGA,YAAH,OAClB,mCACGA,EAAYO,KAAI,SAACL,EAAOM,GAEvB,OAAIA,EAAQ,IAAMR,EAAYS,OAE1B,cAACJ,EAAD,UACE,cAACJ,EAAD,CAAgBC,MAAOA,KADAM,GAM3B,cAACH,EAAD,UACE,cAACD,EAAD,CAAmBF,MAAOA,KADHM,SAUjC,OACE,qBAAKnI,UAAU,aAAa,aAAW,wBAAvC,SACE,qBAAIA,UAAU,mBAAd,UACE,oBAAIA,UAAU,yBAAd,SACE,mBAAGA,UAAU,+BAA+BK,IAAI,OAAOD,KAAK,sBAA5D,SACE,4CAGJ,oBAAIJ,UAAU,yBAAd,cACyBkH,IAAtBO,EAAME,YACL,cAACI,EAAD,CAAmBF,MAAO,CAAE9E,KAAM,gBAElC,cAAC6E,EAAD,CAAgBC,MAAO,CAAEhI,IAAKe,EAAmBG,UAAWgC,KAAM,mBAIlD,IAAnB2E,GAA2B,cAACO,EAAD,CAAaN,YAAaF,EAAME,qBCdrDU,EA9Ca,SAAC,GAAiC,IAA/BC,EAA8B,EAA9BA,KAAMC,EAAwB,EAAxBA,KAAMZ,EAAkB,EAAlBA,YACnCa,EAAiBC,mBAAQ,WAC7B,YAAoBvB,IAAhBS,EACKA,OAGWT,IAAhBS,GAAsC,eAATW,EAG1B,CAAC,CAAEzI,IAAK,GAAIkD,KAAMuF,SAHzB,IAIC,CAACX,EAAaW,IAEXI,EAAO,SAAC,GAAD,IAAGH,EAAH,EAAGA,KAAH,YAAwBrB,IAATqB,EAAqB,mBAAGvI,UAAWuI,EAAO,gBAAoB,MAE1F,OACE,qBAAKvI,UAAU,cAAf,SACE,qBAAKA,UAAU,iBAAf,SACE,sBAAKA,UAAU,uBAAf,UAEE,cAAC0I,EAAD,CAAMH,KAAMA,IAIZ,sBAAKvI,UAAU,sBAAf,UACE,oBAAIA,UAAU,YAAY,cAAY,wBAAtC,SACGsI,IAEH,cAAC,EAAD,CAA0BX,YAAaa,e,gBC9B7CG,EAAyB,SAAC,GAAyB,IAAvB3K,EAAsB,EAAtBA,MAAOsI,EAAe,EAAfA,SAQvC,OAPAK,qBAAU,WAIR,OAHI3I,IACFiB,SAASjB,MAAQA,GAEZ,kBAAOiB,SAASjB,MAAQ,iBAG1B,mCAAGsI,KAGZqC,EAAuBC,UAAY,CACjC5K,MAAO6K,IAAUC,OAAOC,WACxBzC,SAAUuC,IAAUG,UAAU,CAACH,IAAUI,KAAMJ,IAAUK,QAAQL,IAAUI,SAG9DN,QCMAQ,G,OApBY,SAAC,GAAD,IAAGnL,EAAH,EAAGA,MAAOmC,EAAV,EAAUA,QAASiJ,EAAnB,EAAmBA,OAAQ9C,EAA3B,EAA2BA,SAA3B,OACzB,sBAAKtG,UAAU,YAAf,UACE,qBAAIG,QAAS,kBAAMA,EAAQnC,IAA3B,UACGA,EACD,sBACEA,MAAM,gBACNgC,WAAsB,IAAXoJ,EAAkB,0DAA4D,uBAE7F,qBAAKpJ,WAAsB,IAAXoJ,EAAkB,gDAAkD,qBAApF,SACG9C,S,QCmBQ+C,I,OA7BsB,SAAC,GAAoC,IAAlC/C,EAAiC,EAAjCA,SAAUgD,EAAuB,EAAvBA,iBAEhD,EAAgC/C,mBAASgD,WAASC,UAAUtB,KAAI,kBAAM,MAAtE,mBAAOuB,EAAP,KAAiBC,EAAjB,KAEA/C,qBAAU,WACR+C,EAAYH,WAASC,UAAUtB,KAAI,kBAAM,QACxC,CAAC5B,EAAUgD,IAcd,OACE,qBAAKtJ,UAAU,uBAAf,SACGuJ,WAASC,QAAQlD,GAAU4B,KAAI,SAACyB,EAAOxB,GAAR,OAC9ByB,uBAAaD,EAAO,CAAExJ,QAAS,kBAdjB,SAAC0J,GAEnB,IAAMC,EAAW,YAAOL,IAEH,IAArBH,GAA6BQ,EAAYC,MAAK,GAE9CD,EAAYD,IAAMJ,EAASI,GAE3BH,EAAYI,GAM6BE,CAAY7B,IAAQiB,OAAQK,EAAStB,YCfnE8B,GAJe,SAAC,GAAkB,IAAhB3D,EAAe,EAAfA,SAC/B,OAAO,qBAAKtG,UAAU,gBAAf,SAAgCsG,KCgD1B4D,GAxCG,SAACzC,GACjB,IAAQ0C,EAAqF1C,EAArF0C,SAAUrL,EAA2E2I,EAA3E3I,GAAIsL,EAAuE3C,EAAvE2C,aAAcC,EAAyD5C,EAAzD4C,SAAUC,EAA+C7C,EAA/C6C,aAAcC,EAAiC9C,EAAjC8C,QAASC,EAAwB/C,EAAxB+C,OAAQC,EAAgBhD,EAAhBgD,YAE7E,OACE,qBAAKzK,UAAU,MAAMlB,GAAIA,EAAzB,SACE,iCACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAM6B,EACNO,IAAI,IACJ5L,GAAIA,EACJ2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAMjE,EACN6L,MAAOL,EACPD,SAAUA,EACVO,QAASR,EAAalC,KAAI,SAAC0C,GAAD,MAAc,CACtCC,MAAOD,EAAQD,MACfA,MAAOC,EAAQ9L,OAEjBhB,MAAO0M,EAAO1L,IAAOyL,EAAQzL,KAE9B0L,EAAO1L,IAAOyL,EAAQzL,IAAO,cAAC,IAAD,UAAsB0L,EAAO1L,WCzBpDgM,I,OAZgB,SAAC,GAA6B,IAA3BxE,EAA0B,EAA1BA,SAAUtG,EAAgB,EAAhBA,UACpC+K,EAAUtC,mBACd,uBAAqBvB,IAAdlH,EAA0B,0BAA1B,kCAAiFA,KACxF,CAACA,IAEH,OACE,qBAAKA,UAAW+K,EAAhB,SACE,8BAAMzE,Q,SCDG0E,GARK,SAACL,GACnB,IAAMM,EAAMC,mBAIZ,OAHAvE,qBAAU,WACRsE,EAAIE,QAAUR,KAETM,EAAIE,SCPAC,I,OAOQ,uDAPRA,GAQE,uDARFA,GASa,0CATbA,GAUU,wCAVVA,GAWe,oFAXfA,GAaT,4JAbSA,GAeT,gKAfSA,GAgBc,kFAhBdA,GAkBT,2F,0BCkCWC,GA5CgB,SAAC,GAAqC,IAAnC/E,EAAkC,EAAlCA,SAAUgF,EAAwB,EAAxBA,QAAY7D,EAAY,mBAClE,EAAkClB,oBAAS,GAA3C,mBAAOgF,EAAP,KAAkBC,EAAlB,KACA,EAAgCjF,oBAAS,GAAzC,mBAAOkF,EAAP,KAAiBC,EAAjB,KAEMC,EAAoBX,GAAYO,GAChCK,EAAkBZ,GAAYM,GAiBpC,OAfA3E,qBAAU,YACkB,IAAtBgF,GAA+BC,IAAoBN,GACrDE,GAAa,GAEfF,EACG9O,MAAK,WACJgP,GAAa,GACbE,GAAY,MAEbtO,OAAM,WACLoO,GAAa,GACbE,GAAY,QAEf,CAACJ,EAASK,EAAmBC,IAG9B,eAAC,IAAMzE,SAAP,WACGoE,GACC,qBAAKvL,UAAU,iDAAf,SACE,6CAGHyL,GACC,qBAAKzL,UAAU,+CAAf,cAC0BkH,IAAvBO,EAAMoE,aAA6BpE,EAAMoE,aAAeT,MAG9C,IAAdG,IAAoC,IAAbE,GAAsBnF,MC1CvCwF,GAAqB,CAChCC,SAAU,CACRC,QAAS,0EACTC,UAAW,mFAEbC,cAAe,CACbC,gBAAiB,+DACjBC,sBAAuB,oEACvBC,uBAAwB,qDACxBC,6BACE,6FACFC,UAAW,mDACXC,UAAW,iFACXC,aAAc,8EACdC,cAAe,oFAEjBC,mBAAoB,EACpBC,kBAAmB,SACnBC,sBAAuB,IACvBC,kBAAmB,CACjB,CACEC,UAAW,YACXC,OAAQ,QAEV,CACED,UAAW,aACXC,OAAQ,SAEV,CACED,UAAW,YACXC,OAAQ,UC9BDC,I,OAAS,uCAAG,WAAOC,GAAP,SAAAvN,EAAA,+EAChB,IAAIwN,SAAQ,SAACC,EAASC,GAC3B,IAAMC,EAAS,IAAIC,WACnBD,EAAOE,cAAcN,GACrBI,EAAOG,OAAS,WACd,IAAIC,EAAUJ,EAAOK,OAAO5O,QAAQ,cAAe,IACnDqO,EAAQM,IAEVJ,EAAOM,QAAU,SAAC9P,GAAD,OAAWuP,EAAOvP,QARd,2CAAH,uDAYT+P,GAAyB,uCAAG,WAAOC,GAAP,iBAAAnO,EAAA,6DACnCoO,EAAiB,GAEfC,EAHiC,+BAAArO,EAAA,MAGvB,WAAOsO,GAAP,iBAAAtO,EAAA,sEACQsN,GAAUgB,GADlB,OACRC,EADQ,OAERC,EAAY,CAChBC,SAAUH,EAAK9P,KACfkQ,SAAUJ,EAAKlL,KACfuL,YAAaJ,GAEfH,EAAeQ,KAAKJ,GAPN,2CAHuB,+DAYjChB,QAAQqB,IAAIV,EAAM5F,IAAN,uCAAU,WAAO+F,GAAP,SAAAtO,EAAA,+EAAgBqO,EAAQC,IAAxB,2CAAV,wDAZqB,gCAahCF,GAbgC,2CAAH,sDAsBzBU,GAAyB,SAACvB,EAAMwB,GAC3C,GAAIxB,EAAKnK,KAAKqF,OAASsG,EAAW,CAChC,IAAMC,EAAgBzB,EAAKnK,KAAK6L,MAAM,KAAKC,MACrCC,EAAc5B,EAAKnK,KAAKgM,UAAU,EAAGL,GAAaC,EAAcvG,OAAS,IAE3E4G,EAAO,IAAIC,KAAK,CAAC/B,GAAO,CAAE/O,KAAM+O,EAAK/O,OAIzC,OAHA6Q,EAAKE,iBAAmB,IAAI5O,KAC5B0O,EAAKjM,KAAO+L,EAAc,IAAMH,EAEzBK,EAET,OAAO9B,GAWIiC,GAA8B,SAACC,EAAwBC,GAClE,IAAIC,EAAgB,GAChBC,EAAgB,GAChBC,EAAmB,GAGjBC,EAA4BJ,EAAmBnH,KAAI,SAACgF,GAAD,OAAUA,EAAKoB,YAAYlG,UAC9EsH,EAAgCN,EAAuBlH,KAAI,SAACgF,GAAD,OAAUA,EAAKoB,YAAYlG,UAEtFuH,EAAoB,sBAAOF,GAAP,YAAqCC,IAG/D,GAF6B,YAAO,IAAIE,IAAID,IAEhBvH,SAAWuH,EAAqBvH,OAC1D,MAAO,CAACiH,EAAoB,GAAI,IAMlC,IAAK,IAAIlH,EAAQ,EAAGA,EAAQkH,EAAmBjH,OAAQD,IAAS,CAC9D,IAAM+E,EAAOmC,EAAmBlH,GAGhC,GAAImH,EAAcpH,KAAI,SAACgF,GAAD,OAAUA,EAAKoB,eAAauB,SAAS3C,EAAKoB,aAC9DkB,EAAiBjB,KAAKrB,OADxB,CAUA,IADA,IAAM4C,EAAmC,GAChCC,EAAI,EAAGA,EAAIX,EAAuBhH,OAAQ2H,IAC7CX,EAAuBlH,KAAI,SAACgF,GAAD,OAAUA,EAAKoB,eAAayB,KAAO7C,EAAKoB,aACrEwB,EAAiCvB,KAAKwB,GAKM,IAA5CD,EAAiC1H,QAMnCkH,EAAcf,KAAKrB,GACnB4C,EAAiCE,SAAQ,SAAC7H,GACxCoH,EAAchB,KAAKa,EAAuBjH,QAP5CmH,EAAcf,KAAKrB,IAavB,MAAO,CAACoC,EAAeC,EAAeC,I,oDCsFzBS,GAvLY,SAAC,GAA8D,IAA5DC,EAA2D,EAA3DA,cAAeC,EAA4C,EAA5CA,aAAcC,EAA8B,EAA9BA,cAAkB3I,EAAY,mBACvF,EAA0ClB,mBAAS,IAAnD,mBAAO2F,EAAP,KAAsBmE,EAAtB,KACMC,EAAWpF,iBAAO,MAGlBa,EAAWtD,mBACf,uBAA0BvB,IAAnBO,EAAMsE,SAAyBtE,EAAMsE,SAAWD,GAAmBC,WAC1E,CAACtE,EAAMsE,WAEHY,EAAqBlE,mBACzB,uBAAoCvB,IAA7BO,EAAMkF,mBAAmClF,EAAMkF,mBAAqBb,GAAmBa,qBAC9F,CAAClF,EAAMkF,qBAEHC,EAAoBnE,mBACxB,uBAAmCvB,IAA5BO,EAAMmF,kBAAkCnF,EAAMmF,kBAAoBd,GAAmBc,oBAC5F,CAACnF,EAAMmF,oBAEHC,EAAwBpE,mBAC5B,uBACkCvB,IAAhCO,EAAMoF,sBACFpF,EAAMoF,sBACNf,GAAmBe,wBACzB,CAACpF,EAAMoF,wBAEHC,EAAoBrE,mBACxB,uBAAmCvB,IAA5BO,EAAMqF,kBAAkCrF,EAAMqF,kBAAoBhB,GAAmBgB,oBAC5F,CAACrF,EAAMqF,oBAEHtC,EAAS/B,mBACb,uBAAwBvB,IAAjBO,EAAM+C,OAAuB/C,EAAM+C,OAASsB,GAAmBI,gBACtE,CAACzE,EAAM+C,SAIH+F,EAAgB,uCAAG,WAAO1G,GAAP,mCAAAlK,EAAA,yDACjBmO,EAAQjE,EAAE2G,OAAO1C,MAEnB2C,EAAgB,GAChBvE,EAAgB,UAENhF,IAAV4G,GAAuBA,EAAM1F,OAAS,GANnB,iBAQfsI,EAAqB/D,EAAqBuD,EAAc9H,OARzC,WAUZ2H,GAEP,IAAMpB,EAAgBb,EAAMiC,GAAG5R,KAG/B,GAA4G,IAAxG2O,EAAkB6D,QAAO,SAACC,GAAD,OAAsBA,EAAiB7D,YAAc4B,KAAevG,OAE/F,OADA8D,EAAcqC,KAAK,CAAEF,SAAUP,EAAMiC,GAAGhN,KAAM8N,QAASrG,EAAO2B,kBAC9D,WAIF,GAAI4D,GAAKW,EAEP,OADAxE,EAAcqC,KAAK,CAAEF,SAAUP,EAAMiC,GAAGhN,KAAM8N,QAASrG,EAAO6B,yBAC9D,WAIF,GAAIyB,EAAMiC,GAAGe,MAAQlE,EAEnB,OADAV,EAAcqC,KAAK,CAAEF,SAAUP,EAAMiC,GAAGhN,KAAM8N,QAASrG,EAAO4B,wBAC9D,WAIF,GAAI0B,EAAMiC,GAAGhN,KAAKqF,OAASyE,EAAuB,CAEhDX,EAAcqC,KAAK,CAAEF,SAAUP,EAAMiC,GAAGhN,KAAM8N,QAASrG,EAAO8B,+BAE9D,IAAMyE,EAAUtC,GAAuBX,EAAMiC,GAAIlD,GAEjD,OADA4D,EAAclC,KAAKwC,GACnB,WAGFN,EAAclC,KAAKT,EAAMiC,KAhClBA,EAAI,EAVQ,YAULA,EAAIjC,EAAM1F,QAVL,mCAUZ2H,GAVY,wDAUaA,IAVb,4BA6CjBU,EAAcrI,OAAS,GA7CN,kCA8CGyF,GAA0B4C,GA9C7B,QA8CnBA,EA9CmB,SAgDsCtB,GACvDe,GAAiB,GACjBO,GAlDiB,mBAgDZnB,EAhDY,KAgDGC,EAhDH,KAgDkBC,EAhDlB,KAqDnBD,EAAcS,SAAQ,SAAC9C,GACrBiD,EAAaD,EAAcc,WAAU,SAACC,GAAD,OAAkBA,IAAiB/D,MACxEhB,EAAcqC,KAAK,CAAEF,SAAUnB,EAAKmB,SAAUwC,QAASrG,EAAOiC,kBAIhE6D,EAASnF,QAAQR,MAAQ,KAEzB6E,EAAiBQ,SAAQ,SAAC9C,GACxBhB,EAAcqC,KAAK,CAAEF,SAAUnB,EAAKmB,SAAUwC,QAASrG,EAAOkC,mBAGhE0D,EAAcd,GAjEK,QAoErBe,EAAiBnE,GApEI,4CAAH,sDAwEhBgF,EAAmBC,uBACvB,SAAChJ,GACCgI,EAAahI,GAGbkI,EAAiB,IAGjBC,EAASnF,QAAQR,MAAQ,OAE3B,CAAC2F,EAAUH,EAAcE,IAGrBe,EAAe,SAAC,GAAD,SAAGlF,cACRhE,KAAI,SAAC2D,EAAc1D,GAAf,OAChB,8BACE,uCAAU0D,EAAawC,SAAvB,OADF,MACgDxC,EAAagF,UADrD1I,OAKNkJ,EAAgB,SAAC,GAA0C,IAAxCnB,EAAuC,EAAvCA,cAAeoB,EAAwB,EAAxBA,kBAEtC,YAD2CpK,IAAlBgJ,EAEvBA,EAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAChB,sBAAKnI,UAAU,uDAAf,UACE,qBAAKA,UAAU,qBAAf,SACE,qBAAKA,UAAU,gBAAgB5B,IAAK,yBAA2B8O,EAAKoB,YAAajQ,IAAK6O,EAAKmB,aAE7F,sBAAKrO,UAAU,2CAAf,UACE,4BAAIkN,EAAKmB,WAET,wBAAQlQ,KAAK,SAASgC,QAAS,kBAAMmR,EAAkBnJ,IAAvD,yBAPuEA,MAc7E,cAAC,IAAMhB,SAAP,KAIJ,OACE,sBAAKnH,UAAU,iBAAf,UACG,cAACoR,EAAD,CAAclF,cAAeA,IAC9B,gCACE,wBAAOlM,UAAU,qCAAjB,wBAEE,uBACElB,GAAG,YACHkB,UAAU,GACV7B,KAAK,OACLkM,SAAUkG,EACVgB,OAAQzE,EAAkB5E,KAAI,SAACsJ,GAAD,OAAOA,EAAExE,UAAQyE,WAC/CxG,IAAKqF,EACLoB,UAAQ,OAGZ,qBAAK1R,UAAU,MAAf,SACE,cAACqR,EAAD,CAAenB,cAAeA,EAAeoB,kBAAmBJ,MAElE,cAAC,IAAD,UAA6C,IAAzBhB,EAAc9H,OAAe2D,EAASC,QAAUD,EAASE,mB,oBCjLxE0F,GAAS,GAITC,GACL,OADKA,GAEL,OAFKA,GAGH,SAGGC,GAAsB,uCAAG,WAAOC,GAAP,iBAAAnS,EAAA,0DAEhCgS,GAAOG,EAASC,eAFgB,yCAI3BJ,GAAOG,EAASC,gBAJW,gCAQXC,KAAMpV,IAjBL,8DAiBwBkV,GARd,UAQ5BrV,EAR4B,OAS1BkR,EAAS,CACbsE,QAAS,GACTC,OAAQN,MAINnV,EAAS0V,KAAK/J,OAAS,GAfK,iBAgB9BuF,EAAOsE,QAAUxV,EAAS0V,KAC1BxE,EAAOuE,OAASN,GAEhBD,GAAOG,EAASC,eAAiBpE,EAnBH,yCAsBbqE,KAAMpV,IA9BF,+DA8BsBkV,GAtBb,SAsB9BrV,EAtB8B,QAuBjB0V,KAAK/J,OAAS,IACzBuF,EAAOsE,QAAUxV,EAAS0V,KAC1BxE,EAAOuE,OAASN,GAChBD,GAAOG,EAASC,eAAiBpE,GA1BL,iCA8BzBA,GA9ByB,wCAgChCyE,IAAYC,eAAe,CAAE7F,UAAU,EAAD,GAAM8F,WAAY,CAAER,cAhC1B,+DAAH,sDCTtBS,GAAkB,uCAAG,WAAOf,EAAGgB,GAAV,6BAAA7S,EAAA,6DAAa8S,EAAb,+BAAoC,MAC9DC,EAAMC,UACV,2GAEEnB,EACA,QACAgB,EACA,+BACAC,EACA,mBAT4B,SAYnBT,KACVpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,+CAGnBpD,MAAK,SAACX,GACL,QAAiCqL,IAA7BrL,EAASiH,QAAQ8P,SAAsD,KAA7B/W,EAASiH,QAAQ8P,QAAgB,CAG7E,IAAMC,EAAWhX,EAASiH,QAAQ8P,QAAQ7W,MAAM,YAC1C+W,EAAOjX,EAASiH,QAAQ8P,QAAQ/V,QAAQgW,EAASE,QAEvD,OADqBlX,EAASiH,QAAQ8P,QAAQ7D,UAAU+D,GACpCE,OAEtB,OAAO,QAER5V,OAAM,SAAC6V,GAGN,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAY,CAAEd,IAAGgB,IAAGC,0BAC1DQ,KAnCsB,mFAAH,wDAwClBC,GAAgB,uCAAG,WAAO1B,EAAGgB,GAAV,6BAAA7S,EAAA,6DAAa8S,EAAb,+BAAoC,MAC5DC,EAAMC,UACV,yGACenB,EADf,YACoBgB,GADpB,gBAEWC,GAFX,iBAGYA,GACV,8EAN0B,SASjBT,KACVpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,4BAGnBpD,MAAK,SAAC2V,GACL,GAAIA,EAAKgB,SAAS/K,OAAS,EACzB,OAAO+J,EAAKgB,SAAS,GAAGC,WAAWC,QAGtCjW,OAAM,SAAC6V,GAUN,MATA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAWyG,EACXX,WAAY,CACVd,IACAgB,IACAC,0BAGEQ,KAjCoB,mFAAH,wDAqChBK,GAAuB,uCAAG,WAAO9B,EAAGgB,GAAV,6BAAA7S,EAAA,6DAAa8S,EAAb,+BAAoC,MACnEC,EAAMC,UACV,sHACoBnB,EADpB,gBAC6BgB,EAD7B,KAEE,kCAFF,gBAGWC,GAHX,+CAFmC,kBAW9BT,KACJpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,8BAGnBpD,MAAK,SAAC2V,GAAD,OAAWA,EAAKgB,SAAS/K,OAAS,EAAI+J,EAAKgB,SAAS,GAAGC,WAAWG,UAAOrM,KAC9E9J,OAAM,SAAC6V,GAUN,MATA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAWyG,EACXX,WAAY,CACVd,IACAgB,IACAC,0BAGEQ,MA/B2B,2CAAH,wDAmCvBO,GAAgB,uCAAG,WAAOC,GAAP,eAAA9T,EAAA,6DACxB+S,EAAMC,UACV,kHAGWc,GAHX,mbAF4B,SA8BjBzB,KACVpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,+CAGnBpD,MAAK,SAACkX,GAEL,YAA2BxM,IAAvBwM,EAAUP,SACL,KAELO,EAAUP,SAAS/K,OAAS,EACvBsL,EAAUP,SAAS,GAAGC,WAAWO,KAEnC,QAERvW,OAAM,SAAC6V,GAGN,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAY,CAAEmB,gBACpDR,KApDoB,mFAAH,sDAwDhBW,GAAgB,uCAAG,WAAOpC,EAAGgB,GAAV,eAAA7S,EAAA,6DACxB+S,EAAMC,UACV,+HAKEnB,EACA,IACAgB,EAPF,yZAF4B,SA+BjBR,KACVpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,6CAGnBpD,MAAK,SAACkX,GAEL,OAAIA,EAAUP,SAAS/K,OAAS,EACvBsL,EAAUP,SAAS,GAAGC,WAAWG,KAAKxU,QAAQ,QAAS,IAAIiU,OAE7D,MAER5V,OAAM,SAAC6V,GAGN,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAY,CAAEd,IAAGgB,OACvDS,KAlDoB,mFAAH,wDAsDhBY,GAAyB,uCAAG,WAAOrC,EAAGgB,GAAV,iBAAA7S,EAAA,6DACjC+S,EAAMC,UACV,iJACenB,EADf,YACoBgB,GAClB,WAJmC,SAOlBR,KAClBpV,IAAI8V,GACJlW,MAAK,SAACC,GACL,GAAwB,MAApBA,EAASC,OACX,OAAOD,EAAS0V,KAEhB,MAAM,IAAIvS,MAAM,iDAGnBpD,MAAK,SAAC2V,GACL,QAAajL,IAATiL,QAAuCjL,IAAjBiL,EAAKrP,cAAwDoE,IAA/BiL,EAAKrP,QAAQgR,cAIrE,OAAO3B,EAAKrP,QAAQgR,iBAErB1W,OAAM,SAAC6V,GASN,MARA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAWyG,EACXX,WAAY,CACVd,IACAgB,OAGES,KAhC6B,cAOjCtF,EAPiC,yBAmChCA,GAnCgC,2CAAH,wD,qGCrEvBoG,GA7IgB,SAAC,GAOzB,IAAD,gBANJ/T,EAMI,EANJA,UACAgU,EAKI,EALJA,gBACAC,EAII,EAJJA,gBACAC,EAGI,EAHJA,iBACAC,EAEI,EAFJA,kBACG1M,EACC,mBACJ,EAAgClB,mBAASkB,EAAMqK,UAAY,IAA3D,mBAAOA,EAAP,KAAiBsC,EAAjB,KACA,EAAkC7N,mBAASkB,EAAM4M,UAAY,CAAC5M,EAAM4M,WAAa,IAAjF,mBAAOA,EAAP,KAAkBC,EAAlB,KACA,EAAwB/N,mBAASkB,EAAM8M,MAAQ,IAA/C,mBAAOA,EAAP,KAAaC,EAAb,KACA,EAA8BjO,oBAAS,GAAvC,mBAAOkO,EAAP,KAAgBC,EAAhB,KAEM3J,EAAUtC,mBAAQ,uBAAqBvB,IAAdlH,EAA0B,qBAA1B,6BAAuEA,KAAc,CAClHA,IAgBI2U,EAAqB,WACrBN,EAAUjM,OAAS,IACrBoM,EAAQ,IACRF,EAAa,IAEbN,GAAmBA,EAAgB,MAIjCY,EAAoB,WACxBD,IACA,IAAME,EAAkB/C,EAASkB,OAET,KAApB6B,EACFV,GAAqBA,EAAkB,aACO,IAArCW,GAAgBD,GACzBV,GAAqBA,EAAkB,YAEvCO,GAAW,GACXN,EAAYS,GAEZhD,GAAuBgD,GACpBrY,MAAK,SAAC2V,GACLuC,GAAW,GACXJ,EAAanC,EAAKF,SAElBgC,GAAmBA,EAAgB9B,MAEpC/U,OAAM,kBAAMsX,GAAW,QAIxBK,EAAwB,uCAAG,WAAOlL,GAAP,iBAAAlK,EAAA,8DAGfuH,KAFVpE,EAAUuR,EAAUvB,MAAK,SAACtB,GAAD,OAAOA,EAAE+C,KAAK9C,aAAe5H,EAAE2G,OAAO7F,UADtC,oBAIzBqK,GAAY,EAEK,OAAjBlS,EAAQmS,KANiB,gCAORrB,GAAiB9Q,EAAQoS,QAASpS,EAAQqS,UAPlC,OASd,KATc,SAUzBH,GAAY,GAVa,OAc7BR,EAAQ1R,EAAQyR,MAEhBP,GAAmBA,EAAgBlR,EAASkS,GAhBf,4CAAH,sDAoB9B,OACE,sBAAKhV,UAAW+K,EAAhB,UACE,cAAC,GAAD,CAA4BzC,KAAK,WAAWxJ,GAAG,WAAWyL,QAAS9C,EAAM8C,QAASC,OAAQ/C,EAAM+C,SAChG,cAAC,IAAD,CACErM,KAAK,OACLW,GAAG,WACH6L,MAAOmH,EACPzH,SAxEuB,SAACR,GAC5BqK,GAAoBA,EAAiBrK,EAAE2G,OAAO7F,OAC9CyJ,EAAYvK,EAAE2G,OAAO7F,OACrBgK,KAsEIS,WAnEyB,SAACvL,GAChB,UAAVA,EAAEwL,MACJT,IACA/K,EAAEyL,mBAiEAxX,OAAO,UAAA2J,EAAM+C,cAAN,eAAcsH,YAAd,UAA0BrK,EAAM8C,eAAhC,aAA0B,EAAeuH,aAEjD,UAAArK,EAAM+C,cAAN,eAAcsH,YAAwC,KAA5B,UAAArK,EAAM8C,eAAN,eAAeuH,WACxC,cAAC,IAAD,oBAAsBrK,EAAM+C,cAA5B,aAAsB,EAAcsH,WAEtC,cAAC,IAAD,CACEhT,GAAG,gBACHX,KAAK,SACL6B,UAAWC,IAAcC,UACzBC,QAASyU,EACTW,SAAUd,EALZ,0BASCA,IACc,IAAZA,GAAqBJ,EAAUjM,OAAS,GACvC,eAAC,IAAMjB,SAAP,WACE,cAAC,GAAD,CAA4BmB,KAAK,UAAUxJ,GAAG,UAAUyL,QAAS9C,EAAM8C,QAASC,OAAQ/C,EAAM+C,SAC9F,uBACA,cAAC,IAAD,CACE+K,SAAUd,EACV3V,GAAG,UACHuL,SAAU0K,EACVpK,MAAO4J,EACPiB,aAAcf,EAAU,aAAe,gBACvC7J,QAASyJ,EAAUnM,KAAI,SAACpF,GAAD,MAAc,CACnCwF,KAAMxF,EAAQ2S,aACd9K,MAAO7H,EAAQyR,YAGlB,UAAA9M,EAAM+C,cAAN,eAAc1H,WAAsC,KAA3B,UAAA2E,EAAM8C,eAAN,eAAezH,UACvC,cAAC,IAAD,oBAAsB2E,EAAM+C,cAA5B,aAAsB,EAAc1H,iB,4BC1IrC4S,GAAU,4BAIVC,GAAuB,CAClCC,OAAQ,oDACRC,UAAW,uDACXC,OAAQ,qDAGGC,GAAuB,CAClCH,OAAQ,kBACRC,UAAW,YACXC,OAAQ,gBAGGE,GAAc,CACzBC,IAAK,SACLC,IAAK,UACLC,IAAK,YACLC,IAAK,WACLC,IAAK,SACLC,IAAK,WACLC,IAAK,UClBMC,GAA6B,uCAAG,WAAOjC,GAAP,eAAA5U,EAAA,sEACtBqS,KAAMpV,IAAN,UAAa6Z,uBAAqBC,MAAM/S,eAAegT,kBAAvD,YAA4EpC,IADtD,YACrC5G,EADqC,QAEhCiJ,WAAYjJ,EAAOiJ,SAASxO,OAFI,yCAGlC,IAHkC,gCAMpCuF,EAAOwE,KAAKyE,SAAS1O,KAAI,SAAC2O,GAC/BA,EAAQC,cAAgBD,EAAQC,cAAgBC,KAAOF,EAAQC,oBAAiB5P,EAChF2P,EAAQG,eAAiBH,EAAQG,eAAiBD,KAAOF,EAAQG,qBAAkB9P,EAEnF2P,EAAQI,eAAiBJ,EAAQI,eAAeC,cAAcnY,QAAQ,eAAgB,aAItF,IAAMoY,EAAkC,KAAtBN,EAAQM,UAAmBN,EAAQM,UAAUvI,MAAM,KAAO,GAC5E,GAAIuI,EAAU/O,OAAS,EAAG,CACxB,IAAMgP,EAAMpB,GAAYmB,EAAU,GAAGD,eACjCE,IACFP,EAAQM,UAAYN,EAAQM,UAAUpY,QAAQoY,EAAU,GAAIC,IAGhE,GAAyB,IAArBD,EAAU/O,OAAc,CAC1B,IAAMgP,EAAMpB,GAAYmB,EAAU,GAAGD,eACjCE,IACFP,EAAQM,UAAYN,EAAQM,UAAUpY,QAAQoY,EAAU,GAAIC,IAIhE,OAAOP,MA5BkC,2CAAH,sDAgC7BQ,GAA0B,uCAAG,WAAO9C,GAAP,iBAAA5U,EAAA,sEACjBqS,KAAMpV,IAAN,UAAa6Z,uBAAqBC,MAAM/S,eAAe2T,eAAvD,YAAyE/C,IADxD,cAClC9X,EADkC,QAGlC8a,EAAc9a,EAAS0V,KAAKoF,YAAYrP,KAAI,SAACsJ,GAAD,oBAAC,gBAAYA,GAAb,IAAgBgG,KAAMT,KAAOvF,EAAEgG,YACrEC,MAAK,SAAC9X,EAAG+X,GAAJ,OAAUA,EAAEF,KAAO7X,EAAE6X,QAJE,kBAKjCD,GALiC,2CAAH,sDAQ1BI,GAAiC,uCAAG,WAAOpD,GAAP,eAAA5U,EAAA,sEACxBqS,KAAMpV,IAAN,UAAa6Z,uBAAqBC,MAAM/S,eAAeiU,eAAvD,YAAyErD,IADjD,cACzC9X,EADyC,yBAGxCA,EAAS0V,MAH+B,2CAAH,sDASjC0F,GAAU,SAACC,EAAMC,GAC5B,IAAM7P,EAAM,IAAI8P,IAUhB,OATAF,EAAK9H,SAAQ,SAAC/B,GACZ,IAAMoH,EAAM0C,EAAU9J,GAChBgK,EAAa/P,EAAItL,IAAIyY,GACtB4C,EAGHA,EAAW1J,KAAKN,GAFhB/F,EAAIgQ,IAAI7C,EAAK,CAACpH,OAKX/F,G,kBC8BMiQ,GAzFgB,SAAC,GAA8B,IAA5BF,EAA2B,EAA3BA,WAAexQ,EAAY,mBACrD2Q,EAAkBC,GAA+BJ,EAAWpB,SAG5DyB,EAAc7P,mBAAQ,WAC1B,OAAQwP,EAAWM,cACjB,KAAK,EACL,KAAK,EACH,MAAO,GACT,KAAK,EACH,MAAO,WACT,QACE,MAAO,cAEV,CAACN,EAAWM,eAEf,OACE,qBAAKvY,UAAS,oBAAesY,GAA7B,SACE,gDAAKtY,UAAS,oDAA+CoY,IAAuB3Q,GAApF,cACG,sBAAKzH,UAAU,oDAAf,UACC,+BAAKqY,GAA+BJ,EAAWpB,SAA/C,iBACCoB,EAAWjB,iBACRiB,EAAWjB,eAAewB,OAAOP,EAAWnB,eAC5C,iEACG,kEAAqCmB,EAAWjB,eAAeyB,OAAO,2BAG/E,qBAAKzY,UAAU,kDAAf,SACE,+BACE,4CACA,6BAAKiY,EAAWS,YAEhB,kDACA,6BAAKT,EAAWhB,iBAEhB,qDACA,6BACGgB,EAAWnB,cAAgBmB,EAAWnB,cAAc2B,OAAO,oBAAsB,sBAGpF,iDACD,6BACIR,EAAWjB,eACRiB,EAAWnB,eAAiBmB,EAAWjB,eAAewB,OAAOP,EAAWnB,eACxE,kCACAmB,EAAWjB,eAAeyB,OAAO,oBACjC,sBAEoB,KAAzBR,EAAWd,WACV,qCACE,sDACA,6BAAKc,EAAWd,eAGnBc,EAAWU,oBACV,qCACE,sDACA,6BAAKV,EAAWU,wBAGQ,gBAA3BV,EAAWW,aACV,qCACE,oDACA,6BACE,mBAAGxY,KAAK,mEAAmEoQ,OAAO,SAAlF,0DCaHqI,I,OArEiB,SAAC,GAA2B,IAAzBtE,EAAwB,EAAxBA,KAAMuE,EAAkB,EAAlBA,YACvC,EAA4CvS,mBAAS,IAArD,mBAAO5C,EAAP,KAAuBoV,EAAvB,KACA,EAAgCxS,mBAAS,WAAzC,mBAAOyS,EAAP,KAAiBC,EAAjB,KACA,EAAsC1S,qBAAtC,mBAAO2S,EAAP,KAAoBC,EAApB,KAmBA,OAhBAxS,qBAAU,WACR,IAAMyS,EAAO,uCAAG,8BAAAzZ,EAAA,6DACdsZ,EAAY,WADE,kBAGSzC,GAA8BjC,GAHvC,cAGN5G,EAHM,gBAIWgK,GAAkCpD,GAJ7C,OAIN1Y,EAJM,OAKZkd,EAAkBpL,GAClBwL,EAAetd,GACfod,EAAY,UAPA,kDASZA,EAAY,SATA,0DAAH,qDAYbG,MACC,CAAC7E,IAGF,qCACgB,YAAbyE,GACC,qBAAKhZ,UAAU,iDAAf,SACE,gEAIU,WAAbgZ,GAAmD,IAA1BrV,EAAeyE,QACvC,sBAAKpI,UAAU,iCAAf,UACE,kDACA,+FAIU,WAAbgZ,GAAyBrV,EAAeyE,OAAS,GAChD,6CACY,cAAC,IAAD,CAAMN,GAAE,UAAKgR,EAAL,YAAoBvE,GAA5B,0CADZ,yBAGE,qBAAKvU,UAAU,uCAAf,SACG2D,EAAeuE,KAAI,SAAC+P,EAAY5C,GAE/B,IAAMgE,EAAe,6BAChBpB,GADgB,IAEnBM,aAAc5U,EAAeyE,SAS/B,MAzDoB,WAmDlB6P,EAAWpB,SACXqC,IACCA,EAAYI,qBAAuBJ,EAAYK,cAEhDF,EAAgBV,mBAAqBO,EAAYM,oBAE5C,cAAC,GAAD,CAAkCvB,WAAYoB,GAAjBhE,gB,UCZnCoE,I,OAjDe,SAAC,GAAD,IAAGC,EAAH,EAAGA,UAAWC,EAAd,EAAcA,UAAWC,EAAzB,EAAyBA,WAAYC,EAArC,EAAqCA,QAArC,OAC5B,cAAC,IAAD,CACEld,QAAS,CAAC+c,EAAWC,EAAWC,GAChCzH,KAAM0H,EAAQ3R,KAAI,SAACiK,EAAMkD,GAAP,MAAgB,CAChCyE,KAAM3H,EAAK4H,UACXC,KAAM7H,EAAK8H,UACXC,UACgBhT,IAAdiL,EAAKgI,KACH,cAAC,IAAD,CAEErS,GAAIqK,EAAKgI,KACTha,QAASgS,EAAKiI,gBACdpc,MAAK,kBAAamU,EAAK4H,UAAlB,KACL,wBAAgB5H,EAAK4H,UAArB,aALF,SAME,cAAC,KAAD,CAAW/Z,UAAU,eALhBqV,GAQPlD,EAAKiI,iBACH,cAAC,KAAD,CAEEpc,MAAK,kBAAamU,EAAK4H,UAAlB,KACL5Z,QAASgS,EAAKiI,gBACdpa,UAAU,YACV,wBAAgBmS,EAAK4H,UAArB,cAJK1E,OASfrV,UAAWqa,IAAaC,QAAU,qBC/BhCC,GAAU,SAsCDC,GApCY,WACzB,IAAMhb,EAAWkH,cACjB,EAA4BH,oBAAS,GAArC,mBAAOrJ,EAAP,KAAeud,EAAf,KACA9T,qBAAU,WACJzJ,GACFtB,OAAOC,SAASqB,WAEjB,CAACA,IACJ,IAAMwd,EAAsB,SAAClK,GAEzBhR,EADEgR,IAAW+J,IACH,EAED3Z,EAAmBG,WAE9B0Z,GAAU,IAGZ,OACE,eAAC,EAAD,CAAwBzc,MAAM,wCAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,0CAC1B,eAAC,GAAD,WACE,2KAIA,cAAC,IAAD,CAAiBnI,QAAS,kBAAMua,EAAoBH,KAAUva,UAAWC,IAAc0a,QAAU,cAAjG,oBAGA,cAAC,IAAD,CAAiBxa,QAAS,kBAAMua,KAAuB1a,UAAWC,IAAc0a,QAAU,eAA1F,oCCrBOC,GAXa,WAC1B,OACE,eAAC,EAAD,CAAwB5c,MAAM,yBAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,aAAaC,KAAK,iBAC5C,cAAC,GAAD,UACE,sDCqBOsS,GAzBoB,SAAC,GAO7B,IANLtQ,EAMI,EANJA,QACAC,EAKI,EALJA,OACA1L,EAII,EAJJA,GACAwJ,EAGI,EAHJA,KAGI,IAFJwS,qBAEI,aADJrQ,mBACI,MADU,EACV,EACEgB,EAAWlB,EAAQzL,IAAO0L,EAAO1L,IAAO2L,EAAc,EAC5D,OACE,cAAC,IAAD,CAAqBsQ,QAASjc,EAAIhB,MAAO2N,EAAUuP,SAAUF,EAA7D,SACGxS,KCVD2S,GAAkC,SAAC,GAMlC,IALLC,EAKI,EALJA,kBACAC,EAII,EAJJA,0BACA5Q,EAGI,EAHJA,QACAC,EAEI,EAFJA,OACAC,EACI,EADJA,YAEA,OACE,cAAC,IAAMtD,SAAP,UACE,qBAAKnH,UAAU,MAAf,SACE,uBAAMlB,GAAG,sBAAT,UACE,cAAC,GAAD,CACE0L,OAAQA,EACR1L,GAAG,oBACH2L,YAAaA,EACbnC,KAAK,6BACLiC,QAASA,IAEX,cAAC,IAAD,CACExH,KAAK,oBACLjF,MAAO0M,EAAO0Q,mBAAqB3Q,EAAQ2Q,kBAC3CvQ,MAAOuQ,EACPtQ,QAAS,CACP,CACEC,MAAO,MACPF,OAAO,GAET,CACEE,MAAO,KACPF,OAAO,IAGXN,SAAU,SAACR,GAAD,OAAOsR,EAA0BtR,MAE5CW,EAAO0Q,mBAAqB3Q,EAAQ2Q,mBACnC,cAAC,IAAD,UAAsB1Q,EAAO0Q,4BAQzCD,GAAgCG,SAAW,CACzCF,kBAAmBrS,IAAUwS,KAC7BF,0BAA2BtS,IAAUyS,KACrC/Q,QAAS1B,IAAU0S,OAAOxS,WAC1ByB,OAAQ3B,IAAU0S,OAAOC,WACzB/Q,YAAa5B,IAAU4S,OAAO1S,YAGjBkS,UCtBAS,GA7ByB,SAACjU,GACvC,MAA4BlB,oBAAS,GAArC,mBAAOrJ,EAAP,KAAeud,EAAf,KACA9T,qBAAU,WACJzJ,GACFtB,OAAOC,SAASqB,WAEjB,CAACA,IAOJ,OACE,eAAC,EAAD,CAAwBc,MAAM,oCAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,sCAC1B,eAAC,GAAD,WACE,4JAIA,cAAC,IAAD,CAAiBnI,QAAS,kBAZ9BsH,EAAMkU,QAAQpN,KAAK3N,EAAmBG,gBACtC0Z,GAAU,IAWiDza,UAAWC,IAAc0a,QAAU,eAA1F,oC,6CCeOiB,GAlCW,SAAC,GAKpB,IAJLtV,EAII,EAJJA,SAII,IAHJuV,kBAGI,aAFJvT,YAEI,MAFG,kDAEH,EADDb,EACC,mBAOJ,OACE,gDAAKzH,UAAU,wBAA2ByH,GAA1C,IAAiD,cAAY,sBAA7D,UACE,sBAAKzH,UAAU,6BAAf,UACE,oBAAIA,UAAU,mBAAd,SAAkCsI,IAClC,qBAAKtI,UAAU,wCAAf,SACG6b,GACC,cAAC,IAAD,CAAiB/c,GAAG,YAAYX,KAAK,SAASgC,QAZpC,WAClB,IAAM2b,EAAW7c,SAAS8c,uBAAuB,aAC7CD,EAAS1T,OAAS,GACpB0T,EAAS,GAAG3c,kBASN,sCAMN,qBAAKa,UAAU,6BAAf,SAA6CsG,S,oCC3B7C0V,G,+MACJpe,MAAQ,CACNqe,eAAe,EACfC,mBAAehV,G,EAGjBiV,kBAAoB,WAClB,EAAKC,SAAS,CACZH,cAAe,EAAKxU,MAAMwU,cAC1BC,cAAe,EAAKzU,MAAMyU,iB,EAa9BG,OAAS,kBACsB,IAA7B,EAAKze,MAAMqe,mBACoB/U,IAA7B,EAAKO,MAAMyU,cACT,qBAAKlc,UAAU,+CAAf,SACGoL,KAGH,qBAAKpL,UAAU,+CAAf,SACG,EAAKyH,MAAMyU,gBAIhB,cAAC,IAAM/U,SAAP,K,yDArBJ,WAEMmV,KAAK7U,MAAMwU,gBAAkBK,KAAK1e,MAAMqe,eAC1CK,KAAKF,SAAS,CACZH,cAAeK,KAAK7U,MAAMwU,oB,GAjBOM,IAAMC,WAsChCR,MC1CA,I,OAAA,IAA0B,uCCA1B,OAA0B,2CCA1B,I,OAAA,IAA0B,8C,sDCwC1BS,GA1BS,SAAC,GAAsD,IAApDnW,EAAmD,EAAnDA,SAAUoW,EAAyC,EAAzCA,KAAMC,EAAmC,EAAnCA,QAAS3c,EAA0B,EAA1BA,UAAcyH,EAAY,mBACtEsD,EAAUtC,mBAAQ,WACtB,IAAImU,EAAC,6CAAyCF,EAAO,OAAS,UAI9D,OAHI1c,IACF4c,GAAC,WAAQ5c,IAEJ4c,EAAE5J,SACR,CAAChT,EAAW0c,IAMf,OACE,gDAAK1c,UAAW+K,GAAatD,GAA7B,cACE,qBAAKzH,UAAY,6BAAjB,SACE,eAAC,IAAD,CAAiBhC,MAAM,aAAamC,QAPjB,SAAC0J,GACxBA,EAAEyL,iBACFqH,GAAWA,KAKwD3c,UAAU,0BAAzE,mBACQ,sBAAMA,UAAU,qBAG1B,qBAAKA,UAAU,4BAAf,SAA4CsG,IAC5C,qBAAKtG,UAAU,kCCYN6c,GAvCI,SAAC,GAAiC,IAA/BH,EAA8B,EAA9BA,KAAMC,EAAwB,EAAxBA,QAASG,EAAe,EAAfA,SACnC,EAAoCvW,mBAAS,IAA7C,mBAAOwW,EAAP,KAAmBC,EAAnB,KAUA,OACE,mCACE,eAAC,GAAD,CAAiBN,KAAMA,EAAMC,QAASA,EAAS3c,UAAU,cAAzD,UACE,sDACA,uBAAMid,YAAU,EAACC,SAZF,SAACrT,GACpBA,EAAEyL,iBACEyH,EAAW3U,OAAS,IACtB0U,GAAYA,EAASC,GACrBnhB,OAAOC,SAAWiI,EAAqCqZ,mBAAmBJ,KAQxE,UACE,uBAAOhC,QAAQ,eACf,cAAC,IAAD,CACEjc,GAAG,aACHX,KAAK,SACLif,YAAY,SACZ/S,SAAU,SAACR,GAAD,OAAOmT,EAAcnT,EAAE2G,OAAO7F,QACxCA,MAAOoS,IAET,cAAC,IAAD,CAAiB5e,KAAK,SAAS6B,UAAWC,IAAcC,UAAY,iBAApE,SACE,qBAAK9B,IAAKif,GAAiBhf,IAAI,sBCwF5Bif,GA1GI,SAAC,GAAkB,IAAhBC,EAAe,EAAfA,SACpB,EAAoChX,oBAAS,GAA7C,mBAAOiX,EAAP,KAAmBC,EAAnB,KACA,EAA4ClX,oBAAS,GAArD,mBAAOmX,EAAP,KAAuBC,EAAvB,KAEMC,EAAcC,qBAAWC,IAEzBC,EAAe,WACnBH,EAAYI,SAAS,iBAAa9W,GAClC0W,EAAYI,SAAS,gBAAY9W,GACjCyW,GAAkB,GAClBJ,GAAYA,KAGd,OACE,qCACE,qBAAKvd,UAAU,mBAAf,SACE,sBAAKA,UAAU,8BAAf,UACE,mBACEI,KAAM0D,EACN9D,UAAU,uFAFZ,SAGE,qBAAK5B,IAAK6f,GAAa5f,IAAI,gCAE7B,qBAAI2B,UAAU,qCAAd,UACG6G,cAAYC,QAAQN,kBACnB,qCACE,6BACE,eAAC,IAAD,CAAMsB,GAAIlH,EAAmBG,UAAWf,UAAU,kDAAlD,UACE,cAAC,KAAD,CAAQA,UAAU,cACjB4d,EAAYlH,MAAMwH,UAAY,IAAMN,EAAYlH,MAAMyH,cAG3D,6BACE,wBAAQhe,QAAS4d,EAAc/d,UAAU,kDAAzC,2BAMJ,6BACE,mBAAGI,KAAMQ,EAAmBG,UAAWf,UAAU,kDAAjD,0BAKJ,oBAAIA,UAAU,mBAAd,SACE,yBACEA,UAAU,wFACVG,QAAS,kBAAMsd,GAAeD,IAFhC,UAGE,sBAAMxd,UAAU,8BAAhB,oBACA,sBAAMA,UAAWwd,EAAa,sBAAwB,mBACtD,sBAAMxd,UAAWwd,EAAa,6BAA+B,+BAGjE,+BACE,cAAC,IAAD,CACExd,UAAS,UAAKC,IAAc0a,QAAnB,4CACTxc,KAAK,SACLgC,QAAS,kBAAOvE,OAAOC,SAAWiI,GAHpC,8BAMA,cAAC,IAAD,CACE9D,UAAS,UAAKC,IAAc0a,QAAnB,4CACTxc,KAAK,SACLH,MAAM,YACNmC,QAAS,kBAAMwd,GAAkB,IAJnC,SAKE,qBAAKtf,IAAI,YAAYD,IAAKggB,UAG9B,oBAAIpe,UAAU,oCAIpB,cAAC,GAAD,CAAiB2c,QAAS,kBAAMgB,GAAkB,IAAQjB,KAAMgB,EAAhE,SACE,+BACE,6BACE,mBAAGtd,KAAM0D,EAAT,gCAED+C,cAAYC,QAAQN,kBACnB,qCACE,6BACE,cAAC,IAAD,CAAMsB,GAAIlH,EAAmBG,UAAWZ,QAAS,kBAAMwd,GAAkB,IAAzE,SACGC,EAAYlH,MAAMwH,UAAY,IAAMN,EAAYlH,MAAMyH,aAG3D,6BACE,sBAAMhe,QAAS4d,EAAf,2BAIJ,6BACE,cAAC,IAAD,CAAMjW,GAAIlH,EAAmBG,UAAWZ,QAAS,kBAAMwd,GAAkB,IAAzE,+BAOP,cAAC,GAAD,CAAYjB,KAAMc,EAAYb,QAAS,kBAAMc,GAAc,UC5DnDY,G,oDA3Cb,WAAY5W,GAAQ,IAAD,+BACjB,cAAMA,IAQR6W,kBAAoB,SAACrL,EAAIsL,GACvBtL,EAAGuL,MAAQD,EACPnM,IAAYqM,aACdrM,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,sBAAuB0S,WAAY,CAAEW,SAVzF,EAAKrV,MAAQ,CAAE6N,UAAU,GAFR,E,2CAgBnB,WACE,OAAI6Q,KAAK1e,MAAM6N,SAGX,qCACE,wBAAQ3M,GAAG,UAAX,SACE,cAAC,GAAD,CAAiBye,SAAU,iBAE7B,sBAAMvd,UAAU,WAAhB,SACE,cAAC,GAAD,gBAAwBsc,KAAK7U,UAE/B,iCACE,cAAC,EAAD,SAMD6U,KAAK7U,MAAMnB,Y,uCA7BpB,SAAgCxI,GAE9B,MAAO,CAAE2N,UAAU,O,GARc+Q,aCqBtBkC,GAtBe,SAAC,GAAkF,IAAhFC,EAA+E,EAA/EA,YAAaC,EAAkE,EAAlEA,cAAeC,EAAmD,EAAnDA,aAAcC,EAAqC,EAArCA,WAAYxY,EAAyB,EAAzBA,SAAUzK,EAAe,EAAfA,SAC/F,OACE,sCACmB,IAAhB8iB,IAA2C,IAAlBC,GAA2B,cAAC,IAAD,CAAU9W,GAAI+W,KAElD,IAAhBF,IAA0C,IAAlBC,GAA2B,cAAC,IAAMzX,SAAP,UAAiBb,KAElD,IAAlBsY,GAA0B/iB,EAASkjB,WAAaD,GAAc,cAAC,IAAD,CAAUhX,GAAIgX,KAE1D,IAAlBF,GAA0B/iB,EAASkjB,WAAaD,GAAc,cAAC,IAAM3X,SAAP,UAAiBb,QC2BvE0Y,GAjCW,kBACxB,mCACE,eAAC,EAAD,CAAwBhhB,MAAM,kCAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,uBAC1B,eAAC,GAAD,WACE,0KAIA,0DACA,+BACE,6CACa,cAAC,IAAD,CAAMR,GAAIlH,EAAmBsC,KAA7B,2BAEb,4CACY,mBAAG9C,KAAM0D,EAAT,6BAGd,wDACA,+BACE,+BACE,mBAAG1D,KAAM0D,EAAT,kDADF,0BAGA,+BACE,mBAAG1D,KAAM0D,EAAT,mDADF,2CCRKmb,GAtBkB,SAAC,GAAuB,IAArBC,EAAoB,EAApBA,cAClC,OACE,eAAC,IAAM/X,SAAP,WACE,qBAAKnH,UAAU,MAAf,SACE,sCACQ,IACN,wBAAQA,UAAU,iBAAiBG,QAAS+e,EAA5C,wBAEU,IAJZ,yEASF,qBAAKlf,UAAU,MAAf,SACE,cAAC,IAAD,CAAiBA,UAAWC,IAAc0a,QAASxa,QAAS+e,EAA5D,oCCYOC,GAzBqB,SAAC,GAA4C,IAA1CC,EAAyC,EAAzCA,gBAAiBC,EAAwB,EAAxBA,kBACtD,OACE,eAAC,IAAMlY,SAAP,WACE,qBAAKnH,UAAU,MAAf,SACE,8BACE,wBAAQA,UAAU,iBAAiBG,QAASkf,EAA5C,sBAEU,IAHZ,6GAQF,qBAAKrf,UAAU,MAAf,SACE,cAAC,IAAD,CAAiBA,UAAWC,IAAc0a,QAASxa,QAASif,EAA5D,2BCfOE,G,OAAf,ECyMeC,I,OAjMa,SAAC,GAUtB,IATLC,EASI,EATJA,eACsBC,EAQlB,EARJC,qBACAC,EAOI,EAPJA,sBACAC,EAMI,EANJA,iBACAC,EAKI,EALJA,cACAC,EAII,EAJJA,kBACAC,EAGI,EAHJA,gCACAC,EAEI,EAFJA,aACAC,EACI,EADJA,2BAGMC,GADyBlV,GAAYwU,GACNxU,GAAYyU,IACjD,EAAwDlZ,qBAAxD,mBAAOmZ,EAAP,KAA6BS,EAA7B,KACA,EAAwC5Z,qBAAxC,mBAAO6Z,EAAP,KAAqBC,EAArB,KACA,EAAgC9Z,mBAAS,CACvC6Z,kBAAclZ,EACdgO,QAAS,KACTC,SAAU,KACVmL,OAAQ,KACR3M,KAAM,KACNsB,KAAM,KACNsL,OAAQ,OAPV,mBAAO1kB,EAAP,KAAiB2kB,EAAjB,KAUMC,EAAsB,CAC1BC,cAAe,CACb1iB,MAAO,iBACP2iB,gBAAgB,WAAD,4BAAE,+BAAAhhB,EAAA,6DAASihB,EAAT,EAASA,SAAT,SAEYC,EAA8BD,GAF1C,cAETE,EAFS,sKAMOA,EAAaR,OANpB,0IAUOQ,EAAanN,KAVpB,0GAAF,mDAAC,IAelBqM,aAAa,WAAD,4BAAE,WAAOY,GAAP,eAAAjhB,EAAA,sEACWkhB,EAA8BD,GADzC,OACN/kB,EADM,OAEZmkB,GAAgBA,EAAankB,GAFjB,2CAAF,mDAAC,IAYf8K,qBAAU,gBAGeO,IAAnBsY,IACFgB,EAAY,6BACP3kB,GADM,IAETqZ,QAASsK,EAAetK,QACxBC,SAAUqK,EAAerK,SACzBmL,OAAQd,EAAe/L,WACvBE,KAAM6L,EAAe7L,KAAO6L,EAAe7L,KAAKlC,WAAa,KAC7DwD,KAAMuK,EAAevK,KACrBsL,OAAQf,EAAee,UAGzBF,EAAgB,CACdnL,QAASsK,EAAetK,QACxBC,SAAUqK,EAAerK,SACzBxE,OAAQ6O,EAAe7O,YAG1B,CAAC6O,IAEJ7Y,qBAAU,WAKR,QACoCO,IAAjCgZ,QAA4EhZ,IAA9BuY,QACbvY,IAAjCgZ,QAA4EhZ,IAA9BuY,EAE/CU,EAAwBV,QAI1B,QAAqCvY,IAAjCgZ,QAA4EhZ,IAA9BuY,EAAyC,CAEzF,GAAIS,EAA6B9X,SAAWqX,EAA0BrX,OAEpE,YADA+X,EAAwBV,GAI1B,IAAIsB,GAAmC,EACvCb,EAA6BlQ,SAAQ,SAACgR,EAAQ7Y,GACxC6Y,EAAOC,UAAYxB,EAA0BtX,GAAO8Y,UACtDF,GAAmC,OAGE,IAArCA,GACFZ,EAAwBV,MAG3B,CAACA,IAEJ,IAAMoB,EAA6B,uCAAG,WAAOD,GAAP,yCAAAjhB,EAAA,6DAC9BuhB,EAAgBC,GAAuCP,EAASpP,EAAGoP,EAASpO,GAC5E4O,EAAcD,GAAqCP,EAASpP,EAAGoP,EAASpO,GACxE6O,EAAcF,GAAqCP,EAASpP,EAAGoP,EAASpO,GACxE8O,EAAkBH,GAA8CP,EAASpP,EAAGoP,EAASpO,GACrF+O,EAAgBJ,GAA4CP,EAASpP,EAAGoP,EAASpO,GALnD,SAOiBrF,QAAQqB,IAAI,CAC/D0S,EACAE,EACAC,EACAC,EACAC,IAZkC,0CAO7BjB,EAP6B,KAOrBkB,EAPqB,KAOfvM,EAPe,KAOTnD,EAPS,KAOCyO,EAPD,eAejBY,GAAqCb,GAfpB,eAe9B3M,EAf8B,OAiB9B8N,EAjB8B,6BAkB/B5lB,GAlB+B,IAmBlCqZ,QAAS0L,EAASpP,EAClB2D,SAAUyL,EAASpO,EACnB8N,SACA3M,OACAsB,OACAuM,OACA1P,WACAyO,WAGFC,EAAYiB,GA7BwB,kBA+B7BA,GA/B6B,4CAAH,sDAuCnC,OACE,qBAAKzhB,UAAU,gBAAf,SACE,cAAC,GAAD,CACE4f,iBAAkBA,GAAsC,aACxDC,cAAeA,QAAgC3Y,EAC/CwY,qBAAsBA,EACtBe,oBAAqBX,OAAoB5Y,EAAYuZ,EACrDL,aAAcA,EACdT,sBAAuBA,EACvB+B,oBA5G4B,CAChC1jB,MAAO,cACPkQ,QACE,qKA0GEyT,iBAAiB,EACjBC,YAhBqB,SAAC3O,GAC1Bb,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,sBAAuB0S,WAAYW,IACrF5V,QAAQS,MAAMmV,IAeV8M,gCAAiCA,EACjCE,2BAA4BA,QCrIrB4B,I,OAhCe,SAAC,GAAD,IAC5BC,EAD4B,EAC5BA,cACAC,EAF4B,EAE5BA,eACA/a,EAH4B,EAG5BA,WACAC,EAJ4B,EAI5BA,YACA+a,EAL4B,EAK5BA,mBACAra,EAN4B,EAM5BA,YACArB,EAP4B,EAO5BA,SAP4B,OAS5B,cAAC,EAAD,CAAwBtI,MAAO8jB,EAA/B,SACE,sBAAK9hB,UAAU,MAAf,UACE,cAAC,EAAD,CAAqBsI,KAAMyZ,EAAgBpa,YAAaA,IACxD,eAAC,GAAD,YAC4B,IAAzBqa,IACC,cAAC,EAAD,CAAsBhb,WAAYA,EAAYC,YAAaA,IAE3D,cAAC,IAAME,SAAP,IAEF,8BAAMb,cCHD2b,I,OAAiC,SAAC,GAaxC,IAZLC,EAYI,EAZJA,YACAvX,EAWI,EAXJA,MACA5H,EAUI,EAVJA,KACAof,EASI,EATJA,aACAniB,EAQI,EARJA,UACAod,EAOI,EAPJA,YACAgF,EAMI,EANJA,8BACAC,EAKI,EALJA,WACAtW,EAII,EAJJA,SACAxB,EAGI,EAHJA,QACAC,EAEI,EAFJA,OAEI,IADJwQ,gBACI,SACEvP,EAAWlB,GAAWC,GAAUD,EAAQxH,SAA0BmE,IAAjBsD,EAAOzH,GACxDuf,EAAYD,GAAcA,EAAWja,OAAS,EAC9Cma,EAAcxW,GAAYA,EAAS3D,OAAS,EAE5Coa,EAAY,SAAC,GACjB,OADkC,EAAf/W,SAEjB,cAAC,GAAD,CACElB,QAASA,EACTC,OAAQA,EACRlC,KAAM+Z,EACNvjB,GAAIiE,EACJ+X,cAAeE,IAGjB,cAAC,IAAD,CAAqBD,QAAShY,EAAMiY,SAAUA,EAA9C,SACGqH,KAKDI,EAAc,SAAC,GACnB,OADuC,EAAlBP,aAGjB,sBAAMliB,UAAU,oBAAhB,SACE,uBACEA,UACE2K,GAASA,EAAMvC,OAAS+Z,EACpB,uEACA,+BAJR,UAMGxX,EAAQA,EAAMvC,OAAS,EAN1B,IAM8B+Z,QAOtC,OACE,eAAC,IAAMhb,SAAP,WACE,sBAAMrI,GAAG,0BACRwjB,GAAa,cAACE,EAAD,CAAW/W,SAAUA,IAEnC,cAACgX,EAAD,CAAaP,YAAaA,IAE1B,cAAC,IAAD,CACEnf,KAAMA,EACNqa,YAAaA,GAA4B,yBACzC/S,SAAU+X,EACVtkB,MAAO2N,EACPd,MAAOA,EACP+X,KAAK,IACL1iB,UAAWA,IAGZuiB,GAAe,cAAC,IAAD,UAAoBxW,SCjF7B4W,GAAiB,SAACC,GAG7BvlB,QAAQC,IAAI,kBAAmBslB,EAASpD,eAAeqD,KAAOD,EAASpD,eAAeqD,KAAKpR,WAAa,MACxGpU,QAAQC,IAAI,qBAAsBslB,EAASpD,eAAesD,QAAUF,EAASpD,eAAesD,QAAQrR,WAAa,MAGjH,IAAMU,EAAO,CACX4Q,UAAWH,EAASI,UACpBC,WAAYL,EAASM,UAAYC,SAASP,EAASM,WAAa,KAChEE,QAASR,EAASpD,eAAetK,QACjCmO,SAAUT,EAASpD,eAAerK,SAClCmO,WAAYV,EAASpD,eAAe/L,WACpCoP,KAAMD,EAASpD,eAAeqD,KAAOD,EAASpD,eAAeqD,KAAKpR,WAAa,KAC/E8R,WAAYX,EAASpD,eAAegE,WAAaZ,EAASpD,eAAegE,WAAa,KACtFC,KAAMb,EAASpD,eAAevK,KAAO2N,EAASpD,eAAevK,KAAO,KACpEyO,OAAQd,EAASpD,eAAee,OAASqC,EAASpD,eAAee,OAAS,KAC1EoD,SAAUf,EAASpD,eAAe1N,SAAW8Q,EAASpD,eAAe1N,SAAW,KAChF8R,SAAUhB,EAASpD,eAAe3jB,SAAW+mB,EAASpD,eAAe3jB,SAAW,KAChFgoB,iBAAkBjB,EAASpD,eAAesE,iBAAmBlB,EAASpD,eAAesE,iBAAmB,KACxGC,QAASnB,EAASpD,eAAesD,QAAUF,EAASpD,eAAesD,QAAU,KAC7EkB,sBAAuBpB,EAASqB,sBAChCC,gBAAiBtB,EAAS1S,cAAgB0S,EAAS1S,cAAgB,KACnEiU,kBAAmBvB,EAASwB,eAAiBxB,EAASwB,eAAiB,KACvEC,WAAYzB,EAAS0B,UAAY1B,EAAS0B,UAAY,KACtDC,QAAS3B,EAAS4B,QAClBC,cAAe7B,EAAS8B,YAAcvB,SAASP,EAAS8B,aAAe,KACvEC,WAAY/B,EAASgC,WAAazB,SAASP,EAASgC,YAAc,KAClEC,gBAAiBjC,EAASkC,aAC1BC,kBAAmBnC,EAAS1H,kBAC5B8J,KAAMpC,EAASpD,eAAegC,KAC9ByD,kBAAmBrC,EAASsC,iBAAmB/B,SAASP,EAASsC,kBAAoB,KACrFC,oBAAqBvC,EAASwC,oBAAsBjC,SAASP,EAASwC,qBAAuB,KAC7FC,qBAAsBzC,EAAS0C,YAC/BC,mBAAoB3C,EAAS4C,kBAC7BC,yBAA0B7C,EAAS8C,uBACnCC,qBAAsB/C,EAASgD,kBAC/BC,UAAWjD,EAASkD,UACpBC,YAAanD,EAASoD,YACtBC,sBAAuBrD,EAASsD,sBAAwB/C,SAASP,EAASsD,uBAAyB,KACnGC,iBAAkBvD,EAASwD,iBAC3BC,6BAA8BzD,EAAS0D,8BAEnCzmB,EAAG,UAAM4W,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBiB,WAE7DshB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAG1D,OAAO1U,KAAM2U,KAAK9mB,EAAKsS,EAAMqU,GAAQppB,OAAM,SAAC6V,GAG1C,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAYsQ,IAClD3P,MAIG2T,GAAkB,uCAAG,WAAOC,EAAiBC,GAAxB,iBAAAnnB,EAAA,6DAC1BE,EAD0B,UACjB4W,uBAAqBC,MAAM6P,QADV,OACmBtiB,EAAgBmB,qBADnC,YAC2DyhB,EAD3D,YAC8EC,GAExGN,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAJ1B,kBAOzB1U,KAAMpV,IAAIiD,EAAK2mB,GAAQppB,OAAM,SAAC6V,GAGnC,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAY,CAAEuU,qBACpD5T,MAVwB,2CAAH,wDAclB8T,GAAyB,SAACF,EAAiBG,EAAuBC,EAAYC,GACzF,IAAM/U,EAAO,CACXgV,gBAAiBN,EACjBO,sBAAuBJ,EACvBK,WAAYJ,EACZK,aAAcJ,GAGVrnB,EAAG,UAAM4W,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBiB,WAE7DshB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAE1D,OAAO1U,KAAMuV,IAAI1nB,EAAKsS,EAAMqU,GAAQppB,OAAM,SAAC6V,GAMzC,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAWyG,EACXX,WAAY,CAAEuU,kBAAiBG,wBAAuBC,aAAYC,kBAE9DjU,MAIGuU,GAAc,uCAAG,WAAOC,GAAP,mBAAA9nB,EAAA,6DACtBwS,EAAO,CACXkV,WAAYI,EAAcR,WAC1B/C,gBAAiBuD,EAAcvX,cAAgBuX,EAAcvX,cAAgB,KAC7EwX,YAA2C,KAA9BD,EAAcE,YAAqB,KAAOF,EAAcE,aAGjE9nB,EAPsB,UAOb4W,uBAAqBC,MAAM6P,QAPd,OAOuBtiB,EAAgBoB,iBAE7DmhB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAV9B,kBAarB1U,KAAMuV,IAAI1nB,EAAKsS,EAAMqU,GAAQppB,OAAM,SAAC6V,GAGzC,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAYmV,IAClDxU,MAhBoB,2CAAH,sDAoBd2U,GAA4B,uCAAG,uCAAAjoB,EAAA,6DAASmjB,EAAT,EAASA,QAASE,EAAlB,EAAkBA,UAAlB,IAA6B6E,iCAA7B,MAAyD,GAAzD,EACpChoB,EADoC,UAC3B4W,uBAAqBC,MAAM6P,QADA,OACStiB,EAAgBqB,0BADzB,YACsDwd,GADtD,kBAKT9Q,KAAMpV,IAAIiD,GALD,cAKlCioB,EALkC,yBAMjCA,EAAiB3V,MANgB,sCAQxC9U,QAAQS,MAAR,MACAsU,IAAYC,eAAe,CAAE7F,UAAU,EAAD,GAAM8F,WAAY,CAAEwQ,UAASE,YAAW6E,+BATtC,8DAAH,sDAe5BE,GAAoB,uCAAG,uCAAApoB,EAAA,6DAASmjB,EAAT,EAASA,QAASE,EAAlB,EAAkBA,UAAlB,IAA6B6E,iCAA7B,MAAyD,GAAzD,EAC5BhoB,EAD4B,UACnB4W,uBAAqBC,MAAM6P,QADR,OACiBtiB,EAAgBqB,0BADjC,YAC8Dwd,GAD9D,SAIH9Q,KAAMpV,IAAIiD,GAAKzC,OAAM,SAAC6V,GAGnD,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,EAAIX,WAAY,CAAEwQ,UAASE,YAAW6E,+BACxE5U,KAP0B,UAYF,OAR1B6U,EAJ4B,QAYbprB,OAZa,0CAazB,GAbyB,YAiBhBorB,EAAiB3V,KAGvBxB,QACR,SAACiS,GAAD,OAAcA,EAASI,YAAcA,IAAc6E,EAA0BhY,SAAS+S,EAASqE,eAC/F7e,OAAS,GAtBqB,2CAwBzB,GAxByB,kCA2B3B,GA3B2B,4CAAH,sDCrI3B0V,G,cAMJ,aAAe,IAAD,OACZ,GADY,0BALdpH,MAAQ,CACNwH,eAAWhX,EACXiX,cAAUjX,GAGE,KAUd8W,SAAW,SAAC3I,EAAK1K,GACf,EAAK+L,MAAMrB,GAAO1K,GAVd9D,cAAYC,QAAQN,kBAAmB,CACzC,IAAMwhB,EAAOnhB,cAAYC,QAAQmhB,aACjC3L,KAAK5F,MAAQ,CACXwH,UAAW8J,EAAKE,WAChB/J,SAAU6J,EAAKG,iBAWRC,2BAAc,IAAItK,ICzBpBuK,GACG,UADHA,GAEK,0BCFLC,GAA6B,yDAC7BC,GAAiB,sPACjBC,GAAoC,ICApCC,GAAyB,cACzBC,GAA+B,oBAI/BC,GAA6B,kBAE7BC,GAAsB,WACtBC,GAAwB,aAExBC,GACJ,QADIA,GAKG,eAGHC,GACc,0BADdA,GAED,WAFCA,GAGD,WAHCA,GAIC,aAJDA,GAKK,iBALLA,GAMK,iBANLA,GAOO,mBAPPA,GAQO,mBARPA,GASQ,oBAGRC,GACc,CACvBC,eAAgB,iBAChBC,gBAAiB,kBACjBC,gBAAiB,kBACjBC,YAAa,cACbC,MAAO,QACPC,UAAW,YACXC,QAAS,UACTC,iBAAkB,mBAClBC,WAAY,aACZC,IAAK,MACLC,QAAS,UACTC,QAAS,UACTC,iBAAkB,oBAdTb,GAqBD,CACRc,gBAAiB,kBACjBC,QAAS,UACTC,oBAAqB,sBACrBC,OAAQ,SACRC,QAAS,UACTC,iBAAkB,mBAClBC,IAAK,MACLC,cAAe,gBACfC,gBAAiB,kBACjBC,KAAM,OACNC,MAAO,QACPC,WAAY,cAjCHzB,GAmCC,CACV0B,SAAU,WACVC,UAAW,YACXC,6BAA8B,+BAC9BC,cAAe,gBACfC,oBAAqB,sBACrBC,UAAW,YACXC,YAAa,cACbC,WAAY,aACZC,aAAc,eACdC,MAAO,QACPC,MAAO,SA6CEC,GAA8B,CACzC,CACEC,YAAatC,GAA6Ca,iBAC1D0B,eAAgB,CAAC9C,GAAwBM,MC9HhCyC,GACqB,CAC9BC,QAAS,GAFAD,GAIO,iBCJPE,GAAa,aAGbC,GAAuB,uBAIvBC,GAAqB,qBACrBC,GAAgB,gBAEhBC,GAAqB,iBACrBC,GAAoB,gBAGpBC,GAAqB,qBAGrBC,GAAkB,kBCjBlBC,GAA+B,oBAC/BC,GACF,W,kBCAEC,GAAU,SAACnhB,EAAKohB,GAC3B,OAAOC,OAAYC,KAAK,CACtBxpB,KAAM,UACNypB,WAAW,EACX3b,QAASwb,GAAG,UAAO,GAAKI,KAAZ,gCAAwC,GAAK/Y,WACzDgZ,OAAQ,CACNhZ,UAAWzI,EAAIwhB,MAGjBF,KAAM,SAAU5hB,GACd,YAAiBzD,IAAVyD,GAAsBA,IAAU2R,KAAKlP,QAAQnC,OCT7C0hB,GAAyB,SAACC,GAErC,QAAoB1lB,IAAhB0lB,GAA6C,OAAhBA,EAAsB,OAAO,EAG9D,IAAMC,EAAiBD,EAAYnb,WAAW1S,QAAQ,MAAO,IAG7D,QAAI8tB,EAAe9wB,MAAM,aAE0C,KAA1D8wB,EAAe9tB,QAAQ,MAAO,IAAIhD,MAAM,OAAOqM,QAkB7C0M,GAAkB,SAACnK,GAAoC,IAA7BmiB,EAA4B,wDACjE,MAAc,KAAVniB,QAA0BzD,IAAVyD,EACXmiB,EAGkC,OAAvCniB,EAAMqI,OAAOjX,MAAMwsB,KC/BZwE,GAAY,SAACC,GAAD,OAA6B,IAAdA,G,SCGlCC,GAAuB,oBAEhBC,GAAuB,uCAAG,WAAOC,EAAiBC,EAAaC,GAArC,mBAAA1tB,EAAA,0DACS,IAA1CkH,cAAYC,QAAQN,kBADa,yCACuB2G,QAAQE,OAAO4f,KADtC,cAG/BnqB,EAH+B,UAGlB2T,uBAAqBC,MAAM6P,QAHT,OAGkBtiB,EAAgBO,wBACjE2N,EAAO,CAAEgb,kBAAiBC,cAAaC,mBACvC7G,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cANrB,kBAS9B1U,KAAM2U,KAAK7jB,EAASqP,EAAMqU,GAAQppB,OAAM,SAAC6V,GAK9C,MAJAb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,iCACrB0S,WAAY,CAAEgb,kBAAmBF,IAAgBC,KAE7Cpa,MAd6B,2CAAH,0DAkBvBsa,GAAqB,uCAAG,WAAOC,GAAP,iBAAA7tB,EAAA,0DACW,IAA1CkH,cAAYC,QAAQN,kBADW,yCACyB2G,QAAQE,OAAO4f,KADxC,cAE7BnqB,EAF6B,UAEhB2T,uBAAqBC,MAAM6P,QAFX,OAEoBtiB,EAAgBQ,oBACjE+hB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,aACxDgG,OAAQ,CAAEc,gBALuB,kBAQ5Bxb,KAAMpV,IAAIkG,EAAS0jB,GAAQppB,OAAM,SAAC6V,GAGvC,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,iCAAkC0S,WAAY,CAAEkb,iBAC5Fva,MAX2B,2CAAH,sDAerBwa,GAA6B,uCAAG,WAAOC,GAAP,iBAAA/tB,EAAA,6DACrCmD,EADqC,UACxB2T,uBAAqBC,MAAM6P,QADH,OACYtiB,EAAgBU,4BACjE6hB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAHf,SAM9B1U,KAAM2U,KAAK7jB,EAAS,CAAE6qB,oBAAqBD,GAAuBlH,GAAQppB,OAAM,SAAC6V,GAM5F,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,wCACrB0S,WAAY,CAAEob,yBAEVza,KAZmC,mFAAH,sDAgB7B2a,GAAuB,uCAAG,WAAOC,EAAiBvrB,GAAxB,iBAAA3C,EAAA,6DAC/BmD,EAD+B,UAClB2T,uBAAqBC,MAAM6P,QADT,OACkBtiB,EAAgBW,8BACjE4hB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAHrB,SAMxB1U,KAAM2U,KAAK7jB,EAAS,CAAEgrB,gBAAiBD,EAAiBE,SAAUzrB,GAAYkkB,GAAQppB,OAAM,SAAC6V,GAMxG,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,kCACrB0S,WAAY,CAAEub,kBAAiBvrB,cAE3B2Q,KAZ6B,mFAAH,wDAwCvB+a,GAAsB,uCAAG,WAAO9P,EAAWC,GAAlB,iBAAAxe,EAAA,0DACU,IAA1CkH,cAAYC,QAAQN,kBADY,yCAE3B2G,QAAQE,OAAO4f,KAFY,cAK9BnqB,EAL8B,UAKjB2T,uBAAqBC,MAAM6P,QALV,OAKmBtiB,EAAgBe,qBACjEwhB,EAAS,CACb7pB,QAAS,CACP8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cARb,kBAY7B1U,KAAM2U,KAAK7jB,EAAS,CAAEob,YAAWC,YAAYqI,GAAQppB,OAAM,SAAC6V,GAMjE,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,iCACrB0S,WAAY,CAAE4L,YAAWC,cAErBlL,MAlB4B,2CAAH,wDAsBtBgb,GAAyB,uCAAG,WAAOC,GAAP,mBAAAvuB,EAAA,0DACO,IAA1CkH,cAAYC,QAAQN,kBADe,yCAE9B2G,QAAQE,OAAO4f,KAFe,cAKjCnqB,EALiC,6BAMlCorB,GANkC,IAOrChZ,QAASgZ,EAAehZ,QAAQzD,WAChC0D,SAAU+Y,EAAe/Y,SAAS1D,aAG9B0c,EAXiC,UAWjB1X,uBAAqBC,MAAM6P,QAXV,OAWmBtiB,EAAgBa,wBAEpE0hB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAdnB,SAiB1B1U,KAAM2U,KAAKwH,EAAYrrB,EAAS0jB,GAAQppB,OAAM,SAAC6V,GAM1D,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,oCACrB0S,WAAYxP,IAERmQ,KAvB+B,mFAAH,sDA2BzBmb,GAAuB,uCAAG,WAAOxB,GAAP,iBAAAjtB,EAAA,0DACS,IAA1CkH,cAAYC,QAAQN,kBADa,yCACuB2G,QAAQE,OAAO4f,KADtC,cAE/BnqB,EAF+B,UAElB2T,uBAAqBC,MAAM6P,QAFT,OAEkBtiB,EAAgBc,sBAEjEyhB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cALrB,SAQxB1U,KAAM2U,KAAK7jB,EAAS,CAAEurB,gBAAiBzB,GAAepG,GAAQppB,OAAM,SAAC6V,GAGhF,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,mCAC5CqT,KAX6B,mFAAH,sDC3HpCqZ,KAAcA,KAAY,UAAWF,IAGrC,IA8IekC,GAvDqBC,aAAW,CAC7CC,iBAD6C,YACuD,IAAD,IAAhFC,uBAAgF,MAA9D,GAA8D,MAA1DC,mBAA0D,MAA5C,GAA4C,MAAxCC,gBACzD,MAAO,CACLF,gBAAiBA,GAAmB,GACpCC,YAAaA,GAAe,GAC5BC,sBAJ+F,MAAtB,GAAsB,IAI3D,GACpCC,aAAa,EACbC,oBAAgB3nB,EAChB4nB,eAP+F,EAAlBA,gBAO3CzxB,QAAQC,IAAI,0BAGlDyxB,iBAAkBzC,OAAa0C,MAAM,CACnCP,gBAAiBnC,OACd2C,IAAI,EAAG,2FACPjU,SAAS,iDACZ0T,YAAapC,OACVtR,SAAS,6CACTkU,QAAQ5G,GAA4Bld,IACvCujB,gBAAiBrC,OACdF,QACCE,KAAQ,eACR,4FAEDtR,SAAS,uDAEdmU,aAzB6C,SAyBhCC,EAzBgC,GAyBgD,IAAtEC,EAAqE,EAArEA,UAAWC,EAA0D,EAA1DA,cAAeC,EAA2C,EAA3CA,cAAeC,EAA4B,EAA5BA,UAAWC,EAAiB,EAAjBA,cACzE,GAAIL,EAAOX,kBAAoBW,EAAOV,YAGpC,OAFAe,EAAc,cAAe,6EAC7BH,GAAc,GAGhBpC,GAAwBkC,EAAOX,gBAAiBW,EAAOV,YAAaU,EAAOT,iBACxEnyB,MAAK,SAACC,GACmB,MAApBA,EAASC,SACX2yB,EAAU,CACRZ,gBAAiB,GACjBC,YAAa,GACbC,gBAAiB,KAEnBS,EAAON,qBAGV1xB,OAAM,SAACU,GACN0xB,IACAF,GAAc,QACApoB,IAAVpJ,QAA0CoJ,IAAnBpJ,EAAMrB,UAAoD,MAA1BqB,EAAMrB,SAASC,QACxE6yB,EAAc,eAAe,GAC7BA,EAAc,iBAAkB,iDAEhCA,EAAc,eAAe,QAjDHhB,EAvFT,SAAC,GAAD,IAAGa,EAAH,EAAGA,OAAQ5kB,EAAX,EAAWA,OAAQD,EAAnB,EAAmBA,QAAS4kB,EAA5B,EAA4BA,aAAc1kB,EAA1C,EAA0CA,YAAa8kB,EAAvD,EAAuDA,cAAvD,OACzB,eAAC,KAAD,CAAMtS,YAAU,EAAhB,UACE,cAAC,GAAD,CAA4BhB,cAAemT,EAAOR,YAAa1S,cAAekT,EAAOP,iBACpFa,OAAOC,KAAKnlB,GAAQpC,OAAS,GAC9BmC,EAAQkkB,iBACRlkB,EAAQmkB,aACRnkB,EAAQokB,iBACRlkB,EAAc,EACZ,cAAC,GAAD,CAAmBD,OAAQA,IAE3B,cAAC,IAAMrD,SAAP,IAEF,qBAAKnH,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CAA4BuK,QAASA,EAASC,OAAQA,EAAQlC,KAAK,mBAAmBxJ,GAAG,oBACzF,cAAC,IAAD,CACEX,KAAK,WACL4E,KAAK,kBACLjE,GAAG,kBACH6L,MAAOykB,EAAOX,gBACdpkB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,kBAAmB1lB,EAAE2G,OAAO7F,QAC3D7M,MAAO0M,EAAOikB,iBAAmBlkB,EAAQkkB,kBAE1CjkB,EAAOikB,iBAAmBlkB,EAAQkkB,iBACjC,cAAC,IAAD,UAAsBjkB,EAAOikB,uBAKnC,qBAAKzuB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CAA4BuK,QAASA,EAASC,OAAQA,EAAQlC,KAAK,eAAexJ,GAAG,gBACrF,cAAC,IAAD,CACEX,KAAK,WACL4E,KAAK,cACLjE,GAAG,cACH6L,MAAOykB,EAAOV,YACdrkB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,cAAe1lB,EAAE2G,OAAO7F,QACvD7M,MAAO0M,EAAOkkB,aAAenkB,EAAQmkB,cAEtClkB,EAAOkkB,aAAenkB,EAAQmkB,aAAe,cAAC,IAAD,UAAsBlkB,EAAOkkB,cAC3E,cAAC,IAAD,8JAMJ,qBAAK1uB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,uBACLxJ,GAAG,oBAEL,cAAC,IAAD,CACEX,KAAK,WACL4E,KAAK,kBACLjE,GAAG,kBACH6L,MAAOykB,EAAOT,gBACdtkB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,kBAAmB1lB,EAAE2G,OAAO7F,QAC3D7M,MAAO0M,EAAOmkB,iBAAmBpkB,EAAQokB,kBAE1CnkB,EAAOmkB,iBAAmBpkB,EAAQokB,iBACjC,cAAC,IAAD,UAAsBnkB,EAAOmkB,kBAE/B,cAAC,IAAD,2DAIJ,qBAAK3uB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBO,wBAC5DrE,QAASgvB,IAEX,cAAC,IAAD,CAAMnvB,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,2CCxEO6uB,GAtBiB,WAC9B,IAAMC,EAAanpB,cACnB,OACE,eAAC,EAAD,WACE,cAAC,EAAD,CAAqB4B,KAAK,kBAAkBC,KAAK,iBACjD,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,+BAA9B,SACE,cAAC,GAAD,CACE8wB,eAAgB,kBACde,EAAWjvB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQC,SAASE,6BCGhFstB,GAhBwB,kBACrC,eAAC,EAAD,WACE,cAAC,EAAD,CAAqBxnB,KAAK,kCAAkCC,KAAK,iBACjE,eAAC,GAAD,WACE,8HACA,yCACU,cAAC,IAAD,CAAMT,GAAIlH,EAAmBG,UAA7B,kCC0DDgvB,GAhEiB,SAAC,GAAiB,IAAf9d,EAAc,EAAdA,QACjC,EAA4C1L,mBAAS,IAArD,mBAAOypB,EAAP,KAAuBC,EAAvB,KAiCA,OA/BAtpB,qBAAU,WACR,GAAIsL,EAAS,CACX,IAAM+d,EAAiB,CACrB,CAAEjW,UAAW,aAAcE,UAAWhI,EAAQiM,WAC9C,CAAEnE,UAAW,YAAaE,UAAWhI,EAAQkM,UAC7C,CACEpE,UAAW,gBACXE,UAAWhI,EAAQie,aACnB/V,KAAK,GAAD,OAAKvZ,EAAmByB,QAAQrB,MAAhC,OAAuCJ,EAAmByB,QAAQO,MAAML,SAE9E,CACEwX,UAAW,mBACXE,UAAWhI,EAAQ2a,YACnBzS,KAAK,GAAD,OAAKvZ,EAAmByB,QAAQrB,MAAhC,OAAuCJ,EAAmByB,QAAQQ,MAAMN,SAE9E,CACEwX,UAAW,UACXE,UAAWhI,EAAQnP,QACnBqX,KAAK,GAAD,OAAKvZ,EAAmByB,QAAQrB,MAAhC,OAAuCJ,EAAmByB,QAAQS,QAAQP,UAI9EwqB,GAAUoD,sBAAoBC,qBAAqBC,OACrDL,EAAe,GAAG7V,KAAlB,UAA4BvZ,EAAmByB,QAAQrB,MAAvD,OAA8DJ,EAAmByB,QAAQU,KAAKR,QAC9FytB,EAAe,GAAG7V,KAAlB,UAA4BvZ,EAAmByB,QAAQrB,MAAvD,OAA8DJ,EAAmByB,QAAQU,KAAKR,SAGhG0tB,EAAkBD,MAEnB,CAAC/d,IAGF,sBAAKjS,UAAU,kBAAf,UACE,oFACqD,mBAAGI,KAAK,oCAAR,wBADrD,yBAEsB,mBAAGA,KAAK,iDAAR,iCAFtB,OAIA,2FACwD,IACtD,mBAAGA,KAAK,8EAAR,2DAEK,IAJP,qDAOA,cAAC,GAAD,CAAuBsZ,UAAU,GAAGC,UAAU,UAAUC,WAAW,SAASC,QAASmW,IACrF,4BACE,cAAC,IAAD,CAAMloB,GAAIlH,EAAmBG,UAA7B,sCCjBOuvB,I,OA1BiB,WAC9B,MAA4C/pB,mBAAS,IAArD,mBAAOypB,EAAP,KAAuBC,EAAvB,KACA,EAA0D1pB,qBAA1D,mBAAOgqB,EAAP,KAA8BC,EAA9B,KAQA,OAPA7pB,qBAAU,WACR,IAAM4pB,EAAwBhD,IAAsB,GACpDiD,EAAyBD,GAEzBA,EAAsB/zB,MAAK,SAACC,GAAD,OAAcwzB,EAAkBxzB,EAAS0V,WACnE,IAGD,eAAC,EAAD,WACE,cAAC,EAAD,CAAqB7J,KAAK,kBAAkBC,KAAK,iBACjD,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,+BAA9B,cAC6BkJ,IAA1BqpB,GACC,cAAC,GAAD,CAAwBjlB,QAASilB,EAAjC,SACE,cAAC,GAAD,CAAyBte,QAAS+d,eC4EjCS,GArF0B,WACvC,IAAMjxB,EAAWkH,cACjB,EAAwDH,wBAASW,GAAjE,mBAAOwpB,EAAP,KAA6BC,EAA7B,KACA,EAAsDpqB,mBAAS,MAA/D,mBAAOmnB,EAAP,KAA4BkD,EAA5B,KACA,EAAsCrqB,oBAAS,GAA/C,mBAAOqoB,EAAP,KAAoBiC,EAApB,KAEAlqB,qBAAU,WACR,IAAM+pB,EAAuBnD,IAAsB,GACnDoD,EAAwBD,GAExBA,EACGl0B,MAAK,SAACyV,GAAD,OAAa2e,EAAuB3e,EAAQE,KAAKub,wBACtDtwB,OAAM,kBAAMyzB,GAAe,QAC7B,IAyBH,OACE,eAAC,EAAD,WACE,cAAC,EAAD,CAAqBvoB,KAAK,4BAA4BC,KAAK,iBAC3D,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,+BAA9B,cAC4BkJ,IAAzBwpB,EACC,cAAC,GAAD,CAAwBplB,QAASolB,EAAjC,SACE,gCACE,cAAC,GAAD,CAA4BzU,cAAe2S,IAC3C,kIACA,cAAC,IAAD,mGAIA,qBAAK9vB,GAAG,sBAAR,SACE,cAAC,IAAD,CACEiE,KAAK,sBACL4H,MAAO+iB,EACPrjB,SAxCuB,WACvCumB,GAAwBlD,GACxBmD,GAAe,IAuCCjmB,QAAS,CACP,CAAED,OAAO,EAAME,MAAO,kEACtB,CAAEF,OAAO,EAAOE,MAAO,6EAK7B,gCACE,cAAC,IAAD,CACE7K,UAAWC,IAAc0a,QAAU,eACnCxa,QA7CuB,WACvC0wB,GAAe,GAEfpD,GAA8BC,GAC3BlxB,MAAK,SAACC,GACmB,MAApBA,EAASC,OACX8C,EAASoB,EAAmBG,WAE5B8vB,GAAe,MAGlBzzB,OAAM,WACLyzB,GAAe,OAkCHhxB,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBU,8BAE9D,cAAC,IAAD,CAAM3E,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,wCAON,cAAC,IAAMoG,SAAP,YC3EZmlB,KAAcA,KAAY,UAAWF,IAErC,IA2GM0E,GAAuBvC,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLuC,aAF6D,EAA9CA,aAGfnuB,MAAO,GACPouB,aAAc,GACd1uB,SAAU,GACV2uB,mBAN6D,EAAhCA,mBAO7B/T,SAP6D,EAAZA,SAQjD0R,aAAa,IAGjBG,iBAAkBzC,OAAa0C,MAAM,CACnCpsB,MAAO0pB,OACJ4E,SACC,CAAC5E,KAAQ,iBACT,4FAED1pB,MAAM,iGACNoY,SAAS,kDAEZgW,aAAc1E,OACXF,QACCE,KAAQ,SACR,+GAEDtR,SAAS,0DAEZ1Y,SAAUgqB,OAAatR,SAAS,2CAElCmU,aA9BsC,SA8BzBC,EA9ByB,GA8BiC,IAAhDE,EAA+C,EAA/CA,cAAeG,EAAgC,EAAhCA,cAAeF,EAAiB,EAAjBA,cACnDH,EACGlS,SAASkS,EAAOxsB,MAAOwsB,EAAO9sB,UAC9B9F,MAAK,SAAC20B,GACc,MAAfA,EAAIz0B,OACN0yB,EAAO6B,sBAEP1B,EAAc,eAAe,GAC7BD,GAAc,OAGjBlyB,OAAM,SAACU,GACNwxB,GAAc,QAEApoB,IAAVpJ,QAA0CoJ,IAAnBpJ,EAAMrB,SAKH,MAA1BqB,EAAMrB,SAASC,QACjB4yB,GAAc,GACdG,EAAc,WAAYrkB,MAG1BmkB,EAAc,eAAe,GAC7BD,GAAc,IAVdC,EAAc,eAAe,QA7CVhB,EA3GL,SAAC,GAAD,IAAG/jB,EAAH,EAAGA,OAAQD,EAAX,EAAWA,QAAS6kB,EAApB,EAAoBA,OAAQD,EAA5B,EAA4BA,aAAc1kB,EAA1C,EAA0CA,YAAa8kB,EAAvD,EAAuDA,cAAvD,OACtB,eAAC,KAAD,CAAMtS,YAAU,EAAhB,UACE,cAAC,GAAD,CAA4BhB,cAAemT,EAAOR,cACjDc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAc,GAAKF,EAAQ3H,OAAS2H,EAAQymB,cAAgBzmB,EAAQjI,SACrG,cAAC,GAAD,CAAmBkI,OAAQA,IACzB,KACJ,qBAAKxK,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,8BACE,wDADF,IACkCovB,EAAO2B,oBAK7C,qBAAK/wB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,yKAOJ,qBAAKA,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,oBACLxJ,GAAG,QACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,QACL5E,KAAK,QACLW,GAAG,QACH6L,MAAOykB,EAAOxsB,MACdyH,SAAU,SAACR,GAAD,OAAO0lB,EAAc,QAAS1lB,EAAE2G,OAAO7F,QACjD7M,MAAO0M,EAAO5H,OAAS2H,EAAQ3H,OAAS6H,EAAc,IAEvDD,EAAO5H,OAAS2H,EAAQ3H,OAAS6H,EAAc,GAAK,cAAC,IAAD,UAAsBD,EAAO5H,aAItF,qBAAK5C,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,4BACLxJ,GAAG,eACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,eACL5E,KAAK,QACLW,GAAG,eACH6L,MAAOykB,EAAO4B,aACd3mB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,eAAgB1lB,EAAE2G,OAAO7F,QACxD7M,MAAO0M,EAAOwmB,cAAgBzmB,EAAQymB,cAAgBvmB,EAAc,IAErED,EAAOwmB,cAAgBzmB,EAAQymB,cAAgBvmB,EAAc,GAC5D,cAAC,IAAD,UAAsBD,EAAOwmB,oBAKnC,qBAAKhxB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,WACLxJ,GAAG,WACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,WACL5E,KAAK,WACLW,GAAG,WACH6L,MAAOykB,EAAO9sB,SACd+H,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,QACpD7M,MAAO0M,EAAOlI,UAAYiI,EAAQjI,UAAYmI,EAAc,IAE9D,cAAC,IAAD,iGAGCD,EAAOlI,UAAYiI,EAAQjI,UAAY,cAAC,IAAD,UAAsBkI,EAAOlI,gBAIzE,qBAAKtC,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBW,8BAC5DzE,QAASgvB,IAEX,cAAC,IAAD,CAAMnvB,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,2CAqER+vB,GAAqBloB,UAAY,CAC/BmoB,aAAcloB,IAAUC,OACxBmoB,mBAAoBpoB,IAAUyS,KAAKvS,WACnCmU,SAAUrU,IAAUyS,KAAKvS,YAGZ+nB,UCtJAM,GApCc,WAC3B,IAAM5xB,EAAWkH,cACjB,EAAwCH,qBAAxC,mBAAOwqB,EAAP,KAAqBM,EAArB,KACA,EAAsD9qB,qBAAtD,mBAAO+qB,EAAP,KAA4BC,EAA5B,KAWA,OATA5qB,qBAAU,WACR,IAAM2qB,EAAsB/D,IAAsB,GAClDgE,EAAuBD,GAEvBA,EACG90B,MAAK,SAACC,GAAD,OAAc40B,EAAgB50B,EAAS0V,KAAK+d,iBACjD9yB,OAAM,SAACU,GAAD,OAAWA,GAAST,QAAQS,MAAMA,QAC1C,IAGD,eAAC,EAAD,WACE,cAAC,EAAD,CAAqBwK,KAAK,uBAAuBC,KAAK,iBACtD,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,4BAA9B,cAC2BkJ,IAAxBoqB,GACC,cAAC,GAAD,CAAwBhmB,QAASgmB,EAAjC,SACE,cAAC,GAAD,CACEL,mBAAoB,kBAClBzxB,EAASoB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQO,MAAMpB,eAE9E0b,SAAU,SAACsU,EAAUlvB,GAAX,OAAwBsrB,GAAwB4D,EAAUlvB,IACpEyuB,aAAcA,cCKfU,GAlC0B,kBACvC,cAAC,EAAD,UACE,eAAC,EAAD,CAAwBzzB,MAAM,4BAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,uBAAuBC,KAAK,iBACtD,eAAC,GAAD,WACE,uFAEA,2HAEA,+BACE,6BACE,uFAEF,6BACE,sHAIJ,qIACA,mIAEA,wCACS,mBAAGnI,KAAK,oCAAR,wBADT,iFAKA,yCACU,cAAC,IAAD,CAAM0H,GAAIlH,EAAmBG,UAA7B,wBADV,gBCqCO2wB,GA1DqB,WAClC,IAAMlyB,EAAWkH,cACjB,EAAwDH,qBAAxD,mBAAOmqB,EAAP,KAA6BC,EAA7B,KACA,EAAsCpqB,oBAAS,GAA/C,mBAAOqoB,EAAP,KAAoBiC,EAApB,KACA,EAAoDtqB,mBAAS,IAA7D,mBAAOorB,EAAP,KAA2BC,EAA3B,KACA,EAAuBC,cAAhBC,EAAP,oBAyBA,OAvBAnrB,qBAAU,WACR,IAAMorB,EAASD,EAAal1B,IAAI,UAC1Bo1B,EAAOF,EAAal1B,IAAI,QAG9BiK,cAAYC,QAAQmrB,UAEpB,IAAMvB,EV6C2B,SAACqB,EAAQC,GAC5C,IAAMlvB,EAAO,UAAM2T,uBAAqBC,MAAM6P,OAAjC,YAA2CtiB,EAAgBgB,qCAA3D,mBAA0G8sB,EAA1G,iBAAyHC,GAEtI,OAAOhgB,KAAMpV,IAAIkG,GAAS1F,OAAM,SAAC6V,GAG/B,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,sCAAuC0S,WAAY,CAAEyf,YACjG9e,KUnDuBif,CAAsBH,EAAQC,GAC3DrB,EAAwBD,GACxBA,EACGl0B,MAAK,SAACC,GACmB,MAApBA,EAASC,SACXm0B,GAAe,GACfe,EAAsBxmB,QAGzBhO,OAAM,SAACU,GACN+yB,GAAe,GACfe,EAAsBxmB,IACtBtN,GAAST,QAAQS,MAAMA,QAE1B,IAGD,eAAC,EAAD,CAAwBE,MAAM,4BAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,+CAA+CC,KAAK,iBAC9E,cAAC,GAAD,eAC4BrB,IAAzBwpB,GACC,eAAC,GAAD,CAAwBplB,QAASolB,EAAjC,UACE,cAAC,GAAD,CAA4BzU,cAAe2S,EAAa1S,cAAeyV,KACtD,IAAhB/C,GACC,0HAGF,qBAAK5uB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnCxa,QAAS,kBAAMX,EAASoB,EAAmBC,SAH7C,kCCmBVsxB,GAA6B5D,aAAW,CAC5CC,iBAD4C,YAE1C,MAAO,CACL5B,YAF4D,EAA7CA,aAEa,GAC5B1P,SAH4D,EAAhCA,UAGN,KACtB+T,mBAJ4D,EAAtBA,oBAII,KAC1CmB,UAAW,GACXxD,aAAa,IAGjBG,iBAAkBzC,OAAa0C,MAAM,CACnCoD,UAAW9F,OACRtR,SAAS,qDACTuR,KACC,YACA,yGACA,SAAC5hB,GAAD,OAAWgiB,GAAuBhiB,QAGxCwkB,aAnB4C,SAmB/BC,EAnB+B,GAmBY,IAAjCE,EAAgC,EAAhCA,cAAeC,EAAiB,EAAjBA,cACpCH,EACGlS,SAASkS,EAAOgD,WAChB51B,MAAK,SAAC20B,GACc,MAAfA,EAAIz0B,QACN0yB,EAAO6B,wBAGV7zB,OAAM,SAAC6V,GACNsc,EAAc,eAAe,GAC7BD,GAAc,QA7Baf,EAvDL,SAAC,GAAD,IAAG/jB,EAAH,EAAGA,OAAQD,EAAX,EAAWA,QAAS6kB,EAApB,EAAoBA,OAAQD,EAA5B,EAA4BA,aAAc1kB,EAA1C,EAA0CA,YAAa8kB,EAAvD,EAAuDA,cAAvD,OAC5B,eAAC,KAAD,CAAMtS,YAAU,EAAhB,UACE,cAAC,GAAD,CAA4BhB,cAAemT,EAAOR,cACjDc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ6nB,WAAa3nB,EAAc,EACpE,cAAC,GAAD,CAAmBD,OAAQA,IAE3B,cAAC,IAAMrD,SAAP,IAEF,qBAAKnH,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,8BACE,2DADF,IACqCovB,EAAOxC,mBAIhD,qBAAK5sB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,uBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACEtM,KAAK,MACLk0B,QAAQ,YACRtvB,KAAK,YACLjE,GAAG,YACH6L,MAAOykB,EAAOgD,UACd/nB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,YAAa1lB,EAAE2G,OAAO7F,QACrD7M,MAAO0M,EAAO4nB,WAAa7nB,EAAQ6nB,WAAa3nB,EAAc,IAE/DD,EAAO4nB,WAAa7nB,EAAQ6nB,WAAa3nB,EAAc,GACtD,cAAC,IAAD,UAAsBD,EAAO4nB,YAE/B,cAAC,IAAD,mEAGJ,qBAAKpyB,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBc,sBAC5D5E,QAASgvB,IAEX,cAAC,IAAD,CAAMnvB,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,2CA0COoxB,MAEfA,GAA2BvpB,UAAY,CACrCgkB,YAAa/jB,IAAUC,OACvBoU,SAAUrU,IAAUyS,KAAKvS,WACzBkoB,mBAAoBpoB,IAAUyS,KAAKvS,YCvGrC,IAsCeupB,GAtCoB,WACjC,IAAM9yB,EAAWkH,cACjB,EAAsCH,mBAAS,IAA/C,mBAAOqmB,EAAP,KAAoB2F,EAApB,KACA,EAAoDhsB,qBAApD,mBAAOisB,EAAP,KAA2BC,EAA3B,KAaA,OAXA9rB,qBAAU,WACR,IAAM6rB,EAAqBjF,IAAsB,GACjDkF,EAAsBD,GAEtBA,EACGh2B,MAAK,SAACC,GACL81B,EAAe91B,EAAS0V,KAAKya,gBAE9BxvB,OAAM,iBACR,IAGD,eAAC,EAAD,WACE,cAAC,EAAD,CAAqBkL,KAAK,0BAA0BC,KAAK,iBACzD,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,uCAA9B,cAC0BkJ,IAAvBsrB,GACC,cAAC,GAAD,CAAwBlnB,QAASknB,EAAjC,SACE,cAAC,GAAD,CACE5F,YAAaA,EACb1P,SAAU,SAACwV,GAAD,OAAoBtE,GAAwBsE,IACtDzB,mBAAoB,kBAClBzxB,EAASoB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQW,6B,4GC6DlF2vB,GAAyBpE,aAAW,CACxCC,iBADwC,YACuB,EAA5CoE,eACjB,MAAO,CACL1V,SAF2D,EAA5BA,UAET,KACtB2V,eAH2D,EAAlBA,gBAGP,KAClC/gB,SAAU,GACVhP,QAAS,GACT8rB,aAAa,IAGjBG,iBAAkBzC,KAAW,CAC3Bxa,SAAUwa,OACPtR,SAAS5P,IACTmhB,KAAK,WAAYnhB,GAFV,uCAEiD,WAAOT,GAAP,SAAAhL,EAAA,sEAAuBmV,GAAgBnK,GAAvC,mFAFjD,yDAKZwkB,aAhBwC,SAgB3BC,EAhB2B,GAgB+B,IAAhDE,EAA+C,EAA/CA,cAAeG,EAAgC,EAAhCA,cAAeF,EAAiB,EAAjBA,cAEnD,GAAuB,KAAnBH,EAAOtsB,QAGT,OAFA2sB,EAAc,UAAWrkB,IACzBkkB,GAAc,GACP,EAGT,IAAMwD,EAAU1D,EAAO2D,gBACvBD,EAAQE,cAAgB5D,EAAO4D,cAC/BF,EAAQG,UAAY7D,EAAO6D,UAE3B7D,EACGlS,SAAS4V,GACTt2B,MAAK,SAAC20B,GACc,MAAfA,EAAIz0B,QACN0yB,EAAOyD,oBAGVz1B,OAAM,WACLmyB,EAAc,eAAe,GAC7BD,GAAc,QArCSf,EApFL,SAAC,GAAD,IACxBa,EADwB,EACxBA,OACA5kB,EAFwB,EAExBA,OACAD,EAHwB,EAGxBA,QACAglB,EAJwB,EAIxBA,cACA2D,EALwB,EAKxBA,UACAC,EANwB,EAMxBA,gBACA1oB,EAPwB,EAOxBA,YACA0kB,EARwB,EAQxBA,aACG1nB,EATqB,0BAWxB,eAAC,KAAD,WACE,cAAC,GAAD,CAA4BwU,cAAemT,EAAOR,cACjDnkB,EAAc,KACW,IAAxBF,EAAO,eAAgDrD,IAAvBsD,EAAM,WACd,IAAvBD,EAAO,cAA8CrD,IAAtBsD,EAAM,SACtC,cAAC,GAAD,CAAmBA,OAAQA,IAE3B,cAAC,IAAMrD,SAAP,IAEF,qBAAKnH,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,8BACE,kDADF,IAC4ByH,EAAMmrB,sBAItC,qBAAK5yB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACR0J,iBAAkB,SAACpC,GACjByd,EAAc,WAAYzd,GAAU,GACpCqhB,EAAgB,YAAY,GAAO,GACnCA,EAAgB,WAAW,GAAO,IAEpCnf,gBAAiB,SAAClR,EAASmwB,GACzB1D,EAAc,OAAQzsB,EAAQyR,MAAM,GACpCgb,EAAc,UAAWzsB,EAAQ2S,cAAc,GAC/C8Z,EAAc,kBAAmBzsB,GAAS,GAC1CysB,EAAc,YAAa0D,IAE7Bhf,gBAAiB,SAAC9B,GACK,OAAjBA,EAAKF,SAAoBE,EAAKF,QAAQ7J,OAAS,GACjD+qB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAO,GAClCD,EAAU,CAAEphB,SAAU1G,OAEtBmkB,EAAc,gBAAiBpd,EAAKD,QAAQ,GAC5CihB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAO,KAGtChf,kBAAmB,SAAChW,GAClBg1B,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAM,GAEpB,aAATh1B,GACF+0B,EAAU,CAAEphB,SAAU1G,KAEX,YAATjN,GACF+0B,EAAU,CAAEphB,SAAU1G,YAMhC,qBAAKpL,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBa,wBAC5D3E,QAASgvB,IAEX,cAAC,IAAD,CAAMnvB,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,2CAkDO4xB,MAEfA,GAAuB/pB,UAAY,CACjCgqB,eAAgB/pB,IAAUC,OAC1BoU,SAAUrU,IAAUyS,KAAKvS,WACzB8pB,eAAgBhqB,IAAUyS,KAAKvS,YCjJjC,IAeeqqB,GAfQ,SAAC,GAAiB,IAAfviB,EAAc,EAAdA,QACxB,OACE,qCACE,cAAC,EAAD,CAAqBvI,KAAK,yBAC1B,eAAC,GAAD,WACE,cAAC,EAAD,CAAwBtK,MAAM,yBAC9B,4BACG6S,GACC,wLC8CGwiB,GAxCgB,WAC7B,IAAM7zB,EAAWkH,cACjB,EAA0DH,qBAA1D,mBAAO+sB,EAAP,KAA8BC,EAA9B,KACA,EAA4ChtB,mBAAS,IAArD,mBAAOqsB,EAAP,KAAuBY,EAAvB,KAWA,OATA7sB,qBAAU,WACR,IAAM2sB,EAAwB/F,IAAsB,GACpDgG,EAAyBD,GAEzBA,EACG92B,MAAK,SAACC,GAAD,OAAc+2B,EAAkB/2B,EAAS0V,KAAKrP,YACnD1F,OAAM,SAACU,GAAD,OAAWA,GAAST,QAAQS,MAAMA,QAC1C,IAEIivB,GAAUoD,sBAAoBC,qBpBjBC,6BoBkBpC,cAAC,GAAD,IAEA,eAAC,EAAD,WACE,cAAC,EAAD,CAAqB9nB,KAAK,iBAAiBC,KAAK,iBAChD,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBvK,MAAM,8BAA9B,cAC6BkJ,IAA1BosB,EACC,cAAC,GAAD,CAAwBhoB,QAASgoB,EAAjC,SACE,cAAC,GAAD,CACEV,eAAgBA,EAChB1V,SAAU+Q,GACV4E,eAAgB,kBACdrzB,EAASoB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQS,QAAQ1B,iBAKpF,cAAC,IAAM+F,SAAP,YChBGssB,GAvBuB,kBACpC,cAAC,EAAD,UACE,eAAC,EAAD,CAAwBz1B,MAAM,2CAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,iCAAiCC,KAAK,iBAChE,eAAC,GAAD,WACE,yFAEA,2FACwD,IACtD,mBAAGnI,KAAK,8EAAR,2DAEK,IAJP,qDAQA,yCACU,cAAC,IAAD,CAAM0H,GAAIlH,EAAmBG,UAA7B,wBADV,gBCiCO2yB,GAhD0B,WACvC,IAAMl0B,EAAWkH,cAGjB,OACE,eAAC,EAAD,CAAwB1I,MAAM,iCAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,4BAA4BC,KAAK,iBAC3D,eAAC,GAAD,WACE,wJAIA,iEACA,+BACE,6BACE,+DAEF,6BACE,oGAEF,6BACE,kHAIJ,8BACE,mBAAGnI,KAAK,iDAAiDoQ,OAAO,SAASnQ,IAAI,sBAA7E,wBAEK,IAHP,8CAOA,wEAC0C,IACxC,wBAAQL,UAAU,iBAAiBG,QA/BrB,kBAAMX,EAASoB,EAAmBC,SA+BhD,mCAFF,cCIF8yB,GAA8BpF,aAAW,CAC7CC,iBAD6C,YAE3C,MAAO,CACL5rB,MAFkC,EAAnBA,OAEC,GAChBsa,SAHkC,EAAZA,UAGA7f,QAAQC,IAAI,sBAGtCyxB,iBAAkBzC,OAAa0C,MAAM,CACnCpsB,MAAO0pB,OACJ1pB,MAAM,6FACNoY,SAAS,+CAEdmU,aAZ6C,SAYhCC,EAZgC,GAYJ,IAAlBE,EAAiB,EAAjBA,cACrBF,EACGlS,SAASkS,GACT5yB,MAAK,WACJ8yB,GAAc,MAEflyB,OAAM,WACLkyB,GAAc,QAnBcf,EAjCT,SAAC,GAAD,IAAG/jB,EAAH,EAAGA,OAAQD,EAAX,EAAWA,QAAS4kB,EAApB,EAAoBA,aAAc1kB,EAAlC,EAAkCA,YAAa8kB,EAA/C,EAA+CA,cAAeH,EAA9D,EAA8DA,OAA9D,OACzB,qBAAKpvB,UAAU,oCAAf,SACE,eAAC,KAAD,CAAMid,YAAU,EAAhB,UACGyS,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ3H,OAAS6H,EAAc,EAChE,cAAC,GAAD,CAAmBD,OAAQA,IACzB,KACJ,cAAC,GAAD,CACED,QAASA,EACTC,OAAQA,EACRlC,KAAK,gBACLxJ,GAAG,QACH2L,YAAaA,IAEf,cAAC,IAAD,CACEtM,KAAK,QACL4E,KAAK,QACLjE,GAAG,QACH80B,aAAa,MACbjpB,MAAOykB,EAAOxsB,MACdyH,SAAU,SAACR,GAAD,OAAO0lB,EAAc,QAAS1lB,EAAE2G,OAAO7F,QACjD7M,MAAO0M,EAAO5H,OAAS2H,EAAQ3H,OAAS6H,EAAc,IAEvDD,EAAO5H,OAAS2H,EAAQ3H,OAAS6H,EAAc,GAAK,cAAC,IAAD,UAAsBD,EAAO5H,QAClF,cAAC,IAAD,CACEzE,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBK,yBAC5DnE,QAASgvB,YA8BjBwE,GAA4B/qB,UAAY,CACtChG,MAAOiG,IAAUC,OACjBoU,SAAUrU,IAAUyS,MAGPqY,UCrDfrH,KAAcA,KAAY,UAAWF,IAGrC,IAqFMyH,GAA6BtF,aAAW,CAC5CC,iBAD4C,YAE1C,MAAO,CACLuD,OAFoE,EAArDA,QAEG,GAClBC,KAHoE,EAA7CA,MAGT,GACd1vB,SAJoE,EAAvCA,UAIP,GACtBqsB,gBALoE,EAA7BA,iBAKH,GACpCzR,SANoE,EAAZA,SAOxD4W,qBAAqB,EACrBC,2BAA4B,GAC5BC,0BAA0B,IAG9BjF,iBAAkBzC,OAAa0C,MAAM,CACnC1sB,SAAUgqB,OACP2C,IAAI,EAAG,8CACPjU,SAAS,wBACTkU,QAAQ5G,GAA4Bld,IACvCujB,gBAAiBrC,OACdF,QAAQE,KAAQ,YAAa,uBAC7BtR,SAAS,kCAEdmU,aAtB4C,SAsB/BC,EAtB+B,GAsBuB,IAA5CG,EAA2C,EAA3CA,cAAeD,EAA4B,EAA5BA,cAAeE,EAAa,EAAbA,UAC7CyE,EAAOvE,OAAOwE,OAClB,GACA,CACEnC,OAAQ3C,EAAO2C,OACfC,KAAM5C,EAAO4C,KACb1vB,SAAU8sB,EAAO9sB,SACjBqsB,gBAAiBS,EAAOT,kBAGtBwF,EAAkB,WACtB3E,IACAD,EAAc,WAAY,IAC1BA,EAAc,kBAAmB,IACjCD,GAAc,IAEhBF,EACGlS,SAAS+W,GACTz3B,MAAK,SAACC,GACmB,MAApBA,EAASC,QACX6yB,EAAc,4BAA4B,MAG7CnyB,OAAM,SAACg3B,GACsB,MAAxBA,EAAI33B,SAASC,QACfy3B,IACA5E,EAAc,uBAAuB,IACJ,MAAxB6E,EAAI33B,SAASC,SACtBy3B,IACA5E,EAAc,eAAe,GAC7BA,EAAc,qBAAsBnkB,UApDXmjB,EArFT,SAAC,GAAD,IAAGa,EAAH,EAAGA,OAAQ5kB,EAAX,EAAWA,OAAQD,EAAnB,EAAmBA,QAAS4kB,EAA5B,EAA4BA,aAAcI,EAA1C,EAA0CA,cAA1C,OACxB,sBAAKvvB,UAAU,iBAAf,UACE,cAAC,GAAD,CAA4Bic,cAAemT,EAAOR,YAAa1S,cAAekT,EAAOuC,qBACpFvC,EAAO0E,oBACN,sBAAK9zB,UAAU,uBAAf,UACE,oBAAIA,UAAU,mBAAd,4CACA,wHACA,4DAC6B,cAAC,IAAD,CAAM8H,GAAIusB,EAAKhyB,QAAQC,SAASG,OAAhC,kBAD7B,UAKF,cAAC,IAAM0E,SAAP,IAEDioB,EAAO4E,yBACN,gCACE,gEACA,uBACA,cAAC,IAAD,CAAMlsB,GAAIusB,EAAKxzB,OAAQb,UAAU,iCAAjC,wBAKF,cAAC,IAAMmH,SAAP,KAE8B,IAA/BioB,EAAO0E,sBAAqE,IAApC1E,EAAO4E,yBAC9C,8BACE,eAAC,KAAD,CAAM/W,YAAU,EAAhB,UACGyS,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQjI,UAAYiI,EAAQokB,gBAC7D,cAAC,GAAD,CAAmBnkB,OAAQA,IACzB,KACJ,qBAAKxK,UAAU,MAAf,SACE,sBAAKA,UAAU,iBAAf,UACE,cAAC,GAAD,CAA4BuK,QAASA,EAASC,OAAQA,EAAQlC,KAAK,eAAexJ,GAAG,aACrF,cAAC,IAAD,CACEX,KAAK,WACL4E,KAAK,WACLjE,GAAG,WACHhB,MAAO0M,EAAOlI,UAAYiI,EAAQjI,SAClCqI,MAAOykB,EAAO9sB,SACd+H,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,UAErDH,EAAOlI,UAAYiI,EAAQjI,UAAY,cAAC,IAAD,UAAsBkI,EAAOlI,gBAGzE,qBAAKtC,UAAU,MAAf,SACE,sBAAKA,UAAU,kBAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,mBACLxJ,GAAG,oBAEL,cAAC,IAAD,CACEX,KAAK,WACL4E,KAAK,kBACLjE,GAAG,kBACHhB,MAAO0M,EAAOmkB,iBAAmBpkB,EAAQokB,gBACzChkB,MAAOykB,EAAOT,gBACdtkB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,kBAAmB1lB,EAAE2G,OAAO7F,UAE5DH,EAAOmkB,iBAAmBpkB,EAAQokB,iBACjC,cAAC,IAAD,UAAsBnkB,EAAOmkB,uBAInC,qBAAK3uB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBM,wBAC5DpE,QAASgvB,aAOnB,cAAC,IAAMhoB,SAAP,UAgES0sB,MAEfA,GAA2BjrB,UAAY,CACrCmpB,OAAQlpB,IAAUC,OAClBkpB,KAAMnpB,IAAUC,OAChBoU,SAAUrU,IAAUyS,MCvKtB,IAAMgZ,GAAuB,uCAAG,WAAOL,GAAP,eAAAt0B,EAAA,6DAC1B40B,EAD0B,UACR9d,uBAAqBC,MAAM6P,QADnB,OAC4BtiB,EAAgBK,yBAD5C,kBAEvB0N,KAAM2U,KAAK4N,EAAc,CAAE3xB,MAAOqxB,IAAQ72B,OAAM,SAAC6V,GAMtD,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,yCACrB0S,WAAY,CAAE1P,MAAOqxB,KAEjBhhB,MARsB,2CAAH,sDAYvBuhB,GAAsB,uCAAG,WAAOP,GAAP,iBAAAt0B,EAAA,6DACvB40B,EADuB,UACL9d,uBAAqBC,MAAM6P,QADtB,OAC+BtiB,EAAgBM,wBACtE4N,EAAO,CACX4f,OAAQkC,EAAKlC,OACbC,KAAMiC,EAAKjC,KACX1vB,SAAU2xB,EAAK3xB,SACfqsB,gBAAiBsF,EAAKtF,gBACtB/rB,MAAOqxB,EAAKrxB,OAPe,kBAUtBoP,KAAM2U,KAAK4N,EAAcpiB,GAAM/U,OAAM,SAAC6V,GAM3C,MALA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,wCACrB0S,WAAY,CAAEyf,OAAQkC,EAAKlC,OAAQnvB,MAAOqxB,EAAKrxB,SAE3CqQ,MAhBqB,2CAAH,sDCkCbwhB,GAvCiB,WAC9B,IAAMj1B,EAAWkH,cACjB,EAAsCH,oBAAS,GAA/C,mBAAOqoB,EAAP,KAAoBiC,EAApB,KAiBA,OACE,eAAC,IAAM1pB,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,kBAAkBC,KAAK,iBACjD,cAAC,GAAD,UACE,eAAC,EAAD,CAAwBvK,MAAM,+BAA9B,UACE,cAAC,GAAD,CAA4Bie,cAAe2S,IAC3C,2IAGA,cAAC,GAAD,CAA6B1R,SAxBhB,SAACkS,GACpB,IAAMsF,EAAUJ,GAAwBlF,EAAOxsB,OAW/C,OAVA8xB,EACGl4B,MAAK,SAACC,GACmB,MAApBA,EAASC,QACX8C,EAASoB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQC,SAASI,cAGlFtF,OAAM,WACLyzB,GAAe,MAGZ6D,cCsBIC,GAvCgB,WAC7B,IAAMn1B,EAAWkH,cACjB,EAA4BH,qBAA5B,mBAAOwrB,EAAP,KAAe6C,EAAf,KACA,EAAwBruB,qBAAxB,mBAAOyrB,EAAP,KAAa6C,EAAb,KACA,EAAuBhD,cAAhBC,EAAP,oBAaA,OAXAnrB,qBAAU,WACR,IAAMmuB,EAAgBhD,EAAal1B,IAAI,UACjCm4B,EAAcjD,EAAal1B,IAAI,QACrCg4B,EAAUE,GACVD,EAAQE,GAEHD,GAAkBC,GACrBv1B,EAASoB,EAAmBG,aAE7B,IAGD,eAAC,IAAMoG,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,wBAC1B,cAAC,GAAD,UACE,cAAC,EAAD,CAAwBtK,MAAM,8BAA9B,SACG+zB,GAAUC,GACT,cAAC,GAAD,CACED,OAAQA,EACRC,KAAMA,EACN9U,SAAU,SAACkS,GAAD,OAAYoF,GAAuBpF,cCkDrD4F,GAAsBzG,aAAW,CACrCC,iBAAkB,kBAAuC,CACvDyC,mBADgB,EAAGA,mBAEnB/T,SAFgB,EAAuBA,SAGvCgB,UAAW,GACXC,SAAU,GACVyQ,aAAa,IAEfG,iBAAkBzC,OAAa0C,MAAM,CACnC9Q,UAAWoO,OAAatR,SAAS,0CACjCmD,SAAUmO,OAAatR,SAAS,2CAElCmU,aAAc,SAACC,EAAD,GAA+C,IAApCE,EAAmC,EAAnCA,cAAeC,EAAoB,EAApBA,cACtCH,EACGlS,SAASkS,EAAOlR,UAAWkR,EAAOjR,UAClC3hB,MAAK,SAACC,GACmB,MAApBA,EAASC,OACX0yB,EAAO6B,mBAAmB7B,EAAOlR,UAAWkR,EAAOjR,WAEnDoR,EAAc,eAAe,GAC7BD,GAAc,OAGjBlyB,OAAM,WACLkyB,GAAc,GACdC,EAAc,eAAe,QAzBThB,EArEL,SAAC,GAA2E,IAAzE/jB,EAAwE,EAAxEA,OAAQD,EAAgE,EAAhEA,QAAS6kB,EAAuD,EAAvDA,OAAQD,EAA+C,EAA/CA,aAAc1kB,EAAiC,EAAjCA,YAAa8kB,EAAoB,EAApBA,cAC5E,OACE,eAAC,KAAD,CAAMtS,YAAU,EAAhB,UACE,cAAC,GAAD,CAA4BhB,cAAemT,EAAOR,cACjDc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAc,GAAKF,EAAQ2T,WAAa3T,EAAQ4T,SACjF,cAAC,GAAD,CAAmB3T,OAAQA,IACzB,KAEJ,qBAAKxK,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,aACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACLjE,GAAG,YACH6L,MAAOykB,EAAOlR,UACd7T,SAAU,SAACR,GAAD,OAAO0lB,EAAc,YAAa1lB,EAAE2G,OAAO7F,QACrDH,OAAQA,EAAO0T,WAAa3T,EAAQ2T,WAAazT,EAAc,IAEhED,EAAO0T,WAAa3T,EAAQ2T,WAAazT,EAAc,GACtD,cAAC,IAAD,UAAsBD,EAAO0T,iBAKnC,qBAAKle,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,GAAD,CACEuK,QAASA,EACTC,OAAQA,EACRlC,KAAK,YACLxJ,GAAG,WACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,WACLjE,GAAG,WACH6L,MAAOykB,EAAOjR,SACd9T,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,QACpDH,OAAQA,EAAO2T,UAAY5T,EAAQ4T,UAAY1T,EAAc,IAE9DD,EAAO2T,UAAY5T,EAAQ4T,UAAY1T,EAAc,GACpD,cAAC,IAAD,UAAsBD,EAAO2T,gBAKnC,qBAAKne,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,cAAC,IAAD,CACE7B,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBe,qBAC5D7E,QAASgvB,IAEX,cAAC,IAAD,CAAMnvB,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,2CAuCVi0B,GAAoBpsB,UAAY,CAC9BqoB,mBAAoBpoB,IAAUyS,KAAKvS,WACnCmU,SAAUrU,IAAUyS,KAAKvS,YAGZisB,UCvDAC,GArDa,WAC1B,IAAMz1B,EAAWkH,cACjB,EAAkCH,qBAAlC,mBAAO2X,EAAP,KAAkBgX,EAAlB,KACA,EAAgC3uB,qBAAhC,mBAAO4X,EAAP,KAAiBgX,EAAjB,KACA,EAA4C5uB,qBAA5C,mBAAO6uB,EAAP,KAAuBC,EAAvB,KACMzX,EAAcC,qBAAWC,IAE/BnX,qBAAU,WACR,IAAM+tB,EAAUnH,IAAsB,GAEtCmH,EACGl4B,MAAK,SAACmR,GACLunB,EAAavnB,EAAOwE,KAAK+L,WACzBiX,EAAYxnB,EAAOwE,KAAKgM,aAEzB/gB,OAAM,eAETi4B,EAAkBX,KACjB,IAUH,OACE,eAAC,EAAD,WACE,cAAC,EAAD,CAAqBpsB,KAAK,cAAcC,KAAK,iBAC7C,cAAC,EAAD,CAAwBvK,MAAM,6BAC9B,cAAC,GAAD,eACsBkJ,IAAnBkuB,EACC,eAAC,GAAD,CAAwB9pB,QAAS8pB,EAAjC,UACE,qBAAKp1B,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,8BACE,+CACCke,EAFH,IAEeC,SAInB,cAAC,GAAD,CAAqB8S,mBAvBA,SAAC/S,EAAWC,GAEzCP,EAAYI,SAAS,YAAaE,GAClCN,EAAYI,SAAS,WAAYG,GAEjC3e,EAASoB,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQU,KAAKvB,eAkBF0b,SAAU8Q,QAG7E,cAAC,IAAM7mB,SAAP,UCpCKmuB,GAfyB,kBACtC,cAAC,EAAD,UACE,eAAC,EAAD,CAAwBt3B,MAAM,2BAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,8BAA8BC,KAAK,iBAC7D,eAAC,GAAD,WACE,sFAEA,yCACU,cAAC,IAAD,CAAMT,GAAIlH,EAAmBG,UAA7B,wBADV,gBC0BOw0B,GAzBgB,kBAC7B,eAAC,IAAD,WACE,cAAC,IAAD,CAAO9I,KAAM4H,EAAKhyB,QAAQC,SAASC,OAAQvD,QAAS,cAAC,GAAD,MACpD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQC,SAASE,iBAAkBxD,QAAS,cAAC,GAAD,MAC9D,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQW,eAAgBhE,QAAS,cAAC,GAAD,MACnD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQY,yBAA0BjE,QAAS,cAAC,GAAD,MAC7D,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQO,MAAML,OAAQvD,QAAS,cAAC,GAAD,MACjD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQO,MAAMpB,aAAcxC,QAAS,cAAC,GAAD,MACvD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQO,MAAMxB,WAAYpC,QAAS,cAAC,GAAD,MACrD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQQ,MAAMN,OAAQvD,QAAS,cAAC,GAAD,MACjD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQS,QAAQP,OAAQvD,QAAS,cAAC,GAAD,MACnD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQS,QAAQ1B,WAAYpC,QAAS,cAAC,GAAD,MACtD+tB,GAAUoD,sBAAoBC,qBAAqB1E,KAClD,cAAC,IAAD,CAAOe,KAAM4H,EAAKhyB,QAAQU,KAAKR,OAAQvD,QAAS,cAAC,GAAD,WAC9CkI,EACH6lB,GAAUoD,sBAAoBC,qBAAqB1E,KAClD,cAAC,IAAD,CAAOe,KAAM4H,EAAKhyB,QAAQU,KAAKvB,aAAcxC,QAAS,cAAC,GAAD,WACpDkI,EACJ,cAAC,IAAD,CAAOulB,KAAM4H,EAAKhyB,QAAQC,SAASG,OAAQzD,QAAS,cAAC,GAAD,MACpD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQC,SAASK,MAAO3D,QAAS,cAAC,GAAD,MACnD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQC,SAASI,UAAW1D,QAAS,cAAC,GAAD,MACvD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKhyB,QAAQrB,KAAMhC,QAAS,cAAC,GAAD,UCtCvCw2B,GAA8B,kBAClC,eAAC,IAAMruB,SAAP,WACE,iEACA,iNAKA,qLAKA,wNAKA,2KAKA,uIAEA,gDACiB,mBAAG/G,KAAK,kCAAR,mCAGjB,oDAEA,uIC0DEq1B,GAA+BlH,aAAW,CAC9CC,iBAD8C,YAE5C,MAAO,CACLd,oBAFuD,EAAxCA,oBAGfgI,gBAHuD,EAAnBA,kBAMxC3G,iBAAkBzC,OAAa0C,MAAM,CACnCtB,oBAAqBpB,OAClBqJ,WACA3a,SACC,2GAGAmU,aAdwC,SAc3BC,EAd2B,GAcC,OAAD,2GAAjBE,EAAiB,EAAjBA,gBACb,GAD8B,SAEtCF,EAAOsG,gBAAgBtG,EAAO1B,qBAFQ,+CAdXa,EA5Ed,SAAC,GASjB,IARLa,EAQI,EARJA,OACA5kB,EAOI,EAPJA,OACAD,EAMI,EANJA,QACA4kB,EAKI,EALJA,aACAI,EAII,EAJJA,cACAqG,EAGI,EAHJA,aACAnrB,EAEI,EAFJA,YAGIorB,GADA,EADJC,QAEkBvZ,IAAMwZ,aAClBC,EAAsBzZ,IAAMrR,OAAO,GAczC,OAZAvE,qBAAU,WACJ+oB,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAcurB,EAAoB7qB,UACtE6qB,EAAoB7qB,QAAUV,EACbwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACqL,EAAQqrB,EAAaprB,EAAaurB,IAEtCrvB,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,uBAAM8d,SAAUiS,EAAhB,UACE,qBAAKlkB,IAAK4qB,IACTnG,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAc,GAAKF,EAAQmjB,qBAAuB,cAAC,GAAD,IACrF,cAAC,GAAD,CACEhjB,IAAI,KACJH,QAASA,EACTC,OAAQA,EACRlC,KAAK,4EACLxJ,GAAG,wBAGL,qBAAKA,GAAG,sBAAR,SACE,gCACE,cAAC,IAAD,CACEiE,KAAK,sBACL4H,MAAOykB,EAAO1B,oBACd9iB,QAAS,CACP,CACEC,MAAO,iEACPF,OAAO,GAET,CACEE,MAAO,uEACPF,OAAO,IAGXN,SAAU,SAACR,GAAD,OAAO0lB,EAAc,sBAAuB1lB,IACtD/L,MAAO0M,EAAOkjB,qBAAuBnjB,EAAQmjB,qBAAuBjjB,EAAc,IAEnFD,EAAOkjB,qBAAuBnjB,EAAQmjB,qBAAuBjjB,EAAc,GAC1E,cAAC,IAAD,UAAsBD,EAAOkjB,2BAKnC,uBACA,uHACA,uBAEA,qBAAK1tB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,cAAC,IAAD,CAAQ7B,KAAK,SAAS6B,UAAWC,IAAc0a,QAAU,eAAgBpF,SAAUqgB,EAAnF,uCA6BVH,GAA6B7sB,UAAY,CACvC8kB,oBAAqB7kB,IAAUwS,KAC/Bqa,gBAAiB7sB,IAAUyS,KAAKvS,YC3FlCujB,KAAcA,KAAY,UAAWF,IAGrC,IA2IM+J,GAA+B5H,aAAW,CAC9CC,iBAD8C,YAE5C,MAAO,CACLtQ,UAF8G,EAA/FA,WAES,GACxBC,SAH8G,EAApFA,UAGJ,GACtB+I,aAJ8G,EAA1EA,cAIN,GAC9B5kB,SAL8G,EAA5DA,UAK5B,GACtBqsB,gBAN8G,EAAlDA,iBAMxB,GACpC+G,gBAP8G,EAAjCA,gBAQ7EU,aAR8G,EAAhBA,cAQhE,OAGlCrH,iBAAkBzC,OAAa0C,MAAM,CACnC9Q,UAAWoO,OAAatR,SAAS,2CACjCmD,SAAUmO,OAAatR,SAAS,0CAChCkM,aAAcoF,OACX1pB,MAAM,6FACNoY,SAAS,8CACZ1Y,SAAUgqB,OACPtR,SAAS,yCACTuR,KAAK,WAAYnhB,IAA2C,SAACT,GAAD,O/BnK7B,SAACA,GAErC,OAAwB,KAFgD,2DAE7B,KAAVA,QAA0BzD,IAAVyD,IAK1B,OADHA,EAAM5O,MAAMusB,I+B6J4C+N,CAAuB1rB,GAAO,MACxGgkB,gBAAiBrC,OACdF,QACCE,KAAQ,YACR,wFAEDtR,SAAS,mDAEdmU,aA5B8C,SA4BjCC,GACXA,EAAOsG,gBAAgB,CACrBxX,UAAWkR,EAAOlR,UAClBC,SAAUiR,EAAOjR,SACjB+I,aAAckI,EAAOlI,aACrB5kB,SAAU8sB,EAAO9sB,SACjBqsB,gBAAiBS,EAAOT,oBAlCOJ,EA3Id,SAAC,GAA2E,IAAzE/jB,EAAwE,EAAxEA,OAAQD,EAAgE,EAAhEA,QAASqrB,EAAuD,EAAvDA,aAAcxG,EAAyC,EAAzCA,OAAQ3kB,EAAiC,EAAjCA,YAAa8kB,EAAoB,EAApBA,cACxEsG,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GACnCorB,EAAiB9rB,EAAO0T,WAAa3T,EAAQ2T,WAAazT,EAAc,EACxE8rB,EAAgB/rB,EAAO2T,UAAY5T,EAAQ4T,UAAY1T,EAAc,EACrE+rB,EAAahsB,EAAO0c,cAAgB3c,EAAQ2c,cAAgBzc,EAAc,EAC1EgsB,EAAgBjsB,EAAOlI,UAAYiI,EAAQjI,UAAYmI,EAAc,EACrEisB,EAAuBlsB,EAAOmkB,iBAAmBpkB,EAAQokB,iBAAmBlkB,EAAc,EAchG,OAZA9D,qBAAU,WACJ+oB,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAcurB,EAAoB7qB,UACtE6qB,EAAoB7qB,QAAUV,EACbwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACqL,EAAQqrB,EAAaprB,EAAaurB,IAEtCrvB,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,eAAC,KAAD,CAAM6d,YAAU,EAAhB,UACE,qBAAKhS,IAAK4qB,IACTnG,OAAOC,KAAKnlB,GAAQpC,OAAS,GAC5BqC,EAAc,GACdF,EAAQ2T,WACR3T,EAAQ4T,UACR5T,EAAQ2c,cACR3c,EAAQjI,UACRiI,EAAQokB,iBAAmB,cAAC,GAAD,IAE7B,cAAC,GAAD,CACEpkB,QAASA,EACTC,OAAQA,EACRlC,KAAK,aACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL5E,KAAK,OACLW,GAAG,YACH80B,aAAa,MACb91B,MAAOw4B,EACP3rB,MAAOykB,EAAOlR,UACd7T,SAAU,SAACR,GAAD,OAAO0lB,EAAc,YAAa1lB,EAAE2G,OAAO7F,UAEtD2rB,GAAkB,cAAC,IAAD,UAAsB9rB,EAAO0T,YAEhD,cAAC,GAAD,CACE3T,QAASA,EACTC,OAAQA,EACRlC,KAAK,YACLxJ,GAAG,WACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,WACL5E,KAAK,OACLW,GAAG,WACHhB,MAAOy4B,EACP3C,aAAa,MACbjpB,MAAOykB,EAAOjR,SACd9T,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,UAErD4rB,GAAiB,cAAC,IAAD,UAAsB/rB,EAAO2T,WAE/C,cAAC,GAAD,CACE5T,QAASA,EACTC,OAAQA,EACRlC,KAAK,gBACLxJ,GAAG,eACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,eACL5E,KAAK,OACLW,GAAG,eACHhB,MAAO04B,EACP5C,aAAa,MACbjpB,MAAOykB,EAAOlI,aACd7c,SAAU,SAACR,GAAD,OAAO0lB,EAAc,eAAgB1lB,EAAE2G,OAAO7F,UAEzD6rB,GAAc,cAAC,IAAD,UAAsBhsB,EAAO0c,eAE5C,cAAC,GAAD,CACE3c,QAASA,EACTC,OAAQA,EACRlC,KAAK,WACLxJ,GAAG,WACH2L,YAAaA,IAGf,cAAC,IAAD,CACE1H,KAAK,WACL5E,KAAK,WACLW,GAAG,WACHhB,MAAO24B,EACP7C,aAAa,MACbjpB,MAAOykB,EAAO9sB,SACd+H,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,UAErD8rB,EAAgB,GAAK,cAAC,IAAD,UAAsBjsB,EAAOlI,WACnD,cAAC,IAAD,yJAKA,cAAC,GAAD,CACEiI,QAASA,EACTC,OAAQA,EACRlC,KAAK,mBACLxJ,GAAG,kBACH2L,YAAaA,IAGf,cAAC,IAAD,CACE1H,KAAK,kBACL5E,KAAK,WACLW,GAAG,kBACHhB,MAAO44B,EACP9C,aAAa,MACbjpB,MAAOykB,EAAOT,gBACdtkB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,kBAAmB1lB,EAAE2G,OAAO7F,UAE5D+rB,GAAwB,cAAC,IAAD,UAAsBlsB,EAAOmkB,kBACtD,cAAC,IAAD,kDAEA,cAAC,IAAD,CAAQxwB,KAAK,SAAS6B,UAAWC,IAAc0a,QAAU,eAAgBpF,SAAUqgB,EAAnF,kBAGA,cAAC,IAAD,CAAQ51B,UAAWC,IAAcC,UAAWC,QAASivB,EAAOgH,aAA5D,4BA8CND,GAA6BvtB,UAAY,CACvCsV,UAAWrV,IAAUC,OACrBqV,SAAUtV,IAAUC,OACpBlG,MAAOiG,IAAUC,OACjBxG,SAAUuG,IAAUC,OACpB6lB,gBAAiB9lB,IAAUC,OAC3B4sB,gBAAiB7sB,IAAUyS,KAAKvS,WAChCqtB,aAAcvtB,IAAUyS,KAAKvS,YCxL/B,IAwGM4tB,GAAiCpI,aAAW,CAChDC,iBADgD,YACyC,IAAtE4D,EAAqE,EAArEA,UAAWtgB,EAA0D,EAA1DA,SAAUhP,EAAgD,EAAhDA,QACtC,MAAO,CACLsvB,UAAWA,GAAa,GACxBtgB,SAAUA,GAAY,GACtBhP,QAASA,GAAW,GACpByR,KALoF,EAAvCA,MAK/B,GACdqiB,mBAAkB9zB,EAClB+zB,aAAc,CAAC,CAAE/zB,QAASA,MAAc,EACxC4yB,gBARoF,EAAjCA,iBAQf,KACpCU,aAToF,EAAhBA,cAStC,OAGlCrH,iBAAkBzC,KAAW,CAC3B8F,UAAW9F,OAAaC,KACtB,QACA,qGACA,SAAC5hB,GAAD,OAAYA,GAAQgiB,GAAuBhiB,MAE7CmH,SAAUwa,OACPtR,SAAS5P,IACTmhB,KAAK,WAAYnhB,GAFV,uCAEiD,WAAOT,GAAP,SAAAhL,EAAA,sEAC1CmV,GAAgBnK,GAD0B,mFAFjD,yDAOZwkB,aA1BgD,SA0BnCC,EA1BmC,GA0BQ,IAAjCE,EAAgC,EAAhCA,cAAeG,EAAiB,EAAjBA,cACpC,GAAuB,KAAnBL,EAAOtsB,QAGT,OAFA2sB,EAAc,UAAW,2CACzBH,GAAc,GACP,EAETF,EAAOsG,gBAAgBtG,GAAQ5yB,MAAK,SAAC20B,GACnC,IAAY,IAARA,EACF,OAAO7B,GAAc,QAlCUf,EAxGd,SAAC,GAUnB,IATLa,EASI,EATJA,OACA5kB,EAQI,EARJA,OACAD,EAOI,EAPJA,QACAglB,EAMI,EANJA,cACA2D,EAKI,EALJA,UAEAC,GAGI,EAJJyC,aAII,EAHJzC,iBACA1oB,EAEI,EAFJA,YACA0kB,EACI,EADJA,aAEI0G,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GACnC4rB,EAAiBvsB,EAAQ6nB,WAAa5nB,EAAO4nB,WAAa3nB,EAAc,EAc9E,OAZA9D,qBAAU,WACJ+oB,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKqC,EAAcurB,EAAoB7qB,UACtE6qB,EAAoB7qB,QAAUV,EACbwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACqL,EAAQqrB,EAAaprB,EAAaurB,IAEtCrvB,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,eAAC,KAAD,CAAM6d,YAAU,EAAhB,UACE,qBAAKhS,IAAK4qB,IACTnG,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQuH,UAAYvH,EAAQzH,SAAW,cAAC,GAAD,IAC1E,cAAC,GAAD,CACEyH,QAASA,EACTC,OAAQA,EACRsQ,eAAe,EACfxS,KAAK,mBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACEtM,KAAK,MACLk0B,QAAQ,YACRtvB,KAAK,YACLjE,GAAG,YACHhB,MAAOg5B,EACPnsB,MAAOykB,EAAOgD,UACd/nB,SAAU,SAACR,GAAD,OAAO0lB,EAAc,YAAa1lB,EAAE2G,OAAO7F,UAEtDmsB,GAAkB,cAAC,IAAD,UAAsBtsB,EAAO4nB,YAChD,cAAC,IAAD,8DAEA,cAAC,GAAD,CACE7nB,QAASA,EACTC,OAAQA,EACR0J,iBAAkB,SAACpC,GACjByd,EAAc,WAAYzd,GAAU,GACpCqhB,EAAgB,YAAY,GAAO,GACnCA,EAAgB,WAAW,GAAO,IAEpCnf,gBAAiB,SAAClR,EAASmwB,GACzB1D,EAAc,OAAQzsB,EAAQyR,MAAM,GACpCgb,EAAc,UAAWzsB,EAAQ2S,cAAc,GAC/C8Z,EAAc,YAAa0D,IAE7Bhf,gBAAiB,SAAC9B,GACZA,EAAKF,SAAmC,IAAxBE,EAAKF,QAAQ7J,QAC/B+qB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAM,GACjCD,EAAU,CAAEphB,SAAU1G,OAEtBmkB,EAAc,gBAAiBpd,EAAKD,QACpCihB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAO,KAGtChf,kBAAmB,SAAChW,GAClBg1B,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAM,GAEpB,aAATh1B,GACF+0B,EAAU,CAAEphB,SAAU1G,KAEX,YAATjN,GACF+0B,EAAU,CAAEphB,SAAU1G,QAI5B,cAAC,IAAD,CACEjN,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBC,UAC5D/D,QAASgvB,EACTnxB,MAAM,WACN+4B,QAAQ,cACRC,KAAK,eAEP,cAAC,IAAD,CAAiB74B,KAAK,SAASgC,QAASivB,EAAOgH,aAA/C,4BAkDNO,GAA+B/tB,UAAY,CACzCwpB,UAAWvpB,IAAUC,OACrBgJ,SAAUjJ,IAAUC,OACpBhG,QAAS+F,IAAUC,OACnB4sB,gBAAiB7sB,IAAUyS,KAAKvS,WAChCqtB,aAAcvtB,IAAUyS,KAAKvS,YC7K/B,IAAMkuB,GAA8B,SAAC,GAAD,IAAGC,EAAH,EAAGA,kBAAmBC,EAAtB,EAAsBA,uBAAtB,OAClC,qCACE,sEACA,wKAICA,OACsBjwB,IAAtBgwB,EACC,cAAC,IAAD,CAAiB/4B,KAAK,SAAS6B,UAAWC,IAAc0a,QAASxa,QAAS+2B,EAA1E,sBAIA,cAAC,IAAM/vB,SAAP,IAEF,6EACA,6BACE,8BACE,sFACA,0HAIJ,wCACS,mBAAG/G,KAAK,oCAAR,wBADT,0FCtBEg3B,GAAyC,WAC7C,IAAM53B,EAAWkH,cAMX2wB,EAHcx7B,SAASkjB,SAGOnQ,MAAMhO,EAAmB5E,UAAU,GAEjEs7B,EAAa,UAAMD,GAAN,OAAwBz2B,EAAmBC,QAE9D,OACE,qCACE,sEACA,4JAIA,qHACA,cAAC,IAAD,CACE1C,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnCxa,QAAS,kBAAMX,EAAS83B,IAH1B,yBClBOC,GAA4B,SAACC,GACxC,IAAI10B,EAAO,UAAM2T,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBC,UAErE,OAAO8N,KAAM2U,KAAK7jB,EAAS00B,GAAkBp6B,OAAM,SAAC6V,GASlD,MARA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,sCACrB0S,WAAY,CACVmlB,eAAgBD,EAAiBl1B,WAAak1B,EAAiB7I,gBAC/D/rB,MAAO40B,EAAiB50B,SAGtBqQ,MCXJykB,GAAgC,WACpC,IAAMl4B,EAAWkH,cACjB,EAAsDH,oBAAS,GAA/D,mBAAOoxB,EAAP,KAA4BC,EAA5B,KACA,EAA0DrxB,oBAAS,GAAnE,mBAAOsxB,EAAP,KAA8BC,EAA9B,KACA,EAAuBjG,cAAhBC,EAAP,oBAsBA,OApBAnrB,qBAAU,YDSyB,SAACorB,EAAQC,GAC5C,IAAIuC,EAAY,UAAM9d,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBE,QAA1D,mBAA4E4tB,EAA5E,iBAA2FC,GAE3G,OAAOhgB,KAAMpV,IAAI23B,GAAcn3B,OAAM,SAAC6V,GAGpC,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,IAClCA,MCVNif,CAHeJ,EAAal1B,IAAI,UACnBhB,OAAOC,SAASk8B,OAAOnpB,MAAM,SAAS,IAGhDpS,MAAK,SAAC2V,GACLylB,EAAuC,MAAhBzlB,EAAKzV,QAC5Bo7B,GAAyB,MAE1B16B,OAAM,WACLw6B,GAAuB,GACvBE,GAAyB,QAE5B,IAEHnxB,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,mCACGy4B,EACC,cAAC,IAAM1wB,SAAP,UACGwwB,EACC,eAAC,IAAMxwB,SAAP,WACE,yDACA,0HACA,cAAC,IAAD,CACEhJ,KAAK,SACL6B,UAAWC,IAAc0a,QAAU,eACnCxa,QAAS,kBAAMX,EAASoB,EAAmBC,SAH7C,wBAQF,eAAC,IAAMsG,SAAP,WACE,2DACA,qFACA,gIACA,sFACwD,IACtD,mBAAG/G,KAAK,oCAAR,wBAFF,YAQN,sFC1DK43B,GAAUp3B,EAAmB5D,aAC7B8C,GAAW,CAAC,GAAD,OACnBk4B,GAAQh3B,MADW,UAEnBg3B,GAAQh3B,KAAOg3B,GAAQ/2B,OAFJ,UAGnB+2B,GAAQh3B,KAAOg3B,GAAQ92B,OAHJ,UAInB82B,GAAQh3B,KAAOg3B,GAAQ72B,OAJJ,UAKnB62B,GAAQh3B,KAAOg3B,GAAQ32B,mBALJ,UAMnB22B,GAAQh3B,KAAOg3B,GAAQ52B,aC0Mb62B,GAlLS,SAACxwB,GACvB,IAAM5L,EAAWq8B,cACX14B,EAAWkH,cACjB,EAAsCH,mBAAS,GAA/C,mBAAOU,EAAP,KAAoBkxB,EAApB,KACA,EAAkC5xB,mBAAS,CAAE6xB,SAAS,EAAOC,UAAU,IAAvE,mBAAOC,EAAP,KAAkBC,EAAlB,KACA,EAAsDhyB,mBAAS,MAA/D,mBAAOmnB,EAAP,KAA4BkD,EAA5B,KACA,EAAkCrqB,mBAAS,IAA3C,mBAAO2X,EAAP,KAAkBgX,EAAlB,KACA,EAAgC3uB,mBAAS,IAAzC,mBAAO4X,EAAP,KAAiBgX,EAAjB,KACA,EAAwC5uB,mBAAS,IAAjD,mBAAO2gB,EAAP,KAAqBsR,EAArB,KACA,EAAgCjyB,mBAAS,IAAzC,mBAAOjE,EAAP,KAAiBm2B,EAAjB,KACA,EAA8ClyB,mBAAS,IAAvD,mBAAOooB,EAAP,KAAwB+J,EAAxB,KACA,EAA8DnyB,oBAAS,GAAvE,mBAAOoyB,EAAP,KAAgCC,EAAhC,KACA,EAA8CryB,oBAAS,GAAvD,mBAAOsyB,EAAP,KAAwBC,EAAxB,KAGMC,EA1BmB,SAACha,GAC1B,IAAIia,EAAcja,EACZka,EAAcla,EAASnQ,MAAM,KACnC,GAA4C,aAAxCqqB,EAAYA,EAAY7wB,OAAS,GAAmB,CACtD,IAAM8wB,EAAoBD,EAAYp8B,QAAQ,YAC9Cm8B,EAAcC,EAAYE,MAAM,EAAGD,EAAoB,GAAGnmB,KAAK,KAGjE,OAAOimB,EAkBiBI,CAAmBv9B,EAASkjB,UAEpDpY,qBAAU,WACJ9K,EAASkjB,WAAane,EAAmB5D,aAAaiE,OACxDk3B,EAAe,KAEhB,CAACt8B,EAASkjB,WAEb,IAiBMsa,GAAqB,uCAAG,WAAOjK,GAAP,iBAAAzvB,EAAA,6DACtB25B,EAAiB,CACrB5L,oBAAqBA,EACrBxP,UAAWA,EACXC,SAAUA,EACVvb,MAAOskB,EACP5kB,SAAUA,EACVqsB,gBAAiBA,EACjB7c,SAAUsd,EAAOtd,SACjBhP,QAASssB,EAAOtsB,QAChBkwB,cAAe5D,EAAO4D,cACtBze,KAAM6a,EAAO7a,KACb0e,UAAW7D,EAAO6D,UAClBsG,gBAAiBnK,EAAOgD,WAbE,kBAgBHmF,GAA0B+B,GAhBvB,OAgBpB78B,EAhBoB,OAiB1B07B,EAAe,GACf34B,EAASu5B,EAAkBn4B,EAAmB5D,aAAaoE,YAC3Dm3B,EAAa,CAAEH,SAAS,EAAMC,UAAU,IAExC5wB,EAAM+xB,0BACJ/xB,EAAM+xB,yBAAyB,CAAE52B,MAAOskB,EAAcuS,iBAAsC,MAApBh9B,EAASC,SACnFo8B,EAAuC,MAApBr8B,EAASC,QAvBF,yDAyB1Bk8B,GAA2B,GAzBD,mBA0BnB,GA1BmB,0DAAH,sDA8BrBc,GAAgB,WACpB,MAAO,CACL/a,YAAa2Z,EAAUF,QACvBxZ,cAAe0Z,EAAUD,SACzBxZ,aAAcka,EAAkBn4B,EAAmB5D,aAAaiE,MAChE6d,WAAYia,EAAkBn4B,EAAmB5D,aAAaoE,WAC9DvF,SAAUA,IAIR89B,GACJ,eAAC,IAAD,WACE,cAAC,IAAD,CAAOlN,KAAK,IAAIztB,QAAS,cAAC,IAAD,CAAU8I,GAAIjM,EAASkjB,SAAWne,EAAmB5D,aAAaiE,UAC3F,cAAC,IAAD,CACEwrB,KAAM7rB,EAAmB5D,aAAaiE,MACtCjC,QACE,eAAC,IAAMmI,SAAP,WACE,cAAC,GAAD,IACA,cAACsuB,GAAD,CACE/H,oBAAqBA,EACrBgI,gBAnEgB,SAACtG,GAC3BwB,EAAuBxB,GACvBmJ,EAAa,CAAEH,SAAS,EAAMC,UAAU,IACxC74B,EAASu5B,EAAkBn4B,EAAmB5D,aAAakE,OAC3Di3B,EAAe,WAqEb,cAAC,IAAD,CACE1L,KAAM7rB,EAAmB5D,aAAakE,MACtClC,QACE,cAAC,GAAD,6BAA2B06B,MAA3B,aACE,cAACvD,GAAD,CACEjY,UAAWA,EACXC,SAAUA,EACV+I,aAAcA,EACd5kB,SAAUA,EACVqsB,gBAAiBA,EACjB+G,gBA5EgB,SAACtG,GAC3B8F,EAAa9F,EAAOlR,WACpBiX,EAAY/F,EAAOjR,UACnBqa,EAAgBpJ,EAAOlI,cACvBuR,EAAYrJ,EAAO9sB,UACnBo2B,EAAmBtJ,EAAOT,iBAC1BwJ,EAAe,GACf34B,EAASu5B,EAAkBn4B,EAAmB5D,aAAamE,QAsEjDi1B,aAAc,WACZ+B,EAAe,GACf34B,GAAU,WAOpB,cAAC,IAAD,CACEitB,KAAM7rB,EAAmB5D,aAAamE,MACtCnC,QACE,eAAC,GAAD,6BAA2B06B,MAA3B,cACE,cAAC,GAAD,CAA4Bzd,cAAe0c,IAC3C,cAAChC,GAAD,CACEjB,gBAAiB2D,GACjBjD,aAAc,WACZ+B,EAAe,GACf34B,GAAU,YAMpB,cAAC,IAAD,CACEitB,KAAM7rB,EAAmB5D,aAAaoE,WACtCpC,QACE,cAAC,GAAD,6BAA2B06B,MAA3B,cACuB,IAApBb,EACC,cAAC,GAAD,IAEA,cAAC,GAAD,CACE3B,kBAAmBzvB,EAAMyvB,kBAAoBzvB,EAAMyvB,uBAAoBhwB,EACvEiwB,uBAAwB1vB,EAAM0vB,uBAAyB1vB,EAAM0vB,4BAAyBjwB,SAMhG,cAAC,IAAD,CAAOulB,KAAM7rB,EAAmB5D,aAAaqE,kBAAmBrC,QAAS,cAAC,GAAD,MACzE,cAAC,IAAD,CACEytB,KAAK,IACLztB,QAAS,cAAC,IAAD,CAAU8I,GAAIlH,EAAmB5D,aAAagE,KAAOJ,EAAmB5D,aAAaiE,aAMpG,OAAO8rB,GAAUoD,sBAAoBC,qBzC7KA,4ByC8KnC,cAAC,GAAD,IAEA,mCACG7wB,GAAoBsQ,SAAShU,EAASkjB,SAAS7H,eAC9C,cAAC,GAAD,CACE8K,mBAAoB,kBAAM/a,EAAc,GACxC8a,eDlMoB,0BCmMpBD,cAAc,eACd9a,WAAY,EACZC,YAAaA,EALf,SAMG0yB,KAGH,qCACE,cAAC,EAAD,CAAsB3yB,WAAY,EAAGC,YAAaA,IACjD0yB,SC3MPC,I,cCiFWrL,aAAW,CACxBC,iBAAkB,SAAC/mB,GAAD,OAAWA,GAC7B0nB,aAFwB,SAEXC,EAAQyK,GACnBA,EAAIpyB,MAAMyV,SAASkS,KAHRb,EAvEc,SAAC,GAAkD,IAAhDqH,EAA+C,EAA/CA,aAAc1X,EAAiC,EAAjCA,UAAWC,EAAsB,EAAtBA,SAAUvb,EAAY,EAAZA,MAC3DpD,EAAWkH,cAOjB,OACE,eAAC,IAAMS,SAAP,WACE,qBAAKnH,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,iEACA,eAAC,IAAD,CAAgBA,UAAWqa,IAAaC,QAAxC,UACE,gCACE,+BACE,uCACA,uCACA,6CAGJ,kCACE,+BACE,4CACA,6BAAK4D,IACL,0BAEF,+BACE,2CACA,6BAAKC,IACL,0BAEF,+BACE,+CACA,6BAAKvb,IACL,6BACE,cAAC,IAAD,CAAMkF,GAAIusB,EAAKhyB,QAAQrB,KAAOqzB,EAAKhyB,QAAQO,MAAML,OAAQvE,MAAM,uBAA/D,SACE,cAAC,KAAD,CAAWA,MAAO,8BAM5B,yCACW,IACT,wBAAQgC,UAAU,iBAAiBG,QA3C7B,WACd,IAAM25B,EAAW,UAAMrjB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBI,gBAC3EwC,cAAYC,QAAQmrB,QAAQ6H,GAC5Bt6B,EAAS60B,EAAKxzB,SAwCN,8BAMN,cAAC,KAAD,UACE,qBAAKb,UAAU,MAAf,SACE,qBAAKA,UAAU,SAAf,SACE,cAAC,IAAD,CAAQ7B,KAAK,SAAS6B,UAAWC,IAAc0a,QAAU,eAAgBpF,SAAUqgB,EAAnF,iC,ODhEE,MACVmE,GAAiB,KA+INC,GA7IiB,WAG9B,IA6CMC,EAAa,WACbL,KAEFM,cAAcN,GAAQO,qBACtBD,cAAcN,GAAQQ,mBAGtBR,GAAQS,eAAerqB,SAAQ,SAACsqB,GAC9B1+B,OAAO2+B,oBAAoBD,EAAOE,MAGpCZ,GAAU,OAYRY,EAAe,WACfZ,KACFA,GAAQa,gBAAkB1jB,OAEtB6iB,GAAQc,SACVC,IACAf,GAAQc,QAAS,KAKjBC,EAAoB,WACxB,GAAIf,KAAmC,IAAxBA,GAAQgB,YAAuB,CACxChB,GAAQa,gBAAkBb,GAAQiB,WAEpCjB,GAAQiB,UAAYjB,GAAQa,gBAE5BV,GAAee,mBAIflB,GAAQc,QAAS,EAInB,IAAMK,EAAchkB,OAAW6iB,GAAQiB,UAGnCE,GAAenB,GAAQoB,UACzBf,IACAF,GAAekB,oBAGRF,GAAenB,GAAQoB,SAAWpB,GAAQsB,kBAEjDtB,GAAQgB,aAAc,EACtBhB,GAAQuB,mBAAqBvB,GAAQsB,gBAAkB,IAGvDtB,GAAQQ,kBAAoBgB,YAAYC,EAA0B,QAMlEA,EAA2B,WAC/BzB,GAAQuB,qBAEJvB,GAAQuB,mBAAqB,GAC/BlB,IACAF,GAAekB,oBAGflB,GAAeuB,gBAAgB1B,GAAQuB,mBAAqB,IAMhE,MAAO,CACLI,WAAY,SAAC3wB,GAAD,OAAcmvB,GAAiBnvB,GAC3C4wB,MAAO,kBAjIY,WACnB,GAAsB,MAAlBzB,IAAqC,MAAXH,GAAiB,CAC7C,IAAM6B,EAAM1kB,QAEZ6iB,GAAU,CACRc,QAAQ,EACRE,aAAa,EACbO,mBAAoB,EACpBH,SAAUjkB,KAAOikB,SAAP,MAAAjkB,KAAM,YAAagjB,GAAeiB,WAC5CU,UAAW3kB,KAAOikB,SAAP,MAAAjkB,KAAM,YAAagjB,GAAe2B,YAC7CR,gBAAiBnkB,KAAOikB,SAAP,MAAAjkB,KAAM,YAAagjB,GAAemB,kBACnDL,UAAWY,EACXhB,gBAAiBgB,EACjBpB,eAAgBN,GAAeM,iBAIrBA,gBACVT,GAAQS,eAAerqB,SAAQ,SAACsqB,GAC9B1+B,OAAOS,iBAAiBi+B,EAAOE,MAKnCZ,GAAQO,oBAAsBiB,YAAYT,EAAmBf,GAAQ8B,UAAUC,mBAyGpEC,IACbC,QAAS,WApGLjC,IAAWA,GAAQgB,cACrBhB,GAAQgB,aAAc,EACtBhB,GAAQuB,mBAAqB,EAE7BvB,GAAQa,gBAAkB1jB,OAG1BmjB,cAAcN,GAAQQ,mBAGtBO,MA2FFmB,OAAQ,kBArER7B,SACAF,GAAiB,OAqEjBgC,IAAK,kBAAM9B,KACX+B,gBAAiB,kBAAMxB,MAxIK,GEgLjByB,GAhKa,SAAC,GAA8D,IAA5DC,EAA2D,EAA3DA,mBAAoBC,EAAuC,EAAvCA,gBAAiBv5B,EAAsB,EAAtBA,MAAON,EAAe,EAAfA,SACnEsb,EAAcC,qBAAWC,IACzBte,EAAWkH,cAEXqoB,EAAmBzC,OAAa0C,MAAM,CAC1CpsB,MAAO0pB,OAAa1pB,QAAQoY,SAAS,8CACrC1Y,SAAUgqB,OAAatR,SAAS,2CAG5BohB,EAAgB,CACpBx5B,MAAOA,GAAS,GAChBN,SAAUA,GAAY,GACtBssB,YAAa,IAGTyN,EAAS,UAAM5lB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBG,eAEnEk4B,EAAyB,WAC7B,IAAMtU,EAAOnhB,cAAYC,QAAQmhB,aACjCrK,EAAYI,SAAS,YAAagK,EAAKE,YACvCtK,EAAYI,SAAS,WAAYgK,EAAKG,aACtC6R,GAAuBwB,QAGnBU,EACFA,IAEA18B,EAASoB,EAAmBG,YAI1Bw7B,EAAU,uCAAG,WAAOnN,GAAP,eAAAzvB,EAAA,6DACjByvB,EAAOR,YAAc,GADJ,kBAIQ/nB,cAAYC,QAAQ01B,kBAAkBpN,EAAOxsB,MAAOwsB,EAAO9sB,SAAU+5B,GAJ7E,OAIT5/B,EAJS,OAKf2yB,EAAO9sB,SAAW,IAEO,IAArB7F,EAASggC,QACXH,IAC6B,MAApB7/B,EAASC,SAClB0yB,EAAOR,YAAc,qFAVR,gDAafQ,EAAO9sB,SAAW,GAEd,KAAG7F,UAAmC,MAAvB,KAAGA,SAASC,OAC7B0yB,EAAOR,YAAc,qFAErBQ,EAAOR,YAAc,iCACrBvxB,QAAQS,MAAR,OAGFsU,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,iCACrB0S,WAAY,CAAE1P,MAAOwsB,EAAOxsB,SAxBf,yDAAH,sDA6BhB,OACE,cAAC,KAAD,CACEmsB,iBAAkBA,EAClBqN,cAAeA,EACfM,oBAAoB,EACpBxf,SAAUqf,EAJZ,SAKG,SAAC90B,GACA,IAAQ2nB,EAAyD3nB,EAAzD2nB,OAAQ5kB,EAAiD/C,EAAjD+C,OAAQD,EAAyC9C,EAAzC8C,QAASglB,EAAgC9nB,EAAhC8nB,cAAeJ,EAAiB1nB,EAAjB0nB,aAC1CwN,EAAgBnyB,EAAO5H,OAAS2H,EAAQ3H,MACxCg6B,EAAmBpyB,EAAOlI,UAAYiI,EAAQjI,SACpD,OACE,eAAC,KAAD,CAAM2a,YAAY,EAAlB,UACGyS,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ3H,OAAS2H,EAAQjI,UAAY,cAAC,GAAD,IACxC,IAA/BotB,OAAOC,KAAKnlB,GAAQpC,QAAgBgnB,EAAOR,aAC1C,cAAC,GAAD,CAAmB/S,YAAY,EAAOvT,KAAM8mB,EAAOR,cAErD,qBAAK5uB,UAAU,MAAf,SACE,qBAAKA,UAAU,aAAf,SACE,yEAGJ,qBAAKA,UAAU,MAAf,SACE,sBAAKA,UAAU,mBAAf,UACE,cAAC,IAAD,CAAqB+a,QAAQ,QAAQC,UAAU,EAAMld,MAAO6+B,EAA5D,mBAGA,cAAC,IAAD,CACE79B,GAAG,QACHX,KAAK,QACL4E,KAAK,QACL4H,MAAOykB,EAAOxsB,MACdyH,SAAU,SAACR,GAAD,OAAO0lB,EAAc,QAAS1lB,EAAE2G,OAAO7F,QACjD7M,MAAO6+B,IAERA,GAAiB,cAAC,IAAD,UAAsBnyB,EAAO5H,aAGnD,qBAAK5C,UAAU,MAAf,SACE,sBAAKA,UAAU,mBAAf,UACE,cAAC,IAAD,CAAqB+a,QAAQ,WAAWC,UAAU,EAAMld,MAAO8+B,EAA/D,sBAGA,cAAC,IAAD,CACE99B,GAAG,WACHX,KAAK,WACL4E,KAAK,WACL4H,MAAOykB,EAAO9sB,SACd+H,SAAU,SAACR,GAAD,OAAO0lB,EAAc,WAAY1lB,EAAE2G,OAAO7F,QACpD7M,MAAO8+B,IAERA,GAAoB,cAAC,IAAD,UAAsBpyB,EAAOlI,gBAGtD,qBAAKtC,UAAU,MAAf,SACE,qBAAKA,UAAU,mBAAf,SACE,cAAC,IAAD,CACE7B,KAAK,SACL0B,IAAKw8B,EACLr8B,UAAWC,IAAc0a,QAAU,eACnCoc,QAAQ,aACR/4B,MAAM,UACNg5B,KAAK,OACL6F,OAAO,UACPC,eAAe,EACf38B,QAASgvB,QAIf,qBAAKnvB,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,4BACE,cAAC,IAAD,CAAM8H,GAAIlH,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQC,SAASG,OAAhF,yCAON,qBAAKzC,UAAU,MAAf,SACE,sBAAKA,UAAU,MAAf,UACE,yDACA,8BACE,cAAC,IAAD,CAAM8H,GAAIq0B,EAAV,qCADF,4NC9HDY,GA/BS,SAAC,GAA4B,IAA1Bb,EAAyB,EAAzBA,mBACrBrgC,EAAWq8B,cAMT8E,EAHcnhC,EAASkjB,SAGKnQ,MAAMhO,EAAmBC,QAAQ,GAG7Ds7B,EAAe,UAAMa,GAAN,OAAsBp8B,EAAmB5D,aAAagE,MAAtD,OAA6DJ,EAAmB5D,aAAaiE,OAElH,OACE,eAAC,EAAD,CAAwBjD,MAAM,uBAA9B,UACGnC,EAASkjB,SAAS7H,gBAAkBtW,EAAmBC,OAAOqW,cAC7D,cAAC,EAAD,CAAqB5O,KAAK,UAAUC,KAAK,iBAEzC,cAAC,IAAMpB,SAAP,IAGF,cAAC,GAAD,UACE,cAAC,GAAD,CAAqB+0B,mBAAoBA,EAAoBC,gBAAiBA,UCrBvEc,OALf,SAAyBx1B,GAEvB,OADA7L,OAAOC,SAASuE,KAAOqH,EAAM5H,IACtB,MCoCMq9B,I,OAhCoB,SAAC,GAAkB,IAAhBpgB,EAAe,EAAfA,SACpC,EAAsCvW,mBAAS,IAA/C,mBAAO42B,EAAP,KAAoBC,EAApB,KAOA,OACE,qBAAKp9B,UAAU,sBAAf,SACE,uBAAMkd,SAPW,SAACrT,GACpBA,EAAEyL,iBACFwH,EAASqgB,IAKP,UACE,uBAAOpiB,QAAQ,SAAf,SACE,oHAEF,cAAC,IAAD,CACE5c,KAAK,SACLW,GAAG,SACH6L,MAAOwyB,EACP9yB,SAAU,SAACR,GAAD,OAAOuzB,EAAevzB,EAAE2G,OAAO7F,UAE3C,cAAC,IAAD,CAAiBxM,KAAK,SAAS6B,UAAWC,IAAc0a,QAAxD,2BCRO0iB,GAfsB,SAAC,GAAD,IAAGC,EAAH,EAAGA,WAAYC,EAAf,EAAeA,WAAYC,EAA3B,EAA2BA,IAA3B,OACnC,uBAAMx9B,UAAU,8CAAhB,qBACW,IACT,iCAAiB,IAARw9B,EAAY,IAAMF,EAAa,IAF1C,KAEwD,IACtD,iCAAiB,IAARE,EAAY,IAAMD,EAAa,IAH1C,MAGyD,IACvD,iCAASC,QCwKEC,I,OAnK2B,SAAC,GAAkC,IAAhCxrB,EAA+B,EAA/BA,QAASyrB,EAAsB,EAAtBA,gBAIpD,EAAsCn3B,mBAAS,GAA/C,mBAAOo3B,EAAP,KAAoBC,EAApB,KACA,EAAkCr3B,mBAAS,WAA3C,mBAAOs3B,EAAP,KAAkBC,EAAlB,KACA,EAA4Cv3B,oBAAS,GAArD,mBAAOw3B,EAAP,KAAuBC,EAAvB,KAEAr3B,qBAAU,WACRi3B,EAAe,KACd,CAAC3rB,IAEJ,IAAMgsB,EAAcx1B,mBAAQ,kBAA0B,IAAnBs1B,EAA2B,OAAS,cAAc,CAACA,IAEtF,EAAuCt1B,mBAAQ,WAC7C,IAAMy1B,EAAS,YAAIjsB,GAASwF,MAAK,SAAC9X,EAAG+X,GACnC,OAAI/X,EAAEk+B,GAAanmB,EAAEmmB,IAAoB,EACrCl+B,EAAEk+B,GAAanmB,EAAEmmB,GAAmB,EACjC,KAELE,GACFG,EAAOC,UAET,IAAMC,EArBe,GAqBPT,EACR5B,EAAMqC,EAtBS,GAsBgBF,EAAO91B,OAAS81B,EAAO91B,OAASg2B,EAtBhD,GAwBrB,MAAO,CAACF,EAAO/E,MAAMiF,EAAOrC,GAAMqC,EAAOrC,KACxC,CAACgC,EAAgBF,EAAW5rB,EAAS0rB,IAbxC,mBAAOU,EAAP,KAAyBD,EAAzB,KAAgCrC,EAAhC,KAeMuC,EAAkB,SAACC,GACnBA,IAAUV,EACZG,GAAmBD,GAEnBD,EAAaS,GAEfX,EAAe,IAaXY,EAAc,SAACC,GAAD,OA9CG,GA8CWA,EAA4BxsB,EAAQ7J,QAEtE,OACE,sBAAKpI,UAAU,8BAAf,UACE,cAAC,GAAD,CAAqBw9B,IAAKa,EAAiBj2B,OAAQk1B,WAAYc,EAAOb,WAAYxB,EAAM,IAExF,qBAAK/7B,UAAU,uCAAf,SACE,eAAC,IAAD,CAAgBA,UAAWqa,IAAaC,QAAxC,UACE,gCACE,+BACE,oBAAIna,QAAS,kBAAMm+B,EAAgB,cAAct+B,UAAyB,cAAd69B,EAA4BI,EAAc,GAAtG,uBAGA,oBAAI99B,QAAS,kBAAMm+B,EAAgB,YAAYt+B,UAAyB,YAAd69B,EAA0BI,EAAc,GAAlG,0BAGA,oBAAI99B,QAAS,kBAAMm+B,EAAgB,YAAYt+B,UAAyB,YAAd69B,EAA0BI,EAAc,GAAlG,qBAGA,oBAAI99B,QAAS,kBAAMm+B,EAAgB,aAAat+B,UAAyB,aAAd69B,EAA2BI,EAAc,GAApG,sBAGClR,GAAUoD,sBAAoBC,qBAAqBzE,KAClD,oBAAIxrB,QAAS,kBAAMm+B,EAAgB,YAAYt+B,UAAyB,YAAd69B,EAA0BI,EAAc,GAAlG,qBAIA,oBAAI99B,QAAS,kBAAMm+B,EAAgB,WAAWt+B,UAAyB,WAAd69B,EAAyBI,EAAc,GAAhG,yBAMN,iCACU,OAAPhsB,QAAO,IAAPA,OAAA,EAAAA,EAAS7J,QAAS,EACjBi2B,EAAiBn2B,KAAI,SAACyF,EAAQ0H,GAAT,OACnB,+BACE,+BACE,sBAAMrV,UAAWqa,IAAaqkB,aAA9B,yBACA,cAAC,IAAD,CACE52B,GAAE,UAAKusB,EAAKjxB,UAAUpC,MAApB,OAA2BqzB,EAAKjxB,UAAUC,QAA1C,YAAqDsK,EAAO+F,UAA5D,YAAyEyJ,mBACzExP,EAAOmZ,UAFX,SAIGnZ,EAAO+F,eAGZ,+BACE,sBAAM1T,UAAWqa,IAAaqkB,aAA9B,4BACC/wB,EAAOgxB,SAAW5nB,KAAOpJ,EAAOgxB,SAASlmB,OAAO,iBAEnD,+BACE,sBAAMzY,UAAWqa,IAAaqkB,aAA9B,uBACC/wB,EAAO6W,WAEV,+BACE,sBAAMxkB,UAAWqa,IAAaqkB,aAA9B,wBACqB,KAApB/wB,EAAO9R,SACJ8R,EAAOixB,WAAalB,EAClB,GACA,kBACF/vB,EAAO9R,YAEZkxB,GAAUoD,sBAAoBC,qBAAqBzE,KAClD,+BACE,sBAAM3rB,UAAWqa,IAAaqkB,aAA9B,uBACC/wB,EAAOkxB,QAAUlxB,EAAOkxB,QAAUlxB,EAAOjR,UAG5C,+BACE,sBAAMsD,UAAWqa,IAAaqkB,aAA9B,sBACC/wB,EAAOjR,YAlCL2Y,MAwCX,6BACE,oBAAIypB,QAAQ,IAAZ,uCAOV,sBAAK9+B,UAAU,cAAf,UACmB,IAAhB29B,GACC,cAAC,IAAD,CACE39B,UAAWC,IAAcC,UACzBC,QAlGsB,kBAAMw9B,EAAc,GAAKC,EAAeD,EAAc,IAmG5E3/B,MAAM,2BAHR,eAOF,eAAC,IAAD,CAAiBgC,UAAWC,IAAcC,UAAWlC,MAAM,eAA3D,kBACQ2/B,EAAc,KAErBa,EAAYb,EAAc,IACzB,cAAC,IAAD,CACE39B,UAAWC,IAAcC,UACzBC,QA3GkB,WAC1B,IAAMs+B,EAAWd,EAAc,EAE3Ba,EAAYC,IACdb,EAAea,IAwGTzgC,MAAM,uBAHR,kBAQJ,qBAAKgC,UAAU,mBC9Jf++B,GAAU,uCAAG,kCAAAp/B,EAAA,0DAC6B,IAA1CkH,cAAYC,QAAQN,kBADP,sBAET,IAAI5G,MAAM,qDAFD,cAKXC,EALW,UAKF4W,uBAAqBC,MAAM6P,QALzB,OAKkC8N,EAAKlvB,oBAClD65B,EANW,iBAMMn4B,cAAYC,QAAQ4f,YAN1B,SAOI1U,KAClBpV,IAAIiD,EAAK,CACRlD,QAAS,CACP8pB,cAAeuY,KAGlB5hC,OAAM,SAAC6V,GAGN,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAWyG,IAClCA,KAhBO,cAOXtF,EAPW,OAmBXsxB,EAAsB5T,GAA4BnjB,KAAI,SAACg3B,GAC3D,IAAI3T,EAAc,YAAO2T,EAAS3T,gBAElC,OADAA,EAAehd,KAAK2wB,EAAS5T,aACtB7U,uBAAqB0oB,yBAAyB5T,GAAgBzsB,MAtBtD,kBAyBV6O,EAAOwE,KACXxB,QAAO,SAACiS,GAAD,OAAeqc,EAAoBpvB,SAAS+S,EAASwc,WAAW3tB,eACvEvJ,KAAI,SAAC0a,GAAD,MAAe,CAClBqE,WAAYrE,EAASqE,WACrBvT,UAAWkP,EAASiE,gBACpB8X,QAAS,IAAIr+B,KAAKsiB,EAASyc,aAC3B7a,QAAS5B,EAAS4B,SAAW,GAC7B9nB,OAAQkmB,EAASlmB,QAAU,GAC3BmiC,QAASjc,EAASic,SAAW,GAC7BhjC,SAAU+mB,EAAS/mB,UAAY,GAC/B+iC,SAAUhc,EAASgc,UAAY,GAC/B5b,UAAWJ,EAASI,YAAc,EAClC8D,QAASlE,EAASkE,SAAW,QArChB,2CAAH,qDC+EDwY,I,OApEiB,WAC9B,MAA8B/4B,mBAAS,IAAvC,mBAAOg5B,EAAP,KAAgBC,EAAhB,KACA,EAAsCj5B,qBAAtC,mBAAO42B,EAAP,KAAoBC,EAApB,KACA,EAA4C72B,qBAA5C,mBAAOk5B,EAAP,KAAuBC,EAAvB,KACA,EAA8Cn5B,qBAA9C,mBAAOo5B,EAAP,KAAwBC,EAAxB,KAEAj5B,qBAAU,WACR,IAAM40B,EAAU,uCAAG,4BAAA57B,EAAA,sDACX8/B,EAAiBV,KACpBviC,KAAKgjC,GACRE,EAAkBD,GAHD,2CAAH,qDAKVI,EAAwBppB,uBAAqB0oB,yBAAyB,CAC1EjT,GACAC,KAEIwT,EAAkBE,EAAwBA,EAAsB/gC,QAAKoI,EAC3E04B,EAAmBD,GACnBpE,MACC,IAEH,IAQMtpB,EAAUxJ,mBAAQ,WACtB,IAAMq3B,OAAuC54B,IAAhBi2B,EAA4BA,EAAYjmB,mBAAgBhQ,EACrF,YAA6BA,IAAzB44B,EACKP,EAAQ5uB,QAAO,SAACovB,GACrB,OACEA,EAAOrsB,UAAUwD,cAAcra,QAAQijC,IAAyB,GAChEC,EAAOvb,QAAQtN,cAAcra,QAAQijC,IAAyB,GAC9DC,EAAOlkC,SAASqb,cAAcra,QAAQijC,IAAyB,GAC/DC,EAAOrjC,OAAOwa,cAAcra,QAAQijC,IAAyB,KAM5DP,IACN,CAACA,EAASpC,IAEb,OACE,eAAC,IAAMh2B,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,aAAaC,KAAK,iBAC5C,cAAC,GAAD,UACE,eAAC,EAAD,CAAwBvK,MAAM,0BAA9B,UACE,cAAC,GAAD,CAA4B8e,SA9Bf,SAACqgB,QACAj2B,IAAhBi2B,GAA6BA,EAAY/0B,OAAS,EACpDg1B,EAAeD,GAEfC,OAAel2B,MA2BVu4B,GACC,cAAC,GAAD,CAAwBn0B,QAASm0B,EAAjC,SACE,cAAC,GAAD,CAAmCxtB,QAASA,EAASyrB,gBAAiBiC,MAG1E,4BACE,cAAC,IAAD,CAAM3/B,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,4CCpECi/B,GAAqB,CAChC,CACEC,kBAAmB,kBACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,gBAK7D,CACEF,kBAAmB,kBACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,eAAgBC,UAAW,WAC1C,CAAED,YAAa,aAAcC,UAAW,mBACxC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,IAAMgrB,EAAM3Q,OAAON,OACjB3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cACzC,GAAI4uB,EACF,OAAOA,EAAIF,gBAMrB,CACEF,kBAAmB,cACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,gBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAGzD,CAAEA,YAAa,QAASC,UAAW,mBACnC,CAAED,YAAa,kBAAmBC,UAAW,iBAGjD,CACEH,kBAAmB,WACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,sBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAGzD,CAAEA,YAAa,aAAcC,UAAW,uBAG5C,CACEH,kBAAmB,6BACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAGzD,CAAEA,YAAa,eAAgBC,UAAW,qBAG9C,CACEH,kBAAmB,YACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CACED,YAAa,eACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,gBAK7D,CACEF,kBAAmB,6BACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CAAED,YAAa,eAAgBC,UAAW,qBAC1C,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAEFjW,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,gBAK7D,CACEF,kBAAmB,UACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,aAAcC,UAAW,WACxC,CACED,YAAa,eACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAO4Q,QACZ7pB,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,MAGD7gB,KAAI,SAACg3B,GAAD,OAAcA,EAAS,MAC3BpsB,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAG1D,CAAEA,YAAa,SAAUC,UAAW,YAGxC,CACEH,kBAAmB,kBACnBC,YAAa,CACX,CAAEC,YAAa,4BAA6BC,UAAW,mBACvD,CAAED,YAAa,WAAYC,UAAW,uBACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CAAED,YAAa,SAAUC,UAAW,cACpC,CAAED,YAAa,WAAYC,UAAW,YACtC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CACED,YAAa,eACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5CpW,GACAN,MAEF3V,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,gBAK7D,CACEF,kBAAmB,gCACnBC,YAAa,CACX,CAAEC,YAAa,4BAA6BC,UAAW,mBACvD,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,yBAC7D,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CACED,YAAa,uBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5CpW,GACAN,MAEF3V,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,gBAK7D,CACEF,kBAAmB,2BACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,eAAgBC,UAAW,uBAC1C,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,IAAMkrB,EAA0B9pB,uBAAqB0oB,yBAAyB,CAC5ExW,GACA,UAEF,IAAK,IAAIlhB,KAAS84B,EAAyB,CACzC,IAAIrB,EAAWxP,OAAON,OAAOmR,EAAwB94B,GAAxB,YAA8CqL,MACzE,SAACtB,GAAD,OAAOA,EAAE1S,KAAOuW,EAAI5D,cAEtB,QAAiBvK,IAAbg4B,EACF,OAAOA,EAASiB,eAKxB,CAAEA,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,2BAGjE,CACEH,kBAAmB,eACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,eAAgBC,UAAW,YAC1C,CACED,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAC5CpW,GACAN,MAEF3V,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAGzD,CAAEA,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,2BAGjE,CACEH,kBAAmB,aACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CACED,YAAa,eACbC,UAAW,mBACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAACtW,GtD3RjB,qBsD4R9B/V,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAOuW,EAAI5D,cAAY0uB,cAGjD,CACEA,YAAa,oBACbC,UAAW,aACX/jB,OAAQ,SAAChH,GACP,OAAOqa,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAACtW,GAAuBJ,MACtE3V,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOuW,EAAI5D,cAAY0uB,cAGzD,CAAEA,YAAa,qBAAsBC,UAAW,gCAChD,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,2BAGjE,CACEH,kBAAmB,UACnBC,YAAa,CACX,CAAEC,YAAa,YAAaC,UAAW,mBACvC,CAAED,YAAa,eAAgBC,UAAW,eAC1C,CAAED,YAAa,WAAYC,UAAW,cACtC,CAAED,YAAa,kCAAmCC,UAAW,4BClRpDI,I,OArCgB,SAAC,GAAyC,IAAvCn9B,EAAsC,EAAtCA,QAASyK,EAA6B,EAA7BA,MAAO2yB,EAAsB,EAAtBA,gBAC1CtuB,EAAO1J,mBAAQ,WACnB,IAAMi4B,EAAar9B,EAAQ6E,KAAI,SAAC+F,GAAD,MAAW,CACxC6L,KAAM7L,EAAKkyB,YACXnmB,KAA2B,iBAArB/L,EAAKkyB,YAAiCppB,KAAO9I,EAAKtD,OAAO8N,OAAO,wBAA0BxK,EAAKtD,UAgBvG,OAbwB,IAApB81B,GACFC,EAAWnyB,KAAK,CACduL,KAAM,iBACNE,KACE,oBAAIha,UAAU,mDAAd,SACG8N,EAAM5F,KAAI,SAACgF,EAAM/E,GAAP,OACT,6BAAiB+E,EAAKmB,UAAblG,UAOZu4B,IACN,CAACr9B,EAASyK,EAAO2yB,IAEpB,OACE,sBAAKzgC,UAAU,2BAAf,UACE,yCACA,cAAC,IAAD,CAAyBA,UAAWqa,IAAaC,QAAS3d,QAAS,CAAC,WAAY,UAAWwV,KAAMA,SC4DjGwuB,GAA0BpS,aAAW,CACzCC,iBADyC,YAEvC,MAAO,CACLoS,eAFiC,EAAlBA,kBADWrS,EAvFL,SAAC,GAAoC,IAAlCa,EAAiC,EAAjCA,OAAQziB,EAAyB,EAAzBA,mBACpC,EAA0DpG,mBAAS,IAAnE,mBAAO0d,EAAP,KAA8B4c,EAA9B,KACA,EAA0Ct6B,mBAAS,IAAnD,mBAAO2J,EAAP,KAAsB4wB,EAAtB,KACA,EAAgDv6B,oBAAS,GAAzD,mBAAOw6B,EAAP,KAAyBC,EAAzB,KA8CA,OACE,8BACE,eAAC,KAAD,CAAM/jB,YAAU,EAACC,SARA,SAACrT,GACpBA,EAAEyL,iBACF8Z,EAAOwR,eAAe3c,EAAuB/T,GAvC7C2wB,EAAyB,IACzBC,EAAiB,IACjBE,GAAoB,IA2ClB,UACE,gCACE,oBAAIhhC,UAAU,OAAd,oCACA,cAAC,IAAD,CACE2K,MAAOsZ,EACP5Z,SA7CgC,SAACR,GACzCg3B,EAAyBh3B,EAAE2G,OAAO7F,OAEX,KAAnBd,EAAE2G,OAAO7F,OAAyC,IAAzBuF,EAAc9H,OACzC44B,GAAoB,GAEpBA,GAAoB,IAwCdj+B,KAAK,wBACLqa,YAAY,yBACZsF,KAAK,MAEP,cAAC,IAAD,0DAEF,gCACE,oBAAI1iB,UAAU,OAAd,4BACA,cAAC,GAAD,CACEkQ,cAAeA,EACfE,cA9CgB,SAACtC,GAEzB,IAAMmzB,EAAgB/wB,EAAcgxB,OAAO,GAC3CD,EAAc1yB,KAAd,MAAA0yB,EAAa,YAASnzB,IAEtBgzB,EAAiBG,GACjBD,GAAoB,IAyCZ7wB,aAtCe,SAAChI,GACxB,IAAM84B,EAAgB/wB,EAAcgxB,OAAO,GAC3CD,EAAcC,OAAO/4B,EAAO,GAE5B24B,EAAiBG,GAEa,KAA1Bhd,GAAyD,IAAzBgd,EAAc74B,OAChD44B,GAAoB,GAEpBA,GAAoB,IA8Bdr0B,mBAAoBA,IAEtB,qBAAK3M,UAAU,MAAf,SACE,qBAAKA,UAAU,MAAf,SACE,cAAC,IAAD,CACEA,UAAWC,IAAc0a,QAAU,eACnCxc,KAAK,SACLoX,SAAUwrB,EAHZ,mCAsBdJ,GAAwB/3B,UAAY,CAClCg4B,eAAgB/3B,IAAUyS,KAAKvS,YAGlB43B,UCrDAQ,I,OA9CuB,SAAC,GAAD,IAAGC,EAAH,EAAGA,YAAH,OACpC,sBAAKphC,UAAU,wBAAf,UACE,uDACgB,MAAfohC,GAAuBA,EAAYh5B,OAAS,EAC3Cg5B,EAAYl5B,KAAI,SAAC+F,EAAM9F,GAAP,OACd,cAAC,IAAD,CAAgBnI,UAAWqa,IAAaC,QAAxC,SACE,kCACE,6BACE,6BACE,gCACE,8BACE,4BAAIrM,EAAK7R,WAEX,8BACE,4BAAI2a,KAAO9I,EAAKoxB,aAAa5mB,OAAO,iCAK5C,6BACE,oBAAI4oB,wBAAyB,CAAEC,OAAQrzB,EAAK3F,KAAKvJ,QAAQ,kBAAmB,aAf5BoJ,MAqBxD,qBAAKnI,UAAU,mCAAf,SACE,yECTR,ICtB2BuhC,GD+MZC,IC/MYD,GDwBI,WAC7B,MAAqCE,cAA7B5a,EAAR,EAAQA,gBAAiBC,EAAzB,EAAyBA,QACzB,EAAgCvgB,mBAAS,CACvCugB,QAAS,GACTG,WAAY,KACZya,MAAO,GACP5zB,MAAO,GACPszB,YAAa,GACb1M,aAASxtB,EACTw2B,qBAAiBx2B,IAPnB,mBAAO0b,EAAP,KAAiB+e,EAAjB,KASA,EAA8Bp7B,qBAA9B,mBAAOmuB,EAAP,KAAgBkN,EAAhB,KACA,EAAwCr7B,qBAAxC,mBAAOsF,EAAP,KAAqBg2B,EAArB,KACA,EAA8Ct7B,qBAA9C,mBAAOm3B,EAAP,KAAwBoE,EAAxB,KACA,EAA8Cv7B,oBAAS,GAAvD,mBAAOk6B,EAAP,KAAwBsB,EAAxB,KACA,EAAkEx7B,oBAAS,GAA3E,mBAAOy7B,EAAP,KAAkCC,EAAlC,KAEMC,EAAoB,CACxB,CACEriC,IAAKe,EAAmBwC,UAAUpC,KAClC+B,KAAM,aAER,CACElD,IAAKe,EAAmBwC,UAAUC,QAClCN,KAAM,sBAIV4D,qBAAU,WACRw7B,IACA,IAAMtC,EAAwBppB,uBAAqB0oB,yBAAyB,CAC1EjT,GACAC,KAEIuR,EAAkBmC,EAAwBA,EAAsB/gC,QAAKoI,EAC3E46B,EAAmBpE,KAClB,IAEH,IAiGoC1/B,EAjG9BokC,EAAyB,uCAAG,WAAOza,EAAazX,GAApB,eAAAvQ,EAAA,sDAChCkiC,EAAgBz2B,IAEVi3B,EAAgB7a,GAAe,CACnCP,WAAYrE,EAASqE,WACrBU,YAAaA,EACbzX,cAAeA,IACd1T,KAAK2lC,GAERP,EAAWS,GATqB,2CAAH,wDAYzBF,EAAuB,uCAAG,8BAAAxiC,EAAA,sDAC1BsS,EAAU,GACd4vB,EAAgBz2B,IACVk3B,EAAyB1b,GAAmBC,EAAiBC,GAAStqB,MAAK,SAACC,GAChF,GAAwB,MAApBA,EAASC,OAAgB,CAC3B,IAAMkmB,EAAWnmB,EAAS0V,KAKpBowB,EAAoB9rB,uBAAqB0oB,yBAAyB,CAAC,YAAa,oBAAoBrsB,MACxG,SAACgU,GAAD,OAAaA,EAAQhoB,KAAO8jB,EAASI,aAGnCuf,IACF3f,EAASkE,QAAUyb,EAAkBC,YAGvC,IAAI1b,EAAUkZ,GAAmBltB,MAAK,SAACtB,GAAD,OAAOA,EAAEyuB,oBAAsBrd,EAASkE,gBAG9D5f,IAAZ4f,IAEAA,EADElE,EAASgc,WAAalB,EACdsC,GAAmBltB,MAAK,SAAC7E,GAAD,MAAqC,YAA3BA,EAAKgyB,qBAEvCD,GAAmBltB,MAAK,SAACtB,GAAD,MAA+B,YAAxBA,EAAEyuB,sBAK/CnZ,EAAQoZ,YAAYlwB,SAAQ,SAACyyB,GAC3B,IAAMC,EAAqB9f,EAAS6f,EAASrC,WAG7C,GAA2B,eAAvBqC,EAASrC,WAAqD,OAAvBsC,GAQ3C,IACyB,eAAvBD,EAASrC,YACTxd,EAASwC,qBACTxC,EAASwC,oBAAoB3T,aAC3BgF,uBAAqB0oB,yBAAyB,C1DrHZ,wB0DuHhCrW,KACChqB,KAKoB,OAAvB4jC,QAAsDx7B,IAAvBw7B,EAAkC,CACnE,IAAM/3B,OAA4BzD,IAApBu7B,EAASpmB,OAAuBqmB,EAAqBD,EAASpmB,OAAOqmB,GAEnFzwB,EAAQ1D,KAAK,CACX4xB,YAAasC,EAAStC,YACtBx1B,gBAxBFsH,EAAQ1D,KAAK,CACX4xB,YAAasC,EAAStC,YACtBx1B,MAAO,uBA4Bbo3B,EAAmBnf,EAASgc,WAAalB,GACzCuE,EACErf,EAASgc,WAAalB,GAvHC,WAuHkB9a,EAASlmB,QAGpDilC,EAAY,CACV7a,QAASlE,EAASkE,QAClBG,WAAYrE,EAASqE,WACrBya,MAAOzvB,EACPnE,MAAO8U,EAAS+f,gBAChBvB,YAAa,YAAIxe,EAASggB,sBAAsBzE,UAChDS,SAAUhc,EAASgc,eAKzBgD,EAAWU,GACXT,EAAgBz2B,IAlFc,2CAAH,qDA4F7B,OACE,eAAC,IAAMjE,SAAP,WACGyb,EAASkE,QACR,cAAC,EAAD,CACExe,KAAI,kBAXwBtK,EAWe4kB,EAASkE,QAV5C,2BAAV9oB,EACK,kBAEFA,GAO4DkZ,eAC7D3O,KAAK,eACLZ,YAAau6B,IAEbtf,EAASgc,WAAalB,EACxB,cAAC,EAAD,CAAqBp1B,KAAK,+BAA+BC,KAAK,eAAeZ,YAAau6B,IAE1F,cAAC,EAAD,CAAqB55B,KAAK,aAAaC,KAAK,eAAeZ,YAAau6B,IAG1E,cAAC,GAAD,UACE,eAAC,EAAD,CAAwBlkC,MAAM,0BAA9B,eACekJ,IAAZwtB,GACC,eAAC,GAAD,CAAwBppB,QAASopB,EAAS7oB,aAAcA,EAAxD,UACE,cAAC,GAAD,CACExI,QAASuf,EAAS8e,MAClB5zB,MAAO8U,EAAS9U,MAChB2yB,gBAAiBA,KAEjBuB,GACA,cAAC,GAAD,CACEpB,eAAgBwB,EAChBz1B,mBAAoBb,GAAmBa,mBAAqBiW,EAAS9U,MAAM1F,SAG/E,cAAC,GAAD,CAA+Bg5B,YAAaxe,EAASwe,iBAGzD,cAAC,IAAD,CAAMphC,UAAU,0BAA0B8H,GAAIlH,EAAmBwC,UAAUpC,KAA3E,yCCrMD,SAACyG,GACN,IAAM5L,EAAWq8B,cACX14B,EAAWkH,cACXgmB,EAAS+U,cACf,OAAO,cAACF,GAAD,6BAAW95B,GAAX,IAAkBjI,SAAUA,EAAU3D,SAAUA,EAAU6wB,OAAQA,OCO9DmW,GATS,WACtB,OACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOpW,KAAM4H,EAAKjxB,UAAUC,QAAU,+BAAgCrE,QAAS,cAAC,GAAD,MAC/E,cAAC,IAAD,CAAOytB,KAAK,IAAIztB,QAAS,cAAC,GAAD,UCChB8jC,GANM,kBACnB,cAAC,EAAD,UACE,cAAC,GAAD,OCISC,GAAsB,uCAAG,8BAAApjC,EAAA,0DACU,IAA1CkH,cAAYC,QAAQN,kBADY,yCACwB2G,QAAQE,OAHzC,sBAES,cAE9BvK,EAF8B,UAEjB2T,uBAAqBC,MAAM6P,QAFV,OAEmBtiB,EAAgBS,qBACjE8hB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAJtB,kBAO7B1U,KAAMpV,IAAIkG,EAAS0jB,GAAQppB,OAAM,SAAC6V,GAGvC,MAFA5V,QAAQS,MAAMmV,GACdb,IAAYC,eAAe,CAAE7F,UAAW,IAAI5M,MAAM,mCAC5CqT,MAV4B,2CAAH,qDCuFpB+vB,GA5FoB,SAAC,GAA6D,IAA3DC,EAA0D,EAA1DA,cAAeC,EAA2C,EAA3CA,iBAAkBC,EAAyB,EAAzBA,mBACrE,EAAgD58B,mBAAS,IAAzD,mBAAO68B,EAAP,KAAyBC,EAAzB,KACA,EAAkD98B,mBAAS,IAA3D,mBAAO+8B,EAAP,KAA0BC,EAA1B,KAoBA,OAlBA58B,qBAAU,WACR,IAGIy8B,EACAE,EAHEE,EADcP,EAAc76B,OACI,EAKlCo7B,IAAoBl8B,KAAKm8B,MAAMD,IACjCJ,EAAmBH,EAAc9J,MAAM,EAAGqK,GAC1CF,EAAoBL,EAAc9J,MAAMqK,KAExCJ,EAAmBH,EAAc9J,MAAM,EAAG7xB,KAAKo8B,KAAKF,IACpDF,EAAoBL,EAAc9J,MAAM7xB,KAAKo8B,KAAKF,KAEpDH,EAAoBD,GACpBG,EAAqBD,KACpB,CAACL,IAGF,sBAAKjjC,UAAU,MAAf,UACE,qBAAKA,UAAU,qBAAf,SACGkjC,GACC,cAAC,IAAD,CACEljC,UAAWC,IAAc0a,QACzBxc,KAAK,SACLgC,QAAS,kBAAOgjC,EAAqBA,IAAwBvnC,OAAOC,SAAWqnC,EAAiBS,SAHlG,SAIGT,EAAiBU,aAIxB,qBAAK5jC,UAAU,qBAAf,SACE,6BACGojC,EAAiBl7B,KAAI,SAACiS,GACrB,OAAIA,EAAK0pB,WAEL,6BACE,mBAAGzjC,KAAM+Z,EAAKwpB,QAAd,SAAwBxpB,EAAKypB,YADtBzpB,EAAKypB,UAMd,6BACE,cAAC,IAAD,CAAM97B,GAAIqS,EAAKwpB,QAAf,SAAyBxpB,EAAKypB,YADvBzpB,EAAKypB,iBAQxB,qBAAK5jC,UAAU,qBAAf,SACE,6BACGsjC,EAAkBp7B,KAAI,SAACiS,GACtB,OAAIA,EAAK0pB,WAEL,6BACE,mBAAGzjC,KAAM+Z,EAAKwpB,QAAd,SAAwBxpB,EAAKypB,YADtBzpB,EAAKypB,UAMd,6BACE,cAAC,IAAD,CAAM97B,GAAIqS,EAAKwpB,QAAf,SAAyBxpB,EAAKypB,YADvBzpB,EAAKypB,qBC7DjBE,GAAwB,uCAAG,8BAAAnkC,EAAA,6DAChCE,EADgC,UACvB4W,uBAAqBC,MAAM6P,QADJ,OACatiB,EAAgBiC,6BAE7DsgB,EAAS,CACb7pB,QAAS,CAAE8pB,cAAc,UAAD,OAAY5f,cAAYC,QAAQ4f,cAJpB,2BAO7B1U,KAAM2U,KAAK9mB,EAAK,GAAI2mB,IAPS,sCASpCnpB,QAAQS,MAAR,MACAsU,IAAYC,eAAe,CAAE7F,UAAU,EAAD,KAVF,8DAAH,qDC6CtBu3B,GAhDoB,WACjC,MAAoDx9B,mBAAS,CAC3DqzB,QAAS,GACToK,SAAU,GACVC,QAAS,KAHX,mBAAOC,EAAP,KAA2BC,EAA3B,KAKA,EAA8C59B,oBAAS,GAAvD,mBAAO69B,EAAP,KAAwBC,EAAxB,KACMC,EAAiBp5B,mBAEjBq5B,EAAwB,uCAAG,8BAAA5kC,EAAA,sEACRmkC,KADQ,OAEP,OADlBrnC,EADyB,QAElBC,UACL8nC,EADqB,gBACDN,IACbF,SAAWvnC,EAAS0V,KAAK6xB,SACtCQ,EAAaP,QAAUxnC,EAAS0V,KAAK8xB,QACrCO,EAAa5K,QAAUn9B,EAAS0V,KAAKynB,QACrCuK,EAAsBK,IAGxBH,GAAmB,GAVY,2CAAH,qDAmB9B,OANA19B,qBAAU,YACgB,IAApBy9B,GACFE,EAAen5B,QAAQs5B,WAExB,CAACL,IAGF,qCACE,cAAC,GAAD,CACEjB,mBAAoBoB,EACpBrB,iBAAkB,CAChBU,SAAU,wBACVD,QAAS,IACTE,YAAY,GAEdZ,cAAe,KAEjB,uBAAMh4B,IAAKq5B,EAAgBI,OAAO,2CAA2CC,OAAO,OAApF,UACE,uBAAOxmC,KAAK,SAASW,GAAG,UAAUiE,KAAK,UAAU4H,MAAOu5B,EAAmBtK,UAC3E,uBAAOz7B,KAAK,SAASW,GAAG,WAAWiE,KAAK,WAAW4H,MAAOu5B,EAAmBF,WAC7E,uBAAO7lC,KAAK,SAASW,GAAG,UAAUiE,KAAK,UAAU4H,MAAOu5B,EAAmBD,iBCQpEW,GAlDY,WACzB,IAAIC,EAAqB,CACvB,CACEjB,SAAU,uBACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQW,eACtE6gC,YAAY,GAEd,CACED,SAAU,4BACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQY,yBACtE4gC,YAAY,GAEd,CACED,SAAU,0BACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQQ,MAAMN,OAC5EshC,YAAY,GAEd,CACED,SAAU,iBACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQS,QAAQP,OAC9EshC,YAAY,GAEd,CACED,SAAU,uBACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQO,MAAML,OAC5EshC,YAAY,IAWhB,OARI9W,GAAUoD,sBAAoBC,qBAAqB1E,MACrDmZ,EAAmBt2B,KAAK,CACtBq1B,SAAU,cACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQU,KAAKR,OAC3EshC,YAAY,IAKd,mCACE,cAAC,GAAD,CACEX,iBAAkB,CAChBU,SAAU,kBACVD,QAAS/iC,EAAmByB,QAAQrB,KAAOJ,EAAmByB,QAAQC,SAASC,OAC/EshC,YAAY,GAEdZ,cAAe4B,OChCRC,GAbY,WACzB,OACE,cAAC,GAAD,CACE5B,iBAAkB,CAChBU,SAAU,aACVD,QAAS,yCACTE,YAAY,GAEdZ,cAAe,CAAC,CAAEW,SAAU,aAAcD,QAAS/iC,EAAmBwC,UAAUpC,KAAM6iC,YAAY,OCUzFkB,GAjBuB,WACpC,OACE,cAAC,GAAD,CACE7B,iBACEnW,GAAUoD,sBAAoBC,qBAAqBvE,KAC/C,CACE+X,SAAU,wBACVD,QAAS/iC,EAAmB0C,mBAAmBC,cAC/CsgC,YAAY,GAEd,KAENZ,cAAe,MCwBN+B,GAtCe,WAC5B,OACE,cAAC,GAAD,CACE9B,iBAAkB,CAChBU,SAAU,kBACVD,QAAS,yCACTE,YAAY,GAEdZ,cAAe,CACb,CACEW,SAAU,+BACVD,QAAS,sCACTE,YAAY,GAEd,CACED,SAAU,wBACVD,QAAS,0CACTE,YAAY,GAEd,CACED,SAAU,4BACVD,QAAS,0CACTE,YAAY,GAEd,CAAED,SAAU,iBAAkBD,QAAS,iCAAkCE,YAAY,GACrF,CAAED,SAAU,mBAAoBD,QAAS,qCAAsCE,YAAY,GAC3F,CAAED,SAAU,mBAAoBD,QAAS,kCAAmCE,YAAY,GACxF,CAAED,SAAU,iBAAkBD,QAAS,mCAAoCE,YAAY,GACvF,CACED,SAAU,gCACVD,QAAS,qCACTE,YAAY,OCGPoB,GAlCa,WAC1B,OACE,cAAC,GAAD,CACE/B,iBAAkB,CAChBU,SAAU,wBACVD,QAAS,8CACTE,YAAY,GAEdZ,cAAe,CACb,CACEW,SAAU,sBACVD,QAAS,4CACTE,YAAY,GAEd,CACED,SAAU,gCACVD,QAAS,8BACTE,YAAY,GAEd,CACED,SAAU,mCACVD,QAAS,wDACTE,YAAY,GAEd,CACED,SAAU,6BACVD,QAAS,mCACTE,YAAY,OCgFPqB,GAxFW,WACxB,MAA8B3+B,mBAAS,IAAvC,mBAAO4+B,EAAP,KAAgBC,EAAhB,KAkBA,OAhBAz+B,qBAAU,WACR,IAAM0+B,EAAS,uCAAG,8BAAA1lC,EAAA,sEACKojC,KADL,OACVp1B,EADU,OAEVqH,EAAYrH,EAAOwE,KAAK8gB,UAE9BmS,EAAW,CACTE,QAAsB,IAAdtwB,IAAmG,IAA5E+X,GAAUoD,sBAAoBC,qBAAqBxE,KAClF2Z,YAA0B,IAAdvwB,EACZwwB,UAAwB,IAAdxwB,EACVywB,SAAkF,IAAzE1Y,GAAUoD,sBAAoBC,qBAAqBnE,OAR9C,2CAAH,qDAYfoZ,MACC,IAGD,cAAC,EAAD,UACE,eAAC,EAAD,CAAwBrnC,MAAM,yBAA9B,UACE,cAAC,EAAD,CAAqBsK,KAAK,aAAaC,KAAK,iBAC5C,eAAC,GAAD,WACE,uHACA,4HACA,eAAC,GAAD,CAA8Be,kBAAkB,EAAhD,UACE,cAAC,EAAD,CAAoBtL,MAAM,8BAA1B,SACE,cAAC,GAAD,MAGF,cAAC,EAAD,CAAoBA,MAAM,aAA1B,SACE,cAAC,GAAD,OAGkB,IAAnBmnC,EAAQG,QACP,cAAC,EAAD,CAAoBtnC,MAAM,0BAA1B,SACE,cAAC,GAAD,OAIoB,IAAvBmnC,EAAQI,YACP,cAAC,EAAD,CAAoBvnC,MAAM,iBAA1B,SACE,cAAC,GAAD,OAIkB,IAArBmnC,EAAQK,UACP,cAAC,EAAD,CAAoBxnC,MAAM,cAA1B,SACE,cAAC,GAAD,OAIiB,IAApBmnC,EAAQM,SACP,cAAC,EAAD,CAAoBznC,MAAM,sBAA1B,SACE,cAAC,GAAD,SAKN,sBAAKgC,UAAU,MAAf,UACE,sBAAKA,UAAU,MAAf,UACE,0CACA,+BACE,6BACE,mBAAGI,KAAK,wCAAR,+BAEF,6BACE,mBAAGA,KAAK,kCAAR,8CAEF,6BACE,mBAAGA,KAAK,gCAAR,gDAIN,sBAAKJ,UAAU,MAAf,UACE,8CACA,gEACiC,mBAAGI,KAAK,oCAAR,wBADjC,sBC3ECslC,GAhBM,SAAC,GAAkC,IAAhCC,EAA+B,EAA/BA,yBAChBnmC,EAAWkH,cAQjB,OANAC,qBAAU,WACJE,cAAYC,QAAQN,mBACtBhH,EAASoB,EAAmBG,aAE7B,IAEI,cAAC,GAAD,CAAiB6kC,qBAAsBD,KC8DjCE,GA1ES,WACtB,OACE,eAAC,IAAM1+B,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,2BAC1B,eAAC,GAAD,WACE,mFACA,8FAEA,8CACA,+BACE,6BACE,cAAC,IAAD,CAAMR,GAAIusB,EAAK/yB,eAAeN,KAA9B,6CAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAK5yB,eAAeT,KAA9B,gDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAK1yB,WAAWX,KAA1B,4CAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKzyB,SAASZ,KAAxB,yCAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKxyB,wBAAwBb,KAAvC,uDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKvyB,gBAAgBd,KAA/B,yCAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKtyB,gBAAgBf,KAA/B,yDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKryB,yBAAyBhB,KAAxC,mDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKnyB,gBAAgBlB,KAA/B,iDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKlyB,kBAAkBnB,KAAjC,qDAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKjyB,WAAWpB,KAA1B,8CAIJ,4CACA,+BACE,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKr3B,aAAagE,KAA5B,wBAEF,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAKxzB,OAAf,uBAEF,6BACE,cAAC,IAAD,CAAMiH,GAAIusB,EAAKtzB,UAAf,yBAEF,6BACE,cAAC,IAAD,CAAM+G,GAAIusB,EAAKlxB,QAAQnC,KAAvB,0BAIJ,uCACA,6BACE,6BACE,cAAC,IAAD,CAAM8G,GAAIusB,EAAK1wB,eAAe3C,KAA9B,kDC/DG8kC,GAFI,kBAAM,cAAC,GAAD,K,QCEJC,G,cAkBnB,aAAe,IAAD,iCAjBd/+B,WAAa,EAiBC,KAhBdg/B,gBAAkB,qFAgBJ,KAfdC,eAAiB,iBAeH,KAddC,eAAiBr/B,cAAYC,QAAQN,gBAcvB,KAbdub,eAAiB,mCAaH,KAVdD,cAAgB,mCAUF,KATd0C,QAAU,kBASI,KARd2hB,qBAAuB,eAQT,KALdC,qBAAsB,EAKR,KAHdC,iBAAmB,GAGL,KAQdC,gBARc,UAQO7vB,uBAAqBC,MAAM6P,QARlC,OAQ2CtiB,EAAgBF,aAAawB,oBARxE,KAUdghC,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YAVtD,KAYdw/B,UAAY,CACVxlC,KAAMJ,EAAmBU,eAAeN,KACxCylC,MAAO7lC,EAAmBU,eAC1BolC,cACE9lC,EAAmBc,cAAcV,KACjCJ,EAAmBc,cAAcJ,eACjCV,EAAmBc,cAAcT,OAlBvB,KAqBdnB,SAAW,CAAC,GAAD,OACNwc,KAAKkqB,UAAUxlC,MADT,UAENsb,KAAKkqB,UAAUxlC,KAAOsb,KAAKkqB,UAAUC,MAAMxlC,OAFrC,UAGNqb,KAAKkqB,UAAUxlC,KAAOsb,KAAKkqB,UAAUC,MAAMvlC,OAHrC,UAINob,KAAKkqB,UAAUxlC,KAAOsb,KAAKkqB,UAAUC,MAAMtlC,OAJrC,UAKNmb,KAAKkqB,UAAUxlC,KAAOsb,KAAKkqB,UAAUC,MAAMllC,OALrC,UAMN+a,KAAKkqB,UAAUxlC,KAAOsb,KAAKkqB,UAAUC,MAAMjlC,eA3BlC,KA8BdmlC,0BAA4B,2CA9Bd,KA+BdC,+BAAiCpb,GA9B/B,IAAMqb,EAAqBpwB,uBAAqBqwB,4BAA4B,kBAC5ExqB,KAAK+pB,iBAAmBQ,EAAkB,cAC1CvqB,KAAKyqB,wBAA0BF,EAAmBE,wBAClDzqB,KAAK0G,UAAY6jB,EAAmB7jB,UACpC1G,KAAK0qB,sBAAwBH,EAAmBG,yBCsCrCC,GAzDG,SAAC,GAOZ,IANLlH,EAMI,EANJA,OAMI,IALJmH,6BAKI,MALoB,2BAKpB,EAJJC,EAII,EAJJA,iBACAC,EAGI,EAHJA,aACAC,EAEI,EAFJA,YAEI,IADJpjB,6BACI,MADoB,cAAC,IAAM9c,SAAP,IACpB,EAKJ,OAJAR,qBAAU,WACR0gC,MACC,CAACA,IAGF,gCACE,yDAA4BtH,EAAOlgC,IAAM,mBAAGO,KAAM2/B,EAAOlgC,IAAhB,SAAsBkgC,EAAOz3B,OAAYy3B,EAAOz3B,KAAzF,OACA,4BAAI4+B,IACJ,6BACGC,EAAiBj/B,KAAI,SAACiS,EAAMhS,GAC3B,OACE,6BACE,mBAAG/H,KAAM+Z,EAAKta,IAAd,SAAoBsa,EAAK7R,QADlBH,QAOd8b,EAED,2DACA,gLAEuC,mBAAG7jB,KAAK,kCAAR,+BAFvC,OAKA,cAAC,IAAD,CAAQJ,UAAWC,IAAc0a,QAAU,eAAgBxa,QAASinC,EAApE,iCCrCOE,GAAkB,SAACz9B,GAAD,OAAOA,EAAE09B,QAAQC,MAAM1oC,KAAO0sB,IAOvDic,GAAkC,SAACh0B,EAAYoP,GAMnD,MAAM,MAAN,OAJE,2TAIF,uGAIUpP,EAJV,sEAQUoP,EARV,iCAiBI6kB,GAAqC,uCAAG,WAAO79B,GAAP,iBAAAlK,EAAA,sEACnB4S,GAAmB1I,EAAE89B,QAAQC,SAASC,SAASr2B,EAAG3H,EAAE89B,QAAQC,SAASC,SAASr1B,GAD3D,cACtCiB,EADsC,gBAEzBD,GAAiBC,GAFQ,cAEtCoP,EAFsC,yBAGrC4kB,GAAgCh0B,EAAYoP,IAHP,2CAAH,sDAU9BilB,GAAkC,WAAiB,IAAhB9pC,EAAe,uDAAP,GAChD+pC,EAAuB,sFAE7B,MAAO,CACLC,SAAUD,EACV9mB,QAASuK,GACT9K,cAAe,CACb1iB,QACAkQ,QAAS,SAACrE,GAAD,OAAO69B,GAAsC79B,OC+LtDo+B,I,OAAwB1Z,aAAW,CACvCC,iBADuC,YACwB,IAA5C0Z,EAA2C,EAA3CA,iBAAkBjkB,EAAyB,EAAzBA,sBACnC,MAAO,CACLikB,mBACAjkB,sBAAuBA,GAAgD,KAG3E8K,iBAAkB,YAA+D,IAA5DoZ,EAA2D,EAA3DA,+BAAgCC,EAA2B,EAA3BA,qBAC7Cv3B,EAAUs3B,GAAkC,uCAC5CE,EAAS,CACbH,iBAAkB5b,OAAcgc,MAAM,EAAC,GAAOz3B,GAC9CoT,sBAAuBqI,OAAakR,IAClChV,GACApd,KAUJ,OANIg9B,GAAwBA,EAAqBG,UAC/CF,EAAOpkB,sBAAwBokB,EAAOpkB,sBAAsBjJ,SAC1D,sDAEFqtB,EAAOH,iBAAmB5b,OAAcgc,MAAM,EAAC,GAAO,yCAEjDhc,OAAa0C,MAAMqZ,IAE5BlZ,aAzBuC,SAyB1BC,EAAQyK,GACnBA,EAAIpyB,MAAM+gC,aA1BgBja,EA5NT,SAAC9mB,GAAW,IAAD,EAC1BouB,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GACnCV,EAAkC/C,EAAlC+C,OAAQD,EAA0B9C,EAA1B8C,QAASqrB,EAAiBnuB,EAAjBmuB,aAEvBjvB,qBAAU,YAELc,EAAMmuB,eACNnuB,EAAMquB,SACPpG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GACnCX,EAAMgD,YAAcurB,EAAoB7qB,UAExC6qB,EAAoB7qB,QAAU1D,EAAMgD,YACnBwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACsI,EAAMmuB,aAAcC,EAAapuB,EAAM+C,OAAQ/C,EAAMquB,QAASruB,EAAMgD,cAExE9D,qBAAU,WACRhI,MACC,IAEH,IA6DI8pC,EA7DEC,EAAwB,WAC5BjhC,EAAMkhC,qBACNlhC,EAAM8nB,cAAc,oBAAoB,IAkBpCqZ,EAAoB,uCAAG,WAAO/+B,GAAP,SAAAlK,EAAA,0DAEA,IAAvB2nC,GAAgBz9B,GAFO,uBAGzB6+B,IAHyB,8BAaC,UAL8BxhC,IAA9BO,EAAM2+B,qBAA4C3+B,EAAM2+B,uBAK/C3+B,EAAMohC,oBAbhB,iCAcIphC,EAAMohC,oBAAoBh/B,GAd9B,0CAgBvBi/B,MAAMrhC,EAAMshC,4BACZL,IAjBuB,2BAsB3BjhC,EAAMmhC,qBAAqB/+B,GAE3BpC,EAAM8nB,cAAc,oBAAoB,GAxBb,4CAAH,sDAqCpB5P,EAAwBlY,EAAMuhC,qBAChC,CAAC,6BAAKvhC,EAAMuhC,qBAAqB,IAAjC,IAAqCC,mBArDV,SAACp/B,IACI,IAA9BpC,EAAM2+B,oBACR3+B,EAAM8nB,cAAc,oBAAoB,GAExCmZ,aAkDAxhC,EAQAO,EAAMghC,sBACJhhC,EAAM2gC,sBAAwB3gC,EAAM2gC,qBAAqBG,SAM3DE,OAHmDvhC,IAAjDO,EAAM2gC,qBAAqBc,mBACvBzhC,EAAM2gC,qBAAqBc,kBAES,CAACpB,WAAqC5gC,KAG9EuhC,EAAoB,GAAGU,qBAAuBV,EAAoB,GAAG/nB,cACrE+nB,EAAoB,GAAGW,iBAAmBR,GAI5CH,EAAsBhhC,EAAMghC,oBAAoBvgC,KAAI,SAACq/B,GACnD,MAAO,CACLS,SAAUT,EAAQS,SAClB/mB,QAASsmB,EAAQtmB,QACjBmoB,iBAAkBR,EAClBO,qBAAsB5B,EAAQ7mB,mBAMtC,OACE,qBAAK1gB,UAAU,OAAf,SACE,eAAC,KAAD,CAAMid,YAAU,EAAhB,UACE,qBAAKhS,IAAK4qB,IACTnG,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ29B,kBAAoB,cAAC,GAAD,IAC/D,cAAC,IAAD,CAAqBpqC,MAAO0M,EAAO09B,kBAAoB39B,EAAQ29B,iBAAkBltB,UAAU,EAA3F,iCAIA,sBAAMlc,GAAG,qBAER2I,EAAM4hC,yBAAmDniC,IAA7BO,EAAM4hC,mBACjC,cAAC,IAAD,UAAoB5hC,EAAM4hC,qBAE1B,eAAC,IAAD,yFAEE,uBAFF,2FAIE,uBAJF,WAKU,sBAAM,cAAY,OAAOrpC,UAAU,+BAL7C,sDAOE,uBAPF,6CASE,0BAGJ,cAAC,GAAD,CACEwf,eAAgB/X,EAAM+X,eACtBQ,aA1EiB,SAACnW,GACxBpC,EAAM6hC,cAAcz/B,GACpBpC,EAAM8nB,cAAc,oBAAoB,IAyElC5P,sBAAuBA,EACvBD,qBAAsB+oB,EACtB3oB,qBACErY,EAAMqY,mBACJrY,EAAM2gC,wBAAyB3gC,EAAM2gC,sBAAyB3gC,EAAM2gC,qBAAqBG,UAI7FxoB,gCAAiCtY,EAAMm/B,+BACvC3mB,2BAA4BxY,EAAMwY,6BAEnCzV,EAAO09B,kBAAoB39B,EAAQ29B,kBAClC,cAAC,IAAD,UAAsB19B,EAAO09B,mBAG9BzgC,EAAM2gC,sBACL,cAAC,IAAD,CACEtpC,GAAG,wBACHypC,QAAS9gC,EAAM2gC,qBAAqBG,QACpC19B,MAAOpD,EAAM2gC,qBAAqBv9B,MAClCR,SAhIwB,WAChCq+B,IACAjhC,EAAM2gC,qBAAqBmB,cAAgB9hC,EAAM2gC,qBAAqBmB,kBAkIjE9hC,EAAM+hC,0BAA4B/hC,EAAM+hC,8BACRtiC,IAAhCO,EAAMwc,uBACL,qCACE,cAAC,GAAD,CACE/B,aAAa,EACbC,aAAcqG,GACdxoB,UAAU,QACV+C,KAAK,wBACLqa,YAAY,kCACZzS,MAAOlD,EAAMwc,sBACb7B,8BAxG8B,SAACvY,GACzCpC,EAAM8nB,cAAc,wBAAyB1lB,EAAE2G,OAAO7F,OACtDlD,EAAM2a,+BAAiC3a,EAAM2a,8BAA8BvY,IAuGjEwY,WAAY5a,EAAMgiC,iCAAmC,kCACrD19B,SAAS,mIACTxB,QAASA,EACTC,OAAQA,EACRwQ,SAAUvT,EAAM2gC,sBAAwB3gC,EAAM2gC,qBAAqBG,UAEpE/9B,EAAOyZ,uBAAyB1Z,EAAQ0Z,uBACvC,cAAC,IAAD,UAAsBzZ,EAAOyZ,4BAKlC,UAAAxc,EAAM2gC,4BAAN,eAA4BsB,yBAA0BjiC,EAAM2gC,qBAAqBG,SAChF,qCACE,uBACA,oBAAIzpC,GAAG,cAAckB,UAAU,OAA/B,4BAGA,cAAC,GAAD,CACEoQ,cAAe,SAACtC,GAAD,OAAWrG,EAAM2gC,qBAAqBh4B,cAActC,IACnEqC,aAAc,SAAChI,GAAD,OAAWV,EAAM2gC,qBAAqBh4B,cAAcjI,IAClE+H,cAAezI,EAAM2gC,qBAAqBl4B,mBAKhD,cAAC,IAAD,CAAQ/P,QAASsH,EAAM2uB,aAAcj4B,KAAK,SAA1C,uBAG0B,IAAzBsJ,EAAMkiC,eACL,6BAEA,cAAC,IAAD,CAAQxrC,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAAjF,2BAuCVstB,GAAsBr/B,UAAY,CAChCqX,2BAA4BpX,IAAUyS,KACtC8qB,oBAAqBv9B,IAAUwS,KAC/BsuB,eAAgB9gC,IAAUwS,KAC1B6sB,iBAAkBr/B,IAAUwS,KAAKtS,WACjCyW,eAAgB3W,IAAU0S,OAC1B0I,sBAAuBpb,IAAUC,OACjC0/B,SAAU3/B,IAAUyS,KAAKvS,WACzBqtB,aAAcvtB,IAAUyS,KAAKvS,WAC7BqZ,8BAA+B,SAAC3a,EAAOmiC,GACrC,QAAuC1iC,IAAnCO,EAAK,4BAA+DP,IAApBO,EAAMmiC,GACxD,OAAO,IAAIhqC,MAAM,2CAIrB6pC,gCAAiC5gC,IAAUC,OAC3C6/B,mBAAoB9/B,IAAUyS,KAAKvS,WACnC8/B,oBAAqBhgC,IAAUyS,KAC/BwE,kBAAmBjX,IAAUwS,KAC7B0tB,2BAA4B,SAACthC,EAAOmiC,GAClC,QAAqC1iC,IAAjCO,EAAK,0BAA6DP,IAApBO,EAAMmiC,GACtD,OAAO,IAAIhqC,MAAM,wCAGrB6oC,oBAAqB5/B,IAAUghC,MAC/Bb,qBAAsBngC,IAAUghC,MAChCP,cAAe,SAAC7hC,EAAOmiC,GACrB,IAAmC,IAA/BniC,EAAK,wBAAuDP,IAApBO,EAAMmiC,GAChD,OAAO,IAAIhqC,MAAM,2BAGrB4pC,yBAA0B3gC,IAAUI,KACpCk/B,+BAAgCt/B,IAAUC,OAC1CugC,mBAAoBxgC,IAAUI,KAC9Bm/B,qBAAsBv/B,IAAUmmB,MAAM,CAEpCuZ,QAAS1/B,IAAUwS,KAAKtS,WAExB8B,MAAOhC,IAAUC,OAAOC,WAExBwgC,aAAc1gC,IAAUyS,KAAKvS,WAE7BqH,cAAe,SAAC3I,EAAOmiC,GAAR,OAAqBE,GAAqBriC,EAAO,yBAA0BmiC,IAC1Fz5B,aAAc,SAAC1I,EAAOmiC,GAAR,OAAqBE,GAAqBriC,EAAO,yBAA0BmiC,IAEzF15B,cAAe,SAACzI,EAAOmiC,GAAR,OAAqBE,GAAqBriC,EAAO,yBAA0BmiC,IAE1FV,kBAAmBrgC,IAAUwS,KAE7BquB,uBAAwB7gC,IAAUwS,QAUtC,IAAMyuB,GAAuB,SAACriC,EAAOsiC,EAAoBC,GACvD,QACgC9iC,IAA9BO,EAAMsiC,KACwB,IAA9BtiC,EAAMsiC,SACiB7iC,IAAvBO,EAAMuiC,GAEN,OAAO,IAAIpqC,MAAMoqC,EAAc,cAIpB/B,MClSAgC,GAjDU,SAACxiC,GACxB,IAAMjI,EAAWkH,cAKjB,OAJAC,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,sBAAKY,UAAU,OAAf,UACE,8CACA,qBAAKA,UAAU,MAAf,SACE,2FAC4D,4BAAIyH,EAAMof,uBAIxE,6CACCpf,EAAMyiC,eACL,cAAC,GAAD,CAA0BhrB,cAAezX,EAAMyX,gBAE/C,cAAC,GAAD,CACEE,gBAAiB3X,EAAM2X,gBACvBC,kBAAmB5X,EAAM4X,oBAI5B5X,EAAM0iC,cACL,qCACE,gDACC1iC,EAAM0iC,cAAcjiC,KAAI,SAACzL,EAAU0L,GAClC,OACE,qBAAKnI,UAAU,MAAf,SACE,yCACU,mBAAGI,KAAM3D,EAASoD,IAAlB,SAAwBpD,EAAS6L,OAD3C,QADwBH,SAQ9B,KAEJ,4BACE,wBAAQnI,UAAU,iBAAiBG,QAAS,kBCxChB,SAACX,EAAUitB,GACzC7wB,OAAOwuC,QAAQ,yEACjB5qC,EAASitB,GDsC6C4d,CAA4B7qC,EAAUiI,EAAM6iC,iBAA9F,0CEJFC,GAAuBhc,aAAW,CACtCC,iBAAkB,iBAAO,CACvBgc,cAAc,IAEhBrb,aAAa,WAAD,4BAAE,WAAOC,EAAP,oBAAAzvB,EAAA,6DAAiB8vB,EAAjB,EAAiBA,cAAehoB,EAAhC,EAAgCA,MAAhC,SACgBA,EAAMm5B,iBADtB,QAEU,IAFV,QAGVnR,EAAc,eAAgBrkB,IAHpB,2CAAF,qDAAC,IAJcmjB,EAnCT,SAAC,GAA+F,IAA7F/jB,EAA4F,EAA5FA,OAAQigC,EAAoF,EAApFA,UAAWC,EAAyE,EAAzEA,gBAA+BzmB,GAA0C,EAAxD2R,aAAwD,EAA1C3R,uBAAuBkL,EAAmB,EAAnBA,aAK9F,OAJAxoB,qBAAU,WACR/K,OAAOwD,OAAO,EAAG,KAChB,IAGD,qBAAKY,UAAU,OAAf,SACE,eAAC,KAAD,gBAC2BkH,IAAxBsD,EAAOggC,aAA6B,oBAAIxqC,UAAU,yBAAd,SAAwCwK,EAAOggC,eAAqB,KACzG,yCACA,qBAAKxqC,UAAU,MAAf,SACE,cAAC,GAAD,CAAuB0Z,UAAU,WAAWC,UAAU,SAASC,WAAW,SAASC,QAAS4wB,MAG9F,qBAAKzqC,UAAU,MAAf,SACE,mMAKDikB,EAAwB,qBAAKjkB,UAAU,MAAf,SAAsBikB,IAA+B,KAE9E,cAAC,IAAD,CAAiB9jB,QAASuqC,EAAiBvsC,KAAK,SAAhD,sBAGA,cAAC,IAAD,CACE6B,UAAWC,IAAc0a,QAAU,eACnC9a,IAAG,UAAK4W,uBAAqBC,MAAM6P,QAAhC,OAAyCtiB,EAAgBiB,WAC5D/E,QAASgvB,YAmBnBob,GAAqB3hC,UAAY,CAC/B6hC,UAAW5hC,IAAUghC,MAAM9gC,WAC3ByB,OAAQ3B,IAAUC,OAClB4hC,gBAAiB7hC,IAAUyS,KAAKvS,WAChC63B,eAAgB/3B,IAAUyS,KAAKvS,WAC/Bkb,sBAAuBpb,IAAU8hC,KAGpBJ,UC/DA,I,OAAA,IAA0B,uCC+D1BK,GA1De,SAAC,GAA8E,IAAD,IAA3EvoB,kBAA2E,MAA9D,GAA8D,MAA1DwoB,kBAA0D,MAA7C,GAA6C,MAAzCC,qBAAyC,MAAzB,GAAyB,MAArBC,iBAAqB,MAAT,GAAS,EAcpGC,EAAqB,SAAC5L,EAAY6L,GACtC,MAAM,GAAN,OAVoB,SAAC7L,GACrB,IACM8L,EADaxb,OAAO4Q,QAAQyK,GACGj4B,MAAK,SAACtB,GAAD,OAAOA,EAAE,GAAG1S,IAAMsgC,KAC5D,OAAI8L,EACKA,EAAkB,GAAG/K,YAEvB,UAIGgL,CAAc/L,GAAxB,yBAd+B,SAAC6L,GAChC,OAAOl0B,KAAOk0B,GAAYxyB,OAAO,4BAamB2yB,CAAyBH,KAG/E,OAA6B,IAAzBH,EAAc1iC,OACT,6BAIP,sBAAKtJ,GAAG,0BAAR,UACE,8BACE,qBAAKV,IAAKitC,GAAUhtC,IAAI,iBAE1B,gCACE,mBAAGS,GAAG,kCAAN,+BACA,4BAAIujB,IACJ,6BACGyoB,EAAc5iC,KAAI,SAAC0a,EAAUza,GAAX,OACjB,6BAAiB6iC,EAAmBpoB,EAASwc,WAAYxc,EAASyc,cAAzDl3B,QAGb,4BAAI0iC,WAyBCS,GAAgB,WAAuB,IAAtBC,EAAqB,uDAAP,GAC1C,MAAM,6CAAN,OAAoDA,EAApD,oDAGWC,GAAyB,eAACD,EAAD,uDAAe,GAAf,OACpC,uEACiC,mDADjC,oBAEgBA,EAFhB,SAKWE,GAA4B,WAAuB,IAAtBF,EAAqB,uDAAP,GACtD,MAAM,oHAAN,OAA2HA,EAA3H,MAGWG,GAAmC,eAACH,EAAD,uDAAe,GAAf,OAC9C,mKAEe,8DAFf,cAE+DA,EAF/D,qBCkDII,GAAuBpd,aAAW,CACtCC,iBADsC,YACoB,IAAvCtL,EAAsC,EAAtCA,UAAWhT,EAA2B,EAA3BA,cAC5B,MAAO,CACLgT,UAAWA,GAAa,GACxBslB,SAHqD,EAAZA,SAIzCt4B,cAAeA,GAAiB,KAGpC6e,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,uDAEnCmU,aAXsC,SAWzB0K,GACXA,EAAI2O,aAZqBja,EA3GT,SAAC,GAgBd,IAfLqH,EAeI,EAfJA,aACAE,EAcI,EAdJA,QACA1G,EAaI,EAbJA,OACA5kB,EAYI,EAZJA,OACAD,EAWI,EAXJA,QACAE,EAUI,EAVJA,YACA8kB,EASI,EATJA,cACAqc,EAQI,EARJA,oBACA17B,EAOI,EAPJA,cACAE,EAMI,EANJA,cACAD,EAKI,EALJA,aACAimB,EAII,EAJJA,aACAyV,EAGI,EAHJA,iBACAC,EAEI,EAFJA,kBACAP,EACI,EADJA,YAEMQ,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAEjBvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAwBJ,OACE,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa,cAAC,GAAD,CAAmB1Y,OAAQA,IAEnF,sBAAKxK,UAAU,MAAf,UACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,uBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACLsH,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GAC3B+hC,EAAoB/hC,IAEtBc,MAAOykB,EAAOlM,UACdplB,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,UACnCtY,QA7CqB,WAC/B,IAAMqhC,EAASJ,IAAmB3jC,KAAI,SAACgkC,GACrC,MAAO,CACLrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,OAGnB,GAAIgtC,EAAmB,CACrB,IAAMK,EAAW,GAQjB,OAPAF,EAAOj8B,SAAQ,SAAC/B,QAGC/G,IADA4kC,EAAkBh5B,MAAK,SAACtB,GAAD,OAAOA,EAAE4tB,WAAW3tB,aAAexD,EAAKtD,UAE5EwhC,EAAS59B,KAAKN,MAGXk+B,EAGT,OAAOF,EA0BYG,QAGZ5hC,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,eAGzE,qBAAKljB,UAAU,OAAf,SACE,cAAC,GAAD,CACEqiB,WAAYipB,GAAcC,GAC1BV,WAAYY,GAA0BF,GACtCT,cAAegB,GAAwC,GACvDf,UAAWt0B,uBAAqBC,MAAM21B,YAAY/qC,mBAItD,oBAAItB,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CAAoBoR,cAAeA,EAAeE,cAAeA,EAAeD,aAAcA,IAE9F,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAA1F,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASi2B,EAAxC,8BAwBRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrB+iC,iBAAkBhjC,IAAUyS,KAC5BlL,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBiC,kBAAmBjjC,IAAUghC,MAC7B0B,YAAa1iC,IAAUC,QAGV6iC,UC5DTW,GAAyB/d,aAAW,CACxCC,iBADwC,YAEtC,MAAO,CACL+d,YAFsD,EAAvCA,YAGf/D,SAHsD,EAA1BA,SAI5BpS,aAJsD,EAAhBA,eAO1CrH,iBAAkBzC,OAAa0C,MAAM,CACnCud,YAAajgB,OAAatR,SAAS,wDAErCmU,aAXwC,SAW3B0K,GACXA,EAAI2O,aAZuBja,EAnFL,SAAC9mB,GACzB,IAAMouB,EAAc3qB,mBACdV,EAASU,iBAAOzD,EAAM+C,QACtBsrB,EAAU5qB,iBAAOzD,EAAMquB,SACvB0W,EAAa/kC,EAAM+kC,WAEzB7lC,qBAAU,WACR6D,EAAOW,QAAU1D,EAAM+C,OACvBsrB,EAAQ3qB,QAAU1D,EAAMquB,UACvB,CAACruB,EAAM+C,OAAQ/C,EAAMquB,UAExBnvB,qBAAU,YACHc,EAAMmuB,eAAiBE,EAAQ3qB,SAAWukB,OAAOC,KAAKnlB,EAAOW,SAAS/C,OAAS,GACjE6tB,IAASC,YAAYL,EAAY1qB,SACzChM,mBAEV,CAACsI,EAAMmuB,eAEVjvB,qBAAU,WACRhI,MACC,IAgBH,OACE,qBAAKqB,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQgiC,aACrD,cAAC,GAAD,CAAmB/hC,OAAQ/C,EAAM+C,SAEnC,qBAAKxK,UAAU,aACCkH,IAAfslC,GACC,qBAAKxsC,UAAU,MAAf,SACE,uBAAMlB,GAAG,qBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdE,IAAI,IACJpC,KAAK,0BACLxJ,GAAG,cACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,cACL4H,MAAOlD,EAAM2nB,OAAOmd,YACpBliC,SAAU,SAACvL,GACT2I,EAAM8nB,cAAc,cAAezwB,GACnC2I,EAAMglC,kBAAkB3tC,IAE1BhB,MAAO2J,EAAM+C,OAAO+hC,aAAe9kC,EAAM8C,QAAQgiC,YACjD3hC,QAxCZ8kB,OAAO4Q,QAAQkM,GACZtkC,KAAI,YAAmB,IAAD,mBAAhBmN,EAAgB,KAAX1K,EAAW,KACf+hC,EAAkBjlC,EAAM4+B,iBAAiBhxB,GAC/C,GAAIq3B,EACF,MAAO,CACL7hC,MAAOF,EACPA,MAAO+hC,EAAgBtoB,mBAK5BzT,OAAOhV,WA+BC8L,EAAM+C,OAAO+hC,aAAe9kC,EAAM8C,QAAQgiC,aACzC,cAAC,IAAD,UAAsB9kC,EAAM+C,OAAO+hC,mBAM3C,cAAC,IAAD,CAAiBpuC,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,8BAwBRkW,GAAuB1jC,UAAY,CACjC6jC,kBAAmB5jC,IAAUyS,KAAKvS,WAClCwjC,YAAa1jC,IAAU4S,OACvB+sB,SAAU3/B,IAAUyS,KAAKvS,WACzBqtB,aAAcvtB,IAAUyS,KAAKvS,WAC7ByjC,WAAY3jC,IAAU0S,OAAOxS,WAC7Bs9B,iBAAkBx9B,IAAU0S,OAAOxS,YAGtBujC,UCjHFK,GAA+B,SAAC,GAMtC,IALLC,EAKI,EALJA,+BAMA,MAAO,CACL,CACE5E,SAHA,EAJJ1B,gBAQIrlB,QAJA,EAHJ4rB,mBAQInsB,cALA,EAFJA,cAQIksB,+BAAgCA,EAChCE,OAPA,EADJA,UAiBWC,GAAwC,SAACnqB,GACpD,MAAO,CACLqE,WAAYrE,EAASqE,WACrBnD,iBAAkBlB,EAASkB,iBAAmBlB,EAASkB,iBAAiBlV,MAAM,KAAK,GAAGoE,OAAS,KAC/Fg6B,UAAWpqB,EAASsc,SACpBG,YAAa,IAAI/+B,KAAKsiB,EAASyc,aAAa4N,eAAe,WAIlDC,GAAuB,SAAC,GAK9B,IAJLC,EAII,EAJJA,sBAII,IAHJC,sBAGI,MAHa,GAGb,MAFJC,iBAEI,MAFQ,GAER,MADJC,2BAEIC,EAAa,GACXC,GAAiD,UAFnD,UAE0D,0CAA4C,GAS1G,OARAJ,EAAep9B,SAAQ,SAAChR,EAASmJ,GAC/BolC,GAAU,kBAAevuC,EAAQyuC,OAAvB,qBAA0CzuC,EAAQmT,KAAlD,eACVk7B,EAAUr9B,SAAQ,SAACmC,GACbA,EAAKhK,QAAUA,IACjBolC,GAAcp7B,EAAKA,YAIlB,CACLnU,MAAOmvC,EACPj/B,QAAQ,qCAAD,OAAuCq/B,EAAvC,yBAAkEC,KAIhEE,GAAb,WACE,aAAe,qBACbpxB,KAAKqxB,QAAU,GAFnB,kDAKE,SAAcpyB,GAA4B,IAApBqyB,EAAmB,4DAAX1mC,EAC5BoV,KAAKqxB,QAAQp/B,KAAK,CAChBxL,KAAMwY,EAAOxY,KACb6qC,MAAOA,GAAgBryB,EAAOqyB,MAC9BzvC,KAAMod,EAAOpd,SATnB,2BAaE,WAAkC,IAApByvC,EAAmB,4DAAX1mC,EACpBoV,KAAKuxB,cACH,CACE9qC,KAAM,aACN6qC,MAAO,cACPzvC,KAAM,OAERyvC,KApBN,wCAwBE,WAA+C,IAApBA,EAAmB,4DAAX1mC,EACjCoV,KAAKuxB,cACH,CACE9qC,KAAM,kBACN6qC,MAAO,mBACPzvC,KAAM,OAERyvC,KA/BN,4BAmCE,WAAmC,IAApBA,EAAmB,4DAAX1mC,EACrBoV,KAAKuxB,cACH,CACE9qC,KAAM,cACN6qC,MAAO,UACPzvC,KAAM,UAERyvC,KA1CN,0BA8CE,WAAiC,IAApBA,EAAmB,4DAAX1mC,EACnBoV,KAAKuxB,cACH,CACE9qC,KAAM,YACN6qC,MAAO,aACPzvC,KAAM,UAERyvC,KArDN,gCAyDE,WAAuC,IAApBA,EAAmB,4DAAX1mC,EACzBoV,KAAKuxB,cACH,CACE9qC,KAAM,kBACN6qC,MAAO,iBACPzvC,KAAM,UAERyvC,KAhEN,0BAoEE,WAAiC,IAApBA,EAAmB,4DAAX1mC,EACnBoV,KAAKuxB,cACH,CACE9qC,KAAM,YACN6qC,MAAO,aACPzvC,KAAM,UAERyvC,KA3EN,4BA+EE,WAAmC,IAApBA,EAAmB,4DAAX1mC,EACrBoV,KAAKuxB,cACH,CACE9qC,KAAM,cACN6qC,MAAO,eACPzvC,KAAM,UAERyvC,KAtFN,iCA0FE,WAAwC,IAApBA,EAAmB,4DAAX1mC,EAC1BoV,KAAKuxB,cACH,CACE9qC,KAAM,mBACN6qC,MAAO,YACPzvC,KAAM,UAERyvC,KAjGN,sBAqGE,WAA6B,IAApBA,EAAmB,4DAAX1mC,EACfoV,KAAKuxB,cACH,CACE9qC,KAAM,QACN6qC,MAAO,QACPzvC,KAAM,UAERyvC,KA5GN,8BAgHE,WACE,OAAOtxB,KAAKqxB,YAjHhB,KC5DaG,GAAe,SAAC,GAAoD,IAAlD/rB,EAAiD,EAAjDA,eAAiD,IAAjCgsB,sBAAiC,WAAhB7mC,EAAgB,EAC9E,MAAO,CACL6a,eAAgBA,EAChBpD,aAAa,EACbC,eAAe,EACf3X,YAAa,EACbijC,aAAcrjC,cAAYC,QAAQN,gBAClCwnC,qBAAqB,EACrBC,SAAU,CACRC,mBAAmB,EACnBjqB,sBAAuB,GACvBkqB,SAAU,KACVjrB,UAAW,GACX4B,aAAc,GACd5J,uBAAmBhU,EACnB6mC,eAAgBA,QAAkC7mC,EAClDwd,YAAa,GACbJ,eAAWpd,EACXgf,2BAAuBhf,EACvBge,iBAAkB,GAClBE,oBAAqB,GACrB8iB,kBAAkB,EAClB1oB,oBAAgBtY,EAChBgJ,cAAe,GACfk+B,cAAe,QACftoB,UAAW,KACXE,YAAa,KACbV,iBAAape,EACbse,uBAAmBte,EACnBwe,4BAAwBxe,EACxB0e,uBAAmB1e,EACnB0d,gBAAY1d,EACZkf,sBAAkBlf,EAClBof,kCAA8Bpf,EAC9BqlC,iBAAarlC,GAEf0b,SAAU,CACRiE,gBAAiB,GACjBG,sBAAuB,GACvBknB,mBAAmB,EACnBjnB,WAAY,MAMZonB,GAAoB,qBACpBC,GAAuB,yBACvBC,GAAuB,yBACvBC,GAAgB,iBAChBC,GAAoB,sBACpBC,GAAqB,uBACrBlf,GAAY,cACZmf,GAAuB,yBAIhBC,GACXP,GADWO,GAEXN,GAFWM,GAGXL,GAHWK,GAIXJ,GAJWI,GAKXH,GALWG,GAMXF,GANWE,GAOXpf,GAPWof,GAQXD,GAGWE,GAAa,CAExB9sB,eAAgB,iBAChBpD,YAAa,cACbC,cAAe,gBACf3X,YAAa,cACbijC,aAAc,eACdtnB,SAAU,WACVorB,oBAAqB,sBAErBE,kBAAmB,oBACnBjqB,sBAAuB,wBACvBkqB,SAAU,WACVjrB,UAAW,YACX4B,aAAc,eACd5J,kBAAmB,oBACnB6yB,eAAgB,iBAChBrpB,YAAa,cACbJ,UAAW,YACX4B,sBAAuB,wBACvBhB,iBAAkB,mBAClBE,oBAAqB,sBACrB8iB,iBAAkB,mBAClB1oB,eAAgB,iBAChBtP,cAAe,gBACfk+B,cAAe,gBACftoB,UAAW,YACXE,YAAa,cACbV,YAAa,cACbE,kBAAmB,oBACnBE,uBAAwB,yBACxBE,kBAAmB,oBACnBhB,WAAY,aACZwB,iBAAkB,mBAClBE,6BAA8B,+BAC9BimB,YAAa,eAGFuC,GAAU,SAAClxC,EAAO8mC,GAC7B,OAAQA,EAAOvmC,MACb,KAAKkwC,GACH,OAAO,6BACFzwC,GACA8mC,EAAO5R,SAEd,KAAKwb,GACH,OAAO,6BACF1wC,GADL,IAEEqwC,SAAS,6BACJrwC,EAAMqwC,UACNvJ,EAAO5R,WAGhB,KAAK6b,GACH,OAAO,6BACF/wC,GADL,IAEEglB,SAAS,6BACJhlB,EAAMglB,UACN8hB,EAAO5R,WAGhB,KAAKyb,GACH,OAAO,6BACF3wC,GADL,IAEEqwC,SAAS,6BACJrwC,EAAMqwC,UADH,IAENzuB,eAAgB,CACdtK,QAASwvB,EAAO5R,QAAQ5d,QAAQzD,WAChC0D,SAAUuvB,EAAO5R,QAAQ3d,SAAS1D,WAClCgC,WAAYixB,EAAO5R,QAAQxS,OAC3BzkB,SAAU6oC,EAAO5R,QAAQj3B,SACzBgnB,KAAM6hB,EAAO5R,QAAQnf,KACrB7B,SAAU4yB,EAAO5R,QAAQhhB,SACzB0P,KAAMkjB,EAAO5R,QAAQtR,KACrBvM,KAAMyvB,EAAO5R,QAAQ7d,KACrBsL,OAAQmkB,EAAO5R,QAAQvS,OACvB5P,OAAQ+zB,EAAO5R,QAAQniB,OACvBmS,QAAS4hB,EAAO5R,QAAQhQ,QACxBgB,iBAAkB4gB,EAAO5R,QAAQhP,iBACjCN,WAAYkhB,EAAO5R,QAAQtP,YAE7B0kB,kBAAkB,MAGxB,KAAKsG,GACH,OAAO,6BACF5wC,GADL,IAEEqwC,SAAS,6BACJrwC,EAAMqwC,UADH,IAENzuB,oBAAgBtY,EAChBghC,kBAAkB,MAGxB,KAAKuG,GACH,IAAIM,EAAc,YAAOnxC,EAAMqwC,SAAS/9B,eAExC,OADA6+B,EAAexgC,KAAf,MAAAwgC,EAAc,YAASrK,EAAO5R,UACvB,6BACFl1B,GADL,IAEEqwC,SAAS,6BACJrwC,EAAMqwC,UADH,IAEN/9B,cAAe6+B,MAGrB,KAAKL,GACH,IAAI5gC,EAAQlQ,EAAMqwC,SAAS/9B,cAE3B,OADApC,EAAMozB,OAAOwD,EAAO5R,QAAS,GACtB,6BACFl1B,GADL,IAEEqwC,SAAS,6BACJrwC,EAAMqwC,UADH,IAEN/9B,cAAepC,MAGrB,KAAK0hB,GACH,OAAO,gBAAKkV,EAAO5R,SACrB,QACE,OAAOl1B,ICpLAoxC,GAAoB,SAAC,GAAgC,IAA9BnvC,EAA6B,EAA7BA,IAC9BwiB,EAD2D,EAAxB4sB,kBASvC,OANIpvC,EAAIgQ,SAASjP,EAAmBC,UAClCwhB,EAAagG,IAEXxoB,EAAIgQ,SAASjP,EAAmB5E,YAClCqmB,EAAagG,IAERhG,GC0jBM6sB,GA7hBW,WACxB,IAAIrzC,EAAWq8B,cACX14B,EAAWkH,cACf,EAAkDH,mBAAS,IAA3D,mBAAOulC,EAAP,KAA0BqD,EAA1B,KACM5vC,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMhJ,EAAe,UAAM7vB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBF,aAAawB,oBAG5FoB,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAGnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAEhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,KAIT6B,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW5nC,YAAcsoC,OAChF,CAAC3xC,EAAMqJ,YAAapL,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAGhF,IAAM0vC,EAAkBr+B,uBACtB,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MACnD,CAACE,EAAUF,IAGPxG,EAAoB,uCAAG,WAAO/+B,GAAP,mBAAAlK,EAAA,sEACRuT,GAAiBrJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GADlD,cACrBgP,EADqB,gBAEJ3N,GAA0BhK,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAF/D,OAErBV,EAFqB,OAGrB0N,EAAiB,CACrBtK,QAASrL,EAAE09B,QAAQK,SAASp2B,EAAEC,WAC9B0D,SAAUtL,EAAE09B,QAAQK,SAASp1B,EAAEf,WAC/B6O,OAAQzW,EAAE09B,QAAQn0B,WAAWq8B,UAC7BjsB,WAAY3Z,EAAE09B,QAAQn0B,WAAWs8B,YACjC/7B,KAAM9J,EAAE09B,QAAQn0B,WAAWyP,KAC3B5N,KAAMpL,EAAE09B,QAAQn0B,WAAWu8B,KAC3BpvB,OAAQ1W,EAAE09B,QAAQn0B,WAAWw8B,OAC7B9sB,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9B/rB,iBAAkBja,EAAE09B,QAAQn0B,WAAW08B,YACvCj0C,SAAUgO,EAAE09B,QAAQn0B,WAAW28B,SAC/Bp/B,OAAO,WAAD,OAAa9G,EAAE09B,QAAQn0B,WAAWy8B,SACxCruB,OACA1P,YAEFw9B,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAStT,IACxD8vB,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWV,SAAWtkC,EAAE09B,QAAQn0B,WAAW48B,aArB9B,2CAAH,sDAiHpBC,EAAsB,WAC1B,IACMC,EADgBxgB,OAAON,OAAO7vB,EAAW8mC,kBACjB11B,QAAO,SAACw/B,GAAD,OAASA,EAAIhC,WAAavwC,EAAMqwC,SAASE,YAAU,GACxF,QAAgBjnC,IAAZgpC,EACF,OAAOA,EAAQrE,kBAmEbjL,EAAc,uCAAG,kCAAAjhC,EAAA,6DACfs0B,EADe,gBACHr2B,EAAMqwC,UAClBmC,EAAgB1gB,OAAON,OAAO7vB,EAAW8mC,kBAC/CpS,EAAKjR,UAAYplB,EAAMowC,oBAAsBzuC,EAAWynC,sBAAwBznC,EAAWyjB,UAC3FiR,EAAKzP,QAAUjlB,EAAWilB,QAC1ByP,EAAK7P,eAAiBxmB,EAAMowC,oBACxBpwC,EAAMqwC,SAAS1B,YACf6D,EAAcz/B,QAAO,SAACw/B,GAAD,OAASA,EAAIhC,WAAala,EAAKka,YAAU,GAAG/pB,eAPhD,kBAWEisB,GAAwBpc,GAX1B,OAYG,OADhBtmB,EAXa,QAYRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,KAETuwB,EAAqB,KAlBJ,4EAqBZ,GArBY,0DAAH,qDA0BdmB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAyB,MAAlBA,EAAOjR,UAPiB,2CAAH,sDA8B1Bg9B,EAAgB,CACpB/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,GAGNwtC,EACJ,wIAEE,uBAFF,WAGU,sBAAM,cAAY,OAAOrpC,UAAU,+BAH7C,sDAKE,uBALF,2DAOE,uBAPF,6CASE,0BAUE6oC,EAAmB,uCAAG,WAAOh/B,GAAP,eAAAlK,EAAA,sEAEI4wC,EAAgB3oB,6BAA6B,CACzE9E,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9B7sB,UAAWzjB,EAAWyjB,YAJE,cAEpBwtB,EAFoB,OAMtBjxC,EAAW6mC,qBACb+I,EAAqBqB,GAPG,kBASnBA,EAAgBpoC,OAAS,GATN,2CAAH,sDAYnBqoC,EAA0B,WAC9B,IAAMC,EAAWT,IACjB,OAAIS,IAAYnxC,EAAW6mC,qBAEfsK,EAAS//B,QACjB,SAACu7B,GAAD,OAAcJ,EAAkBh5B,MAAK,gBAAGssB,EAAH,EAAGA,WAAH,OAAoB8M,EAAQptC,KAAOsgC,EAAW3tB,iBAE5ErJ,OAAS,GAKhBuoC,EAAkB,WACtB,IAAIC,GAAe,EAInB,OAHIrxC,EAAW6mC,sBACbwK,EAAeH,KAEVG,GAWT,OACE,cAAC,GAAD,CACE5uB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBU,eAAeN,KAAM+B,KAAMxD,EAAWwiB,iBANhF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CACNz3B,KAAM,oDACNzI,IAAK,gDAEPsnC,iBAAkB,CAChB,CACE7+B,KAAM,qDACNzI,IAAK,qEAEP,CACEyI,KAAM,qCACNzI,IAAK,6EAGTunC,aAAc,WAAO,IAAD,EAClBkI,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,KAETvf,EAAwB,EAAGE,EAAYC,IAEzC6nC,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAM7rB,EAAmBU,eAAeL,MACxCjC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE8O,SACE5qC,EAAMowC,oBACF,kBAAM3uC,EAAwB,EAAGE,EAAYC,IAC7C,kBAAMH,EAAwB,EAAGE,EAAYC,IAEnD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBArTc,WAC1B,IAAI6H,EAAgB,IAAInD,GAmBxB,OAlBAmD,EAAcC,gBACdD,EAAcE,eACdF,EAAcG,oBAAoB,aAClCH,EAAcI,eAAe,WACjBtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoB,0BACpBnsB,cAAewsB,GAAqB,CAClCC,sBAAuB,wBACvBC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,oBAC9B,CAAEs7B,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,UAAWt7B,KAAM,kBAG/B26B,OAAQ+D,EAAclD,UAmSUuD,GACtBzI,oBA9RL,CACL,CACET,SAAUzoC,EAAWymC,gBACrB/kB,QAAS1hB,EAAW0mC,eACpBvlB,cAAewsB,GAAqB,CAClCC,sBAAuB,wBACvBC,eAAgB,CACd,CAAEK,OAAQ,eAAgBt7B,KAAM,WAChC,CAAEs7B,OAAQ,cAAet7B,KAAM,eAC/B,CAAEs7B,OAAQ,WAAYt7B,KAAM,YAC5B,CAAEs7B,OAAQ,YAAat7B,KAAM,aAC7B,CAAEs7B,OAAQ,OAAQt7B,KAAM,QACxB,CAAEs7B,OAAQ,SAAUt7B,KAAM,eAmRtB2N,mBAAmB,EACnBN,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCmB,mBAAoBA,EACpBT,qBAAsBA,EACtBxmB,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5DsZ,sBArEsB,WAElC,IAAe,IADA0sB,IACM,OAAO/yC,EAAMqwC,SAAShqB,sBAmERktB,GACvB1H,gCACE7rC,EAAMowC,oBACF,uFACA,KAENrF,mBA9Ue,WAC3B2G,EAAS,CAAEnxC,KAAMywC,KACjBU,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAY,MAClFosB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWV,SAAW,SA4UrEtF,oBAAqBA,EACrBE,2BAA2B,kFAC3BnC,+BAAgCrnC,EAAWqnC,+BAC3CwB,qBAjSiB,WAC7B,GAAIrb,GAAUoD,sBAAoBC,qBvFjKS,gCuFkKzC,MAAO,CACLmY,QAAS3qC,EAAMowC,oBACfnjC,MAAOtL,EAAWonC,0BAClB4C,aAAc,WACZ+F,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWb,qBAAuBpwC,EAAMowC,wBAGxD59B,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAetS,EAAMqwC,SAAS/9B,cAC9Bg5B,mBAAmB,EACnBQ,wBAAwB,GAkRM0H,GACtB9H,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrFokB,2BAjW6B,SAAC9M,GAC1C,GAAI5T,EAAW6mC,oBAAqB,CAClC,IAAMiL,EAAel+B,EAASL,MAAK,SAACtB,GAAD,OAAOA,EAAE+1B,QAAQn0B,WAAWy8B,WAC3DwB,GACFxI,EAAoBwI,GAEpBzI,EAAqByI,IAErBlC,EAAqB,MA0Vb/I,oBAAqB7mC,EAAW6mC,oBAChCuD,eArFiCgH,IAsFjCnH,yBACE,cAAC,GAAD,CACEnnB,WAAYipB,GAAc/rC,EAAW4mC,sBACrC0E,WACE4F,IACIjF,GAAuBjsC,EAAW4mC,sBAClCuF,GAAiCnsC,EAAW4mC,sBAElD2E,cAAegB,EACff,UAAWt0B,uBAAqBC,MAAM21B,YAAY/qC,wBAQ9D,cAAC,IAAD,CACEmrB,KAAM7rB,EAAmBU,eAAeJ,MACxClC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD+sC,YAAa3uC,EAAMqwC,SAAS1B,YAC5BC,WAAYjtC,EAAWwnC,wBACvBV,iBAAkB9mC,EAAW8mC,iBAC7BoG,kBAAmB,SAAC3tC,GAClBwwC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWtC,YAAcztC,KACpFwwC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBACL+b,GAAWV,SAAWze,OAAON,OAAO7vB,EAAW8mC,kBAAkB11B,QAChE,SAACw/B,GAAD,OAASA,EAAI/rB,iBAAmBtlB,KAChC,GAAGqvC,oBASnB,cAAC,IAAD,CACE1hB,KAAM7rB,EAAmBU,eAAeH,MACxCnC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEtD,aACEx4B,EAAMowC,oBACF,kBAAM3uC,EAAwB,EAAGE,EAAYC,IAC7C,kBAAMH,EAAwB,EAAGE,EAAYC,IAEnDgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B2oB,iBAAkBoE,EAClBrE,oBAAqB,SAACjhC,GAAD,OACnB2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MAEpFuF,cAAetS,EAAMqwC,SAAS/9B,cAC9B47B,kBAAmBA,EACnBP,YAAahsC,EAAW4mC,4BAMhC,cAAC,IAAD,CACE1Z,KAAM7rB,EAAmBU,eAAeC,MACxCvC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UApVS,WACrB,IAkDyC,EAlDnC2F,EAAgB1gB,OAAON,OAAO7vB,EAAW8mC,kBACvC4H,EAAarwC,EAAbqwC,SACF9vC,EAAOiyC,EAAcz/B,QAAO,SAACw/B,GAAD,OAASA,EAAIhC,WAAaF,EAASE,YAAU,GACzEjC,EAAU/tC,EAAOA,EAAK0tC,iBAAiBl7B,QAAO,SAACw/B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/qB,aAAW,QAAKhc,EAE3FujC,EAAY,CAChB,CACE1wB,UAAW,cACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,mBAIxE0sC,IACFzB,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,aACXE,UAAW9b,EAAKmzC,UAChBl3B,gBAAiB,kBACf/a,EAAwBzB,EAAMowC,oBAAsB,EAAI,EAAGzuC,EAAYC,EAAU,eAErFirC,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,uBACXE,UAAWiyB,EAAUA,EAAQ/L,YAAc,KAC3C/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,oBAKU,IAA9B3zC,EAAMowC,sBACRvD,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,eACXE,UAAS,UAAEg0B,EAASzuB,sBAAX,aAAE,EAAyBsD,QACpC1I,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,eAI5E,OAAOirC,EAyRgB+G,UAMnB,cAAC,IAAD,CACE/kB,KAAM7rB,EAAmBU,eAAeE,aACxCxC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASoB,EAAmBU,eAAeN,KAAOJ,EAAmBC,SAC5Fwe,kBAAmB,kBAAM7f,EAASoB,EAAmBU,eAAeN,KAAOJ,EAAmB5E,WAC9FkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWO,SAAS,UAM5C,cAAC,IAAD,CACE2sB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBAhQL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBA4PpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA/QiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QA2Q5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBACjB13B,EAASoB,EAAmBU,eAAeN,KAAOJ,EAAmBU,eAAeE,yBCpjBvFukC,GAAb,gEAEE2L,iBAAmB,CACjBC,eAAgB,CAAE7yC,GAAI,IAAKiE,KAAM,oBACjC6uC,YAAa,CAAE9yC,GAAI,IAAKiE,KAAM,iBAC9B8uC,aAAc,CAAE/yC,GAAI,IAAKiE,KAAM,kBAC/B+uC,aAAc,CAAEhzC,GAAI,IAAKiE,KAAM,kBAC/BgvC,iBAAkB,CAAEjzC,GAAI,IAAKiE,KAAM,uBAPvC,KAUEivC,iBAAmB,CACjB11B,KAAKo1B,iBAAiBC,eACtBr1B,KAAKo1B,iBAAiBE,YACtBt1B,KAAKo1B,iBAAiBG,aACtBv1B,KAAKo1B,iBAAiBI,aACtBx1B,KAAKo1B,iBAAiBK,kBAf1B,KAiBEhwB,eAAiB,+BAjBnB,KAkBED,cAAgB,4CAlBlB,KAmBE9a,WAAa,EAnBf,KAoBEgc,UAAY,GApBd,KAqBEwB,QAAU,cArBZ,KAuBEqoB,mBAAqB,sBAvBvB,KAwBEM,sBAAwB,sBAxB1B,KA0BEnV,QAAUp3B,EAAmBe,WA1B/B,KA2BE7B,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eAhCxC,KAmCEusC,eAAiB,kBACft3B,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,GACAC,GAAgCoC,MAChC,QAxCN,KA2CE6mB,wBAA0B,WACxB,OAAOviB,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAAC1W,GAAwBM,OA7C7E,KAiDEmd,eAAiBr/B,cAAYC,QAAQN,gBAjDvC,KAkDEogC,+BAAiCpb,GAlDnC,KAoDE+a,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,eCkGhE2kC,GAAuBpd,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLtL,UAFiF,EAAlEA,WAES,GACxB4B,aAHiF,EAAvDA,cAGI,GAC9BipB,eAJiF,EAAzCA,gBAIN,KAClCvF,SALiF,EAAzBA,SAMxD9jB,YANiF,EAAfA,aAMtC,KAGhCqK,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,8CACjC0J,YAAa4H,OAAatR,SAAS,0DACnC8J,aAAcwH,OAAa4lB,KAAK,CAAC,YAAa,kBAAmB,CAC/DC,GAAI,SAACjvB,EAAW6qB,GAAZ,OAA+B7qB,IAAc6qB,GACjDvxC,KAAM8vB,OAAatR,SAAS,0CAGhCmU,aAlBsC,SAkBzB0K,GACXA,EAAI2O,aAnBqBja,EAhJT,SAAC,GAkBd,IAjBLqH,EAiBI,EAjBJA,aACAE,EAgBI,EAhBJA,QACAtrB,EAeI,EAfJA,OACA4kB,EAcI,EAdJA,OACA7kB,EAaI,EAbJA,QACAE,EAYI,EAZJA,YACA8kB,EAWI,EAXJA,cACAqc,EAUI,EAVJA,oBACAC,EASI,EATJA,iBACA37B,EAQI,EARJA,cACAE,EAOI,EAPJA,cACAD,EAMI,EANJA,aACAimB,EAKI,EALJA,aACA4b,EAII,EAJJA,iBACAI,EAGI,EAHJA,oBACArE,EAEI,EAFJA,eACAsE,EACI,EADJA,qBAEMtG,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAYjB,OAVAvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAGF,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa3Y,EAAQma,aAC9D,cAAC,GAAD,CAAmBla,OAAQA,IAG7B,mDACA,gEACA,qBAAKxK,UAAU,MAAf,SACE,uBAAMlB,GAAG,cAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,gBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOykB,EAAOlM,UACd7Y,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GACvBA,IAAMkkC,GACRxe,EAAc,eAAgB,IAEhCqc,EAAoB/hC,IAEtBe,QAASihC,EAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAC1CvhC,MAAOuhC,EAAQptC,GACf+L,MAAOqhC,EAAQ/L,gBAEjBriC,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,YAEpC1Y,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,YACtEkM,EAAOlM,YAAckM,EAAO2e,eAC3B,gCACE,cAAC,GAAD,CACExjC,QAASA,EACTC,OAAQA,EACRlC,KAAK,iBACLxJ,GAAG,eACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,eACLjE,GAAG,eACH6L,MAAOykB,EAAOtK,aACdza,SAAU,SAACR,GACT0lB,EAAc,eAAgB1lB,EAAE2G,OAAO7F,OACvC0nC,EAAqBxoC,EAAE2G,OAAO7F,QAEhC7M,MAAO0M,EAAOsa,cAAgBva,EAAQua,eAEvCta,EAAOsa,cAAgBva,EAAQua,cAC9B,cAAC,IAAD,UAAsBta,EAAOsa,kBAIjC,cAAC,IAAM3d,SAAP,SAKN,iDACA,8GACA,qBAAKnH,UAAU,MAAf,SACE,uBAAMlB,GAAG,gBAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,4BACLxJ,GAAG,cACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,cACL4H,MAAOykB,EAAO1K,YACdra,SAAU,SAACR,GACT0lB,EAAc,cAAe1lB,GAC7BuoC,GAAuBA,EAAoBvoC,IAE7C/L,MAAO0M,EAAOka,aAAena,EAAQma,YACrC9Z,QAASonC,EAAiB9pC,KAAI,SAAC4I,GAAD,MAAW,CACvCjG,MAAOiG,EAAK/N,KACZ4H,MAAOmG,EAAKhS,SAGf0L,EAAOka,aAAena,EAAQma,aAC7B,cAAC,IAAD,UAAsBla,EAAOka,mBAKnC,oBAAI1kB,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CAAoBoR,cAAeA,EAAeE,cAAeA,EAAeD,aAAcA,IAE9F,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAA1F,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASi2B,EAAxC,8BA+BRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrBilC,eAAgBllC,IAAUC,OAC1B4b,YAAa7b,IAAUC,OACvBkpC,iBAAkBnpC,IAAUghC,MAC5Bz5B,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCspC,qBAAsBxpC,IAAUyS,KAAKvS,WACrCqpC,oBAAqBvpC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBgC,iBAAkBhjC,IAAUghC,MAAM9gC,YAGrB4iC,UCgLA2G,GAxVO,WACpB,IAAMz2C,EAAWq8B,cACX14B,EAAWkH,cACXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,eAAgBgsB,eAAgBxuC,EAAWwuC,qBAC3F,CAACxuC,IAEH,EAA0B8vC,qBAAWP,GAAShB,GAAasB,IAA3D,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMhJ,EAAe,UAAM7vB,uBAAqBqwB,4BAA4B9iC,IAAvD,OACnBC,EAAgBF,aAAa0B,uBAEzBomC,EAAmBtsC,EAAW0yC,0BAGpCtrC,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAGnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAEhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,KAIT6B,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW5nC,YAAcsoC,OAChF,CAAC1zC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBAAY,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MAAc,CAACA,IAGhGmD,EAAsB,SAAC3vB,GAC3B,MAAO,CACLqE,WAAYrE,EAASqE,WACrBJ,gBAAiBjE,EAASiE,gBAC1BnO,UAAWkK,EAASsc,SACpBsT,gBACwB,UAAtB5vB,EAASsc,SACL,kCAAoCtc,EAAS6vB,gBAAkB,aAC/D,GACNpT,YAAa,IAAI/+B,KAAKsiB,EAASyc,aAAa4N,eAAe,WAgGzDrM,EAAc,uCAAG,gCAAAjhC,EAAA,6DACfs0B,EADe,gBACHr2B,EAAMqwC,WACnBjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAME6rB,GAAwBpc,GAN1B,OAOG,OADhBtmB,EANa,QAORjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAXQ,4EAeZ,GAfY,0DAAH,qDAoBd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDAiC1Bg9B,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAIR62C,EA5JsB,WAC1B,IAAI7B,EAAgB,IAAInD,GAoBxB,OAnBAmD,EAAcC,gBACdD,EAAc8B,6BACd9B,EAAc+B,eACd/B,EAAcI,iBACFtE,GAA6B,CACvCC,+BAAgC2F,EAChCjM,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCk7B,UAAW,CAAC,CAAEllC,MAAO,EAAGgK,KAAM,sBAC9Bm7B,4BAA4B,IAE9BR,OAAQ+D,EAAclD,UAyIeuD,GAEzC,OACE,cAAC,GAAD,CACElvB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBe,WAAWX,KAAM+B,KAAMxD,EAAWwiB,iBAN5E,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CAAEz3B,KAAM,4BAA6BzI,IAAK,4CAClDsnC,iBAAkB,CAChB,CACE7+B,KAAM,iDACNzI,IAAK,iEAEP,CACEyI,KAAM,iCACNzI,IAAK,2DAGTunC,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,SAIbyoB,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBAAsB0J,EACtBlzB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrFumB,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5DsZ,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC0kB,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3ChI,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B4B,aAAclnB,EAAMqwC,SAASnpB,aAC7BipB,eAAgBnwC,EAAMqwC,SAASF,eAC/BrpB,YAAa9mB,EAAMqwC,SAASvpB,YAC5BstB,iBAAkBzyC,EAAWyyC,iBAC7BpG,oBAhNkB,SAACjhC,GAC/B2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,KAE9EA,IAAU/M,EAAMqwC,SAASF,gBAC3BuB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW/pB,aAAe,OA6M3EstB,oBAAqB,SAACznC,GAAD,OACnB2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWnqB,YAAc/Z,MAEtF0nC,qBAAsB,SAAC1nC,GAAD,OACpB2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW/pB,aAAena,MAEvFuF,cAAetS,EAAMqwC,SAAS/9B,cAC9B27B,iBAAkBA,SAM1B,cAAC,IAAD,CACEpf,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UA5NS,WACrB,IAAMwD,EAAWrwC,EAAMqwC,SACjBv1B,EAAYmzB,EAAiBl7B,QAAO,SAACw/B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/qB,aAAW,GAC5E2vB,EAAYtzC,EAAWyyC,iBAAiBrhC,QAAO,SAACw/B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAASvpB,eAAa,GACzF+lB,EAAY,CAChB,CACE1wB,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,gBACXE,UAAWvB,EAAYA,EAAUynB,YAAc,KAC/C/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,gBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,kBACXE,UAAW44B,EAAYA,EAAU9vC,KAAO,KACxCqX,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAc5E,OATIyuC,EAAS/qB,YAAc+qB,EAASF,gBAClCtD,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,oCACXE,UAAWg0B,EAASnpB,aAAempB,EAASnpB,aAAe,KAC3D1K,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,gBACxE+xC,mBAAoB,kBAIjB9G,EAqKgB+G,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAM3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBA9IL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBA0IpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA7JiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAyJ5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBCvWxEukC,G,cAoCnB,aAAe,IAAD,iCAnCd/N,QAAUp3B,EAAmBa,eAmCf,KAlCdqxC,mBAAqB,CACnB,CACExqC,KAAM,qDACNzI,IAAK,qEAEP,CACEyI,KAAM,qCACNzI,IAAK,+DA2BK,KAxBdiiB,cAAgB,gDAwBF,KAvBd8kB,+BAAiCpb,GAuBnB,KAtBdqhB,mBAAqB,0BAsBP,KArBdM,sBAAwB,sBAqBV,KApBdprB,eAAiB,mCAoBH,KAnBdiB,UAAY,GAmBE,KAlBdljB,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eAaxB,KAXdgjB,QAAU,kBAWI,KAVdxd,WAAa,EAUC,KATdk/B,eAAiBr/B,cAAYC,QAAQN,gBASvB,KARdusC,iBAAmB,CACjBzqC,KAAM,gCACNzI,IAAK,gDAMO,KAFdmzC,yBAA2B,GAEb,KASdzM,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YARlEsV,KAAK02B,yBAA2BtjB,OAAON,OACrC3Y,uBAAqB0oB,yBAAyB,CAC5C1W,GACAM,SCqDF4iB,GAAuBpd,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLtL,UAFsC,EAAvBA,WAES,GACxBslB,SAHsC,EAAZA,WAM9BzZ,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,sDAEnCmU,aAVsC,SAUzB0K,GACXA,EAAI2O,aAXqBja,EAlFT,SAAC,GAcd,IAbLqH,EAaI,EAbJA,aACAE,EAYI,EAZJA,QACA1G,EAWI,EAXJA,OACA5kB,EAUI,EAVJA,OACAD,EASI,EATJA,QACAE,EAQI,EARJA,YACA8kB,EAOI,EAPJA,cACAqc,EAMI,EANJA,oBACA17B,EAKI,EALJA,cACAE,EAII,EAJJA,cACAD,EAGI,EAHJA,aACAimB,EAEI,EAFJA,aACAyV,EACI,EADJA,iBAEME,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAYjB,OAVAvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAGF,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa,cAAC,GAAD,CAAmB1Y,OAAQA,IAEnF,mDACA,gEACA,qBAAKxK,UAAU,MAAf,SACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,sBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOykB,EAAOlM,UACd7Y,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GAC3B+hC,EAAoB/hC,IAEtB/L,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,UACnCtY,QAASihC,EAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAC1CrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB0L,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,iBAI3E,oBAAIljB,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CAAoBoR,cAAeA,EAAeE,cAAeA,EAAeD,aAAcA,IAE9F,cAAC,IAAD,CACEhS,KAAK,SACLoX,SAAUqgB,EACV51B,UAAWC,IAAc0a,QAAU,sBAHrC,kBAMA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASi2B,EAAxC,8BAuBRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrBsH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBgC,iBAAkBhjC,IAAUghC,MAAM9gC,YAGrB4iC,UC6MAsH,GAjTW,WACxB,IAAIp3C,EAAWq8B,cACX14B,EAAWkH,cACTnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMhJ,EAAe,UAAM7vB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBF,aAAayB,2BACtFqmC,EAAmBtsC,EAAWyzC,yBAE9BzD,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAEzDpY,qBAAU,WAAO,IAAD,EACR8mC,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW5nC,YAAcsoC,GADrB,eAEJV,GAAW9sB,eAAiB0rB,GAFxB,OAKR,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBwtB,IAGlD,IAAMC,EAAkBr+B,uBACtB,kBACEm+B,EAAS,CACPnxC,KAAMywC,GACN9b,QAASgb,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,qBAEvD,CAACutB,EAAU/vC,EAAWwiB,iBAiClB6e,EAAc,uCAAG,gCAAAjhC,EAAA,6DACfs0B,EADe,gBACHr2B,EAAMqwC,WACnBjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAME6rB,GAAwBpc,GAN1B,OAOG,OADhBtmB,EANa,QAORjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,KAETvf,EAAwB,EAAGE,EAAYC,IAbtB,4EAgBZ,GAhBY,0DAAH,qDA8Dd8wC,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GAAD,OAA8B,MAAlBA,EAAOjR,UANO,2CAAH,sDA0B1Bg9B,EAAgB,iBAAO,CAC3B/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAGZ,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBa,eAAeT,KAAM+B,KAAMxD,EAAWwiB,iBANhF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQxgC,EAAWwzC,iBACnB5L,iBAAkB5nC,EAAWuzC,mBAC7B1L,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAWlwB,aAAc,GADrB,eAEJkwB,GAAWjwB,eAAgB,GAFvB,SAObyoB,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DggB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrFmtC,qBAtKkB,WAC9B,IAAM6H,EAAgB,IAAInD,GAwB1B,OAvBAmD,EAAcC,gBACdD,EAAc8B,6BACd9B,EAAcqC,WACdrC,EAAcI,iBAEGtE,GAA6B,CAC5CC,+BAAgC,SAAChqB,GAAD,MAAe,CAC7CuwB,MAAOvwB,EAASsc,SAChBG,YAAa,IAAI/+B,KAAKsiB,EAASyc,aAAa4N,eAAe,WAE7D3G,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,QAASt7B,KAAM,SACzB,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBAgJUC,GACtBpvB,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5Dg+B,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3ChI,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OACbwhC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAShlB,KAGbqC,aAAc,SAAChI,GAAD,OACZmnC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAS3qB,KAGb+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1BwB,YAAa9mB,EAAMqwC,SAASvpB,YAC5BknB,oBAAqB,SAACjhC,GAAD,OACnB2kC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBACL+b,GAAW3rB,UAAYvY,MAI9BuF,cAAetS,EAAMqwC,SAAS/9B,cAC9B27B,iBAAkBA,SAM1B,cAAC,IAAD,CACEpf,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEkH,eAAgBA,EAChB8J,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DirC,UA/KS,WACrB,IAAMyB,EAAUL,EAAiBl7B,QAAO,SAACw/B,GAAD,OAASA,EAAIrxC,KAAOlB,EAAMqwC,SAAS/qB,aAAW,GAEtF,MAAO,CACL,CACEnJ,UAAW,WACXE,UACErc,EAAMqwC,SAASzuB,gBACf5hB,EAAMqwC,SAASzuB,eAAe/L,YAC9B7V,EAAMqwC,SAASzuB,eAAe/L,WAAWrL,OAAS,EAC9CxK,EAAMqwC,SAASzuB,eAAe/L,WAC9B,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWrc,EAAMqwC,SAAShqB,sBAC1B7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,oBACXE,UAAWiyB,EAAUA,EAAQ/L,YAAc,GAC3C/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWrc,EAAMqwC,SAAS/9B,cACxB,oBAAIlQ,UAAU,kBAAd,SACGpC,EAAMqwC,SAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAChC,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBA2IrDgyC,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAM3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBA3IL,WACvB38B,EAAW2mC,kBACboK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAwIpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA1JiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAsJ5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBC1ThFukC,GAAb,gEACEG,eAAiBr/B,cAAYC,QAAQN,gBADvC,KAEEwxB,QAAUp3B,EAAmBkB,gBAF/B,KAGEhC,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eARxC,KAUE8xC,WAAa,oBAVf,KAWEvxB,eAAiB,4BAXnB,KAYED,cAAgB,yCAZlB,KAaE9a,WAAa,EAbf,KAcEgc,UAAY,IAdd,KAeEwB,QAAU,oBAfZ,KAgBEoiB,+BAAiCpb,GAhBnC,KAiBEqhB,mBAAqB,mBAjBvB,KAkBEM,sBAAwB,sBAlB1B,KAoBEoG,sBAAwB,WACtB,OAAO7jB,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAAC1W,GAAwBM,OAtB7E,KA0BEwd,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,eCqEhE2kC,GAAuBpd,aAAW,CACtCC,iBADsC,YACK,IAAxBga,EAAuB,EAAvBA,SACjB,MAAO,CACLtlB,UAFsC,EAAbA,UAGzBslB,SAAUA,IAGdzZ,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,uDAEnCmU,aAVsC,SAUzB0K,GACXA,EAAI2O,aAXqBja,EAvFL,SAAC9mB,GACvB,IAAMouB,EAAc3qB,mBACdV,EAASU,iBAAOzD,EAAM+C,QACtBsrB,EAAU5qB,iBAAOzD,EAAMquB,SAkB7B,OAhBAnvB,qBAAU,WACR6D,EAAOW,QAAU1D,EAAM+C,OACvBsrB,EAAQ3qB,QAAU1D,EAAMquB,UACvB,CAACruB,EAAM+C,OAAQ/C,EAAMquB,UAExBnvB,qBAAU,YACHc,EAAMmuB,eAAiBE,EAAQ3qB,SAAWukB,OAAOC,KAAKnlB,EAAOW,SAAS/C,OAAS,GACjE6tB,IAASC,YAAYL,EAAY1qB,SACzChM,mBAEV,CAACsI,EAAMmuB,eAEVjvB,qBAAU,WACRhI,MACC,IAGD,qBAAKqB,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ2Y,WACrD,cAAC,GAAD,CAAmB1Y,OAAQ/C,EAAM+C,SAGnC,mDACA,8DACA,qBAAKxK,UAAU,MAAf,SACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,uBACLoC,IAAI,IACJ5L,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOlD,EAAM2nB,OAAOlM,UACpB7Y,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAMmkC,oBAAoB/hC,IAE5B/L,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAASnD,EAAMokC,iBAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAChDrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,iBAKzC,qDACuB,IACrB,mBAAG9iB,KAAK,yDAAR,sCAFF,2GAMA,oBAAIJ,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,eAGtB,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,8BAuBRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrB8iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MACzBrB,SAAU3/B,IAAUyS,KAAKvS,WACzBqtB,aAAcvtB,IAAUyS,KAAKvS,WAC7B8iC,iBAAkBhjC,IAAUghC,MAAM9gC,YAGrB4iC,UCmNA6H,GAjTY,WACzB,IAAM33C,EAAWq8B,cACX14B,EAAWkH,cAEXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KAEMzD,EAAmBtsC,EAAWg0C,wBAC9BjN,EAAe,UAAM7vB,uBAAqBqwB,4BAA4B9iC,IAAvD,OACnBC,EAAgBF,aAAa6B,mBAI/Be,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAGnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAEhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,KAIT6B,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW5nC,YAAcsoC,OAChF,CAAC1zC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBAAY,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MAAc,CAACA,IAyEhGxO,EAAc,uCAAG,gCAAAjhC,EAAA,6DACfs0B,EADe,gBACHr2B,EAAMqwC,WACnBjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAOE6rB,GAAwBpc,GAP1B,OAQG,OADhBtmB,EAPa,QAQRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAZQ,4EAgBZ,GAhBY,0DAAH,qDAqBd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAyB,MAAlBA,EAAOjR,UAPiB,2CAAH,sDA8B1Bg9B,EAAgB,CACpB/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,GAGZ,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBkB,gBAAgBd,KAAM+B,KAAMxD,EAAWwiB,iBANjF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CACNz3B,KAAM,2BACNzI,IAAK,oCAEPsnC,iBAAkB,CAChB,CACE7+B,KAAM,wCACNzI,IAAK,0DAGTunC,aAAc,WAAO,IAAD,EAClBkI,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,KAETvf,EAAwB,EAAGE,EAAYC,IAEzC6nC,YAAamI,EACbvrB,sBACE,iKAE8B,IAC5B,mBAAG7jB,KAAK,oDAAR,6BAHF,sCAWR,cAAC,IAAD,CACEqsB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvDwpC,qBAnLc,WAC1B,IAAI6H,EAAgB,IAAInD,GAgBxB,OAfAmD,EAAcE,eACdF,EAAcI,eAAe,WACjBtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,UAAWt7B,KAAM,kBAG/B26B,OAAQ+D,EAAclD,UAoKUuD,GACtB1xB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrFumB,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5DsZ,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC0kB,mBA1Ke,WAC3B2G,EAAS,CAAEnxC,KAAMywC,KACjBU,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAWV,SAAW,SAyKlEvH,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD0jB,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B0oB,oBAAqB,SAACjhC,GACpB2kC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MAGvCuF,cAAetS,EAAMqwC,SAAS/9B,cAC9BE,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E0jC,iBAAkBA,SAM1B,cAAC,IAAD,CACEpf,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UAtMS,WACrB,IAAQwD,EAAarwC,EAAbqwC,SACF/B,EAAUL,GAAoBA,EAAiB/4B,MAAK,SAACo5B,GAAD,OAAaA,EAAQptC,KAAOmvC,EAAS/qB,aAC/F,OAAOgpB,EACH,CACE,CACEnyB,UAAW,WACXE,UACEg0B,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EAC9E6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,uBACXE,UAAWiyB,EAAQ/L,YACnB/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAG5E,GAgKmBgyC,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASoB,EAAmBkB,gBAAgBd,KAAOJ,EAAmBC,SAC7Fwe,kBAAmB,kBACjB7f,EAASoB,EAAmBkB,gBAAgBd,KAAOJ,EAAmB5E,WAExEkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWO,SAAS,UAM5C,cAAC,IAAD,CAAO2sB,KAAM7rB,EAAmBC,OAAQ7B,QAAS,cAAC,GAAD,CAAYk9B,mBA5ItC,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAuIpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA1JiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAsJ5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBCnUhFukC,GAAb,cAIE,aAAe,IAAD,iCAHd0N,aAAe,GAGD,KAFdC,YAAc,GAEA,KAKdxN,eAAiBr/B,cAAYC,QAAQN,gBALvB,KAOdwxB,QAAUp3B,EAAmBiB,wBAPf,KAUd/B,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eAfxB,KAkBdugB,eAAiB,0CAlBH,KAmBdD,cAAgB,2DAnBF,KAoBd9a,WAAa,EApBC,KAqBdgc,UAAY,GArBE,KAsBdwB,QAAU,6BAtBI,KAwBdqoB,mBAAqB,2BAxBP,KAyBdM,sBAAwB,sBAzBV,KA0BdvG,+BAAiCpb,GA1BnB,KA6Bd+a,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YA5BlEsV,KAAKm3B,aAAeh9B,uBAAqBqwB,4BAA4Bpe,IAA8BirB,WAAW70C,GAC9Gwd,KAAKo3B,YAAchkB,OAAON,OAAO3Y,uBAAqBqwB,4BAA4Bpe,QCkKhFijB,GAAuBpd,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLtL,UAFwE,EAAzDA,UAGf0wB,cAHwE,EAA9CA,cAI1BxM,aAJwE,EAA/BA,aAKzCl3B,cALwE,EAAjBA,eAKvB,KAGpC6e,iBAAkBzC,OAAa0C,MAAM,CACnC4kB,cAAetnB,OAAatR,SAAS,sDACrCkI,UAAWoJ,OAAa4lB,KAAK,gBAAiB,CAC5CC,GAAI,SAAChC,GAAD,YAAiBjpC,IAARipC,GAA6B,OAARA,GAAwB,KAARA,GAClD3zC,KAAM8vB,OAAatR,SAAS,qDAC5B64B,UAAWvnB,OAAawnB,kBAG5B3kB,aAjBsC,SAiBzB0K,GACXA,EAAIuN,iBAlBqB7Y,EArJL,SAAC9mB,GACvB,MAAgDlB,wBAASW,GAAzD,mBAAO2kC,EAAP,KAAyBkI,EAAzB,KACMC,EAAqBv9B,uBAAqB0oB,yBAAyB,CACvE1W,GACAM,GACAC,GAA6Ca,mBAC5C/qB,GAEG+2B,EAAc3qB,mBACdV,EAASU,iBAAOzD,EAAM+C,QACtBsrB,EAAU5qB,iBAAOzD,EAAMquB,SAwB7B,OAtBAnvB,qBAAU,WACR6D,EAAOW,QAAU1D,EAAM+C,OACvBsrB,EAAQ3qB,QAAU1D,EAAMquB,UACvB,CAACruB,EAAM+C,OAAQ/C,EAAMquB,UAExBnvB,qBAAU,YACHc,EAAMmuB,eAAiBE,EAAQ3qB,SAAWukB,OAAOC,KAAKnlB,EAAOW,SAAS/C,OAAS,GACjE6tB,IAASC,YAAYL,EAAY1qB,SACzChM,mBAEV,CAACsI,EAAMmuB,eAEVjvB,qBAAU,WACRhI,MACC,IAGHgI,qBAAU,WACR,IAAMstC,EAAcxsC,EAAMisC,YAAY5gC,MAAK,SAACmhC,GAAD,OAAiBA,EAAYn1C,KAAO2I,EAAM2nB,OAAOwkB,iBAC5FG,OAAoC7sC,IAAhB+sC,EAA4BA,EAAYC,gBAAahtC,KACxE,CAACO,EAAM2nB,OAAOwkB,cAAensC,EAAMisC,cAGpC,qBAAK1zC,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ2Y,WAAazb,EAAM8C,QAAQqpC,eAChF,cAAC,GAAD,CAAmBppC,OAAQ/C,EAAM+C,SAEnC,mDACA,qBAAKxK,UAAU,MAAf,SACE,uBAAMlB,GAAG,oBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,wBACLoC,IAAI,IACJ5L,GAAG,gBACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,gBACL4H,MAAOlD,EAAM2nB,OAAOwkB,cACpBvpC,SAAU,SAACR,GACTpC,EAAM0sC,cACN1sC,EAAM8nB,cAAc,gBAAiB1lB,GACrCpC,EAAM8nB,cAAc,YAAa,IACjC9nB,EAAM2sC,oBAAoBvqC,IAE5B/L,MAAO2J,EAAM+C,OAAOopC,eAAiBnsC,EAAM8C,QAAQqpC,cACnDhpC,QAASnD,EAAMisC,YAAYxrC,KAAI,SAAC/J,GAAD,MAAW,CACxC0M,MAAO1M,EAAKgiC,YACZx1B,MAAOxM,EAAKW,SAGf2I,EAAM+C,OAAOopC,eAAiBnsC,EAAM8C,QAAQqpC,eAC3C,cAAC,IAAD,UAAsBnsC,EAAM+C,OAAOopC,0BAInB1sC,IAArB2kC,GAAkCA,EAAiBzjC,OAAS,EAC3D,qBAAKpI,UAAU,MAAf,SACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdE,IAAI,IACJpC,KAAK,uBACLxJ,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOlD,EAAM2nB,OAAOlM,UACpB7Y,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAM4sC,gBAAgBxqC,IAExB/L,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAASihC,EAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAC1CrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,sBAIvChc,EAEHO,EAAMyb,YAAc8wB,GACnB,eAAC,GAAD,WACE,gJAEmB,IACjB,mBACE5zC,KAAK,oGACLoQ,OAAO,SACPnQ,IAAI,sBAHN,yEAHF,YASY,IACV,mBACED,KAAK,iGACLoQ,OAAO,SACPnQ,IAAI,sBAHN,2DAVF,OAkBA,6OAOJ,oBAAIL,UAAU,OAAOlB,GAAG,cAAxB,4BAGA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,eAEtB,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM6sC,iBAA9C,8BA8BR3I,GAAqB/iC,UAAY,CAC/BgrC,cAAe/qC,IAAUC,OACzBsrC,oBAAqBvrC,IAAUyS,KAAKvS,WACpCma,UAAWra,IAAUC,OACrBurC,gBAAiBxrC,IAAUyS,KAAKvS,WAChCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MACzBzC,aAAcv+B,IAAUyS,KAAKvS,WAC7BurC,iBAAkBzrC,IAAUyS,KAAKvS,WACjC2qC,YAAa7qC,IAAUghC,MAAM9gC,YAGhB4iC,UC6IA4I,GA3ToB,SAAC9sC,GAClC,IAAM5L,EAAWq8B,cACX14B,EAAWkH,cACXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAAShB,GAAasB,IAA3D,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMrB,EAAWrwC,EAAMqwC,SACjB3H,EAAe,UAAM7vB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBF,aAAa4B,4BACtF+tC,EAAcn0C,EAAWm0C,YACzBc,EAAuBvG,EAAS/oB,mBAAqB3lB,EAAWk0C,aAGtE9sC,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAGnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAEhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,OAER,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBAAY,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MAAc,CAACA,IAGlGyB,EAAgB,IAAInD,GACxBmD,EAAcC,gBACdD,EAAcE,eACdF,EAAc8B,6BACd9B,EAAcI,iBACd,IAAMjI,EAAuB2D,GAA6B,CACxDC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBAiElBxS,EAAc,uCAAG,gCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLga,IACXjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAME+rB,EAAgB5tB,eAAesR,GANjC,OAOG,OADhBtmB,EANa,QAORjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAXQ,4EAeZ,GAfY,0DAAH,qDAoBd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B4wC,EAAgBxpB,uBACpBnpB,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAyB,MAAlBA,EAAOjR,UAPiB,2CAAH,sDA8B1Bg9B,EAAgB,CACpB/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,GAGZ,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBiB,wBAAwBb,KAAM+B,KAAMxD,EAAWwiB,iBANzF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CAAEz3B,KAAM,6BAA8BzI,IAAK,mDACnDsnC,iBAAkB,CAChB,CACE7+B,KAAM,4BACNzI,IAAK,yEAEP,CACEyI,KAAM,kCACNzI,IAAK,kEAGTunC,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,SAIbyoB,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE0N,aAAc,kBAAM/nC,EAAwB,EAAGE,EAAYC,IAC3D80C,iBAAkB,kBAAMj1C,EAAwB,EAAGE,EAAYC,IAC/Do0C,cAAe3F,EAAS/oB,iBACxBhC,UAAW+qB,EAAS/qB,UACpBkxB,oBAAqB,SAACzpC,GAAD,OACnB2kC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3pB,iBAAmBva,MAG9C0pC,gBAAiB,SAAC1pC,GAAD,OACf2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MAEpFuF,cAAe+9B,EAAS/9B,cACxBE,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/EurC,YAAaA,SAMrB,cAAC,IAAD,CACEjnB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBAAsBA,EACtBP,oBAAqB+L,OAAuBttC,EA/L3B,WAC7B,GAAI6lB,GAAUoD,sBAAoBC,qBAAqBtE,KACrD,MAAO,CAACgc,MA6L0D2M,GACxD7L,qBAAsB4L,OAAuBttC,EA1L9B,SAAC2C,GAC5BylC,EAAS,CAAEnxC,KAAMywC,MA0LLpvB,eAAgByuB,EAASzuB,eACzB0oB,iBAAkB+F,EAAS/F,iBAC3BoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrF8sC,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3C3qB,sBAAuBgqB,EAAShqB,sBAChC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5Di8B,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UA9MS,WAAO,IAAD,EACrBiK,EAAahB,EAAY5gC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/oB,oBA8CjE,MAzCkB,CAChB,CACEnL,UAAW,eACXE,UAPgBy6B,GAAcA,EAAWvU,YAQzC/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,sBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,oBACXE,UAXFy6B,IAAU,UAAIA,EAAWR,WAAWphC,MAAK,SAACo5B,GAAD,OAAaA,EAAQptC,KAAOmvC,EAAS/qB,oBAApE,aAAI,EAA4Eid,aAYxF/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,iBAE1E,CACEua,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,4BAmKrDgyC,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,KACnCmpC,cAAe,CACb,CACE7hC,KAAM,kCACNzI,IAAK,yEAQjB,cAAC,IAAD,CAAO4sB,KAAM7rB,EAAmBC,OAAQ7B,QAAS,cAAC,GAAD,CAAYk9B,mBAhJtC,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBA2IpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA9JiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QA0J5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBC9UhFukC,GAAb,gEACEG,eAAiBr/B,cAAYC,QAAQN,gBADvC,KAGEwxB,QAAUp3B,EAAmBgB,SAH/B,KAIEmgB,eAAiB,4BAJnB,KAKED,cAAgB,yCALlB,KAME9a,WAAa,EANf,KAOEgc,UAAY,GAPd,KAQEwB,QAAU,WARZ,KASEoiB,+BAAiCpb,GATnC,KAWEqhB,mBAAqB,oBAXvB,KAYEM,sBAAwB,sBAZ1B,KAeErtC,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eApBxC,KAuBEmzC,sBAAwB,WACtB,OAAOjlB,OAAON,OACZ3Y,uBAAqB0oB,yBAAyB,CAAC1W,GAAwBM,OAzB7E,KA6BE6rB,mBAAqB,SAACC,GACpB,OAAOp+B,uBAAqB0oB,yBAAyB,CACnD1W,GACAM,GACA8rB,IACC/1C,IAlCP,KAqCEynC,yBAA2B,SAAC9qB,GAC1B,OAAIA,EAAS,GAAKA,GAAU,EAAKzU,eCsF/B2kC,GAAuBpd,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLtL,UAFwE,EAAzDA,WAES,GACxBslB,SAHwE,EAA9CA,SAI1BttB,kBAJwE,EAApCA,wBAIIhU,EACxCgJ,cALwE,EAAjBA,eAKvB,KAGpC6e,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,yDACjCE,kBAAmBoR,OAAWqJ,WAAW3a,SAAS,6DAEpDmU,aAbsC,SAazB0K,GACXA,EAAI2O,aAdqBja,EA1GT,SAAC,GAgBd,IAfLqH,EAeI,EAfJA,aACAE,EAcI,EAdJA,QACAtrB,EAaI,EAbJA,OACA4kB,EAYI,EAZJA,OACA7kB,EAWI,EAXJA,QACAE,EAUI,EAVJA,YACA8kB,EASI,EATJA,cACAqc,EAQI,EARJA,oBACA17B,EAOI,EAPJA,cACAE,EAMI,EANJA,cACAD,EAKI,EALJA,aACAimB,EAII,EAJJA,aACA0e,EAGI,EAHJA,aACAC,EAEI,EAFJA,2BACAC,EACI,EADJA,0BAEMjJ,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAYjB,OAVAvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAGF,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa,cAAC,GAAD,CAAmB1Y,OAAQA,IAEnF,mDACA,iEACA,qBAAKxK,UAAU,MAAf,SACE,uBAAMlB,GAAG,aAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,2BACLoC,IAAI,KACJ5L,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOykB,EAAOlM,UACd7Y,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GAC3B+hC,EAAoB/hC,IAEtBe,QAASoqC,EAA0B9sC,KAAI,SAACrM,GAAD,MAAe,CACpDgP,MAAOhP,EAASskC,YAChBx1B,MAAO9O,EAASiD,OAElBhB,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,YAGpCkM,EAAOlM,YAAc4xB,EACpB,cAAC,GAAD,UACE,mIAEA,KACHtqC,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,iBAI3E,qBAAKljB,UAAU,MAAf,SACE,uBAAMlB,GAAG,sBAAT,UACE,cAAC,GAAD,CACEoc,kBAAmBkU,EAAOlU,kBAC1BC,0BAA2B,SAACxQ,GAC1B4kB,EAAc,oBAAqB5kB,GACnCoqC,GAA8BA,EAA2BpqC,IAE3DH,OAAQA,EACRD,QAASA,EACTE,YAAaA,IAEdD,EAAO0Q,mBAAqB3Q,EAAQ2Q,mBACnC,cAAC,IAAD,UAAsB1Q,EAAO0Q,yBAKnC,oBAAIlb,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CAAoBoR,cAAeA,EAAeE,cAAeA,EAAeD,aAAcA,IAE9F,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAA1F,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASi2B,EAAxC,8BA0BRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrB8iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MACzB3uB,kBAAmBrS,IAAUwS,KAC7B25B,0BAA2BnsC,IAAUghC,MAAM9gC,WAC3C+rC,aAAcjsC,IAAUC,OAAOC,YAGlB4iC,UC8MAsJ,GA7UK,WAClB,IAAMp5C,EAAWq8B,cACX14B,EAAWkH,cAEXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMhJ,EAAe,UAAM7vB,uBAAqBqwB,4BAA4B9iC,IAAvD,OACnBC,EAAgBF,aAAa2B,UAEzBsvC,EAA4Bz1C,EAAWo1C,wBACvCG,EAAev1C,EAAWq1C,mBAAmB5rB,GAA8ByB,YAGjF9jB,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UAGnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAEhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,OAER,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBAAY,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MAAc,CAACA,IAsGhGxO,EAAc,uCAAG,gCAAAjhC,EAAA,6DACfs0B,EADe,gBACHr2B,EAAMqwC,WACnBjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAOE6rB,GAAwBpc,GAP1B,OAQG,OADhBtmB,EAPa,QAQRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAZQ,4EAgBZ,GAhBY,0DAAH,qDAqBd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAyB,MAAlBA,EAAOjR,UAPiB,2CAAH,sDA8B1Bg9B,EAAgB,CACpB/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,GAGZ,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBgB,SAASZ,KAAM+B,KAAMxD,EAAWwiB,iBAN1E,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CACNz3B,KAAM,yBACNzI,IAAK,0CAEPsnC,iBAAkB,CAChB,CACE7+B,KAAM,2CACNzI,IAAK,gEAEP,CACEyI,KAAM,8BACNzI,IAAK,iEAGTunC,aAAc,WAAO,IAAD,EAClBkI,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,KAETvf,EAAwB,EAAGE,EAAYC,IAEzC6nC,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBA3Mc,WAC1B,IAAI6H,EAAgB,IAAInD,GAiBxB,OAhBAmD,EAAcC,gBACdD,EAAcE,eACdF,EAAcI,eAAe,gBACjBtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,kBAGpC26B,OAAQ+D,EAAclD,UA2LUuD,GACtB1xB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCoB,cAzLY,SAACztC,GACzB,IAAM2jB,EAAc,6BACf3jB,GADe,IAElBqZ,QAASrZ,EAASqZ,QAAQzD,WAC1B0D,SAAUtZ,EAASsZ,SAAS1D,WAC5B6O,OAAQzkB,EAASykB,OACjB3M,KAAM9X,EAAS8X,KACf7B,SAAUjW,EAASiW,WAErBw9B,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAStT,KAiL5C4C,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5DsZ,sBAAuBrmB,EAAMqwC,SAAShqB,sBAAwBrmB,EAAMqwC,SAAShqB,sBAAwB,GACrG0kB,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3CtI,gBAAiBA,EACjB0O,0BAA2BA,EAC3BpO,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD0jB,UAAWtlB,EAAMqwC,SAAS/qB,UAC1BhI,kBAAmBtd,EAAMqwC,SAAS/yB,kBAClC0wB,oBA7IkB,SAACjhC,GACrB,gBAAQ/M,EAAMqwC,UACnB/qB,UAAYvY,EACjB2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MA2ItEoqC,2BAA4B,SAACpqC,GAC3B2kC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3zB,kBAAoBvQ,MAG/CuF,cAAetS,EAAMqwC,SAAS/9B,cAC9BE,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E6sC,0BAA2BA,EAC3BF,aAAcA,SAMtB,cAAC,IAAD,CACEroB,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACEkH,eAAgBA,EAChB8J,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DirC,UA9NS,WACrB,IAAQwD,EAAarwC,EAAbqwC,SAWFiH,EAAmBF,EAA0BrkC,QAAO,SAACw/B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/qB,aAAW,GAClG,OAAOgyB,EACH,CACE,CACEn7B,UAAW,WACXE,UACEg0B,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EAC9E6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,2BACXE,UAAWi7B,EAAmBA,EAAiB/U,YAAc,KAC7D/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,eACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,6BACXE,WAjC6B,IAA/Bg0B,EAAS/yB,kBACJ,OAE0B,IAA/B+yB,EAAS/yB,kBACJ,KAEF,GA4BDd,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,wBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAG5E,GAwKmBgyC,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,GAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASoB,EAAmBgB,SAASZ,KAAOJ,EAAmBC,SACtFwe,kBAAmB,kBAAM7f,EAASoB,EAAmBgB,SAASZ,KAAOJ,EAAmB5E,WACxFkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWO,SAAS,UAM5C,cAAC,IAAD,CACE2sB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBA7IL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAyIpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA5JiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAwJ5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBC7VxEukC,G,cAOnB,aAAe,IAAD,iCANdoP,sBAAwB,GAMV,KALdC,sBAAwB,GAKV,KAFdlP,eAAiBr/B,cAAYC,QAAQN,gBAEvB,KAYd6uC,UAAY,SAACC,GACX,IACM3nC,EADQ+hB,OAAO4Q,QAAQ,EAAK8U,uBACbtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAK,KAAOm3C,KAAU,GAC1D,GAAI3nC,EAAQ,OAAOA,EAAO7O,GAC1B,MAAMc,MAAM,0BAAD,OAA2B01C,EAA3B,gBAhBC,KAoBdtd,QAAUp3B,EAAmBoB,yBApBf,KAuBdlC,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQz2B,OAL3B,UAMN+a,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eA7BxB,KAiCduxC,iBAAmB,CACjBzqC,KAAM,kCACNzI,IAAK,0DAnCO,KAsCdizC,mBAAqB,CACnB,CACExqC,KAAM,4BACNzI,IAAK,gFAEP,CACEyI,KAAM,gDACNzI,IAAK,yEA7CK,KAiDdkiB,eAAiB,qCAjDH,KAkDdD,cAAgB,kDAlDF,KAmDd9a,WAAasV,KAAKxc,SAASsI,OAAS,EAnDtB,KAsDdoc,QAAU,8BAtDI,KAuDdoiB,+BAAiCpb,GAvDnB,KAyDd+a,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YAzDtD,KA4Dd6lC,mBAAqB,4BA5DP,KA6DdM,sBAAwB,sBA7DV,KA8DdoI,kBAAoB,2BA9DN,KA+DdC,qBAAuB,iBA/DT,KAgEdC,mBAAqB,sFAhEP,KAkEd9O,0BAA4B,oCAlEd,KAqEd+O,oBAAsB,CACpBpwB,YAAa,0BACbE,kBAAmB,wBACnBE,uBAAwB,6BACxBE,kBAAmB,uBAxEnB,IAAM+vB,EAAuBl/B,uBAAqBqwB,4BAChD/d,IAGFzM,KAAK64B,sBAAwBQ,EAAqBR,sBAClD74B,KAAK84B,sBAAwBO,EAAqBP,sBAClD94B,KAAK0G,UAAY2yB,EAAqB3yB,UACtC1G,KAAK0qB,sBAAwB2O,EAAqB3O,yBCyDhD4O,GAA2BrnB,aAAW,CAC1CC,iBAD0C,YAExC,MAAO,CACLolB,cAF8C,EAA/BA,cAGfxM,aAH8C,EAAhBA,eAMlCrY,iBAAkBzC,OAAa0C,MAAM,CACnC4kB,cAAetnB,OAAatR,SAAS,4DAEvCmU,aAV0C,SAU7B0K,GACXA,EAAIuN,iBAXyB7Y,EAlEL,SAAC9mB,GAC3B,IAAIouB,EAActZ,IAAMwZ,YAaxB,OAXApvB,qBAAU,YACHc,EAAMmuB,eAAiBnuB,EAAMquB,SAAWpG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAC7D6tB,IAASC,YAAYL,EAAY1qB,SACzChM,mBAEV,CAACsI,EAAMmuB,aAAcC,EAAapuB,EAAM+C,OAAQ/C,EAAMquB,UAEzDnvB,qBAAU,WACRhI,MACC,IAGD,qBAAKqB,UAAU,OAAOlB,GAAG,mBAAzB,SACE,eAAC,KAAD,WACE,qBAAKmM,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQqpC,eACrD,cAAC,GAAD,CAAmBppC,OAAQ/C,EAAM+C,SAGnC,wDAEiBtD,IAAhBO,EAAMouC,OAAuBpuC,EAAMouC,MAAMztC,OAAS,EACjD,qBAAKpI,UAAU,MAAf,SACE,uBAAMlB,GAAG,uBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdE,IAAI,IACJpC,KAAK,4BACLxJ,GAAG,gBACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,gBACL4H,MAAOlD,EAAM2nB,OAAOwkB,cACpBvpC,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,gBAAiB1lB,GACrCpC,EAAM2sC,oBAAoBvqC,IAE5B/L,MAAO2J,EAAM+C,OAAOopC,eAAiBnsC,EAAM8C,QAAQqpC,cACnDhpC,QAASnD,EAAMouC,MAAM3tC,KAAI,SAAC/J,GAAD,MAAW,CAClC0M,MAAO1M,EAAKgiC,YACZx1B,MAAOxM,EAAKW,SAGf2I,EAAM+C,OAAOopC,eAAiBnsC,EAAM8C,QAAQqpC,eAC3C,cAAC,IAAD,UAAsBnsC,EAAM+C,OAAOopC,0BAIvC1sC,EAEJ,cAAC,IAAD,CAAiB/I,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM6sC,iBAA9C,8BAuBRsB,GAAyBhtC,UAAY,CACnCgrC,cAAe/qC,IAAUC,OACzBsrC,oBAAqBvrC,IAAUyS,KAAKvS,WACpCq+B,aAAcv+B,IAAUyS,KAAKvS,WAC7BurC,iBAAkBzrC,IAAUyS,KAAKvS,WACjC8sC,MAAOhtC,IAAUghC,MAAM9gC,YAGV6sC,UCpBTE,GAAmCvnB,aAAW,CAClDC,iBADkD,SACjC/mB,GACf,IAAMsuC,EAAe,CACnB3O,aAAc3/B,EAAM2/B,aACpBl3B,cAAezI,EAAMyI,eAAiB,IAOxC,OAJAzI,EAAM0tC,sBAAsBnlC,SAAQ,SAAChR,GACnC+2C,EAAa/2C,EAAQF,IAAM2I,EAAMzI,EAAQF,OAGpCi3C,GAEThnB,iBAAkB,SAACtnB,GACjB,IAAMuuC,EAAmB,CACvB5O,aAAc9a,OAAatR,WAC3B9K,cAAeoc,QAMjB,OAHA7kB,EAAM0tC,sBAAsBnlC,SAAQ,SAAChR,GACnCg3C,EAAiBh3C,EAAQF,IAAMwtB,OAAatR,SAAb,qCAAoDhc,EAAQmL,SAA5D,SAE1BmiB,OAAa0C,MAAMgnB,IAE5B7mB,aAxBkD,SAwBrC0K,GACXA,EAAIuN,iBAzBiC7Y,EAzEL,SAAC9mB,GACnC,IAAIouB,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GAmBzC,OAjBAvE,qBAAU,YAELc,EAAMmuB,eACNnuB,EAAMquB,SACPpG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GACnCX,EAAMgD,YAAcurB,EAAoB7qB,UAExC6qB,EAAoB7qB,QAAU1D,EAAMgD,YACnBwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACsI,EAAMmuB,aAAcC,EAAapuB,EAAM+C,OAAQ/C,EAAMquB,QAASruB,EAAMgD,cAExE9D,qBAAU,WACRhI,MACC,IAGD,qBAAKqB,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAMgD,YAAc,GAC3D,cAAC,GAAD,CAAmBD,OAAQ/C,EAAM+C,SAGnC,mDACA,8CACA,+HAEC/C,EAAM0tC,sBAAsBjtC,KAAI,SAAClJ,GAChC,OACE,cAAC,GAAD,CAEEmL,SAAUnL,EAAQmL,SAClBrL,GAAIE,EAAQF,GACZwL,aAAc7C,EAAMzI,EAAQF,IAC5BsL,aAAcpL,EAAQoL,aACtBC,SAAU,SAACR,GACTpC,EAAM8nB,cAAcvwB,EAAQF,GAAI+K,GAChCpC,EAAMwuC,6BAA6Bj3C,EAAQF,GAAI+K,IAEjDU,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdC,YAAahD,EAAMgD,aAXdzL,EAAQF,OAgBnB,oBAAIkB,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,eAGtB,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM6sC,iBAA9C,8BAqCRwB,GAAiCltC,UAAY,CAC3Cw+B,aAAcv+B,IAAUyS,KAAKvS,WAC7BurC,iBAAkBzrC,IAAUyS,KAAKvS,WACjCktC,6BAA8BptC,IAAUyS,KAAKvS,WAC7CosC,sBAAuBtsC,IAAUghC,MAAM9gC,WACvCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MAAM9gC,WAC/Buc,YAAazc,IAAUC,OACvB0c,kBAAmB3c,IAAUC,OAC7B4c,uBAAwB7c,IAAUC,OAClC8c,kBAAmB/c,IAAUC,QAGhBgtC,UCETI,GAAsC3nB,aAAW,CACrDC,iBADqD,SACpC/mB,GACf,IAAMsuC,EAAe,CACnB7yB,UAAWzb,EAAMyb,UACjBkkB,aAAc3/B,EAAM2/B,aACpBl3B,cAAezI,EAAMyI,eAAiB,IASxC,OAJAzI,EAAM0uC,iBAAiBnmC,SAAQ,SAAChR,GAC9B+2C,EAAa/2C,EAAQF,IAAM2I,EAAMzI,EAAQF,OAGpCi3C,GAEThnB,iBAAkB,SAACtnB,GACjB,IAAMuuC,EAAmB,CACvB9yB,UAAWoJ,OAAatR,SAAS,sDASnC,OANIvT,EAAM2uC,6BACR3uC,EAAM0uC,iBAAiBnmC,SAAQ,SAAChR,GAC9Bg3C,EAAiBh3C,EAAQF,IAAMwtB,OAAatR,SAAb,qCAAoDhc,EAAQmL,SAA5D,SAI5BmiB,OAAa0C,MAAMgnB,IAE5B7mB,aA7BqD,SA6BxC0K,GACXA,EAAIuN,iBA9BoC7Y,EA3GL,SAAC9mB,GACtC,IAAIouB,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GAEzCvE,qBAAU,YAELc,EAAMmuB,eACNnuB,EAAMquB,SACPpG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GACnCX,EAAMgD,YAAcurB,EAAoB7qB,UAExC6qB,EAAoB7qB,QAAU1D,EAAMgD,YACnBwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACsI,EAAMmuB,aAAcC,EAAapuB,EAAM+C,OAAQ/C,EAAMquB,QAASruB,EAAMgD,cAExE9D,qBAAU,WACRhI,MACC,IAEH,IAAMR,EAAOsJ,EAAM2tC,sBAAsBtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAO2I,EAAMmsC,iBACpEyC,EAAkBl4C,GAAQA,EAAKgiC,YAC/BmW,EAAoBn4C,GAAQuxB,OAAON,OAAOjxB,EAAK+1C,YAErD,OACE,qBAAKl0C,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAMgD,YAAc,GAC3D,cAAC,GAAD,CAAmBD,OAAQ/C,EAAM+C,SAEnC,mDACA,4BAAI6rC,IACJ,qBAAKr2C,UAAU,MAAf,SACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,uBACLoC,IAAI,IACJ5L,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOlD,EAAM2nB,OAAOlM,UACpB7Y,SAAU,SAACR,GAETpC,EAAM0uC,iBAAiBnmC,SAAQ,SAAChR,GAC9ByI,EAAM8nB,cAAc,CAACvwB,EAAQF,SAAKoI,MAEpCO,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAM4sC,gBAAgBxqC,IAExB/L,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAAS0rC,EAAkBpuC,KAAI,SAACgkC,GAAD,MAAc,CAC3CrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,iBAKxCzb,EAAM2uC,6BACL3uC,EAAM0uC,iBAAiBjuC,KAAI,SAAClJ,GAC1B,OACE,cAAC,GAAD,CAEEmL,SAAUnL,EAAQmL,SAClBrL,GAAIE,EAAQF,GACZwL,aAAc7C,EAAMzI,EAAQF,IAC5BsL,aAAcpL,EAAQoL,aACtBC,SAAU,SAACR,GACTpC,EAAM8nB,cAAcvwB,EAAQF,GAAI+K,GAChCpC,EAAM8uC,wBAAwBv3C,EAAQF,GAAI+K,IAE5CU,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdC,YAAahD,EAAMgD,aAXdzL,EAAQF,OAgBrB,oBAAIkB,UAAU,OAAOlB,GAAG,cAAxB,4BAGA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,eAGtB,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM6sC,iBAA9C,8BA0CR4B,GAAoCttC,UAAY,CAC9Cw+B,aAAcv+B,IAAUyS,KAAKvS,WAC7BurC,iBAAkBzrC,IAAUyS,KAAKvS,WACjCsrC,gBAAiBxrC,IAAUyS,KAAKvS,WAChCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MAAM9gC,WAC/B6qC,cAAe/qC,IAAUC,OAAOC,WAChCma,UAAWra,IAAUC,OACrBssC,sBAAuBvsC,IAAUghC,MAAM9gC,WACvCotC,iBAAkBttC,IAAUghC,MAAM9gC,WAClCwtC,wBAAyB1tC,IAAUyS,KAAKvS,WACxCqtC,4BAA6BvtC,IAAUwS,KACvCmK,kBAAmB3c,IAAUC,OAC7B4c,uBAAwB7c,IAAUC,QAGrBotC,UCwZAM,GA/hBqB,WAClC,IAAM36C,EAAWq8B,cACX14B,EAAWkH,cAEXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMrB,EAAWrwC,EAAMqwC,SACjB3H,EAAe,UAAM7vB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBF,aAAa+B,6BACtF2wC,EAAUl3C,EAAW81C,UAAUvsB,IAC/BssB,EAAwB1lB,OAAON,OAAO7vB,EAAW61C,uBACjDD,EAAwBzlB,OAAON,OAAO7vB,EAAW41C,uBACjDgB,EAAmB,CACvB52C,EAAW41C,sBAAsB3vB,kBACjCjmB,EAAW41C,sBAAsBzvB,wBAE7BgxB,EAAiBn3C,EAAW81C,UAAUvsB,IACtC6tB,EAAkB,kBAAM1I,EAAS7oB,sBAAwBqxB,GACzDG,EAAyB,kBAAM3I,EAAS7oB,sBAAwBsxB,GAGhEnH,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UACzDpY,qBAAU,WAAO,IAAD,EACR8mC,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW5nC,YAAcsoC,GAA9B,eAA4CV,GAAW9sB,eAAiB0rB,GAAxE,OAER,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBwtB,IAGlD,IAAMC,EAAkBr+B,uBACtB,kBAAMm+B,EAAS,CAAEnxC,KAAMywC,GAAmB9b,QAASsc,MACnD,CAACE,EAAUF,IAmCPyH,EAAuC,SAACj0B,GAC5C,IAAMzkB,EAAOi3C,EAAsBtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAO8jB,EAASwC,oBAAoB3T,cACrFyiC,EAAa/1C,GAAQA,EAAK+1C,WAC1BhV,EAAWgV,GAAcxkB,OAAON,OAAO8kB,GAAYphC,MAAK,SAACgkC,GAAD,OAASA,EAAIh4C,KAAO8jB,EAASwc,cAC3F,MAAO,CACLnY,WAAYrE,EAASqE,WACrB8vB,iBAAsB7vC,IAAT/I,EAAqBA,EAAKgiC,YAAcvd,EAASo0B,kBAC9DhK,eAAwB9lC,IAAbg4B,EAAyBA,EAASiB,YAAcvd,EAASsc,SACpEG,YAAa,IAAI/+B,KAAKsiB,EAASyc,aAAa4N,eAAe,WAmEzDrE,EAAoB,uCAAG,WAAO/+B,GAAP,+BAAAlK,EAAA,sEACRuT,GAAiBrJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GADlD,cACrBgP,EADqB,gBAEJ3N,GAA0BhK,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAF/D,cAErBV,EAFqB,gBAGNS,GAAmB1I,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAHtD,cAGrB8N,EAHqB,iBAIR9M,GAAiB8M,GAJT,eAIrB3M,EAJqB,iBAKRC,GAAiB/J,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GALlD,eAKrByC,EALqB,iBAMN3B,GAAwBzJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAN3D,QAMrB+N,EANqB,OASrB02B,EAASptC,EAAE09B,QAAQn0B,WAAWy8B,QACpCxyC,QAAQC,IAAI,mBAAoB25C,GAG1Bz3B,EAAiB,CACrBtK,QAASrL,EAAE09B,QAAQK,SAASp2B,EAAEC,WAC9B0D,SAAUtL,EAAE09B,QAAQK,SAASp1B,EAAEf,WAC/B6O,SACA3M,KAAMA,EAAOA,EAAKlC,WAAa,KAC/BwD,OACAsL,SACAuC,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9Bl/B,OAAO,WAAD,OAAa9G,EAAE09B,QAAQn0B,WAAWy8B,SACxCruB,OACA1P,YAGFw9B,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAStT,IACxD8vB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW/oB,UAAYjc,EAAE09B,QAAQn0B,WAAW8jC,MADxC,eAEJrI,GAAW7oB,YAAcnc,EAAE09B,QAAQn0B,WAAW+jC,UAF1C,KA7BkB,4CAAH,sDAoDpBtO,EAAmB,uCAAG,WAAOh/B,GAAP,eAAAlK,EAAA,sEACE4wC,EAAgBxoB,qBAAqB,CAC/DjF,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9B7sB,UAAWzjB,EAAWyjB,YAHE,cACpBo0B,EADoB,yBAKnBA,GALmB,2CAAH,sDAmFnBxW,EAAc,uCAAG,sCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLga,IACXjrB,UAAYplB,EAAMowC,oBAAsBzuC,EAAWynC,sBAAwBznC,EAAWyjB,UAC3FiR,EAAKzP,QAAUjlB,EAAWilB,QAItBypB,EAAS7oB,sBAAwBsxB,IAC7BW,EAAmBjC,EAAsBtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAO43C,KACpExC,EAAamD,GAAoBA,EAAiBnD,WAElD9U,EAAa8U,GAAcA,EAAW,GAAGp1C,GAC/Cm1B,EAAK/Q,UAAYkc,GAZE,kBAiBEmR,EAAgB5tB,eAAesR,GAjBjC,OAkBG,OADhBtmB,EAjBa,QAkBRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAtBQ,4EA0BZ,GA1BY,0DAAH,qDA+Bd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B4wC,EAAgBxpB,uBACpBnpB,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDAkC1Bg9B,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAId,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBoB,yBAAyBhB,KAAM+B,KAAMxD,EAAWwiB,iBAN1F,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQxgC,EAAWwzC,iBACnB5L,iBAAkB5nC,EAAWuzC,mBAC7B1L,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,WAAO,IAAD,EAClE8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,SAIbyoB,YAAamI,MAInB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE0N,aAAc,kBAAM/nC,EAAwB,EAAGE,EAAYC,IAC3D80C,iBAAkB,kBAAMj1C,EAAwB,EAAGE,EAAYC,IAC/Do0C,cAAe3F,EAAS7oB,oBACxBgvB,oBA/VkB,SAACkD,GAUI,IAAD,GARlCnC,EAAsBnlC,SAAQ,SAAC7F,GAC7BmlC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW1kC,EAASrL,SAAMoI,QAGvFooC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,eAAYhc,KAI9EowC,IAAqBb,KACvBnH,EAAS,CAAEnxC,KAAMywC,KACjBU,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAW/oB,UAAY,MAA5B,eAAmC+oB,GAAW7oB,YAAc,MAA5D,MAIPioB,EAAS7oB,sBAAwBqxB,GAAWa,IAAqBb,GACnEnH,EAAS,CAAEnxC,KAAMywC,KAEnBU,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWzpB,oBAAsBkyB,MAyUnCzB,MAAOT,SAKf,cAAC,IAAD,CACE3oB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAE3DggB,eAAgByuB,EAASzuB,eAEzB0oB,iBAAkB+F,EAAS/F,iBAE3BoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KAErFikB,oBAAmB62B,IACnB3N,qBA1UkB,WAC9B,IAAI6H,EAAgB,IAAInD,GAoBxB,OAnBAmD,EAAcC,gBACdD,EAAc0G,iBACd1G,EAAcE,eACdF,EAAcI,iBACFtE,GAA6B,CACvCC,+BAAgCiK,EAChCvQ,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,eAAgBt7B,KAAM,eAChC,CAAEs7B,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBAuTUC,GACtB5K,oBAnTiB,WAC7B,IAAI+O,EAAe,GAkBnB,OAjBIzqB,GAAUoD,sBAAoBC,qBAAqBtE,MACrD0rB,EAAajpC,KAAKu5B,OAEM,IAAtB6O,KACFa,EAAajpC,KAAK,CAChBy5B,SAAUzoC,EAAWk2C,mBACrBx0B,QAAS1hB,EAAWg2C,kBACpB70B,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAWi2C,qBAClCpI,eAAgB,CACd,CAAEK,OAAQ,WAAYt7B,KAAM,YAC5B,CAAEs7B,OAAQ,OAAQt7B,KAAM,QACxB,CAAEs7B,OAAQ,UAAWt7B,KAAM,gBAK5BqlC,EAgS0B/C,GAErB7L,qBAAsBA,EAEtBD,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAE3CvF,mBA7OgB,WAC5B,GAAIsN,IACF,OACE,kIAEE,uBAFF,WAGU,sBAAM,cAAY,OAAO32C,UAAU,+BAH7C,sDAKE,uBALF,oDAOE,uBAPF,gDA0O4By3C,GAEpBxzB,sBAAuBgqB,EAAShqB,sBAEhC4kB,oBAAqBA,EAErBE,2BAA2B,oFAE3BZ,+BAAgCwO,IAAoB,0CAAuCzvC,EAC3Fkb,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5Di8B,+BAAgCrnC,EAAWqnC,+BAE3CwB,qBApTiB,WAC7B,GAAIuO,KAAqB5pB,GAAUoD,sBAAoBC,qBAAqBrE,KAC1E,MAAO,CACLwc,QAAS3qC,EAAMowC,oBACfnjC,MAAOtL,EAAWonC,0BAClB4C,aAAc,WACZ+F,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWb,qBAAuBpwC,EAAMowC,wBAGxD59B,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAe+9B,EAAS/9B,eAuSMkhC,UAK9B,cAAC,IAAD,CACE3kB,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACGkd,IACC,cAAC,GAAD,CACExP,aAAc,kBAAM/nC,EAAwB,EAAGE,EAAYC,IAC3D80C,iBAAkB,kBAAMj1C,EAAwB,EAAGE,EAAYC,IAC/Dy2C,6BAA8B,SAACyB,EAAY/sC,GAAb,OAC5B2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW6I,GAAc/sC,MAEtFwqC,sBAAuBA,EACvB/kC,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAe+9B,EAAS/9B,cACxBoV,YAAa2oB,EAAS3oB,YACtBE,kBAAmByoB,EAASzoB,kBAC5BE,uBAAwBuoB,EAASvoB,uBACjCE,kBAAmBqoB,EAASroB,oBAG9B,cAAC,GAAD,CACEwhB,aAAc,kBAAM/nC,EAAwB,EAAGE,EAAYC,IAC3D80C,iBAAkB,kBAAMj1C,EAAwB,EAAGE,EAAYC,IAC/D60C,gBAAiB,SAAC1pC,GAEhBwrC,EAAiBnmC,SAAQ,SAAC7F,GACxBmlC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW1kC,EAASrL,SAAMoI,QAG1CooC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MAEpFyF,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAe+9B,EAAS/9B,cACxB0jC,cAAe3F,EAAS7oB,oBACxBlC,UAAW+qB,EAAS/qB,UACpBkyB,sBAAuBA,EACvBe,iBAAkBA,EAClBC,4BApRoB,WAClC,IAAMj4C,EAAOi3C,EAAsBtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAOmvC,EAAS7oB,uBACjEuyB,EAAYx5C,GAAQA,EAAK+1C,WAAW0D,SAAWz5C,EAAK+1C,WAAW0D,QAAQ94C,GAC7E,MAA8B,KAAvBmvC,EAAS/qB,WAAoBy0B,IAAc1J,EAAS/qB,UAiRhBkzB,GAC7BG,wBAAyB,SAACmB,EAAY/sC,GAAb,OACvB2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW6I,GAAc/sC,MAEtF6a,kBAAmByoB,EAASzoB,kBAC5BE,uBAAwBuoB,EAASvoB,8BAM3C,cAAC,IAAD,CACE+G,KAAMltB,EAAWy4B,QAAQz2B,MACzBvC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UA/RS,WACrB,IAAMoN,EAAezC,EAAsBtiC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAOmvC,EAAS7oB,uBACzEqlB,EAAY,CAChB,CACE1wB,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,mBACXE,UAAW49B,GAAgBA,EAAa1X,YACxC/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAItEs4C,EAA6B,GAgBnC,GAfA3C,EAAsBnlC,SAAQ,SAAC7F,GACzB8jC,EAAS9jC,EAASrL,KACpBg5C,EAA2BvpC,KAAK,CAC9BwL,UAAWxa,EAAWm2C,oBAAoBvrC,EAASrL,IACnDmb,UAAW1a,EAAW41C,sBAAsBhrC,EAASrL,IAAIsL,aAAa0I,MACpE,SAACkO,GAAD,OAAYA,EAAOliB,GAAG2S,aAAew8B,EAAS9jC,EAASrL,OACvD6L,MACFyP,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU2K,EAASrL,KACjFyyC,mBAAoB,qBAK1B9G,EAAUvJ,OAAV,MAAAuJ,EAAS,CAAQ,EAAG,GAAX,OAAiBqN,KAErBlB,IAA0B,CAC7B,IAAM1X,EACJ2Y,GAAgBnoB,OAAON,OAAOyoB,EAAa3D,YAAYphC,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOmvC,EAAS/qB,aAC/F60B,EAAsB7Y,GAAYA,EAASiB,YACjDsK,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,oBACXE,UAAW89B,EACX39B,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,kBAIxB,OAAO9G,EA8NgB+G,UAKnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAM3qC,EAAW2mC,kBAC/BhnB,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAK3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBA1LL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAsLpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBAzMiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAqM5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBC3jBxEukC,G,cA4CnB,aAAe,IAAD,iCA3Cd/N,QAAUp3B,EAAmBmB,gBA2Cf,KA1Cd+f,cAAgB,yDA0CF,KAzCdk2B,+BAAiC,2BAyCnB,KAxCdC,gCAAkC,sFAwCpB,KAvCdrR,+BAAiCpb,GAuCnB,KAtCdqhB,mBAAqB,2BAsCP,KArCdM,sBAAwB,sBAqCV,KApCdprB,eAAiB,4CAoCH,KAnCdjiB,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eA8BxB,KA5BdgjB,QAAU,kBA4BI,KA3Bdxd,WAAa,EA2BC,KA1Bdk/B,eAAiBr/B,cAAYC,QAAQN,gBA0BvB,KAzBdmgC,0BAA4B,kCAyBd,KAtBdoM,iBAAmB,CACjBzqC,KAAM,0CACNzI,IAAK,uDAoBO,KAjBdizC,mBAAqB,CACnB,CACExqC,KAAM,4DACNzI,IAAK,6EAEP,CACEyI,KAAM,wCACNzI,IAAK,sEAUK,KALdq4C,SAAW,GAKG,KAJdC,SAAW,GAIG,KAHdjE,WAAa,GAGC,KAWd3N,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YAVlE,MACEyP,uBAAqBqwB,4BAA4B/d,IAD3C/F,EAAR,EAAQA,UAAWqpB,EAAnB,EAAmBA,YAAa6L,EAAhC,EAAgCA,SAAUC,EAA1C,EAA0CA,SAAUnR,EAApD,EAAoDA,sBAGpD1qB,KAAK0G,UAAYA,EACjB1G,KAAK0qB,sBAAwBA,EAC7B1qB,KAAK43B,WAAaxkB,OAAON,OAAOid,GAChC/vB,KAAK47B,SAAWA,EAChB57B,KAAK67B,SAAWA,KC+DdxM,GAAuBpd,aAAW,CACtCC,iBADsC,YACwB,IAA3CtL,EAA0C,EAA1CA,UAAWslB,EAA+B,EAA/BA,SAC5B,MAAO,CACLtlB,UAAWA,GAAa,GACxBhI,kBAHyD,EAArBA,kBAIpCstB,aAGJzZ,iBAAkB,SAACtnB,GAAD,OAChB6kB,OAAa0C,MAAM,CACjB9L,UAAWoJ,OAAatR,SAAS,oDACjCE,kBAAmBoR,OAAW4lB,KAAK,YAAa,CAC9CC,GAAI,kBAA2B,IAArB1qC,EAAM2wC,YAChB57C,KAAM8vB,OAAWtR,SAAS,gEAGhCmU,aAhBsC,SAgBzB0K,GACXA,EAAI2O,aAjBqBja,EApGT,SAAC,GAgBd,IAfLqH,EAeI,EAfJA,aACAE,EAcI,EAdJA,QACAtrB,EAaI,EAbJA,OACA4kB,EAYI,EAZJA,OACA7kB,EAWI,EAXJA,QACAE,EAUI,EAVJA,YACA8kB,EASI,EATJA,cACAqc,EAQI,EARJA,oBACAC,EAOI,EAPJA,iBACAuM,EAMI,EANJA,WACAj9B,EAKI,EALJA,0BACAjL,EAII,EAJJA,cACAE,EAGI,EAHJA,cACAD,EAEI,EAFJA,aACAimB,EACI,EADJA,aAEM2V,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAYjB,OAVAvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAGF,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa,cAAC,GAAD,CAAmB1Y,OAAQA,IAEnF,mDACA,gEACA,8BACE,uBAAM1L,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,sBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOykB,EAAOlM,UACd7Y,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GAC3B0lB,EAAc,yBAAqBroB,GACnC0kC,EAAoB/hC,IAEtBe,QAASihC,EAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAC1CvhC,MAAOuhC,EAAQptC,GACf+L,MAAOqhC,EAAQ/L,gBAEjBriC,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,YAEpC1Y,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,kBAG3D,IAAfk1B,EACC,cAAC,GAAD,CACEl9B,kBAAmBkU,EAAOlU,kBAC1BC,0BAA2B,SAACxQ,GAC1B4kB,EAAc,oBAAqB5kB,GACnCwQ,GAA6BA,EAA0BxQ,IAEzDH,OAAQA,EACRD,QAASA,EACTE,YAAaA,IAGf,cAAC,IAAMtD,SAAP,IAGF,oBAAInH,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CACEoR,cAAeA,EACfE,cAAeA,EACfD,aAAcA,IAGhB,cAAC,IAAD,CAAiBhS,KAAK,SAASgC,QAASi2B,EAAxC,sBAGA,cAAC,IAAD,CAAiBj4B,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAA1F,0BA6BRgxB,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrBsH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBgC,iBAAkBhjC,IAAUghC,MAAM9gC,WAClCqvC,WAAYvvC,IAAUwS,KAAKtS,WAC3BmS,kBAAmBrS,IAAUwS,KAC7BF,0BAA2BtS,IAAUyS,KAAKvS,YAG7B4iC,UCkWA0M,GAldU,SAAC5wC,GACxB,IAAI5L,EAAWq8B,cACX14B,EAAWkH,cACTnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IAEpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMhJ,EAAe,UAAM7vB,uBAAqBqwB,4BAA4B9iC,IAAvD,OACnBC,EAAgBF,aAAa8B,qBAEzBgmC,EAAmBtsC,EAAW20C,WAGpCvtC,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UACnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW5nC,YAAcsoC,GADrB,eAEJV,GAAW9sB,eAAiB0rB,GAFxB,OAKR,CAAC6B,EAAUzzC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAGvE,IAAM0vC,EAAkBr+B,uBACtB,kBACEm+B,EAAS,CACPnxC,KAAMywC,GACN9b,QAASgb,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,qBAEvD,CAACutB,EAAU/vC,EAAWwiB,iBA8ClB6mB,EAAoB,uCAAG,WAAO/+B,GAAP,6CAAAlK,EAAA,6DACrB6hB,EAAOtO,GAAiBrJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAD5C,SAEND,GAAmB1I,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAFtD,cAErB8N,EAFqB,gBAGR1M,GAAiB/J,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAHlD,cAGrByC,EAHqB,OAIrBnD,EAAW+B,GAA0BhK,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAC9EmB,EAAOH,GAAiB3J,EAAE09B,QAAQn0B,WAAWklC,QAC7C/3B,EAASjN,GAAwBzJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GANrD,UAOsCrF,QAAQqB,IAAI,CAACgT,EAAM1P,EAAU6B,EAAM4M,IAPzE,oCAOpBg4B,EAPoB,KAOTC,EAPS,KAOMC,EAPN,KAOiBC,EAPjB,KAUrBzB,EAASptC,EAAE09B,QAAQn0B,WAAWy8B,QACpCxyC,QAAQC,IAAI,mBAAoB25C,GAK1Bz3B,EAAiB,CACrBtK,QAASrL,EAAE09B,QAAQK,SAASp2B,EAAEC,WAC9B0D,SAAUtL,EAAE09B,QAAQK,SAASp1B,EAAEf,WAC/B6O,OAAQA,GAAkBzW,EAAE09B,QAAQn0B,WAAWklC,OAC/Cz8C,SAAUgO,EAAE09B,QAAQn0B,WAAWwQ,SAC/BpC,KAAM+2B,EACNzmC,SAAU0mC,EACV7kC,KAAM8kC,EAAYA,EAAUhnC,WAAa,KACzCwD,KAAMA,GAAcpL,EAAE09B,QAAQn0B,WAAWqQ,KACzClD,OAAQm4B,EACR51B,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9Bl/B,OAAO,WAAD,OAAa9G,EAAE09B,QAAQn0B,WAAWy8B,UAGpC8I,EAAUjpB,OAAON,OAAO7vB,EAAW24C,UAAUplC,MAAK,SAACsX,GAAD,OAASA,EAAI+V,YAAYjpB,gBAAkBrN,EAAE09B,QAAQn0B,WAAWwlC,QAAQ1hC,iBAC1HoN,EAAYq0B,GAAWA,EAAQ75C,GACrCwwC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBACL+b,GAAWvqB,UAAYA,KAG5BgrB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAStT,IAtC7B,4CAAH,sDA4DpB6pB,EACJ,oJAEE,uBAFF,WAGU,sBAAM,cAAY,OAAOrpC,UAAU,+BAH7C,sDAKE,uBALF,0EAOE,uBAPF,gDA8FI4gC,EAAc,uCAAG,kCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLr2B,EAAMqwC,WACjBjrB,UAAYplB,EAAMowC,oBAAsBzuC,EAAWynC,sBAAwBznC,EAAWyjB,UAC3FiR,EAAKzP,QAAUjlB,EAAWilB,SAEpBq0B,EAAchN,EAAiB/4B,MAAK,SAACo5B,GAAD,OAAaA,EAAQptC,KAAOm1B,EAAK/Q,cAC3D41B,cACd7kB,EAAI,6BAAQA,GAAS4kB,EAAYC,cAPd,kBAYEzI,GAAwBpc,GAZ1B,OAaG,OADhBtmB,EAZa,QAaRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAjBQ,4EAqBZ,GArBY,0DAAH,qDAiCd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDA6C1Bg9B,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAIR62C,EA7RsB,WAC1B,IAAI7B,EAAgB,IAAInD,GAmBxB,OAlBAmD,EAAcC,gBACdD,EAAcE,eACdF,EAAc8B,6BACd9B,EAAcI,iBACFtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBA2QelC,GACnCzI,EAtQG,CACL,CACET,SAAUzoC,EAAW04C,gCACrBh3B,QAAS1hB,EAAWy4C,+BACpBt3B,cAAewsB,GAAqB,CAClCC,sBAAuB,sBACvBC,eAAgB,CACd,CAAEK,OAAQ,WAAYt7B,KAAM,WAC5B,CAAEs7B,OAAQ,WAAYt7B,KAAM,YAC5B,CAAEs7B,OAAQ,YAAat7B,KAAM,UAC7B,CAAEs7B,OAAQ,OAAQt7B,KAAM,QACxB,CAAEs7B,OAAQ,UAAWt7B,KAAM,gBA6PrC,OACE,cAAC,GAAD,CACE6P,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBmB,gBAAgBf,KAAM+B,KAAMxD,EAAWwiB,iBANjF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQxgC,EAAWwzC,iBACnB5L,iBAAkB5nC,EAAWuzC,mBAC7B1L,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,SAIbyoB,YAAamI,MAInB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBAAsB0J,EACtBjK,oBAAqBA,EACrBG,qBAAsBA,EACtBppB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCS,mBAAoB,WAClB2G,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBACL+b,GAAWvqB,eAAYpd,KAG5BooC,EAAS,CAAEnxC,KAAMywC,MAEnB9uB,mBAAmB,EACnBupB,mBAAoBA,EACpBplB,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5D2+B,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrF+qC,+BAAgCrnC,EAAWqnC,+BAC3CwB,qBAxQiB,WAC7B,GAAIrb,GAAUoD,sBAAoBC,qBAAqBrE,KACrD,MAAO,CACLwc,QAAS3qC,EAAMowC,oBACfnjC,MAAOtL,EAAWonC,0BAClB4C,aAAc,WACZ+F,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWb,qBAAuBpwC,EAAMowC,wBAGxD59B,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAetS,EAAMqwC,SAAS/9B,cAC9Bg5B,mBAAmB,GA0PWkI,UAK9B,cAAC,IAAD,CACE3kB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B0oB,oBAnGkB,SAACjhC,QAECzD,IADZ2kC,EAAiB/4B,MAAK,SAACo5B,GAAD,OAAaA,EAAQptC,KAAO6L,KACtDmuC,aACdxJ,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWT,eAAgB,KACtFkB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3zB,uBAAoBhU,MAE1FooC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWT,eAAgB,KAExFkB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MA4FtEytC,WAAYx6C,EAAMqwC,SAASG,cAC3BlzB,kBAAmBtd,EAAMqwC,SAAS/yB,kBAClCC,0BAA2B,SAAC49B,GAAD,OACzBzJ,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3zB,kBAAoB69B,MAG/C7oC,cAAetS,EAAMqwC,SAAS/9B,cAC9B27B,iBAAkBA,SAK1B,cAAC,IAAD,CACEpf,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UA5QS,WACrB,IAAMwD,EAAWrwC,EAAMqwC,SACjB/B,EAAUL,EAAiB/4B,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/qB,aAC7DjM,EACJg3B,EAAS3pB,WAAaoL,OAAON,OAAO7vB,EAAW24C,UAAUplC,MAAK,SAACsX,GAAD,OAASA,EAAItrB,KAAOmvC,EAAS3pB,aAAW6b,YAElG6Y,EAAiB,CACrBj/B,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe3jB,UAAYoyC,EAASzuB,eAAe3jB,SAASuM,OAAS,EACrG6lC,EAASzuB,eAAe3jB,SACxB,kBACNue,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAGpEy5C,EAAsC,CAC1Cl/B,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAGpE05C,EAAe,CACnBn/B,UAAW,SACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAGpE25C,EAAgB,CACpBp/B,UAAW,WACXE,UAAWhD,GAAkC,gBAC7CmD,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,aACxE+xC,mBAAoB,iBAGhB6H,EAAyB,CAC7Br/B,UAAW,uBACXE,UAAWiyB,GAAWA,EAAQ/L,YAAc+L,EAAQ/L,YAAc,KAClE/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAGhB8H,EAAoB,CACxBt/B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,iBAGpEirC,EAAY7sC,EAAMowC,oBACpB,CAACgL,EAAgBC,EAAqCG,EAAwBC,GAC9E,CACEL,EACAC,EACAC,EACAC,EACAC,EACAC,GAYN,YARmCnyC,IAA/B+mC,EAAS/yB,mBACXuvB,EAAUvJ,OAAOtjC,EAAMowC,oBAAsB,EAAI,EAAG,EAAG,CACrDj0B,UAAW,6BACXE,WAA0C,IAA/Bg0B,EAAS/yB,kBAA6B,MAAQ,KACzDd,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,0BAIrEirC,EA8LgB+G,UAKnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAK3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBAxJL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAoJpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBAvKiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAmK5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBC7exEukC,G,gEACnBuT,SAAW,mB,KACXtyC,WAAa,E,KACbk/B,eAAiBr/B,cAAYC,QAAQN,gB,KACrCub,eAAiB,oC,KACjBD,cAAgB,iD,KAChB0C,QAAU,2B,KAEVoiB,+BAAiCpb,G,KACjCqhB,mBAAqB,2B,KACrBM,sBAAwB,sB,KAExBoM,oBAAsB,WACpB,OAAO9iC,uBAAqBqwB,4BAA4Ble,K,KAG1D4wB,gBAAkB,WAChB,OAAO9pB,OAAO4Q,QAAQ7pB,uBAAqB0oB,yBAAyB,CAACxW,GAA4B,WAAWzgB,KAC1G,SAAC/J,GAAD,OAAUA,EAAK,O,KAInBs7C,aAAe,WACb,OAAOhjC,uBAAqB0oB,yBAAyB,CAACxW,GAA4B,e,KAGpF2d,gB,UAAqB7vB,uBAAqBC,MAAM6P,Q,OAAStiB,EAAgBF,aAAagC,kB,KAEtFwgC,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,Y,KAEpEgxB,QAAUp3B,EAAmBsB,gB,KAC7BpC,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQz2B,OAL3B,UAMN+a,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,kBCsBlCmqC,GAAuBpd,aAAW,CACtCC,iBADsC,YAEpC,MAAO,CACLtL,UAFsC,EAAvBA,WAES,GACxBslB,SAHsC,EAAZA,WAM9BzZ,iBAAkBzC,OAAa0C,MAAM,CACnC9L,UAAWoJ,OAAatR,SAAS,sDAEnCmU,aAVsC,SAUzB0K,GACXA,EAAI2O,aAXqBja,EArDL,SAAC9mB,GACvB,IAAMukC,EAAWzvB,IAAMwZ,YAKvB,OAJApvB,qBAAU,WACRhI,MACC,IAGD,eAAC,KAAD,WACE,qBAAKsM,IAAK+gC,IACTtc,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ2Y,WACrD,cAAC,GAAD,CAAmB1Y,OAAQ/C,EAAM+C,SAGnC,oBAAI1L,GAAG,kBAAP,+BAEA,qBAAKkB,UAAU,MAAf,SACE,iCACE,cAAC,GAAD,CACEuK,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,sBACLxJ,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOlD,EAAM2nB,OAAOlM,UACpB7Y,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAMmkC,oBAAoB/hC,IAE5B/L,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAASnD,EAAMokC,iBAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAChDrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,iBAKzC,cAAC,IAAD,CAAiB/kB,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,4BAsBNuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrB8iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpC8iC,iBAAkBhjC,IAAUghC,MAAM9gC,YAGrB4iC,UCeT+N,GAAoCnrB,aAAW,CACnDC,iBADmD,YAEjD,MAAO,CACLtL,UAFyD,EAA1CA,WAES,GACxBhI,kBAHyD,EAA/BA,kBAI1BstB,SAJyD,EAAZA,WAOjDzZ,iBAAkB,SAACtnB,GAAD,OAChB6kB,OAAa0C,MAAM,CACjB9L,UAAWoJ,OAAatR,SAAS,oDACjCE,kBAAmBoR,OAAa4lB,KAAK,YAAa,CAChDC,GAAI,iBAA2B,SAArB1qC,EAAM2wC,YAChB57C,KAAM8vB,OAAatR,SAAS,gEAGlCmU,aAhBmD,SAgBtC0K,GACXA,EAAI2O,aAjBkCja,EAnFlB,SAAC9mB,GACvB,IAAMukC,EAAWzvB,IAAMwZ,YAKvB,OAJApvB,qBAAU,WACRhI,MACC,IAGD,eAAC,KAAD,WACE,qBAAKsM,IAAK+gC,IACTtc,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ2Y,WACrD,cAAC,GAAD,CAAmB1Y,OAAQ/C,EAAM+C,SAGnC,oBAAI1L,GAAG,mBAAP,+BACA,qDAEA,qBAAKkB,UAAU,MAAf,SACE,iCACE,cAAC,GAAD,CACEuK,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,sBACLxJ,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOlD,EAAM2nB,OAAOlM,UACpB7Y,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAM8nB,cAAc,oBAAqB,IACzC9nB,EAAMmkC,oBACJ/hC,EACApC,EAAMokC,iBAAiB/4B,MAAK,SAACtB,GAAD,OAAOA,EAAE1S,KAAO+K,OAGhD/L,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAASnD,EAAMokC,iBAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAChDrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,iBAKnB,SAArBzb,EAAM2wC,WACL,cAAC,GAAD,CACEl9B,kBAAmBzT,EAAMyT,kBACzBC,0BAA2B,SAACxQ,GAC1BlD,EAAM8nB,cAAc,oBAAqB5kB,GACzClD,EAAM0T,0BAA0BxQ,IAElCH,OAAQ/C,EAAM+C,OACdD,QAAS9C,EAAM8C,QACfE,YAAahD,EAAMgD,cAGrB,cAAC,IAAMtD,SAAP,IAGF,oBAAInH,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,eAGtB,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,4BA4BNsjB,GAAkC9wC,UAAY,CAC5Csa,UAAWra,IAAUC,OACrBsH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBgC,iBAAkBhjC,IAAUghC,MAAM9gC,YAGrB2wC,UCsTAC,GAzZY,WACzB,IAAM99C,EAAWq8B,cACX14B,EAAWkH,cACXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAGd,EAA0BstB,qBAAWP,GAAShB,GAAasB,IAA3D,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UACnD66B,EAAer6C,EAAWi6C,kBAGhC7yC,qBAAU,WAAO,IAAD,EACR8mC,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW5nC,YAAcsoC,GADrB,eAEJV,GAAW9sB,eAAiB0rB,GAFxB,OAKR,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBwtB,IAGlD,IAiBMC,EAAkBr+B,uBACtB,kBACEm+B,EAAS,CACPnxC,KAAMywC,GACN9b,QAASgb,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,qBAEvD,CAACxiB,EAAWwiB,iBAmIR6e,EAAc,uCAAG,kCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLr2B,EAAMqwC,WACjBjrB,UAAYzjB,EAAWk6C,eAC5BxlB,EAAKzP,QAAUjlB,EAAWilB,QAEC,SAAvByP,EAAKma,gBACDyL,EAAmBt6C,EAAWg6C,sBACpCtlB,EAAKjR,UAAY62B,EAAgB,UACjC5lB,EAAKzP,QAAUq1B,EAAgB,SARZ,kBAaExJ,GAAwBpc,GAb1B,OAcG,OADhBtmB,EAba,QAcRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAlBQ,4EAsBZ,GAtBY,0DAAH,qDA2Bd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDAkC1Bg9B,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAId,OACE,cAAC,GAAD,CACEmmB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBsB,gBAAgBlB,KAAM+B,KAAMxD,EAAWwiB,iBANjF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQ,CAAEz3B,KAAM,iCAAkCzI,IAAK,iDACvDsnC,iBAAkB,CAChB,CACE7+B,KAAM,4BACNzI,IAAK,uEAEP,CACEyI,KAAM,8CACNzI,IAAK,gEAGTunC,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,OAAU0H,GAAW,GAAM,kBAChEooC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAS,CAAEnU,aAAa,EAAMC,eAAe,SAG7FyoB,YAAamI,MAKnB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD0jB,UAAWtlB,EAAMqwC,SAAS/nB,sBAC1B0lB,oBAAqB,SAACjhC,GACpB2kC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3oB,sBAAwBvb,MAGnDkhC,iBAAkB+N,SAM1B,cAAC,IAAD,CACEntB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBA5Pc,WAC1B,IAAI6H,EAAgB,IAAInD,GAmBxB,OAlBAmD,EAAcC,gBACdD,EAAcE,eACdF,EAAc8B,6BACd9B,EAAcI,iBACFtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiB/mC,EAAW+mC,gBAC5BuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBA0OUlC,GACtBzI,oBAnQiB,WAC7B,GAAI1b,GAAUoD,sBAAoBC,qBAAqBtE,KACrD,MAAO,CAACgc,MAiQuB2M,GACrBj1B,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCS,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3C3qB,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5D2+B,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrF+qC,+BAAgCrnC,EAAWqnC,sCAMnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B0oB,oBArPkB,SAAC9sC,EAAIotC,GAChB0N,EAAa1xC,KAAI,SAACsJ,GAAD,OAAOA,EAAE0iC,WAAWtyC,UAAY4P,EAAE0iC,WAAWtyC,SAAS9C,MAAI+Q,SAASq8B,EAAQptC,IAG7GwwC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWT,cAAgB,WAGzCkB,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWT,cAAgB,WAEzCkB,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3zB,uBAAoBhU,MAI/CooC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3rB,UAAYpkB,MAiOzBoR,cAAetS,EAAMqwC,SAAS/9B,cAC9B27B,iBAlQkB,WAC9B,IAAIiO,EAAM,GACJ37C,EAAOy7C,EAAa9mC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOlB,EAAMqwC,SAAS/nB,yBAClE,QAAahf,IAAT/I,EAAJ,CAEA,IAAK,IAAIsJ,KAAStJ,EAAK+1C,WACrB4F,EAAIvrC,KAAKpQ,EAAK+1C,WAAWzsC,IAE3B,OAAOqyC,GA0PuBC,GAClB3B,WAAYx6C,EAAMqwC,SAASG,cAC3BlzB,kBAAmBtd,EAAMqwC,SAAS/yB,kBAClCC,0BAA2B,SAAC49B,GAAD,OACzBzJ,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3zB,kBAAoB69B,aAQvD,cAAC,IAAD,CACEtsB,KAAMltB,EAAWy4B,QAAQz2B,MACzBvC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UAlPS,WACrB,IAAMwD,EAAWrwC,EAAMqwC,SACjBgG,EAAc2F,EAAa9mC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/nB,yBAC/DgZ,EAnGyB,WAA2B,IAA1B8a,EAAyB,4DAAd9yC,EACzC,IAEE,IAAMgc,EAAY82B,GAAsBp8C,EAAMqwC,SAAS/qB,UACjD+wB,EAAc2F,EAAa9mC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOlB,EAAMqwC,SAAS/nB,yBACzE,IAAK,IAAIze,KAASwsC,EAAYC,WAC5B,GAAID,EAAYC,WAAWzsC,GAAO3I,KAAOokB,EAAW,CAElD,OADiB+wB,EAAYC,WAAWzsC,IAI5C,SACA,QAuFawyC,GAETxP,EAAY,CAChB,CACE1wB,UAAW,eACXE,UAAWg6B,GAAeA,EAAY9T,YAAc8T,EAAY9T,YAAc,KAC9E/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,oBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,oBACXE,UAAWilB,GAAYA,EAASiB,YAAcjB,EAASiB,YAAc,KACrE/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAa5E,OARIyuC,EAAS/yB,mBACXuvB,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,6BACXE,WAA0C,IAA/Bg0B,EAAS/yB,kBAA6B,MAAQ,KACzDd,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,0BAIrEirC,EA2LgB+G,UAMnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAM3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBA7JL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAyJpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBA5KiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAGjFtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAwK5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBChXvF04C,GAA4B3rB,aAAW,CAC3CC,iBAD2C,YAEzC,MAAO,CACL2rB,OAFuC,EAAxBv1B,YAEO,GACtB4jB,SAHuC,EAAZA,WAM/BzZ,iBAAkBzC,OAAa0C,MAAM,CACnCmrB,OAAQ7tB,OAAatR,SAAS,uDAEhCmU,aAV2C,SAU9B0K,GACXA,EAAI2O,aAX0Bja,EApDL,SAAC9mB,GAC5B,IAAMukC,EAAWzvB,IAAMwZ,YAKvB,OAJApvB,qBAAU,WACRhI,MACC,IAGD,eAAC,KAAD,WACE,qBAAKsM,IAAK+gC,IACTtc,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ4vC,QACrD,cAAC,GAAD,CAAmB3vC,OAAQ/C,EAAM+C,SAEnC,oBAAI1L,GAAG,kBAAP,+BAEA,qBAAKkB,UAAU,MAAf,SACE,iCACE,cAAC,GAAD,CACEuK,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,uBACLxJ,GAAG,SACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,SACL4H,MAAOlD,EAAM2nB,OAAO+qB,OACpB9vC,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,SAAU1lB,GAC9BpC,EAAM2yC,iBAAiBvwC,IAEzB/L,MAAO2J,EAAM+C,OAAO2vC,QAAU1yC,EAAM8C,QAAQ4vC,OAC5CvvC,QAASnD,EAAM4yC,kBAAkBnyC,KAAI,SAAC/J,GAAD,MAAW,CAC9C0M,MAAO1M,EAAKgiC,YACZx1B,MAAOxM,EAAKW,SAGf2I,EAAM+C,OAAO2vC,QAAU1yC,EAAM8C,QAAQ4vC,QACpC,cAAC,IAAD,UAAsB1yC,EAAM+C,OAAO2vC,cAKzC,cAAC,IAAD,CAAiBh8C,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,4BAsBN8jB,GAA0BtxC,UAAY,CACpCgc,WAAY/b,IAAUC,OACtBsxC,iBAAkBvxC,IAAUyS,KAAKvS,WACjCsxC,kBAAmBxxC,IAAUghC,MAAM9gC,WACnCqtB,aAAcvtB,IAAUyS,MAGX4+B,UCiCTvO,GAAuBpd,aAAW,CACtCC,iBADsC,YACwB,IAA3CtL,EAA0C,EAA1CA,UAAWslB,EAA+B,EAA/BA,SAC5B,MAAO,CACLtlB,UAAWA,GAAa,GACxBhI,kBAHyD,EAArBA,kBAIpCstB,aAGJzZ,iBAAkB,SAACtnB,GAAD,OAChB6kB,OAAa0C,MAAM,CACjB9L,UAAWoJ,OAAatR,SAAS,oDACjCE,kBAAmBoR,OAAa4lB,KAAK,YAAa,CAChDC,GAAI,iBAA2B,SAArB1qC,EAAM2wC,YAChB57C,KAAM8vB,OAAatR,SAAS,gEAGlCmU,aAhBsC,SAgBzB0K,GACXA,EAAI2O,aAjBqBja,EAjGT,SAAC,GAiBd,IAhBLqH,EAgBI,EAhBJA,aACAE,EAeI,EAfJA,QACAtrB,EAcI,EAdJA,OACAD,EAaI,EAbJA,QACAE,EAYI,EAZJA,YACA8kB,EAWI,EAXJA,cACAqc,EAUI,EAVJA,oBACA17B,EASI,EATJA,cACAE,EAQI,EARJA,cACAD,EAOI,EAPJA,aACAimB,EAMI,EANJA,aACAlT,EAKI,EALJA,UACA2oB,EAII,EAJJA,iBACAuM,EAGI,EAHJA,WACAj9B,EAEI,EAFJA,0BACAD,EACI,EADJA,kBAEM6wB,EAAuB/gC,GAAY4qB,GACnCoW,EAAW9gC,mBAYjB,OAVAvE,qBAAU,WACRhI,MACC,IAEHgI,qBAAU,gBACqBO,IAAzB6kC,IAAuD,IAAjBnW,IAAqC,IAAZE,GACjEG,IAASC,YAAY8V,EAAS7gC,SAAShM,mBAExC,CAACy2B,IAGF,qBAAK51B,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK+gC,IACTtc,OAAOC,KAAKnlB,GAAQpC,OAAS,GAAKmC,EAAQ2Y,WAAa,cAAC,GAAD,CAAmB1Y,OAAQA,IAEnF,mDACA,qDACA,8BACE,uBAAM1L,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAASA,EACTC,OAAQA,EACRlC,KAAK,sBACLxJ,GAAG,YACH2L,YAAaA,IAEf,cAAC,IAAD,CACE1H,KAAK,YACL4H,MAAOuY,EACP7Y,SAAU,SAACR,GACT0lB,EAAc,YAAa1lB,GAC3B0lB,EAAc,yBAAqBroB,GACnC0kC,EAAoB/hC,IAEtB/L,MAAO0M,EAAO0Y,WAAa3Y,EAAQ2Y,UACnCtY,QAASihC,EAAiB3jC,KAAI,SAACgkC,GAAD,MAAc,CAC1CrhC,MAAOqhC,EAAQ/L,YACfx1B,MAAOuhC,EAAQptC,SAGlB0L,EAAO0Y,WAAa3Y,EAAQ2Y,WAAa,cAAC,IAAD,UAAsB1Y,EAAO0Y,iBAG3D,SAAfk1B,EACC,cAAC,GAAD,CACEl9B,kBAAmBA,EACnBC,0BAA2B,SAACxQ,GAC1B4kB,EAAc,oBAAqB5kB,GACnCwQ,EAA0BxQ,IAE5BH,OAAQA,EACRD,QAASA,EACTE,YAAaA,IAGf,cAAC,IAAMtD,SAAP,IAGF,oBAAInH,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CAAoBoR,cAAeA,EAAeE,cAAeA,EAAeD,aAAcA,IAE9F,cAAC,IAAD,CAAiBhS,KAAK,SAASoX,SAAUqgB,EAAc51B,UAAWC,IAAc0a,QAAU,eAA1F,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASi2B,EAAxC,8BA6BRuV,GAAqB/iC,UAAY,CAC/Bsa,UAAWra,IAAUC,OACrBsH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7B6iC,oBAAqB/iC,IAAUyS,KAAKvS,WACpCmH,cAAerH,IAAUghC,MACzBgC,iBAAkBhjC,IAAUghC,MAAM9gC,WAClCqvC,WAAYvvC,IAAUC,OAAOC,WAC7BmS,kBAAmBrS,IAAUwS,KAC7BF,0BAA2BtS,IAAUyS,KAAKvS,YAG7B4iC,UC1IF5F,GAAb,cAmDE,aAAe,IAAD,iCAlDdG,eAAiBr/B,cAAYC,QAAQN,gBAkDvB,KAjDdwxB,QAAUp3B,EAAmBuB,kBAiDf,KAhDdrC,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQz2B,OAL3B,UAMN+a,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eA0CxB,KAxCdugB,eAAiB,uCAwCH,KAvCdD,cAAgB,oDAuCF,KAtCd9a,WAAa,EAsCC,KArCdwd,QAAU,uBAqCI,KApCdmiB,0BAA4B,mCAoCd,KAnCd2T,uBAAyB,mBAmCX,KAlCdC,wBAA0B,sFAkCZ,KAjCdC,+BAAiC,2BAiCnB,KAhCdC,gCAAkC,sFAgCpB,KA/Bd7T,+BAAiCpb,GA+BnB,KA9BdqhB,mBAAqB,6BA8BP,KA7BdM,sBAAwB,sBA6BV,KA5BduN,gBA4Bc,UA5BOjkC,uBAAqBqwB,4BAA4B9iC,IA4BxD,OA3BZC,EAAgBF,aAAaiC,sBA2BjB,KAvBd+sC,iBAAmB,CACjBzqC,KAAM,WACNzI,IAAK,6CAqBO,KAlBdizC,mBAAqB,CACnB,CACExqC,KAAM,4BACNzI,IAAK,mEAEP,CACEyI,KAAM,kDACNzI,IAAK,4DAWK,KANd86C,UAAY,GAME,KALdC,cAAgB,GAKF,KAJd1G,WAAa,GAIC,KAUd3N,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YAVtD,KAYduyC,oBAAsB,WACpB,OAAO9iC,uBAAqBqwB,4BAA4Ble,KAb5C,KAgBd4wB,gBAAkB,WAChB,OAAO9pB,OAAO4Q,QACZ7pB,uBAAqB0oB,yBAAyB,CAACpW,GAAiD,WAChG7gB,KAAI,SAAC/J,GAAD,OAAUA,EAAK,OAnBT,KAsBds7C,aAAe,WACb,OAAOhjC,uBAAqB0oB,yBAAyB,CACnDpW,GACA,eAxBF,MACEtS,uBAAqBqwB,4BAA4B/d,IAD3C/F,EAAR,EAAQA,UAAWqpB,EAAnB,EAAmBA,YAAasO,EAAhC,EAAgCA,UAAW3T,EAA3C,EAA2CA,sBAE3C1qB,KAAKs+B,cAAgBD,EACrBr+B,KAAK0G,UAAYA,EACjB1G,KAAK0qB,sBAAwBA,EAC7B1qB,KAAK43B,WAAaxkB,OAAON,OAAOid,GAChC/vB,KAAKq+B,UAAYjrB,OAAON,OAAOurB,MC2apBE,GAvcc,SAACpzC,GAC5B,IAAM5L,EAAWq8B,cACX14B,EAAWkH,cACXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IACpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KAGA3oC,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UACnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW5nC,YAAcsoC,GADrB,eAEJV,GAAW9sB,eAAiB0rB,GAFxB,OAKR,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBACtB,kBACEm+B,EAAS,CACPnxC,KAAMywC,GACN9b,QAASgb,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,qBAEvD,CAACxiB,EAAWwiB,iBAoFR6mB,EAAoB,uCAAG,WAAO/+B,GAAP,uCAAAlK,EAAA,6DACrB6hB,EAAOtO,GAAiBrJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAD5C,SAEND,GAAmB1I,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAFtD,cAErB8N,EAFqB,gBAGR1M,GAAiB/J,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAHlD,cAGrByC,EAHqB,OAIrBnD,EAAW+B,GAA0BhK,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GAC9EmB,EAAOH,GAAiB8M,GACxBC,EAASjN,GAAwBzJ,EAAE09B,QAAQK,SAASp2B,EAAG3H,EAAE09B,QAAQK,SAASp1B,GANrD,UAOsCrF,QAAQqB,IAAI,CAACgT,EAAM1P,EAAU6B,EAAM4M,IAPzE,oCAOpBg4B,EAPoB,KAOTC,EAPS,KAOMC,EAPN,KAOiBC,EAPjB,KAWrBl5B,EAAiB,CACrBtK,QAASrL,EAAE09B,QAAQK,SAASp2B,EAAEC,WAC9B0D,SAAUtL,EAAE09B,QAAQK,SAASp1B,EAAEf,WAC/B6O,OAAQA,GAAkBzW,EAAE09B,QAAQn0B,WAAW0nC,KAC/Ct5B,KAAM+2B,EACNzmC,SAAU0mC,EACV7kC,KAAM8kC,EAAYA,EAAUhnC,WAAa,KACzCwD,KAAMA,EACNsL,OAAQm4B,EACR51B,QAASjZ,EAAE09B,QAAQn0B,WAAWy8B,QAC9Bl/B,OAAO,WAAD,OAAa9G,EAAE09B,QAAQn0B,WAAWy8B,UAG1CP,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAStT,IAxB7B,4CAAH,sDA2BpBkzB,EArGsB,WAC1B,IAAI7B,EAAgB,IAAInD,GAoBxB,OAnBAmD,EAAcC,gBACdD,EAAcE,eACdF,EAAc8B,6BACd9B,EAAcI,iBACFtE,GAA6B,CACvCC,+BAAgCG,GAChCzG,gBAAiB/mC,EAAWm7C,gBAC5B7N,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBAmFelC,GACnCzI,EA9E6B,WACjC,IAAMsS,EAAWx7C,EAAWo7C,UAAU7nC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAOlB,EAAMqwC,SAASrpB,cAC1Eo2B,OAA0B9zC,IAAb6zC,GAA0BA,EAASj8C,KAAOS,EAAWq7C,cAAcK,KAAKn8C,GAIrFo8C,EAAe,CACnBlT,SAJmBgT,EAAaz7C,EAAWg7C,wBAA0Bh7C,EAAWk7C,gCAKhFx5B,QAJkB+5B,EAAaz7C,EAAW+6C,uBAAyB/6C,EAAWi7C,+BAK9E95B,cAAewsB,GAAqB,CAClCC,sBAAuB,gBACvBC,eAAgB,CACd,CAAEK,OAAQ,qBAAuBt7B,KAAM,QACvC,CAAEs7B,OAAQ,UAAWt7B,KAAM,WAC3B,CAAEs7B,OAAQ,OAAQt7B,KAAM,gBAK1BqlC,EAAe,GAYnB,OAXIzqB,GAAUoD,sBAAoBC,qBAAqBtE,OACnB,IAA9BluB,EAAMowC,oBAERwJ,EAAajpC,KAAKu5B,MAKpB0P,EAAajpC,KAAK2sC,GAGb1D,EA+CmB2D,GAEtB9R,EACJ,gIAEE,uBAFF,WAGU,sBAAM,cAAY,OAAOrpC,UAAU,+BAH7C,sDAKE,uBALF,mDAOE,uBAPF,gDA0BI6rC,EAAmBtsC,EAAW20C,WAE9BtT,EAAc,uCAAG,oCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLr2B,EAAMqwC,UAChBmN,GAC0B,IAA9Bx9C,EAAMowC,oBAAgCzuC,EAAWk6C,eAAiBl6C,EAAWynC,sBAC/E/S,EAAKjR,UAAYo4B,EACjBnnB,EAAKzP,QAAUjlB,EAAWilB,QAEC,SAAvByP,EAAKma,gBACDyL,EAAmBt6C,EAAWg6C,sBACpCtlB,EAAKjR,UAAY62B,EAAgB,UACjC5lB,EAAKzP,QAAUq1B,EAAgB,SAVZ,kBAeExJ,GAAwBpc,GAf1B,OAgBG,OADhBtmB,EAfa,QAgBRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MApBQ,4EAwBZ,GAxBY,0DAAH,qDA6Bd8a,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAgERy0C,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B0wC,GACJzyC,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDAiChC,OACE,cAAC,GAAD,CACEslB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBuB,kBAAkBnB,KAAM+B,KAAMxD,EAAWwiB,iBANnF,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQxgC,EAAWwzC,iBACnB5L,iBAAkB5nC,EAAWuzC,mBAC7B1L,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAWlwB,aAAc,GADrB,eAEJkwB,GAAWjwB,eAAgB,GAFvB,SAObyoB,YAAamI,MAInB,cAAC,IAAD,CACE/iB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvDolB,WAAYhnB,EAAMqwC,SAASrpB,WAC3Bw1B,iBArTe,SAACzvC,GAC5B2kC,EAAS,CAAEnxC,KAAMywC,KACjBU,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWjqB,WAAaja,MAoTvE0vC,kBAAmB96C,EAAWo7C,iBAKtC,cAAC,IAAD,CACEluB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBAAsB0J,EACtBjK,oBAAqBA,EACrBG,qBAAsBA,EACtBppB,eAAgB5hB,EAAMqwC,SAASzuB,eAC/B0oB,iBAAkBtqC,EAAMqwC,SAAS/F,iBACjCS,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3CtF,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrFikB,mBAAmB,EACnBupB,mBAAoBA,EACpBplB,sBAAuBrmB,EAAMqwC,SAAShqB,sBACtC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAI5Di8B,+BAAgCrnC,EAAWqnC,+BAE3CwB,qBArRiB,WAC7B,GAAIrb,GAAUoD,sBAAoBC,qBAAqBrE,KACrD,MAAO,CACLwc,QAAS3qC,EAAMowC,oBACfnjC,MAAOtL,EAAWonC,0BAClB+C,wBAAwB,EACxBH,aAAc,WACZ+F,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWb,qBAAuBpwC,EAAMowC,yBA4Q1BoD,UAK9B,cAAC,IAAD,CACE3kB,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4Q,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+a,UAAWtlB,EAAMqwC,SAAS/qB,UAC1B0oB,oBAxOkB,SAACjhC,IAGC,IAFZkhC,EAAiB/4B,MAAK,SAACo5B,GAAD,OAAaA,EAAQptC,KAAO6L,KAEtDmuC,YACdxJ,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWT,cAAgB,WAEtFkB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAWT,cAAgB,WACtFkB,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3zB,uBAAoBhU,MAG5FooC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MA+NtEytC,WAAYx6C,EAAMqwC,SAASG,cAC3BlzB,kBAAmBtd,EAAMqwC,SAAS/yB,kBAClCC,0BAA2B,SAAC49B,GAAD,OACzBzJ,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW3zB,kBAAoB69B,MAG/C7oC,cAAetS,EAAMqwC,SAAS/9B,cAC9B27B,iBAAkBA,SAK1B,cAAC,IAAD,CACEpf,KAAMltB,EAAWy4B,QAAQz2B,MACzBvC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UAvMS,WACrB,IAAMwD,EAAWrwC,EAAMqwC,SACjBgG,EAAc10C,EAAWo7C,UAAU7nC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAASrpB,cACvEsa,EAAW3/B,EAAW20C,WAAWphC,MAAK,SAACq9B,GAAD,OAASA,EAAIrxC,KAAOmvC,EAAS/qB,aAEjEunB,EAAY,CAChB,CACE1wB,UAAW,eACXE,UAAWg6B,GAAeA,EAAY9T,YAAc8T,EAAY9T,YAAc,KAC9E/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,oBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,oBACXE,UAAWilB,GAAYA,EAASiB,YAAcjB,EAASiB,YAAc,KACrE/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAa5E,OARIyuC,EAAS/yB,mBACXuvB,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,6BACXE,WAA0C,IAA/Bg0B,EAAS/yB,kBAA6B,MAAQ,KACzDd,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,0BAIrEirC,EAgJgB+G,UAKnB,cAAC,IAAD,CACE/kB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAMrjC,cAAYC,QAAQN,mBACxC0Y,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAK3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBAnJL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBA+IpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBAhJiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAGjFtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QA4I5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBCrexEukC,G,cAsBnB,aAAe,IAAD,iCArBd/N,QAAUp3B,EAAmBwB,WAqBf,KApBd0f,cAAgB,2CAoBF,KAnBdqrB,sBAAwB,sBAmBV,KAlBdprB,eAAiB,8BAkBH,KAjBdjiB,SAAW,CAAC,GAAD,OACNwc,KAAK0b,QAAQh3B,MADP,UAENsb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ/2B,OAF3B,UAGNqb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ92B,OAH3B,UAINob,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQ72B,OAJ3B,UAKNmb,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQz2B,OAL3B,UAMN+a,KAAK0b,QAAQh3B,KAAOsb,KAAK0b,QAAQx2B,eAWxB,KATdgjB,QAAU,qBASI,KARdxd,WAAa,EAQC,KAPdk/B,eAAiBr/B,cAAYC,QAAQN,gBAOvB,KAJd60C,gBAAkB,GAIJ,KAHdnH,WAAa,GAGC,KAQd3N,yBAA2B,SAAC9qB,GAAD,OAAYA,EAAS,GAAKA,GAAU,EAAKzU,YARtD,KAWd+rC,iBAAmB,CACjBzqC,KAAM,wCAZM,KAedgzC,0BAA4B,0CAfd,KAiBdxI,mBAAqB,CACnB,CACExqC,KAAM,qBACNzI,IAAK,uCAEP,CACEyI,KAAM,sBACNzI,IAAK,2CAEP,CACEyI,KAAM,qBACNzI,IAAK,uCAEP,CACEyI,KAAM,kCACNzI,IAAK,kDAEP,CACEyI,KAAM,8BACNzI,IAAK,+CApCK,KAwCd07C,oBAAsB,CACpBvvC,QACE,yJACFC,UAAW,mFA3CC,KA8CduvC,WACE,+LA/CY,KAkDd3O,mBAAqB,sBAlDP,KAmDdM,sBAAwB,sBAnDV,KAoDdvG,+BAAiCpb,GAnD/B,MAAuC/U,uBAAqBqwB,4BAA4Bje,IAAhF7F,EAAR,EAAQA,UAAWq4B,EAAnB,EAAmBA,gBAEnB/+B,KAAK0G,UAAYA,EAEjB1G,KAAK++B,gBAAkB3rB,OAAON,OAAOisB,MC+BnCzF,GAA2BrnB,aAAW,CAC1CC,iBAD0C,YAExC,MAAO,CACL2rB,OAF6C,EAA9B/zB,kBAEa,GAC5BoiB,SAH6C,EAAZA,WAMrCzZ,iBAAkBzC,OAAa0C,MAAM,CACnCmrB,OAAQ7tB,OAAatR,SAAS,4DAEhCmU,aAV0C,SAU7B0K,GACXA,EAAI2O,aAXyBja,EAnDL,SAAC9mB,GAC3B,IAAMukC,EAAWzvB,IAAMwZ,YAKvB,OAJApvB,qBAAU,WACRhI,MACC,IAGD,eAAC,KAAD,WACE,qBAAKsM,IAAK+gC,IACTtc,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAM8C,QAAQ4vC,QACrD,cAAC,GAAD,CAAmB3vC,OAAQ/C,EAAM+C,SAEnC,oBAAI1L,GAAG,kBAAP,+BACA,qBAAKkB,UAAU,MAAf,SACE,iCACE,cAAC,GAAD,CACEuK,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,4BACLxJ,GAAG,SACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,SACL4H,MAAOlD,EAAM2nB,OAAO+qB,OACpB9vC,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,SAAU1lB,GAC9BpC,EAAMg0C,uBAAuB5xC,IAE/B/L,MAAO2J,EAAM+C,OAAO2vC,QAAU1yC,EAAM8C,QAAQ4vC,OAC5CvvC,QAASnD,EAAMi0C,wBAAwBxzC,KAAI,SAAC/J,GAAD,MAAW,CACpD0M,MAAO1M,EAAKgiC,YACZx1B,MAAOxM,EAAKW,SAGf2I,EAAM+C,OAAO2vC,QAAU1yC,EAAM8C,QAAQ4vC,QACpC,cAAC,IAAD,UAAsB1yC,EAAM+C,OAAO2vC,cAKzC,cAAC,IAAD,CAAiBh8C,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM2uB,aAA9C,4BAsBNwf,GAAyBhtC,UAAY,CACnCwd,iBAAkBvd,IAAUC,OAC5B2yC,uBAAwB5yC,IAAUyS,KAAKvS,WACvC2yC,wBAAyB7yC,IAAUghC,MAAM9gC,WACzCqtB,aAAcvtB,IAAUyS,MAGXs6B,UC8CTjK,GAAuBpd,aAAW,CACtCC,iBADsC,YACqE,IAAxFtL,EAAuF,EAAvFA,UAAW0wB,EAA4E,EAA5EA,cAAe1jC,EAA6D,EAA7DA,cAC3C,MAAO,CACLgT,UAAWA,GAAa,GACxB0wB,cAAeA,EACfxM,aAJsG,EAA9CA,aAKxDl3B,cAAeA,GAAiB,GAChCoW,6BANsG,EAAhCA,+BAS1EyI,iBAAkB,SAACtnB,GACjB,IAAMuuC,EAAmB,CACvB5O,aAAc9a,OAAatR,WAC3B9K,cAAeoc,OACfhG,6BAA8BgG,OAAakR,IACzChV,GACApd,KAIEuwC,EAAyBl0C,EAAM4zC,gBAAgBvoC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAO2I,EAAMmsC,iBAOtF,OANmB+H,EAAuBzH,WAAaxkB,OAAON,OAAOusB,EAAuBzH,YAAc,QAGxG8B,EAAiB9yB,UAAYoJ,OAAatR,SAAS,sDAG9CsR,OAAa0C,MAAMgnB,IAE5B7mB,aA7BsC,SA6BzB0K,GACXA,EAAIuN,iBA9BqB7Y,EA7GT,SAAC9mB,GACnB,IAAIouB,EAActZ,IAAMwZ,YAClBC,EAAsBzZ,IAAMrR,OAAO,GAEnCywC,EAAyBl0C,EAAM4zC,gBAAgBvoC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAO2I,EAAMmsC,iBAChFM,EAAayH,EAAuBzH,WAAaxkB,OAAON,OAAOusB,EAAuBzH,YAAc,KAwB1G,OAjBAvtC,qBAAU,YAELc,EAAMmuB,eACNnuB,EAAMquB,SACPpG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GACnCX,EAAMgD,YAAcurB,EAAoB7qB,UAExC6qB,EAAoB7qB,QAAU1D,EAAMgD,YACnBwrB,IAASC,YAAYL,EAAY1qB,SACzChM,oBAEV,CAACsI,EAAMmuB,aAAcC,EAAapuB,EAAM+C,OAAQ/C,EAAMquB,QAASruB,EAAMgD,cAExE9D,qBAAU,WACRhI,MACC,IAGD,qBAAKqB,UAAU,OAAf,SACE,eAAC,KAAD,WACE,qBAAKiL,IAAK4qB,IACTnG,OAAOC,KAAKloB,EAAM+C,QAAQpC,OAAS,GAAKX,EAAMgD,YAAc,GAC3D,cAAC,GAAD,CAAmBD,OAAQ/C,EAAM+C,SAGnC,mDACA,8DAEC0pC,EACC,qBAAKl0C,UAAU,MAAf,SACE,uBAAMlB,GAAG,mBAAT,UACE,cAAC,GAAD,CACEyL,QAAS9C,EAAM8C,QACfC,OAAQ/C,EAAM+C,OACdlC,KAAK,uBACLoC,IAAI,IACJ5L,GAAG,YACH2L,YAAahD,EAAMgD,cAErB,cAAC,IAAD,CACE1H,KAAK,YACLsH,SAAU,SAACR,GACTpC,EAAM8nB,cAAc,YAAa1lB,GACjCpC,EAAM4sC,gBAAgBxqC,IAExBc,MAAOlD,EAAM2nB,OAAOlM,UACpBplB,MAAO2J,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,UAC/CtY,QAASspC,EAAWhsC,KAAI,SAACg3B,GAAD,MAAe,CACrCr0B,MAAOq0B,EAASiB,YAChBx1B,MAAOu0B,EAASpgC,SAGnB2I,EAAM+C,OAAO0Y,WAAazb,EAAM8C,QAAQ2Y,WACvC,cAAC,IAAD,UAAsBzb,EAAM+C,OAAO0Y,iBAIvC,KAEJ,cAAC,GAAD,CACEhB,aAAa,EACbC,aAAcqG,GACdxoB,UAAU,QACV+C,KAAK,+BACLqa,YAAY,qBACZzS,MAAOlD,EAAM6e,6BACblE,8BAvEkC,SAACvY,GACzCpC,EAAM8nB,cAAc,+BAAgC1lB,EAAE2G,OAAO7F,OAC7DlD,EAAM2a,+BAAiC3a,EAAM2a,8BAA8BvY,IAsErEwY,WAAW,qBACXtW,SAAS,oIACTiP,UAAU,IAEXvT,EAAM+C,OAAO8b,8BAAgC7e,EAAM8C,QAAQ+b,8BAC1D,cAAC,IAAD,UAAsB7e,EAAM+C,OAAO8b,+BAGrC,oBAAItmB,UAAU,OAAOlB,GAAG,cAAxB,4BAIA,cAAC,GAAD,CACEoR,cAAezI,EAAMyI,cACrBE,cAAe3I,EAAM2I,cACrBD,aAAc1I,EAAM0I,aACpBpE,SAAUtE,EAAM8zC,sBAGlB,cAAC,IAAD,CAAiBp9C,KAAK,SAASoX,SAAU9N,EAAMmuB,aAAc51B,UAAWC,IAAc0a,QAAU,eAAhG,kBAGA,cAAC,IAAD,CAAiBxc,KAAK,SAASgC,QAASsH,EAAM6sC,iBAA9C,8BA0CR3I,GAAqB/iC,UAAY,CAC/Bw+B,aAAcv+B,IAAUyS,KAAKvS,WAC7BurC,iBAAkBzrC,IAAUyS,KAAKvS,WACjCsrC,gBAAiBxrC,IAAUyS,KAAKvS,WAChCsyC,gBAAiBxyC,IAAUghC,MAAM9gC,WACjCqH,cAAevH,IAAUyS,KAAKvS,WAC9BoH,aAActH,IAAUyS,KAAKvS,WAC7BmH,cAAerH,IAAUghC,MAAM9gC,WAC/B6qC,cAAe/qC,IAAUC,OACzBoa,UAAWra,IAAUC,OACrByyC,oBAAqB1yC,IAAU0S,OAAOxS,YAGzB4iC,UC+LAiQ,GAtVO,WACpB,IAAM//C,EAAWq8B,cACX14B,EAAWkH,cAEXnH,EAAakJ,mBAAQ,kBAAM,IAAIs9B,KAAqB,IAEpDqJ,EAAY3mC,mBAChB,kBAAMqlC,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,mBAChD,CAACxiB,EAAWwiB,iBAEd,EAA0BstB,qBAAWP,GAASM,GAA9C,mBAAOxxC,EAAP,KAAc0xC,EAAd,KACMrB,EAAWrwC,EAAMqwC,SACjB3H,EAAe,UAAM7vB,uBAAqBC,MAAM6P,QAAjC,OAA0CtiB,EAAgBF,aAAakC,YAGtFyzB,EAAgB,WACpB,MAAO,CACL/a,YAAa/gB,EAAM+gB,YACnBC,cAAehhB,EAAMghB,cACrBC,aAActf,EAAWO,SAAS,GAClCgf,WAAYvf,EAAWO,SAASP,EAAWyH,YAC3CnL,SAAUA,IAKd8K,qBAAU,WAAO,IAAD,EACR4oC,EAAchwC,EAAWO,SAASjD,QAAQhB,EAASkjB,UACnD0uB,EAASuB,GAAkB,CAC/BnvC,IAAKhE,EAASkjB,SACdkwB,kBAAmB1vC,EAAWwiB,iBAGhCutB,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAW5nC,YAAcsoC,GADrB,eAEJV,GAAW9sB,eAAiB0rB,GAFxB,OAKR,CAAC5xC,EAASkjB,SAAUxf,EAAWwiB,eAAgBxiB,EAAWO,WAG7D,IAAM0vC,EAAkBr+B,uBACtB,kBACEm+B,EAAS,CACPnxC,KAAMywC,GACN9b,QAASgb,GAAa,CAAE/rB,eAAgBxiB,EAAWwiB,qBAEvD,CAACxiB,EAAWwiB,iBAcV8uB,EAAgB,IAAInD,GACxBmD,EAAcC,gBACdD,EAAcE,eACdF,EAAc8B,6BACd9B,EAAcI,iBACd,IAAMjI,EAAuB2D,GAA6B,CACxDC,+BAAgCG,GAChCzG,gBAAiBA,EACjBuG,mBAAoBttC,EAAWstC,mBAC/BnsB,cAAewsB,GAAqB,CAClCC,sBAAuB5tC,EAAW4tC,sBAClCC,eAAgB,CACd,CAAEK,OAAQ,aAAct7B,KAAM,aAC9B,CAAEs7B,OAAQ,eAAgBt7B,KAAM,gBAElCm7B,4BAA4B,IAE9BR,OAAQ+D,EAAcuC,qBA+DlBxS,EAAc,uCAAG,gCAAAjhC,EAAA,6DACjBs0B,EADiB,gBACLga,IACXjrB,UAAYzjB,EAAWyjB,UAC5BiR,EAAKzP,QAAUjlB,EAAWilB,QAHL,kBAOE+rB,EAAgB5tB,eAAesR,GAPjC,OAQG,OADhBtmB,EAPa,QAQRjR,SACT4yC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASnlB,EAAOwE,OAC/Dm9B,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWlwB,aAAc,GAA9B,eAAqCkwB,GAAWjwB,eAAgB,GAAhE,MAZQ,4EAgBZ,GAhBY,0DAAH,qDAqBd0xB,EAA0B,uCAAG,WAAO1tC,GAAP,SAAAjD,EAAA,sEAC3B4wC,EAAgBxpB,uBACpBnpB,EAAMglB,SAASiE,gBACfjpB,EAAMglB,SAASoE,sBACfppB,EAAMglB,SAASqE,WACfrkB,GACApG,MAAK,SAACmR,GACN,OAAsB,MAAlBA,EAAOjR,UAPoB,2CAAH,sDAiChC,OACE,cAAC,GAAD,CACEslB,mBAAoB,kBAAMziB,EAAWgnC,yBAAyB3oC,EAAMqJ,cACpE8a,eAAgBnkB,EAAMmkB,eACtBD,cAAeviB,EAAWuiB,cAC1B9a,WAAYzH,EAAWyH,WACvBC,YAAarJ,EAAMqJ,YACnBU,YAAa,CAAC,CAAE9H,IAAKe,EAAmBwB,WAAWpB,KAAM+B,KAAMxD,EAAWwiB,iBAN5E,SAOE,eAAC,IAAD,WACE,cAAC,IAAD,CACE0K,KAAK,IACLztB,QACE,cAAC,GAAD,CACE+gC,OAAQxgC,EAAWwzC,iBACnB7L,sBAAuB3nC,EAAW+7C,0BAClCnU,iBAAkB5nC,EAAWuzC,mBAC7B1L,aAAc,kBACZ/nC,EAAwB,EAAGE,EAAYC,GAAU,GAAO,GAAM,wBAC5D8vC,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBACJ+b,GAAWlwB,aAAc,GADrB,eAEJkwB,GAAWjwB,eAAgB,GAFvB,SAObyoB,YAAamI,EACbvrB,sBAAuB,4BAAI1kB,EAAWi8C,iBAI5C,cAAC,IAAD,CACE/uB,KAAMltB,EAAWy4B,QAAQ/2B,MACzBjC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEtD,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DgpC,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD4mB,iBAAkB6nB,EAAS7nB,iBAC3Bq1B,uBAxLqB,SAAC9wC,GAAW,IAAD,EAC5C2kC,EAAS,CAAEnxC,KAAMywC,KACjBU,EAAS,CACPnxC,KAAMywC,GACN9b,SAAO,oBAAK+b,GAAWzoB,iBAAmBzb,GAAnC,eAA2CkkC,GAAW3rB,UAAY,IAAlE,MAqLGw4B,wBAAyBn8C,EAAW87C,uBAK5C,cAAC,IAAD,CACE5uB,KAAMltB,EAAWy4B,QAAQ92B,MACzBlC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE8O,SAAU,kBAAMnpC,EAAwB,EAAGE,EAAYC,IACvD42B,aAAc,kBAAM/2B,EAAwB,EAAGE,EAAYC,IAC3DwpC,qBAAsBA,EACtBxpB,eAAgByuB,EAASzuB,eACzB0oB,iBAAkB+F,EAAS/F,iBAC3BoB,cAAe,SAACztC,GAAD,OAAcyzC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAASj3B,KACrF8sC,mBAAoB,kBAAM2G,EAAS,CAAEnxC,KAAMywC,MAC3C3qB,sBAAuBgqB,EAAShqB,sBAChC7B,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAW5qB,sBAAwBpa,EAAE2G,OAAO7F,UAG5Di8B,+BAAgCrnC,EAAWqnC,sCAKnD,cAAC,IAAD,CACEna,KAAMltB,EAAWy4B,QAAQ72B,MACzBnC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE0N,aAAc,kBAAM/nC,EAAwB,EAAGE,EAAYC,IAC3D80C,iBAAkB,kBAAMj1C,EAAwB,EAAGE,EAAYC,IAC/D60C,gBAAiB,SAAC1pC,GAAD,OACf2kC,EAAS,CAAEnxC,KAAMywC,GAA8B9b,QAAQ,gBAAI+b,GAAW3rB,UAAYvY,MAEpFyF,cAAe,SAACtC,GAAD,OAAWwhC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAShlB,KAC/EqC,aAAc,SAAChI,GAAD,OAAWmnC,EAAS,CAAEnxC,KAAMywC,GAA4B9b,QAAS3qB,KAC/E+H,cAAe+9B,EAAS/9B,cACxB0jC,cAAe3F,EAAS7nB,iBACxBlD,UAAW+qB,EAAS/qB,UACpBoD,6BAA8B2nB,EAAS3nB,6BACvClE,8BAA+B,SAACvY,GAAD,OAC7BylC,EAAS,CACPnxC,KAAMywC,GACN9b,QAAQ,gBAAI+b,GAAWvoB,6BAA+Bzc,EAAE2G,OAAO7F,UAGnE0wC,gBAAiB97C,EAAW87C,gBAC5BE,oBAAqBh8C,EAAWg8C,2BAKxC,cAAC,IAAD,CACE9uB,KAAMltB,EAAWy4B,QAAQz2B,MACzBvC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACEgR,gBAAiB,kBAAMrrC,EAAwB,EAAGE,EAAYC,IAC9DohC,eAAgBA,EAChB6J,UA1NS,WACrB,IAAMtsC,EAAOoB,EAAW87C,gBAAgBvoC,MAAK,SAAC3U,GAAD,OAAUA,EAAKW,KAAOmvC,EAAS7nB,oBACtE8lB,EACJ/tC,GAAQA,EAAK+1C,YAAcxkB,OAAON,OAAOjxB,EAAK+1C,YAAYphC,MAAK,SAACosB,GAAD,OAAcA,EAASpgC,KAAOmvC,EAAS/qB,aAElGunB,EAAY,CAChB,CACE1wB,UAAW,4BACXE,UAAW9b,GAAQA,EAAKgiC,YAAchiC,EAAKgiC,YAAc,KACzD/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,oBACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,WACXE,UACEg0B,EAASzuB,gBAAkByuB,EAASzuB,eAAe/L,YAAcw6B,EAASzuB,eAAe/L,WAAWrL,OAAS,EACzG6lC,EAASzuB,eAAe/L,WACxB,kBACN2G,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,cAE1E,CACEua,UAAW,kCACXE,UAAWg0B,EAAShqB,sBACpB7J,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,2BAE1E,CACEua,UAAW,qBACXE,UAAWg0B,EAAS3nB,6BAA+B2nB,EAAS3nB,6BAA+B,KAC3FlM,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,0BACxE+xC,mBAAoB,iBAEtB,CACEx3B,UAAW,iBACXE,UAAWg0B,EAAS/9B,cAClB,oBAAIlQ,UAAU,kBAAd,SACGiuC,EAAS/9B,cAAchI,KAAI,SAACgF,EAAM/E,GAAP,OAC1B,6BAAiB+E,EAAKmB,UAAblG,QAIb,cAAC,IAAMhB,SAAP,IAEFiT,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,kBAc5E,OATI0sC,GACFzB,EAAUvJ,OAAO,EAAG,EAAG,CACrBnnB,UAAW,uBACXE,UAAWiyB,GAAWA,EAAQ/L,YAAc+L,EAAQ/L,YAAc,KAClE/lB,gBAAiB,kBAAM/a,EAAwB,EAAGE,EAAYC,EAAU,qBACxE+xC,mBAAoB,kBAIjB9G,EAkKgB+G,GACXvtB,sBAAuB,4BAAI1kB,EAAWi8C,oBAK9C,cAAC,IAAD,CACE/uB,KAAMltB,EAAWy4B,QAAQx2B,aACzBxC,QACE,cAAC,GAAD,6BAA2B06B,KAA3B,aACE,cAAC,GAAD,CACE7S,gBAAiBjpB,EAAMglB,SAASiE,gBAChCzH,gBAAiB,kBAAM5f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmBC,SAC7Ewe,kBAAmB,kBAAM7f,EAASD,EAAWy4B,QAAQh3B,KAAOJ,EAAmB5E,WAC/EkuC,aAAc,kBAAM3qC,EAAW2mC,kBAC/BhnB,cAAe,kBAAM1f,EAASoB,EAAmBG,YACjDupC,eAAgB/qC,EAAWy4B,QAAQh3B,YAK3C,cAAC,IAAD,CACEyrB,KAAM7rB,EAAmBC,OACzB7B,QAAS,cAAC,GAAD,CAAiBk9B,mBAzIL,WACR38B,EAAW2mC,kBAE5BoK,EAA2B,IAG7B9wC,EAASD,EAAWO,SAASP,EAAWyH,kBAqIpC,cAAC,IAAD,CACEylB,KAAI,UAAK7rB,EAAmB5E,SAAxB,MACJgD,QACE,cAAC,GAAD,CACEw6B,yBAxJiB,SAACiY,GAC5BnC,EAAS,CAAEnxC,KAAMywC,GAA2B9b,QAAQ,gBAAI+b,GAAW3E,cAAe,KAG9EtsC,EAAMghB,gBAA+C,IAA9B6yB,EAAShY,kBAClC6W,EAA2BmB,EAAS7uC,QAoJ5Bu0B,uBAAwB,yGACxBD,kBAAmB,kBAAM13B,EAASD,EAAWy4B,QAAQh3B,KAAOzB,EAAWy4B,QAAQx2B,yBCjS9Eq6C,GA1CY,kBACzB,eAAC,IAAD,WACE,cAAC,IAAD,CAAOpvB,KAAK,oBAAoBztB,QAAS,cAAC,GAAD,MAEzC,cAAC,IAAD,CAAOytB,KAAK,gBAAgBztB,QAAS,cAAC,GAAD,MAEpC+tB,GAAUoD,sBAAoBC,qB3HlCP,iB2HmCtB,cAAC,IAAD,CAAO3D,KAAK,aAAaztB,QAAS,cAAC,GAAD,WAChCkI,EAEJ,cAAC,IAAD,CAAOulB,KAAK,oBAAoBztB,QAAS,cAAC,GAAD,MAExC+tB,GAAUoD,sBAAoBC,qB3HvCQ,gC2HwCrC,cAAC,IAAD,CAAO3D,KAAK,+BAA+BztB,QAAS,cAAC,GAAD,WAClDkI,EAEH6lB,GAAUoD,sBAAoBC,qB3HzCS,iC2H0CtC,cAAC,IAAD,CAAO3D,KAAK,gCAAgCztB,QAAS,cAAC,GAAD,WACnDkI,EAEJ,cAAC,IAAD,CAAOulB,KAAK,sBAAsBztB,QAAS,cAAC,GAAD,MAE1C+tB,GAAUoD,sBAAoBC,qB3H7CC,qB2H8C9B,cAAC,IAAD,CAAO3D,KAAK,wBAAwBztB,QAAS,cAAC,GAAD,WAC3CkI,EAEH6lB,GAAUoD,sBAAoBC,qB3HlDA,wB2HmD7B,cAAC,IAAD,CAAO3D,KAAK,qBAAqBztB,QAAS,cAAC,GAAD,WACxCkI,EAEH6lB,GAAUoD,sBAAoBC,qB3HlDE,0B2HmD/B,cAAC,IAAD,CAAO3D,KAAK,0BAA0BztB,QAAS,cAAC,GAAD,WAC7CkI,EAEH6lB,GAAUoD,sBAAoBC,qB3HlDL,mB2HmDxB,cAAC,IAAD,CAAO3D,KAAK,eAAeztB,QAAS,cAAC,GAAD,WAClCkI,EAEJ,cAAC,IAAD,CAAOulB,KAAK,IAAIztB,QAAS,cAAC,GAAD,UCHd88C,GAtDgB,WAC7B,MAAkCv1C,oBAAS,GAA3C,mBAAOgF,EAAP,KAAkBC,EAAlB,KACA,EAAwCjF,qBAAxC,mBAAOw1C,EAAP,KAAqBC,EAArB,KACA,EAA8Cz1C,qBAA9C,mBAAO01C,EAAP,KAAwBC,EAAxB,KAuBA,OApBAv1C,qBAAU,WACR,IAAMw1C,EAAmB,uCAAG,4BAAAx8C,EAAA,+EAEK4tB,IAAsB,GAF3B,UAIM,OAFxBvqB,EAFkB,QAILtG,OAJK,sBAKhBkD,QALgB,OAQxBo8C,EAAgBh5C,EAAemP,KAAKoC,MACpC2nC,EAAmBl5C,EAAemP,KAAKrP,SACvC0I,GAAa,GAVW,kDAYxBA,GAAa,GAZW,0DAAH,qDAgBzB2wC,MACC,IAGD,eAAC,IAAMh1C,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,0BAC1B,eAAC,GAAD,CAAwBtI,UAAU,yBAAlC,UACE,4DAEA,4BAAIi8C,IAEH1wC,GACC,qBAAKvL,UAAU,iDAAf,SACE,6CAIH+7C,GAAgBA,EAAa3zC,OAAS,GACrC,cAAC,GAAD,CACEmM,KAAMwnC,EACNjjC,YAAalY,EAAmB0C,mBAAmBE,aAGvD,cAAC,IAAD,CAAMxD,UAAU,0BAA0B8H,GAAIlH,EAAmBG,UAAjE,uCCxDO,OAA0B,yCCA1B,OAA0B,uCCA1B,OAA0B,2CCA1B,OAA0B,wCCgBnCq7C,GAAyB,kBAAM,qBAAKh+C,IAAKi+C,GAAeh+C,IAAI,+BAC5Di+C,GAAsB,kBAAM,qBAAKl+C,IAAKm+C,GAAYl+C,IAAI,qCACtDm+C,GAAsB,kBAAM,qBAAKp+C,IAAKq+C,GAAYp+C,IAAI,kCAmL7Cq+C,GAjLc,WAC3B,MAAsCn2C,mBAAS,IAA/C,mBAAOgR,EAAP,KAAoBolC,EAApB,KACA,EAA8Bp2C,oBAAS,GAAvC,mBAAOkO,EAAP,KAAgBC,EAAhB,KACA,EAAoDnO,oBAAS,GAA7D,mBAAOq2C,EAAP,KAA2BC,EAA3B,KACQtoC,EAASktB,cAATltB,KAER5N,qBAAU,WACR,IAAMyS,EAAO,uCAAG,8BAAAzZ,EAAA,6DACd+U,GAAW,GADG,SAEQ2C,GAA2B9C,GAFnC,OAERuoC,EAFQ,OAGR3qC,EAAO,YAAI0F,GAAQilC,GAAS,SAAC7kC,GAAD,OAAgBA,EAAWT,KAAKulC,YAC/D70C,KAAI,SAACsJ,GAAD,OAAOA,EAAE,MACbtJ,KAAI,SAACsJ,GAAD,OAAOA,EAAEiG,MAAK,SAAC9X,EAAG+X,GAAJ,OAAU/X,EAAE6X,KAAOE,EAAEF,WACvCC,MAAK,SAAC9X,EAAG+X,GAAJ,OAAU/X,EAAE,GAAG6X,KAAOE,EAAE,GAAGF,QAEnCmlC,EAAexqC,GACfuC,GAAW,GATG,2CAAH,qDAWb0E,MACC,CAAC7E,IAEJ,IAKMyoC,EAAiB,SAAC,GAAoB,IACtCC,EADoBhlC,EAAiB,EAAjBA,WAEpBlN,EAAU,+DAEd,OAAQkN,EAAWilC,WACjB,IAAK,SACHD,EAAYX,GACZvxC,GAAW,sEACX,MACF,IAAK,YACHkyC,EAAYb,GACZrxC,GAAW,yEACX,MACF,IAAK,SACHkyC,EAAYT,GACZzxC,GAAW,sEACX,MACF,QACEkyC,EAAY,kBAAM,+BAAOhlC,EAAWilC,aAIxC,OACE,sBAAKl9C,UAAW+K,EAAS/M,MAAK,UAAKqa,GAA+BJ,EAAWilC,WAA/C,eAA9B,UACE,sBAAMl9C,UAAU,uDAAhB,SAAwEiY,EAAWT,KAAKiB,OAAO,YAC/F,sBAAMzY,UAAU,8DAAhB,SACE,cAACi9C,EAAD,UAMFE,EAAe,SAAC,GAAD,IAAGC,EAAH,EAAGA,MAAH,OACnB,sBAAKp9C,UAAS,uFAAkFo9C,GAAhG,UACE,sBAAKp9C,UAAU,gDAAf,UACE,8DACA,cAAC,GAAD,OAEF,sBAAKA,UAAU,mDAAf,UACE,yDACA,cAAC,GAAD,OAEF,sBAAKA,UAAU,gDAAf,UACE,4DACA,cAAC,GAAD,WAKAq9C,EAA+B,SAAC,GAAD,IAAGD,EAAH,EAAGA,MAAH,OACnC,oBACEp9C,UAAS,uGAAkGo9C,GAD7G,mKAOF,OACE,sBAAKp9C,UAAU,mCAAf,UACGyU,GACC,qBAAKzU,UAAU,iDAAf,SACE,mEAGS,IAAZyU,GACC,qCACE,cAAC4oC,EAAD,CAA8BD,MAAM,WACpC,cAAC,IAAD,CACEp9C,UAAS,UAAKC,IAAc0a,QAAnB,+DACTxa,QAAS,kBAAM08C,GAAuBD,IAFxC,SAGGA,EAAqB,iBAAmB,sBAE3C,cAAC,IAAD,CACE58C,UAAS,UAAKC,IAAc0a,QAAnB,+DACTxa,QA/Ee,WACvBiS,IAAYkrC,WAAW,CAAEv6C,KAAM,yCAC/BnH,OAAO2hD,SA2ED,oBAMwB,IAAvBX,GACC,qCACE,cAACO,EAAD,CAAcC,MAAM,WACpB,sBAAKp9C,UAAU,2CAAf,UAEE,oBAAIoH,MAAO,CAAEo2C,QAAS,QAAtB,qCACCjmC,GACCA,EAAYrP,KAAI,SAAC60C,EAAOU,GAAR,OACd,sBAAKz9C,UAAU,kDAAf,UACE,6BAAK+8C,EAAM,GAAGvlC,KAAKiB,OAAO,cACzBskC,EAAM70C,KAAI,SAAC+P,EAAYylC,GAAb,OACT,8BACE,cAACV,EAAD,CAAgB/kC,WAAYA,KADpBylC,QAHwDD,SAU5E,cAACN,EAAD,CAAcC,MAAM,gBAK5B,cAACC,EAAD,CAA8BD,MAAM,WAEvB,IAAZ3oC,IAA4C,IAAvBmoC,GACpB,mCACGrlC,GACCA,EAAYrP,KAAI,SAAC60C,EAAOU,GAAR,OACd,gCACE,6BACE,iCAASV,EAAM,GAAGvlC,KAAKiB,OAAO,iBAEhC,6BACGskC,EAAM70C,KAAI,SAAC+P,EAAYylC,GAAb,OACT,+BACGzlC,EAAWT,KAAKiB,OAAO,sBAD1B,MACmD,iCAASR,EAAWilC,cAD9DQ,UANLX,EAAM,GAAGvlC,KAAK/F,kBAenB,IAAZgD,GACC,sBAAKzU,UAAU,+CAAf,UACE,yCACA,+BACE,wCACQ,cAAC,IAAD,CAAM8H,GAAInH,EAAV,iEAER,0DAC0B,mBAAGP,KAAK,4CAAR,qCAKhC,sBAAKJ,UAAU,2CAAf,UACE,sBAAKA,UAAU,mDAAf,UACE,4DADF,wFAEyB,mBAAGI,KAAK,yCAAR,yCAFzB,IAE2G,IACzG,mBAAGA,KAAK,+CAAR,mCAHF,QAGwF,IACtF,mBAAGA,KAAK,sCAAR,sCAJF,QAIkF,IAChF,0EAEF,qBAAKJ,UAAU,gDAAf,SACE,qBAAK5B,IAAKu/C,GAAat/C,IAAI,mCC/KtBu/C,GAXa,WAC1B,OACE,eAAC,IAAMz2C,SAAP,WACE,cAAC,EAAD,CAAqBmB,KAAK,2BAC1B,cAAC,GAAD,CAAwBtI,UAAU,yBAAlC,SACE,cAAC,GAAD,UCeO69C,GAfkB,kBAC/B,cAAC,EAAD,UACE,eAAC,IAAD,WACG9wB,GAAUoD,sBAAoBC,qBAAqBvE,KAClD,qCACE,cAAC,IAAD,CAAOY,KAAM7rB,EAAmB0C,mBAAmBC,cAAevE,QAAS,cAAC,GAAD,MAC3E,cAAC,IAAD,CAAOytB,KAAI,UAAK7rB,EAAmB0C,mBAAmBE,WAA3C,UAA+DxE,QAAS,cAAC,GAAD,SAEnF,KAEJ,cAAC,IAAD,CAAOytB,KAAK,IAAIztB,QAAS,cAAC,GAAD,YCoChB8+C,GAlDgB,WAC7B,IAAMC,EAAU7yC,mBAChB,EAAgC3E,mBAAS,CACvCy3C,oBAAqB,GACrBC,0BAA2B,KAF7B,mBAAOhQ,EAAP,KAAiBiQ,EAAjB,KAIA,EAAuBrsB,cAAhBC,EAAP,oBACMtyB,EAAWkH,cA0BjB,OAvBAC,qBAAU,WAER,IAAM/H,EAAOkzB,EAAal1B,IAAI,QACxBuhD,EAAMrsB,EAAal1B,IAAI,OAExBgC,GAASu/C,EAKdD,EAAY,CACVF,oBAAqBG,EACrBF,0BAA2Br/C,IAN3BY,EAASoB,EAAmBG,aAQ7B,IAGH4F,qBAAU,WAC6B,KAAjCsnC,EAAS+P,qBAAqE,KAAvC/P,EAASgQ,2BAClDF,EAAQ5yC,QAAQs5B,WAEjB,CAACwJ,IAGF,uBACEhjC,IAAK8yC,EACLrZ,OAAO,kDACPC,OAAO,OACP7lC,GAAG,6BAJL,UAKE,uBAAOX,KAAK,SAASW,GAAG,sBAAsBiE,KAAK,sBAAsB4H,MAAOsjC,EAAS+P,sBACzF,uBACE7/C,KAAK,SACLW,GAAG,4BACHiE,KAAK,4BACL4H,MAAOsjC,EAASgQ,gCCcT1vB,gBAAW,GAAXA,EAxDuB,SAAC,GAA4E,IAA1EgB,EAAyE,EAAzEA,cAAe4D,EAA0D,EAA1DA,gBAAiBD,EAAyC,EAAzCA,UAAW3oB,EAA8B,EAA9BA,QAASC,EAAqB,EAArBA,OAAQ4kB,EAAa,EAAbA,OAC7FgvB,EAAmB,uCAAG,WAAOt7C,EAASkS,GAAhB,SAAArV,EAAA,sDAC1B4vB,EAAc,OAAQzsB,EAAQyR,MAAM,GACpCgb,EAAc,UAAWzsB,EAAQ2S,cAAc,GAC/C8Z,EAAc,kBAAmBzsB,GAAS,GAC1CysB,EAAc,YAAava,GAJD,2CAAH,wDAOzB,OACE,qCACE,4BtKfJ,yFsKgBI,cAAC,KAAD,UACE,cAAC,GAAD,CACEhV,UAAU,yCACVuK,QAASA,EACTC,OAAQA,EACRwJ,gBAAiBoqC,EACjBnqC,gBAAiB,SAAC9B,GACK,OAAjBA,EAAKF,SAAoBE,EAAKF,QAAQ7J,OAAS,GACjD+qB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAO,GAClCD,EAAU,CAAEphB,SAAU1G,OAEtBmkB,EAAc,gBAAiBpd,EAAKD,QAAQ,GAC5CihB,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAO,KAGtChf,kBAAmB,SAAChW,GAClBg1B,EAAgB,YAAY,GAAM,GAClCA,EAAgB,WAAW,GAAM,GAEpB,aAATh1B,GACF+0B,EAAU,CAAEphB,SAAU1G,KAEX,YAATjN,GACF+0B,EAAU,CAAEphB,SAAU1G,WAKR,IAArBgkB,EAAOpa,WACN,sBAAKhV,UAAU,iCAAf,UACE,wEACA,iHAGkB,IAArBovB,EAAOpa,WAAuBoa,EAAO7a,MAAQ6a,EAAO7a,KAAKnM,OAAS,GACjE,cAAC,GAAD,CACEmM,KAAM6a,EAAO7a,KACbuE,YAAalY,EAAmB+C,eAAeE,0BChC1Cw6C,GAfW,WACxB,OACE,qCACE,cAAC,EAAD,CAAqB/1C,KAAM+P,GAAmB9P,KAAK,6BACnD,cAAC,EAAD,CAAwBvK,MAAOqa,KAC/B,cAAC,GAAD,CAAwBrY,UAAU,yBAAlC,SACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOysB,KAAK,IAAIztB,QAAS,cAAC,GAAD,MACzB,cAAC,IAAD,CAAOytB,KAAI,UAAK7rB,EAAmB+C,eAAeC,SAAvC,UAAyD5E,QAAS,cAAC,GAAD,eCgDxEs/C,GArCI,WACjB,OACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAO7xB,KAAK,IAAIztB,QAAS,cAAC,IAAD,CAAU8I,GAAIusB,EAAKtzB,cAC5C,cAAC,IAAD,CAAO0rB,KAAM4H,EAAKtzB,UAAW/B,QAAS,cAAC,GAAD,MACtC,cAAC,IAAD,CAAOytB,KAAI,UAAK4H,EAAKr3B,aAAagE,KAAvB,MAAiChC,QAAS,cAAC,GAAD,MACrD,cAAC,IAAD,CAAOytB,KAAI,UAAK4H,EAAKjxB,UAAUpC,KAApB,MAA8BhC,QAAS,cAAC,GAAD,MAClD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKv2B,MAAOkB,QAAS,cAAC,GAAD,MACjC+tB,GAAUoD,sBAAoBC,qBvInBV,gBuIoBnB,cAAC,IAAD,CAAO3D,KAAM4H,EAAK5wB,QAAQzC,KAAMhC,QAAS,cAAC,GAAD,MACvC,KACJ,cAAC,IAAD,CAAOytB,KAAI,UAAK4H,EAAKhyB,QAAQrB,KAAlB,MAA4BhC,QAAS,cAAC,GAAD,MAChD,cAAC,IAAD,CAAOytB,KAAM4H,EAAKxzB,OAAQ7B,QAAS,cAAC,GAAD,MACnC,cAAC,IAAD,CAAOytB,KAAI,UAAKhsB,EAAL,MAA2BzB,QAAS,cAAC,GAAD,MAE/C,cAAC,IAAD,CAAOytB,KAAI,UAAK4H,EAAKlxB,QAAQnC,KAAlB,MAA4BhC,QAAS,cAAC,GAAD,CAAiBa,IAAK,wCAKrEktB,GAAUoD,sBAAoBC,qBAAqBxE,KAClD,cAAC,IAAD,CAAOa,KAAI,UAAK/rB,EAAL,MAAiC1B,QAAS,cAAC,GAAD,MACnD,KACJ,cAAC,IAAD,CAAOytB,KAAM4H,EAAK3wB,uBAAwB1E,QAAS,cAAC,GAAD,MAElD+tB,GAAUoD,sBAAoBC,qBAAqBvE,MAClD,cAAC,IAAD,CAAOY,KAAI,UAAK9rB,EAAL,MAA6B3B,QAAS,cAAC,GAAD,MAElD+tB,GAAUoD,sBAAoBC,qBAAqBnE,MAClD,cAAC,IAAD,CAAOQ,KAAK,sBAAsBztB,QAAS,cAAC,GAAD,MAG7C,cAAC,IAAD,CAAOytB,KAAK,IAAIztB,QAAS,cAAC,GAAD,UCDhBu/C,I,OA3CO,SAAC92C,GACrB,IAAQkV,EAA8DlV,EAA9DkV,QAAS6hC,EAAqD/2C,EAArD+2C,OAAQC,EAA6Ch3C,EAA7Cg3C,YAAaC,EAAgCj3C,EAAhCi3C,WAAY1gD,EAAoByJ,EAApBzJ,MAAOsI,EAAamB,EAAbnB,SAUzD,OACE,cAAC,IAAMa,SAAP,UACGq3C,GACC,qBAAKx+C,UAAU,oBAAf,SACE,sBAAKA,UAAU,SAAf,UACE,qBAAKA,UAAU,iBAAf,SACE,6BAAKhC,MAEP,qBAAKgC,UAAU,eAAf,SAA+BsG,IAC/B,gCACE,cAAC,IAAD,CAAiBnG,QAlBP,WACpBwc,GAAQ,IAiB2Cxe,KAAK,SAAS6B,UAAWC,IAAc0a,QAAU,eAA1F,SACG8jC,GAAe,QAElB,cAAC,IAAD,CAAiBt+C,QAjBR,WACnBwc,GAAQ,IAgB0Cxe,KAAK,SAAS6B,UAAU,aAAhE,SACG0+C,GAAc,mBCLhBC,GAxBU,SAACl3C,GACxB,IAAMm3C,EAAgB,UAAMn3C,EAAMo3C,cAAZ,YAAqD,IAAxBp3C,EAAMo3C,cAAsB,SAAW,WAM1F,OAJIp3C,EAAMo3C,cAAgB,IAAsB,IAAjBp3C,EAAM+2C,QACnC/2C,EAAMkV,SAAQ,GAId,eAAC,GAAD,CAAe3e,MAAM,qBAAqBwgD,OAAQ/2C,EAAM+2C,OAAQ7hC,QAASlV,EAAMkV,QAA/E,UACE,oIACsG,IACpG,iCAASiiC,OAEX,0ECzBOE,GAA4B,CACvC9jB,SAAU,CAAC,GAAI,WACfU,UAAW,CAAC,EAAG,WACfR,gBAAiB,CAAC,GAAI,WACtBb,eAAgB,CAAC,QAAS,QAAS,YAAa,WCsMnC0kB,I,OA9KH,WACV,IAAIpjC,EAAUqjC,cACRnjD,EAAWq8B,cACX14B,EAAWkH,cACjB,EAAsDH,oBAAS,GAA/D,mBAAO04C,EAAP,KAA4BC,EAA5B,KACA,EAAoD34C,oBAAS,GAA7D,mBAAO44C,EAAP,KAA2BC,EAA3B,KACA,EAAoD74C,oBAAS,GAA7D,mBAAO84C,EAAP,KAA2BC,EAA3B,KACA,EAA8B/4C,mBAAS,CAAEq0B,aAAa,EAAOikB,eAAgB,IAA7E,mBAAOjlB,EAAP,KAAgB2lB,EAAhB,KAEM1uC,EAAU2uC,IAAW,MAAQC,IACnCpiD,QAAQC,IAAIuT,GAEZ,IAAM6uC,EAAoB,WACxBH,EAAW,CACT3kB,aAAa,EACbikB,eAAgB,KAKdc,EAAuBxuC,sBAAW,sBAAC,4BAAAxR,EAAA,6DAEjCE,EAFiC,UAExB4W,uBAAqBC,MAAM6P,OAFH,kCAGjC1f,cAAYC,QAAQ84C,WAAW//C,GAHE,OAKvCm6B,GAAuB6B,UACvB6jB,IANuC,2CAOtC,IAGGG,EAAuB,SAAChB,GAC5BU,EAAW,CACT3kB,aAAa,EACbikB,cAAeA,KAIb9gC,EAAe5M,uBAAY,WAC/B6oB,GAAuB+B,MACvB2jB,IAEA,IAAM5lB,EAAW,UAAMrjB,uBAAqBC,MAAM6P,OAAjC,uBACjB1f,cAAYC,QAAQmrB,QAAQ6H,GAC5Bt6B,EAASoB,EAAmBC,UAC3B,IAYGi/C,EAAYr3C,mBAChB,kBAAM,WACJ,OAAI42C,EACK,cAAC,GAAD,KAC0B,IAAxBJ,IAAuD,IAAvBE,EAClC,cAAC,GAAD,IAEF,cAAC,GAAD,OAET,CAACE,EAAoBJ,EAAqBE,IAyF5C,OAtFAx4C,qBAAU,WACR,IAAMo5C,EAAa,uCAAG,8BAAApgD,EAAA,sEAGZo6B,EAAiB,CACrBiB,SAAU8jB,GAA0B9jB,SACpCU,UAAWojB,GAA0BpjB,UACrCR,gBAAiB4jB,GAA0B5jB,gBAC3CJ,gBAAiB6kB,EACjBrkB,gBAAiBukB,EACjB5kB,iBAAkBld,EAClBsc,eAAgBykB,GAA0BzkB,gBAE5CL,GAAuBuB,WAAWxB,GAGlC18B,QAAQC,IAAI,8BAA+BnB,aAfzB,SAkBZsa,uBAAqBupC,KAArB,UACD7jD,IACH,gBACAA,aArBgB,cAuBlBiW,IAAY6tC,WAAWtkC,EAASlF,uBAAqBC,MAAMwpC,uBAAwBC,GAvBjE,SAyBZhwB,sBAAoB6vB,KAApB,UACD7jD,+CADC,OAC6CiK,GACjD,aACAjK,gSAAYikD,iCA5BI,OA+Bdv5C,cAAYC,QAAQN,mBACtBwzB,GAAuBwB,QAGzB0jB,GAAuB,GACvBE,GAAsB,GACtBE,EAAsBvyB,GAAUoD,sBAAoBC,qBAAqBpE,OAEhB,IAArDvV,uBAAqBC,MAAM2pC,sBAC7BA,ItMlCJ,kBAAmBpkD,WACrBA,UAAUa,cAAcC,MAAMP,MAAK,SAACQ,GAClCA,EAAaC,gBsMqCLkjD,EAAW,CAAEG,cAAeC,gBAAc3gD,OAEhDwS,IAAYkrC,WAAW,CAAEv6C,KAAM,2BA/Cb,kDAiDdqP,IAAYqM,aAEdrM,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,wDACrB0S,WAAY,CAAE8hB,IAAG,QAGrB8qB,GAAuB,GACvBE,GAAsB,GAzDJ,0DAAH,qDA6DnB,OADAW,IACO,kBAAM/lB,GAAuB8B,YACnC,CAAC/d,EAAc4hC,IAElBh5C,qBAAU,YACmB,IAAvBw4C,GAEFhvB,sBAAoB6vB,KAApB,UACK7jD,+CADL,OACmDiK,GACjD,aACAjK,gSAAYikD,iCAEX5jD,MAAK,kBAAM8iD,EAAsBvyB,GAAUoD,sBAAoBC,qBAAqBpE,SACpF5uB,OAAM,SAACg3B,GACFhiB,IAAYqM,aAEdrM,IAAYC,eAAe,CACzB7F,UAAW,IAAI5M,MAAM,wDACrB0S,WAAY,CAAE8hB,cAKvB,CAACv4B,EAAUsjD,EAAoBphC,EAAc4hC,IAG9C,eAAC,GAAD,WACE,wBAAQ7gD,GAAG,UAAX,SACE,cAAC,GAAD,CAAiBye,SAAUQ,MAE7B,sBAAM/d,UAAU,WAAhB,SACE,cAAC8/C,EAAD,MAEF,iCACE,cAAC,EAAD,MAEF,cAAC,GAAD,CACEtB,OAAQ5kB,EAAQgB,YAChBikB,cAAejlB,EAAQilB,cACvBliC,QAxH8B,SAAChP,IACpB,IAAXA,EACFgyC,IAEA5hC,YCrENkY,IAAS5Z,OACP,cAAC,IAAD,UACE,cAAC,GAAD,MAEFpd,SAASC,eAAe,W","file":"static/js/main.6c51b9af.chunk.js","sourcesContent":["// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n  window.location.hostname === 'localhost' ||\r\n    // [::1] is the IPv6 localhost address.\r\n    window.location.hostname === '[::1]' ||\r\n    // 127.0.0.1/8 is considered localhost for IPv4.\r\n    window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\nexport default function register() {\r\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n    // The URL constructor is available in all browsers that support SW.\r\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n    if (publicUrl.origin !== window.location.origin) {\r\n      // Our service worker won't work if PUBLIC_URL is on a different origin\r\n      // from what our page is served on. This might happen if a CDN is used to\r\n      // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n      return;\r\n    }\r\n\r\n    window.addEventListener('load', () => {\r\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n      if (isLocalhost) {\r\n        // This is running on localhost. Lets check if a service worker still exists or not.\r\n        checkValidServiceWorker(swUrl);\r\n\r\n        // Add some additional logging to localhost, pointing developers to the\r\n        // service worker/PWA documentation.\r\n        navigator.serviceWorker.ready.then(() => {\r\n          console.log(\r\n            'This web app is being served cache-first by a service ' +\r\n              'worker. To learn more, visit https://goo.gl/SC7cgQ'\r\n          );\r\n        });\r\n      } else {\r\n        // Is not local host. Just register service worker\r\n        registerValidSW(swUrl);\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nfunction registerValidSW(swUrl) {\r\n  navigator.serviceWorker\r\n    .register(swUrl)\r\n    .then((registration) => {\r\n      registration.onupdatefound = () => {\r\n        const installingWorker = registration.installing;\r\n        installingWorker.onstatechange = () => {\r\n          if (installingWorker.state === 'installed') {\r\n            if (navigator.serviceWorker.controller) {\r\n              // At this point, the old content will have been purged and\r\n              // the fresh content will have been added to the cache.\r\n              // It's the perfect time to display a \"New content is\r\n              // available; please refresh.\" message in your web app.\r\n              console.log('New content is available; please refresh.');\r\n            } else {\r\n              // At this point, everything has been precached.\r\n              // It's the perfect time to display a\r\n              // \"Content is cached for offline use.\" message.\r\n              console.log('Content is cached for offline use.');\r\n            }\r\n          }\r\n        };\r\n      };\r\n    })\r\n    .catch((error) => {\r\n      console.error('Error during service worker registration:', error);\r\n    });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl) {\r\n  // Check if the service worker can be found. If it can't reload the page.\r\n  fetch(swUrl)\r\n    .then((response) => {\r\n      // Ensure service worker exists, and that we really are getting a JS file.\r\n      if (response.status === 404 || response.headers.get('content-type').indexOf('javascript') === -1) {\r\n        // No service worker found. Probably a different app. Reload the page.\r\n        navigator.serviceWorker.ready.then((registration) => {\r\n          registration.unregister().then(() => {\r\n            window.location.reload();\r\n          });\r\n        });\r\n      } else {\r\n        // Service worker found. Proceed as normal.\r\n        registerValidSW(swUrl);\r\n      }\r\n    })\r\n    .catch(() => {\r\n      console.log('No internet connection found. App is running in offline mode.');\r\n    });\r\n}\r\n\r\nexport function unregister() {\r\n  if ('serviceWorker' in navigator) {\r\n    navigator.serviceWorker.ready.then((registration) => {\r\n      registration.unregister();\r\n    });\r\n  }\r\n}\r\n","export default __webpack_public_path__ + \"static/media/york-logo-reversed.8577f0d2.svg\";","import React from 'react';\r\nimport './cyc-logo-svg.component.scss';\r\nimport logoSVG from '../../../resources/images/york-logo-reversed.svg';\r\nimport logoPNG from '../../../resources/images/york-logo-reversed.png';\r\n\r\nconst CycLogoSvgComponent = () => (\r\n  <picture title=\"City of York Council Home Page\">\r\n    <source srcSet={logoSVG} type=\"image/svg+xml\" />\r\n    <img src={logoPNG} alt=\"Logo: Visit the City of York Council home page\" />\r\n  </picture>\r\n);\r\n\r\nCycLogoSvgComponent.propTypes = {};\r\n\r\nexport default CycLogoSvgComponent;\r\n","export default \"data:image/png;base64,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\"","// This helper file is to have any methods for dom based work\r\n\r\n// Scroll the provided dom node into view\r\nexport const scrollIntoView = (domNode) => {\r\n  domNode.scrollIntoView();\r\n};\r\n\r\nexport const scrollToWindowTop = () => {\r\n  window.scrollTo({ top: 0, left: 0, behavior: 'smooth' });\r\n};\r\n\r\n// Scroll window to a hash found in url or to the top if not found\r\nexport const setInitialPosition = () => {\r\n  const { hash } = window.location;\r\n  if (hash) {\r\n    // Push onto callback queue so it runs after the DOM is updated,\r\n    // this is required when navigating from a different page so that\r\n    // the element is rendered on the page before trying to getElementById.\r\n    setTimeout(() => {\r\n      const id = hash.replace('#', '');\r\n      const element = document.getElementById(id);\r\n      if (element) element.scrollIntoView();\r\n    }, 0);\r\n  } else {\r\n    window.scroll(0, 0);\r\n  }\r\n};\r\n\r\n/**\r\n * Sets current url based on parameters. v6 refers to the react-router-dom version\r\n * @param {number} step - form step number to go to (required)\r\n * @param {object} formConfig - formConfig containing stepUrls (required)\r\n * @param {import(\"react-router-dom\").NavigateFunction} navigate - navigate hook (useNavigate) used for changing URL\r\n * @param {string} id - id to pass to url as a hash (optional)\r\n * @param {boolean} isFormStarted - whether form has started (optional)\r\n * @param {function} setFormStarted - function to update the parent's formStarted state (required if isFormStarted set to true)\r\n */\r\nexport const changeUrlByStepNumberv6 = async (step, formConfig, navigate, id, isFormStarted, setFormStarted) => {\r\n  if (isFormStarted) {\r\n    if (!setFormStarted) throw new Error('setFormStarted is a required parameter when setting isFormStarted to true');\r\n    await setFormStarted(true);\r\n  }\r\n  const url = id ? `${formConfig.stepUrls[step]}#${id}` : formConfig.stepUrls[step];\r\n  navigate(url);\r\n};\r\n","import React from 'react';\r\nimport './footer.component.scss';\r\n\r\nimport CycLogoSvgComponent from '../cyc-logo/cyc-logo-svg.component';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\nimport { scrollToWindowTop } from 'common/helpers/dom.helper';\r\n\r\nconst FooterComponent = () => (\r\n  <div className=\"myaccount-footer\">\r\n    <div className=\"myaccount-footer__feedback\">\r\n      <ButtonComponent\r\n        className={ButtonClasses.secondary}\r\n        onClick={() => (window.location = 'https://www.york.gov.uk/feedback')}>\r\n        Feedback\r\n      </ButtonComponent>\r\n      <ButtonComponent className={ButtonClasses.secondary} onClick={scrollToWindowTop} title=\"Back to top\">\r\n        <span className=\"icon icon-ui-chevron-up\"></span>\r\n      </ButtonComponent>\r\n    </div>\r\n    <div className=\"myaccount-footer__social flex-container\">\r\n      <ul>\r\n        <li>\r\n          <a href=\"https://www.facebook.com/cityofyork\" title=\"Facebook\" rel=\"nofollow\">\r\n            <span className=\"icon icon-social-facebook\"></span>\r\n            <span className=\"hidden\">Facebook</span>\r\n          </a>\r\n        </li>\r\n        <li>\r\n          <a href=\"https://www.youtube.com/user/cityofyorkcouncil\" rel=\"nofollow\">\r\n            <span className=\"icon icon-social-youtube\" title=\"YouTube\"></span>\r\n            <span className=\"hidden\">YouTube</span>\r\n          </a>\r\n        </li>\r\n        <li>\r\n          <a href=\"https://twitter.com/cityofyork\" rel=\"nofollow\">\r\n            <span className=\"icon icon-social-twitter\" title=\"Twitter\"></span>\r\n            <span className=\"hidden\">Twitter</span>\r\n          </a>\r\n        </li>\r\n        <li>\r\n          <a href=\"https://www.instagram.com/cityyorkcouncil\" rel=\"nofollow\">\r\n            <span className=\"icon icon-social-instagram\" title=\"Instagram\"></span>\r\n            <span className=\"hidden\">Instagram</span>\r\n          </a>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n\r\n    <div className=\"flex-container\">\r\n      <div className=\"myaccount-footer-cyc__information\">\r\n        <div>\r\n          <ul>\r\n            <li>\r\n              <a href=\"https://www.york.gov.uk/ContactUs\">Contact us</a>\r\n            </li>\r\n            <li>\r\n              <a href=\"https:////www.york.gov.uk/privacy\">Privacy</a>\r\n            </li>\r\n            <li>\r\n              <a href=\"https://www.york.gov.uk/terms\">Terms and conditions</a>\r\n            </li>\r\n            <li>\r\n              <a href=\"https://www.york.gov.uk/security\">Security</a>\r\n            </li>\r\n            <li>\r\n              <a href=\"https://www.york.gov.uk/accessibility\">Accessibility</a>\r\n            </li>\r\n          </ul>\r\n          <p>Copyright &copy; {new Date().getFullYear()} City of York Council.</p>\r\n        </div>\r\n        <div className=\"myaccount-footer-cyc__information__cyc-logo-wrapper\">\r\n          <a href=\"https://york.gov.uk\">\r\n            <div className=\"myaccount-footer-cyc__information__cyc-logo\">\r\n              <CycLogoSvgComponent color=\"cyc-logo-white-background\" />\r\n            </div>\r\n          </a>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n);\r\n\r\nexport default FooterComponent;\r\n","export const incidentFormRoot = '/form';\r\nexport const refuseAndRecyclingRoot = '/refuse-and-recycling';\r\nexport const binCollectionsRoot = '/bin-collections';\r\n\r\n// URL's for the My Account App\r\nexport const clientMyAccountUrl = {\r\n  signIn: '/sign-in',\r\n  register: '/register',\r\n  signInSuccessful: '/sign-in-successful',\r\n  dashboard: '/dashboard',\r\n  registration: {\r\n    root: '/register',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    successful: '/successful',\r\n    emailConfirmation: '/confirmation',\r\n  },\r\n  streetLighting: {\r\n    root: incidentFormRoot + '/street-lighting',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    step4: '/step-four',\r\n    confirmation: '/confirmation',\r\n  },\r\n  streetCleaning: {\r\n    root: incidentFormRoot + '/street-cleaning',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n  },\r\n  missingAssets: {\r\n    root: incidentFormRoot + '/missing-assets',\r\n    streetLighting: '/street-lighting',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    confirmation: '/confirmation',\r\n  },\r\n  flyTipping: {\r\n    root: incidentFormRoot + '/fly-tipping',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n  },\r\n  graffiti: {\r\n    root: incidentFormRoot + '/graffiti',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n    signIn: '/sign-in',\r\n    register: '/register',\r\n  },\r\n  roadAndPavementProblems: {\r\n    root: incidentFormRoot + '/road-and-pavement-problems',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n  },\r\n  saltBinProblems: {\r\n    root: incidentFormRoot + '/salt-bin-problems',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n  },\r\n  dogAndLitterBin: {\r\n    root: incidentFormRoot + '/dog-and-litter-bins',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    confirmation: '/confirmation',\r\n  },\r\n  waterAndDrainageProblems: {\r\n    root: incidentFormRoot + '/water-and-drainage-problems',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    step4: '/step-four',\r\n    step5: '/step-five',\r\n    confirmation: '/confirmation',\r\n  },\r\n  streetFurniture: {\r\n    root: incidentFormRoot + '/street-furniture',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    step4: '/step-four',\r\n    confirmation: '/confirmation',\r\n  },\r\n  roadAndStreetSign: {\r\n    root: incidentFormRoot + '/road-and-street-sign',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    step4: '/step-four',\r\n    confirmation: '/confirmation',\r\n  },\r\n  vegetation: {\r\n    root: incidentFormRoot + '/vegetation',\r\n    step1: '/step-one',\r\n    step2: '/step-two',\r\n    step3: '/step-three',\r\n    step4: '/step-four',\r\n    confirmation: '/confirmation',\r\n  },\r\n  account: {\r\n    root: '/account',\r\n    password: {\r\n      change: '/change-password',\r\n      changeSuccessful: '/change-password-successful',\r\n      forgot: '/forgot-password',\r\n      emailSent: '/forgot-password-email-sent',\r\n      reset: '/reset-password',\r\n    },\r\n    email: {\r\n      change: '/change-email',\r\n      confirmation: '/change-email-confirmation',\r\n      successful: '/change-email-successful',\r\n    },\r\n    phone: {\r\n      change: '/change-phone',\r\n    },\r\n    address: {\r\n      change: '/change-address',\r\n      successful: '/change-address-successful',\r\n    },\r\n    name: {\r\n      change: '/change-name',\r\n      confirmation: '/change-name-confirmation',\r\n    },\r\n    contactDetails: '/contact-details',\r\n    communicationPreferences: '/communication-preferences',\r\n  },\r\n  home: '/dashboard',\r\n  webchat: {\r\n    root: '/webchat',\r\n    signIn: '/signin',\r\n    register: '/signin/register',\r\n  },\r\n  myReports: {\r\n    root: '/my-reports',\r\n    details: '/details',\r\n  },\r\n  refuseAndRecycling: {\r\n    myCollections: refuseAndRecyclingRoot + '/my-collection-details',\r\n    myCalendar: refuseAndRecyclingRoot + '/my-collection-calender',\r\n  },\r\n  testing: {\r\n    root: '/testing',\r\n  },\r\n  error: '/error',\r\n  parkingPortalErrorPage: '/parking-portal-error',\r\n  binCollections: {\r\n    root: binCollectionsRoot,\r\n    calendar: '/calendar',\r\n    calendarWithRoute: binCollectionsRoot + '/calendar',\r\n  },\r\n};\r\n\r\n// Url for the main york website\r\nexport const yorkMainWebsiteUrl = {\r\n  root: 'https://www.york.gov.uk/',\r\n  feedback: 'https://www.york.gov.uk/feedback',\r\n  customerContactCentre: 'https://www.york.gov.uk/form/yorkcustomercentre',\r\n  councilServices: 'https://www.york.gov.uk/CouncilServices',\r\n  siteSearchQuery: 'https://www.york.gov.uk/site-search/results/?q=',\r\n};\r\n\r\nexport const oracleServiceCloudWebChatUrls = {\r\n  FORM_SUBMIT_URL: '/app/chat/chat_landing',\r\n};\r\n\r\nconst getIncidents = '/api/incident/getIncidents';\r\n\r\nexport const apiSettingName = 'apiUrl';\r\n\r\nexport const apiMyAccountUrl = {\r\n  REGISTER: '/api/Account/Register',\r\n  ACCOUNT: '/api/Account',\r\n  ACCOUNT_LOGIN: '/api/Account/Login',\r\n  ACCOUNT_LOGOUT: '/api/Account/Logout',\r\n  ACCOUNT_FORGOT_PASSWORD: '/api/Account/ForgotPassword',\r\n  ACCOUNT_RESET_PASSWORD: '/api/Account/ResetPassword',\r\n  MANAGE_CHANGE_PASSWORD: '/api/Manage/ChangePassword',\r\n  GET_CONTACT_DETAIL: '/api/Manage/GetDetail',\r\n  GET_PRIMARY_ADDRESS: '/api/Manage/GetPrimaryAddress',\r\n  UPDATE_CONTACT_PREFERENCES: '/api/Manage/UpdateContactPreferences',\r\n  UPDATE_CONTACT_EMAIL_ADDRESS: '/api/Manage/UpdateEmailAddress',\r\n  UPDATE_CONTACT_PROFILE: '/api/Manage/UpdateProfile',\r\n  UPDATE_CONTACT_ADDRESS: '/api/Manage/ChangeAddress',\r\n  UPDATE_CONTACT_PHONE: '/api/Manage/ChangePhone',\r\n  UPDATE_CONTACT_NAME: '/api/Manage/ChangeName',\r\n  CONFIRM_UPDATE_CONTACT_EMAIL_ADDRESS: 'api/Manage/ConfirmUpdateEmailAddress',\r\n  INCIDENTS: '/api/Incident',\r\n  CUSTOMER_INCIDENTS: '/api/Incident/getIncidentsForCurrentCustomer',\r\n  GET_INCIDENT_DETAILS: '/api/Incident/GetIncidentDetails',\r\n  UPDATE_INCIDENT: '/api/Incident/UpdateIncident',\r\n  GET_INCIDENTS_BY_ASSET_ID: '/api/Incident/getLiveIncidentsByAssetId',\r\n  getIncidents: {\r\n    LIGHTING_INCIDENTS: getIncidents + '/Street%20Lighting',\r\n    STREET_CLEANING_INCIDENTS: getIncidents + '/Street%20Cleaning',\r\n    FLY_TIPPING_INCIDENTS: getIncidents + '/Fly-tipping',\r\n    GRAFFITI: getIncidents + '/Graffiti',\r\n    ROAD_AND_PAVEMENT_PROBLEMS: getIncidents + '/Road%20and%20Pavement%20problems',\r\n    SALT_BIN_PROBLEMS: getIncidents + '/Salt%20Bins',\r\n    DOG_AND_LITTER_BINS: getIncidents + '/Dog%2Flitter%20bins',\r\n    WATER_AND_DRAINAGE_PROBLEMS: getIncidents + '/Water%20and%20drainage%20problem',\r\n    STREET_FURNITURE: getIncidents + '/Street%20Furniture%20problem',\r\n    ROAD_AND_STREET_SIGN: getIncidents + '/Sign%20problem',\r\n    VEGETATION: getIncidents + '/Vegetation',\r\n  },\r\n  GET_PARKING_VALIDATION_DATA: '/api/Wsp/GetWspDataForUser',\r\n  GET_PARKING_CUSTOMER_DETAILS: '/api/Wsp/GetCustomerDetails',\r\n};\r\n\r\nexport const cycConfigurationUrls = {\r\n  configuration: '/Configuration',\r\n  features: '/FeatureFlags',\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { clientMyAccountUrl } from '../../constants/my-account-urls.constants';\r\n\r\nconst WithAuthentication = ({ children }) => {\r\n  const [isAuthenticated, setIsAuthenticated] = useState(false);\r\n  const navigate = useNavigate();\r\n  useEffect(() => {\r\n    const authenticated = CYCServices.JWTAuth.isAuthenticated();\r\n    setIsAuthenticated(authenticated);\r\n    if (authenticated === false) {\r\n      navigate(clientMyAccountUrl.signIn);\r\n    }\r\n  }, []);\r\n\r\n  if (isAuthenticated === true) return children;\r\n  return <></>;\r\n};\r\n\r\nexport default WithAuthentication;\r\n","import React from 'react';\r\nimport './progress-bar.component.scss';\r\n\r\nconst ProgressBarComponent = ({ totalSteps, currentStep }) =>\r\n  currentStep === 0 ||\r\n  currentStep === null ||\r\n  totalSteps === 0 ||\r\n  totalSteps === null ||\r\n  currentStep === undefined ||\r\n  totalSteps === undefined ? (\r\n    <React.Fragment />\r\n  ) : (\r\n    <React.Fragment>\r\n      <div className=\"progress-bar\">\r\n        <div className=\"progress-bar__filler\" style={{ width: (currentStep * 100) / totalSteps + '%' }}></div>\r\n      </div>\r\n      <p>\r\n        Page <b>{currentStep}</b> of <b>{totalSteps}</b>. You are <b>{Math.floor((currentStep * 100) / totalSteps)}%</b>{' '}\r\n        complete.\r\n      </p>\r\n    </React.Fragment>\r\n  );\r\n\r\nexport default ProgressBarComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { clientMyAccountUrl } from '../../constants/my-account-urls.constants';\r\n\r\nimport './site-breadcrumbs.component.scss';\r\n\r\n/**\r\n * @param {Array} breadcrumbs - Array of objects {url, name}\r\n */\r\nconst SiteBreadcrumbsComponent = (props) => {\r\n  const hasBreadcrumbs = props.breadcrumbs !== undefined;\r\n\r\n  // Breadcrumb with a link\r\n  const LinkBreadcrumb = ({ crumb }) => (\r\n    <Link className=\"breadcrumb__list__item--link\" to={crumb.url}>\r\n      <span>{crumb.name}</span>\r\n    </Link>\r\n  );\r\n\r\n  // Breadcrumb without a link\r\n  const NonLinkBreadcrumb = ({ crumb }) => <span>{crumb.name}</span>;\r\n\r\n  const ListItemBreadcrumb = ({ children }) => {\r\n    return <li className=\"breadcrumb__list__item\">{children}</li>;\r\n  };\r\n\r\n  // Iterate through crumbs and return list item and links\r\n  const Breadcrumbs = ({ breadcrumbs }) => (\r\n    <>\r\n      {breadcrumbs.map((crumb, index) => {\r\n        // The last breadcrumb will only be a span and not clickable\r\n        if (index + 1 !== breadcrumbs.length) {\r\n          return (\r\n            <ListItemBreadcrumb key={index}>\r\n              <LinkBreadcrumb crumb={crumb} />\r\n            </ListItemBreadcrumb>\r\n          );\r\n        }\r\n        return (\r\n          <ListItemBreadcrumb key={index}>\r\n            <NonLinkBreadcrumb crumb={crumb} />\r\n          </ListItemBreadcrumb>\r\n        );\r\n      })}\r\n    </>\r\n  );\r\n\r\n  // This is what renders the breadcrumbs to the UI\r\n  // Home and My Account are preset as they always exist\r\n  return (\r\n    <nav className=\"breadcrumb\" aria-label=\"Breadcrumb Navigation\">\r\n      <ol className=\"breadcrumb__list\">\r\n        <li className=\"breadcrumb__list__item\">\r\n          <a className=\"breadcrumb__list__item--link\" rel=\"home\" href=\"https://york.gov.uk\">\r\n            <span>Home</span>\r\n          </a>\r\n        </li>\r\n        <li className=\"breadcrumb__list__item\">\r\n          {props.breadcrumbs === undefined ? (\r\n            <NonLinkBreadcrumb crumb={{ name: 'My Account' }} />\r\n          ) : (\r\n            <LinkBreadcrumb crumb={{ url: clientMyAccountUrl.dashboard, name: 'My Account' }} />\r\n          )}\r\n        </li>\r\n\r\n        {hasBreadcrumbs === true && <Breadcrumbs breadcrumbs={props.breadcrumbs} />}\r\n      </ol>\r\n    </nav>\r\n  );\r\n};\r\n\r\nSiteBreadcrumbsComponent.propTypes = {\r\n  breadcrumbs: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      url: PropTypes.string,\r\n      name: PropTypes.string,\r\n    })\r\n  ),\r\n};\r\n\r\nexport default SiteBreadcrumbsComponent;\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport './page-header.component.scss';\r\nimport SiteBreadcrumbsComponent from '../route-handlers/site-breadcrumbs.component';\r\n\r\nconst PageHeaderComponent = ({ text, icon, breadcrumbs }) => {\r\n  const passableCrumbs = useMemo(() => {\r\n    if (breadcrumbs !== undefined) {\r\n      return breadcrumbs;\r\n    }\r\n    // Check if the alternative is already My Account, ignore it as it already exists\r\n    if (breadcrumbs === undefined && text === 'My Account') {\r\n      return undefined;\r\n    }\r\n    return [{ url: '', name: text }];\r\n  }, [breadcrumbs, text]);\r\n\r\n  const Icon = ({ icon }) => (icon !== undefined ? <i className={icon + ' icon-large'} /> : null);\r\n\r\n  return (\r\n    <div className=\"page-header\">\r\n      <div className=\"flex-container\">\r\n        <div className=\"page-header__content\">\r\n          {/* Display icon to the left if there is one */}\r\n          <Icon icon={icon} />\r\n\r\n          {/* Main header content are */}\r\n          {/* Title */}\r\n          <div className=\"page-header__search\">\r\n            <h1 className=\"text-left\" data-testid=\"PageHeaderComponentH1\">\r\n              {text}\r\n            </h1>\r\n            <SiteBreadcrumbsComponent breadcrumbs={passableCrumbs} />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nPageHeaderComponent.propTypes = {\r\n  text: PropTypes.string.isRequired,\r\n  icon: PropTypes.string,\r\n  breadcrumbs: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      url: PropTypes.string,\r\n      name: PropTypes.string.isRequired,\r\n    })\r\n  ),\r\n};\r\n\r\nexport default PageHeaderComponent;\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst DocumentTitleComponent = ({ title, children }) => {\r\n  useEffect(() => {\r\n    if (title) {\r\n      document.title = title;\r\n    }\r\n    return () => (document.title = 'My Account');\r\n  });\r\n\r\n  return <>{children}</>;\r\n};\r\n\r\nDocumentTitleComponent.propTypes = {\r\n  title: PropTypes.string.isRequired,\r\n  children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),\r\n};\r\n\r\nexport default DocumentTitleComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport './accordion.component.scss';\r\n\r\nconst AccordionComponent = ({ title, onClick, expand, children }) => (\r\n  <div className=\"accordion\">\r\n    <h2 onClick={() => onClick(title)}>\r\n      {title}\r\n      <span\r\n        title=\"Open or close\"\r\n        className={expand === true ? 'icon-arrow-down accordion__icon-arrow-down--upside-down' : 'icon-arrow-down'}></span>\r\n    </h2>\r\n    <div className={expand === true ? 'accordion__content accordion__content--active' : 'accordion__content'}>\r\n      {children}\r\n    </div>\r\n  </div>\r\n);\r\n\r\nAccordionComponent.propTypes = {\r\n  title: PropTypes.string.isRequired,\r\n  onClick: PropTypes.func,\r\n  expand: PropTypes.bool,\r\n};\r\n\r\nexport default AccordionComponent;\r\n","import { Children, cloneElement, useEffect, useState } from 'react';\r\n\r\nimport './accordion-collection.component.scss';\r\n\r\nconst AccordionCollectionComponent = ({ children, singleExpandMode }) => {\r\n  // store array of bool values for which accordions are expanded (this is an array in same order as the children prop)\r\n  const [expanded, setExpanded] = useState(Children.toArray().map(() => false));\r\n\r\n  useEffect(() => {\r\n    setExpanded(Children.toArray().map(() => false));\r\n  }, [children, singleExpandMode]);\r\n\r\n  // Toggle the expand flag on the clicked accordion\r\n  const handleClick = (e) => {\r\n    // Clone for immutability\r\n    const newExpanded = [...expanded];\r\n    // If we can only have one accordion expanded, set all expanded values to false\r\n    singleExpandMode === true && newExpanded.fill(false);\r\n    // Now, toggle the one we clicked on\r\n    newExpanded[e] = !expanded[e];\r\n\r\n    setExpanded(newExpanded);\r\n  };\r\n\r\n  return (\r\n    <div className=\"accordion-collection\">\r\n      {Children.toArray(children).map((child, index) =>\r\n        cloneElement(child, { onClick: () => handleClick(index), expand: expanded[index] })\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default AccordionCollectionComponent;\r\n","import React from 'react';\r\n\r\n/**\r\n * A component to render an alert message\r\n *\r\n * props\r\n * @param {Array} children - Array of react elements to render\r\n */\r\nconst AlertMessageComponent = ({ children }) => {\r\n  return <div className=\"alert-message\">{children}</div>;\r\n};\r\n\r\nexport default AlertMessageComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ErrorLabelHandlerComponent } from '../..';\r\nimport { RadiobuttonInputComponent, InputErrorComponent } from 'cyc-react-ui-components';\r\n\r\n/**\r\n * A radio list component\r\n *\r\n * props\r\n * @param {bool} touched - Whether the item has been touched in a form context\r\n * @param {array} errors - Array of errors for the form\r\n * @param {string} question - The question text\r\n * @param {object} radioOptions - An array of possible answers in the format { id, value }\r\n * @param {number} submitCount - Keeps track on the form being submitted\r\n * @param {function} handleChange - Callback when the selected option is changed\r\n *\r\n */\r\nconst RadioList = (props) => {\r\n  const { question, id, radioOptions, onChange, selectedItem, touched, errors, submitCount } = props;\r\n\r\n  return (\r\n    <div className=\"row\" id={id}>\r\n      <span>\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text={question}\r\n          tag=\"p\"\r\n          id={id}\r\n          submitCount={submitCount}\r\n        />\r\n        <RadiobuttonInputComponent\r\n          name={id}\r\n          value={selectedItem}\r\n          onChange={onChange}\r\n          options={radioOptions.map((options) => ({\r\n            label: options.value,\r\n            value: options.id,\r\n          }))}\r\n          error={errors[id] && touched[id]}\r\n        />\r\n        {errors[id] && touched[id] && <InputErrorComponent>{errors[id]}</InputErrorComponent>}\r\n      </span>\r\n    </div>\r\n  );\r\n};\r\nRadioList.propTypes = {\r\n  question: PropTypes.string.isRequired,\r\n  id: PropTypes.string.isRequired,\r\n  radioOptions: PropTypes.array.isRequired,\r\n  onChange: PropTypes.func.isRequired,\r\n  selectedItem: PropTypes.string,\r\n  touched: PropTypes.object,\r\n  errors: PropTypes.object,\r\n  submitCount: PropTypes.number.isRequired,\r\n};\r\n\r\nexport default RadioList;\r\n","import React, { useMemo } from 'react';\r\n\r\nimport './my-account-page.component.scss';\r\n\r\nconst MyAccountPageComponent = ({ children, className }) => {\r\n  const classes = useMemo(\r\n    () => (className === undefined ? 'cyc-page flex-container' : `cyc-page flex-container ${className}`),\r\n    [className]\r\n  );\r\n  return (\r\n    <div className={classes}>\r\n      <div>{children}</div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default MyAccountPageComponent;\r\n","import { useRef, useEffect } from 'react';\r\n\r\nconst usePrevious = (value) => {\r\n  const ref = useRef();\r\n  useEffect(() => {\r\n    ref.current = value;\r\n  });\r\n  return ref.current;\r\n};\r\n\r\nexport default usePrevious;","export const msgConstants = {\r\n  SIGNIN_INVALID:\r\n    'Incorrect email or password, or your account has not been confirmed. Please try again or click Forgot password to reset it.',\r\n  SIGNIN_FAIL: 'Something has gone wrong, please try again',\r\n  SIGNIN_EMAIL_NOT_CONFIRM: 'You need to confirm your account in order to sign in, please check your email',\r\n  ERROR_BOX_HEADER: 'Please check the required details are completed',\r\n  NETWORK_ERROR: 'There has been a network error, please try again', // Error if the server cannot be reached\r\n  GENERIC_API_ERROR: 'Whoops! There has been a problem, please try again.', // Error used if server fails to complete request,\r\n  REPORT_FAIL: 'Unable to retrieve report details, please try again.',\r\n  SELECT_ADDRESS_MESSAGE: 'Please select an address from the list.',\r\n  NO_POSTCODE_MESSAGE: \"Please supply details for 'Postcode'.\",\r\n  INVALID_POSTCODE_MESSAGE: \"'Postcode' - Error: This does not appear to be a valid postcode. Please re-enter.\",\r\n  PASSWORD_COMPLICATED_MESSAGE:\r\n    \"'Password' - Error: Password must be at least 8 characters and contain at least 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.\",\r\n  NEW_PASSWORD_COMPLICATED_MESSAGE:\r\n    \"'New password' - Error: Password must be at least 8 characters and contain at least 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.\",\r\n  PASSWORD_SIMPLE_MESSAGE: \"'Password' - Error: this password does not appear to be valid. Please re-enter.\",\r\n  CHARACTER_LIMIT_EXCEEDED_ERROR:\r\n    'You have exceeded the maximum amount of characters. Please reduce the text and try again',\r\n  PLEASE_SELECT_A_LOCATION: 'Please select a location on the map.',\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nimport './network-loader.component.scss';\r\nimport { msgConstants } from '../../constants/msg.constants';\r\n\r\nconst NetworkLoaderComponent = ({ children, request, ...props }) => {\r\n  const [isLoading, setIsLoading] = useState(true);\r\n  const [hasError, setHasError] = useState(false);\r\n\r\n  const previousIsLoading = usePrevious(isLoading);\r\n  const previousRequest = usePrevious(request);\r\n\r\n  useEffect(() => {\r\n    if (previousIsLoading === false && previousRequest !== request) {\r\n      setIsLoading(true);\r\n    }\r\n    request\r\n      .then(() => {\r\n        setIsLoading(false);\r\n        setHasError(false);\r\n      })\r\n      .catch(() => {\r\n        setIsLoading(false);\r\n        setHasError(true);\r\n      });\r\n  }, [request, previousIsLoading, previousRequest]);\r\n\r\n  return (\r\n    <React.Fragment>\r\n      {isLoading && (\r\n        <div className=\"network-loader cyc-box network-loader--loading\">\r\n          <i>Loading...</i>\r\n        </div>\r\n      )}\r\n      {hasError && (\r\n        <div className=\"network-loader cyc-box network-loader--error\">\r\n          {props.errorMessage !== undefined ? props.errorMessage : msgConstants.GENERIC_API_ERROR}\r\n        </div>\r\n      )}\r\n      {isLoading === false && hasError === false && children}\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nNetworkLoaderComponent.propTypes = {\r\n  request: PropTypes.object.isRequired,\r\n  children: PropTypes.any,\r\n};\r\n\r\nexport default NetworkLoaderComponent;\r\n","export const fileInputConstants = {\r\n  helpText: {\r\n    noFiles: 'Help: If you have photos of the problem upload them here (.png or .jpg)',\r\n    withFiles: 'Help: If you would like to change your photo/s, upload them here (.png or .jpg)',\r\n  },\r\n  errorMessages: {\r\n    invalidFileType: 'Cannot add this file. The selected file must be a JPG or PNG',\r\n    exceedUploadSizeLimit: 'Cannot add this file. The selected file must be smaller than 20MB',\r\n    exceedUploadCountLimit: 'Cannot add this file. You may only upload 5 images',\r\n    exceedFileNameCharacterLimit:\r\n      'This file has a long name which will be shortened down to 100 characters when it is saved.',\r\n    fileEmpty: 'Cannot add this file. The selected file is empty',\r\n    exception: 'Cannot add this file. The selected file could not be uploaded – try again',\r\n    fileReplaced: 'This file has been replaced by another file that contains the same content.',\r\n    duplicateFile: 'This file could not be uploaded as it contains the same content as another file.',\r\n  },\r\n  maxFileUploadCount: 5,\r\n  maxFileUploadSize: 20971520,\r\n  maxFileNameCharacters: 100,\r\n  acceptedFileTypes: [\r\n    {\r\n      mediaType: 'image/jpg',\r\n      suffix: '.jpg',\r\n    },\r\n    {\r\n      mediaType: 'image/jpeg',\r\n      suffix: '.jpeg',\r\n    },\r\n    {\r\n      mediaType: 'image/png',\r\n      suffix: '.png',\r\n    },\r\n  ],\r\n};\r\n","export const getBase64 = async (file) => {\r\n  return new Promise((resolve, reject) => {\r\n    const reader = new FileReader();\r\n    reader.readAsDataURL(file);\r\n    reader.onload = () => {\r\n      let encoded = reader.result.replace(/^.*;base64,/, '');\r\n      resolve(encoded);\r\n    };\r\n    reader.onerror = (error) => reject(error);\r\n  });\r\n};\r\n\r\nexport const prepareFilesForSubmission = async (files) => {\r\n  let convertedFiles = [];\r\n\r\n  const getFile = async (item) => {\r\n    const content = await getBase64(item);\r\n    const fileInput = {\r\n      fileType: item.type,\r\n      fileName: item.name,\r\n      fileContent: content,\r\n    };\r\n    convertedFiles.push(fileInput);\r\n  };\r\n  await Promise.all(files.map(async (item) => getFile(item)));\r\n  return convertedFiles;\r\n};\r\n\r\n/**\r\n * Shortens a file name to less than x amount\r\n * @param {File} file\r\n * @param {number} maxLength\r\n * @returns new File([])\r\n */\r\nexport const truncateFileNameString = (file, maxLength) => {\r\n  if (file.name.length > maxLength) {\r\n    const fileExtension = file.name.split('.').pop();\r\n    const newFileName = file.name.substring(0, maxLength - (fileExtension.length + 1));\r\n\r\n    let blob = new Blob([file], { type: file.type });\r\n    blob.lastModifiedDate = new Date();\r\n    blob.name = newFileName + '.' + fileExtension;\r\n\r\n    return blob;\r\n  }\r\n  return file;\r\n};\r\n\r\n/**\r\n * Takes 2 arrays of base64, returns an array containing 3 arrays\r\n * One with the files to add, one with files to remove and one with files that would not be added\r\n * Preference is given to newly selected files and those higher in the list\r\n * @param {Array} currentlySelectedFiles\r\n * @param {Array} newlySelectedFiles\r\n * @returns {Array}\r\n */\r\nexport const generateFileArraysForUpload = (currentlySelectedFiles, newlySelectedFiles) => {\r\n  let filesToUpload = [];\r\n  let filesToRemove = [];\r\n  let filesToNotUpload = [];\r\n\r\n  // As a potentially quick filter we will get an array of lengths\r\n  const newlySelectedFilesLengths = newlySelectedFiles.map((file) => file.fileContent.length);\r\n  const currentlySelectedFilesLengths = currentlySelectedFiles.map((file) => file.fileContent.length);\r\n\r\n  const combinedLengthsArray = [...newlySelectedFilesLengths, ...currentlySelectedFilesLengths];\r\n  const distinctCombinedLengths = [...new Set(combinedLengthsArray)];\r\n\r\n  if (distinctCombinedLengths.length === combinedLengthsArray.length) {\r\n    return [newlySelectedFiles, [], []];\r\n  }\r\n\r\n  // If this wasn't the case then we are going to have to compare the files themselves\r\n\r\n  // First we will compare the new files with themselves\r\n  for (let index = 0; index < newlySelectedFiles.length; index++) {\r\n    const file = newlySelectedFiles[index];\r\n\r\n    // First look for it in the files to add\r\n    if (filesToUpload.map((file) => file.fileContent).includes(file.fileContent)) {\r\n      filesToNotUpload.push(file);\r\n      continue;\r\n    }\r\n\r\n    // Next check if it is in the uploaded files\r\n    // If it isn't add it to the file to upload\r\n\r\n    // Find the indexes of this file in the currently uploaded files\r\n    const indexesOfMatchingFilesInUploaded = [];\r\n    for (let i = 0; i < currentlySelectedFiles.length; i++) {\r\n      if (currentlySelectedFiles.map((file) => file.fileContent)[i] === file.fileContent) {\r\n        indexesOfMatchingFilesInUploaded.push(i);\r\n      }\r\n    }\r\n\r\n    // Not found therefore just upload\r\n    if (indexesOfMatchingFilesInUploaded.length === 0) {\r\n      filesToUpload.push(file);\r\n      continue;\r\n    }\r\n    // Found examples therefore we must upload it and then remove the current file\r\n    else {\r\n      filesToUpload.push(file);\r\n      indexesOfMatchingFilesInUploaded.forEach((index) => {\r\n        filesToRemove.push(currentlySelectedFiles[index]);\r\n      });\r\n      continue;\r\n    }\r\n  }\r\n\r\n  return [filesToUpload, filesToRemove, filesToNotUpload];\r\n};\r\n","import React, { useState, useRef, useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { HelpTextComponent } from 'cyc-react-ui-components';\r\n\r\nimport { fileInputConstants } from '../../constants/file-input-component.constants';\r\nimport './file-input.component.scss';\r\n\r\nimport {\r\n  prepareFilesForSubmission,\r\n  truncateFileNameString,\r\n  generateFileArraysForUpload,\r\n} from '../../services/file-utilities.service';\r\n\r\nconst FileInputComponent = ({ uploadedFiles, onRemoveFile, onUploadFiles, ...props }) => {\r\n  const [errorMessages, setErrorMessages] = useState([]);\r\n  const inputRef = useRef(null);\r\n\r\n  // Properties that can either be passed in through props or are set to default from the constansts file\r\n  const helpText = useMemo(\r\n    () => (props.helpText !== undefined ? props.helpText : fileInputConstants.helpText),\r\n    [props.helpText]\r\n  );\r\n  const maxFileUploadCount = useMemo(\r\n    () => (props.maxFileUploadCount !== undefined ? props.maxFileUploadCount : fileInputConstants.maxFileUploadCount),\r\n    [props.maxFileUploadCount]\r\n  );\r\n  const maxFileUploadSize = useMemo(\r\n    () => (props.maxFileUploadSize !== undefined ? props.maxFileUploadSize : fileInputConstants.maxFileUploadSize),\r\n    [props.maxFileUploadSize]\r\n  );\r\n  const maxFileNameCharacters = useMemo(\r\n    () =>\r\n      props.maxFileNameCharacters !== undefined\r\n        ? props.maxFileNameCharacters\r\n        : fileInputConstants.maxFileNameCharacters,\r\n    [props.maxFileNameCharacters]\r\n  );\r\n  const acceptedFileTypes = useMemo(\r\n    () => (props.acceptedFileTypes !== undefined ? props.acceptedFileTypes : fileInputConstants.acceptedFileTypes),\r\n    [props.acceptedFileTypes]\r\n  );\r\n  const errors = useMemo(\r\n    () => (props.errors !== undefined ? props.errors : fileInputConstants.errorMessages),\r\n    [props.errors]\r\n  );\r\n\r\n  // Handle adding files up to the limit set\r\n  const handleFileChange = async (e) => {\r\n    const files = e.target.files;\r\n\r\n    let filteredFiles = [];\r\n    let errorMessages = [];\r\n\r\n    if (files !== undefined && files.length > 0) {\r\n      // Check if the file upload amount has been reached\r\n      const currentUploadLimit = maxFileUploadCount - uploadedFiles.length;\r\n\r\n      for (let i = 0; i < files.length; i++) {\r\n        // Get the extension\r\n        const fileExtension = files[i].type;\r\n\r\n        // Check if file is accepted type\r\n        if (acceptedFileTypes.filter((acceptedFileType) => acceptedFileType.mediaType === fileExtension).length === 0) {\r\n          errorMessages.push({ fileName: files[i].name, message: errors.invalidFileType });\r\n          continue;\r\n        }\r\n\r\n        // Check if file has hit upload limit\r\n        if (i >= currentUploadLimit) {\r\n          errorMessages.push({ fileName: files[i].name, message: errors.exceedUploadCountLimit });\r\n          continue;\r\n        }\r\n\r\n        // Check if file size is too large\r\n        if (files[i].size >= maxFileUploadSize) {\r\n          errorMessages.push({ fileName: files[i].name, message: errors.exceedUploadSizeLimit });\r\n          continue;\r\n        }\r\n\r\n        // Check if file name is too long\r\n        if (files[i].name.length > maxFileNameCharacters) {\r\n          // set error message then continue to shorten name\r\n          errorMessages.push({ fileName: files[i].name, message: errors.exceedFileNameCharacterLimit });\r\n          // Get file extension and create shortened name\r\n          const newFile = truncateFileNameString(files[i], maxFileNameCharacters);\r\n          filteredFiles.push(newFile);\r\n          continue;\r\n        }\r\n\r\n        filteredFiles.push(files[i]);\r\n      }\r\n\r\n      if (filteredFiles.length > 0) {\r\n        filteredFiles = await prepareFilesForSubmission(filteredFiles);\r\n\r\n        const [filesToUpload, filesToRemove, filesToNotUpload] = generateFileArraysForUpload(\r\n          uploadedFiles || [],\r\n          filteredFiles\r\n        );\r\n\r\n        filesToRemove.forEach((file) => {\r\n          onRemoveFile(uploadedFiles.findIndex((uploadedFile) => uploadedFile === file));\r\n          errorMessages.push({ fileName: file.fileName, message: errors.fileReplaced });\r\n        });\r\n\r\n        // This is so the user can re-select a file they have just removed\r\n        inputRef.current.value = null;\r\n\r\n        filesToNotUpload.forEach((file) => {\r\n          errorMessages.push({ fileName: file.fileName, message: errors.duplicateFile });\r\n        });\r\n\r\n        onUploadFiles(filesToUpload);\r\n      }\r\n\r\n      setErrorMessages(errorMessages);\r\n    }\r\n  };\r\n\r\n  const handleRemoveFile = useCallback(\r\n    (index) => {\r\n      onRemoveFile(index);\r\n\r\n      // Clear the errorMessages\r\n      setErrorMessages([]);\r\n\r\n      // This is so the user can re-select a file they have just removed\r\n      inputRef.current.value = null;\r\n    },\r\n    [inputRef, onRemoveFile, setErrorMessages]\r\n  );\r\n\r\n  const InvalidFiles = ({ errorMessages }) =>\r\n    errorMessages.map((errorMessage, index) => (\r\n      <p key={index}>\r\n        <strong>\"{errorMessage.fileName}\"</strong> - {errorMessage.message}\r\n      </p>\r\n    ));\r\n\r\n  const SelectedFiles = ({ uploadedFiles, onRemoveFileClick }) => {\r\n    const uploadFilesExist = uploadedFiles !== undefined;\r\n    return uploadFilesExist ? (\r\n      uploadedFiles.map((file, index) => (\r\n        <div className=\"file-input-cyc__uploaded-file row col-xs-12 col-md-6\" key={index}>\r\n          <div className=\"col-xs-12 col-sm-4\">\r\n            <img className=\"img img-fluid\" src={'data:image/png;base64,' + file.fileContent} alt={file.fileName} />\r\n          </div>\r\n          <div className=\"col-xs-12 col-sm-8 word-break pull-right\">\r\n            <p>{file.fileName}</p>\r\n\r\n            <button type=\"button\" onClick={() => onRemoveFileClick(index)}>\r\n              Remove\r\n            </button>\r\n          </div>\r\n        </div>\r\n      ))\r\n    ) : (\r\n      <React.Fragment />\r\n    );\r\n  };\r\n\r\n  return (\r\n    <div className=\"file-input-cyc\">\r\n      {<InvalidFiles errorMessages={errorMessages} />}\r\n      <div>\r\n        <label className=\"file-input-cyc__upload-file-button\">\r\n          Choose file\r\n          <input\r\n            id=\"uploadImg\"\r\n            className=\"\"\r\n            type=\"file\"\r\n            onChange={handleFileChange}\r\n            accept={acceptedFileTypes.map((x) => x.suffix).toString()}\r\n            ref={inputRef}\r\n            multiple\r\n          />\r\n        </label>\r\n        <div className=\"row\">\r\n          <SelectedFiles uploadedFiles={uploadedFiles} onRemoveFileClick={handleRemoveFile} />\r\n        </div>\r\n        <HelpTextComponent>{uploadedFiles.length === 0 ? helpText.noFiles : helpText.withFiles}</HelpTextComponent>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nFileInputComponent.propTypes = {\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  helpText: PropTypes.object,\r\n  maxFileUploadCount: PropTypes.number,\r\n  maxFileUploadSize: PropTypes.number,\r\n  acceptedFileTypes: PropTypes.array,\r\n};\r\n\r\nexport default FileInputComponent;\r\n","import axios from 'axios';\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nexport const _cache = [];\r\nexport const addressQuery = 'https://addresses.york.gov.uk/api/address/lookupbypostcode/';\r\nexport const osPlacesQuery = 'https://addresses.york.gov.uk/api/osplaces/lookupbypostcode/';\r\n\r\nexport const addressSources = {\r\n  NONE: 'NONE',\r\n  LLPG: 'LLPG',\r\n  OS_API: 'OS API',\r\n};\r\n\r\nexport const fetchAddressArrayAsync = async (postcode) => {\r\n  // Check the address cache\r\n  if (_cache[postcode.toUpperCase()]) {\r\n    // Return cached value\r\n    return _cache[postcode.toUpperCase()];\r\n  } else {\r\n    // Otherwise call the remote service\r\n    try {\r\n      let response = await axios.get(addressQuery + postcode);\r\n      const result = {\r\n        results: [],\r\n        source: addressSources.NONE,\r\n      };\r\n\r\n      // add to the cache, if there are results\r\n      if (response.data.length > 0) {\r\n        result.results = response.data;\r\n        result.source = addressSources.LLPG;\r\n\r\n        _cache[postcode.toUpperCase()] = result;\r\n      } else {\r\n        // If there are no results then call the os places endpoint\r\n        response = await axios.get(osPlacesQuery + postcode);\r\n        if (response.data.length > 0) {\r\n          result.results = response.data;\r\n          result.source = addressSources.OS_API;\r\n          _cache[postcode.toUpperCase()] = result;\r\n        }\r\n      }\r\n\r\n      return result;\r\n    } catch (ex) {\r\n      appInsights.trackException({ exception: ex, properties: { postcode } });\r\n      throw ex;\r\n    }\r\n  }\r\n};\r\n","import axios from 'axios';\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\n// Takes a point and returns the nearest street within 20 meters\r\nexport const getStreetFromPoint = async (x, y, spatialReferenceWkid = 27700) => {\r\n  const uri = encodeURI(\r\n    'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode?f=json' +\r\n      '&location={\"x\":' +\r\n      x +\r\n      ',\"y\":' +\r\n      y +\r\n      ',\"spatialReference\":{\"wkid\":' +\r\n      spatialReferenceWkid +\r\n      '}}&distance=20)'\r\n  );\r\n\r\n  return await axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find street for selected point');\r\n      }\r\n    })\r\n    .then((location) => {\r\n      if (location.address.Address !== undefined && location.address.Address !== '') {\r\n        // Find the first letter and return everything else after it\r\n        // This is so we dont get house numbers but we keep road numbers e.g A64\r\n        const splitter = location.address.Address.match(/[a-zA-Z]/);\r\n        const find = location.address.Address.indexOf(splitter.join());\r\n        const restOfString = location.address.Address.substring(find);\r\n        return restOfString.trim();\r\n      }\r\n      return null;\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({ exception: ex, properties: { x, y, spatialReferenceWkid } });\r\n      throw ex;\r\n    });\r\n};\r\n\r\n// Takes a point and gets the TOID underneath it.\r\nexport const getTOIDFromPoint = async (x, y, spatialReferenceWkid = 27700) => {\r\n  const uri = encodeURI(\r\n    'https://maps.york.gov.uk/arcgis/rest/services/Basemaps/cache_bw/MapServer/12/query' +\r\n      `?geometry=${x},${y}` +\r\n      `&inSR=${spatialReferenceWkid}` +\r\n      `&outSR=${spatialReferenceWkid}` +\r\n      '&outFields=Toid&returnGeometry=false&geometryType=esriGeometryPoint&f=json'\r\n  );\r\n\r\n  return await axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find a TOID');\r\n      }\r\n    })\r\n    .then((data) => {\r\n      if (data.features.length > 0) {\r\n        return data.features[0].attributes.Toid;\r\n      }\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({\r\n        exception: ex,\r\n        properties: {\r\n          x,\r\n          y,\r\n          spatialReferenceWkid,\r\n        },\r\n      });\r\n      throw ex;\r\n    });\r\n};\r\n\r\nexport const getParishFromPointAsync = async (x, y, spatialReferenceWkid = 27700) => {\r\n  const uri = encodeURI(\r\n    'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_CouncilDemocracy/MapServer/9/query' +\r\n      `?geometry={\"x\":${x},\"y\":${y}}` +\r\n      '&geometryType=esriGeometryPoint' +\r\n      `&inSR=${spatialReferenceWkid}` +\r\n      '&outFields=NAME' +\r\n      '&returnGeometry=false' +\r\n      '&f=json'\r\n  );\r\n\r\n  return axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find a Parish');\r\n      }\r\n    })\r\n    .then((data) => (data.features.length > 0 ? data.features[0].attributes.NAME : undefined))\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({\r\n        exception: ex,\r\n        properties: {\r\n          x,\r\n          y,\r\n          spatialReferenceWkid,\r\n        },\r\n      });\r\n      throw ex;\r\n    });\r\n};\r\n\r\nexport const getUSRNFromPoint = async (streetName) => {\r\n  const uri = encodeURI(\r\n    'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/5/' +\r\n      'query?' +\r\n      'where=' +\r\n      `&text=${streetName}` +\r\n      '&objectIds=' +\r\n      '&time=' +\r\n      '&geometry=' +\r\n      '&geometryType=esriGeometryPoint' +\r\n      '&inSR=27700' +\r\n      '&spatialRel=esriSpatialRelIntersects' +\r\n      '&relationParam=' +\r\n      '&outFields=usrn' +\r\n      '&returnGeometry=true' +\r\n      '&returnTrueCurves=false' +\r\n      '&maxAllowableOffset=' +\r\n      '&geometryPrecision=' +\r\n      '&outSR=&returnIdsOnly=false' +\r\n      '&returnCountOnly=false' +\r\n      '&orderByFields=' +\r\n      '&groupByFieldsForStatistics=' +\r\n      '&outStatistics=&returnZ=false' +\r\n      '&returnM=false&gdbVersion=' +\r\n      '&returnDistinctValues=false' +\r\n      '&resultOffset=' +\r\n      '&resultRecordCount=' +\r\n      '&f=json'\r\n  );\r\n\r\n  return await axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find street for selected point');\r\n      }\r\n    })\r\n    .then((reference) => {\r\n      // Return empty string if no USRN exists\r\n      if (reference.features === undefined) {\r\n        return null;\r\n      }\r\n      if (reference.features.length > 0) {\r\n        return reference.features[0].attributes.usrn;\r\n      }\r\n      return null;\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({ exception: ex, properties: { streetName } });\r\n      throw ex;\r\n    });\r\n};\r\n\r\nexport const getWardFromPoint = async (x, y) => {\r\n  const uri = encodeURI(\r\n    'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_CouncilDemocracy/MapServer/8/' +\r\n      'query?where=' +\r\n      '&objectIds=' +\r\n      '&time=' +\r\n      '&geometry=' +\r\n      x +\r\n      ',' +\r\n      y +\r\n      '&geometryType=esriGeometryPoint' +\r\n      '&inSR=27700' +\r\n      '&spatialRel=esriSpatialRelIntersects' +\r\n      '&relationParam=' +\r\n      '&outFields=NAME' +\r\n      '&returnGeometry=false' +\r\n      '&returnTrueCurves=false' +\r\n      '&maxAllowableOffset=' +\r\n      '&geometryPrecision=' +\r\n      '&outSR=&returnIdsOnly=false' +\r\n      '&returnCountOnly=false' +\r\n      '&orderByFields=' +\r\n      '&groupByFieldsForStatistics=' +\r\n      '&outStatistics=&returnZ=false' +\r\n      '&returnM=false&gdbVersion=' +\r\n      '&returnDistinctValues=false' +\r\n      '&resultOffset=' +\r\n      '&resultRecordCount=' +\r\n      '&f=json'\r\n  );\r\n\r\n  return await axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find ward for selected point');\r\n      }\r\n    })\r\n    .then((reference) => {\r\n      // Return empty string if no ward exists\r\n      if (reference.features.length > 0) {\r\n        return reference.features[0].attributes.NAME.replace(/Ward/g, '').trim();\r\n      }\r\n      return '';\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({ exception: ex, properties: { x, y } });\r\n      throw ex;\r\n    });\r\n};\r\n\r\nexport const getPostcodeFromPointAsync = async (x, y) => {\r\n  const uri = encodeURI(\r\n    'https://datahub.esriuk.com/arcgis/rest/services/gb_locators/os_codepointopen_postcode_locator/GeocodeServer/reverseGeocode' +\r\n      `?location=${x},${y}` +\r\n      '&f=json'\r\n  );\r\n\r\n  const result = await axios\r\n    .get(uri)\r\n    .then((response) => {\r\n      if (response.status === 200) {\r\n        return response.data;\r\n      } else {\r\n        throw new Error('Could not find postcode for selected point');\r\n      }\r\n    })\r\n    .then((data) => {\r\n      if (data === undefined || data.address === undefined || data.address.Full_Postcode === undefined) {\r\n        return undefined;\r\n      }\r\n\r\n      return data.address.Full_Postcode;\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({\r\n        exception: ex,\r\n        properties: {\r\n          x,\r\n          y,\r\n        },\r\n      });\r\n      throw ex;\r\n    });\r\n\r\n  return result;\r\n};\r\n","import React, { useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { fetchAddressArrayAsync } from '../../services/address.service';\r\nimport { getWardFromPoint } from 'common/components/map-components/esri-location.service';\r\nimport { ErrorLabelHandlerComponent, isValidPostcode } from 'common';\r\n\r\nimport {\r\n  TextInputComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  DropdownInputComponent,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport './address-lookup.container.scss';\r\n\r\nconst AddressLookupContainer = ({\r\n  className,\r\n  onAddressChange,\r\n  onAddressSearch,\r\n  onPostcodeChange,\r\n  onValidationError,\r\n  ...props\r\n}) => {\r\n  const [postcode, setPostcode] = useState(props.postcode || '');\r\n  const [addresses, setAddresses] = useState(props.addresses ? [props.addresses] : []);\r\n  const [uprn, setUprn] = useState(props.uprn || '');\r\n  const [loading, setLoading] = useState(false);\r\n\r\n  const classes = useMemo(() => (className === undefined ? 'cyc-address-lookup' : `cyc-address-lookup ${className}`), [\r\n    className,\r\n  ]);\r\n\r\n  const handlePostcodeChange = (e) => {\r\n    onPostcodeChange && onPostcodeChange(e.target.value);\r\n    setPostcode(e.target.value);\r\n    handleAddressReset();\r\n  };\r\n\r\n  const handlePostcodeKeyPress = (e) => {\r\n    if (e.key === 'Enter') {\r\n      handleSearchClick();\r\n      e.preventDefault();\r\n    }\r\n  };\r\n\r\n  const handleAddressReset = () => {\r\n    if (addresses.length > 0) {\r\n      setUprn('');\r\n      setAddresses([]);\r\n\r\n      onAddressChange && onAddressChange('');\r\n    }\r\n  };\r\n\r\n  const handleSearchClick = () => {\r\n    handleAddressReset();\r\n    const trimmedPostcode = postcode.trim();\r\n\r\n    if (trimmedPostcode === '') {\r\n      onValidationError && onValidationError('REQUIRED');\r\n    } else if (isValidPostcode(trimmedPostcode) === false) {\r\n      onValidationError && onValidationError('INVALID');\r\n    } else {\r\n      setLoading(true);\r\n      setPostcode(trimmedPostcode);\r\n\r\n      fetchAddressArrayAsync(trimmedPostcode)\r\n        .then((data) => {\r\n          setLoading(false);\r\n          setAddresses(data.results);\r\n\r\n          onAddressSearch && onAddressSearch(data);\r\n        })\r\n        .catch(() => setLoading(false));\r\n    }\r\n  };\r\n\r\n  const handleAddressChangeAsync = async (e) => {\r\n    const address = addresses.find((x) => x.uprn.toString() === e.target.value);\r\n\r\n    if (address !== undefined) {\r\n      let outOfYork = false;\r\n\r\n      if (address.ward === null) {\r\n        const ward = await getWardFromPoint(address.easting, address.northing);\r\n\r\n        if (ward === '') {\r\n          outOfYork = true;\r\n        }\r\n      }\r\n\r\n      setUprn(address.uprn);\r\n\r\n      onAddressChange && onAddressChange(address, outOfYork);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div className={classes}>\r\n      <ErrorLabelHandlerComponent text=\"Postcode\" id=\"postcode\" touched={props.touched} errors={props.errors} />\r\n      <TextInputComponent\r\n        type=\"text\"\r\n        id=\"postcode\"\r\n        value={postcode}\r\n        onChange={handlePostcodeChange}\r\n        onKeyPress={handlePostcodeKeyPress}\r\n        error={props.errors?.postcode && props.touched?.postcode}\r\n      />\r\n      {props.errors?.postcode && props.touched?.postcode === true && (\r\n        <InputErrorComponent>{props.errors?.postcode}</InputErrorComponent>\r\n      )}\r\n      <ButtonComponent\r\n        id=\"addressSearch\"\r\n        type=\"button\"\r\n        className={ButtonClasses.secondary}\r\n        onClick={handleSearchClick}\r\n        disabled={loading}>\r\n        Find address\r\n      </ButtonComponent>\r\n\r\n      {loading ||\r\n        (loading === false && addresses.length > 0 && (\r\n          <React.Fragment>\r\n            <ErrorLabelHandlerComponent text=\"Address\" id=\"address\" touched={props.touched} errors={props.errors} />\r\n            <br />\r\n            <DropdownInputComponent\r\n              disabled={loading}\r\n              id=\"address\"\r\n              onChange={handleAddressChangeAsync}\r\n              value={uprn}\r\n              defaultValue={loading ? 'Loading...' : 'Please select'}\r\n              options={addresses.map((address) => ({\r\n                text: address.shortAddress,\r\n                value: address.uprn,\r\n              }))}\r\n            />\r\n            {props.errors?.address && props.touched?.address === true && (\r\n              <InputErrorComponent>{props.errors?.address}</InputErrorComponent>\r\n            )}\r\n          </React.Fragment>\r\n        ))}\r\n    </div>\r\n  );\r\n};\r\n\r\nAddressLookupContainer.propTypes = {\r\n  address: PropTypes.string,\r\n  errors: PropTypes.object,\r\n  onAddressChange: PropTypes.func,\r\n  onAddressSearch: PropTypes.func,\r\n  onPostcodeChange: PropTypes.func,\r\n  postcode: PropTypes.string,\r\n  source: PropTypes.string,\r\n  touched: PropTypes.object,\r\n};\r\n\r\nexport default AddressLookupContainer;\r\n","export const AppName = 'Waste collection calendar';\r\nexport const ServiceDescription =\r\n  'Check your waste collection dates and the types of waste we collect at your address.';\r\n\r\nexport const collectionClassNames = {\r\n  REFUSE: 'bin-collections-lookup__services__service--refuse',\r\n  RECYCLING: 'bin-collections-lookup__services__service--recycling',\r\n  GARDEN: 'bin-collections-lookup__services__service--garden',\r\n};\r\n\r\nexport const collectionTypeTitles = {\r\n  REFUSE: 'Household waste',\r\n  RECYCLING: 'Recycling',\r\n  GARDEN: 'Garden waste',\r\n};\r\n\r\nexport const webaspxDays = {\r\n  mon: 'Monday',\r\n  tue: 'Tuesday',\r\n  wed: 'Wednesday',\r\n  thu: 'Thursday',\r\n  fri: 'Friday',\r\n  sat: 'Saturday',\r\n  sun: 'Sunday',\r\n};\r\n","import axios from 'axios';\r\nimport moment from 'moment';\r\nimport { webaspxDays } from '../constants/bin-collections.constants';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nexport const getBinCollectionsForUPRNAsync = async (uprn) => {\r\n  const result = await axios.get(`${ConfigurationService.store.binCollections.binCollectionsUrl}/${uprn}`);\r\n  if (result.services && result.services.length) {\r\n    return [];\r\n  }\r\n\r\n  return result.data.services.map((service) => {\r\n    service.lastCollected = service.lastCollected ? moment(service.lastCollected) : undefined;\r\n    service.nextCollection = service.nextCollection ? moment(service.nextCollection) : undefined;\r\n    // replace l with litre e.g. '180l grey rubbish sack' becomes '180 litre grey rubbish sack'\r\n    service.binDescription = service.binDescription.toLowerCase().replace(/([0-9]+)l\\s/g, '$1 litre ');\r\n\r\n    // Change frequency wording for user friendly alternative\r\n    // Regex will return null if frequency doesn't match (e.g. blank)\r\n    const frequency = service.frequency !== '' ? service.frequency.split(' ') : '';\r\n    if (frequency.length > 2) {\r\n      const day = webaspxDays[frequency[2].toLowerCase()];\r\n      if (day) {\r\n        service.frequency = service.frequency.replace(frequency[2], day);\r\n      }\r\n    }\r\n    if (frequency.length === 2) {\r\n      const day = webaspxDays[frequency[1].toLowerCase()];\r\n      if (day) {\r\n        service.frequency = service.frequency.replace(frequency[1], day);\r\n      }\r\n    }\r\n\r\n    return service;\r\n  });\r\n};\r\n\r\nexport const getBinCalendarForUPRNAsync = async (uprn) => {\r\n  const response = await axios.get(`${ConfigurationService.store.binCollections.binCalendarUrl}/${uprn}`);\r\n  // Transform date strings into moment objects\r\n  const collections = response.data.collections.map((x) => ({ ...x, date: moment(x.date) }));\r\n  collections.sort((a, b) => b.date - a.date);\r\n  return collections;\r\n};\r\n\r\nexport const getCollectionLocationForUPRNAsync = async (uprn) => {\r\n  const response = await axios.get(`${ConfigurationService.store.binCollections.binLocationUrl}/${uprn}`);\r\n\r\n  return response.data;\r\n};\r\n\r\n// Group a list of objects by a given key\r\n// @param {Object[]} list - objects to group\r\n// @param keyGetter - lambda expression for key on each object to group by\r\nexport const groupBy = (list, keyGetter) => {\r\n  const map = new Map();\r\n  list.forEach((item) => {\r\n    const key = keyGetter(item);\r\n    const collection = map.get(key);\r\n    if (!collection) {\r\n      map.set(key, [item]);\r\n    } else {\r\n      collection.push(item);\r\n    }\r\n  });\r\n  return map;\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport { object, shape, string } from 'prop-types';\r\n\r\nimport * as constants from '../../constants/bin-collections.constants';\r\nimport { number } from 'prop-types';\r\n\r\nconst BinCollectionComponent = ({ collection, ...props }) => {\r\n  const collectionStyle = constants.collectionClassNames[collection.service];\r\n\r\n  // Calculate if we need to add an additional class to the container div, based on the number of containers\r\n  const columnClass = useMemo(() => {\r\n    switch (collection.serviceCount) {\r\n      case 0:\r\n      case 1:\r\n        return '';\r\n      case 2:\r\n        return 'col-sm-6';\r\n      default:\r\n        return 'col-md-4';\r\n    }\r\n  }, [collection.serviceCount]);\r\n\r\n  return (\r\n    <div className={`col-xs-12 ${columnClass}`}>\r\n      <div className={`bin-collections-lookup__services__service ${collectionStyle}`} {...props}>\r\n         <div className=\"bin-collections-lookup__services__service__header\">\r\n          <h2>{constants.collectionTypeTitles[collection.service]} collection</h2>\r\n          {collection.nextCollection && (\r\n            ( collection.nextCollection.isSame(collection.lastCollected) ? (\r\n              <h3>Not applicable; no subscription</h3>\r\n          ) : (  <h3>Your next collection will be on {collection.nextCollection.format('dddd D MMMM YYYY')}</h3>))\r\n          )}\r\n        </div>\r\n        <div className=\"bin-collections-lookup__services__service__body\">\r\n          <dl>\r\n            <dt>Waste type</dt>\r\n            <dd>{collection.wasteType}</dd>\r\n\r\n            <dt>What's collected</dt>\r\n            <dd>{collection.binDescription}</dd>\r\n\r\n            <dt>Previous collection</dt>\r\n            <dd>\r\n              {collection.lastCollected ? collection.lastCollected.format('dddd D MMMM YYYY') : 'No data available'}\r\n            </dd>\r\n\r\n            <dt>Next collection</dt>\r\n           <dd>\r\n              {collection.nextCollection ? (\r\n                  collection.lastCollected && collection.nextCollection.isSame(collection.lastCollected) ? \r\n                  'Not applicable; no subscription' : \r\n                  collection.nextCollection.format('dddd D MMMM YYYY')\r\n              ) : 'No data available'}\r\n          </dd>\r\n            {collection.frequency !== '' && (\r\n              <>\r\n                <dt>Collection frequency</dt>\r\n                <dd>{collection.frequency}</dd>\r\n              </>\r\n            )}\r\n            {collection.wasteCollectedFrom && (\r\n              <>\r\n                <dt>Waste collected from</dt>\r\n                <dd>{collection.wasteCollectedFrom}</dd>\r\n              </>\r\n            )}\r\n            {collection.collectedBy === 'St Nicholas' && (\r\n              <>\r\n                <dt>Waste collected by</dt>\r\n                <dd>\r\n                  <a href=\" https://stnicks.org.uk/make-a-difference/our-recycling-service/\" target=\"_blank\">\r\n                    St Nicks (opens in new tab)\r\n                  </a>\r\n                </dd>\r\n              </>\r\n            )}\r\n          </dl>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nBinCollectionComponent.propTypes = {\r\n  collection: shape({\r\n    service: string,\r\n    wasteType: string,\r\n    lastCollected: object,\r\n    nextCollection: object,\r\n    frequency: string,\r\n    wasteCollectedFrom: string,\r\n    serviceCount: number,\r\n  }).isRequired,\r\n};\r\n\r\nexport default BinCollectionComponent;\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport {\r\n  getBinCollectionsForUPRNAsync,\r\n  getCollectionLocationForUPRNAsync,\r\n} from '../../services/bin-collections.service';\r\nimport BinCollectionComponent from '../../components/bin-collections/bin-collection.component';\r\n\r\nimport './bin-collections.container.scss';\r\n\r\nconst WASTE_SERVICE_NAME_REFUSE = 'REFUSE';\r\n\r\nconst BinCollectionsContainer = ({ uprn, calendarUrl }) => {\r\n  const [binCollections, setBinCollections] = useState([]);\r\n  const [binState, setBinState] = useState('NO DATA');\r\n  const [binLocation, setBinLocation] = useState();\r\n\r\n  // Fetching data from webaspx when urpn changes\r\n  useEffect(() => {\r\n    const binData = async () => {\r\n      setBinState('LOADING');\r\n      try {\r\n        const result = await getBinCollectionsForUPRNAsync(uprn);\r\n        const location = await getCollectionLocationForUPRNAsync(uprn);\r\n        setBinCollections(result);\r\n        setBinLocation(location);\r\n        setBinState('LOADED');\r\n      } catch (err) {\r\n        setBinState('ERROR');\r\n      }\r\n    };\r\n    binData();\r\n  }, [uprn]);\r\n\r\n  return (\r\n    <>\r\n      {binState === 'LOADING' && (\r\n        <div className=\"network-loader cyc-box network-loader--loading\">\r\n          <i>Retrieving collection data...</i>\r\n        </div>\r\n      )}\r\n\r\n      {binState === 'LOADED' && binCollections.length === 0 && (\r\n        <div className=\"bin-collections-lookup__loader\">\r\n          <p>No available data</p>\r\n          <p>We couldn't find any bin collection data for this property.</p>\r\n        </div>\r\n      )}\r\n\r\n      {binState === 'LOADED' && binCollections.length > 0 && (\r\n        <div>\r\n          View your <Link to={`${calendarUrl}/${uprn}`}>waste and recycling calendar</Link> for the current year.\r\n         \r\n          <div className=\"bin-collections-lookup__services row\">\r\n            {binCollections.map((collection, key) => {\r\n              // If it's Central Collection Point, add bin location information to household waste card\r\n              const collectionClone = {\r\n                ...collection,\r\n                serviceCount: binCollections.length,\r\n              };\r\n              if (\r\n                collection.service === WASTE_SERVICE_NAME_REFUSE &&\r\n                binLocation &&\r\n                (binLocation.isCentralCollection || binLocation.isCommunal)\r\n              ) {\r\n                collectionClone.wasteCollectedFrom = binLocation.collectionLocation;\r\n              }\r\n              return <BinCollectionComponent key={key} collection={collectionClone} />;\r\n            })}\r\n          </div>\r\n        </div>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n\r\nBinCollectionsContainer.propTypes = {\r\n  canlendarUrl: PropTypes.string,\r\n  uprn: PropTypes.string,\r\n};\r\n\r\nexport default BinCollectionsContainer;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { FaRegEdit } from 'react-icons/fa';\r\nimport { DataArrayTableComponent, TableClasses } from 'cyc-react-ui-components';\r\n\r\nimport './summary-table.component.scss';\r\n\r\nconst SummaryTableComponent = ({ headerOne, headerTwo, linkHeader, rowData }) => (\r\n  <DataArrayTableComponent\r\n    headers={[headerOne, headerTwo, linkHeader]}\r\n    data={rowData.map((data, key) => ({\r\n      col1: data.columnOne,\r\n      col2: data.columnTwo,\r\n      col3:\r\n        data.link !== undefined ? (\r\n          <Link\r\n            key={key}\r\n            to={data.link}\r\n            onClick={data.onChangeClicked}\r\n            title={`Change '${data.columnOne}'`}\r\n            data-testid={`${data.columnOne} - change`}>\r\n            <FaRegEdit className=\"edit-icon\" />\r\n          </Link>\r\n        ) : (\r\n          data.onChangeClicked && (\r\n            <FaRegEdit\r\n              key={key}\r\n              title={`Change '${data.columnOne}'`}\r\n              onClick={data.onChangeClicked}\r\n              className=\"edit-icon\"\r\n              data-testid={`${data.columnOne} - change`}\r\n            />\r\n          )\r\n        ),\r\n    }))}\r\n    className={TableClasses.restyle + ' sentence-case'}\r\n  />\r\n);\r\n\r\nSummaryTableComponent.propTypes = {\r\n  headerOne: PropTypes.string,\r\n  headerTwo: PropTypes.string,\r\n  linkHeader: PropTypes.string,\r\n  rowData: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      columnOne: PropTypes.string,\r\n      columnTwo: PropTypes.any,\r\n      link: PropTypes.string,\r\n      onChangeClicked: PropTypes.func,\r\n      columnOneClassName: PropTypes.string,\r\n      columnTwoClassName: PropTypes.string,\r\n      linkClassName: PropTypes.string,\r\n    })\r\n  ),\r\n};\r\n\r\nexport default SummaryTableComponent;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { MyAccountPageComponent, DocumentTitleComponent, PageHeaderComponent } from '../../index';\r\nimport { clientMyAccountUrl } from '../..';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\nconst GO_BACK = 'goBack';\r\n\r\nconst ErrorPageComponent = () => {\r\n  const navigate = useNavigate();\r\n  const [reload, setReload] = useState(false);\r\n  useEffect(() => {\r\n    if (reload) {\r\n      window.location.reload();\r\n    }\r\n  }, [reload]);\r\n  const handleButtonClicked = (target) => {\r\n    if (target === GO_BACK) {\r\n      navigate(-1);\r\n    } else {\r\n      navigate(clientMyAccountUrl.dashboard);\r\n    }\r\n    setReload(true);\r\n  };\r\n\r\n  return (\r\n    <DocumentTitleComponent title=\"My Account - Something has gone wrong\">\r\n      <PageHeaderComponent text=\"My Account - Something has gone wrong\" />\r\n      <MyAccountPageComponent>\r\n        <p>\r\n          We are afraid something has gone wrong while trying to load My Account. Please use the buttons below to try\r\n          and reload or go to dashboard.\r\n        </p>\r\n        <ButtonComponent onClick={() => handleButtonClicked(GO_BACK)} className={ButtonClasses.primary + ' float-left'}>\r\n          Reload\r\n        </ButtonComponent>\r\n        <ButtonComponent onClick={() => handleButtonClicked()} className={ButtonClasses.primary + ' float-right'}>\r\n          Go to Dashboard\r\n        </ButtonComponent>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nexport default ErrorPageComponent;\r\n","import React from 'react';\r\nimport { DocumentTitleComponent, PageHeaderComponent, MyAccountPageComponent } from '../..';\r\n\r\nconst SiteLoaderComponent = () => {\r\n  return (\r\n    <DocumentTitleComponent title=\"My Account - Dashboard\">\r\n      <PageHeaderComponent text=\"My Account\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <p>Initialising...</p>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nexport default SiteLoaderComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { InputLabelComponent } from 'cyc-react-ui-components';\r\n\r\nconst ErrorLabelHandlerComponent = ({\r\n  touched,\r\n  errors,\r\n  id,\r\n  text,\r\n  requiredInput = true,\r\n  submitCount = 1\r\n}) => {\r\n  const hasError = touched[id] && errors[id] && submitCount > 0;\r\n  return (\r\n    <InputLabelComponent htmlFor={id} error={hasError} required={requiredInput}>\r\n      {text}\r\n    </InputLabelComponent>\r\n  );\r\n};\r\n\r\nErrorLabelHandlerComponent.propTypes = {\r\n  touched: PropTypes.object,\r\n  errors: PropTypes.object,\r\n  id: PropTypes.string.isRequired,\r\n  text: PropTypes.string.isRequired,\r\n  submitCount: PropTypes.number,\r\n  requiredInput: PropTypes.bool,\r\n};\r\n\r\nexport default ErrorLabelHandlerComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ErrorLabelHandlerComponent from '../error-handlers/error-label-handler.component';\r\nimport { RadiobuttonInputComponent, InputErrorComponent } from 'cyc-react-ui-components';\r\n\r\nconst OffensiveGraffitiInputComponent = ({\r\n  offensiveGraffiti,\r\n  onOffensiveGraffitiChange,\r\n  touched,\r\n  errors,\r\n  submitCount,\r\n}) => {\r\n  return (\r\n    <React.Fragment>\r\n      <div className=\"row\">\r\n        <span id=\"isGraffitiOffensive\">\r\n          <ErrorLabelHandlerComponent\r\n            errors={errors}\r\n            id=\"offensiveGraffiti\"\r\n            submitCount={submitCount}\r\n            text=\"Is the graffiti offensive?\"\r\n            touched={touched}\r\n          />\r\n          <RadiobuttonInputComponent\r\n            name=\"offensiveGraffiti\"\r\n            error={errors.offensiveGraffiti && touched.offensiveGraffiti}\r\n            value={offensiveGraffiti}\r\n            options={[\r\n              {\r\n                label: 'Yes',\r\n                value: true,\r\n              },\r\n              {\r\n                label: 'No',\r\n                value: false,\r\n              },\r\n            ]}\r\n            onChange={(e) => onOffensiveGraffitiChange(e)}\r\n          />\r\n          {errors.offensiveGraffiti && touched.offensiveGraffiti && (\r\n            <InputErrorComponent>{errors.offensiveGraffiti}</InputErrorComponent>\r\n          )}\r\n        </span>\r\n      </div>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nOffensiveGraffitiInputComponent.propType = {\r\n  offensiveGraffiti: PropTypes.bool,\r\n  onOffensiveGraffitiChange: PropTypes.func,\r\n  touched: PropTypes.object.isRequired,\r\n  errors: PropTypes.object.isRequried,\r\n  submitCount: PropTypes.number.isRequired,\r\n};\r\n\r\nexport default OffensiveGraffitiInputComponent;\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nimport { MyAccountPageComponent, DocumentTitleComponent, PageHeaderComponent, clientMyAccountUrl } from 'common';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst ParkingPortalErrorPageComponent = (props) => {\r\n  const [reload, setReload] = useState(false);\r\n  useEffect(() => {\r\n    if (reload) {\r\n      window.location.reload();\r\n    }\r\n  }, [reload]);\r\n\r\n  const handleButtonClicked = () => {\r\n    props.history.push(clientMyAccountUrl.dashboard);\r\n    setReload(true);\r\n  };\r\n\r\n  return (\r\n    <DocumentTitleComponent title=\"My Account - Parking Portal Error\">\r\n      <PageHeaderComponent text=\"My Account - Parking Portal Error\" />\r\n      <MyAccountPageComponent>\r\n        <p>\r\n          We are afraid something has gone wrong with the transfer to Parking Portal. Please use the button below to go\r\n          to dashboard.\r\n        </p>\r\n        <ButtonComponent onClick={() => handleButtonClicked()} className={ButtonClasses.primary + ' float-right'}>\r\n          Go to Dashboard\r\n        </ButtonComponent>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nexport default ParkingPortalErrorPageComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ButtonComponent } from 'cyc-react-ui-components';\r\n\r\nimport './error-box.component.scss';\r\n\r\nconst ErrorBoxComponent = ({\r\n  children,\r\n  jumpButton = true,\r\n  text = 'Please check the required details are completed',\r\n  ...props\r\n}) => {\r\n  const handleClick = () => {\r\n    const elements = document.getElementsByClassName('error-cyc');\r\n    if (elements.length > 0) {\r\n      elements[0].scrollIntoView();\r\n    }\r\n  };\r\n  return (\r\n    <div className=\"cyc-input-errors-box\" {...props} data-testid=\"error-box-component\">\r\n      <div className=\"cyc-input-errors-box__head\">\r\n        <h2 className=\"cyc-input-errors\">{text}</h2>\r\n        <div className=\"cyc-input-error__head__call-to-action\">\r\n          {jumpButton && (\r\n            <ButtonComponent id=\"goToError\" type=\"button\" onClick={handleClick}>\r\n              Jump to first error\r\n            </ButtonComponent>\r\n          )}\r\n        </div>\r\n      </div>\r\n      <div className=\"cyc-input-errors-box__body\">{children}</div>\r\n    </div>\r\n  );\r\n};\r\n\r\nErrorBoxComponent.propTypes = {\r\n  jumpButton: PropTypes.bool,\r\n  children: PropTypes.node,\r\n};\r\n\r\nexport default ErrorBoxComponent;\r\n\r\nexport { ErrorBoxComponent };\r\n","import React from 'react';\r\nimport { msgConstants } from '../../constants/msg.constants';\r\n\r\n// Used for any generic error message if something goes wrong on a network request\r\nclass NetworkCatchErrorComponent extends React.Component {\r\n  state = {\r\n    didCatchError: false,\r\n    customMessage: undefined,\r\n  };\r\n\r\n  componentDidMount = () => {\r\n    this.setState({\r\n      didCatchError: this.props.didCatchError,\r\n      customMessage: this.props.customMessage,\r\n    });\r\n  };\r\n\r\n  componentDidUpdate() {\r\n    // Setstate only if theres a change\r\n    if (this.props.didCatchError !== this.state.didCatchError) {\r\n      this.setState({\r\n        didCatchError: this.props.didCatchError,\r\n      });\r\n    }\r\n  }\r\n\r\n  render = () =>\r\n    this.state.didCatchError === true ? (\r\n      this.props.customMessage === undefined ? (\r\n        <div className=\"network-loader cyc-box network-loader--error\">\r\n          {msgConstants.GENERIC_API_ERROR}\r\n        </div>\r\n      ) : (\r\n        <div className=\"network-loader cyc-box network-loader--error\">\r\n          {this.props.customMessage}\r\n        </div>\r\n      )\r\n    ) : (\r\n      <React.Fragment />\r\n    );\r\n}\r\n\r\nexport default NetworkCatchErrorComponent;\r\n","export default __webpack_public_path__ + \"static/media/york-logo.bc96a06f.svg\";","export default __webpack_public_path__ + \"static/media/hamburger_menu.c0fda5ae.svg\";","export default __webpack_public_path__ + \"static/media/magnifying_glass.5feb506c.svg\";","import React, { useMemo } from 'react';\r\nimport { ButtonComponent } from 'cyc-react-ui-components';\r\n\r\nimport './flyout.component.scss';\r\n\r\n/**\r\n * A full screen flyout - best used on mobile devices\r\n *\r\n * props\r\n * @param {object} children - Content to show in the flyout\r\n * @param {boolean} [open=false] - Should the flyout show when it is loaded?\r\n * @param {function} onClose - The callback for when the dialog is closed\r\n * @param {object} props - any props you want to add to the flyout\r\n */\r\nconst FlyoutComponent = ({ children, open, onClose, className, ...props }) => {\r\n  const classes = useMemo(() => {\r\n    let c = `myaccount-flyout myaccount-flyout--${open ? 'open' : 'closed'}`;\r\n    if (className) {\r\n      c += ` ${className}`;\r\n    }\r\n    return c.trim();\r\n  }, [className, open]);\r\n\r\n  const handleCloseClick = (e) => {\r\n    e.preventDefault();\r\n    onClose && onClose();\r\n  };\r\n  return (\r\n    <div className={classes} {...props}>\r\n      <div className = \"myaccount-flyout__controls\">\r\n        <ButtonComponent title=\"Close menu\" onClick={handleCloseClick} className=\"myaccount-flyout__close\">\r\n          Close <span className=\"toggle-icon\"></span>\r\n        </ButtonComponent>\r\n      </div>\r\n      <div className=\"myaccount-flyout__content\">{children}</div>\r\n      <div className=\"myaccount-flyout__canvas\"></div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default FlyoutComponent;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport './site-search.component.scss';\r\nimport searchButtonSvg from 'resources/new-styles/images/magnifying_glass.svg';\r\nimport { ButtonComponent, ButtonClasses, TextInputComponent } from 'cyc-react-ui-components';\r\nimport FlyoutComponent from '../flyout/flyout.component';\r\nimport { yorkMainWebsiteUrl } from 'common';\r\n\r\nconst SiteSearch = ({ open, onClose, onSearch }) => {\r\n  const [searchTerm, setSearchTerm] = useState('');\r\n\r\n  const handleSearch = (e) => {\r\n    e.preventDefault();\r\n    if (searchTerm.length > 0) {\r\n      onSearch && onSearch(searchTerm);\r\n      window.location = yorkMainWebsiteUrl.siteSearchQuery + encodeURIComponent(searchTerm);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <FlyoutComponent open={open} onClose={onClose} className=\"site-search\">\r\n        <h2>How can we help you?</h2>\r\n        <form noValidate onSubmit={handleSearch}>\r\n          <label htmlFor=\"cyc-search\" />\r\n          <TextInputComponent\r\n            id=\"cyc-search\"\r\n            type=\"search\"\r\n            placeholder=\"Search\"\r\n            onChange={(e) => setSearchTerm(e.target.value)}\r\n            value={searchTerm}\r\n          />\r\n          <ButtonComponent type=\"submit\" className={ButtonClasses.secondary + ' search-button'}>\r\n            <img src={searchButtonSvg} alt=\"Search\" />\r\n          </ButtonComponent>\r\n        </form>\r\n      </FlyoutComponent>\r\n    </>\r\n  );\r\n};\r\n\r\nSiteSearch.propTypes = {\r\n  onClose: PropTypes.func.isRequired,\r\n  open: PropTypes.bool.isRequired,\r\n  onSearch: PropTypes.func,\r\n};\r\n\r\nexport default SiteSearch;\r\n","import React, { useState, useContext } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { FaUser } from 'react-icons/fa';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nimport './header.component.scss';\r\nimport yorkLogoSvg from '../../../resources/new-styles/images/york-logo.svg';\r\nimport burgerMenuIcon from '../../../resources/images/hamburger_menu.svg';\r\nimport { CYCServices } from 'cyc-services';\r\nimport SiteSearch from './site-search/site-search.component';\r\n\r\nimport { clientMyAccountUrl, yorkMainWebsiteUrl, UserContext } from '../..';\r\nimport FlyoutComponent from './flyout/flyout.component';\r\n\r\nconst SiteHeader = ({ onLogOut }) => {\r\n  const [searchOpen, setSearchOpen] = useState(false);\r\n  const [burgerMenuOpen, setBurgerMenuOpen] = useState(false);\r\n\r\n  const userContext = useContext(UserContext);\r\n\r\n  const handleLogOut = () => {\r\n    userContext.setStore('firstName', undefined);\r\n    userContext.setStore('lastName', undefined);\r\n    setBurgerMenuOpen(false);\r\n    onLogOut && onLogOut();\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <div className=\"myaccount-header\">\r\n        <div className=\"myaccount-header__container\">\r\n          <a\r\n            href={yorkMainWebsiteUrl.root}\r\n            className=\"myaccount-header__container__cyc-logo-container myaccount-header--black-hover-effect\">\r\n            <img src={yorkLogoSvg} alt=\"City of York Council Logo\"></img>\r\n          </a>\r\n          <ul className=\"myaccount-header__navigation-links\">\r\n            {CYCServices.JWTAuth.isAuthenticated() ? (\r\n              <>\r\n                <li>\r\n                  <Link to={clientMyAccountUrl.dashboard} className=\"black-hover-effect account-navigation menu-item\">\r\n                    <FaUser className=\"user-icon\" />\r\n                    {userContext.store.firstName + ' ' + userContext.store.lastName}\r\n                  </Link>\r\n                </li>\r\n                <li>\r\n                  <button onClick={handleLogOut} className=\"black-hover-effect account-navigation menu-item\">\r\n                    Sign out\r\n                  </button>\r\n                </li>\r\n              </>\r\n            ) : (\r\n              <li>\r\n                <a href={clientMyAccountUrl.dashboard} className=\"black-hover-effect account-navigation menu-item\">\r\n                  My Account\r\n                </a>\r\n              </li>\r\n            )}\r\n            <li className=\"search-list-item\">\r\n              <button\r\n                className=\"black-hover-effect search-icon menu-item myaccount-myaccount-header--background-color\"\r\n                onClick={() => setSearchOpen(!searchOpen)}>\r\n                <span className=\"myaccount-header__link-text\">Search</span>\r\n                <span className={searchOpen ? 'icon-ui-search open' : 'icon-ui-search'}></span>\r\n                <span className={searchOpen ? 'icon-closed-ui-search open' : 'icon-closed-ui-search'}></span>\r\n              </button>\r\n            </li>\r\n            <li>\r\n              <ButtonComponent\r\n                className={`${ButtonClasses.primary} menu-item council-services screen-large`}\r\n                type=\"button\"\r\n                onClick={() => (window.location = yorkMainWebsiteUrl.councilServices)}>\r\n                COUNCIL SERVICES\r\n              </ButtonComponent>\r\n              <ButtonComponent\r\n                className={`${ButtonClasses.primary} menu-item council-services screen-small`}\r\n                type=\"button\"\r\n                title=\"Open menu\"\r\n                onClick={() => setBurgerMenuOpen(true)}>\r\n                <img alt=\"Open menu\" src={burgerMenuIcon} />\r\n              </ButtonComponent>\r\n            </li>\r\n            <li className=\"browsealoud-placeholder\"></li>\r\n          </ul>\r\n        </div>\r\n      </div>\r\n      <FlyoutComponent onClose={() => setBurgerMenuOpen(false)} open={burgerMenuOpen}>\r\n        <ul>\r\n          <li>\r\n            <a href={yorkMainWebsiteUrl.councilServices}>Council Services</a>\r\n          </li>\r\n          {CYCServices.JWTAuth.isAuthenticated() ? (\r\n            <>\r\n              <li>\r\n                <Link to={clientMyAccountUrl.dashboard} onClick={() => setBurgerMenuOpen(false)}>\r\n                  {userContext.store.firstName + ' ' + userContext.store.lastName}\r\n                </Link>\r\n              </li>\r\n              <li>\r\n                <span onClick={handleLogOut}>Sign out</span>\r\n              </li>\r\n            </>\r\n          ) : (\r\n            <li>\r\n              <Link to={clientMyAccountUrl.dashboard} onClick={() => setBurgerMenuOpen(false)}>\r\n                My Account\r\n              </Link>\r\n            </li>\r\n          )}\r\n        </ul>\r\n      </FlyoutComponent>\r\n      {<SiteSearch open={searchOpen} onClose={() => setSearchOpen(false)} />}\r\n    </>\r\n  );\r\n};\r\n\r\nSiteHeader.propTypes = {\r\n  onLogOut: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default SiteHeader;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport HeaderComponent from 'common/components/header/header.component';\r\nimport { ErrorPageComponent, FooterComponent } from 'common';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\n// This cannot be converted into a functional component unless React implements componentDidCatch as a hook!\r\nclass ErrorBoundaryComponent extends Component {\r\n  constructor(props) {\r\n    super(props);\r\n    this.state = { hasError: false };\r\n  }\r\n\r\n  static getDerivedStateFromError(error) {\r\n    // Update state so the next render will show the fallback UI.\r\n    return { hasError: true };\r\n  }\r\n  componentDidCatch = (ex, info) => {\r\n    ex.stack = info;\r\n    if (appInsights.initialized) {\r\n      appInsights.trackException({ exception: new Error('Uncaught exception'), properties: { ex } });\r\n    }\r\n  };\r\n\r\n  render() {\r\n    if (this.state.hasError) {\r\n      // You can render any custom fallback UI\r\n      return (\r\n        <>\r\n          <header id=\"pageTop\">\r\n            <HeaderComponent onLogOut={() => {}} />\r\n          </header>\r\n          <main className=\"mainBody\">\r\n            <ErrorPageComponent {...this.props} />\r\n          </main>\r\n          <footer>\r\n            <FooterComponent />\r\n          </footer>\r\n        </>\r\n      );\r\n    }\r\n\r\n    return this.props.children;\r\n  }\r\n}\r\n\r\nErrorBoundaryComponent.propTypes = {\r\n  children: PropTypes.arrayOf(PropTypes.element),\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ErrorBoundaryComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Navigate } from 'react-router-dom';\r\n\r\n/**\r\n * Stops users from entering mid form and also stops them going back from confirmation page\r\n */\r\nconst ContinueFormOrReRoute = ({ formStarted, formCompleted, formStartUrl, formEndUrl, children, location }) => {\r\n  return (\r\n    <>\r\n      {formStarted === false && formCompleted === false && <Navigate to={formStartUrl} />}\r\n\r\n      {formStarted === true && formCompleted === false && <React.Fragment>{children}</React.Fragment>}\r\n\r\n      {formCompleted === true && location.pathname !== formEndUrl && <Navigate to={formEndUrl} />}\r\n\r\n      {formCompleted === true && location.pathname === formEndUrl && <React.Fragment>{children}</React.Fragment>}\r\n    </>\r\n  );\r\n};\r\n\r\nContinueFormOrReRoute.propTypes = {\r\n  formStarted: PropTypes.bool.isRequired,\r\n  formCompleted: PropTypes.bool.isRequired,\r\n  formStartUrl: PropTypes.string.isRequired,\r\n  formEndUrl: PropTypes.string.isRequired,\r\n  location: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ContinueFormOrReRoute;\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { clientMyAccountUrl, yorkMainWebsiteUrl } from '../../constants/my-account-urls.constants';\r\nimport DocumentTitleComponent from '../document-title/document-title.component';\r\nimport PageHeaderComponent from '../page-header/page-header.component';\r\nimport MyAccountPageComponent from '../myaccount-page/my-account-page.component';\r\n\r\n/**\r\n * 404 not found component to show when a route is not found\r\n */\r\nconst NotFoundComponent = () => (\r\n  <>\r\n    <DocumentTitleComponent title=\"My Account - 404 page not found\">\r\n      <PageHeaderComponent text=\"404 page not found\" />\r\n      <MyAccountPageComponent>\r\n        <p>\r\n          Sorry, we can't find the page you're looking for - perhaps it doesn't exist anymore, it's moved, or the\r\n          address is incorrect/out of date.\r\n        </p>\r\n        <p>Please try the following:</p>\r\n        <ul>\r\n          <li>\r\n            go back to <Link to={clientMyAccountUrl.home}>My Account</Link>\r\n          </li>\r\n          <li>\r\n            visit our <a href={yorkMainWebsiteUrl.root}>home page</a>\r\n          </li>\r\n        </ul>\r\n        <p>If you still need help:</p>\r\n        <ul>\r\n          <li>\r\n            <a href={yorkMainWebsiteUrl.feedback}>send a message to our Web Admin team</a> (about the website)\r\n          </li>\r\n          <li>\r\n            <a href={yorkMainWebsiteUrl.customerContactCentre}>send a message to our Customer Centre</a> (about council\r\n            services)\r\n          </li>\r\n        </ul>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  </>\r\n);\r\n\r\nexport default NotFoundComponent;\r\n","import React from 'react';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst LoggedInUpdatesComponent = ({ goToMyAccount }) => {\r\n  return (\r\n    <React.Fragment>\r\n      <div className=\"row\">\r\n        <p>\r\n          Go to{' '}\r\n          <button className=\"in-text-button\" onClick={goToMyAccount}>\r\n            My Account\r\n          </button>{' '}\r\n          to see the status/progress of all services and reported problems.\r\n        </p>\r\n      </div>\r\n\r\n      <div className=\"row\">\r\n        <ButtonComponent className={ButtonClasses.primary} onClick={goToMyAccount}>\r\n          Go to My Account\r\n        </ButtonComponent>\r\n      </div>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default LoggedInUpdatesComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst NotLoggedInUpdatesComponent = ({ onSignInClicked, onRegisterClicked }) => {\r\n  return (\r\n    <React.Fragment>\r\n      <div className=\"row\">\r\n        <p>\r\n          <button className=\"in-text-button\" onClick={onRegisterClicked}>\r\n            Register\r\n          </button>{' '}\r\n          for My Account to see the status/progress of all services and reported problems by signing in online.\r\n        </p>\r\n      </div>\r\n\r\n      <div className=\"row\">\r\n        <ButtonComponent className={ButtonClasses.primary} onClick={onSignInClicked}>\r\n          Sign in\r\n        </ButtonComponent>\r\n      </div>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nNotLoggedInUpdatesComponent.propTypes = {\r\n  onSignInClicked: PropTypes.func,\r\n  onRegisterClicked: PropTypes.func,\r\n};\r\nexport default NotLoggedInUpdatesComponent;\r\n","import { CycEsriMap } from 'esri-map-react';\r\n\r\nexport default CycEsriMap;\r\n","import React, { Component, useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\nimport CycEsriMap from './cyc-esri-map.importer';\r\nimport * as EsriLocationService from './esri-location.service';\r\n\r\nimport './cyc-esri-map.component.scss';\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nconst CycEsriMapComponent = ({\r\n  locationObject,\r\n  featureLayersOptions: featureLayersOptionsProps,\r\n  incidentLayersOptions,\r\n  getCurrentExtent,\r\n  initialExtent,\r\n  disableFreeSelect,\r\n  enablePointSelectionAtZoomLevel,\r\n  onMapClicked,\r\n  getAllLayersDetailsOnClick,\r\n}) => {\r\n  const previousLocationObject = usePrevious(locationObject);\r\n  const previousFeatureLayersOptions = usePrevious(featureLayersOptionsProps);\r\n  const [featureLayersOptions, setFeatureLayersOptions] = useState(); // TODO: One solution can be removing initial array\r\n  const [initialFocus, setInitialFocus] = useState();\r\n  const [location, setLocation] = useState({\r\n    initialFocus: undefined,\r\n    easting: null,\r\n    northing: null,\r\n    street: null,\r\n    usrn: null,\r\n    ward: null,\r\n    parish: null,\r\n  });\r\n\r\n  const basemapLayerOptions = {\r\n    popupTemplate: {\r\n      title: 'Selected point',\r\n      generateContent: async ({ mapPoint }) => {\r\n        // Take the mapPoint from the click and retrun popup with useful info\r\n        const locationData = await getLocationDataFromPointAsync(mapPoint);\r\n        return `<table class=\"esri-widget__table\">\r\n                    <tr>\r\n                        <th>Street</th>\r\n                        <td>${locationData.street}</td>\r\n                    </tr>\r\n                    <tr>\r\n                        <th>USRN</th>\r\n                        <td>${locationData.usrn}</td>\r\n                    </tr>\r\n                </table>`;\r\n      },\r\n    },\r\n    onMapClicked: async (mapPoint) => {\r\n      const location = await getLocationDataFromPointAsync(mapPoint);\r\n      onMapClicked && onMapClicked(location);\r\n    },\r\n  };\r\n\r\n  const invalidClickPopupTemplate = {\r\n    title: 'Not in York',\r\n    content:\r\n      'We’re unable to provide services here; it’s outside of our boundary. Find <a href=\"https://www.gov.uk/find-local-council\">details of local councils</a>',\r\n  };\r\n\r\n  useEffect(() => {\r\n    // we'll need to reset the location when user goes back to the location page\r\n    // with an object selected and then clicks on missing asset checkbox\r\n    if (locationObject !== undefined) {\r\n      setLocation({\r\n        ...location,\r\n        easting: locationObject.easting,\r\n        northing: locationObject.northing,\r\n        street: locationObject.streetName,\r\n        usrn: locationObject.usrn ? locationObject.usrn.toString() : null,\r\n        ward: locationObject.ward,\r\n        parish: locationObject.parish,\r\n      });\r\n\r\n      setInitialFocus({\r\n        easting: locationObject.easting,\r\n        northing: locationObject.northing,\r\n        filter: locationObject.filter,\r\n      });\r\n    }\r\n  }, [locationObject]);\r\n\r\n  useEffect(() => {\r\n    // we need to check if the feature layers changed\r\n    // this needs to be checked manually as if any references to objects/arrays change, the map refreshes\r\n\r\n    // if feature layers options have been added or removed, change state\r\n    if (\r\n      (previousFeatureLayersOptions === undefined && featureLayersOptionsProps !== undefined) ||\r\n      (previousFeatureLayersOptions !== undefined && featureLayersOptionsProps === undefined)\r\n    ) {\r\n      setFeatureLayersOptions(featureLayersOptionsProps);\r\n      return;\r\n    }\r\n    // otherwise, if options are set\r\n    if (previousFeatureLayersOptions !== undefined && featureLayersOptionsProps !== undefined) {\r\n      // if the length has changed, set state\r\n      if (previousFeatureLayersOptions.length !== featureLayersOptionsProps.length) {\r\n        setFeatureLayersOptions(featureLayersOptionsProps);\r\n        return;\r\n      }\r\n      // otherwise, run through all the options and check if layerId has changed, set state\r\n      let shouldUpdateFeatureLayersOptions = false;\r\n      previousFeatureLayersOptions.forEach((option, index) => {\r\n        if (option.layerId !== featureLayersOptionsProps[index].layerId) {\r\n          shouldUpdateFeatureLayersOptions = true;\r\n        }\r\n      });\r\n      if (shouldUpdateFeatureLayersOptions === true) {\r\n        setFeatureLayersOptions(featureLayersOptionsProps);\r\n      }\r\n    }\r\n  }, [featureLayersOptionsProps]);\r\n\r\n  const getLocationDataFromPointAsync = async (mapPoint) => {\r\n    const streetPromise = EsriLocationService.getStreetFromPoint(mapPoint.x, mapPoint.y);\r\n    const toidPromise = EsriLocationService.getTOIDFromPoint(mapPoint.x, mapPoint.y);\r\n    const wardPromise = EsriLocationService.getWardFromPoint(mapPoint.x, mapPoint.y);\r\n    const postcodePromise = EsriLocationService.getPostcodeFromPointAsync(mapPoint.x, mapPoint.y);\r\n    const parishPromise = EsriLocationService.getParishFromPointAsync(mapPoint.x, mapPoint.y);\r\n\r\n    const [street, toid, ward, postcode, parish] = await Promise.all([\r\n      streetPromise,\r\n      toidPromise,\r\n      wardPromise,\r\n      postcodePromise,\r\n      parishPromise,\r\n    ]);\r\n\r\n    const usrn = await EsriLocationService.getUSRNFromPoint(street);\r\n\r\n    const newLocation = {\r\n      ...location,\r\n      easting: mapPoint.x,\r\n      northing: mapPoint.y,\r\n      street,\r\n      usrn,\r\n      ward,\r\n      toid,\r\n      postcode,\r\n      parish,\r\n    };\r\n\r\n    setLocation(newLocation);\r\n\r\n    return newLocation;\r\n  };\r\n\r\n  const handleMapException = (ex) => {\r\n    appInsights.trackException({ exception: new Error('Failed to load map'), properties: ex });\r\n    console.error(ex);\r\n  };\r\n\r\n  return (\r\n    <div className=\"map-container\">\r\n      <CycEsriMap\r\n        getCurrentExtent={getCurrentExtent ? getCurrentExtent : () => {}}\r\n        initialExtent={initialExtent ? initialExtent : undefined}\r\n        featureLayersOptions={featureLayersOptions}\r\n        basemapLayerOptions={disableFreeSelect ? undefined : basemapLayerOptions}\r\n        initialFocus={initialFocus}\r\n        incidentLayersOptions={incidentLayersOptions}\r\n        invalidClickOptions={invalidClickPopupTemplate}\r\n        disableClicking={false}\r\n        onException={handleMapException}\r\n        enablePointSelectionAtZoomLevel={enablePointSelectionAtZoomLevel}\r\n        getAllLayersDetailsOnClick={getAllLayersDetailsOnClick}\r\n      />\r\n    </div>\r\n  );\r\n};\r\n\r\nCycEsriMapComponent.propTypes = {\r\n  getCurrentExtent: PropTypes.func,\r\n  initialExtent: PropTypes.shape({\r\n    easting: PropTypes.number,\r\n    northing: PropTypes.number,\r\n    zoom: PropTypes.number,\r\n  }),\r\n  onMapClicked: PropTypes.func,\r\n  locationObject: PropTypes.shape({\r\n    northing: PropTypes.string,\r\n    easting: PropTypes.string,\r\n    ward: PropTypes.string,\r\n    streetName: PropTypes.string,\r\n    filter: PropTypes.string,\r\n    usrn: PropTypes.string,\r\n    parish: PropTypes.string,\r\n  }),\r\n  incidentLayersOptions: PropTypes.array,\r\n  featureLayersOptions: PropTypes.array,\r\n  disableFreeSelect: PropTypes.bool,\r\n  enablePointSelectionAtZoomLevel: PropTypes.shape({\r\n    minimum: PropTypes.number.isRequired,\r\n    maximum: PropTypes.number,\r\n  }),\r\n};\r\n\r\nexport default CycEsriMapComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { DocumentTitleComponent, PageHeaderComponent, ProgressBarComponent } from '../..';\r\nimport './incident-form.container.scss';\r\nimport MyAccountPageComponent from 'common/components/myaccount-page/my-account-page.component';\r\n\r\nconst IncidentFormContainer = ({\r\n  documentTitle,\r\n  pageHeaderText,\r\n  totalSteps,\r\n  currentStep,\r\n  displayProgressBar,\r\n  breadcrumbs,\r\n  children,\r\n}) => (\r\n  <DocumentTitleComponent title={documentTitle}>\r\n    <div className=\"App\">\r\n      <PageHeaderComponent text={pageHeaderText} breadcrumbs={breadcrumbs} />\r\n      <MyAccountPageComponent>\r\n        {displayProgressBar() === true ? (\r\n          <ProgressBarComponent totalSteps={totalSteps} currentStep={currentStep} />\r\n        ) : (\r\n          <React.Fragment />\r\n        )}\r\n        <div>{children}</div>\r\n      </MyAccountPageComponent>\r\n    </div>\r\n  </DocumentTitleComponent>\r\n);\r\n\r\nIncidentFormContainer.propTypes = {\r\n  documentTitle: PropTypes.string.isRequired,\r\n  pageHeaderText: PropTypes.string.isRequired,\r\n  totalSteps: PropTypes.number.isRequired,\r\n  currentStep: PropTypes.number.isRequired,\r\n  displayProgressBar: PropTypes.func,\r\n};\r\n\r\nexport default IncidentFormContainer;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport './additional-information.component.scss';\r\nimport { HelpTextComponent, InputLabelComponent, TextareaInputComponent } from 'cyc-react-ui-components';\r\nimport ErrorLabelHandlerComponent from '../error-handlers/error-label-handler.component';\r\n\r\n/**\r\n * Creates a <textarea> for a formik form\r\n * @param {string} value - value of the textarea (only used for showing with counter)\r\n * @param {string} className - class for the text area\r\n * @param {string} name - name for the text area\r\n * @param {string} placeholder - placeholder for the text area\r\n * @param {number} maximumCount - maximum character length for the text area, used with showCounter\r\n * @param {boolean} showCounter - reveals a counter for the text area\r\n * @param {function} handleAdditionalInformationChange - sends event back\r\n * @param {string} headerText - displays an <h2> header with this text if provided\r\n * @param {string} helpText - displays a help text if provided\r\n * @param {object} touched - the formik touched object for the embedding form\r\n * @param {object} errors - the formik errors object for the embedding form\r\n * @param {boolean} required - whether or not the additional information field is required\r\n */\r\nexport const AdditionalInformationComponent = ({\r\n  showCounter,\r\n  value,\r\n  name,\r\n  maximumCount,\r\n  className,\r\n  placeholder,\r\n  onAdditionalInformationChange,\r\n  headerText,\r\n  helpText,\r\n  touched,\r\n  errors,\r\n  required = false,\r\n}) => {\r\n  const hasError = touched && errors && touched[name] && errors[name] !== undefined;\r\n  const hasHeader = headerText && headerText.length > 0;\r\n  const hasHelpText = helpText && helpText.length > 0;\r\n\r\n  const ShowLabel = ({ hasError }) => {\r\n    return hasError ? (\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text={headerText}\r\n        id={name}\r\n        requiredInput={required}\r\n      />\r\n    ) : (\r\n      <InputLabelComponent htmlFor={name} required={required}>\r\n        {headerText}\r\n      </InputLabelComponent>\r\n    );\r\n  };\r\n\r\n  const ShowCounter = ({ showCounter }) => {\r\n    return (\r\n      showCounter && (\r\n        <span className=\"character-counter\">\r\n          <span\r\n            className={\r\n              value && value.length > maximumCount\r\n                ? 'character-counter__bold-font character-counter__error-count-exceeded'\r\n                : 'character-counter__bold-font'\r\n            }>\r\n            {value ? value.length : 0}/{maximumCount}\r\n          </span>\r\n        </span>\r\n      )\r\n    );\r\n  };\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <span id=\"additionalInformation\"></span>\r\n      {hasHeader && <ShowLabel hasError={hasError} />}\r\n\r\n      <ShowCounter showCounter={showCounter} />\r\n\r\n      <TextareaInputComponent\r\n        name={name}\r\n        placeholder={placeholder ? placeholder : 'Additional information'}\r\n        onChange={onAdditionalInformationChange}\r\n        error={hasError}\r\n        value={value}\r\n        rows=\"5\"\r\n        className={className}\r\n      />\r\n\r\n      {hasHelpText && <HelpTextComponent>{helpText}</HelpTextComponent>}\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nAdditionalInformationComponent.propTypes = {\r\n  showCounter: PropTypes.bool,\r\n  value: PropTypes.string,\r\n  name: PropTypes.string.isRequired,\r\n  maximumCount: PropTypes.number.isRequired,\r\n  className: PropTypes.string,\r\n  placeholder: PropTypes.string,\r\n  onAdditionalInformationChange: PropTypes.func.isRequired,\r\n  headerText: PropTypes.string,\r\n  helpText: PropTypes.string,\r\n  required: PropTypes.bool,\r\n};\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { CYCServices } from 'cyc-services';\r\nimport { apiMyAccountUrl } from '../constants/my-account-urls.constants';\r\n\r\nexport const createIncident = (incident) => {\r\n\r\n  // Start Debug\r\n  console.log('Incident USRN: ', incident.locationObject.USRN ? incident.locationObject.USRN.toString() : null);\r\n  console.log('Incident AssetID: ', incident.locationObject.assetId ? incident.locationObject.assetId.toString() : null);\r\n  // End Debug\r\n\r\n  const data = {\r\n    ProductId: incident.productId,\r\n    CategoryId: incident.problemId ? parseInt(incident.problemId) : null,\r\n    Easting: incident.locationObject.easting,\r\n    Northing: incident.locationObject.northing,\r\n    StreetName: incident.locationObject.streetName,\r\n    USRN: incident.locationObject.USRN ? incident.locationObject.USRN.toString() : null,\r\n    RoadNumber: incident.locationObject.roadNumber ? incident.locationObject.roadNumber : null,\r\n    Ward: incident.locationObject.ward ? incident.locationObject.ward : null,\r\n    Parish: incident.locationObject.parish ? incident.locationObject.parish : null,\r\n    Postcode: incident.locationObject.postcode ? incident.locationObject.postcode : null,\r\n    Location: incident.locationObject.location ? incident.locationObject.location : null,\r\n    AssetDescription: incident.locationObject.assetDescription ? incident.locationObject.assetDescription : null,\r\n    AssetId: incident.locationObject.assetId ? incident.locationObject.assetId : null,\r\n    AdditionalInformation: incident.additionalInformation,\r\n    FileAttachments: incident.uploadedFiles ? incident.uploadedFiles : null,\r\n    StreetLightTypeId: incident.lightingTypeId ? incident.lightingTypeId : null,\r\n    BinsTypeId: incident.binTypeId ? incident.binTypeId : null,\r\n    Subject: incident.subject,\r\n    SizeOfWasteId: incident.sizeOfWaste ? parseInt(incident.sizeOfWaste) : null,\r\n    SignTypeId: incident.signTypeId ? parseInt(incident.signTypeId) : null,\r\n    FlytippingOther: incident.problemOther,\r\n    OffensiveGraffiti: incident.offensiveGraffiti,\r\n    TOID: incident.locationObject.toid,\r\n    RoadDefectsTypeId: incident.roadDefectTypeId ? parseInt(incident.roadDefectTypeId) : null,\r\n    WaterDrainageTypeId: incident.waterDrainageTypeId ? parseInt(incident.waterDrainageTypeId) : null,\r\n    RainedInLast2HoursId: incident.hasItRained,\r\n    DangerToRoadUserId: incident.waterDangerToUser,\r\n    RiskOfInternalFloodingId: incident.riskOfInternalFlooding,\r\n    ReoccurringProblemId: incident.reocurringProblem,\r\n    GullyType: incident.gullyType,\r\n    GullyNumber: incident.gullyNumber,\r\n    StreetFurnitureTypeId: incident.streetFurnitureTypeId ? parseInt(incident.streetFurnitureTypeId) : null,\r\n    VegetationTypeId: incident.vegetationTypeId,\r\n    AdditionalProblemInformation: incident.additionalProblemInformation,\r\n  };\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.INCIDENTS}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return axios.post(url, data, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex, properties: incident });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const getIncidentDetails = async (referenceNumber, product) => {\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_INCIDENT_DETAILS}/${referenceNumber}/${product}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return axios.get(url, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex, properties: { referenceNumber } });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateIncidentWithUser = (referenceNumber, secretReferenceNumber, incidentId, emailAddress) => {\r\n  const data = {\r\n    ReferenceNumber: referenceNumber,\r\n    SecretReferenceNumber: secretReferenceNumber,\r\n    IncidentId: incidentId,\r\n    EmailAddress: emailAddress,\r\n  };\r\n\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.INCIDENTS}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n  return axios.put(url, data, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: ex,\r\n      properties: { referenceNumber, secretReferenceNumber, incidentId, emailAddress },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateIncident = async (updateDetails) => {\r\n  const data = {\r\n    IncidentId: updateDetails.incidentId,\r\n    FileAttachments: updateDetails.uploadedFiles ? updateDetails.uploadedFiles : null,\r\n    UpdateNotes: updateDetails.updateNotes === '' ? null : updateDetails.updateNotes,\r\n  };\r\n\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_INCIDENT}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return axios.put(url, data, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex, properties: updateDetails });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const getExistingIncidentsForAsset = async ({ assetId, productId, optionalincidentsToIgnore = [] }) => {\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_INCIDENTS_BY_ASSET_ID}/${assetId}`;\r\n\r\n  // Get any incidents with assetId\r\n  try {\r\n    const incidentResponse = await axios.get(url);\r\n    return incidentResponse.data;\r\n  } catch (ex) {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex, properties: { assetId, productId, optionalincidentsToIgnore } });\r\n    throw ex;\r\n  }\r\n};\r\n\r\n// Check if any live incidents with given asset and productId exisit\r\nexport const assetHasLiveIncident = async ({ assetId, productId, optionalincidentsToIgnore = [] }) => {\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_INCIDENTS_BY_ASSET_ID}/${assetId}`;\r\n\r\n  // Get any incidents with assetId\r\n  const incidentResponse = await axios.get(url).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex, properties: { assetId, productId, optionalincidentsToIgnore } });\r\n    throw ex;\r\n  });\r\n\r\n  // If the call failed just return false\r\n  // We do not want to prevent the incident being created\r\n  if (incidentResponse.status !== 200) {\r\n    return false;\r\n  }\r\n\r\n  // Now filter the incidents by the product ID and any optional incidents to ignore\r\n  const incidents = incidentResponse.data;\r\n\r\n  if (\r\n    incidents.filter(\r\n      (incident) => incident.productId === productId && !optionalincidentsToIgnore.includes(incident.incidentId)\r\n    ).length > 0\r\n  ) {\r\n    return true;\r\n  }\r\n\r\n  return false;\r\n};\r\n","import { createContext } from 'react';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nclass UserContext {\r\n  store = {\r\n    firstName: undefined,\r\n    lastName: undefined,\r\n  };\r\n\r\n  constructor() {\r\n    if (CYCServices.JWTAuth.isAuthenticated()) {\r\n      const user = CYCServices.JWTAuth.getProfile();\r\n      this.store = {\r\n        firstName: user.given_name,\r\n        lastName: user.family_name,\r\n      };\r\n    }\r\n  }\r\n\r\n  setStore = (key, value) => {\r\n    this.store[key] = value;\r\n  };\r\n}\r\n\r\nexport { UserContext };\r\nexport default createContext(new UserContext());\r\n","export const myAccountHeaderText = {\r\n  signInHeader: 'Sign in',\r\n  registerHeader: 'Register for My Account',\r\n};\r\n","export const PASSWORD_COMPLICATED_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[_\\W])(?=.{8,})/;\r\nexport const POSTCODE_REGEX = /^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$/;\r\nexport const ADDITIONAL_INFORMATION_MAX_LENGTH = +4000;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nexport const categoryIdsSettingName = 'categoryIds';\r\nexport const roadDefectTypeIdsSettingName = 'roadDefectTypeIds';\r\nexport const lightingTypesSettingName = 'lightingTypes';\r\nexport const waterandDrainageTypesSettingName = 'waterAndDrainageTypes';\r\nexport const surfaceWaterQuestionsSettingName = 'surfaceWaterQuestions';\r\nexport const streetFurnitureSettingName = 'streetFurniture';\r\nexport const dogAndLitterBinTypesSettingName = 'binTypes';\r\nexport const graffitiSettingName = 'graffiti';\r\nexport const vegetationSettingName = 'vegetation';\r\nexport const vegetationTypesSettingName = 'vegetationTypes';\r\nexport const waterAndDrainageTypeSettingsNames = {\r\n  gully: 'gully',\r\n  drain: 'drain',\r\n  ditch: 'ditch',\r\n  manholeCover: 'manholeCover',\r\n  surfaceWater: 'surfaceWater',\r\n};\r\n\r\nexport const processCategoryIdsSettingName = {\r\n  roadAndPavementProblems: 'roadAndPavementProblems',\r\n  saltBins: 'saltBins',\r\n  graffiti: 'graffiti',\r\n  flyTipping: 'flyTipping',\r\n  streetCleaning: 'streetCleaning',\r\n  streetLighting: 'streetLighting',\r\n  dogAndLitterBins: 'dogAndLitterBins',\r\n  waterAndDrainage: 'waterAndDrainage',\r\n  roadAndStreetSign: 'roadAndStreetSign',\r\n};\r\n\r\nexport const categorySettingNames = {\r\n  roadAndPavementProblems: {\r\n    parkingOnVerge: 'parkingOnVerge',\r\n    illegalCrossing: 'illegalCrossing',\r\n    damagedOrRutted: 'damagedOrRutted',\r\n    obstruction: 'obstruction',\r\n    verge: 'verge',\r\n    collapsed: 'collapsed',\r\n    pothole: 'pothole',\r\n    dippedOrCracking: 'dippedOrCracking',\r\n    unevenFlag: 'unevenFlag',\r\n    mud: 'mud',\r\n    damaged: 'damaged',\r\n    missing: 'missing',\r\n    generalCondition: 'generalCondition',\r\n  },\r\n  saltBins: {\r\n    empty: 'empty',\r\n    brokenOrDamaged: 'brokenOrDamaged',\r\n    litterInside: 'litterInside',\r\n  },\r\n  graffiti: {\r\n    ancientMonument: 'ancientMonument',\r\n    barWall: 'barWall',\r\n    fenceOrBoundaryWall: 'fenceOrBoundaryWall',\r\n    bridge: 'bridge',\r\n    bollard: 'bollard',\r\n    busShelterOrStop: 'busShelterOrStop',\r\n    bin: 'bin',\r\n    playEquipment: 'playEquipment',\r\n    houseOrBuilding: 'houseOrBuilding',\r\n    sign: 'sign',\r\n    bench: 'bench',\r\n    utilityBox: 'utilityBox',\r\n  },\r\n  flyTipping: {\r\n    asbestos: 'asbestos',\r\n    blackBags: 'blackBags',\r\n    buildingOrConstructionDebris: 'buildingOrConstructionDebris',\r\n    chemicalDrums: 'chemicalDrums',\r\n    electricalEquipment: 'electricalEquipment',\r\n    furniture: 'furniture',\r\n    gardenWaste: 'gardenWaste',\r\n    whiteGoods: 'whiteGoods',\r\n    vehicleParts: 'vehicleParts',\r\n    tyres: 'Tyres',\r\n    other: 'other',\r\n  },\r\n  streetCleaning: {\r\n    deadAnimal: 'deadAnimal',\r\n    detritus: 'detritus',\r\n    faeces: 'faeces',\r\n    floodDebris: 'floodDebris',\r\n    glass: 'glass',\r\n    litter: 'litter',\r\n    needles: 'needles',\r\n    paint: 'paint',\r\n    vomit: 'vomit',\r\n  },\r\n  streetLighting: {\r\n    unlit: 'unlit',\r\n    buzzing: 'buzzing',\r\n    corrodedColumn: 'corrodedColumn',\r\n    wiresExposed: 'wiresExposed',\r\n    doorOff: 'doorOff',\r\n    fallenDown: 'fallenDown',\r\n    flickering: 'flickering',\r\n    hangingLanternOrSign: 'hangingLanternOrSign',\r\n    hitOrLeaning: 'hitOrLeaning',\r\n    litDuringDaylight: 'litDuringDaylight',\r\n    missingParts: 'missingParts',\r\n    tooDimOrBright: 'tooDimOrBright',\r\n    missingStreetLight: 'missingStreetLight',\r\n  },\r\n  dogAndLitterBins: {\r\n    fallenOver: 'fallenOver',\r\n    overflowing: 'overflowing',\r\n    broken: 'broken',\r\n  },\r\n  streetFurniture: {\r\n    damaged: 'damaged',\r\n    hitOrLeaning: 'hitOrLeaning',\r\n    missing: 'missing',\r\n    missingBollardFlap: 'missingBollardFlap',\r\n    missingRemovableBollard: 'missingRemovableBollard',\r\n    damagedGlassPresent: 'damagedGlassPresent',\r\n    damagedNoGlassNearby: 'damagedNoGlassNearby',\r\n    requiresCleaning: 'requiresCleaning',\r\n  },\r\n};\r\n\r\nexport const categoriesToIgnoreInReports = [\r\n  {\r\n    settingName: categorySettingNames.roadAndPavementProblems.generalCondition,\r\n    drillDownArray: [categoryIdsSettingName, processCategoryIdsSettingName.roadAndPavementProblems],\r\n  },\r\n];\r\n","export const mapConstants = {\r\n  enablePointSelectionZoomLevels: {\r\n    minimum: 9,\r\n  },\r\n  unadoptedLayerId: 'unadoptedLayer',\r\n};\r\n","export const ChangeName = 'ChangeName';\r\nexport const GraffitiForm = 'GraffitiForm';\r\nexport const RoadAndPavementProblemsForm = 'RoadAndPavementProblemsForm';\r\nexport const ReportDetailsOutcome = 'ReportDetailsOutcome';\r\nexport const WaterAndDrainageProblemsForm = 'WaterAndDrainageProblemsForm';\r\nexport const StreetFurnitureForm = 'StreetFurnitureForm';\r\nexport const DogAndLitterBinsForm = 'DogAndLitterBins';\r\nexport const RefuseAndRecycling = 'RefuseAndRecycling';\r\nexport const MyCollections = 'MyCollections';\r\nexport const RoadAndStreetSignForm = 'RoadAndStreetSignForm';\r\nexport const UnadoptedLayerFlag = 'UnadoptedLayer';\r\nexport const MissingAssetsFlag = 'MissingAssets';\r\nexport const MissingAssetsStreetLightingFlag = 'MissingAssetsStreetLighting';\r\nexport const VegetationForm = 'VegetationForm';\r\nexport const DownForMaintenance = 'DownForMaintenance';\r\nexport const ChangeAddressMaintenance = 'ChangeAddressMaintenance';\r\nexport const RegistrationMaintenance = 'RegistrationMaintenance';\r\nexport const ParkingServices = 'ParkingServices';\r\nexport const TestingPage = 'TestingPage';\r\n","export const incidentSourceIdsSettingName = 'incidentSourceIds';\r\nexport const incidentSourceSettingNames = {\r\n  webchat: 'liveChat',\r\n};\r\n","import * as Yup from 'yup';\r\n\r\nexport const equalTo = (ref, msg) => {\r\n  return Yup.mixed().test({\r\n    name: 'equalTo',\r\n    exclusive: false,\r\n    message: msg || `${this.path} must be the same as ${this.reference}`,\r\n    params: {\r\n      reference: ref.path,\r\n    },\r\n    // Below cannot be converted to ES6. Yup gets angry\r\n    test: function (value) {\r\n      return value !== undefined ? value === this.resolve(ref) : true;\r\n    },\r\n  });\r\n};\r\n","import { PASSWORD_COMPLICATED_REGEX, POSTCODE_REGEX } from '../constants/validation.constants';\r\n\r\n// Checks if the value is a number and is the has 11 digits\r\nexport const isValidTelephoneNumber = (phoneNumber) => {\r\n  // Return false if input is not a number or string\r\n  if (phoneNumber === undefined || phoneNumber === null) return false;\r\n\r\n  // Convert to string to preserve leading 0 and remove white space\r\n  const numberToString = phoneNumber.toString().replace(/\\s/g, '');\r\n\r\n  // Return false if there is anything but numbers in there\r\n  if (numberToString.match(/^[0-9]+$/)) {\r\n    // Keep the number as string to preserve leading 0\r\n    return numberToString.replace(/\\s/g, '').match(/\\d/g).length === 11;\r\n  } else {\r\n    return false;\r\n  }\r\n};\r\n\r\n// Checks to make sure that the password is complicated enough\r\n// Allow empty value means it will return true if it's empty\r\nexport const IsValidComplexPassword = (value, allowEmptyValue = false) => {\r\n  // Allow empty as this is resolved through formik\r\n  if (allowEmptyValue === true && (value === '' || value === undefined)) {\r\n    return true;\r\n  }\r\n\r\n  const doesItMatch = value.match(PASSWORD_COMPLICATED_REGEX);\r\n  return doesItMatch !== null;\r\n};\r\n\r\nexport const isValidPostcode = (value, allowEmptyValue = false) => {\r\n  if (value === '' || value === undefined) {\r\n    return allowEmptyValue;\r\n  }\r\n\r\n  if (value.trim().match(POSTCODE_REGEX) !== null) {\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n","/**\r\n * Checks if the feature exists and whether it is enabled.\r\n * @param {any} flagState \r\n * @returns true if enabled or false if not\r\n */\r\nexport const isEnabled = (flagState) => flagState === 0;\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { CYCServices } from 'cyc-services';\r\nimport { apiMyAccountUrl } from '../../common';\r\n\r\nconst AUTH_FAILURE_MESSAGE = 'Not authenticated';\r\n\r\nexport const postChangePasswordAsync = async (CurrentPassword, NewPassword, ConfirmPassword) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.MANAGE_CHANGE_PASSWORD}`;\r\n  const data = { CurrentPassword, NewPassword, ConfirmPassword };\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return axios.post(address, data, config).catch((ex) => {\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to post passwordChange'),\r\n      properties: { newPasswordsMatch: NewPassword === ConfirmPassword },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const getContactDetailAsync = async (withAddress) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_CONTACT_DETAIL}`;\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n    params: { withAddress },\r\n  };\r\n\r\n  return axios.get(address, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: new Error('Failed to get contact details'), properties: { withAddress } });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateContactPreferencesAsync = async (shareContactDetails) => {\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_PREFERENCES}`;\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return await axios.post(address, { ShareContactDetails: shareContactDetails }, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to update contact preferences'),\r\n      properties: { shareContactDetails },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateContactEmailAsync = async (newEmailAddress, password) => {\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_EMAIL_ADDRESS}`;\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return await axios.post(address, { NewEmailAddress: newEmailAddress, Password: password }, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to update email address'),\r\n      properties: { newEmailAddress, password },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const postEmailConfirmation = (userId, code) => {\r\n  const address = `${ConfigurationService.store.apiUrl}/${apiMyAccountUrl.CONFIRM_UPDATE_CONTACT_EMAIL_ADDRESS}?userId=${userId}&code=${code}`;\r\n\r\n  return axios.get(address).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: new Error('Failed to confirm email from token'), properties: { userId } });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateContactAsync = async (contactDetail) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_PROFILE}`;\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return await axios.post(address, contactDetail, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: new Error('Failed to update contact details'), properties: contactDetail });\r\n    throw ex;\r\n  });\r\n};\r\nexport const updateContactNameAsync = async (firstName, lastName) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) {\r\n    return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n  }\r\n\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_NAME}`;\r\n  const config = {\r\n    headers: {\r\n      Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}`,\r\n    },\r\n  };\r\n\r\n  return axios.post(address, { firstName, lastName }, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to update contact name'),\r\n      properties: { firstName, lastName },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateContactAddressAsync = async (addressDetails) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) {\r\n    return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n  }\r\n\r\n  const address = {\r\n    ...addressDetails,\r\n    easting: addressDetails.easting.toString(),\r\n    northing: addressDetails.northing.toString(),\r\n  };\r\n\r\n  const addressUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_ADDRESS}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return await axios.post(addressUrl, address, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to update contact address'),\r\n      properties: address,\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const updateContactPhoneAsync = async (phoneNumber) => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_PHONE}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return await axios.post(address, { TelephoneNumber: phoneNumber }, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: new Error('Failed to update phone number') });\r\n    throw ex;\r\n  });\r\n};\r\n","import React from 'react';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { postChangePasswordAsync } from '../../services/account.service';\r\nimport {\r\n  equalTo,\r\n  msgConstants,\r\n  PASSWORD_COMPLICATED_REGEX,\r\n  NetworkCatchErrorComponent,\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\nimport {\r\n  HelpTextComponent,\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nYup.addMethod(Yup.string, 'equalTo', equalTo);\r\n\r\n// The actual form to implement\r\nconst changePasswordForm = ({ values, errors, touched, handleSubmit, submitCount, setFieldValue }) => (\r\n  <Form noValidate>\r\n    <NetworkCatchErrorComponent didCatchError={values.submitError} customMessage={values.submitErrorMsg} />\r\n    {Object.keys(errors).length > 0 &&\r\n    touched.currentPassword &&\r\n    touched.newPassword &&\r\n    touched.confirmPassword &&\r\n    submitCount > 0 ? (\r\n      <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent touched={touched} errors={errors} text=\"Current password\" id=\"currentPassword\" />\r\n        <TextInputComponent\r\n          type=\"password\"\r\n          name=\"currentPassword\"\r\n          id=\"currentPassword\"\r\n          value={values.currentPassword}\r\n          onChange={(e) => setFieldValue('currentPassword', e.target.value)}\r\n          error={errors.currentPassword && touched.currentPassword}\r\n        />\r\n        {errors.currentPassword && touched.currentPassword && (\r\n          <InputErrorComponent>{errors.currentPassword}</InputErrorComponent>\r\n        )}\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent touched={touched} errors={errors} text=\"New password\" id=\"newPassword\" />\r\n        <TextInputComponent\r\n          type=\"password\"\r\n          name=\"newPassword\"\r\n          id=\"newPassword\"\r\n          value={values.newPassword}\r\n          onChange={(e) => setFieldValue('newPassword', e.target.value)}\r\n          error={errors.newPassword && touched.newPassword}\r\n        />\r\n        {errors.newPassword && touched.newPassword && <InputErrorComponent>{errors.newPassword}</InputErrorComponent>}\r\n        <HelpTextComponent>\r\n          Help: Password must be at least 8 characters and contain at least 1 uppercase letter, 1 lowercase letter, 1\r\n          number and 1 special character\r\n        </HelpTextComponent>\r\n      </div>\r\n    </div>\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text=\"Confirm new password\"\r\n          id=\"confirmPassword\"\r\n        />\r\n        <TextInputComponent\r\n          type=\"password\"\r\n          name=\"confirmPassword\"\r\n          id=\"confirmPassword\"\r\n          value={values.confirmPassword}\r\n          onChange={(e) => setFieldValue('confirmPassword', e.target.value)}\r\n          error={errors.confirmPassword && touched.confirmPassword}\r\n        />\r\n        {errors.confirmPassword && touched.confirmPassword && (\r\n          <InputErrorComponent>{errors.confirmPassword}</InputErrorComponent>\r\n        )}\r\n        <HelpTextComponent>Help: Please re-enter your new password</HelpTextComponent>\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <SubmitButtonAxiosComponent\r\n          type=\"submit\"\r\n          className={ButtonClasses.primary + ' float-right'}\r\n          url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.MANAGE_CHANGE_PASSWORD}`}\r\n          onClick={handleSubmit}\r\n        />\r\n        <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n          Back to My Account\r\n        </Link>\r\n      </div>\r\n    </div>\r\n  </Form>\r\n);\r\n\r\n// This is what is used anywhere in the app\r\nconst ChangePasswordFormComponent = withFormik({\r\n  mapPropsToValues({ currentPassword = '', newPassword = '', confirmPassword = '', handleRedirect }) {\r\n    return {\r\n      currentPassword: currentPassword || '',\r\n      newPassword: newPassword || '',\r\n      confirmPassword: confirmPassword || '',\r\n      submitError: false,\r\n      submitErrorMsg: undefined,\r\n      handleRedirect: handleRedirect || console.log('redirect not handled'),\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    currentPassword: Yup.string()\r\n      .min(8, \"'Current password' - Error: this password does not appear to be valid. Please re-enter.\")\r\n      .required(\"Please supply details for 'Current password'.\"),\r\n    newPassword: Yup.string()\r\n      .required(\"Please supply details for 'New password'.\")\r\n      .matches(PASSWORD_COMPLICATED_REGEX, msgConstants.NEW_PASSWORD_COMPLICATED_MESSAGE),\r\n    confirmPassword: Yup.string()\r\n      .equalTo(\r\n        Yup.ref('newPassword'),\r\n        \"'Confirm new password' - Error: this password does not appear to match. Please re-enter.\"\r\n      )\r\n      .required(\"Please supply details for 'Confirm new password'.\"),\r\n  }),\r\n  handleSubmit(values, { setValues, setSubmitting, setFieldValue, resetForm, setFieldError }) {\r\n    if (values.currentPassword === values.newPassword) {\r\n      setFieldError('newPassword', 'Error: Your new password cannot be the same as your current password');\r\n      setSubmitting(false);\r\n      return;\r\n    }\r\n    postChangePasswordAsync(values.currentPassword, values.newPassword, values.confirmPassword)\r\n      .then((response) => {\r\n        if (response.status === 200) {\r\n          setValues({\r\n            currentPassword: '',\r\n            newPassword: '',\r\n            confirmPassword: '',\r\n          });\r\n          values.handleRedirect();\r\n        }\r\n      })\r\n      .catch((error) => {\r\n        resetForm();\r\n        setSubmitting(false);\r\n        if (error !== undefined && error.response !== undefined && error.response.status === 400) {\r\n          setFieldValue('submitError', true);\r\n          setFieldValue('submitErrorMsg', 'Unable to change password, please try again.');\r\n        } else {\r\n          setFieldValue('submitError', true);\r\n        }\r\n      });\r\n  },\r\n})(changePasswordForm);\r\n\r\nexport default ChangePasswordFormComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport ChangePasswordForm from '../components/change-password-form.component';\r\nimport {\r\n  clientMyAccountUrl,\r\n  PageHeaderComponent,\r\n  DocumentTitleComponent,\r\n  MyAccountPageComponent,\r\n} from '../../../common';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst ChangePasswordContainer = () => {\r\n  const navigation = useNavigate();\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Change password\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - change password\">\r\n          <ChangePasswordForm\r\n            handleRedirect={() =>\r\n              navigation(clientMyAccountUrl.account.root + clientMyAccountUrl.account.password.changeSuccessful)\r\n            }\r\n          />\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nChangePasswordContainer.propTypes = {\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ChangePasswordContainer;\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { MyAccountPageComponent } from '../../../common';\r\n\r\nimport { clientMyAccountUrl, PageHeaderComponent } from '../../../common';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst ChangePasswordSuccessComponent = () => (\r\n  <WithAuthentication>\r\n    <PageHeaderComponent text=\"Change of password confirmation\" icon=\"icon-website\" />\r\n    <MyAccountPageComponent>\r\n      <p>Thank you. Your password has been changed and we will send you confirmation by email shortly.</p>\r\n      <p>\r\n        Back to <Link to={clientMyAccountUrl.dashboard}>My Account</Link>\r\n      </p>\r\n    </MyAccountPageComponent>\r\n  </WithAuthentication>\r\n);\r\n\r\nChangePasswordSuccessComponent.propTypes = {\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ChangePasswordSuccessComponent;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { isEnabled } from '../../../common';\r\nimport { clientMyAccountUrl, SummaryTableComponent } from '../../../common';\r\nimport * as featureFlagConstants from '../../../common/constants/feature-flag.constants';\r\n\r\nconst AccountDetailsComponent = ({ results }) => {\r\n  const [accountDetails, setAccountDetails] = useState([]);\r\n\r\n  useEffect(() => {\r\n    if (results) {\r\n      const accountDetails = [\r\n        { columnOne: 'First name', columnTwo: results.firstName },\r\n        { columnOne: 'Last name', columnTwo: results.lastName },\r\n        {\r\n          columnOne: 'Email address',\r\n          columnTwo: results.primaryEmail,\r\n          link: `${clientMyAccountUrl.account.root}${clientMyAccountUrl.account.email.change}`,\r\n        },\r\n        {\r\n          columnOne: 'Telephone number',\r\n          columnTwo: results.phoneNumber,\r\n          link: `${clientMyAccountUrl.account.root}${clientMyAccountUrl.account.phone.change}`,\r\n        },\r\n        {\r\n          columnOne: 'Address',\r\n          columnTwo: results.address,\r\n          link: `${clientMyAccountUrl.account.root}${clientMyAccountUrl.account.address.change}`,\r\n        },\r\n      ];\r\n\r\n      if (isEnabled(FeatureFlagsService.getFeatureFlagByName(featureFlagConstants.ChangeName))) {\r\n        accountDetails[0].link = `${clientMyAccountUrl.account.root}${clientMyAccountUrl.account.name.change}`;\r\n        accountDetails[1].link = `${clientMyAccountUrl.account.root}${clientMyAccountUrl.account.name.change}`;\r\n      }\r\n\r\n      setAccountDetails(accountDetails);\r\n    }\r\n  }, [results]);\r\n\r\n  return (\r\n    <div className=\"account-details\">\r\n      <p>\r\n        Currently to update your name in My Account please <a href=\"https://www.york.gov.uk/ContactUs\">contact us</a>.\r\n        Find out more about <a href=\"https://www.york.gov.uk/myaccounthelp#upgrades\">My Account upgrades</a>.\r\n      </p>\r\n      <p>\r\n        If you’re responsible for paying council tax you must{' '}\r\n        <a href=\"https://www.york.gov.uk/info/20004/council_tax/6/moving_to_another_property\">\r\n          update your address in our Council Tax system\r\n        </a>{' '}\r\n        too, as this cannot be processed automatically.\r\n      </p>\r\n      <SummaryTableComponent headerOne=\"\" headerTwo=\"Details\" linkHeader=\"Change\" rowData={accountDetails} />\r\n      <p>\r\n        <Link to={clientMyAccountUrl.dashboard}>Back to My Account</Link>\r\n      </p>\r\n    </div>\r\n  );\r\n};\r\n\r\nAccountDetailsComponent.propTypes = {\r\n  results: PropTypes.shape({\r\n    firstName: PropTypes.string,\r\n    lastName: PropTypes.string,\r\n    primaryEmail: PropTypes.string,\r\n    phoneNumber: PropTypes.string,\r\n    address: PropTypes.string,\r\n  }),\r\n};\r\nexport default AccountDetailsComponent;\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { getContactDetailAsync } from '../../services/account.service';\r\nimport {\r\n  NetworkLoaderComponent,\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n} from '../../../common';\r\n\r\nimport AccountDetailsComponent from '../components/account-details.component';\r\nimport '../account-details.scss';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst AccountDetailsContainer = () => {\r\n  const [accountDetails, setAccountDetails] = useState({});\r\n  const [accountDetailsPromise, setAccountDetailsPromise] = useState();\r\n  useEffect(() => {\r\n    const accountDetailsPromise = getContactDetailAsync(true);\r\n    setAccountDetailsPromise(accountDetailsPromise);\r\n\r\n    accountDetailsPromise.then((response) => setAccountDetails(response.data));\r\n  }, []);\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Contact details\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - contact details\">\r\n          {accountDetailsPromise !== undefined && (\r\n            <NetworkLoaderComponent request={accountDetailsPromise}>\r\n              <AccountDetailsComponent results={accountDetails} />\r\n            </NetworkLoaderComponent>\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default AccountDetailsContainer;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link, useNavigate } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  ButtonClasses,\r\n  InputLabelComponent,\r\n  SubmitButtonAxiosComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  NetworkLoaderComponent,\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\nimport { getContactDetailAsync, updateContactPreferencesAsync } from '../../services/account.service';\r\nimport NetworkCatchErrorComponent from '../../../common/components/error-handlers/network-catch-error.component';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst CommunicationPreferenceContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [componentLoadPromise, setComponentLoadPromise] = useState(undefined);\r\n  const [shareContactDetails, setShareContactDetails] = useState(null);\r\n  const [submitError, setSubmitError] = useState(false);\r\n\r\n  useEffect(() => {\r\n    const componentLoadPromise = getContactDetailAsync(false);\r\n    setComponentLoadPromise(componentLoadPromise);\r\n\r\n    componentLoadPromise\r\n      .then((results) => setShareContactDetails(results.data.shareContactDetails))\r\n      .catch(() => setSubmitError(true));\r\n  }, []);\r\n\r\n  // Whenever the user changes preference\r\n  const updateShareContactDetailsHandler = () => {\r\n    setShareContactDetails(!shareContactDetails);\r\n    setSubmitError(false);\r\n  };\r\n\r\n  // Posts to API\r\n  const submitShareContactDetailsHandler = () => {\r\n    setSubmitError(false);\r\n\r\n    updateContactPreferencesAsync(shareContactDetails)\r\n      .then((response) => {\r\n        if (response.status === 204) {\r\n          navigate(clientMyAccountUrl.dashboard);\r\n        } else {\r\n          setSubmitError(true);\r\n        }\r\n      })\r\n      .catch(() => {\r\n        setSubmitError(true);\r\n      });\r\n  };\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Communication preferences\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - contact details\">\r\n          {componentLoadPromise !== undefined ? (\r\n            <NetworkLoaderComponent request={componentLoadPromise}>\r\n              <div>\r\n                <NetworkCatchErrorComponent didCatchError={submitError} />\r\n                <p>If you agree, we'll use your contact details to send you relevant information about our services.</p>\r\n                <InputLabelComponent>\r\n                  Would you like to receive relevant information from City of York Council? (Required)\r\n                </InputLabelComponent>\r\n\r\n                <div id=\"shareContactDetails\">\r\n                  <RadiobuttonInputComponent\r\n                    name=\"shareContactDetails\"\r\n                    value={shareContactDetails}\r\n                    onChange={updateShareContactDetailsHandler}\r\n                    options={[\r\n                      { value: true, label: 'Yes, I agree to my contact details being used for this purpose' },\r\n                      { value: false, label: 'No, I do not agree to my contact details being used for this purpose' },\r\n                    ]}\r\n                  />\r\n                </div>\r\n\r\n                <div>\r\n                  <SubmitButtonAxiosComponent\r\n                    className={ButtonClasses.primary + ' float-right'}\r\n                    onClick={submitShareContactDetailsHandler}\r\n                    url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_PREFERENCES}`}\r\n                  />\r\n                  <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n                    Back to My Account\r\n                  </Link>\r\n                </div>\r\n              </div>\r\n            </NetworkLoaderComponent>\r\n          ) : (\r\n            <React.Fragment />\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default CommunicationPreferenceContainer;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  equalTo,\r\n  NetworkCatchErrorComponent,\r\n  msgConstants,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../../common';\r\nimport {\r\n  TextInputComponent,\r\n  HelpTextComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nYup.addMethod(Yup.string, 'equalTo', equalTo);\r\n\r\nconst ChangeEmailForm = ({ errors, touched, values, handleSubmit, submitCount, setFieldValue }) => (\r\n  <Form noValidate>\r\n    <NetworkCatchErrorComponent didCatchError={values.submitError} />\r\n    {Object.keys(errors).length > 0 && submitCount > 0 && touched.email && touched.confirmEmail && touched.password ? (\r\n      <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n    ) : null}\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <p>\r\n          <b>Current email address: </b> {values.currentEmail}\r\n        </p>\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <p>\r\n          Enter your new email address. You will need to verify your new email address before you are able to use it to\r\n          sign in to My Account.\r\n        </p>\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text=\"New email address\"\r\n          id=\"email\"\r\n          submitCount={submitCount}\r\n        />\r\n        <TextInputComponent\r\n          name=\"email\"\r\n          type=\"email\"\r\n          id=\"email\"\r\n          value={values.email}\r\n          onChange={(e) => setFieldValue('email', e.target.value)}\r\n          error={errors.email && touched.email && submitCount > 0}\r\n        />\r\n        {errors.email && touched.email && submitCount > 0 && <InputErrorComponent>{errors.email}</InputErrorComponent>}\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text=\"Confirm new email address\"\r\n          id=\"confirmEmail\"\r\n          submitCount={submitCount}\r\n        />\r\n        <TextInputComponent\r\n          name=\"confirmEmail\"\r\n          type=\"email\"\r\n          id=\"confirmEmail\"\r\n          value={values.confirmEmail}\r\n          onChange={(e) => setFieldValue('confirmEmail', e.target.value)}\r\n          error={errors.confirmEmail && touched.confirmEmail && submitCount > 0}\r\n        />\r\n        {errors.confirmEmail && touched.confirmEmail && submitCount > 0 && (\r\n          <InputErrorComponent>{errors.confirmEmail}</InputErrorComponent>\r\n        )}\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text=\"Password\"\r\n          id=\"password\"\r\n          submitCount={submitCount}\r\n        />\r\n        <TextInputComponent\r\n          name=\"password\"\r\n          type=\"password\"\r\n          id=\"password\"\r\n          value={values.password}\r\n          onChange={(e) => setFieldValue('password', e.target.value)}\r\n          error={errors.password && touched.password && submitCount > 0}\r\n        />\r\n        <HelpTextComponent>\r\n          Help: For security reasons, enter your My Account password to confirm your changes\r\n        </HelpTextComponent>\r\n        {errors.password && touched.password && <InputErrorComponent>{errors.password}</InputErrorComponent>}\r\n      </div>\r\n    </div>\r\n\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <SubmitButtonAxiosComponent\r\n          type=\"submit\"\r\n          className={ButtonClasses.primary + ' float-right'}\r\n          url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_EMAIL_ADDRESS}`}\r\n          onClick={handleSubmit}\r\n        />\r\n        <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n          Back to My Account\r\n        </Link>\r\n      </div>\r\n    </div>\r\n  </Form>\r\n);\r\n\r\nconst ChangeEmailComponent = withFormik({\r\n  mapPropsToValues({ currentEmail, onSuccessfulChange, onSubmit }) {\r\n    return {\r\n      currentEmail: currentEmail,\r\n      email: '',\r\n      confirmEmail: '',\r\n      password: '',\r\n      onSuccessfulChange,\r\n      onSubmit,\r\n      submitError: false,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    email: Yup.string()\r\n      .notOneOf(\r\n        [Yup.ref('currentEmail')],\r\n        \"'New email address' -  Error: You are already using this email address. Please re-enter.\"\r\n      )\r\n      .email(\"'New email address' - Error: this email address does not appear to be valid. Please re-enter.\")\r\n      .required(\"Please supply details for 'New email address'.\"),\r\n\r\n    confirmEmail: Yup.string()\r\n      .equalTo(\r\n        Yup.ref('email'),\r\n        \"'Confirm new email address' 'Confirm email address' - Error: email addresses do not match. Please re-enter.\"\r\n      )\r\n      .required(\"Please supply details for 'Confirm new email address'.\"),\r\n\r\n    password: Yup.string().required(\"Please supply details for 'Password'.\"),\r\n  }),\r\n  handleSubmit(values, { setSubmitting, setFieldError, setFieldValue }) {\r\n    values\r\n      .onSubmit(values.email, values.password)\r\n      .then((res) => {\r\n        if (res.status === 200) {\r\n          values.onSuccessfulChange();\r\n        } else {\r\n          setFieldValue('submitError', true);\r\n          setSubmitting(false);\r\n        }\r\n      })\r\n      .catch((error) => {\r\n        setSubmitting(false);\r\n        // If the my account server is unresponsive\r\n        if (error === undefined || error.response === undefined) {\r\n          setFieldValue('submitError', true);\r\n          return;\r\n        }\r\n        // My account responsive with error codes\r\n        if (error.response.status === 401) {\r\n          setSubmitting(false);\r\n          setFieldError('password', msgConstants.PASSWORD_SIMPLE_MESSAGE);\r\n        } else {\r\n          // Catch all other error codes\r\n          setFieldValue('submitError', true);\r\n          setSubmitting(false);\r\n        }\r\n      });\r\n  },\r\n})(ChangeEmailForm);\r\n\r\nChangeEmailComponent.propTypes = {\r\n  currentEmail: PropTypes.string,\r\n  onSuccessfulChange: PropTypes.func.isRequired,\r\n  onSubmit: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ChangeEmailComponent;\r\n\r\nexport { ChangeEmailForm };\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { getContactDetailAsync, updateContactEmailAsync } from '../../services/account.service';\r\nimport ChangeEmailComponent from '../components/email-change/change-email.component';\r\nimport {\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  clientMyAccountUrl,\r\n  NetworkLoaderComponent,\r\n} from '../../../common';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst ChangeEmailContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [currentEmail, setCurrentEmail] = useState();\r\n  const [currentEmailPromise, setCurrentEmailPromise] = useState();\r\n\r\n  useEffect(() => {\r\n    const currentEmailPromise = getContactDetailAsync(false);\r\n    setCurrentEmailPromise(currentEmailPromise);\r\n\r\n    currentEmailPromise\r\n      .then((response) => setCurrentEmail(response.data.primaryEmail))\r\n      .catch((error) => error && console.error(error));\r\n  }, []);\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Change email address\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - change email\">\r\n          {currentEmailPromise !== undefined && (\r\n            <NetworkLoaderComponent request={currentEmailPromise}>\r\n              <ChangeEmailComponent\r\n                onSuccessfulChange={() =>\r\n                  navigate(clientMyAccountUrl.account.root + clientMyAccountUrl.account.email.confirmation)\r\n                }\r\n                onSubmit={(newEmail, password) => updateContactEmailAsync(newEmail, password)}\r\n                currentEmail={currentEmail}\r\n              />\r\n            </NetworkLoaderComponent>\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default ChangeEmailContainer;\r\n","import WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport {\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  clientMyAccountUrl,\r\n} from '../../../../common';\r\n\r\nconst ChangeEmailConfirmationComponent = () => (\r\n  <WithAuthentication>\r\n    <DocumentTitleComponent title=\"My account - change email\">\r\n      <PageHeaderComponent text=\"Change email address\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <p>Thank you for submitting your change of email address.</p>\r\n\r\n        <p>We've sent you an email to verify your new email address. If you don't receive this email:</p>\r\n\r\n        <ul>\r\n          <li>\r\n            <p>please check your junk folders in your email account</p>\r\n          </li>\r\n          <li>\r\n            <p>you may have entered an incorrect email address in the change email address form</p>\r\n          </li>\r\n        </ul>\r\n\r\n        <p>You'll need to verify your new email address before you are able to use it to sign in to My Account.</p>\r\n        <p>You should also receive a message at your old email address confirming the change to your account.</p>\r\n\r\n        <p>\r\n          Please <a href=\"https://www.york.gov.uk/contactus\">contact us</a> if you haven't received the verification\r\n          email or need further assistance.\r\n        </p>\r\n\r\n        <p>\r\n          Back to <Link to={clientMyAccountUrl.dashboard}>My Account</Link>.\r\n        </p>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  </WithAuthentication>\r\n);\r\n\r\nexport default ChangeEmailConfirmationComponent;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nimport {\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  clientMyAccountUrl,\r\n  NetworkLoaderComponent,\r\n  NetworkCatchErrorComponent,\r\n  msgConstants,\r\n} from '../../../../common';\r\nimport { postEmailConfirmation } from '../../../services/account.service';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\n\r\nconst ChangeEmailSuccessComponent = () => {\r\n  const navigate = useNavigate();\r\n  const [componentLoadPromise, setComponentLoadPromise] = useState();\r\n  const [submitError, setSubmitError] = useState(false);\r\n  const [submitErrorMessage, setSubmitErrorMessage] = useState('');\r\n  const [searchParams] = useSearchParams();\r\n\r\n  useEffect(() => {\r\n    const userId = searchParams.get('userId');\r\n    const code = searchParams.get('code');\r\n\r\n    // Log the user out\r\n    CYCServices.JWTAuth.signOut();\r\n\r\n    const componentLoadPromise = postEmailConfirmation(userId, code);\r\n    setComponentLoadPromise(componentLoadPromise);\r\n    componentLoadPromise\r\n      .then((response) => {\r\n        if (response.status !== 200) {\r\n          setSubmitError(true);\r\n          setSubmitErrorMessage(msgConstants.GENERIC_API_ERROR);\r\n        }\r\n      })\r\n      .catch((error) => {\r\n        setSubmitError(true);\r\n        setSubmitErrorMessage(msgConstants.GENERIC_API_ERROR);\r\n        error && console.error(error);\r\n      });\r\n  }, []);\r\n\r\n  return (\r\n    <DocumentTitleComponent title=\"My account - change email\">\r\n      <PageHeaderComponent text=\"My Account change email address confirmation\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        {componentLoadPromise !== undefined && (\r\n          <NetworkLoaderComponent request={componentLoadPromise}>\r\n            <NetworkCatchErrorComponent didCatchError={submitError} customMessage={submitErrorMessage} />\r\n            {submitError === false && (\r\n              <p>Thank you for verifying your My Account email address. You can now sign in to My Account.</p>\r\n            )}\r\n\r\n            <div className=\"row\">\r\n              <div className=\"col\">\r\n                <ButtonComponent\r\n                  type=\"button\"\r\n                  className={ButtonClasses.primary + ' float-right'}\r\n                  onClick={() => navigate(clientMyAccountUrl.signIn)}>\r\n                  Sign in\r\n                </ButtonComponent>\r\n              </div>\r\n            </div>\r\n          </NetworkLoaderComponent>\r\n        )}\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nexport default ChangeEmailSuccessComponent;\r\n","import React from 'react';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  isValidTelephoneNumber,\r\n  NetworkCatchErrorComponent,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\nimport {\r\n  HelpTextComponent,\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst changePhonenumberForm = ({ errors, touched, values, handleSubmit, submitCount, setFieldValue }) => (\r\n  <Form noValidate>\r\n    <NetworkCatchErrorComponent didCatchError={values.submitError} />\r\n    {Object.keys(errors).length > 0 && touched.telephone && submitCount > 0 ? (\r\n      <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <p>\r\n          <b>Current telephone number: </b> {values.phoneNumber}\r\n        </p>\r\n      </div>\r\n    </div>\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <ErrorLabelHandlerComponent\r\n          touched={touched}\r\n          errors={errors}\r\n          text=\"New telephone number\"\r\n          id=\"telephone\"\r\n          submitCount={submitCount}\r\n        />\r\n        <TextInputComponent\r\n          type=\"tel\"\r\n          pattern=\"[0-9\\s]*\"\r\n          name=\"telephone\"\r\n          id=\"telephone\"\r\n          value={values.telephone}\r\n          onChange={(e) => setFieldValue('telephone', e.target.value)}\r\n          error={errors.telephone && touched.telephone && submitCount > 0}\r\n        />\r\n        {errors.telephone && touched.telephone && submitCount > 0 && (\r\n          <InputErrorComponent>{errors.telephone}</InputErrorComponent>\r\n        )}\r\n        <HelpTextComponent>Help: Provide a mobile or home telephone number</HelpTextComponent>\r\n      </div>\r\n    </div>\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <SubmitButtonAxiosComponent\r\n          type=\"submit\"\r\n          className={ButtonClasses.primary + ' float-right'}\r\n          url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_PHONE}`}\r\n          onClick={handleSubmit}\r\n        />\r\n        <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n          Back to My Account\r\n        </Link>\r\n      </div>\r\n    </div>\r\n  </Form>\r\n);\r\n\r\nconst ChangePhonenumberComponent = withFormik({\r\n  mapPropsToValues({ phoneNumber, onSubmit, onSuccessfulChange }) {\r\n    return {\r\n      phoneNumber: phoneNumber || '',\r\n      onSubmit: onSubmit || null,\r\n      onSuccessfulChange: onSuccessfulChange || null,\r\n      telephone: '',\r\n      submitError: false,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    telephone: Yup.string()\r\n      .required(\"Please supply details for 'New telephone number'.\")\r\n      .test(\r\n        'telephone',\r\n        \"'New telephone number' - Error: This does not appear to be a valid telephone number. Please re-enter.\",\r\n        (value) => isValidTelephoneNumber(value, true)\r\n      ),\r\n  }),\r\n  handleSubmit(values, { setSubmitting, setFieldValue }) {\r\n    values\r\n      .onSubmit(values.telephone)\r\n      .then((res) => {\r\n        if (res.status === 200) {\r\n          values.onSuccessfulChange();\r\n        }\r\n      })\r\n      .catch((ex) => {\r\n        setFieldValue('submitError', true);\r\n        setSubmitting(false);\r\n      });\r\n  },\r\n})(changePhonenumberForm);\r\n\r\nexport default ChangePhonenumberComponent;\r\n\r\nChangePhonenumberComponent.propTypes = {\r\n  phoneNumber: PropTypes.string,\r\n  onSubmit: PropTypes.func.isRequired,\r\n  onSuccessfulChange: PropTypes.func.isRequired,\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { getContactDetailAsync, updateContactPhoneAsync } from '../../services/account.service';\r\nimport ChangePhonenumberComponent from '../components/change-phone-number.component';\r\n\r\nimport {\r\n  NetworkLoaderComponent,\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  clientMyAccountUrl,\r\n} from '../../../common';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst ChangePhonenumberContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [phoneNumber, setPhoneNumber] = useState('');\r\n  const [phoneNumberPromise, setPhoneNumberPromise] = useState();\r\n\r\n  useEffect(() => {\r\n    const phoneNumberPromise = getContactDetailAsync(false);\r\n    setPhoneNumberPromise(phoneNumberPromise);\r\n\r\n    phoneNumberPromise\r\n      .then((response) => {\r\n        setPhoneNumber(response.data.phoneNumber);\r\n      })\r\n      .catch(() => {});\r\n  }, []);\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Change telephone number\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - change telephone number\">\r\n          {phoneNumberPromise !== undefined && (\r\n            <NetworkLoaderComponent request={phoneNumberPromise}>\r\n              <ChangePhonenumberComponent\r\n                phoneNumber={phoneNumber}\r\n                onSubmit={(newPhoneNumber) => updateContactPhoneAsync(newPhoneNumber)}\r\n                onSuccessfulChange={() =>\r\n                  navigate(clientMyAccountUrl.account.root + clientMyAccountUrl.account.contactDetails)\r\n                }\r\n              />\r\n            </NetworkLoaderComponent>\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default ChangePhonenumberContainer;\r\n","import React from 'react';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  isValidPostcode,\r\n  NetworkCatchErrorComponent,\r\n  msgConstants,\r\n  AddressLookupContainer,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\nimport { SubmitButtonAxiosComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst changeAddressForm = ({\r\n  values,\r\n  errors,\r\n  touched,\r\n  setFieldValue,\r\n  setErrors,\r\n  setFieldTouched,\r\n  submitCount,\r\n  handleSubmit,\r\n  ...props\r\n}) => (\r\n  <Form>\r\n    <NetworkCatchErrorComponent didCatchError={values.submitError} />\r\n    {submitCount > 0 &&\r\n    ((touched['postcode'] === true && errors['postcode'] !== undefined) ||\r\n      (touched['address'] === true && errors['address'] !== undefined)) ? (\r\n      <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <p>\r\n          <b>Current address: </b> {props.currentAddress}\r\n        </p>\r\n      </div>\r\n    </div>\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <AddressLookupContainer\r\n          touched={touched}\r\n          errors={errors}\r\n          onPostcodeChange={(postcode) => {\r\n            setFieldValue('postcode', postcode, false);\r\n            setFieldTouched('postcode', false, false);\r\n            setFieldTouched('address', false, false);\r\n          }}\r\n          onAddressChange={(address, outofYork) => {\r\n            setFieldValue('uprn', address.uprn, true);\r\n            setFieldValue('address', address.shortAddress, true);\r\n            setFieldValue('selectedAddress', address, true);\r\n            setFieldValue('outofYork', outofYork);\r\n          }}\r\n          onAddressSearch={(data) => {\r\n            if (data.results === null || data.results.length < 1) {\r\n              setFieldTouched('postcode', true, false);\r\n              setFieldTouched('address', false, false);\r\n              setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n            } else {\r\n              setFieldValue('addressSource', data.source, false);\r\n              setFieldTouched('postcode', true, true);\r\n              setFieldTouched('address', false, false);\r\n            }\r\n          }}\r\n          onValidationError={(type) => {\r\n            setFieldTouched('postcode', true, false);\r\n            setFieldTouched('address', true, false);\r\n\r\n            if (type === 'REQUIRED') {\r\n              setErrors({ postcode: msgConstants.NO_POSTCODE_MESSAGE });\r\n            }\r\n            if (type === 'INVALID') {\r\n              setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n            }\r\n          }}\r\n        />\r\n      </div>\r\n    </div>\r\n    <div className=\"row\">\r\n      <div className=\"col\">\r\n        <SubmitButtonAxiosComponent\r\n          type=\"submit\"\r\n          className={ButtonClasses.primary + ' float-right'}\r\n          url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_ADDRESS}`}\r\n          onClick={handleSubmit}\r\n        />\r\n        <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n          Back to My Account\r\n        </Link>\r\n      </div>\r\n    </div>\r\n  </Form>\r\n);\r\n\r\nconst ChangeAddressComponent = withFormik({\r\n  mapPropsToValues({ currentAddress, onSubmit, onSumitSuccess }) {\r\n    return {\r\n      onSubmit: onSubmit || null,\r\n      onSumitSuccess: onSumitSuccess || null,\r\n      postcode: '',\r\n      address: '',\r\n      submitError: false,\r\n    };\r\n  },\r\n  validationSchema: Yup.object({\r\n    postcode: Yup.string()\r\n      .required(msgConstants.NO_POSTCODE_MESSAGE)\r\n      .test('postcode', msgConstants.INVALID_POSTCODE_MESSAGE, async (value) => await isValidPostcode(value)),\r\n  }),\r\n\r\n  handleSubmit(values, { setSubmitting, setFieldError, setFieldValue }) {\r\n    // Validating address here as it's proving very difficult to get it to work in the validator\r\n    if (values.address === '') {\r\n      setFieldError('address', msgConstants.SELECT_ADDRESS_MESSAGE);\r\n      setSubmitting(false);\r\n      return 0;\r\n    }\r\n\r\n    const payload = values.selectedAddress;\r\n    payload.addressSource = values.addressSource;\r\n    payload.outofYork = values.outofYork;\r\n\r\n    values\r\n      .onSubmit(payload)\r\n      .then((res) => {\r\n        if (res.status === 200) {\r\n          values.onSumitSuccess();\r\n        }\r\n      })\r\n      .catch(() => {\r\n        setFieldValue('submitError', true);\r\n        setSubmitting(false);\r\n      });\r\n  },\r\n})(changeAddressForm);\r\n\r\nexport default ChangeAddressComponent;\r\n\r\nChangeAddressComponent.propTypes = {\r\n  currentAddress: PropTypes.string,\r\n  onSubmit: PropTypes.func.isRequired,\r\n  onSumitSuccess: PropTypes.func.isRequired,\r\n};\r\n","import React from 'react';\r\n\r\nimport { MyAccountPageComponent, PageHeaderComponent, DocumentTitleComponent } from '../common';\r\n\r\nconst MaintenanceApp = ({ message }) => {\r\n  return (\r\n    <>\r\n      <PageHeaderComponent text=\"Down for maintenance\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"Down for maintenance\" />\r\n        <p>\r\n          {message ||\r\n            \"We're making essential system updates to this part of our website; our apologies for any inconvenience caused. We're working to restore this service as quickly as possible.\"}\r\n        </p>\r\n      </MyAccountPageComponent>\r\n    </>\r\n  );\r\n};\r\n\r\nexport default MaintenanceApp;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { getContactDetailAsync, updateContactAddressAsync } from '../../services/account.service';\r\nimport ChangeAddressComponent from '../components/change-address.component';\r\nimport { ChangeAddressMaintenance } from 'common/constants/feature-flag.constants';\r\nimport { isEnabled } from 'common';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport MaintenanceApp from 'maintenance/maintenance.app';\r\n\r\nimport {\r\n  NetworkLoaderComponent,\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  clientMyAccountUrl,\r\n} from '../../../common';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst ChangeAddressContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [currentAddressPromise, setCurrentAddressPromise] = useState();\r\n  const [currentAddress, setCurrentAddress] = useState('');\r\n\r\n  useEffect(() => {\r\n    const currentAddressPromise = getContactDetailAsync(true);\r\n    setCurrentAddressPromise(currentAddressPromise);\r\n\r\n    currentAddressPromise\r\n      .then((response) => setCurrentAddress(response.data.address))\r\n      .catch((error) => error && console.error(error));\r\n  }, []);\r\n\r\n  return isEnabled(FeatureFlagsService.getFeatureFlagByName(ChangeAddressMaintenance)) ? (\r\n    <MaintenanceApp />\r\n  ) : (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Change address\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - change address\">\r\n          {currentAddressPromise !== undefined ? (\r\n            <NetworkLoaderComponent request={currentAddressPromise}>\r\n              <ChangeAddressComponent\r\n                currentAddress={currentAddress}\r\n                onSubmit={updateContactAddressAsync}\r\n                onSumitSuccess={() =>\r\n                  navigate(clientMyAccountUrl.account.root + clientMyAccountUrl.account.address.successful)\r\n                }\r\n              />\r\n            </NetworkLoaderComponent>\r\n          ) : (\r\n            <React.Fragment />\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default ChangeAddressContainer;\r\n","import WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport {\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  clientMyAccountUrl,\r\n} from '../../../common';\r\n\r\nconst ChangeAddressSuccessComponent = () => (\r\n  <WithAuthentication>\r\n    <DocumentTitleComponent title=\"My account - change address confirmation\">\r\n      <PageHeaderComponent text=\"Change of address confirmation\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <p>Thank you for submitting your change of address details.</p>\r\n\r\n        <p>\r\n          If you’re responsible for paying council tax you must{' '}\r\n          <a href=\"https://www.york.gov.uk/info/20004/council_tax/6/moving_to_another_property\">\r\n            update your address in our Council Tax system\r\n          </a>{' '}\r\n          too, as this cannot be processed automatically.\r\n        </p>\r\n\r\n        <p>\r\n          Back to <Link to={clientMyAccountUrl.dashboard}>My Account</Link>.\r\n        </p>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  </WithAuthentication>\r\n);\r\n\r\nexport default ChangeAddressSuccessComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport {\r\n  clientMyAccountUrl,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n} from '../../../../common';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst ForgotPasswordEmailSentComponent = () => {\r\n  const navigate = useNavigate();\r\n\r\n  const signInClicked = () => navigate(clientMyAccountUrl.signIn);\r\n  return (\r\n    <DocumentTitleComponent title=\"Forgot password - confirmation\">\r\n      <PageHeaderComponent text=\"My Account password reset\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <p>\r\n          Please check your emails within 24 hours; we've sent you a message which contains a secure link to reset your\r\n          password.\r\n        </p>\r\n        <p>If you don't receive this email:</p>\r\n        <ul>\r\n          <li>\r\n            <p>your account may be disabled</p>\r\n          </li>\r\n          <li>\r\n            <p>our message may have been moved to your junk or spam email folder</p>\r\n          </li>\r\n          <li>\r\n            <p>we cannot find a My Account that matches the email address you have provided</p>\r\n          </li>\r\n        </ul>\r\n\r\n        <p>\r\n          <a href=\"https://www.york.gov.uk/homepage/16/contact_us\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n            Contact us\r\n          </a>{' '}\r\n          if you need help to reset your password.\r\n        </p>\r\n\r\n        <p>\r\n          Once you've reset your password you can{' '}\r\n          <button className=\"in-text-button\" onClick={signInClicked}>\r\n            sign in to My Account\r\n          </button>\r\n          .\r\n        </p>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nForgotPasswordEmailSentComponent.propTypes = {\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ForgotPasswordEmailSentComponent;\r\n","import React from 'react';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, apiMyAccountUrl } from '../../../../common';\r\nimport {\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\n// The actual form to implement\r\nconst forgotPasswordForm = ({ errors, touched, handleSubmit, submitCount, setFieldValue, values }) => (\r\n  <div className=\"placeholderCss forgotPasswordForm\">\r\n    <Form noValidate>\r\n      {Object.keys(errors).length > 0 && touched.email && submitCount > 0 ? (\r\n        <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n      ) : null}\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Email address\"\r\n        id=\"email\"\r\n        submitCount={submitCount}\r\n      />\r\n      <TextInputComponent\r\n        type=\"email\"\r\n        name=\"email\"\r\n        id=\"email\"\r\n        autoComplete=\"off\"\r\n        value={values.email}\r\n        onChange={(e) => setFieldValue('email', e.target.value)}\r\n        error={errors.email && touched.email && submitCount > 0}\r\n      />\r\n      {errors.email && touched.email && submitCount > 0 && <InputErrorComponent>{errors.email}</InputErrorComponent>}\r\n      <SubmitButtonAxiosComponent\r\n        type=\"submit\"\r\n        className={ButtonClasses.primary + ' float-right'}\r\n        url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_FORGOT_PASSWORD}`}\r\n        onClick={handleSubmit}\r\n      />\r\n    </Form>\r\n  </div>\r\n);\r\n\r\nconst ForgotPasswordFormComponent = withFormik({\r\n  mapPropsToValues({ email, onSubmit }) {\r\n    return {\r\n      email: email || '',\r\n      onSubmit: onSubmit || console.log('no submit method'),\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    email: Yup.string()\r\n      .email(\"'Email address' - Error: this email address does not appear to be valid. Please re-enter.\")\r\n      .required(\"Please supply details for 'Email address'\"),\r\n  }),\r\n  handleSubmit(values, { setSubmitting }) {\r\n    values\r\n      .onSubmit(values)\r\n      .then(() => {\r\n        setSubmitting(false);\r\n      })\r\n      .catch(() => {\r\n        setSubmitting(false);\r\n      });\r\n  },\r\n})(forgotPasswordForm);\r\n\r\nForgotPasswordFormComponent.propTypes = {\r\n  email: PropTypes.string,\r\n  onSubmit: PropTypes.func,\r\n};\r\n\r\nexport default ForgotPasswordFormComponent;\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  equalTo,\r\n  clientMyAccountUrl as urls,\r\n  NetworkCatchErrorComponent,\r\n  msgConstants,\r\n  PASSWORD_COMPLICATED_REGEX,\r\n  apiMyAccountUrl,\r\n} from '../../../../common';\r\nimport {\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nYup.addMethod(Yup.string, 'equalTo', equalTo);\r\n\r\n// The actual form to implement\r\nconst resetPasswordForm = ({ values, errors, touched, handleSubmit, setFieldValue }) => (\r\n  <div className=\"placeholderCss\">\r\n    <NetworkCatchErrorComponent didCatchError={values.submitError} customMessage={values.submitErrorMessage} />\r\n    {values.passwordChangeError ? (\r\n      <div className=\"cyc-input-errors-box\">\r\n        <h2 className=\"cyc-input-errors\">Invalid password reset request</h2>\r\n        <p>The link you followed to reset your password has either expired or been previously used</p>\r\n        <p>\r\n          You can request a new link <Link to={urls.account.password.forgot}>here</Link>.\r\n        </p>\r\n      </div>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    {values.passwordChangeSuccessful ? (\r\n      <div>\r\n        <h2>Your password has been updated</h2>\r\n        <br />\r\n        <Link to={urls.signIn} className=\"button-cyc-primary float-right\">\r\n          Sign in\r\n        </Link>\r\n      </div>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    {values.passwordChangeError === false && values.passwordChangeSuccessful === false ? (\r\n      <div>\r\n        <Form noValidate>\r\n          {Object.keys(errors).length > 0 && touched.password && touched.confirmPassword ? (\r\n            <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n          ) : null}\r\n          <div className=\"row\">\r\n            <div className=\"col form-group\">\r\n              <ErrorLabelHandlerComponent touched={touched} errors={errors} text=\"New password\" id=\"password\" />\r\n              <TextInputComponent\r\n                type=\"password\"\r\n                name=\"password\"\r\n                id=\"password\"\r\n                error={errors.password && touched.password}\r\n                value={values.password}\r\n                onChange={(e) => setFieldValue('password', e.target.value)}\r\n              />\r\n              {errors.password && touched.password && <InputErrorComponent>{errors.password}</InputErrorComponent>}\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col  form-group\">\r\n              <ErrorLabelHandlerComponent\r\n                touched={touched}\r\n                errors={errors}\r\n                text=\"Confirm password\"\r\n                id=\"confirmPassword\"\r\n              />\r\n              <TextInputComponent\r\n                type=\"password\"\r\n                name=\"confirmPassword\"\r\n                id=\"confirmPassword\"\r\n                error={errors.confirmPassword && touched.confirmPassword}\r\n                value={values.confirmPassword}\r\n                onChange={(e) => setFieldValue('confirmPassword', e.target.value)}\r\n              />\r\n              {errors.confirmPassword && touched.confirmPassword && (\r\n                <InputErrorComponent>{errors.confirmPassword}</InputErrorComponent>\r\n              )}\r\n            </div>\r\n          </div>\r\n          <div className=\"row\">\r\n            <div className=\"col\">\r\n              <SubmitButtonAxiosComponent\r\n                type=\"submit\"\r\n                className={ButtonClasses.primary + ' float-right'}\r\n                url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_RESET_PASSWORD}`}\r\n                onClick={handleSubmit}\r\n              />\r\n            </div>\r\n          </div>\r\n        </Form>\r\n      </div>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n  </div>\r\n);\r\n\r\n// This is what is used anywhere in the app\r\nconst ResetPasswordFormComponent = withFormik({\r\n  mapPropsToValues({ userId, code, password, confirmPassword, onSubmit }) {\r\n    return {\r\n      userId: userId || '',\r\n      code: code || '',\r\n      password: password || '',\r\n      confirmPassword: confirmPassword || '',\r\n      onSubmit: onSubmit,\r\n      passwordChangeError: false,\r\n      passwordChangeErrorMessage: '',\r\n      passwordChangeSuccessful: false,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    password: Yup.string()\r\n      .min(8, 'New password must be at least 8 characters')\r\n      .required('Password is required')\r\n      .matches(PASSWORD_COMPLICATED_REGEX, msgConstants.PASSWORD_COMPLICATED_MESSAGE),\r\n    confirmPassword: Yup.string()\r\n      .equalTo(Yup.ref('password'), 'Password must match')\r\n      .required('Confirm password is required'),\r\n  }),\r\n  handleSubmit(values, { setFieldValue, setSubmitting, resetForm }) {\r\n    const form = Object.assign(\r\n      {},\r\n      {\r\n        userId: values.userId,\r\n        code: values.code,\r\n        password: values.password,\r\n        confirmPassword: values.confirmPassword,\r\n      }\r\n    );\r\n    const resetFormValues = () => {\r\n      resetForm();\r\n      setFieldValue('password', '');\r\n      setFieldValue('confirmPassword', '');\r\n      setSubmitting(false);\r\n    };\r\n    values\r\n      .onSubmit(form)\r\n      .then((response) => {\r\n        if (response.status === 200) {\r\n          setFieldValue('passwordChangeSuccessful', true);\r\n        }\r\n      })\r\n      .catch((err) => {\r\n        if (err.response.status === 400) {\r\n          resetFormValues();\r\n          setFieldValue('passwordChangeError', true);\r\n        } else if (err.response.status === 500) {\r\n          resetFormValues();\r\n          setFieldValue('submitError', true);\r\n          setFieldValue('submitErrorMessage', msgConstants.GENERIC_API_ERROR);\r\n        }\r\n      });\r\n  },\r\n})(resetPasswordForm);\r\n\r\nexport default ResetPasswordFormComponent;\r\n\r\nResetPasswordFormComponent.propTypes = {\r\n  userId: PropTypes.string,\r\n  code: PropTypes.string,\r\n  onSubmit: PropTypes.func,\r\n};\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { apiMyAccountUrl } from '../../../common';\r\n\r\n// TODO: axios this\r\nconst postForgotPasswordAsync = async (form) => {\r\n  let addressQuery = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_FORGOT_PASSWORD}`;\r\n  return axios.post(addressQuery, { email: form }).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to post a forgot password form'),\r\n      properties: { email: form },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nconst postResetPasswordAsync = async (form) => {\r\n  const addressQuery = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_RESET_PASSWORD}`;\r\n  const data = {\r\n    userId: form.userId,\r\n    code: form.code,\r\n    password: form.password,\r\n    confirmPassword: form.confirmPassword,\r\n    email: form.email,\r\n  };\r\n\r\n  return axios.post(addressQuery, data).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to post a reset password form'),\r\n      properties: { userId: form.userId, email: form.email },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport { postForgotPasswordAsync, postResetPasswordAsync };\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ForgotPasswordFormComponent } from '../../index';\r\nimport { postForgotPasswordAsync } from '../../services/forgot-password.service';\r\nimport {\r\n  clientMyAccountUrl,\r\n  PageHeaderComponent,\r\n  DocumentTitleComponent,\r\n  NetworkCatchErrorComponent,\r\n  MyAccountPageComponent,\r\n} from '../../../../common';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst ForgotPasswordContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [submitError, setSubmitError] = useState(false);\r\n\r\n  const handleSubmit = (values) => {\r\n    const promise = postForgotPasswordAsync(values.email);\r\n    promise\r\n      .then((response) => {\r\n        if (response.status === 200) {\r\n          navigate(clientMyAccountUrl.account.root + clientMyAccountUrl.account.password.emailSent);\r\n        }\r\n      })\r\n      .catch(() => {\r\n        setSubmitError(true);\r\n      });\r\n\r\n    return promise;\r\n  };\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"Forgot password\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - forgot password\">\r\n          <NetworkCatchErrorComponent didCatchError={submitError} />\r\n          <p>\r\n            Enter your email address and we will send you a secure link to a page where you can create a new password.\r\n          </p>\r\n          <ForgotPasswordFormComponent onSubmit={handleSubmit} />\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nForgotPasswordContainer.propTypes = {\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ForgotPasswordContainer;\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\n\r\nimport ResetPasswordFormComponent from '../../components/reset/reset-password-form.component';\r\nimport {\r\n  clientMyAccountUrl,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n} from '../../../../common';\r\nimport { postResetPasswordAsync } from '../../services/forgot-password.service';\r\n\r\nconst ResetPasswordContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [userId, setUserId] = useState();\r\n  const [code, setCode] = useState();\r\n  const [searchParams] = useSearchParams();\r\n\r\n  useEffect(() => {\r\n    const userIdFromUri = searchParams.get('userId');\r\n    const codeFromUri = searchParams.get('code');\r\n    setUserId(userIdFromUri);\r\n    setCode(codeFromUri);\r\n\r\n    if (!userIdFromUri || !codeFromUri) {\r\n      navigate(clientMyAccountUrl.dashboard);\r\n    }\r\n  }, []);\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"Reset your password\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My account - Reset password\">\r\n          {userId && code && (\r\n            <ResetPasswordFormComponent\r\n              userId={userId}\r\n              code={code}\r\n              onSubmit={(values) => postResetPasswordAsync(values)}\r\n            />\r\n          )}\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nResetPasswordContainer.propTypes = {\r\n  history: PropTypes.object,\r\n};\r\n\r\nexport default ResetPasswordContainer;\r\n","import React from 'react';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  ErrorLabelHandlerComponent,\r\n  NetworkCatchErrorComponent,\r\n  ErrorBoxComponent,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\nimport {\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ChangeNameForm = ({ errors, touched, values, handleSubmit, submitCount, setFieldValue }) => {\r\n  return (\r\n    <Form noValidate>\r\n      <NetworkCatchErrorComponent didCatchError={values.submitError} />\r\n      {Object.keys(errors).length > 0 && submitCount > 0 && touched.firstName && touched.lastName ? (\r\n        <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n      ) : null}\r\n\r\n      <div className=\"row\">\r\n        <div className=\"col\">\r\n          <ErrorLabelHandlerComponent\r\n            touched={touched}\r\n            errors={errors}\r\n            text=\"First name\"\r\n            id=\"firstName\"\r\n            submitCount={submitCount}\r\n          />\r\n          <TextInputComponent\r\n            name=\"firstName\"\r\n            id=\"firstName\"\r\n            value={values.firstName}\r\n            onChange={(e) => setFieldValue('firstName', e.target.value)}\r\n            errors={errors.firstName && touched.firstName && submitCount > 0}\r\n          />\r\n          {errors.firstName && touched.firstName && submitCount > 0 && (\r\n            <InputErrorComponent>{errors.firstName}</InputErrorComponent>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      <div className=\"row\">\r\n        <div className=\"col\">\r\n          <ErrorLabelHandlerComponent\r\n            touched={touched}\r\n            errors={errors}\r\n            text=\"Last name\"\r\n            id=\"lastName\"\r\n            submitCount={submitCount}\r\n          />\r\n          <TextInputComponent\r\n            name=\"lastName\"\r\n            id=\"lastName\"\r\n            value={values.lastName}\r\n            onChange={(e) => setFieldValue('lastName', e.target.value)}\r\n            errors={errors.lastName && touched.lastName && submitCount > 0}\r\n          />\r\n          {errors.lastName && touched.lastName && submitCount > 0 && (\r\n            <InputErrorComponent>{errors.lastName}</InputErrorComponent>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      <div className=\"row\">\r\n        <div className=\"col\">\r\n          <SubmitButtonAxiosComponent\r\n            type=\"submit\"\r\n            className={ButtonClasses.primary + ' float-right'}\r\n            url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.UPDATE_CONTACT_NAME}`}\r\n            onClick={handleSubmit}\r\n          />\r\n          <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n            Back to My Account\r\n          </Link>\r\n        </div>\r\n      </div>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst ChangeNameComponent = withFormik({\r\n  mapPropsToValues: ({ onSuccessfulChange, onSubmit }) => ({\r\n    onSuccessfulChange,\r\n    onSubmit,\r\n    firstName: '',\r\n    lastName: '',\r\n    submitError: false,\r\n  }),\r\n  validationSchema: Yup.object().shape({\r\n    firstName: Yup.string().required(\"Please supply details for 'First name'\"),\r\n    lastName: Yup.string().required(\"Please supply details for 'Last name'\"),\r\n  }),\r\n  handleSubmit: (values, { setSubmitting, setFieldValue }) => {\r\n    values\r\n      .onSubmit(values.firstName, values.lastName)\r\n      .then((response) => {\r\n        if (response.status === 200) {\r\n          values.onSuccessfulChange(values.firstName, values.lastName);\r\n        } else {\r\n          setFieldValue('submitError', true);\r\n          setSubmitting(false);\r\n        }\r\n      })\r\n      .catch(() => {\r\n        setSubmitting(false);\r\n        setFieldValue('submitError', true);\r\n      });\r\n  },\r\n})(ChangeNameForm);\r\n\r\nChangeNameComponent.propTypes = {\r\n  onSuccessfulChange: PropTypes.func.isRequired,\r\n  onSubmit: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ChangeNameComponent;\r\n","import React, { useState, useEffect, useContext } from 'react';\r\n\r\nimport {\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  NetworkLoaderComponent,\r\n  clientMyAccountUrl,\r\n  UserContext,\r\n} from '../../../common';\r\n\r\nimport ChangeNameComponent from '../components/change-name.component';\r\nimport { getContactDetailAsync, updateContactNameAsync } from '../../services/account.service';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst ChangeNameContainer = () => {\r\n  const navigate = useNavigate();\r\n  const [firstName, setFirstName] = useState();\r\n  const [lastName, setLastName] = useState();\r\n  const [networkPromise, setNetworkPromise] = useState();\r\n  const userContext = useContext(UserContext);\r\n\r\n  useEffect(() => {\r\n    const promise = getContactDetailAsync(false);\r\n\r\n    promise\r\n      .then((result) => {\r\n        setFirstName(result.data.firstName);\r\n        setLastName(result.data.lastName);\r\n      })\r\n      .catch(() => {});\r\n\r\n    setNetworkPromise(promise);\r\n  }, []);\r\n\r\n  const handleSuccessfulChange = (firstName, lastName) => {\r\n    // Send the values into the user context so that other parts of the app update :)\r\n    userContext.setStore('firstName', firstName);\r\n    userContext.setStore('lastName', lastName);\r\n\r\n    navigate(clientMyAccountUrl.account.root + clientMyAccountUrl.account.name.confirmation);\r\n  };\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <PageHeaderComponent text=\"Change name\" icon=\"icon-website\" />\r\n      <DocumentTitleComponent title=\"My Account - change name\" />\r\n      <MyAccountPageComponent>\r\n        {networkPromise !== undefined ? (\r\n          <NetworkLoaderComponent request={networkPromise}>\r\n            <div className=\"row\">\r\n              <div className=\"col\">\r\n                <p>\r\n                  <b>Current name: </b>\r\n                  {firstName} {lastName}\r\n                </p>\r\n              </div>\r\n            </div>\r\n            <ChangeNameComponent onSuccessfulChange={handleSuccessfulChange} onSubmit={updateContactNameAsync} />\r\n          </NetworkLoaderComponent>\r\n        ) : (\r\n          <React.Fragment />\r\n        )}\r\n      </MyAccountPageComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default ChangeNameContainer;\r\n","import WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\nimport React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport {\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  DocumentTitleComponent,\r\n  clientMyAccountUrl,\r\n} from '../../../common';\r\n\r\nconst ChangeNameConfirmationComponent = () => (\r\n  <WithAuthentication>\r\n    <DocumentTitleComponent title=\"My account - change name\">\r\n      <PageHeaderComponent text=\"Change of name confirmation\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <p>Thank you for submitting your change of name details.</p>\r\n\r\n        <p>\r\n          Back to <Link to={clientMyAccountUrl.dashboard}>My Account</Link>.\r\n        </p>\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  </WithAuthentication>\r\n);\r\n\r\nexport default ChangeNameConfirmationComponent;\r\n","import React from 'react';\r\nimport { Route, Routes } from 'react-router-dom';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nimport { ChangePasswordContainer, ChangePasswordSuccessComponent } from './index';\r\nimport { clientMyAccountUrl as urls, NotFoundComponent, isEnabled } from '../common';\r\nimport { ChangeName } from '../common/constants/feature-flag.constants';\r\n\r\nimport AccountDetailsContainer from './account-details/containers/account-details.container';\r\nimport CommunicationPreferenceContainer from './communication-preferences/containers/comm-preferences.container';\r\nimport ChangeEmailContainer from './change-email/containers/change-email.container';\r\nimport ChangeEmailConfirmationComponent from './change-email/components/confirmation-page/change-email-confirmation.component';\r\nimport ChangeEmailSuccessComponent from './change-email/components/email-change-successful/change-email-success.component';\r\nimport ChangePhonenumberContainer from './change-phone/containers/change-phone-number.container';\r\nimport ChangeAddresssContainer from './change-address/containers/change-address.container';\r\nimport ChangeAddressSuccessComponent from './change-address/components/change-address-success.component';\r\nimport { ForgotPasswordContainer, ResetPasswordContainer, ForgotPasswordEmailSentComponent } from './forgot-password';\r\nimport { ChangeNameConfirmationComponent, ChangeNameContainer } from './change-name';\r\n\r\nconst AccountRouterComponent = () => (\r\n  <Routes>\r\n    <Route path={urls.account.password.change} element={<ChangePasswordContainer />} />\r\n    <Route path={urls.account.password.changeSuccessful} element={<ChangePasswordSuccessComponent />} />\r\n    <Route path={urls.account.contactDetails} element={<AccountDetailsContainer />} />\r\n    <Route path={urls.account.communicationPreferences} element={<CommunicationPreferenceContainer />} />\r\n    <Route path={urls.account.email.change} element={<ChangeEmailContainer />} />\r\n    <Route path={urls.account.email.confirmation} element={<ChangeEmailConfirmationComponent />} />\r\n    <Route path={urls.account.email.successful} element={<ChangeEmailSuccessComponent />} />\r\n    <Route path={urls.account.phone.change} element={<ChangePhonenumberContainer />} />\r\n    <Route path={urls.account.address.change} element={<ChangeAddresssContainer />} />\r\n    <Route path={urls.account.address.successful} element={<ChangeAddressSuccessComponent />} />\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(ChangeName)) ? (\r\n      <Route path={urls.account.name.change} element={<ChangeNameContainer />} />\r\n    ) : undefined}\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(ChangeName)) ? (\r\n      <Route path={urls.account.name.confirmation} element={<ChangeNameConfirmationComponent />} />\r\n    ) : undefined}\r\n    <Route path={urls.account.password.forgot} element={<ForgotPasswordContainer />} />\r\n    <Route path={urls.account.password.reset} element={<ResetPasswordContainer />} />\r\n    <Route path={urls.account.password.emailSent} element={<ForgotPasswordEmailSentComponent />} />\r\n    <Route path={urls.account.root} element={<NotFoundComponent />} />\r\n  </Routes>\r\n);\r\n\r\nexport default AccountRouterComponent;\r\n","import React from 'react';\r\n\r\nconst TermsAndConditionsComponent = () => (\r\n  <React.Fragment>\r\n    <h2>My Account terms and conditions</h2>\r\n    <p>\r\n      We'll use the information you provide in accordance with the Data Protection Act 1998, to validate who you are and\r\n      provide you with specific online services through My Account.\r\n    </p>\r\n\r\n    <p>\r\n      We may share your information across our internal departments or with external partners, agencies and contractors\r\n      delivering services on our behalf.\r\n    </p>\r\n\r\n    <p>\r\n      We may be required or permitted to disclose your personal information without your explicit consent. For example,\r\n      when we have a legal obligation to prevent and detect crime or fraud.\r\n    </p>\r\n\r\n    <p>\r\n      We don't pass your information to third parties for marketing, sales or any other commercial purposes without your\r\n      prior explicit consent.\r\n    </p>\r\n\r\n    <p>We'll only keep your personal information for as long as we need it, then we will destroy it securely.</p>\r\n\r\n    <p>\r\n      Please see our <a href=\"https://www.york.gov.uk/privacy\">privacy statement.</a>\r\n    </p>\r\n\r\n    <h2>Using your details</h2>\r\n\r\n    <p>If you agree, we'll use your contact details to send you relevant information about our services. </p>\r\n  </React.Fragment>\r\n);\r\n\r\nexport { TermsAndConditionsComponent };\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport {\r\n  InputErrorComponent,\r\n  ButtonComponent as Button,\r\n  ButtonClasses,\r\n  RadiobuttonInputComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent } from '../../../common';\r\n\r\nconst RegStepOneForm = ({\r\n  values,\r\n  errors,\r\n  touched,\r\n  handleSubmit,\r\n  setFieldValue,\r\n  isSubmitting,\r\n  submitCount,\r\n  isValid,\r\n}) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n\r\n  useEffect(() => {\r\n    if (Object.keys(errors).length > 0 && submitCount > previousSubmitCount.current) {\r\n      previousSubmitCount.current = submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [errors, errorBoxRef, submitCount, previousSubmitCount]);\r\n\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <form onSubmit={handleSubmit}>\r\n      <div ref={errorBoxRef}></div>\r\n      {Object.keys(errors).length > 0 && submitCount > 0 && touched.shareContactDetails && <ErrorBoxComponent />}\r\n      <ErrorLabelHandlerComponent\r\n        tag=\"h3\"\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Would you like to receive relevant information from City of York Council?\"\r\n        id=\"shareContactDetails\"\r\n      />\r\n\r\n      <div id=\"shareContactDetails\">\r\n        <div>\r\n          <RadiobuttonInputComponent\r\n            name=\"shareContactDetails\"\r\n            value={values.shareContactDetails}\r\n            options={[\r\n              {\r\n                label: 'Yes, I agree to my contact details being used for this purpose',\r\n                value: true,\r\n              },\r\n              {\r\n                label: 'No, I do not agree to my contact details being used for this purpose',\r\n                value: false,\r\n              },\r\n            ]}\r\n            onChange={(e) => setFieldValue('shareContactDetails', e)}\r\n            error={errors.shareContactDetails && touched.shareContactDetails && submitCount > 0}\r\n          />\r\n          {errors.shareContactDetails && touched.shareContactDetails && submitCount > 0 && (\r\n            <InputErrorComponent>{errors.shareContactDetails}</InputErrorComponent>\r\n          )}\r\n        </div>\r\n      </div>\r\n\r\n      <br />\r\n      <p>Once registered, you can sign in to My Account to change your preferences at any time.</p>\r\n      <br />\r\n\r\n      <div className=\"row\">\r\n        <div className=\"col\">\r\n          <Button type=\"submit\" className={ButtonClasses.primary + ' float-right'} disabled={isSubmitting}>\r\n            Begin this form\r\n          </Button>\r\n        </div>\r\n      </div>\r\n    </form>\r\n  );\r\n};\r\n\r\nconst RegistrationStepOneComponent = withFormik({\r\n  mapPropsToValues({ shareContactDetails, onSubmitSuccess }) {\r\n    return {\r\n      shareContactDetails: shareContactDetails,\r\n      onSubmitSuccess: onSubmitSuccess,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    shareContactDetails: Yup.bool()\r\n      .nullable()\r\n      .required(\r\n        \"Please supply details for 'Would you like to receive relevant information from City of York Council?'\"\r\n      ),\r\n  }),\r\n  async handleSubmit(values, { setSubmitting }) {\r\n    setSubmitting(false);\r\n    await values.onSubmitSuccess(values.shareContactDetails);\r\n  },\r\n})(RegStepOneForm);\r\n\r\nRegistrationStepOneComponent.propTypes = {\r\n  shareContactDetails: PropTypes.bool,\r\n  onSubmitSuccess: PropTypes.func.isRequired,\r\n};\r\n\r\nexport { RegistrationStepOneComponent, RegStepOneForm };\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport {\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  HelpTextComponent,\r\n  ButtonComponent as Button,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  equalTo,\r\n  IsValidComplexPassword,\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  msgConstants,\r\n} from '../../../common';\r\n\r\nYup.addMethod(Yup.string, 'equalTo', equalTo);\r\n\r\n// The actual form to implement\r\nconst RegStepTwoForm = ({ errors, touched, isSubmitting, values, submitCount, setFieldValue }) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n  const firstNameError = errors.firstName && touched.firstName && submitCount > 0;\r\n  const lastNameError = errors.lastName && touched.lastName && submitCount > 0;\r\n  const emailError = errors.emailAddress && touched.emailAddress && submitCount > 0;\r\n  const passwordError = errors.password && touched.password && submitCount > 0;\r\n  const confirmPasswordError = errors.confirmPassword && touched.confirmPassword && submitCount > 0;\r\n\r\n  useEffect(() => {\r\n    if (Object.keys(errors).length > 0 && submitCount > previousSubmitCount.current) {\r\n      previousSubmitCount.current = submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [errors, errorBoxRef, submitCount, previousSubmitCount]);\r\n\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <Form noValidate>\r\n      <div ref={errorBoxRef}></div>\r\n      {Object.keys(errors).length > 0 &&\r\n        submitCount > 0 &&\r\n        touched.firstName &&\r\n        touched.lastName &&\r\n        touched.emailAddress &&\r\n        touched.password &&\r\n        touched.confirmPassword && <ErrorBoxComponent />}\r\n\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"First name\"\r\n        id=\"firstName\"\r\n        submitCount={submitCount}\r\n      />\r\n      <TextInputComponent\r\n        name=\"firstName\"\r\n        type=\"text\"\r\n        id=\"firstName\"\r\n        autoComplete=\"off\"\r\n        error={firstNameError}\r\n        value={values.firstName}\r\n        onChange={(e) => setFieldValue('firstName', e.target.value)}\r\n      />\r\n      {firstNameError && <InputErrorComponent>{errors.firstName}</InputErrorComponent>}\r\n\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Last name\"\r\n        id=\"lastName\"\r\n        submitCount={submitCount}\r\n      />\r\n      <TextInputComponent\r\n        name=\"lastName\"\r\n        type=\"text\"\r\n        id=\"lastName\"\r\n        error={lastNameError}\r\n        autoComplete=\"off\"\r\n        value={values.lastName}\r\n        onChange={(e) => setFieldValue('lastName', e.target.value)}\r\n      />\r\n      {lastNameError && <InputErrorComponent>{errors.lastName}</InputErrorComponent>}\r\n\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Email address\"\r\n        id=\"emailAddress\"\r\n        submitCount={submitCount}\r\n      />\r\n      <TextInputComponent\r\n        name=\"emailAddress\"\r\n        type=\"text\"\r\n        id=\"emailAddress\"\r\n        error={emailError}\r\n        autoComplete=\"off\"\r\n        value={values.emailAddress}\r\n        onChange={(e) => setFieldValue('emailAddress', e.target.value)}\r\n      />\r\n      {emailError && <InputErrorComponent>{errors.emailAddress}</InputErrorComponent>}\r\n\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Password\"\r\n        id=\"password\"\r\n        submitCount={submitCount}\r\n      />\r\n\r\n      <TextInputComponent\r\n        name=\"password\"\r\n        type=\"password\"\r\n        id=\"password\"\r\n        error={passwordError}\r\n        autoComplete=\"off\"\r\n        value={values.password}\r\n        onChange={(e) => setFieldValue('password', e.target.value)}\r\n      />\r\n      {passwordError > 0 && <InputErrorComponent>{errors.password}</InputErrorComponent>}\r\n      <HelpTextComponent>\r\n        Help: Password must be at least 8 characters and contain at least 1 uppercase letter, 1 lowercase letter, 1\r\n        number and 1 special character\r\n      </HelpTextComponent>\r\n\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        text=\"Confirm password\"\r\n        id=\"confirmPassword\"\r\n        submitCount={submitCount}\r\n      />\r\n\r\n      <TextInputComponent\r\n        name=\"confirmPassword\"\r\n        type=\"password\"\r\n        id=\"confirmPassword\"\r\n        error={confirmPasswordError}\r\n        autoComplete=\"off\"\r\n        value={values.confirmPassword}\r\n        onChange={(e) => setFieldValue('confirmPassword', e.target.value)}\r\n      />\r\n      {confirmPasswordError && <InputErrorComponent>{errors.confirmPassword}</InputErrorComponent>}\r\n      <HelpTextComponent>Help: Please re-enter your password</HelpTextComponent>\r\n\r\n      <Button type=\"submit\" className={ButtonClasses.primary + ' float-right'} disabled={isSubmitting}>\r\n        Next\r\n      </Button>\r\n      <Button className={ButtonClasses.secondary} onClick={values.goToPrevious}>\r\n        Previous\r\n      </Button>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst RegistrationStepTwoComponent = withFormik({\r\n  mapPropsToValues({ firstName, lastName, emailAddress, password, confirmPassword, onSubmitSuccess, goToPrevious }) {\r\n    return {\r\n      firstName: firstName || '',\r\n      lastName: lastName || '',\r\n      emailAddress: emailAddress || '',\r\n      password: password || '',\r\n      confirmPassword: confirmPassword || '',\r\n      onSubmitSuccess: onSubmitSuccess,\r\n      goToPrevious: goToPrevious || null,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    firstName: Yup.string().required(\"Please supply details for 'First name'.\"),\r\n    lastName: Yup.string().required(\"Please supply details for 'Last name'.\"),\r\n    emailAddress: Yup.string()\r\n      .email(\"'Email address' - Error: this email address does not appear to be valid. Please re-enter.\")\r\n      .required(\"Please supply details for 'Email address'.\"),\r\n    password: Yup.string()\r\n      .required(\"Please supply details for 'Password'.\")\r\n      .test('password', msgConstants.PASSWORD_COMPLICATED_MESSAGE, (value) => IsValidComplexPassword(value, true)),\r\n    confirmPassword: Yup.string()\r\n      .equalTo(\r\n        Yup.ref('password'),\r\n        \"'Confirm password' - Error: this password does not appear to match. Please re-enter.\"\r\n      )\r\n      .required(\"Please supply details for 'Confirm password'.\"),\r\n  }),\r\n  handleSubmit(values) {\r\n    values.onSubmitSuccess({\r\n      firstName: values.firstName,\r\n      lastName: values.lastName,\r\n      emailAddress: values.emailAddress,\r\n      password: values.password,\r\n      confirmPassword: values.confirmPassword,\r\n    });\r\n  },\r\n})(RegStepTwoForm);\r\n\r\nRegistrationStepTwoComponent.propTypes = {\r\n  firstName: PropTypes.string,\r\n  lastName: PropTypes.string,\r\n  email: PropTypes.string,\r\n  password: PropTypes.string,\r\n  confirmPassword: PropTypes.string,\r\n  onSubmitSuccess: PropTypes.func.isRequired,\r\n  goToPrevious: PropTypes.func.isRequired,\r\n};\r\n\r\nexport { RegistrationStepTwoComponent, RegStepTwoForm };\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  isValidPostcode,\r\n  isValidTelephoneNumber,\r\n  msgConstants,\r\n  apiMyAccountUrl,\r\n} from '../../../common';\r\n\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport AddressLookupContainer from '../../../common/containers/address-lookup/address-lookup.container';\r\nimport {\r\n  InputErrorComponent,\r\n  TextInputComponent,\r\n  HelpTextComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  SubmitButtonAxiosComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst RegStepThreeForm = ({\r\n  values,\r\n  errors,\r\n  touched,\r\n  setFieldValue,\r\n  setErrors,\r\n  isSubmitting,\r\n  setFieldTouched,\r\n  submitCount,\r\n  handleSubmit,\r\n}) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n  const telephoneError = touched.telephone && errors.telephone && submitCount > 0;\r\n\r\n  useEffect(() => {\r\n    if (Object.keys(errors).length > 0 && submitCount > previousSubmitCount.current) {\r\n      previousSubmitCount.current = submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [errors, errorBoxRef, submitCount, previousSubmitCount]);\r\n\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <Form noValidate>\r\n      <div ref={errorBoxRef}></div>\r\n      {Object.keys(errors).length > 0 && touched.postcode && touched.address && <ErrorBoxComponent />}\r\n      <ErrorLabelHandlerComponent\r\n        touched={touched}\r\n        errors={errors}\r\n        requiredInput={false}\r\n        text=\"Telephone number\"\r\n        id=\"telephone\"\r\n        submitCount={submitCount}\r\n      />\r\n      <TextInputComponent\r\n        type=\"tel\"\r\n        pattern=\"[0-9\\s]*\"\r\n        name=\"telephone\"\r\n        id=\"telephone\"\r\n        error={telephoneError}\r\n        value={values.telephone}\r\n        onChange={(e) => setFieldValue('telephone', e.target.value)}\r\n      />\r\n      {telephoneError && <InputErrorComponent>{errors.telephone}</InputErrorComponent>}\r\n      <HelpTextComponent>Help: Provide a mobile or home telephone number</HelpTextComponent>\r\n\r\n      <AddressLookupContainer\r\n        touched={touched}\r\n        errors={errors}\r\n        onPostcodeChange={(postcode) => {\r\n          setFieldValue('postcode', postcode, false);\r\n          setFieldTouched('postcode', false, false);\r\n          setFieldTouched('address', false, false);\r\n        }}\r\n        onAddressChange={(address, outofYork) => {\r\n          setFieldValue('uprn', address.uprn, true);\r\n          setFieldValue('address', address.shortAddress, true);\r\n          setFieldValue('outofYork', outofYork);\r\n        }}\r\n        onAddressSearch={(data) => {\r\n          if (data.results && data.results.length === 0) {\r\n            setFieldTouched('postcode', true, false);\r\n            setFieldTouched('address', true, false);\r\n            setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n          } else {\r\n            setFieldValue('addressSource', data.source);\r\n            setFieldTouched('postcode', true, true);\r\n            setFieldTouched('address', false, true);\r\n          }\r\n        }}\r\n        onValidationError={(type) => {\r\n          setFieldTouched('postcode', true, false);\r\n          setFieldTouched('address', true, false);\r\n\r\n          if (type === 'REQUIRED') {\r\n            setErrors({ postcode: msgConstants.NO_POSTCODE_MESSAGE });\r\n          }\r\n          if (type === 'INVALID') {\r\n            setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n          }\r\n        }}\r\n      />\r\n      <SubmitButtonAxiosComponent\r\n        type=\"submit\"\r\n        className={ButtonClasses.primary + ' float-right'}\r\n        url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.REGISTER}`}\r\n        onClick={handleSubmit}\r\n        title=\"Register\"\r\n        pending=\"Registering\"\r\n        done=\"Registered\"\r\n      />\r\n      <ButtonComponent type=\"button\" onClick={values.goToPrevious}>\r\n        Previous\r\n      </ButtonComponent>\r\n    </Form>\r\n  );\r\n};\r\n\r\n// This is what is used anywhere in the app\r\nconst RegistrationStepThreeComponent = withFormik({\r\n  mapPropsToValues({ telephone, postcode, address, uprn, onSubmitSuccess, goToPrevious }) {\r\n    return {\r\n      telephone: telephone || '',\r\n      postcode: postcode || '',\r\n      address: address || '',\r\n      uprn: uprn || '',\r\n      showAddressArray: address ? true : false,\r\n      addressArray: [{ address: address }] || [],\r\n      onSubmitSuccess: onSubmitSuccess || null,\r\n      goToPrevious: goToPrevious || null,\r\n    };\r\n  },\r\n  validationSchema: Yup.object({\r\n    telephone: Yup.string().test(\r\n      'phone',\r\n      \"'Telephone number' - Error: This does not appear to be a valid telephone number. Please re-enter.\",\r\n      (value) => (value ? isValidTelephoneNumber(value) : true)\r\n    ),\r\n    postcode: Yup.string()\r\n      .required(msgConstants.NO_POSTCODE_MESSAGE)\r\n      .test('postcode', msgConstants.INVALID_POSTCODE_MESSAGE, async (value) => {\r\n        return await isValidPostcode(value);\r\n      }),\r\n  }),\r\n\r\n  handleSubmit(values, { setSubmitting, setFieldError }) {\r\n    if (values.address === '') {\r\n      setFieldError('address', 'Please select an address from the list.');\r\n      setSubmitting(false);\r\n      return 0;\r\n    }\r\n    values.onSubmitSuccess(values).then((res) => {\r\n      if (res === false) {\r\n        return setSubmitting(false);\r\n      }\r\n    });\r\n  },\r\n})(RegStepThreeForm);\r\n\r\nexport { RegistrationStepThreeComponent, RegStepThreeForm };\r\n\r\nRegistrationStepThreeComponent.propTypes = {\r\n  telephone: PropTypes.string,\r\n  postcode: PropTypes.string,\r\n  address: PropTypes.string,\r\n  onSubmitSuccess: PropTypes.func.isRequired,\r\n  goToPrevious: PropTypes.func.isRequired,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst RegisterSuccessfulComponent = ({ onContinueClicked, extraSuccessfulContent }) => (\r\n  <>\r\n    <h1>My Account registration confirmation</h1>\r\n    <p>\r\n      Thank you for registering for My Account. We’ve sent you an email to verify your email address and finish setting\r\n      up your account.\r\n    </p>\r\n    {extraSuccessfulContent}\r\n    {onContinueClicked !== undefined ? (\r\n      <ButtonComponent type=\"submit\" className={ButtonClasses.primary} onClick={onContinueClicked}>\r\n        Continue\r\n      </ButtonComponent>\r\n    ) : (\r\n      <React.Fragment />\r\n    )}\r\n    <p>If you don't receive the verification email:</p>\r\n    <ul>\r\n      <p>\r\n        <li>please check your junk folders in your email account</li>\r\n        <li>you may have entered an incorrect email address in the My Account registration form</li>\r\n      </p>\r\n    </ul>\r\n\r\n    <p>\r\n      Please <a href=\"https://www.york.gov.uk/contactus\">contact us</a> if you haven’t received the verification email\r\n      or need further assistance.\r\n    </p>\r\n  </>\r\n);\r\n\r\nRegisterSuccessfulComponent.propTypes = {\r\n  onContinueClicked: PropTypes.func,\r\n  extraSuccessfulContent: PropTypes.any,\r\n};\r\n\r\nexport { RegisterSuccessfulComponent };\r\n","import { useNavigate } from 'react-router-dom';\r\n\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\nimport { clientMyAccountUrl } from '../../../common';\r\n\r\nconst RegisterSuccessfulWithWarningComponent = () => {\r\n  const navigate = useNavigate();\r\n\r\n  // We are going to find the path we are at\r\n  const currentPath = location.pathname;\r\n\r\n  // Find the root of the current\r\n  const currentPathRoot = currentPath.split(clientMyAccountUrl.register)[0];\r\n  // Append the sign in path onto this\r\n  const signInLinkUrl = `${currentPathRoot}${clientMyAccountUrl.signIn}`;\r\n\r\n  return (\r\n    <>\r\n      <h1>My Account registration confirmation</h1>\r\n      <p>\r\n        Thank you for registering for a City of York Council My Account. Our records show that you already have an\r\n        account with us.\r\n      </p>\r\n      <p>Enter your email address and password on the sign in page to access your My Account.</p>\r\n      <ButtonComponent\r\n        type=\"submit\"\r\n        className={ButtonClasses.primary + ' float-right'}\r\n        onClick={() => navigate(signInLinkUrl)}>\r\n        Sign in\r\n      </ButtonComponent>\r\n    </>\r\n  );\r\n};\r\n\r\nexport { RegisterSuccessfulWithWarningComponent };\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\nimport { apiMyAccountUrl } from '../../common';\r\n\r\nexport const postRegistrationDataAsync = (registrationForm) => {\r\n  let address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.REGISTER}`;\r\n\r\n  return axios.post(address, registrationForm).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({\r\n      exception: new Error('Failed to post a registration form'),\r\n      properties: {\r\n        passwordsMatch: registrationForm.password === registrationForm.confirmPassword,\r\n        email: registrationForm.email,\r\n      },\r\n    });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const postEmailConfirmation = (userId, code) => {\r\n  let addressQuery = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT}?userId=${userId}&code=${code}`;\r\n\r\n  return axios.get(addressQuery).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex });\r\n    throw ex;\r\n  });\r\n};\r\n\r\nexport const registrationObject = (values) => {\r\n  return {\r\n    firstName: values.firstName,\r\n    lastName: values.lastName,\r\n    email: values.email,\r\n    password: values.password,\r\n    confirmPassword: values.confirmPassword,\r\n    telephoneNumber: values.telephoneNumber,\r\n    postcode: values.postcode,\r\n    address: values.address,\r\n    uprn: values.uprn,\r\n    shareContactDetails: values.shareContactDetails,\r\n  };\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { postEmailConfirmation } from '../../services/registration.service';\r\nimport { clientMyAccountUrl } from '../../../common';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\nimport { useNavigate, useSearchParams } from 'react-router-dom';\r\n\r\nconst RegisterEmailConfirmComponent = () => {\r\n  const navigate = useNavigate();\r\n  const [emailConfirmSuccess, setEmailConfirmSuccess] = useState(false);\r\n  const [confirmationCompleted, setConfirmationCompleted] = useState(false);\r\n  const [searchParams] = useSearchParams();\r\n\r\n  useEffect(() => {\r\n    // Not using queryString on code as it reads the token incorrectly\r\n    const userId = searchParams.get('userId');\r\n    const code = window.location.search.split('code=')[1];\r\n\r\n    postEmailConfirmation(userId, code)\r\n      .then((data) => {\r\n        setEmailConfirmSuccess(data.status === 200);\r\n        setConfirmationCompleted(true);\r\n      })\r\n      .catch(() => {\r\n        setEmailConfirmSuccess(false);\r\n        setConfirmationCompleted(true);\r\n      });\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <>\r\n      {confirmationCompleted ? (\r\n        <React.Fragment>\r\n          {emailConfirmSuccess ? (\r\n            <React.Fragment>\r\n              <h1>My Account verification</h1>\r\n              <p>Thank you for verifying your My Account email address. You can now sign in to My Account.</p>\r\n              <ButtonComponent\r\n                type=\"submit\"\r\n                className={ButtonClasses.primary + ' float-right'}\r\n                onClick={() => navigate(clientMyAccountUrl.signIn)}>\r\n                Sign in\r\n              </ButtonComponent>\r\n            </React.Fragment>\r\n          ) : (\r\n            <React.Fragment>\r\n              <h1>Email verification failed</h1>\r\n              <p>Sorry, your email address was not properly verified.</p>\r\n              <p>We've sent you a new verification email. Please try again using the link provided in the email.</p>\r\n              <p>\r\n                If you are still having trouble verifying your email,{' '}\r\n                <a href=\"https://www.york.gov.uk/ContactUs\">contact us</a>.\r\n              </p>\r\n            </React.Fragment>\r\n          )}\r\n        </React.Fragment>\r\n      ) : (\r\n        <h3>Please wait while we verify your email address...</h3>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n\r\nexport { RegisterEmailConfirmComponent };\r\n","import { clientMyAccountUrl } from '../common';\r\n\r\nexport const pageHeaderText = 'Register for My Account';\r\nexport const baseUrl = clientMyAccountUrl.registration;\r\nexport const stepUrls = [\r\n  `${baseUrl.root}`,\r\n  `${baseUrl.root + baseUrl.step1}`,\r\n  `${baseUrl.root + baseUrl.step2}`,\r\n  `${baseUrl.root + baseUrl.step3}`,\r\n  `${baseUrl.root + baseUrl.emailConfirmation}`,\r\n  `${baseUrl.root + baseUrl.successful}`,\r\n];\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Routes, Route, Navigate, useLocation, useNavigate } from 'react-router-dom';\r\nimport {\r\n  clientMyAccountUrl,\r\n  NetworkCatchErrorComponent,\r\n  ContinueFormOrReRoute,\r\n  ProgressBarComponent,\r\n  isEnabled,\r\n} from 'common';\r\nimport IncidentFormContainer from '../common/containers/incident-forms/incident-form.container';\r\nimport { TermsAndConditionsComponent } from './components/terms-and-conditions/terms-and-conditions.component';\r\nimport { RegistrationStepOneComponent } from './components/register-form-step-one/reg-form-step-one.component';\r\nimport { RegistrationStepTwoComponent } from './components/register-form-step-two/reg-form-step-two.component';\r\nimport { RegistrationStepThreeComponent } from './components/register-form-step-three/reg-form-step-three.component';\r\nimport { RegisterSuccessfulComponent } from './components/register-successful/register-successful.component';\r\nimport { RegisterSuccessfulWithWarningComponent } from './components/register-successful/register-successful-with-warning.component';\r\nimport { RegisterEmailConfirmComponent } from './components/register-email-confirm/register-email-confirm.component';\r\nimport { postRegistrationDataAsync } from './services/registration.service';\r\nimport * as formConfig from './form-config';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport MaintenanceApp from 'maintenance/maintenance.app';\r\nimport { RegistrationMaintenance } from 'common/constants/feature-flag.constants';\r\n\r\nconst getRegisterUrlPath = (pathname) => {\r\n  let finalString = pathname;\r\n  const splitString = pathname.split('/');\r\n  if (splitString[splitString.length - 1] !== 'register') {\r\n    const findRegisterIndex = splitString.indexOf('register');\r\n    finalString = splitString.slice(0, findRegisterIndex + 1).join('/');\r\n  }\r\n\r\n  return finalString;\r\n};\r\n\r\nconst RegistrationApp = (props) => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  const [currentStep, setCurrentStep] = useState(0); // Starts at 0 so email confirmation cant use it\r\n  const [formState, setFormState] = useState({ started: false, finished: false });\r\n  const [shareContactDetails, setShareContactDetails] = useState(null);\r\n  const [firstName, setFirstName] = useState('');\r\n  const [lastName, setLastName] = useState('');\r\n  const [emailAddress, setEmailAddress] = useState('');\r\n  const [password, setPassword] = useState('');\r\n  const [confirmPassword, setConfirmPassword] = useState('');\r\n  const [submitRegistrationError, setSubmitRegistrationError] = useState(false);\r\n  const [isExistingEmail, setIsExistingEmail] = useState(false);\r\n\r\n  // Location pointer\r\n  const currentBasePath = getRegisterUrlPath(location.pathname);\r\n\r\n  useEffect(() => {\r\n    if (location.pathname === clientMyAccountUrl.registration.step1) {\r\n      setCurrentStep(1);\r\n    }\r\n  }, [location.pathname]);\r\n\r\n  const handleStepOneSubmit = (values) => {\r\n    setShareContactDetails(values);\r\n    setFormState({ started: true, finished: false });\r\n    navigate(currentBasePath + clientMyAccountUrl.registration.step2);\r\n    setCurrentStep(2);\r\n  };\r\n\r\n  const handleStepTwoSubmit = (values) => {\r\n    setFirstName(values.firstName);\r\n    setLastName(values.lastName);\r\n    setEmailAddress(values.emailAddress);\r\n    setPassword(values.password);\r\n    setConfirmPassword(values.confirmPassword);\r\n    setCurrentStep(3);\r\n    navigate(currentBasePath + clientMyAccountUrl.registration.step3);\r\n  };\r\n\r\n  const handleStepThreeSubmit = async (values) => {\r\n    const formSubmitData = {\r\n      shareContactDetails: shareContactDetails,\r\n      firstName: firstName,\r\n      lastName: lastName,\r\n      email: emailAddress,\r\n      password: password,\r\n      confirmPassword: confirmPassword,\r\n      postcode: values.postcode, // Comes from form\r\n      address: values.address, // Comes from form\r\n      addressSource: values.addressSource,\r\n      uprn: values.uprn, // Comes from form\r\n      outofYork: values.outofYork, // Comes from form\r\n      telephoneNumber: values.telephone, // Comes from form\r\n    };\r\n    try {\r\n      const response = await postRegistrationDataAsync(formSubmitData);\r\n      setCurrentStep(4);\r\n      navigate(currentBasePath + clientMyAccountUrl.registration.successful);\r\n      setFormState({ started: true, finished: true });\r\n\r\n      props.onSuccessfulRegistration &&\r\n        props.onSuccessfulRegistration({ email: emailAddress, isEmailConfirmed: response.status === 202 });\r\n      setIsExistingEmail(response.status === 202);\r\n    } catch (err) {\r\n      setSubmitRegistrationError(true);\r\n      return false;\r\n    }\r\n  };\r\n\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: formState.started,\r\n      formCompleted: formState.finished,\r\n      formStartUrl: currentBasePath + clientMyAccountUrl.registration.step1,\r\n      formEndUrl: currentBasePath + clientMyAccountUrl.registration.successful,\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  const appContent = (\r\n    <Routes>\r\n      <Route path=\"/\" element={<Navigate to={location.pathname + clientMyAccountUrl.registration.step1} />} />\r\n      <Route\r\n        path={clientMyAccountUrl.registration.step1}\r\n        element={\r\n          <React.Fragment>\r\n            <TermsAndConditionsComponent />\r\n            <RegistrationStepOneComponent\r\n              shareContactDetails={shareContactDetails}\r\n              onSubmitSuccess={handleStepOneSubmit}\r\n            />\r\n          </React.Fragment>\r\n        }\r\n      />\r\n\r\n      <Route\r\n        path={clientMyAccountUrl.registration.step2}\r\n        element={\r\n          <ContinueFormOrReRoute {...formRouteInfo()}>\r\n            <RegistrationStepTwoComponent\r\n              firstName={firstName}\r\n              lastName={lastName}\r\n              emailAddress={emailAddress}\r\n              password={password}\r\n              confirmPassword={confirmPassword}\r\n              onSubmitSuccess={handleStepTwoSubmit}\r\n              goToPrevious={() => {\r\n                setCurrentStep(1);\r\n                navigate(-1);\r\n              }}\r\n            />\r\n          </ContinueFormOrReRoute>\r\n        }\r\n      />\r\n\r\n      <Route\r\n        path={clientMyAccountUrl.registration.step3}\r\n        element={\r\n          <ContinueFormOrReRoute {...formRouteInfo()}>\r\n            <NetworkCatchErrorComponent didCatchError={submitRegistrationError} />\r\n            <RegistrationStepThreeComponent\r\n              onSubmitSuccess={handleStepThreeSubmit}\r\n              goToPrevious={() => {\r\n                setCurrentStep(2);\r\n                navigate(-1);\r\n              }}\r\n            />\r\n          </ContinueFormOrReRoute>\r\n        }\r\n      />\r\n      <Route\r\n        path={clientMyAccountUrl.registration.successful}\r\n        element={\r\n          <ContinueFormOrReRoute {...formRouteInfo()}>\r\n            {isExistingEmail === true ? (\r\n              <RegisterSuccessfulWithWarningComponent />\r\n            ) : (\r\n              <RegisterSuccessfulComponent\r\n                onContinueClicked={props.onContinueClicked ? props.onContinueClicked : undefined}\r\n                extraSuccessfulContent={props.extraSuccessfulContent ? props.extraSuccessfulContent : undefined}\r\n              />\r\n            )}\r\n          </ContinueFormOrReRoute>\r\n        }\r\n      />\r\n      <Route path={clientMyAccountUrl.registration.emailConfirmation} element={<RegisterEmailConfirmComponent />} />\r\n      <Route\r\n        path=\"/\"\r\n        element={<Navigate to={clientMyAccountUrl.registration.root + clientMyAccountUrl.registration.step1} />}\r\n      />\r\n    </Routes>\r\n  );\r\n\r\n  // we need to check here whether we're at the root of the website and add IncidentFormContainer if yes\r\n  return isEnabled(FeatureFlagsService.getFeatureFlagByName(RegistrationMaintenance)) ? (\r\n    <MaintenanceApp />\r\n  ) : (\r\n    <>\r\n      {formConfig.stepUrls.includes(location.pathname.toLowerCase()) ? (\r\n        <IncidentFormContainer\r\n          displayProgressBar={() => currentStep > 0}\r\n          pageHeaderText={formConfig.pageHeaderText}\r\n          documentTitle=\"Registration\"\r\n          totalSteps={4}\r\n          currentStep={currentStep}>\r\n          {appContent}\r\n        </IncidentFormContainer>\r\n      ) : (\r\n        <>\r\n          <ProgressBarComponent totalSteps={4} currentStep={currentStep} />\r\n          {appContent}\r\n        </>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n\r\nexport default RegistrationApp;\r\nexport { getRegisterUrlPath as getRegisterUrl };\r\n","import moment from 'moment';\r\n\r\nlet session = null;\r\nlet sessionOptions = null;\r\n\r\nconst sessionActivityService = (() => {\r\n  // Begin a session, but only if the sessionOptions have already been set using the initalise method\r\n  // and no session currently exists\r\n  const beginSession = () => {\r\n    if (sessionOptions != null && session == null) {\r\n      const now = moment();\r\n\r\n      session = {\r\n        isIdle: false,\r\n        isTimingOut: false,\r\n        isTimingOutCounter: 0,\r\n        duration: moment.duration(...sessionOptions.duration),\r\n        rateLimit: moment.duration(...sessionOptions.rateLimit),\r\n        warningDuration: moment.duration(...sessionOptions.warningDuration),\r\n        timeStamp: now,\r\n        latestTimeStamp: now,\r\n        eventListeners: sessionOptions.eventListeners,\r\n      };\r\n\r\n      // wire up the eventListeners\r\n      if (session.eventListeners) {\r\n        session.eventListeners.forEach((event) => {\r\n          window.addEventListener(event, eventHandler);\r\n        });\r\n      }\r\n\r\n      // Start the interval timer\r\n      session.sessionTickInterval = setInterval(handleSessionTick, session.rateLimit.asMilliseconds());\r\n    }\r\n  };\r\n\r\n  // Refresh the session if it is currently timing out\r\n  const refreshSession = () => {\r\n    if (session && session.isTimingOut) {\r\n      session.isTimingOut = false;\r\n      session.isTimingOutCounter = 0;\r\n      // reset timestamp in case activity event hasn't been triggered\r\n      session.latestTimeStamp = moment();\r\n\r\n      // clear the timeout interval\r\n      clearInterval(session.timingOutInterval);\r\n\r\n      // and update the session\r\n      handleSessionTick();\r\n    }\r\n  };\r\n\r\n  // End a session, if one exists\r\n  const endSession = () => {\r\n    if (session) {\r\n      // Clear the previously set intervals\r\n      clearInterval(session.sessionTickInterval);\r\n      clearInterval(session.timingOutInterval);\r\n\r\n      // remove the eventListeners\r\n      session.eventListeners.forEach((event) => {\r\n        window.removeEventListener(event, eventHandler);\r\n      });\r\n\r\n      session = null;\r\n    }\r\n  };\r\n\r\n  // End a session and then remove the sessionOptions\r\n  const removeSession = () => {\r\n    endSession();\r\n    sessionOptions = null;\r\n  };\r\n\r\n  // The event that is called from the event listeners\r\n  // or called from the triggerActivity public method\r\n  const eventHandler = () => {\r\n    if (session) {\r\n      session.latestTimeStamp = moment();\r\n\r\n      if (session.isIdle) {\r\n        handleSessionTick();\r\n        session.isIdle = false;\r\n      }\r\n    }\r\n  };\r\n\r\n  const handleSessionTick = () => {\r\n    if (session && session.isTimingOut === false) {\r\n      if (session.latestTimeStamp > session.timeStamp) {\r\n        // Reset the timestamp to the last time an action was registered\r\n        session.timeStamp = session.latestTimeStamp;\r\n        // Execute the callback method\r\n        sessionOptions.refreshCallback();\r\n      } else {\r\n        // If no new events have been captured then the session is now idle\r\n        // This enables the next event to trigger this method immediately\r\n        session.isIdle = true;\r\n      }\r\n\r\n      // Get the elapsed time from the last timeStamp\r\n      const elapsedTime = moment() - session.timeStamp;\r\n\r\n      // Check whether we've timed out without going through the isTimingOut process (e.g. tab not active)\r\n      if (elapsedTime >= session.duration) {\r\n        endSession();\r\n        sessionOptions.timedOutCallback();\r\n      }\r\n      // Check whether we need to start the isTimingOut process\r\n      else if (elapsedTime >= session.duration - session.warningDuration) {\r\n        // Set the timing out process going\r\n        session.isTimingOut = true;\r\n        session.isTimingOutCounter = session.warningDuration / 1000;\r\n\r\n        // Set up the timing out interval, to update once a second\r\n        session.timingOutInterval = setInterval(handleTimingOutCountdown, 1000);\r\n      }\r\n    }\r\n  };\r\n\r\n  // Method that is called to count down the timing out process\r\n  const handleTimingOutCountdown = () => {\r\n    session.isTimingOutCounter--;\r\n\r\n    if (session.isTimingOutCounter < 0) {\r\n      endSession();\r\n      sessionOptions.timedOutCallback();\r\n    } else {\r\n      // Call the timing out warning callback, with the remaining number of seconds\r\n      sessionOptions.warningCallback(session.isTimingOutCounter + 1);\r\n    }\r\n  };\r\n  // #endregion\r\n\r\n  // #region - Public methods\r\n  return {\r\n    initialise: (options) => (sessionOptions = options),\r\n    begin: () => beginSession(),\r\n    refresh: () => refreshSession(),\r\n    remove: () => removeSession(),\r\n    end: () => endSession(),\r\n    triggerActivity: () => eventHandler(),\r\n  };\r\n  // #endregion\r\n})();\r\n\r\nexport default sessionActivityService;\r\n","import React from 'react';\r\nimport { Form, withFormik } from 'formik';\r\nimport { Link, useNavigate } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { ButtonComponent as Button, ButtonClasses, TableComponent, TableClasses } from 'cyc-react-ui-components';\r\n\r\nimport './web-chat-form-my-account.component.scss';\r\nimport { clientMyAccountUrl as urls, apiMyAccountUrl } from '../../../common';\r\nimport { FaRegEdit } from 'react-icons/fa';\r\n\r\nconst WebChatFormMyAccount = ({ isSubmitting, firstName, lastName, email }) => {\r\n  const navigate = useNavigate();\r\n  const signOut = () => {\r\n    const signOutPath = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_LOGOUT}`;\r\n    CYCServices.JWTAuth.signOut(signOutPath);\r\n    navigate(urls.signIn);\r\n  };\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <div className=\"row\">\r\n        <div className=\"col\">\r\n          <p>You're signed in with My Account</p>\r\n          <TableComponent className={TableClasses.restyle}>\r\n            <thead>\r\n              <tr>\r\n                <th>Field</th>\r\n                <th>Value</th>\r\n                <th>Action</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody>\r\n              <tr>\r\n                <td>First name</td>\r\n                <td>{firstName}</td>\r\n                <td></td>\r\n              </tr>\r\n              <tr>\r\n                <td>Last name</td>\r\n                <td>{lastName}</td>\r\n                <td></td>\r\n              </tr>\r\n              <tr>\r\n                <td>Email address</td>\r\n                <td>{email}</td>\r\n                <td>\r\n                  <Link to={urls.account.root + urls.account.email.change} title=\"Change email address\">\r\n                    <FaRegEdit title={'Change email'} />\r\n                  </Link>\r\n                </td>\r\n              </tr>\r\n            </tbody>\r\n          </TableComponent>\r\n          <p>\r\n            Not you?{' '}\r\n            <button className=\"in-text-button\" onClick={signOut}>\r\n              Sign out\r\n            </button>\r\n          </p>\r\n        </div>\r\n      </div>\r\n      <Form>\r\n        <div className=\"row\">\r\n          <div className=\"col-12\">\r\n            <Button type=\"submit\" className={ButtonClasses.primary + ' float-right'} disabled={isSubmitting}>\r\n              Confirm\r\n            </Button>\r\n          </div>\r\n        </div>\r\n      </Form>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nWebChatFormMyAccount.propTypes = {\r\n  firstName: PropTypes.string.isRequired,\r\n  lastName: PropTypes.string.isRequired,\r\n  email: PropTypes.string.isRequired,\r\n  onSubmit: PropTypes.func,\r\n};\r\n\r\nexport default withFormik({\r\n  mapPropsToValues: (props) => props,\r\n  handleSubmit(values, bag) {\r\n    bag.props.onSubmit(values);\r\n  },\r\n})(WebChatFormMyAccount);\r\n","import React, { useContext } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { Formik, Form } from 'formik';\r\nimport { Link } from 'react-router-dom';\r\nimport * as Yup from 'yup';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport appInsights from 'cyc-application-insights-react';\r\nimport { CYCServices } from 'cyc-services';\r\nimport {\r\n  InputLabelComponent,\r\n  ButtonClasses,\r\n  TextInputComponent,\r\n  InputErrorComponent,\r\n  SubmitButtonAxiosComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport { clientMyAccountUrl, apiMyAccountUrl, ErrorBoxComponent, UserContext } from '../../common';\r\nimport sessionActivityService from '../../common/services/session-activity.service';\r\n\r\nconst SignInFormComponent = ({ onSuccessfulSignIn, registerLinkUrl, email, password }) => {\r\n  const userContext = useContext(UserContext);\r\n  const navigate = useNavigate();\r\n\r\n  const validationSchema = Yup.object().shape({\r\n    email: Yup.string().email().required(\"Please supply details for 'Email address'.\"),\r\n    password: Yup.string().required(\"Please supply details for 'Password'.\"),\r\n  });\r\n\r\n  const initialValues = {\r\n    email: email || '',\r\n    password: password || '',\r\n    submitError: '',\r\n  };\r\n\r\n  const signInUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.ACCOUNT_LOGIN}`;\r\n\r\n  const handleSuccessfulSignIn = () => {\r\n    const user = CYCServices.JWTAuth.getProfile();\r\n    userContext.setStore('firstName', user.given_name);\r\n    userContext.setStore('lastName', user.family_name);\r\n    sessionActivityService.begin();\r\n\r\n    // call additional successful sign in function if there is any, otherwise redirect to dashboard.\r\n    if (onSuccessfulSignIn) {\r\n      onSuccessfulSignIn();\r\n    } else {\r\n      navigate(clientMyAccountUrl.dashboard);\r\n    }\r\n  };\r\n\r\n  const submitForm = async (values) => {\r\n    values.submitError = '';\r\n\r\n    try {\r\n      const response = await CYCServices.JWTAuth.authenticateAsync(values.email, values.password, signInUrl);\r\n      values.password = '';\r\n\r\n      if (response.success === true) {\r\n        handleSuccessfulSignIn();\r\n      } else if (response.status === 401) {\r\n        values.submitError = 'The email or password you entered is incorrect or your account has been disabled.';\r\n      }\r\n    } catch (ex) {\r\n      values.password = '';\r\n\r\n      if (ex.response && ex.response.status === 401) {\r\n        values.submitError = 'The email or password you entered is incorrect or your account has been disabled.';\r\n      } else {\r\n        values.submitError = 'System error, please try again';\r\n        console.error(ex);\r\n      }\r\n\r\n      appInsights.trackException({\r\n        exception: new Error('Failed to submit sign in form'),\r\n        properties: { email: values.email },\r\n      });\r\n    }\r\n  };\r\n\r\n  return (\r\n    <Formik\r\n      validationSchema={validationSchema}\r\n      initialValues={initialValues}\r\n      enableReinitialize={true}\r\n      onSubmit={submitForm}>\r\n      {(props) => {\r\n        const { values, errors, touched, setFieldValue, handleSubmit } = props;\r\n        const emailHasError = errors.email && touched.email;\r\n        const passwordHasError = errors.password && touched.password;\r\n        return (\r\n          <Form noValidate={true}>\r\n            {Object.keys(errors).length > 0 && touched.email && touched.password && <ErrorBoxComponent />}\r\n            {Object.keys(errors).length === 0 && values.submitError && (\r\n              <ErrorBoxComponent jumpButton={false} text={values.submitError} />\r\n            )}\r\n            <div className=\"row\">\r\n              <div className=\"form-group\">\r\n                <p>Sign in with an existing My Account.</p>\r\n              </div>\r\n            </div>\r\n            <div className=\"row\">\r\n              <div className=\"form-group w-100\">\r\n                <InputLabelComponent htmlFor=\"email\" required={true} error={emailHasError}>\r\n                  Email\r\n                </InputLabelComponent>\r\n                <TextInputComponent\r\n                  id=\"email\"\r\n                  type=\"email\"\r\n                  name=\"email\"\r\n                  value={values.email}\r\n                  onChange={(e) => setFieldValue('email', e.target.value)}\r\n                  error={emailHasError}\r\n                />\r\n                {emailHasError && <InputErrorComponent>{errors.email}</InputErrorComponent>}\r\n              </div>\r\n            </div>\r\n            <div className=\"row\">\r\n              <div className=\"form-group w-100\">\r\n                <InputLabelComponent htmlFor=\"password\" required={true} error={passwordHasError}>\r\n                  Password\r\n                </InputLabelComponent>\r\n                <TextInputComponent\r\n                  id=\"password\"\r\n                  type=\"password\"\r\n                  name=\"password\"\r\n                  value={values.password}\r\n                  onChange={(e) => setFieldValue('password', e.target.value)}\r\n                  error={passwordHasError}\r\n                />\r\n                {passwordHasError && <InputErrorComponent>{errors.password}</InputErrorComponent>}\r\n              </div>\r\n            </div>\r\n            <div className=\"row\">\r\n              <div className=\"form-group w-100\">\r\n                <SubmitButtonAxiosComponent\r\n                  type=\"submit\"\r\n                  url={signInUrl}\r\n                  className={ButtonClasses.primary + ' float-right'}\r\n                  pending=\"Signing in\"\r\n                  title=\"Sign in\"\r\n                  done=\"Done\"\r\n                  failed=\"Sign in\"\r\n                  allowReSubmit={true}\r\n                  onClick={handleSubmit}\r\n                />\r\n              </div>\r\n            </div>\r\n            <div className=\"row\">\r\n              <div className=\"col\">\r\n                <p>\r\n                  <Link to={clientMyAccountUrl.account.root + clientMyAccountUrl.account.password.forgot}>\r\n                    Forgot your password?\r\n                  </Link>\r\n                </p>\r\n              </div>\r\n            </div>\r\n\r\n            <div className=\"row\">\r\n              <div className=\"col\">\r\n                <h2>Register for My Account</h2>\r\n                <p>\r\n                  <Link to={registerLinkUrl}>Register for My Account</Link> to see the status/progress of all services\r\n                  and reported problems by signing in online. My Account stores your information, making it quick and\r\n                  easy to report problems, complete forms and make payments.\r\n                </p>\r\n              </div>\r\n            </div>\r\n          </Form>\r\n        );\r\n      }}\r\n    </Formik>\r\n  );\r\n};\r\n\r\nSignInFormComponent.propTypes = {\r\n  onSuccessfulSignIn: PropTypes.func,\r\n  registerLinkUrl: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default SignInFormComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useLocation } from 'react-router-dom';\r\nimport SignInFormComponent from '../components/sign-in-form.component';\r\nimport { clientMyAccountUrl, PageHeaderComponent, DocumentTitleComponent, MyAccountPageComponent } from '../../common';\r\nconst SignInContainer = ({ onSuccessfulSignIn }) => {\r\n  let location = useLocation();\r\n\r\n  // We are going to find the path we are at, to make this the path for the Register link\r\n  const currentPath = location.pathname;\r\n\r\n  // We will split this at the point we reach the sign in url\r\n  const preSignInPath = currentPath.split(clientMyAccountUrl.signIn)[0];\r\n\r\n  // Append the registration path onto this\r\n  const registerLinkUrl = `${preSignInPath}${clientMyAccountUrl.registration.root}${clientMyAccountUrl.registration.step1}`;\r\n\r\n  return (\r\n    <DocumentTitleComponent title=\"My Account - Sign in\">\r\n      {location.pathname.toLowerCase() === clientMyAccountUrl.signIn.toLowerCase() ? (\r\n        <PageHeaderComponent text=\"Sign in\" icon=\"icon-website\" />\r\n      ) : (\r\n        <React.Fragment />\r\n      )}\r\n\r\n      <MyAccountPageComponent>\r\n        <SignInFormComponent onSuccessfulSignIn={onSuccessfulSignIn} registerLinkUrl={registerLinkUrl} />\r\n      </MyAccountPageComponent>\r\n    </DocumentTitleComponent>\r\n  );\r\n};\r\n\r\nSignInContainer.propTypes = {\r\n  onSuccessfulSignIn: PropTypes.func,\r\n};\r\n\r\nexport default SignInContainer;\r\n","function WebChatRedirect(props) {\r\n  window.location.href = props.url;\r\n  return null;\r\n}\r\n\r\nexport default WebChatRedirect;\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport './report-search-input.component.scss';\r\nimport { ButtonComponent, ButtonClasses, TextInputComponent } from 'cyc-react-ui-components';\r\n\r\nconst ReportSearchInputComponent = ({ onSearch }) => {\r\n  const [searchValue, setSearchValue] = useState('');\r\n\r\n  const handleSubmit = (e) => {\r\n    e.preventDefault();\r\n    onSearch(searchValue);\r\n  };\r\n\r\n  return (\r\n    <div className=\"report-search-input\">\r\n      <form onSubmit={handleSubmit}>\r\n        <label htmlFor=\"search\">\r\n          <small>Search your report history by entering your reference number or keywords here</small>\r\n        </label>\r\n        <TextInputComponent\r\n          type=\"search\"\r\n          id=\"search\"\r\n          value={searchValue}\r\n          onChange={(e) => setSearchValue(e.target.value)}\r\n        />\r\n        <ButtonComponent type=\"submit\" className={ButtonClasses.primary}>\r\n          Search\r\n        </ButtonComponent>\r\n      </form>\r\n    </div>\r\n  );\r\n};\r\n\r\nReportSearchInputComponent.propTypes = {\r\n  onSearch: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ReportSearchInputComponent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst ReportSearchCounterComponent = ({ currentMin, currentMax, max }) => (\r\n  <span className=\"report-search-results-table__result-counter\">\r\n    Results:{' '}\r\n    <strong>{max === 0 ? '0' : currentMin + 1}</strong> -{' '}\r\n    <strong>{max === 0 ? '0' : currentMax + 1}</strong> of{' '}\r\n    <strong>{max}</strong>\r\n  </span>\r\n);\r\n\r\nReportSearchCounterComponent.propTypes = {\r\n  max: PropTypes.number.isRequired,\r\n  currentMax: PropTypes.number.isRequired,\r\n  currentMin: PropTypes.number.isRequired,\r\n};\r\n\r\nexport default ReportSearchCounterComponent;\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nimport { TableComponent, ButtonComponent, ButtonClasses, TableClasses } from 'cyc-react-ui-components';\r\n\r\nimport { clientMyAccountUrl as urls, isEnabled, ReportDetailsOutcome } from '../../../common';\r\nimport ReportSearchCounter from '../report-search-counter/report-search-counter.component';\r\n\r\nimport './report-search-results-table.component.scss';\r\n\r\nconst ReportSearchResultsTableComponent = ({ results, webchatSourceId }) => {\r\n  // This could be turned into state if we ever need to change then no. results per page.\r\n  const resultsPerPage = 20;\r\n\r\n  const [currentPage, setCurrentPage] = useState(0);\r\n  const [sortOrder, setSortOrder] = useState('created');\r\n  const [sortDescending, setSortDescending] = useState(true);\r\n\r\n  useEffect(() => {\r\n    setCurrentPage(0);\r\n  }, [results]);\r\n\r\n  const sortClasses = useMemo(() => (sortDescending === false ? 'sort' : 'sort desc'), [sortDescending]);\r\n\r\n  const [renderingResults, start, end] = useMemo(() => {\r\n    const sorted = [...results].sort((a, b) => {\r\n      if (a[sortOrder] < b[sortOrder]) return -1;\r\n      if (a[sortOrder] > b[sortOrder]) return 1;\r\n      return 0;\r\n    });\r\n    if (sortDescending) {\r\n      sorted.reverse();\r\n    }\r\n    const start = currentPage * resultsPerPage;\r\n    const end = start + resultsPerPage > sorted.length ? sorted.length : start + resultsPerPage;\r\n\r\n    return [sorted.slice(start, end), start, end];\r\n  }, [sortDescending, sortOrder, results, currentPage]);\r\n\r\n  const handleSortClick = (order) => {\r\n    if (order === sortOrder) {\r\n      setSortDescending(!sortDescending);\r\n    } else {\r\n      setSortOrder(order);\r\n    }\r\n    setCurrentPage(0);\r\n  };\r\n\r\n  const handlePreviousPageClick = () => currentPage > 0 && setCurrentPage(currentPage - 1);\r\n\r\n  const handleNextPageClick = () => {\r\n    const nextPage = currentPage + 1;\r\n\r\n    if (canShowPage(nextPage)) {\r\n      setCurrentPage(nextPage);\r\n    }\r\n  };\r\n\r\n  const canShowPage = (nextPage) => nextPage * resultsPerPage < results.length;\r\n\r\n  return (\r\n    <div className=\"report-search-results-table\">\r\n      <ReportSearchCounter max={renderingResults.length} currentMin={start} currentMax={end - 1} />\r\n      {/* This div is for scroll bar on table */}\r\n      <div className=\"report-search-results-table__wrapper\">\r\n        <TableComponent className={TableClasses.restyle}>\r\n          <thead>\r\n            <tr>\r\n              <th onClick={() => handleSortClick('reference')} className={sortOrder === 'reference' ? sortClasses : ''}>\r\n                Reference\r\n              </th>\r\n              <th onClick={() => handleSortClick('created')} className={sortOrder === 'created' ? sortClasses : ''}>\r\n                Date created\r\n              </th>\r\n              <th onClick={() => handleSortClick('subject')} className={sortOrder === 'subject' ? sortClasses : ''}>\r\n                Subject\r\n              </th>\r\n              <th onClick={() => handleSortClick('location')} className={sortOrder === 'location' ? sortClasses : ''}>\r\n                Location\r\n              </th>\r\n              {isEnabled(FeatureFlagsService.getFeatureFlagByName(ReportDetailsOutcome)) ? (\r\n                <th onClick={() => handleSortClick('outcome')} className={sortOrder === 'outcome' ? sortClasses : ''}>\r\n                  Outcome\r\n                </th>\r\n              ) : (\r\n                <th onClick={() => handleSortClick('status')} className={sortOrder === 'status' ? sortClasses : ''}>\r\n                  Status\r\n                </th>\r\n              )}\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            {results?.length > 0 ? (\r\n              renderingResults.map((result, key) => (\r\n                <tr key={key}>\r\n                  <td>\r\n                    <span className={TableClasses.inlineHeader}>Reference: </span>\r\n                    <Link\r\n                      to={`${urls.myReports.root}${urls.myReports.details}/${result.reference}/${encodeURIComponent(\r\n                        result.product\r\n                      )}`}>\r\n                      {result.reference}\r\n                    </Link>\r\n                  </td>\r\n                  <td>\r\n                    <span className={TableClasses.inlineHeader}>Date created: </span>\r\n                    {result.created && moment(result.created).format('DD/MM/YYYY')}\r\n                  </td>\r\n                  <td>\r\n                    <span className={TableClasses.inlineHeader}>Subject: </span>\r\n                    {result.subject}\r\n                  </td>\r\n                  <td>\r\n                    <span className={TableClasses.inlineHeader}>Location: </span>\r\n                    {result.location === ''\r\n                      ? result.sourceId === webchatSourceId\r\n                        ? ''\r\n                        : 'Selected on map'\r\n                      : result.location}\r\n                  </td>\r\n                  {isEnabled(FeatureFlagsService.getFeatureFlagByName(ReportDetailsOutcome)) ? (\r\n                    <td>\r\n                      <span className={TableClasses.inlineHeader}>Outcome: </span>\r\n                      {result.outcome ? result.outcome : result.status}\r\n                    </td>\r\n                  ) : (\r\n                    <td>\r\n                      <span className={TableClasses.inlineHeader}>Status: </span>\r\n                      {result.status}\r\n                    </td>\r\n                  )}\r\n                </tr>\r\n              ))\r\n            ) : (\r\n              <tr>\r\n                <td colSpan=\"5\">No records found</td>\r\n              </tr>\r\n            )}\r\n          </tbody>\r\n        </TableComponent>\r\n      </div>\r\n\r\n      <div className=\"float-right\">\r\n        {currentPage !== 0 && (\r\n          <ButtonComponent\r\n            className={ButtonClasses.secondary}\r\n            onClick={handlePreviousPageClick}\r\n            title=\"Previous page of results\">\r\n            &lt;\r\n          </ButtonComponent>\r\n        )}\r\n        <ButtonComponent className={ButtonClasses.secondary} title=\"Current page\">\r\n          Page {currentPage + 1}\r\n        </ButtonComponent>\r\n        {canShowPage(currentPage + 1) && (\r\n          <ButtonComponent\r\n            className={ButtonClasses.secondary}\r\n            onClick={handleNextPageClick}\r\n            title=\"Next page of results\">\r\n            &gt;\r\n          </ButtonComponent>\r\n        )}\r\n      </div>\r\n      <div className=\"clear-fix\" />\r\n    </div>\r\n  );\r\n};\r\n\r\nReportSearchResultsTableComponent.propTypes = {\r\n  results: PropTypes.array.isRequired,\r\n  webchatSourceId: PropTypes.number,\r\n};\r\n\r\nexport default ReportSearchResultsTableComponent;\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { apiMyAccountUrl as urls, categoriesToIgnoreInReports } from '../../common';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nconst getReports = async () => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) {\r\n    throw new Error('Client must be authenticated to perform this call');\r\n  }\r\n\r\n  const url = `${ConfigurationService.store.apiUrl}${urls.CUSTOMER_INCIDENTS}`;\r\n  const auth = `Bearer ${CYCServices.JWTAuth.getToken()}`;\r\n  const result = await axios\r\n    .get(url, {\r\n      headers: {\r\n        Authorization: auth,\r\n      },\r\n    })\r\n    .catch((ex) => {\r\n      console.error(ex);\r\n      appInsights.trackException({ exception: ex });\r\n      throw ex;\r\n    });\r\n\r\n  const categoryIdsToFilter = categoriesToIgnoreInReports.map((category) => {\r\n    let drillDownArray = [...category.drillDownArray];\r\n    drillDownArray.push(category.settingName);\r\n    return ConfigurationService.getDrillDownSettingValue(drillDownArray).id;\r\n  });\r\n\r\n  return result.data\r\n    .filter((incident) => !categoryIdsToFilter.includes(incident.categoryId.toString()))\r\n    .map((incident) => ({\r\n      incidentId: incident.incidentId,\r\n      reference: incident.referenceNumber,\r\n      created: new Date(incident.createdTime),\r\n      subject: incident.subject || '',\r\n      status: incident.status || '',\r\n      outcome: incident.outcome || '',\r\n      location: incident.location || '',\r\n      sourceId: incident.sourceId || '',\r\n      productId: incident.productId || -1,\r\n      product: incident.product || ''\r\n    }));\r\n};\r\n\r\nexport { getReports };\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport ReportSearchInputComponent from '../../components/report-search-input/report-search-input.component';\r\nimport ReportSearchResultsTableComponent from '../../components/report-search-results-table/report-search-results-table.component';\r\nimport { getReports } from '../../services/my-reports.service';\r\nimport {\r\n  NetworkLoaderComponent,\r\n  DocumentTitleComponent,\r\n  MyAccountPageComponent,\r\n  PageHeaderComponent,\r\n  clientMyAccountUrl,\r\n  incidentSourceIdsSettingName,\r\n  incidentSourceSettingNames,\r\n} from '../../../common';\r\n\r\nimport './MyReportsIndex.container.scss';\r\n\r\nconst MyReportsIndexContainer = () => {\r\n  const [reports, setReports] = useState([]);\r\n  const [searchValue, setSearchValue] = useState();\r\n  const [reportsPromise, setReportsPromise] = useState();\r\n  const [webChatSourceId, setWebChatSourceId] = useState();\r\n\r\n  useEffect(() => {\r\n    const initialise = async () => {\r\n      const reportsPromise = getReports()\r\n        .then(setReports);\r\n      setReportsPromise(reportsPromise);\r\n    };\r\n    const webchatSourceSettings = ConfigurationService.getDrillDownSettingValue([\r\n      incidentSourceIdsSettingName,\r\n      incidentSourceSettingNames.webchat,\r\n    ]);\r\n    const webChatSourceId = webchatSourceSettings ? webchatSourceSettings.id : undefined;\r\n    setWebChatSourceId(webChatSourceId);\r\n    initialise();\r\n  }, []);\r\n\r\n  const handleSearch = (searchValue) => {\r\n    if (searchValue !== undefined && searchValue.length > 0) {\r\n      setSearchValue(searchValue);\r\n    } else {\r\n      setSearchValue(undefined);\r\n    }\r\n  };\r\n\r\n  const results = useMemo(() => {\r\n    const lowerCaseSearchValue = searchValue !== undefined ? searchValue.toLowerCase() : undefined;\r\n    if (lowerCaseSearchValue !== undefined) {\r\n      return reports.filter((report) => {\r\n        if (\r\n          report.reference.toLowerCase().indexOf(lowerCaseSearchValue) > -1 ||\r\n          report.subject.toLowerCase().indexOf(lowerCaseSearchValue) > -1 ||\r\n          report.location.toLowerCase().indexOf(lowerCaseSearchValue) > -1 ||\r\n          report.status.toLowerCase().indexOf(lowerCaseSearchValue) > -1\r\n        ) {\r\n          return true;\r\n        } else return false;\r\n      });\r\n    }\r\n    return reports;\r\n  }, [reports, searchValue]);\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"My reports\" icon=\"icon-website\" />\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My Account - my reports\">\r\n          <ReportSearchInputComponent onSearch={handleSearch} />\r\n          {reportsPromise && (\r\n            <NetworkLoaderComponent request={reportsPromise}>\r\n              <ReportSearchResultsTableComponent results={results} webchatSourceId={webChatSourceId} />\r\n            </NetworkLoaderComponent>\r\n          )}\r\n          <p>\r\n            <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n              Back to My Account\r\n            </Link>\r\n          </p>\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default MyReportsIndexContainer;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  processCategoryIdsSettingName,\r\n  categoryIdsSettingName,\r\n  streetFurnitureSettingName,\r\n  vegetationSettingName,\r\n  vegetationTypesSettingName,\r\n} from '../../common';\r\n\r\nexport const reportDetailsItems = [\r\n  {\r\n    productLookupName: 'Street Cleaning',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.streetCleaning,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Street Lighting',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Light number', paramName: 'assetId' },\r\n      { displayName: 'Light type', paramName: 'streetLightType' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          const obj = Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.streetLighting,\r\n            ])\r\n          ).find((category) => category.id === key.toString());\r\n          if (obj) {\r\n            return obj.displayName;\r\n          }\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Fly-tipping',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'Type of waste',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.flyTipping,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Other', paramName: 'flytippingOther' },\r\n      { displayName: 'Amount of waste', paramName: 'sizeOfWaste' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Graffiti',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'What graffiti is on',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.graffiti,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Offensive?', paramName: 'offensiveGraffiti' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Road and Pavement problems',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.roadAndPavementProblems,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Problem with', paramName: 'roadDefectsType' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Salt bins',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      {\r\n        displayName: 'Problem type',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.saltBins,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Water and drainage problem',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      { displayName: 'Problem with', paramName: 'waterDrainageType' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.waterAndDrainage,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Webchat',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Department', paramName: 'product' },\r\n      {\r\n        displayName: 'Enquiry type',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.entries(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              categoryIdsSettingName,\r\n              processCategoryIdsSettingName.saltBins,\r\n            ])\r\n          )\r\n            .map((category) => category[1])\r\n            .find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Status', paramName: 'status' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Dog/litter bins',\r\n    reportItems: [\r\n      { displayName: 'Incident reference number', paramName: 'referenceNumber' },\r\n      { displayName: 'Location', paramName: 'locationDescription' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      { displayName: 'Street', paramName: 'streetName' },\r\n      { displayName: 'Bin type', paramName: 'binsType' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      {\r\n        displayName: 'Problem type',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              processCategoryIdsSettingName.dogAndLitterBins,\r\n              categoryIdsSettingName,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Dog/litter bins missing asset',\r\n    reportItems: [\r\n      { displayName: 'Incident reference number', paramName: 'referenceNumber' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      {\r\n        displayName: 'What is the problem?',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              processCategoryIdsSettingName.dogAndLitterBins,\r\n              categoryIdsSettingName,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Street furniture problem',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Problem with', paramName: 'streetFurnitureType' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          const streetFurnitureSettings = ConfigurationService.getDrillDownSettingValue([\r\n            streetFurnitureSettingName,\r\n            'types',\r\n          ]);\r\n          for (let props in streetFurnitureSettings) {\r\n            let category = Object.values(streetFurnitureSettings[props]['categories']).find(\r\n              (x) => x.id === key.toString()\r\n            );\r\n            if (category !== undefined) {\r\n              return category.displayName;\r\n            }\r\n          }\r\n        },\r\n      },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Sign problem',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Problem with', paramName: 'signType' },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([\r\n              processCategoryIdsSettingName.roadAndStreetSign,\r\n              categoryIdsSettingName,\r\n            ])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Vegetation',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      {\r\n        displayName: 'Problem with',\r\n        paramName: 'vegetationTypeId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([vegetationSettingName, vegetationTypesSettingName])\r\n          ).find((type) => type.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      {\r\n        displayName: 'About the problem',\r\n        paramName: 'categoryId',\r\n        render: (key) => {\r\n          return Object.values(\r\n            ConfigurationService.getDrillDownSettingValue([vegetationSettingName, categoryIdsSettingName])\r\n          ).find((category) => category.id === key.toString()).displayName;\r\n        },\r\n      },\r\n      { displayName: 'Additional details', paramName: 'additionalProblemInformation' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n    ],\r\n  },\r\n  {\r\n    productLookupName: 'Default',\r\n    reportItems: [\r\n      { displayName: 'Reference', paramName: 'referenceNumber' },\r\n      { displayName: 'Date created', paramName: 'createdTime' },\r\n      { displayName: 'Location', paramName: 'streetName' },\r\n      { displayName: 'Additional location information', paramName: 'additionalInformation' },\r\n    ],\r\n  },\r\n];\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport { DataArrayTableComponent, TableClasses } from 'cyc-react-ui-components';\r\n\r\nimport './report-details.component.scss';\r\n\r\nconst ReportDetailsComponent = ({ details, files, hideUploadPhoto }) => {\r\n  const data = useMemo(() => {\r\n    const renderData = details.map((item) => ({\r\n      col1: item.displayName,\r\n      col2: item.displayName === 'Date created' ? moment(item.value).format('DD MMM YYYY, hh:mm A') : item.value,\r\n    }));\r\n\r\n    if (hideUploadPhoto !== true) {\r\n      renderData.push({\r\n        col1: 'Upload a photo',\r\n        col2: (\r\n          <ul className=\"report-details-component__report-attachment-list\">\r\n            {files.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ),\r\n      });\r\n    }\r\n\r\n    return renderData;\r\n  }, [details, files, hideUploadPhoto]);\r\n\r\n  return (\r\n    <div className=\"report-details-component\">\r\n      <h2>Details</h2>\r\n      <DataArrayTableComponent className={TableClasses.restyle} headers={['Question', 'Answer']} data={data} />\r\n    </div>\r\n  );\r\n};\r\n\r\nReportDetailsComponent.propTypes = {\r\n  details: PropTypes.array.isRequired,\r\n  files: PropTypes.array.isRequired,\r\n  hideUploadPhoto: PropTypes.bool,\r\n};\r\n\r\nexport default ReportDetailsComponent;\r\n","import React, { useState } from 'react';\r\nimport { withFormik, Form } from 'formik';\r\nimport PropTypes from 'prop-types';\r\nimport { FileInputComponent } from '../../../common';\r\nimport { TextareaInputComponent, HelpTextComponent, ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst AdditionalInfoPage = ({ values, maxFileUploadCount }) => {\r\n  const [additionalInformation, setAdditionalInformation] = useState('');\r\n  const [uploadedFiles, setUploadedFiles] = useState([]);\r\n  const [submitIsDisabled, setSubmitIsDisabled] = useState(true);\r\n\r\n  const resetForm = () => {\r\n    setAdditionalInformation('');\r\n    setUploadedFiles([]);\r\n    setSubmitIsDisabled(true);\r\n  };\r\n\r\n  const handleAdditionalInformationChange = (e) => {\r\n    setAdditionalInformation(e.target.value);\r\n\r\n    if (e.target.value === '' && uploadedFiles.length === 0) {\r\n      setSubmitIsDisabled(true);\r\n    } else {\r\n      setSubmitIsDisabled(false);\r\n    }\r\n  };\r\n\r\n  const handleUploadFiles = (files) => {\r\n    // clone old state\r\n    const newFilesState = uploadedFiles.splice(0);\r\n    newFilesState.push(...files);\r\n\r\n    setUploadedFiles(newFilesState);\r\n    setSubmitIsDisabled(false);\r\n  };\r\n\r\n  const handleRemoveFile = (index) => {\r\n    const newFilesState = uploadedFiles.splice(0);\r\n    newFilesState.splice(index, 1);\r\n\r\n    setUploadedFiles(newFilesState);\r\n\r\n    if (additionalInformation === '' && newFilesState.length === 0) {\r\n      setSubmitIsDisabled(true);\r\n    } else {\r\n      setSubmitIsDisabled(false);\r\n    }\r\n  };\r\n\r\n  const handleSubmit = (e) => {\r\n    e.preventDefault();\r\n    values.submitIncident(additionalInformation, uploadedFiles);\r\n    resetForm();\r\n  };\r\n\r\n  return (\r\n    <div>\r\n      <Form noValidate onSubmit={handleSubmit}>\r\n        <div>\r\n          <h2 className=\"mt-3\">Additional information</h2>\r\n          <TextareaInputComponent\r\n            value={additionalInformation}\r\n            onChange={handleAdditionalInformationChange}\r\n            name=\"additionalInformation\"\r\n            placeholder=\"Additional information\"\r\n            rows=\"5\"\r\n          />\r\n          <HelpTextComponent>Help: Provide further details, if needed</HelpTextComponent>\r\n        </div>\r\n        <div>\r\n          <h2 className=\"mt-3\">Upload a photo</h2>\r\n          <FileInputComponent\r\n            uploadedFiles={uploadedFiles}\r\n            onUploadFiles={handleUploadFiles}\r\n            onRemoveFile={handleRemoveFile}\r\n            maxFileUploadCount={maxFileUploadCount}\r\n          />\r\n          <div className=\"row\">\r\n            <div className=\"col\">\r\n              <ButtonComponent\r\n                className={ButtonClasses.primary + ' float-right'}\r\n                type=\"submit\"\r\n                disabled={submitIsDisabled}>\r\n                Submit\r\n              </ButtonComponent>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst AdditionalInfoComponent = withFormik({\r\n  mapPropsToValues({ submitIncident }) {\r\n    return {\r\n      submitIncident: submitIncident,\r\n    };\r\n  },\r\n})(AdditionalInfoPage);\r\n\r\nAdditionalInfoComponent.propTypes = {\r\n  submitIncident: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default AdditionalInfoComponent;\r\nexport { AdditionalInfoPage };\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport './communication-history.component.scss';\r\nimport { TableComponent, TableClasses } from 'cyc-react-ui-components';\r\n\r\nconst CommunicationHistoryComponent = ({ commHistory }) => (\r\n  <div className=\"communication-history\">\r\n    <h2>Communication history</h2>\r\n    {commHistory != null && commHistory.length > 0 ? (\r\n      commHistory.map((item, index) => (\r\n        <TableComponent className={TableClasses.restyle} key={index}>\r\n          <tbody>\r\n            <tr>\r\n              <td>\r\n                <div>\r\n                  <div>\r\n                    <b>{item.origin}</b>\r\n                  </div>\r\n                  <div>\r\n                    <b>{moment(item.createdTime).format('DD/MM/YYYY hh:mm A')}</b>\r\n                  </div>\r\n                </div>\r\n              </td>\r\n            </tr>\r\n            <tr>\r\n              <td dangerouslySetInnerHTML={{ __html: item.text.replace(/<\\/?SPAN[^>]*>/g, '') }}></td>\r\n            </tr>\r\n          </tbody>\r\n        </TableComponent>\r\n      ))\r\n    ) : (\r\n      <div className=\"communication-history__no-record\">\r\n        <p>No communication history is found</p>\r\n      </div>\r\n    )}\r\n  </div>\r\n);\r\n\r\nCommunicationHistoryComponent.propTypes = {\r\n  commHistory: PropTypes.oneOfType([\r\n    PropTypes.array,\r\n    PropTypes.arrayOf(\r\n      PropTypes.shape({\r\n        origin: PropTypes.node,\r\n        createdTime: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]),\r\n        text: PropTypes.text,\r\n      })\r\n    ).isRequired,\r\n  ]),\r\n};\r\n\r\nexport default CommunicationHistoryComponent;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link, useParams } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { getIncidentDetails, updateIncident } from '../../../common/services/incident.service';\r\nimport { reportDetailsItems } from '../../constants/report.detail.items';\r\nimport ReportDetailsComponent from '../../components/report-details/report-details.component';\r\nimport AdditionalInfoComponent from '../../components/report-details/additional-info.component';\r\nimport CommunicationHistoryComponent from '../../components/report-details/communication-history.component';\r\nimport {\r\n  DocumentTitleComponent,\r\n  MyAccountPageComponent,\r\n  PageHeaderComponent,\r\n  NetworkLoaderComponent,\r\n  msgConstants,\r\n  fileInputConstants,\r\n  clientMyAccountUrl,\r\n  incidentSourceIdsSettingName,\r\n  incidentSourceSettingNames,\r\n  waterAndDrainageTypeSettingsNames,\r\n  waterandDrainageTypesSettingName,\r\n} from '../../../common';\r\nimport { withRouter } from 'common/helpers/withRouter.hoc';\r\n\r\nconst INCIDENT_RESOLVED_STATUS = 'Solved';\r\n\r\nconst ReportDetailsContainer = () => {\r\n  const { referenceNumber, product } = useParams();\r\n  const [incident, setIncident] = useState({\r\n    product: '',\r\n    incidentId: null,\r\n    items: [],\r\n    files: [],\r\n    commHistory: [],\r\n    promise: undefined,\r\n    webchatSourceId: undefined,\r\n  });\r\n  const [promise, setPromise] = useState();\r\n  const [errorMessage, setErrorMessage] = useState();\r\n  const [webchatSourceId, setWebchatSourceId] = useState();\r\n  const [hideUploadPhoto, setHideUploadPhoto] = useState(false);\r\n  const [hideAdditionalInformation, setHideAdditionalInformation] = useState(false);\r\n\r\n  const reportBreadcrumbs = [\r\n    {\r\n      url: clientMyAccountUrl.myReports.root,\r\n      name: 'My report',\r\n    },\r\n    {\r\n      url: clientMyAccountUrl.myReports.details,\r\n      name: 'My report details',\r\n    },\r\n  ];\r\n\r\n  useEffect(() => {\r\n    getIncidentDetailsAsync();\r\n    const webchatSourceSettings = ConfigurationService.getDrillDownSettingValue([\r\n      incidentSourceIdsSettingName,\r\n      incidentSourceSettingNames.webchat,\r\n    ]);\r\n    const webchatSourceId = webchatSourceSettings ? webchatSourceSettings.id : undefined;\r\n    setWebchatSourceId(webchatSourceId);\r\n  }, []);\r\n\r\n  const handleSubmitIncidentAsync = async (updateNotes, uploadedFiles) => {\r\n    setErrorMessage(msgConstants.GENERIC_API_ERROR);\r\n\r\n    const updatePromise = updateIncident({\r\n      incidentId: incident.incidentId,\r\n      updateNotes: updateNotes,\r\n      uploadedFiles: uploadedFiles,\r\n    }).then(getIncidentDetailsAsync);\r\n\r\n    setPromise(updatePromise);\r\n  };\r\n\r\n  const getIncidentDetailsAsync = async () => {\r\n    let results = [];\r\n    setErrorMessage(msgConstants.REPORT_FAIL);\r\n    const incidentDetailsPromise = getIncidentDetails(referenceNumber, product).then((response) => {\r\n      if (response.status === 200) {\r\n        const incident = response.data;\r\n\r\n        // Some products have the same productLookupName which sucks. We can specify a product ID instead.\r\n        // Because product id changes between environments, it must be stored in configuration.\r\n        // This is time consuming to maintain, so we only do these when the product lookup name matches.\r\n        const overridingProduct = ConfigurationService.getDrillDownSettingValue(['myReports', 'productIdMatrix']).find(\r\n          (product) => product.id === incident.productId\r\n        );\r\n\r\n        if (overridingProduct) {\r\n          incident.product = overridingProduct.lookupName;\r\n        }\r\n\r\n        let product = reportDetailsItems.find((x) => x.productLookupName === incident.product);\r\n\r\n        // Display default report details if can't find matched product lookup name\r\n        if (product === undefined) {\r\n          if (incident.sourceId === webchatSourceId) {\r\n            product = reportDetailsItems.find((item) => item.productLookupName === 'Webchat');\r\n          } else {\r\n            product = reportDetailsItems.find((x) => x.productLookupName === 'Default');\r\n          }\r\n        }\r\n\r\n        // Iterate over the product reportItems (fields to display)\r\n        product.reportItems.forEach((template) => {\r\n          const incidentFieldValue = incident[template.paramName];\r\n\r\n          // Special case - if streetName appears but has no value, show \"Selected on map\" instead.\r\n          if (template.paramName === 'streetName' && incidentFieldValue === null) {\r\n            results.push({\r\n              displayName: template.displayName,\r\n              value: 'Selected on map',\r\n            });\r\n            return;\r\n          }\r\n          // Special case - Do not show categoryId if it's a surface water incident\r\n          if (\r\n            template.paramName === 'categoryId' &&\r\n            incident.waterDrainageTypeId &&\r\n            incident.waterDrainageTypeId.toString() ===\r\n              ConfigurationService.getDrillDownSettingValue([\r\n                waterandDrainageTypesSettingName,\r\n                waterAndDrainageTypeSettingsNames.surfaceWater,\r\n              ]).id\r\n          ) {\r\n            return;\r\n          }\r\n\r\n          if (incidentFieldValue !== null && incidentFieldValue !== undefined) {\r\n            const value = template.render === undefined ? incidentFieldValue : template.render(incidentFieldValue);\r\n\r\n            results.push({\r\n              displayName: template.displayName,\r\n              value,\r\n            });\r\n          }\r\n        });\r\n\r\n        // Determine whether to show or hide upload photo and additional information\r\n        setHideUploadPhoto(incident.sourceId === webchatSourceId);\r\n        setHideAdditionalInformation(\r\n          incident.sourceId === webchatSourceId || incident.status === INCIDENT_RESOLVED_STATUS\r\n        );\r\n\r\n        setIncident({\r\n          product: incident.product,\r\n          incidentId: incident.incidentId,\r\n          items: results,\r\n          files: incident.fileAttachments,\r\n          commHistory: [...incident.communicationHistory].reverse(),\r\n          sourceId: incident.sourceId,\r\n        });\r\n      }\r\n    });\r\n\r\n    setPromise(incidentDetailsPromise);\r\n    setErrorMessage(msgConstants.REPORT_FAIL);\r\n  };\r\n\r\n  const parseProductToHeaderString = (title) => {\r\n    if (title === 'Missing-Lighting Asset') {\r\n      return 'street lighting';\r\n    }\r\n    return title;\r\n  };\r\n\r\n  return (\r\n    <React.Fragment>\r\n      {incident.product ? (\r\n        <PageHeaderComponent\r\n          text={`Report ${parseProductToHeaderString(incident.product).toLowerCase()}`}\r\n          icon=\"icon-website\"\r\n          breadcrumbs={reportBreadcrumbs}\r\n        />\r\n      ) : incident.sourceId === webchatSourceId ? (\r\n        <PageHeaderComponent text=\"City of York Council webchat\" icon=\"icon-website\" breadcrumbs={reportBreadcrumbs} />\r\n      ) : (\r\n        <PageHeaderComponent text=\"My Account\" icon=\"icon-website\" breadcrumbs={reportBreadcrumbs} />\r\n      )}\r\n\r\n      <MyAccountPageComponent>\r\n        <DocumentTitleComponent title=\"My Account - my reports\">\r\n          {promise !== undefined && (\r\n            <NetworkLoaderComponent request={promise} errorMessage={errorMessage}>\r\n              <ReportDetailsComponent\r\n                details={incident.items}\r\n                files={incident.files}\r\n                hideUploadPhoto={hideUploadPhoto}\r\n              />\r\n              {!hideAdditionalInformation && (\r\n                <AdditionalInfoComponent\r\n                  submitIncident={handleSubmitIncidentAsync}\r\n                  maxFileUploadCount={fileInputConstants.maxFileUploadCount - incident.files.length}\r\n                />\r\n              )}\r\n              <CommunicationHistoryComponent commHistory={incident.commHistory} />\r\n            </NetworkLoaderComponent>\r\n          )}\r\n          <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.myReports.root}>\r\n            Back to My reports\r\n          </Link>\r\n        </DocumentTitleComponent>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default withRouter(ReportDetailsContainer);\r\n","import { useLocation, useNavigate, useParams } from 'react-router-dom';\r\n\r\nexport function withRouter(Child) {\r\n  return (props) => {\r\n    const location = useLocation();\r\n    const navigate = useNavigate();\r\n    const params = useParams();\r\n    return <Child {...props} navigate={navigate} location={location} params={params} />;\r\n  };\r\n}\r\n","import React from 'react';\r\nimport { Routes, Route } from 'react-router-dom';\r\nimport { clientMyAccountUrl as urls } from '../common';\r\nimport MyReportsIndexContainer from './containers/index/MyReportsIndex.container';\r\nimport ReportDetailsContainer from './containers/details/report-details.container';\r\nconst MyReportsRouter = () => {\r\n  return (\r\n    <Routes>\r\n      <Route path={urls.myReports.details + '/:referenceNumber/:product/*'} element={<ReportDetailsContainer />} />\r\n      <Route path=\"/\" element={<MyReportsIndexContainer />} />\r\n    </Routes>\r\n  );\r\n};\r\n\r\nexport default MyReportsRouter;\r\n","import React from 'react';\r\nimport MyReportsRouter from './my-reports.router';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst MyReportsApp = () => (\r\n  <WithAuthentication>\r\n    <MyReportsRouter />\r\n  </WithAuthentication>\r\n);\r\n\r\nexport default MyReportsApp;\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { CYCServices } from 'cyc-services';\r\nimport { apiMyAccountUrl } from '../../common';\r\n\r\nconst AUTH_FAILURE_MESSAGE = 'Not authenticated';\r\n\r\nexport const getPrimaryAddressAsync = async () => {\r\n  if (CYCServices.JWTAuth.isAuthenticated() === false) return Promise.reject(AUTH_FAILURE_MESSAGE);\r\n  const address = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_PRIMARY_ADDRESS}`;\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n\r\n  return axios.get(address, config).catch((ex) => {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: new Error('Failed to get primary address') });\r\n    throw ex;\r\n  });\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst AccordionInternalComponent = ({ linksToRender, callToActionLink, customCallToAction }) => {\r\n  const [firstColumnLinks, setFirstColumnLinks] = useState([]);\r\n  const [secondColumnLinks, setSecondColumnLinks] = useState([]);\r\n\r\n  useEffect(() => {\r\n    const linksLength = linksToRender.length;\r\n    const halfLinksLength = linksLength / 2;\r\n\r\n    let firstColumnLinks;\r\n    let secondColumnLinks;\r\n\r\n    if (halfLinksLength === Math.round(halfLinksLength)) {\r\n      firstColumnLinks = linksToRender.slice(0, halfLinksLength);\r\n      secondColumnLinks = linksToRender.slice(halfLinksLength);\r\n    } else {\r\n      firstColumnLinks = linksToRender.slice(0, Math.ceil(halfLinksLength));\r\n      secondColumnLinks = linksToRender.slice(Math.ceil(halfLinksLength));\r\n    }\r\n    setFirstColumnLinks(firstColumnLinks);\r\n    setSecondColumnLinks(secondColumnLinks);\r\n  }, [linksToRender]);\r\n\r\n  return (\r\n    <div className=\"row\">\r\n      <div className=\"col-sm-12 col-md-4\">\r\n        {callToActionLink && (\r\n          <ButtonComponent\r\n            className={ButtonClasses.primary}\r\n            type=\"button\"\r\n            onClick={() => (customCallToAction ? customCallToAction() : (window.location = callToActionLink.linkUrl))}>\r\n            {callToActionLink.linkText}\r\n          </ButtonComponent>\r\n        )}\r\n      </div>\r\n      <div className=\"col-sm-12 col-md-4\">\r\n        <ul>\r\n          {firstColumnLinks.map((link) => {\r\n            if (link.isExternal) {\r\n              return (\r\n                <li key={link.linkText}>\r\n                  <a href={link.linkUrl}>{link.linkText}</a>\r\n                </li>\r\n              );\r\n            } else {\r\n              return (\r\n                <li key={link.linkText}>\r\n                  <Link to={link.linkUrl}>{link.linkText}</Link>\r\n                </li>\r\n              );\r\n            }\r\n          })}\r\n        </ul>\r\n      </div>\r\n      <div className=\"col-sm-12 col-md-4\">\r\n        <ul>\r\n          {secondColumnLinks.map((link) => {\r\n            if (link.isExternal) {\r\n              return (\r\n                <li key={link.linkText}>\r\n                  <a href={link.linkUrl}>{link.linkText}</a>\r\n                </li>\r\n              );\r\n            } else {\r\n              return (\r\n                <li key={link.linkText}>\r\n                  <Link to={link.linkUrl}>{link.linkText}</Link>\r\n                </li>\r\n              );\r\n            }\r\n          })}\r\n        </ul>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nAccordionInternalComponent.propTypes = {\r\n  callToActionLink: PropTypes.shape({\r\n    linkText: PropTypes.string.isRequired,\r\n    linkUrl: PropTypes.string.isRequired,\r\n    isExternal: PropTypes.bool.isRequired,\r\n  }),\r\n  customCallToAction: PropTypes.func,\r\n  linksToRender: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      linkText: PropTypes.string.isRequired,\r\n      linkUrl: PropTypes.string.isRequired,\r\n      isExternal: PropTypes.bool.isRequired,\r\n    })\r\n  ),\r\n};\r\n\r\nexport default AccordionInternalComponent;\r\n","import axios from 'axios';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport appInsights from 'cyc-application-insights-react';\r\n\r\nimport { CYCServices } from 'cyc-services';\r\nimport { apiMyAccountUrl } from '../../common/constants/my-account-urls.constants';\r\n\r\nexport const getParkingValidationData = async () => {\r\n  const url = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.GET_PARKING_VALIDATION_DATA}`;\r\n\r\n  const config = {\r\n    headers: { Authorization: `Bearer ${CYCServices.JWTAuth.getToken()}` },\r\n  };\r\n  try {\r\n    return axios.post(url, {}, config);\r\n  } catch (ex) {\r\n    console.error(ex);\r\n    appInsights.trackException({ exception: ex });\r\n    throw ex;\r\n  }\r\n};\r\n","import { useRef, useState, useEffect } from 'react';\r\n\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\nimport { getParkingValidationData } from '../services/parking.service';\r\n\r\nconst MyParkingServicesAccordion = () => {\r\n  const [validationFormData, setValidationFormData] = useState({\r\n    session: '',\r\n    customer: '',\r\n    keyhash: '',\r\n  });\r\n  const [formReadyToPost, setFormReadyToPost] = useState(false);\r\n  const validateWspRef = useRef();\r\n\r\n  const handleSubmitValidateForm = async () => {\r\n    const response = await getParkingValidationData();\r\n    if (response.status === 200) {\r\n      const dataToUpdate = { ...validationFormData };\r\n      dataToUpdate.customer = response.data.customer;\r\n      dataToUpdate.keyhash = response.data.keyhash;\r\n      dataToUpdate.session = response.data.session;\r\n      setValidationFormData(dataToUpdate);\r\n    }\r\n\r\n    setFormReadyToPost(true);\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (formReadyToPost === true) {\r\n      validateWspRef.current.submit();\r\n    }\r\n  }, [formReadyToPost]);\r\n\r\n  return (\r\n    <>\r\n      <AccordionInternalComponent\r\n        customCallToAction={handleSubmitValidateForm}\r\n        callToActionLink={{\r\n          linkText: 'Access parking system',\r\n          linkUrl: '#',\r\n          isExternal: true,\r\n        }}\r\n        linksToRender={[]}\r\n      />\r\n      <form ref={validateWspRef} action=\"https://york.tarantopermits.com/validate\" method=\"POST\">\r\n        <input type=\"hidden\" id=\"session\" name=\"session\" value={validationFormData.session} />\r\n        <input type=\"hidden\" id=\"customer\" name=\"customer\" value={validationFormData.customer} />\r\n        <input type=\"hidden\" id=\"keyhash\" name=\"keyhash\" value={validationFormData.keyhash} />\r\n      </form>\r\n    </>\r\n  );\r\n};\r\n\r\nexport default MyParkingServicesAccordion;\r\n","import React from 'react';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { clientMyAccountUrl, isEnabled, ChangeName } from '../../common';\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\n\r\nconst MyDetailsAccordion = () => {\r\n  let myDetailsAccordion = [\r\n    {\r\n      linkText: 'View contact details',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.contactDetails,\r\n      isExternal: false,\r\n    },\r\n    {\r\n      linkText: 'Communication preferences',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.communicationPreferences,\r\n      isExternal: false,\r\n    },\r\n    {\r\n      linkText: 'Change telephone number',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.phone.change,\r\n      isExternal: false,\r\n    },\r\n    {\r\n      linkText: 'Change address',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.address.change,\r\n      isExternal: false,\r\n    },\r\n    {\r\n      linkText: 'Change email address',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.email.change,\r\n      isExternal: false,\r\n    },\r\n  ];\r\n  if (isEnabled(FeatureFlagsService.getFeatureFlagByName(ChangeName))) {\r\n    myDetailsAccordion.push({\r\n      linkText: 'Change name',\r\n      linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.name.change,\r\n      isExternal: false,\r\n    });\r\n  }\r\n\r\n  return (\r\n    <>\r\n      <AccordionInternalComponent\r\n        callToActionLink={{\r\n          linkText: 'Change password',\r\n          linkUrl: clientMyAccountUrl.account.root + clientMyAccountUrl.account.password.change,\r\n          isExternal: false,\r\n        }}\r\n        linksToRender={myDetailsAccordion}\r\n      />\r\n    </>\r\n  );\r\n};\r\n\r\nexport default MyDetailsAccordion;\r\n","import React from 'react';\r\nimport { clientMyAccountUrl } from '../../common';\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\n\r\nconst MyReportsAccordion = () => {\r\n  return (\r\n    <AccordionInternalComponent\r\n      callToActionLink={{\r\n        linkText: 'New Report',\r\n        linkUrl: 'https://www.york.gov.uk/reportproblems',\r\n        isExternal: true,\r\n      }}\r\n      linksToRender={[{ linkText: 'My reports', linkUrl: clientMyAccountUrl.myReports.root, isExternal: false }]}\r\n    />\r\n  );\r\n};\r\n\r\nexport default MyReportsAccordion;\r\n","import React from 'react';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { clientMyAccountUrl, isEnabled, MyCollections } from '../../common';\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\n\r\nconst MyRefuseAndRecyclingAccordion = () => {\r\n  return (\r\n    <AccordionInternalComponent\r\n      callToActionLink={\r\n        isEnabled(FeatureFlagsService.getFeatureFlagByName(MyCollections))\r\n          ? {\r\n              linkText: 'My collection details',\r\n              linkUrl: clientMyAccountUrl.refuseAndRecycling.myCollections,\r\n              isExternal: false,\r\n            }\r\n          : null\r\n      }\r\n      linksToRender={[]}\r\n    />\r\n  );\r\n};\r\n\r\nexport default MyRefuseAndRecyclingAccordion;\r\n","import React from 'react';\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\n\r\nconst MyCouncilTaxAccordion = () => {\r\n  return (\r\n    <AccordionInternalComponent\r\n      callToActionLink={{\r\n        linkText: 'Pay council tax',\r\n        linkUrl: 'https://www.york.gov.uk/PayingYourBill',\r\n        isExternal: true,\r\n      }}\r\n      linksToRender={[\r\n        {\r\n          linkText: 'Set up or amend Direct Debit',\r\n          linkUrl: 'https://www.york.gov.uk/paymentplan',\r\n          isExternal: true,\r\n        },\r\n        {\r\n          linkText: 'Discount for students',\r\n          linkUrl: 'https://www.york.gov.uk/StudentDiscount',\r\n          isExternal: true,\r\n        },\r\n        {\r\n          linkText: 'Single occupancy discount',\r\n          linkUrl: 'https://www.york.gov.uk/SingleOccupancy',\r\n          isExternal: true,\r\n        },\r\n        { linkText: 'Move into York', linkUrl: 'https://www.york.gov.uk/movein', isExternal: true },\r\n        { linkText: 'Move within York', linkUrl: 'https://www.york.gov.uk/movewithin', isExternal: true },\r\n        { linkText: 'Move out of York', linkUrl: 'https://www.york.gov.uk/moveout', isExternal: true },\r\n        { linkText: 'Request a bill', linkUrl: 'https://www.york.gov.uk/copybill', isExternal: true },\r\n        {\r\n          linkText: 'Other council tax information',\r\n          linkUrl: 'https://www.york.gov.uk/counciltax',\r\n          isExternal: true,\r\n        },\r\n      ]}\r\n    />\r\n  );\r\n};\r\n\r\nexport default MyCouncilTaxAccordion;\r\n","import React from 'react';\r\nimport AccordionInternalComponent from './accordion-internal/accordion-internal.component';\r\n\r\nconst MyBenefitsAccordion = () => {\r\n  return (\r\n    <AccordionInternalComponent\r\n      callToActionLink={{\r\n        linkText: 'Claim housing benefit',\r\n        linkUrl: 'https://www.york.gov.uk/claimhousingbenefit',\r\n        isExternal: true,\r\n      }}\r\n      linksToRender={[\r\n        {\r\n          linkText: 'Council Tax Support',\r\n          linkUrl: 'https://www.york.gov.uk/CouncilTaxSupport',\r\n          isExternal: true,\r\n        },\r\n        {\r\n          linkText: 'Discretionary Housing Payment',\r\n          linkUrl: 'https://www.york.gov.uk/DHP',\r\n          isExternal: true,\r\n        },\r\n        {\r\n          linkText: 'Report a change in circumstances',\r\n          linkUrl: 'https://www.york.gov.uk/BenefitsChangeOfCircumstances',\r\n          isExternal: true,\r\n        },\r\n        {\r\n          linkText: 'Other benefits information',\r\n          linkUrl: 'https://www.york.gov.uk/benefits',\r\n          isExternal: true,\r\n        },\r\n      ]}\r\n    />\r\n  );\r\n};\r\n\r\nexport default MyBenefitsAccordion;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { getPrimaryAddressAsync } from '../../services/account.service';\r\nimport {\r\n  DocumentTitleComponent,\r\n  PageHeaderComponent,\r\n  MyAccountPageComponent,\r\n  RefuseAndRecycling,\r\n  isEnabled,\r\n  AccordionComponent,\r\n  AccordionCollectionComponent,\r\n  ParkingServices,\r\n} from '../../../common';\r\n\r\nimport MyParkingServicesAccordion from '../../components/my-parking-services-accordion.component';\r\nimport MyDetailsAccordion from '../../components/my-details-accordion.component';\r\nimport MyReportsAccordion from '../../components/my-reports-accordion.component';\r\nimport MyRefuseAndRecyclingAccordion from '../../components/my-refuse-and-recycling-accordion.component';\r\nimport MyCouncilTaxAccordion from '../../components/my-council-tax-accordion.component';\r\nimport MyBenefitsAccordion from '../../components/my-benefits-accordion.component';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst HomePageContainer = () => {\r\n  const [visible, setVisible] = useState({});\r\n\r\n  useEffect(() => {\r\n    const fetchData = async () => {\r\n      const result = await getPrimaryAddressAsync();\r\n      const outOfYork = result.data.outofYork;\r\n\r\n      setVisible({\r\n        refuse: outOfYork === false && isEnabled(FeatureFlagsService.getFeatureFlagByName(RefuseAndRecycling)) === true,\r\n        councilTax: outOfYork === false,\r\n        benefits: outOfYork === false,\r\n        parking: isEnabled(FeatureFlagsService.getFeatureFlagByName(ParkingServices)) === true,\r\n      });\r\n    };\r\n\r\n    fetchData();\r\n  }, []);\r\n\r\n  return (\r\n    <WithAuthentication>\r\n      <DocumentTitleComponent title=\"My Account - Dashboard\">\r\n        <PageHeaderComponent text=\"My Account\" icon=\"icon-website\" />\r\n        <MyAccountPageComponent>\r\n          <p> Welcome to My Account, where you can access our online services whenever you want to.</p>\r\n          <p> We're currently improving My Account so more council services will be made available soon.</p>\r\n          <AccordionCollectionComponent singleExpandMode={true}>\r\n            <AccordionComponent title=\"My reports/report a problem\">\r\n              <MyReportsAccordion />\r\n            </AccordionComponent>\r\n\r\n            <AccordionComponent title=\"My details\">\r\n              <MyDetailsAccordion />\r\n            </AccordionComponent>\r\n\r\n            {visible.refuse === true && (\r\n              <AccordionComponent title=\"My refuse and recycling\">\r\n                <MyRefuseAndRecyclingAccordion />\r\n              </AccordionComponent>\r\n            )}\r\n\r\n            {visible.councilTax === true && (\r\n              <AccordionComponent title=\"My council tax\">\r\n                <MyCouncilTaxAccordion />\r\n              </AccordionComponent>\r\n            )}\r\n\r\n            {visible.benefits === true && (\r\n              <AccordionComponent title=\"My benefits\">\r\n                <MyBenefitsAccordion />\r\n              </AccordionComponent>\r\n            )}\r\n\r\n            {visible.parking === true && (\r\n              <AccordionComponent title=\"My parking services\">\r\n                <MyParkingServicesAccordion />\r\n              </AccordionComponent>\r\n            )}\r\n          </AccordionCollectionComponent>\r\n\r\n          <div className=\"row\">\r\n            <div className=\"col\">\r\n              <h2>Also see</h2>\r\n              <ul>\r\n                <li>\r\n                  <a href=\"https://www.york.gov.uk/myaccounthelp\">My Account help</a>\r\n                </li>\r\n                <li>\r\n                  <a href=\"https://www.york.gov.uk/privacy\">Information about your privacy</a>\r\n                </li>\r\n                <li>\r\n                  <a href=\"https://www.york.gov.uk/terms\">Legal terms and conditions</a>\r\n                </li>\r\n              </ul>\r\n            </div>\r\n            <div className=\"col\">\r\n              <h2>Get in touch</h2>\r\n              <p>\r\n                There are lots of ways you can <a href=\"https://www.york.gov.uk/ContactUs\">contact us</a>.\r\n              </p>\r\n            </div>\r\n          </div>\r\n        </MyAccountPageComponent>\r\n      </DocumentTitleComponent>\r\n    </WithAuthentication>\r\n  );\r\n};\r\n\r\nexport default HomePageContainer;\r\n","import React, { useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { SignInContainer } from './index';\r\nimport { clientMyAccountUrl } from '../common';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nconst SignInRouter = ({ goBackToPreviousLocation }) => {\r\n  const navigate = useNavigate();\r\n\r\n  useEffect(() => {\r\n    if (CYCServices.JWTAuth.isAuthenticated()) {\r\n      navigate(clientMyAccountUrl.dashboard);\r\n    }\r\n  }, []);\r\n  // if is authenticated, nav to dashboard\r\n  return <SignInContainer goToPreviousLocation={goBackToPreviousLocation} />;\r\n};\r\n\r\nSignInRouter.propTypes = {\r\n  goBackToPreviousLocation: PropTypes.bool,\r\n};\r\n\r\nexport default SignInRouter;\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { MyAccountPageComponent, PageHeaderComponent, clientMyAccountUrl as urls } from '../../common';\r\n\r\nconst TestLandingPage = () => {\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"Test site landing page\" />\r\n      <MyAccountPageComponent>\r\n        <p>This is the test site landing page for My Account.</p>\r\n        <p>Use the links below to access the relevant pages for testing.</p>\r\n\r\n        <h2>Online forms</h2>\r\n        <ul>\r\n          <li>\r\n            <Link to={urls.streetLighting.root}>Report a street light problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.streetCleaning.root}>Report a street cleaning problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.flyTipping.root}>Report a fly-tipping problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.graffiti.root}>Report a graffiti problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.roadAndPavementProblems.root}>Report a road, pavement or path problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.saltBinProblems.root}>Report a salt bin problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.dogAndLitterBin.root}>Report a dog waste and litter bin problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.waterAndDrainageProblems.root}>Report a water and drainage problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.streetFurniture.root}>Report a street furniture problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.roadAndStreetSign.root}>Report a road and street sign problem</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.vegetation.root}>Report a vagetation problem</Link>\r\n          </li>\r\n        </ul>\r\n\r\n        <h2>My Account</h2>\r\n        <ul>\r\n          <li>\r\n            <Link to={urls.registration.root}>Register</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.signIn}>Sign in</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.dashboard}>Dashboard</Link>\r\n          </li>\r\n          <li>\r\n            <Link to={urls.webchat.root}>Webchat</Link>\r\n          </li>\r\n        </ul>\r\n\r\n        <h2>Waste</h2>\r\n        <ul>\r\n          <li>\r\n            <Link to={urls.binCollections.root}>Waste collection calendar</Link>\r\n          </li>\r\n        </ul>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nTestLandingPage.propTypes = {};\r\n\r\nexport default TestLandingPage;\r\n","import React from 'react';\r\n\r\nimport TestLandingPage from './containers/test-landing-page.container';\r\n\r\nconst TestingApp = () => <TestLandingPage />;\r\n\r\nexport default TestingApp;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nimport { clientMyAccountUrl, apiMyAccountUrl, lightingTypesSettingName, mapConstants } from '../../common';\r\n\r\nexport const testName = 'Street lighting';\r\nexport default class FormConfiguration {\r\n  totalSteps = 5;\r\n  featureLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/3';\r\n  featureLayerId = 'streetLighting';\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  pageHeaderText = 'Report a street lighting problem';\r\n  productId;\r\n  missingAssetProductId;\r\n  documentTitle = 'Report a street lighting problem';\r\n  subject = 'Street lighting';\r\n  infoAlertSubjectName = 'street light';\r\n\r\n  // Allow the user to select an asset that already has an incident\r\n  allowIncidentSelect = true;\r\n\r\n  streetLightTypes = [];\r\n  missingAssetsLightTypes;\r\n\r\n  constructor() {\r\n    const streetLightingData = ConfigurationService.getEnvironmentSettingByName('streetLighting');\r\n    this.streetLightTypes = streetLightingData[lightingTypesSettingName];\r\n    this.missingAssetsLightTypes = streetLightingData.missingAssetsLightTypes;\r\n    this.productId = streetLightingData.productId;\r\n    this.missingAssetProductId = streetLightingData.missingAssetProductId;\r\n  }\r\n\r\n  getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.LIGHTING_INCIDENTS}`;\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  urlHelper = {\r\n    root: clientMyAccountUrl.streetLighting.root,\r\n    steps: clientMyAccountUrl.streetLighting,\r\n    formSwitchUrl:\r\n      clientMyAccountUrl.missingAssets.root +\r\n      clientMyAccountUrl.missingAssets.streetLighting +\r\n      clientMyAccountUrl.missingAssets.step1,\r\n  };\r\n\r\n  stepUrls = [\r\n    `${this.urlHelper.root}`,\r\n    `${this.urlHelper.root + this.urlHelper.steps.step1}`,\r\n    `${this.urlHelper.root + this.urlHelper.steps.step2}`,\r\n    `${this.urlHelper.root + this.urlHelper.steps.step3}`,\r\n    `${this.urlHelper.root + this.urlHelper.steps.step4}`,\r\n    `${this.urlHelper.root + this.urlHelper.steps.confirmation}`,\r\n  ];\r\n\r\n  missingAssetCheckBoxLabel = \"I can't find the street light on the map\";\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ButtonComponent as Button, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\n/**\r\n *\r\n * @param report Object with text and url to display as the first line of Entry Page\r\n * @param informationArray Array of objects (text, url) to display as more information\r\n * @param goToNextPage  function to call when clicking on the next button\r\n */\r\nconst EntryPage = ({\r\n  report,\r\n  informationHeaderText = 'Before you begin, check:',\r\n  informationArray,\r\n  goToNextPage,\r\n  onResetForm,\r\n  additionalInformation = <React.Fragment />,\r\n}) => {\r\n  useEffect(() => {\r\n    onResetForm();\r\n  }, [onResetForm]);\r\n\r\n  return (\r\n    <div>\r\n      <p>Use this form to report {report.url ? <a href={report.url}>{report.text}</a> : report.text}.</p>\r\n      <p>{informationHeaderText}</p>\r\n      <ul>\r\n        {informationArray.map((link, index) => {\r\n          return (\r\n            <li key={index}>\r\n              <a href={link.url}>{link.text}</a>\r\n            </li>\r\n          );\r\n        })}\r\n      </ul>\r\n\r\n      {additionalInformation}\r\n\r\n      <h2>Your privacy and security</h2>\r\n      <p>\r\n        Please do not use this form to send anything of a confidential nature. We do not rent, sell or trade your\r\n        personal information; please see our <a href=\"https://www.york.gov.uk/privacy\">privacy statement</a>.\r\n      </p>\r\n\r\n      <Button className={ButtonClasses.primary + ' float-right'} onClick={goToNextPage}>\r\n        Begin this form\r\n      </Button>\r\n    </div>\r\n  );\r\n};\r\n\r\nEntryPage.propTypes = {\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  onResetForm: PropTypes.func.isRequired,\r\n  report: PropTypes.shape({\r\n    text: PropTypes.string.isRequired,\r\n    url: PropTypes.string.isRequired,\r\n  }),\r\n  informationHeaderText: PropTypes.string,\r\n  informationArray: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      text: PropTypes.string.isRequired,\r\n      url: PropTypes.string.isRequired,\r\n    })\r\n  ),\r\n};\r\n\r\nexport default EntryPage;\r\n","import { getStreetFromPoint, getUSRNFromPoint } from '../../common/components/map-components/esri-location.service';\r\nimport { mapConstants } from 'common';\r\n\r\n/**\r\n * Check if the feature layer ID matches our unadopted road layer ID\r\n * @param {any} e event from map layer\r\n */\r\nexport const isUnadoptedRoad = (e) => e.feature.layer.id === mapConstants.unadoptedLayerId;\r\n\r\n/**\r\n * Custom table specifically for unadopted road popup\r\n * @param {string} streetName\r\n * @param {string} USRN\r\n */\r\nconst unadoptedRoadStreetAndUsrnTable = (streetName, USRN) => {\r\n  const mapUnadoptedLayerMessage =\r\n    \"<p style='word-break: normal'>This road, pavement or path is privately owned; we're not responsible for maintaining it.\" +\r\n    \" See information about <u><a target='_blank' rel='noopener noreferrer' href='https://www.york.gov.uk/RoadAdoption#responsibility'>\" +\r\n    'our responsibility for adopted and unadopted roads</a></u>.</p>';\r\n\r\n  return `<p>${mapUnadoptedLayerMessage}</p>\r\n  <table class=\"esri-widget__table\">\r\n    <tr>\r\n      <th>Street Name</th>\r\n      <td>${streetName}</td>\r\n    </tr>\r\n    <tr>\r\n      <th>USRN</th>\r\n      <td>${USRN}</td>\r\n    </tr>\r\n  </table>`;\r\n};\r\n\r\n/**\r\n * Returns the content table for the unadopted road popup\r\n * @param {any} e\r\n */\r\nconst getStreetAndUsrnTableForUnadoptedRoad = async (e) => {\r\n  const streetName = await getStreetFromPoint(e.graphic.geometry.centroid.x, e.graphic.geometry.centroid.y);\r\n  const USRN = await getUSRNFromPoint(streetName);\r\n  return unadoptedRoadStreetAndUsrnTable(streetName, USRN);\r\n};\r\n\r\n/**\r\n * Returns the unadopted road feature layer options\r\n *  * @param {string} title optional title for the popup\r\n */\r\nexport const getUnadoptedRoadsFeatureOptions = (title = '') => {\r\n  const mapUnadoptedLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/39';\r\n\r\n  return {\r\n    layerUrl: mapUnadoptedLayerUrl,\r\n    layerId: mapConstants.unadoptedLayerId,\r\n    popupTemplate: {\r\n      title,\r\n      content: (e) => getStreetAndUsrnTableForUnadoptedRoad(e),\r\n    },\r\n  };\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { CheckboxInputComponent } from 'cyc-react-ui-components';\r\nimport { getUnadoptedRoadsFeatureOptions, isUnadoptedRoad } from '../helpers/unadopted-layer.helper';\r\nimport {\r\n  ButtonComponent as Button,\r\n  ButtonClasses,\r\n  InputLabelComponent,\r\n  InputErrorComponent,\r\n  HelpTextComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  ADDITIONAL_INFORMATION_MAX_LENGTH,\r\n  CycEsriMapComponent,\r\n  ErrorBoxComponent,\r\n  FileInputComponent,\r\n  msgConstants,\r\n  setInitialPosition,\r\n} from 'common';\r\nimport { AdditionalInformationComponent } from '../../common/components/form-components/additional-information.component';\r\nimport './location-page.component.scss';\r\n\r\nconst LocationPage = (props) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n  let { errors, touched, isSubmitting } = props;\r\n\r\n  useEffect(() => {\r\n    if (\r\n      !props.isSubmitting &&\r\n      !props.isValid &&\r\n      Object.keys(props.errors).length > 0 &&\r\n      props.submitCount > previousSubmitCount.current\r\n    ) {\r\n      previousSubmitCount.current = props.submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting, errorBoxRef, props.errors, props.isValid, props.submitCount]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  const clearLocationSelected = () => {\r\n    props.clearSelectedPoint();\r\n    props.setFieldValue('locationSelected', false);\r\n  };\r\n\r\n  const handleIncidentSelected = (e) => {\r\n    if (props.allowIncidentSelect === true) {\r\n      props.setFieldValue('locationSelected', true);\r\n    } else {\r\n      clearLocationSelected();\r\n    }\r\n  };\r\n\r\n  // handle ticking the missing asset box\r\n  const handleMissingAssetsSwitch = () => {\r\n    clearLocationSelected();\r\n    props.missingAssetsOptions.handleSwitch && props.missingAssetsOptions.handleSwitch();\r\n  };\r\n\r\n  // Feature is clicked\r\n  const handleFeatureClicked = async (e) => {\r\n    // If unadopted road.\r\n    if (isUnadoptedRoad(e) === true) {\r\n      clearLocationSelected();\r\n      return;\r\n    }\r\n\r\n    // Does javascript count undefined as false? explicit set below just in case\r\n    const allowSelectIncident = props.allowIncidentSelect === undefined ? false : props.allowIncidentSelect;\r\n    // if we do not allow selecting an incident and we can a prop to do a check on the asset\r\n    // Then perform a check to see if any incidents exist\r\n    // Then show an alert if there is an incident on it. Stop the user from progressing\r\n\r\n    if (allowSelectIncident === false && props.incidentExistsCheck) {\r\n      const incidentExists = await props.incidentExistsCheck(e);\r\n      if (incidentExists) {\r\n        alert(props.incidentExistsAlertMessage);\r\n        clearLocationSelected();\r\n        return;\r\n      }\r\n    }\r\n\r\n    props.handleFeatureClicked(e);\r\n\r\n    props.setFieldValue('locationSelected', true);\r\n  };\r\n\r\n  const handleMapClicked = (e) => {\r\n    props.onMapSelected(e);\r\n    props.setFieldValue('locationSelected', true);\r\n  };\r\n\r\n  const handleAdditionalInformationChange = (e) => {\r\n    props.setFieldValue('additionalInformation', e.target.value);\r\n    props.onAdditionalInformationChange && props.onAdditionalInformationChange(e);\r\n  };\r\n\r\n  const incidentLayersOptions = props.incidentLayerOptions\r\n    ? [{ ...props.incidentLayerOptions[0], onIncidentSelected: handleIncidentSelected }]\r\n    : undefined;\r\n\r\n  let featureLayerOptions;\r\n\r\n  // missing assets can only be selected on maps with features\r\n  // if we have features, check if missing asset checkbox is selected\r\n  // if it is, use unadopted feature layer only\r\n  // otherwise use provided feature layers\r\n  if (props.featureLayerOptions) {\r\n    if (props.missingAssetsOptions && props.missingAssetsOptions.checked) {\r\n      // check if unadopted layer should be used, not all processes have it implemented\r\n      const useUnadoptedLayer =\r\n        props.missingAssetsOptions.useUnadoptedLayer !== undefined\r\n          ? props.missingAssetsOptions.useUnadoptedLayer\r\n          : true;\r\n      featureLayerOptions = useUnadoptedLayer ? [getUnadoptedRoadsFeatureOptions()] : undefined;\r\n      // add feature click handler and rename popupTemplate option:\r\n      if (featureLayerOptions) {\r\n        featureLayerOptions[0].featurePopupTemplate = featureLayerOptions[0].popupTemplate;\r\n        featureLayerOptions[0].onFeatureClicked = handleFeatureClicked;\r\n      }\r\n    } else {\r\n      // add feature click handler and rename popupTemplate option:\r\n      featureLayerOptions = props.featureLayerOptions.map((feature) => {\r\n        return {\r\n          layerUrl: feature.layerUrl,\r\n          layerId: feature.layerId,\r\n          onFeatureClicked: handleFeatureClicked,\r\n          featurePopupTemplate: feature.popupTemplate,\r\n        };\r\n      });\r\n    }\r\n  }\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form noValidate>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(errors).length > 0 && touched.locationSelected && <ErrorBoxComponent />}\r\n        <InputLabelComponent error={errors.locationSelected && touched.locationSelected} required={true}>\r\n          Location of problem\r\n        </InputLabelComponent>\r\n\r\n        <span id=\"locationSelected\"></span>\r\n\r\n        {props.locationSelectText && props.locationSelectText !== undefined ? (\r\n          <HelpTextComponent>{props.locationSelectText}</HelpTextComponent>\r\n        ) : (\r\n          <HelpTextComponent>\r\n            Enter a postcode or street name to search, or find the location on the map.\r\n            <br />\r\n            Select the location on the map. Be as accurate as you can to help us locate the problem.\r\n            <br />\r\n            Use the <span aria-hidden=\"true\" className=\"esri-icon esri-icon-locate\"></span> icon to report a problem at\r\n            your current location.\r\n            <br />\r\n            Select a reported problem to view details.\r\n            <br />\r\n          </HelpTextComponent>\r\n        )}\r\n        <CycEsriMapComponent\r\n          locationObject={props.locationObject}\r\n          onMapClicked={handleMapClicked}\r\n          incidentLayersOptions={incidentLayersOptions}\r\n          featureLayersOptions={featureLayerOptions}\r\n          disableFreeSelect={\r\n            props.disableFreeSelect &&\r\n            (!props.missingAssetsOptions || (props.missingAssetsOptions && !props.missingAssetsOptions.checked))\r\n              ? true\r\n              : false\r\n          }\r\n          enablePointSelectionAtZoomLevel={props.enablePointSelectionZoomLevels}\r\n          getAllLayersDetailsOnClick={props.getAllLayersDetailsOnClick}\r\n        />\r\n        {errors.locationSelected && touched.locationSelected && (\r\n          <InputErrorComponent>{errors.locationSelected}</InputErrorComponent>\r\n        )}\r\n\r\n        {props.missingAssetsOptions && (\r\n          <CheckboxInputComponent\r\n            id=\"missingAssetsCheckbox\"\r\n            checked={props.missingAssetsOptions.checked}\r\n            label={props.missingAssetsOptions.label}\r\n            onChange={handleMissingAssetsSwitch}\r\n          />\r\n        )}\r\n\r\n        {props.extraInformationUnderMap && props.extraInformationUnderMap}\r\n        {props.additionalInformation !== undefined && (\r\n          <>\r\n            <AdditionalInformationComponent\r\n              showCounter={true}\r\n              maximumCount={ADDITIONAL_INFORMATION_MAX_LENGTH}\r\n              className=\"w-100\"\r\n              name=\"additionalInformation\"\r\n              placeholder=\"Additional location information\"\r\n              value={props.additionalInformation}\r\n              onAdditionalInformationChange={handleAdditionalInformationChange}\r\n              headerText={props.additionalInformationHeaderText || 'Additional location information'}\r\n              helpText=\"Help: Details that will help us locate the problem. For example: nearest house number, road names, landmarks, restricted access.\"\r\n              touched={touched}\r\n              errors={errors}\r\n              required={props.missingAssetsOptions && props.missingAssetsOptions.checked}\r\n            />\r\n            {errors.additionalInformation && touched.additionalInformation && (\r\n              <InputErrorComponent>{errors.additionalInformation}</InputErrorComponent>\r\n            )}\r\n          </>\r\n        )}\r\n\r\n        {props.missingAssetsOptions?.showFileInputOnMapPage && props.missingAssetsOptions.checked && (\r\n          <>\r\n            <br />\r\n            <h3 id=\"uploadPhoto\" className=\"mt-2\">\r\n              Upload a photo\r\n            </h3>\r\n            <FileInputComponent\r\n              onUploadFiles={(files) => props.missingAssetsOptions.onUploadFiles(files)}\r\n              onRemoveFile={(index) => props.missingAssetsOptions.onUploadFiles(index)}\r\n              uploadedFiles={props.missingAssetsOptions.uploadedFiles}\r\n            />\r\n          </>\r\n        )}\r\n\r\n        <Button onClick={props.goToPrevious} type=\"button\">\r\n          Previous\r\n        </Button>\r\n        {props.showNextButton === false ? (\r\n          <></>\r\n        ) : (\r\n          <Button type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n            Next\r\n          </Button>\r\n        )}\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst LocationPageComponent = withFormik({\r\n  mapPropsToValues({ locationSelected, additionalInformation }) {\r\n    return {\r\n      locationSelected,\r\n      additionalInformation: additionalInformation ? additionalInformation : '',\r\n    };\r\n  },\r\n  validationSchema: ({ locationSelectedValidationText, missingAssetsOptions }) => {\r\n    const message = locationSelectedValidationText || 'Please select a location on the map.';\r\n    const schema = {\r\n      locationSelected: Yup.boolean().oneOf([true], message),\r\n      additionalInformation: Yup.string().max(\r\n        ADDITIONAL_INFORMATION_MAX_LENGTH,\r\n        msgConstants.CHARACTER_LIMIT_EXCEEDED_ERROR\r\n      ),\r\n    };\r\n\r\n    if (missingAssetsOptions && missingAssetsOptions.checked) {\r\n      schema.additionalInformation = schema.additionalInformation.required(\r\n        \"Please supply details for 'Additional information'\"\r\n      );\r\n      schema.locationSelected = Yup.boolean().oneOf([true], 'Please select a location on the map.');\r\n    }\r\n    return Yup.object().shape(schema);\r\n  },\r\n  handleSubmit(values, bag) {\r\n    bag.props.goToNext();\r\n  },\r\n})(LocationPage);\r\n\r\nLocationPageComponent.propTypes = {\r\n  getAllLayersDetailsOnClick: PropTypes.func,\r\n  allowIncidentSelect: PropTypes.bool,\r\n  showNextButton: PropTypes.bool,\r\n  locationSelected: PropTypes.bool.isRequired,\r\n  locationObject: PropTypes.object,\r\n  additionalInformation: PropTypes.string,\r\n  goToNext: PropTypes.func.isRequired,\r\n  goToPrevious: PropTypes.func.isRequired,\r\n  onAdditionalInformationChange: (props, propName) => {\r\n    if (props['additionalInformation'] !== undefined && props[propName] === undefined) {\r\n      return new Error('onAdditionalInformationChange required');\r\n    }\r\n  },\r\n  // additional information label override text\r\n  additionalInformationHeaderText: PropTypes.string,\r\n  clearSelectedPoint: PropTypes.func.isRequired,\r\n  incidentExistsCheck: PropTypes.func,\r\n  disableFreeSelect: PropTypes.bool,\r\n  incidentExistsAlertMessage: (props, propName) => {\r\n    if (props['incidentExistsCheck'] !== undefined && props[propName] === undefined) {\r\n      return new Error('incidentExistsAlertMessage required');\r\n    }\r\n  },\r\n  featureLayerOptions: PropTypes.array,\r\n  incidentLayerOptions: PropTypes.array,\r\n  onMapSelected: (props, propName) => {\r\n    if (props['disableFreeSelect'] === false && props[propName] === undefined) {\r\n      return new Error('onMapSelected required');\r\n    }\r\n  },\r\n  extraInformationUnderMap: PropTypes.node,\r\n  locationSelectedValidationText: PropTypes.string,\r\n  locationSelectText: PropTypes.node,\r\n  missingAssetsOptions: PropTypes.shape({\r\n    // whether the options is currently selected\r\n    checked: PropTypes.bool.isRequired,\r\n    // label for the can't find asset checkbox\r\n    label: PropTypes.string.isRequired,\r\n    // callback for the checkbox\r\n    handleSwitch: PropTypes.func.isRequired,\r\n    // file input callbacks\r\n    onUploadFiles: (props, propName) => CheckOtherPropIsTrue(props, 'showFileInputOnMapPage', propName),\r\n    onRemoveFile: (props, propName) => CheckOtherPropIsTrue(props, 'showFileInputOnMapPage', propName),\r\n    // file input content\r\n    uploadedFiles: (props, propName) => CheckOtherPropIsTrue(props, 'showFileInputOnMapPage', propName),\r\n    // whether to use unadopted feature layer - defaults to true\r\n    useUnadoptedLayer: PropTypes.bool,\r\n    // whether to show file input component on location page\r\n    showFileInputOnMapPage: PropTypes.bool,\r\n  }),\r\n};\r\n\r\n/**\r\n *\r\n * @param {PropType} props comes from PropTypes\r\n * @param {*} propToCheckAgainst Prop name to check against\r\n * @param {*} currentProp this property\r\n */\r\nconst CheckOtherPropIsTrue = (props, propToCheckAgainst, currentProp) => {\r\n  if (\r\n    props[propToCheckAgainst] !== undefined &&\r\n    props[propToCheckAgainst] === true &&\r\n    props[currentProp] === undefined\r\n  ) {\r\n    return new Error(currentProp + ' required');\r\n  }\r\n};\r\n\r\nexport default LocationPageComponent;\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { LoggedInUpdatesComponent, NotLoggedInUpdatesComponent } from '../../common';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { RedirectWithWindowConfirmV6 } from 'common/helpers/react-router-helpers/RedirectWithWindowConfirm';\r\n\r\nconst ConfirmationPage = (props) => {\r\n  const navigate = useNavigate();\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <h2>Confirmation</h2>\r\n      <div className=\"row\">\r\n        <p>\r\n          Thank you for submitting your request. Your reference is: <b>{props.referenceNumber}</b>\r\n        </p>\r\n      </div>\r\n\r\n      <h3>Get updates</h3>\r\n      {props.userLoggedIn() ? (\r\n        <LoggedInUpdatesComponent goToMyAccount={props.goToMyAccount} />\r\n      ) : (\r\n        <NotLoggedInUpdatesComponent\r\n          onSignInClicked={props.onSignInClicked}\r\n          onRegisterClicked={props.onRegisterClicked}\r\n        />\r\n      )}\r\n\r\n      {props.responseTimes ? (\r\n        <>\r\n          <h2>Response times</h2>\r\n          {props.responseTimes.map((response, index) => {\r\n            return (\r\n              <div className=\"row\" key={index}>\r\n                <p>\r\n                  See our <a href={response.url}>{response.text}</a>.\r\n                </p>\r\n              </div>\r\n            );\r\n          })}\r\n        </>\r\n      ) : null}\r\n\r\n      <p>\r\n        <button className=\"in-text-button\" onClick={() => RedirectWithWindowConfirmV6(navigate, props.restartFormUrl)}>\r\n          Report another problem\r\n        </button>\r\n      </p>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default ConfirmationPage;\r\n\r\nConfirmationPage.propTypes = {\r\n  scrollToWindowTop: PropTypes.func,\r\n  referenceNumber: PropTypes.string,\r\n  onSignInClicked: PropTypes.func,\r\n  onRegisterClicked: PropTypes.func,\r\n  goToMyAccount: PropTypes.func,\r\n  userLoggedIn: PropTypes.func.isRequired,\r\n  restartFormUrl: PropTypes.string.isRequired,\r\n};\r\n","import { NavigationType } from 'react-router-dom';\r\n\r\n/**\r\n * Takes react navigation hool and a url path and asks if use would like to go. V6 refers to react-router-dom version\r\n * @param {NavigationType} navigate  - useNavigate() hook\r\n * @param {string} path - Path to navigate to\r\n */\r\nconst RedirectWithWindowConfirmV6 = (navigate, path) => {\r\n  if (window.confirm('This action will reset this form. Are you sure you want to continue?')) {\r\n    navigate(path);\r\n  }\r\n};\r\nexport { RedirectWithWindowConfirmV6 };\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport { ButtonComponent, ButtonClasses, SubmitButtonAxiosComponent } from 'cyc-react-ui-components';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { SummaryTableComponent, msgConstants, apiMyAccountUrl } from '../../common';\r\n\r\nconst SummaryPage = ({ errors, tableData, goToProblemPage, isSubmitting, additionalInformation, handleSubmit }) => {\r\n  useEffect(() => {\r\n    window.scroll(0, 0);\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        {errors.networkError !== undefined ? <h3 className=\"cyc-input-errors-radio\">{errors.networkError}</h3> : null}\r\n        <h2>Summary</h2>\r\n        <div className=\"row\">\r\n          <SummaryTableComponent headerOne=\"Question\" headerTwo=\"Answer\" linkHeader=\"Change\" rowData={tableData} />\r\n        </div>\r\n\r\n        <div className=\"row\">\r\n          <p>\r\n            Check the details you've provided are correct before you 'Submit' this form. You can click on the edit icon\r\n            or use the 'Previous' button to change your details.\r\n          </p>\r\n        </div>\r\n        {additionalInformation ? <div className=\"row\">{additionalInformation}</div> : null}\r\n\r\n        <ButtonComponent onClick={goToProblemPage} type=\"button\">\r\n          Previous\r\n        </ButtonComponent>\r\n        <SubmitButtonAxiosComponent\r\n          className={ButtonClasses.primary + ' float-right'}\r\n          url={`${ConfigurationService.store.apiUrl}${apiMyAccountUrl.INCIDENTS}`}\r\n          onClick={handleSubmit}\r\n        />\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst SummaryPageComponent = withFormik({\r\n  mapPropsToValues: () => ({\r\n    networkError: false,\r\n  }),\r\n  handleSubmit: async (values, { setFieldError, props }) => {\r\n    const submitSuccess = await props.submitIncident();\r\n    if (submitSuccess === false) {\r\n      setFieldError('networkError', msgConstants.GENERIC_API_ERROR);\r\n    }\r\n  },\r\n})(SummaryPage);\r\n\r\nSummaryPageComponent.propTypes = {\r\n  tableData: PropTypes.array.isRequired,\r\n  errors: PropTypes.string,\r\n  goToProblemPage: PropTypes.func.isRequired,\r\n  submitIncident: PropTypes.func.isRequired,\r\n  additionalInformation: PropTypes.any,\r\n};\r\n\r\nexport default SummaryPageComponent;\r\n","export default __webpack_public_path__ + \"static/media/info_icon.8f0da202.svg\";","import moment from 'moment';\r\nimport PropTypes from 'prop-types';\r\nimport './incidents-exist-display.component.style.scss';\r\nimport InfoIcon from '../../../resources/images/info_icon.svg';\r\n\r\nconst IncidentsExistDisplay = ({ headerText = '', footerText = '', incidentsList = [], categorys = {} }) => {\r\n  const getDateWithCorrectFormat = (stringDate) => {\r\n    return moment(stringDate).format('DD MMMM yyyy[, at] h.mma');\r\n  };\r\n\r\n  const getcategoryId = (categoryId) => {\r\n    const getEntries = Object.entries(categorys);\r\n    const findCategoryEntry = getEntries.find((x) => x[1].id == categoryId);\r\n    if (findCategoryEntry) {\r\n      return findCategoryEntry[1].displayName;\r\n    }\r\n    return 'Unknown';\r\n  };\r\n\r\n  const setCategoryAndDate = (categoryId, stringDate) => {\r\n    return `${getcategoryId(categoryId)}, reported on ${getDateWithCorrectFormat(stringDate)}`;\r\n  };\r\n\r\n  if (incidentsList.length === 0) {\r\n    return <></>;\r\n  }\r\n\r\n  return (\r\n    <div id=\"incident-exists-display\">\r\n      <div>\r\n        <img src={InfoIcon} alt=\"searchIcon\" />\r\n      </div>\r\n      <div>\r\n        <p id=\"incident-exists-display__header\">Information Alert</p>\r\n        <p>{headerText}</p>\r\n        <ul>\r\n          {incidentsList.map((incident, index) => (\r\n            <li key={index}>{setCategoryAndDate(incident.categoryId, incident.createdTime)}</li>\r\n          ))}\r\n        </ul>\r\n        <p>{footerText}</p>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nIncidentsExistDisplay.propTypes = {\r\n  headerText: PropTypes.string.isRequired,\r\n  footerText: PropTypes.oneOfType([PropTypes.element, PropTypes.string]),\r\n  incidentsList: PropTypes.arrayOf(\r\n    PropTypes.shape({\r\n      categoryId: PropTypes.number,\r\n      createdTime: PropTypes.string,\r\n    })\r\n  ).isRequired,\r\n  categorys: PropTypes.objectOf(\r\n    PropTypes.shape({\r\n      id: PropTypes.string.isRequired,\r\n      displayName: PropTypes.string.isRequired,\r\n    })\r\n  ).isRequired,\r\n};\r\n\r\nexport default IncidentsExistDisplay;\r\n\r\nexport const generalHeader = (productName = '') => {\r\n  return `We're already aware of a problem with the ${productName} you've selected; we've received reports about:`;\r\n};\r\n\r\nexport const differentProblemFooter = (productName = '') => (\r\n  <>\r\n    Complete this form to report a <b>different problem </b>\r\n    {`with this ${productName}.`}\r\n  </>\r\n);\r\nexport const workingToFixProblemFooter = (productName = '') => {\r\n  return `We're working to fix problems that have already been reported; you can only report a different problem with this ${productName}.`;\r\n};\r\n\r\nexport const cannotReportAnotherProblemFooter = (productName = '') => (\r\n  <>\r\n    We're working to fix problems that have already been reported; as there are no different problems that can be\r\n    reported you <b>cannot report another problem</b> with this {productName} at this time.\r\n  </>\r\n);\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\n\r\nimport {\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  RadiobuttonInputComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport { ErrorBoxComponent, FileInputComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\nimport { IncidentsExistDisplay } from 'incident-forms/components-shared';\r\nimport {\r\n  generalHeader,\r\n  workingToFixProblemFooter,\r\n} from 'incident-forms/components-shared/existing-incidents-display/incidents-exist-display.component';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  values,\r\n  errors,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n  possibleProblems,\r\n  existingIncidents,\r\n  productName,\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  const filteredPossibleProblems = () => {\r\n    const mapped = possibleProblems().map((problem) => {\r\n      return {\r\n        label: problem.displayName,\r\n        value: problem.id,\r\n      };\r\n    });\r\n    if (existingIncidents) {\r\n      const filtered = [];\r\n      mapped.forEach((item) => {\r\n        // filter out ones that already exist\r\n        const exists = existingIncidents.find((x) => x.categoryId.toString() === item.value);\r\n        if (exists === undefined) {\r\n          filtered.push(item);\r\n        }\r\n      });\r\n      return filtered;\r\n    }\r\n    // Return original array if existingIncidents does not exist\r\n    return mapped;\r\n  };\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && <ErrorBoxComponent errors={errors}></ErrorBoxComponent>}\r\n\r\n        <div className=\"row\">\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"What is the problem?\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                onProblemTypeChange(e);\r\n              }}\r\n              value={values.problemId}\r\n              error={errors.problemId && touched.problemId}\r\n              options={filteredPossibleProblems()}\r\n            />\r\n          </span>\r\n          {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n        </div>\r\n\r\n        <div className=\"my-4\">\r\n          <IncidentsExistDisplay\r\n            headerText={generalHeader(productName)}\r\n            footerText={workingToFixProblemFooter(productName)}\r\n            incidentsList={existingIncidents ? existingIncidents : []}\r\n            categorys={ConfigurationService.store.categoryIds.streetLighting}\r\n          />\r\n        </div>\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent uploadedFiles={uploadedFiles} onUploadFiles={onUploadFiles} onRemoveFile={onRemoveFile} />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, uploadedFiles, goToNext }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      goToNext: goToNext,\r\n      uploadedFiles: uploadedFiles || [],\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'What is the problem?.'\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  possibleProblems: PropTypes.func,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  existingIncidents: PropTypes.array,\r\n  productName: PropTypes.string,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\n\r\nimport {\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst LightTypePageForm = (props) => {\r\n  const errorBoxRef = useRef();\r\n  const errors = useRef(props.errors);\r\n  const isValid = useRef(props.isValid);\r\n  const lightTypes = props.lightTypes;\r\n\r\n  useEffect(() => {\r\n    errors.current = props.errors;\r\n    isValid.current = props.isValid;\r\n  }, [props.errors, props.isValid]);\r\n\r\n  useEffect(() => {\r\n    if (!props.isSubmitting && !isValid.current && Object.keys(errors.current).length > 0) {\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  const getRadioButtonOptions = () =>\r\n    Object.entries(lightTypes)\r\n      .map(([key, value]) => {\r\n        const streetLightType = props.streetLightTypes[key];\r\n        if (streetLightType) {\r\n          return {\r\n            label: value,\r\n            value: streetLightType.lightingTypeId,\r\n          };\r\n        }\r\n        return undefined;\r\n      })\r\n      .filter(Boolean);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.touched.lightTypeId && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n        <div className=\"row\"></div>\r\n        {lightTypes !== undefined && (\r\n          <div className=\"row\">\r\n            <span id=\"WhatIsTheLightType\">\r\n              <ErrorLabelHandlerComponent\r\n                touched={props.touched}\r\n                errors={props.errors}\r\n                tag=\"p\"\r\n                text=\"What is the light type?\"\r\n                id=\"lightTypeId\"\r\n                submitCount={props.submitCount}\r\n              />\r\n              <RadiobuttonInputComponent\r\n                name=\"lightTypeId\"\r\n                value={props.values.lightTypeId}\r\n                onChange={(id) => {\r\n                  props.setFieldValue('lightTypeId', id);\r\n                  props.onLightTypeChange(id);\r\n                }}\r\n                error={props.errors.lightTypeId && props.touched.lightTypeId}\r\n                options={getRadioButtonOptions()}\r\n              />\r\n              {props.errors.lightTypeId && props.touched.lightTypeId && (\r\n                <InputErrorComponent>{props.errors.lightTypeId}</InputErrorComponent>\r\n              )}\r\n            </span>\r\n          </div>\r\n        )}\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst LightTypePageComponent = withFormik({\r\n  mapPropsToValues({ lightTypeId, goToNext, goToPrevious }) {\r\n    return {\r\n      lightTypeId: lightTypeId,\r\n      goToNext: goToNext,\r\n      goToPrevious: goToPrevious,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    lightTypeId: Yup.string().required(\"Please supply details for 'What is the light type?\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(LightTypePageForm);\r\n\r\nLightTypePageComponent.propTypes = {\r\n  onLightTypeChange: PropTypes.func.isRequired,\r\n  lightTypeId: PropTypes.number,\r\n  goToNext: PropTypes.func.isRequired,\r\n  goToPrevious: PropTypes.func.isRequired,\r\n  lightTypes: PropTypes.object.isRequired,\r\n  streetLightTypes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default LightTypePageComponent;\r\nexport { LightTypePageForm };\r\n","/**\r\n * Builds the incidentLayersOptions that go into the CYC Esri map\r\n * @param {Function} mapIncidentDetailsToAttributes - object for mapIncidentDetailsToAttributes\r\n * @param {string} getIncidentsUrl - url string to fetch incidents\r\n * @param {number} mapIncidentLayerId  - map layer Id\r\n * @param {string} popupTemplate - popup template string\r\n * @param {string} fields - fields for displaying\r\n * @returns incidentLayersOptions\r\n */\r\nexport const incidentLayersOptionsBuilder = ({\r\n  mapIncidentDetailsToAttributes,\r\n  getIncidentsUrl,\r\n  mapIncidentLayerId,\r\n  popupTemplate,\r\n  fields,\r\n}) => {\r\n  return [\r\n    {\r\n      layerUrl: getIncidentsUrl,\r\n      layerId: mapIncidentLayerId,\r\n      popupTemplate: popupTemplate,\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributes,\r\n      fields: fields,\r\n    },\r\n  ];\r\n};\r\n\r\n/**\r\n * @param incident -  incident details from form for basic n\r\n * @param customBuild - (Optional) pass in a custom object with incident information. Overrised basic return object\r\n */\r\nexport const mapIncidentDetailsToAttributesBuilder = (incident) => {\r\n  return {\r\n    incidentId: incident.incidentId,\r\n    assetDescription: incident.assetDescription ? incident.assetDescription.split('(')[0].trim() : null,\r\n    faultType: incident.category,\r\n    createdTime: new Date(incident.createdTime).toLocaleString('en-GB'),\r\n  };\r\n};\r\n\r\nexport const popupTemplateBuilder = ({\r\n  mapIncidentLayerTitle,\r\n  tableDataArray = [],\r\n  nonTrData = [],\r\n  showAlreadyReportedMessage = false,\r\n}) => {\r\n  let dataString = '';\r\n  const reportedMessage = showAlreadyReportedMessage === true ? 'This problem has already been reported.' : '';\r\n  tableDataArray.forEach((element, index) => {\r\n    dataString += `<tr><th>${element.header}</th><td>{${element.data}}</td></tr>`;\r\n    nonTrData.forEach((data) => {\r\n      if (data.index === index) {\r\n        dataString += data.data;\r\n      }\r\n    });\r\n  });\r\n  return {\r\n    title: mapIncidentLayerTitle,\r\n    content: `<table class=\"esri-widget__table\">${dataString}</table><br />${reportedMessage}`,\r\n  };\r\n};\r\n\r\nexport class FieldsBuilder {\r\n  constructor() {\r\n    this.builder = [];\r\n  }\r\n\r\n  pushToBuilder(object, alias = undefined) {\r\n    this.builder.push({\r\n      name: object.name,\r\n      alias: alias ? alias : object.alias,\r\n      type: object.type,\r\n    });\r\n  }\r\n\r\n  addIncidentId(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'incidentId',\r\n        alias: 'Incident ID',\r\n        type: 'oid',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addIncidentReferenceNumber(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'referenceNumber',\r\n        alias: 'Reference number',\r\n        type: 'oid',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addCreatedTime(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'createdTime',\r\n        alias: 'Created',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addWasteType(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'wasteType',\r\n        alias: 'Waste type',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addFlyTippingOther(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'flytippingOther',\r\n        alias: 'Please specify',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addFaultType(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'faultType',\r\n        alias: 'Fault type',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addFeatureType(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'featureType',\r\n        alias: 'Feature type',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addAssetDescription(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'assetDescription',\r\n        alias: 'Lamp type',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  addIssue(alias = undefined) {\r\n    this.pushToBuilder(\r\n      {\r\n        name: 'issue',\r\n        alias: 'Issue',\r\n        type: 'string',\r\n      },\r\n      alias\r\n    );\r\n  }\r\n\r\n  getBuilderResult() {\r\n    return this.builder;\r\n  }\r\n}\r\n","import { CYCServices } from 'cyc-services';\r\n\r\nexport const initialState = ({ pageHeaderText, problemOtherId = undefined }) => {\r\n  return {\r\n    pageHeaderText: pageHeaderText,\r\n    formStarted: false, // Turn this to true for developement\r\n    formCompleted: false,\r\n    currentStep: 0,\r\n    userLoggedIn: CYCServices.JWTAuth.isAuthenticated,\r\n    missingAssetChecked: false,\r\n    formData: {\r\n      incidentSubmitted: false,\r\n      additionalInformation: '',\r\n      unitType: null,\r\n      problemId: '',\r\n      problemOther: '',\r\n      offensiveGraffiti: undefined,\r\n      problemOtherId: problemOtherId ? problemOtherId : undefined,\r\n      sizeOfWaste: '',\r\n      binTypeId: undefined,\r\n      streetFurnitureTypeId: undefined,\r\n      roadDefectTypeId: '',\r\n      waterDrainageTypeId: '',\r\n      locationSelected: false,\r\n      locationObject: undefined,\r\n      uploadedFiles: [],\r\n      isAlternative: 'false',\r\n      gullyType: null,\r\n      gullyNumber: null,\r\n      hasItRained: undefined,\r\n      waterDangerToUser: undefined,\r\n      riskOfInternalFlooding: undefined,\r\n      reocurringProblem: undefined,\r\n      signTypeId: undefined,\r\n      vegetationTypeId: undefined,\r\n      additionalProblemInformation: undefined,\r\n      lightTypeId: undefined,\r\n    },\r\n    incident: {\r\n      referenceNumber: '',\r\n      secretReferenceNumber: '',\r\n      incidentSubmitted: false,\r\n      incidentId: '',\r\n    },\r\n  };\r\n};\r\n\r\n// Actions for the reducer and forms\r\nconst updateStateFields = 'update-state-field';\r\nconst updateFormDataFields = 'update-form-data-field';\r\nconst updateLocationObject = 'update-location-object';\r\nconst resetLocation = 'reset-location';\r\nconst updateUploadFiles = 'update-upload-files';\r\nconst removeUploadedFile = 'remove-uploaded-file';\r\nconst resetForm = 'reset-state';\r\nconst updateIncidentObject = 'update-incident-object';\r\n\r\n// Export into 1 object for ease of use\r\n// Keep in order of the actions above for discoverability.\r\nexport const actions = {\r\n  updateStateFields,\r\n  updateFormDataFields,\r\n  updateLocationObject,\r\n  resetLocation,\r\n  updateUploadFiles,\r\n  removeUploadedFile,\r\n  resetForm,\r\n  updateIncidentObject,\r\n};\r\n\r\nexport const fieldNames = {\r\n  // state fields\r\n  pageHeaderText: 'pageHeaderText',\r\n  formStarted: 'formStarted',\r\n  formCompleted: 'formCompleted',\r\n  currentStep: 'currentStep',\r\n  userLoggedIn: 'userLoggedIn',\r\n  incident: 'incident',\r\n  missingAssetChecked: 'missingAssetChecked',\r\n  // formData fields\r\n  incidentSubmitted: 'incidentSubmitted',\r\n  additionalInformation: 'additionalInformation',\r\n  unitType: 'unitType',\r\n  problemId: 'problemId',\r\n  problemOther: 'problemOther',\r\n  offensiveGraffiti: 'offensiveGraffiti',\r\n  problemOtherId: 'problemOtherId',\r\n  sizeOfWaste: 'sizeOfWaste',\r\n  binTypeId: 'binTypeId',\r\n  streetFurnitureTypeId: 'streetFurnitureTypeId',\r\n  roadDefectTypeId: 'roadDefectTypeId',\r\n  waterDrainageTypeId: 'waterDrainageTypeId',\r\n  locationSelected: 'locationSelected',\r\n  locationObject: 'locationObject',\r\n  uploadedFiles: 'uploadedFiles',\r\n  isAlternative: 'isAlternative',\r\n  gullyType: 'gullyType',\r\n  gullyNumber: 'gullyNumber',\r\n  hasItRained: 'hasItRained',\r\n  waterDangerToUser: 'waterDangerToUser',\r\n  riskOfInternalFlooding: 'riskOfInternalFlooding',\r\n  reocurringProblem: 'reocurringProblem',\r\n  signTypeId: 'signTypeId',\r\n  vegetationTypeId: 'vegetationTypeId',\r\n  additionalProblemInformation: 'additionalProblemInformation',\r\n  lightTypeId: 'lightTypeId',\r\n};\r\n\r\nexport const reducer = (state, action) => {\r\n  switch (action.type) {\r\n    case updateStateFields:\r\n      return {\r\n        ...state,\r\n        ...action.payload,\r\n      };\r\n    case updateFormDataFields:\r\n      return {\r\n        ...state,\r\n        formData: {\r\n          ...state.formData,\r\n          ...action.payload,\r\n        },\r\n      };\r\n    case updateIncidentObject:\r\n      return {\r\n        ...state,\r\n        incident: {\r\n          ...state.incident,\r\n          ...action.payload,\r\n        },\r\n      };\r\n    case updateLocationObject:\r\n      return {\r\n        ...state,\r\n        formData: {\r\n          ...state.formData,\r\n          locationObject: {\r\n            easting: action.payload.easting.toString(),\r\n            northing: action.payload.northing.toString(),\r\n            streetName: action.payload.street,\r\n            location: action.payload.location,\r\n            USRN: action.payload.usrn,\r\n            postcode: action.payload.postcode,\r\n            toid: action.payload.toid,\r\n            ward: action.payload.ward,\r\n            parish: action.payload.parish,\r\n            filter: action.payload.filter,\r\n            assetId: action.payload.assetId,\r\n            assetDescription: action.payload.assetDescription,\r\n            roadNumber: action.payload.roadNumber,\r\n          },\r\n          locationSelected: true,\r\n        },\r\n      };\r\n    case resetLocation:\r\n      return {\r\n        ...state,\r\n        formData: {\r\n          ...state.formData,\r\n          locationObject: undefined,\r\n          locationSelected: false,\r\n        },\r\n      };\r\n    case updateUploadFiles:\r\n      let exisitingFiles = [...state.formData.uploadedFiles];\r\n      exisitingFiles.push(...action.payload);\r\n      return {\r\n        ...state,\r\n        formData: {\r\n          ...state.formData,\r\n          uploadedFiles: exisitingFiles,\r\n        },\r\n      };\r\n    case removeUploadedFile:\r\n      let files = state.formData.uploadedFiles;\r\n      files.splice(action.payload, 1);\r\n      return {\r\n        ...state,\r\n        formData: {\r\n          ...state.formData,\r\n          uploadedFiles: files,\r\n        },\r\n      };\r\n    case resetForm:\r\n      return { ...action.payload };\r\n    default:\r\n      return state;\r\n  }\r\n};\r\n","import { clientMyAccountUrl, myAccountHeaderText } from 'common';\r\n\r\n/**\r\n * Method to work out the header text to display based on Url's\r\n * @returns a string for displaying on the header\r\n */\r\nexport const HeaderTextFromUrl = ({ url, initialHeaderText }) => {\r\n  let headerText = initialHeaderText;\r\n\r\n  if (url.includes(clientMyAccountUrl.signIn)) {\r\n    headerText = myAccountHeaderText.signInHeader;\r\n  }\r\n  if (url.includes(clientMyAccountUrl.register)) {\r\n    headerText = myAccountHeaderText.registerHeader;\r\n  }\r\n  return headerText;\r\n};\r\n","import React, { useEffect, useReducer, useMemo, useCallback, useState } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  clientMyAccountUrl,\r\n  ContinueFormOrReRoute,\r\n  apiMyAccountUrl,\r\n  IncidentService,\r\n  changeUrlByStepNumberv6,\r\n  MissingAssetsStreetLightingFlag,\r\n  isEnabled,\r\n} from 'common';\r\nimport { getTOIDFromPoint, getPostcodeFromPointAsync } from 'common/components/map-components/esri-location.service';\r\nimport * as Services from 'common/services/incident.service';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport FormConfiguration from './form-config';\r\n\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport LightTypePageComponent from './components/light-type-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPage from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport IncidentFormContainer from 'common/containers/incident-forms/incident-form.container';\r\nimport {\r\n  FieldsBuilder,\r\n  incidentLayersOptionsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { actions, fieldNames } from 'incident-forms/incident-form.reducer';\r\nimport { initialState, reducer } from '../incident-form.reducer';\r\nimport { HeaderTextFromUrl } from 'incident-forms/helpers/header-text-from-url.helper';\r\nimport { IncidentsExistDisplay } from 'incident-forms/components-shared';\r\nimport {\r\n  cannotReportAnotherProblemFooter,\r\n  differentProblemFooter,\r\n  generalHeader,\r\n} from 'incident-forms/components-shared/existing-incidents-display/incidents-exist-display.component';\r\n\r\nconst StreetLightingApp = () => {\r\n  let location = useLocation();\r\n  let navigate = useNavigate();\r\n  const [existingIncidents, setExistingIncidents] = useState([]);\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.LIGHTING_INCIDENTS}`;\r\n\r\n  // This effect is for updating headers and step urls\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n    // Update the header based on the url.\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n\r\n    // Change the step number based on the url.\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.currentStep]: indexOfStep } });\r\n  }, [state.currentStep, location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // --- ENTRY PAGE ---\r\n  const handleResetForm = useCallback(\r\n    () => dispatch({ type: actions.resetForm, payload: initState }),\r\n    [dispatch, initState]\r\n  );\r\n\r\n  const handleFeatureClicked = async (e) => {\r\n    const toid = await getTOIDFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const postcode = await getPostcodeFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const locationObject = {\r\n      easting: e.feature.geometry.x.toString(),\r\n      northing: e.feature.geometry.y.toString(),\r\n      street: e.feature.attributes.ROAD_NAME,\r\n      roadNumber: e.feature.attributes.ROAD_NUMBER,\r\n      usrn: e.feature.attributes.USRN,\r\n      ward: e.feature.attributes.WARD,\r\n      parish: e.feature.attributes.PARISH,\r\n      assetId: e.feature.attributes.Item_Id, // Light number\r\n      assetDescription: e.feature.attributes.DESCRIPTION,\r\n      location: e.feature.attributes.LOCATION,\r\n      filter: `Item_Id=${e.feature.attributes.Item_Id}`,\r\n      toid,\r\n      postcode,\r\n    };\r\n    dispatch({ type: actions.updateLocationObject, payload: locationObject });\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: { [fieldNames.unitType]: e.feature.attributes.UNIT_TYPE },\r\n    });\r\n  };\r\n\r\n  /**\r\n   * Gets all map layer features and filters to find the lighting asset\r\n   * Then checks for existing incidents and sets location object\r\n   * @param {array} features array of map 'feature'\r\n   */\r\n  const handleGetAllLayerAttributesOnClick = (features) => {\r\n    if (formConfig.allowIncidentSelect) {\r\n      const featureFound = features.find((x) => x.feature.attributes.Item_Id);\r\n      if (featureFound) {\r\n        incidentExistsCheck(featureFound);\r\n        // Set the data found to the form\r\n        handleFeatureClicked(featureFound);\r\n      } else {\r\n        setExistingIncidents([]);\r\n      }\r\n    }\r\n  };\r\n\r\n  const clearSelectedFeature = () => {\r\n    dispatch({ type: actions.resetLocation });\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: '' } });\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.unitType]: null } });\r\n  };\r\n\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addAssetDescription('Lamp type');\r\n    fieldsBuilder.addCreatedTime('Created');\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: 'streetLightingIncidents',\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: 'Reported street light',\r\n        tableDataArray: [\r\n          { header: 'Light type', data: 'assetDescription' },\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Created', data: 'createdTime' },\r\n        ],\r\n      }),\r\n      fields: fieldsBuilder.builder,\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  const featureLayerOptionsBuilder = () => {\r\n    return [\r\n      {\r\n        layerUrl: formConfig.featureLayerUrl,\r\n        layerId: formConfig.featureLayerId,\r\n        popupTemplate: popupTemplateBuilder({\r\n          mapIncidentLayerTitle: 'Selected street light',\r\n          tableDataArray: [\r\n            { header: 'Light number', data: 'Item_Id' },\r\n            { header: 'Description', data: 'DESCRIPTION' },\r\n            { header: 'Location', data: 'LOCATION' },\r\n            { header: 'Road name', data: 'ROAD_NAME' },\r\n            { header: 'Ward', data: 'WARD' },\r\n            { header: 'Parish', data: 'PARISH' },\r\n          ],\r\n        }),\r\n      },\r\n    ];\r\n  };\r\n\r\n  const getMissingAssetOptions = () => {\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(MissingAssetsStreetLightingFlag))) {\r\n      return {\r\n        checked: state.missingAssetChecked,\r\n        label: formConfig.missingAssetCheckBoxLabel,\r\n        handleSwitch: () => {\r\n          dispatch({\r\n            type: actions.updateStateFields,\r\n            payload: { [fieldNames.missingAssetChecked]: !state.missingAssetChecked },\r\n          });\r\n        },\r\n        onUploadFiles: (files) => dispatch({ type: actions.updateUploadFiles, payload: files }),\r\n        onRemoveFile: (index) => dispatch({ type: actions.removeUploadedFile, payload: index }),\r\n        uploadedFiles: state.formData.uploadedFiles,\r\n        useUnadoptedLayer: false,\r\n        showFileInputOnMapPage: false,\r\n      };\r\n    }\r\n  };\r\n\r\n  // --- PROBLEM PAGE ---\r\n  const getPossibleProblems = () => {\r\n    const lightingTypes = Object.values(formConfig.streetLightTypes);\r\n    const getType = lightingTypes.filter((val) => val.unitType === state.formData.unitType)[0];\r\n    if (getType !== undefined) {\r\n      return getType.possibleProblems;\r\n    }\r\n    return undefined;\r\n  };\r\n\r\n  const buildTableData = () => {\r\n    const lightingTypes = Object.values(formConfig.streetLightTypes);\r\n    const { formData } = state;\r\n    const type = lightingTypes.filter((val) => val.unitType === formData.unitType)[0];\r\n    const problem = type ? type.possibleProblems.filter((val) => val.id === formData.problemId)[0] : undefined;\r\n\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Street name',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    if (problem) {\r\n      tableData.splice(1, 0, {\r\n        columnOne: 'Light type',\r\n        columnTwo: type.assetName,\r\n        onChangeClicked: () =>\r\n          changeUrlByStepNumberv6(state.missingAssetChecked ? 2 : 1, formConfig, navigate, 'location'),\r\n      });\r\n      tableData.splice(4, 0, {\r\n        columnOne: 'What is the problem?',\r\n        columnTwo: problem ? problem.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      });\r\n    }\r\n\r\n    // add light number if not missed (as then we don't have that info)\r\n    if (state.missingAssetChecked === false) {\r\n      tableData.splice(1, 0, {\r\n        columnOne: 'Light number',\r\n        columnTwo: formData.locationObject?.assetId,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    const form = { ...state.formData };\r\n    const lightingTypes = Object.values(formConfig.streetLightTypes);\r\n    form.productId = state.missingAssetChecked ? formConfig.missingAssetProductId : formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n    form.lightingTypeId = state.missingAssetChecked\r\n      ? state.formData.lightTypeId\r\n      : lightingTypes.filter((val) => val.unitType === form.unitType)[0].lightingTypeId;\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n        setExistingIncidents([]);\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      return result.status === 200 ? true : false;\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = {\r\n    formStarted: state.formStarted,\r\n    formCompleted: state.formCompleted,\r\n    formStartUrl: formConfig.stepUrls[0],\r\n    formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n    location: location,\r\n  };\r\n\r\n  const locationSelectText = (\r\n    <>\r\n      Search the map by postcode, street name, or your current location, to view nearby street lights.\r\n      <br />\r\n      Use the <span aria-hidden=\"true\" className=\"esri-icon esri-icon-locate\"></span> icon to report a problem at your\r\n      current location.\r\n      <br />\r\n      Select the street light by clicking the icon on the map.\r\n      <br />\r\n      Select a reported problem to view details.\r\n      <br />\r\n    </>\r\n  );\r\n\r\n  /**\r\n   * Calls service to see if any incidents exist on the street light asset.\r\n   * SIDE EFFECT: populates the existingIncidents state object\r\n   * @param {object} map feature and featureIntersect\r\n   * @returns true if there is incidents\r\n   */\r\n  const incidentExistsCheck = async (e) => {\r\n    // Happens on feature select\r\n    const incidentsResult = await IncidentService.getExistingIncidentsForAsset({\r\n      assetId: e.feature.attributes.Item_Id,\r\n      productId: formConfig.productId,\r\n    });\r\n    if (formConfig.allowIncidentSelect) {\r\n      setExistingIncidents(incidentsResult);\r\n    }\r\n    return incidentsResult.length > 0;\r\n  };\r\n\r\n  const hasProblemsLeftToReport = () => {\r\n    const problems = getPossibleProblems();\r\n    if (problems && formConfig.allowIncidentSelect) {\r\n      // Filter through problems and find ones where no incident exists\r\n      const r = problems.filter(\r\n        (problem) => !existingIncidents.find(({ categoryId }) => problem.id === categoryId.toString())\r\n      );\r\n      return r.length > 0;\r\n    }\r\n    return true;\r\n  };\r\n\r\n  const hasProblemsLeft = () => {\r\n    let problemsLeft = true;\r\n    if (formConfig.allowIncidentSelect) {\r\n      problemsLeft = hasProblemsLeftToReport();\r\n    }\r\n    return problemsLeft;\r\n  };\r\n\r\n  const handleCanClickNextOnLocationPage = () => hasProblemsLeft();\r\n\r\n  const handleAdditionalInformation = () => {\r\n    const result = hasProblemsLeft();\r\n    if (result === true) return state.formData.additionalInformation;\r\n    return undefined;\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.streetLighting.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{\r\n                text: 'problems with street lights and illuminated signs',\r\n                url: 'https://www.york.gov.uk/ReportStreetLighting',\r\n              }}\r\n              informationArray={[\r\n                {\r\n                  text: 'which street lighting problems we cannot help with',\r\n                  url: 'https://www.york.gov.uk/ReportStreetLighting#problemswecannothelp',\r\n                },\r\n                {\r\n                  text: 'our street lighting response times',\r\n                  url: 'https://www.york.gov.uk/ReportStreetLighting#streetlightingresponsetimes',\r\n                },\r\n              ]}\r\n              goToNextPage={() => {\r\n                dispatch({\r\n                  type: actions.updateStateFields,\r\n                  payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                });\r\n                changeUrlByStepNumberv6(1, formConfig, navigate);\r\n              }}\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.streetLighting.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <LocationPageComponent\r\n                goToNext={\r\n                  state.missingAssetChecked\r\n                    ? () => changeUrlByStepNumberv6(2, formConfig, navigate)\r\n                    : () => changeUrlByStepNumberv6(3, formConfig, navigate)\r\n                }\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                incidentLayerOptions={layerOptionsBuilder()}\r\n                featureLayerOptions={featureLayerOptionsBuilder()}\r\n                disableFreeSelect={true}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                locationSelectText={locationSelectText}\r\n                handleFeatureClicked={handleFeatureClicked}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                additionalInformation={handleAdditionalInformation()}\r\n                additionalInformationHeaderText={\r\n                  state.missingAssetChecked\r\n                    ? 'Additional location information. If you know the light number, please include below.'\r\n                    : null\r\n                }\r\n                clearSelectedPoint={clearSelectedFeature}\r\n                incidentExistsCheck={incidentExistsCheck}\r\n                incidentExistsAlertMessage=\"This light already has an incident reported and can therefore not have another.\"\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n                missingAssetsOptions={getMissingAssetOptions()}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                getAllLayersDetailsOnClick={handleGetAllLayerAttributesOnClick}\r\n                allowIncidentSelect={formConfig.allowIncidentSelect}\r\n                showNextButton={handleCanClickNextOnLocationPage()}\r\n                extraInformationUnderMap={\r\n                  <IncidentsExistDisplay\r\n                    headerText={generalHeader(formConfig.infoAlertSubjectName)}\r\n                    footerText={\r\n                      hasProblemsLeftToReport()\r\n                        ? differentProblemFooter(formConfig.infoAlertSubjectName)\r\n                        : cannotReportAnotherProblemFooter(formConfig.infoAlertSubjectName)\r\n                    }\r\n                    incidentsList={existingIncidents}\r\n                    categorys={ConfigurationService.store.categoryIds.streetLighting}\r\n                  />\r\n                }\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.streetLighting.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <LightTypePageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                lightTypeId={state.formData.lightTypeId}\r\n                lightTypes={formConfig.missingAssetsLightTypes}\r\n                streetLightTypes={formConfig.streetLightTypes}\r\n                onLightTypeChange={(id) => {\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.lightTypeId]: id } });\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: {\r\n                      [fieldNames.unitType]: Object.values(formConfig.streetLightTypes).filter(\r\n                        (val) => val.lightingTypeId === id\r\n                      )[0].unitType,\r\n                    },\r\n                  });\r\n                }}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.streetLighting.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ProblemPageComponent\r\n                goToPrevious={\r\n                  state.missingAssetChecked\r\n                    ? () => changeUrlByStepNumberv6(2, formConfig, navigate)\r\n                    : () => changeUrlByStepNumberv6(1, formConfig, navigate)\r\n                }\r\n                goToNext={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                problemId={state.formData.problemId}\r\n                possibleProblems={getPossibleProblems}\r\n                onProblemTypeChange={(value) =>\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } })\r\n                }\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                existingIncidents={existingIncidents}\r\n                productName={formConfig.infoAlertSubjectName}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.streetLighting.step4}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.streetLighting.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(clientMyAccountUrl.streetLighting.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(clientMyAccountUrl.streetLighting.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.stepUrls[0]}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() =>\r\n                navigate(clientMyAccountUrl.streetLighting.root + clientMyAccountUrl.streetLighting.confirmation)\r\n              }\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default StreetLightingApp;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nimport {\r\n  clientMyAccountUrl,\r\n  categorySettingNames,\r\n  categoryIdsSettingName,\r\n  processCategoryIdsSettingName,\r\n} from '../../common';\r\nimport { mapConstants } from '../../common/constants/map.constants';\r\n\r\nexport class FormConfiguration {\r\n  // private\r\n  sizeOfWasteConst = {\r\n    SingleBlackBag: { id: '1', name: 'Single black bag' },\r\n    CarbootLoad: { id: '2', name: 'Car boot load' },\r\n    SmallvanLoad: { id: '3', name: 'Small van load' },\r\n    LargevanLoad: { id: '4', name: 'Large van load' },\r\n    Multiplevanloads: { id: '5', name: 'Multiple van loads' },\r\n  };\r\n  // public\r\n  sizeOfWasteArray = [\r\n    this.sizeOfWasteConst.SingleBlackBag,\r\n    this.sizeOfWasteConst.CarbootLoad,\r\n    this.sizeOfWasteConst.SmallvanLoad,\r\n    this.sizeOfWasteConst.LargevanLoad,\r\n    this.sizeOfWasteConst.Multiplevanloads,\r\n  ];\r\n  pageHeaderText = 'Report a fly-tipping problem';\r\n  documentTitle = 'My Account - Report a fly-tipping problem';\r\n  totalSteps = 4;\r\n  productId = 80;\r\n  subject = 'Fly-tipping';\r\n  // Map constants\r\n  mapIncidentLayerId = 'flyTippingIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n\r\n  baseUrl = clientMyAccountUrl.flyTipping;\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n\r\n  problemOtherId = () =>\r\n    ConfigurationService.getDrillDownSettingValue([\r\n      categoryIdsSettingName,\r\n      processCategoryIdsSettingName.flyTipping,\r\n      categorySettingNames.flyTipping.other,\r\n      'id',\r\n    ]);\r\n\r\n  getFlyTippingCategories = () => {\r\n    return Object.values(\r\n      ConfigurationService.getDrillDownSettingValue([categoryIdsSettingName, processCategoryIdsSettingName.flyTipping])\r\n    );\r\n  };\r\n\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  // -----------------------\r\n}\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  TextInputComponent,\r\n  RadiobuttonInputComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nimport { ErrorBoxComponent, FileInputComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  errors,\r\n  values,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  possibleProblems,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n  sizeOfWasteArray,\r\n  onSizeOfWasteChange,\r\n  problemOtherId,\r\n  onProblemOtherChange,\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && touched.sizeOfWaste && (\r\n          <ErrorBoxComponent errors={errors}></ErrorBoxComponent>\r\n        )}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us what needs cleaning up.</p>\r\n        <div className=\"row\">\r\n          <span id=\"typeOfWaste\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"Type of waste\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={values.problemId}\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                if (e !== problemOtherId) {\r\n                  setFieldValue('problemOther', '');\r\n                }\r\n                onProblemTypeChange(e);\r\n              }}\r\n              options={possibleProblems.map((problem) => ({\r\n                value: problem.id,\r\n                label: problem.displayName,\r\n              }))}\r\n              error={errors.problemId && touched.problemId}\r\n            />\r\n            {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n            {values.problemId === values.problemOtherId ? (\r\n              <div>\r\n                <ErrorLabelHandlerComponent\r\n                  touched={touched}\r\n                  errors={errors}\r\n                  text=\"Please specify\"\r\n                  id=\"problemOther\"\r\n                  submitCount={submitCount}\r\n                />\r\n                <TextInputComponent\r\n                  name=\"problemOther\"\r\n                  id=\"problemOther\"\r\n                  value={values.problemOther}\r\n                  onChange={(e) => {\r\n                    setFieldValue('problemOther', e.target.value);\r\n                    onProblemOtherChange(e.target.value);\r\n                  }}\r\n                  error={errors.problemOther && touched.problemOther}\r\n                />\r\n                {errors.problemOther && touched.problemOther && (\r\n                  <InputErrorComponent>{errors.problemOther}</InputErrorComponent>\r\n                )}\r\n              </div>\r\n            ) : (\r\n              <React.Fragment />\r\n            )}\r\n          </span>\r\n        </div>\r\n\r\n        <h2>Amount of waste</h2>\r\n        <p>Tell us how much waste has been dumped so we can remove it in a single visit.</p>\r\n        <div className=\"row\">\r\n          <span id=\"amountOfWaste\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"Approximate size of waste\"\r\n              id=\"sizeOfWaste\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"sizeOfWaste\"\r\n              value={values.sizeOfWaste}\r\n              onChange={(e) => {\r\n                setFieldValue('sizeOfWaste', e);\r\n                onSizeOfWasteChange && onSizeOfWasteChange(e);\r\n              }}\r\n              error={errors.sizeOfWaste && touched.sizeOfWaste}\r\n              options={sizeOfWasteArray.map((size) => ({\r\n                label: size.name,\r\n                value: size.id,\r\n              }))}\r\n            />\r\n            {errors.sizeOfWaste && touched.sizeOfWaste && (\r\n              <InputErrorComponent>{errors.sizeOfWaste}</InputErrorComponent>\r\n            )}\r\n          </span>\r\n        </div>\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent uploadedFiles={uploadedFiles} onUploadFiles={onUploadFiles} onRemoveFile={onRemoveFile} />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, problemOther, problemOtherId, goToNext, sizeOfWaste }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      problemOther: problemOther || '',\r\n      problemOtherId: problemOtherId || '-1',\r\n      goToNext: goToNext,\r\n      sizeOfWaste: sizeOfWaste || '',\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'Type of waste'.\"),\r\n    sizeOfWaste: Yup.string().required(\"Please supply details for 'Approximate size of waste'.\"),\r\n    problemOther: Yup.string().when(['problemId', 'problemOtherId'], {\r\n      is: (problemId, problemOtherId) => problemId === problemOtherId,\r\n      then: Yup.string().required(\"Please supply details for 'Other'.\"),\r\n    }),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  problemOtherId: PropTypes.string,\r\n  sizeOfWaste: PropTypes.string,\r\n  sizeOfWasteArray: PropTypes.array,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  onProblemOtherChange: PropTypes.func.isRequired,\r\n  onSizeOfWasteChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useReducer, useEffect, useCallback, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport * as Services from '../../common/services/incident.service';\r\nimport {\r\n  clientMyAccountUrl,\r\n  ContinueFormOrReRoute,\r\n  apiSettingName,\r\n  apiMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n} from '../../common';\r\nimport { FormConfiguration } from './form-config';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  popupTemplateBuilder,\r\n  FieldsBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport IncidentFormContainer from '../../common/containers/incident-forms/incident-form.container';\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPage from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\n\r\nconst FlyTippingApp = () => {\r\n  const location = useLocation(); // props.location\r\n  const navigate = useNavigate(); // props.history\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText, problemOtherId: formConfig.problemOtherId() }),\r\n    [formConfig]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initialState(initState));\r\n  const getIncidentsUrl = `${ConfigurationService.getEnvironmentSettingByName(apiSettingName)}${\r\n    apiMyAccountUrl.getIncidents.FLY_TIPPING_INCIDENTS\r\n  }`;\r\n  const possibleProblems = formConfig.getFlyTippingCategories();\r\n\r\n  // This effect is for updating headers and step urls\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n    // Update the header based on the url.\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n\r\n    // Change the step number based on the url.\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.currentStep]: indexOfStep } });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // --- ENTRY PAGE ---\r\n  const handleResetForm = useCallback(() => dispatch({ type: actions.resetForm, payload: initState }), [initState]);\r\n\r\n  // ---- LOCATION PAGE ------\r\n  const mapIncidentsBuilder = (incident) => {\r\n    return {\r\n      incidentId: incident.incidentId,\r\n      referenceNumber: incident.referenceNumber,\r\n      wasteType: incident.category,\r\n      flyTippingOther:\r\n        incident.category === 'Other'\r\n          ? '<tr><th>Please specify</th><td>' + incident.flytippingOther + '</td></tr>'\r\n          : '',\r\n      createdTime: new Date(incident.createdTime).toLocaleString('en-GB'),\r\n    };\r\n  };\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addIncidentReferenceNumber();\r\n    fieldsBuilder.addWasteType();\r\n    fieldsBuilder.addCreatedTime();\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentsBuilder,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Waste type', data: 'wasteType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        nonTrData: [{ index: 0, data: '{flyTippingOther}' }],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.builder,\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  // ---- PROBLEM PAGE ----\r\n\r\n  const handleProblemTypeChange = (value) => {\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } });\r\n    // If the type is not Other then clear the other data\r\n    if (value !== state.formData.problemOtherId) {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemOther]: '' } });\r\n    }\r\n  };\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const formData = state.formData;\r\n    const wasteType = possibleProblems.filter((val) => val.id === formData.problemId)[0];\r\n    const wasteSize = formConfig.sizeOfWasteArray.filter((val) => val.id === formData.sizeOfWaste)[0];\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'Type of waste',\r\n        columnTwo: wasteType ? wasteType.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'typeOfWaste'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Amount of waste',\r\n        columnTwo: wasteSize ? wasteSize.name : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'amountOfWaste'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    // Only show the \"Other waste\" info if type of waste is other\r\n    if (formData.problemId === formData.problemOtherId) {\r\n      tableData.splice(3, 0, {\r\n        columnOne: \"Type of waste 'Other' information\",\r\n        columnTwo: formData.problemOther ? formData.problemOther : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'typeOfWaste'),\r\n        columnTwoClassName: 'sentence-case',\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    const form = { ...state.formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  const locationPageIncidentLayerOptions = layerOptionsBuilder();\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.flyTipping.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{ text: 'problems with fly-tipping', url: 'https://www.york.gov.uk/ReportFlyTipping' }}\r\n              informationArray={[\r\n                {\r\n                  text: 'which fly-tipping problems we cannot help with',\r\n                  url: 'https://www.york.gov.uk/ReportFlyTipping#problemswecannothelp',\r\n                },\r\n                {\r\n                  text: 'our fly-tipping response times',\r\n                  url: 'https://www.york.gov.uk/ReportFlyTipping#responsetimes',\r\n                },\r\n              ]}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1} // /form/fly-tipping/step-one\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPageComponent\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                incidentLayerOptions={locationPageIncidentLayerOptions}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                additionalInformation={state.formData.additionalInformation}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                problemId={state.formData.problemId}\r\n                problemOther={state.formData.problemOther}\r\n                problemOtherId={state.formData.problemOtherId}\r\n                sizeOfWaste={state.formData.sizeOfWaste}\r\n                sizeOfWasteArray={formConfig.sizeOfWasteArray}\r\n                onProblemTypeChange={handleProblemTypeChange}\r\n                onSizeOfWasteChange={(value) =>\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.sizeOfWaste]: value } })\r\n                }\r\n                onProblemOtherChange={(value) =>\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemOther]: value } })\r\n                }\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                possibleProblems={possibleProblems}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default FlyTippingApp;\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, categoryIdsSettingName, processCategoryIdsSettingName } from '../../common';\r\nimport { mapConstants } from '../../common/constants/map.constants';\r\n\r\nexport default class FormConfiguration {\r\n  baseUrl = clientMyAccountUrl.streetCleaning;\r\n  beforeYouBeginText = [\r\n    {\r\n      text: 'which street cleaning problems we cannot help with',\r\n      url: 'https://www.york.gov.uk/ReportStreetCleaning#problemswecannothelp',\r\n    },\r\n    {\r\n      text: 'our street cleaning response times',\r\n      url: 'https://www.york.gov.uk/ReportStreetCleaning#responsetimes',\r\n    },\r\n  ];\r\n  documentTitle = 'My Account - Report a street cleaning problem';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  mapIncidentLayerId = 'streetCleaningIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  pageHeaderText = 'Report a street cleaning problem';\r\n  productId = 94;\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n  subject = 'Street cleaning';\r\n  totalSteps = 4;\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  whatToReportText = {\r\n    text: 'problems with street cleaning',\r\n    url: 'https://www.york.gov.uk/ReportStreetCleaning',\r\n  };\r\n\r\n  // Values from configuration service\r\n  streetCleaningCategories = {};\r\n\r\n  constructor() {\r\n    this.streetCleaningCategories = Object.values(\r\n      ConfigurationService.getDrillDownSettingValue([\r\n        categoryIdsSettingName,\r\n        processCategoryIdsSettingName.streetCleaning,\r\n      ])\r\n    );\r\n  }\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n}\r\n\r\nexport const testName = 'Street Cleaning';\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\n\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport { ErrorBoxComponent, FileInputComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  values,\r\n  errors,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n  possibleProblems\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && <ErrorBoxComponent errors={errors}></ErrorBoxComponent>}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us what needs cleaning up.</p>\r\n        <div className=\"row\">\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"What is the problem\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={values.problemId}\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                onProblemTypeChange(e);\r\n              }}\r\n              error={errors.problemId && touched.problemId}\r\n              options={possibleProblems.map((problem) => ({\r\n                label: problem.displayName,\r\n                value: problem.id,\r\n              }))}\r\n            />\r\n            {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n          </span>\r\n        </div>\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent uploadedFiles={uploadedFiles} onUploadFiles={onUploadFiles} onRemoveFile={onRemoveFile} />\r\n\r\n        <ButtonComponent\r\n          type=\"submit\"\r\n          disabled={isSubmitting}\r\n          className={ButtonClasses.primary + ' button float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, goToNext }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'What is the problem'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useEffect, useReducer, useMemo, useCallback } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, ContinueFormOrReRoute, apiMyAccountUrl, changeUrlByStepNumberv6 } from '../../common';\r\nimport IncidentFormContainer from '../../common/containers/incident-forms/incident-form.container';\r\nimport * as Services from '../../common/services/incident.service';\r\n\r\nimport FormConfiguration from './form-config';\r\n\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport { actions, fieldNames, initialState, reducer } from '../incident-form.reducer';\r\nimport { ConfirmationPage, EntryPage, LocationPage, SummaryPage } from '../components-shared';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport {\r\n  FieldsBuilder,\r\n  incidentLayersOptionsBuilder,\r\n  popupTemplateBuilder,\r\n} from 'incident-forms/helpers/incident-layer-options-builder.helper';\r\n\r\nconst StreetCleaningApp = () => {\r\n  let location = useLocation();\r\n  let navigate = useNavigate();\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.STREET_CLEANING_INCIDENTS}`;\r\n  const possibleProblems = formConfig.streetCleaningCategories;\r\n\r\n  const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n  useEffect(() => {\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: {\r\n        [fieldNames.currentStep]: indexOfStep,\r\n        [fieldNames.pageHeaderText]: header,\r\n      },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, indexOfStep]);\r\n\r\n  // ---- ENTRY PAGE ------\r\n  const handleResetForm = useCallback(\r\n    () =>\r\n      dispatch({\r\n        type: actions.resetForm,\r\n        payload: initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n      }),\r\n    [dispatch, formConfig.pageHeaderText]\r\n  );\r\n\r\n  // ---- LOCATION PAGE ----\r\n  const getIncidentLayerOptions = () => {\r\n    const fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addIncidentReferenceNumber();\r\n    fieldsBuilder.addIssue();\r\n    fieldsBuilder.addCreatedTime();\r\n\r\n    const incident = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: (incident) => ({\r\n        issue: incident.category,\r\n        createdTime: new Date(incident.createdTime).toLocaleString('en-GB'),\r\n      }),\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Issue', data: 'issue' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.getBuilderResult(),\r\n    });\r\n\r\n    return incident;\r\n  };\r\n\r\n  // ----- SUMMARY PAGE ----\r\n  const submitIncident = async () => {\r\n    const form = { ...state.formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n        changeUrlByStepNumberv6(4, formConfig, navigate);\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  const buildTableData = () => {\r\n    const problem = possibleProblems.filter((val) => val.id === state.formData.problemId)[0];\r\n\r\n    return [\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          state.formData.locationObject &&\r\n          state.formData.locationObject.streetName &&\r\n          state.formData.locationObject.streetName.length > 0\r\n            ? state.formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: state.formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'About the problem',\r\n        columnTwo: problem ? problem.displayName : '',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: state.formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {state.formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => result.status === 200);\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    if (formConfig.userIsLoggedIn()) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  const formRouteInfo = () => ({\r\n    formStarted: state.formStarted,\r\n    formCompleted: state.formCompleted,\r\n    formStartUrl: formConfig.stepUrls[0],\r\n    formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n    location: location,\r\n  });\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.streetCleaning.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={formConfig.whatToReportText}\r\n              informationArray={formConfig.beforeYouBeginText}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: {\r\n                      [fieldNames.formStarted]: true,\r\n                      [fieldNames.formCompleted]: false,\r\n                    },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPage\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                incidentLayerOptions={getIncidentLayerOptions()}\r\n                additionalInformation={state.formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                onUploadFiles={(files) =>\r\n                  dispatch({\r\n                    type: actions.updateUploadFiles,\r\n                    payload: files,\r\n                  })\r\n                }\r\n                onRemoveFile={(index) =>\r\n                  dispatch({\r\n                    type: actions.removeUploadedFile,\r\n                    payload: index,\r\n                  })\r\n                }\r\n                problemId={state.formData.problemId}\r\n                sizeOfWaste={state.formData.sizeOfWaste}\r\n                onProblemTypeChange={(value) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: {\r\n                      [fieldNames.problemId]: value,\r\n                    },\r\n                  })\r\n                }\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                possibleProblems={possibleProblems}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPage\r\n                submitIncident={submitIncident}\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default StreetCleaningApp;\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, mapConstants, categoryIdsSettingName, processCategoryIdsSettingName } from '../../common';\r\n\r\nexport class FormConfiguration {\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  baseUrl = clientMyAccountUrl.saltBinProblems;\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n  testHeader = 'Salt bin problems';\r\n  pageHeaderText = 'Report a salt bin problem';\r\n  documentTitle = 'My Account - Report a salt bin problem';\r\n  totalSteps = 4;\r\n  productId = 932;\r\n  subject = 'Salt bin problems';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  mapIncidentLayerId = 'saltBinIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n\r\n  getSaltBinsCategories = () => {\r\n    return Object.values(\r\n      ConfigurationService.getDrillDownSettingValue([categoryIdsSettingName, processCategoryIdsSettingName.saltBins])\r\n    );\r\n  };\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n}\r\n","import React, { useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, FileInputComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageForm = (props) => {\r\n  const errorBoxRef = useRef();\r\n  const errors = useRef(props.errors);\r\n  const isValid = useRef(props.isValid);\r\n\r\n  useEffect(() => {\r\n    errors.current = props.errors;\r\n    isValid.current = props.isValid;\r\n  }, [props.errors, props.isValid]);\r\n\r\n  useEffect(() => {\r\n    if (!props.isSubmitting && !isValid.current && Object.keys(errors.current).length > 0) {\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.touched.problemId && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us more about the issue.</p>\r\n        <div className=\"row\">\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={props.touched}\r\n              errors={props.errors}\r\n              text=\"What is the problem?\"\r\n              tag=\"p\"\r\n              id=\"problemId\"\r\n              submitCount={props.submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={props.values.problemId}\r\n              onChange={(e) => {\r\n                props.setFieldValue('problemId', e);\r\n                props.onProblemTypeChange(e);\r\n              }}\r\n              error={props.errors.problemId && props.touched.problemId}\r\n              options={props.possibleProblems.map((problem) => ({\r\n                label: problem.displayName,\r\n                value: problem.id,\r\n              }))}\r\n            />\r\n            {props.errors.problemId && props.touched.problemId && (\r\n              <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n            )}\r\n          </span>\r\n        </div>\r\n\r\n        <p>\r\n          Find out how to make{' '}\r\n          <a href=\"https://www.york.gov.uk/SaltBins#othersaltbinenquiries\">other salt bin enquiries</a> such as\r\n          requesting a new salt bin, moving an existing salt bin, or telling us a salt bin is missing.\r\n        </p>\r\n\r\n        <h3 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h3>\r\n\r\n        <FileInputComponent\r\n          uploadedFiles={props.uploadedFiles}\r\n          onUploadFiles={props.onUploadFiles}\r\n          onRemoveFile={props.onRemoveFile}\r\n        />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ goToNext, problemId }) {\r\n    return {\r\n      problemId: problemId,\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'What is the problem?'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPageForm);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  goToNext: PropTypes.func.isRequired,\r\n  goToPrevious: PropTypes.func.isRequired,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPageForm };\r\n","import React, { useEffect, useCallback, useReducer, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport * as Services from '../../common/services/incident.service';\r\nimport {\r\n  ContinueFormOrReRoute,\r\n  IncidentFormContainer,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n  apiSettingName,\r\n  changeUrlByStepNumberv6,\r\n} from '../../common';\r\nimport { FormConfiguration } from './form-config';\r\nimport { actions, fieldNames, initialState, reducer } from 'incident-forms/incident-form.reducer';\r\n\r\n// Pages\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPage from './components/problem-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPage from '../components-shared/confirmation-page.component';\r\nimport SignInPage from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport { HeaderTextFromUrl } from 'incident-forms/helpers/header-text-from-url.helper';\r\nimport {\r\n  FieldsBuilder,\r\n  incidentLayersOptionsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from 'incident-forms/helpers/incident-layer-options-builder.helper';\r\n\r\nconst SaltBinProblemsApp = () => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n\r\n  const possibleProblems = formConfig.getSaltBinsCategories();\r\n  const getIncidentsUrl = `${ConfigurationService.getEnvironmentSettingByName(apiSettingName)}${\r\n    apiMyAccountUrl.getIncidents.SALT_BIN_PROBLEMS\r\n  }`;\r\n\r\n  // This effect is for updating headers and step urls\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n    // Update the header based on the url.\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n\r\n    // Change the step number based on the url.\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.currentStep]: indexOfStep } });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // --- ENTRY PAGE ---\r\n  const handleResetForm = useCallback(() => dispatch({ type: actions.resetForm, payload: initState }), [initState]);\r\n\r\n  // ----- LOCATION PAGE -----\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addCreatedTime('Created');\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Created', data: 'createdTime' },\r\n        ],\r\n      }),\r\n      fields: fieldsBuilder.builder,\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  const clearSelectedFeature = () => {\r\n    dispatch({ type: actions.resetLocation });\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.unitType]: null } });\r\n  };\r\n\r\n  // ----- PROBLEM PAGE -----\r\n\r\n  // ----- SUMMARY PAGE ----\r\n\r\n  const buildTableData = () => {\r\n    const { formData } = state;\r\n    const problem = possibleProblems && possibleProblems.find((problem) => problem.id === formData.problemId);\r\n    return problem\r\n      ? [\r\n          {\r\n            columnOne: 'Location',\r\n            columnTwo:\r\n              formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n                ? formData.locationObject.streetName\r\n                : 'Selected on map',\r\n            onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n          },\r\n          {\r\n            columnOne: 'Additional location information',\r\n            columnTwo: formData.additionalInformation,\r\n            onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n          },\r\n          {\r\n            columnOne: 'What is the problem?',\r\n            columnTwo: problem.displayName,\r\n            onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'whatIsTheProblem'),\r\n            columnTwoClassName: 'sentence-case',\r\n          },\r\n          {\r\n            columnOne: 'Upload a photo',\r\n            columnTwo: formData.uploadedFiles ? (\r\n              <ul className=\"uploaded-photos\">\r\n                {formData.uploadedFiles.map((file, index) => (\r\n                  <li key={index}>{file.fileName}</li>\r\n                ))}\r\n              </ul>\r\n            ) : (\r\n              <React.Fragment />\r\n            ),\r\n            onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'uploadPhoto'),\r\n          },\r\n        ]\r\n      : [];\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    const form = { ...state.formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      return result.status === 200 ? true : false;\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = {\r\n    formStarted: state.formStarted,\r\n    formCompleted: state.formCompleted,\r\n    formStartUrl: formConfig.stepUrls[0],\r\n    formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n    location: location,\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.saltBinProblems.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{\r\n                text: 'problems with a salt bin',\r\n                url: 'https://www.york.gov.uk/saltbins',\r\n              }}\r\n              informationArray={[\r\n                {\r\n                  text: 'salt bin problems we cannot help with',\r\n                  url: 'https://www.york.gov.uk/saltbins#problemswecannothelp',\r\n                },\r\n              ]}\r\n              goToNextPage={() => {\r\n                dispatch({\r\n                  type: actions.updateStateFields,\r\n                  payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                });\r\n                changeUrlByStepNumberv6(1, formConfig, navigate);\r\n              }}\r\n              onResetForm={handleResetForm}\r\n              additionalInformation={\r\n                <p>\r\n                  Do not use this form to report snow, ice, or frost on roads, pavements, or cycle tracks; we plan for\r\n                  winter weather and maintain{' '}\r\n                  <a href=\"https://www.york.gov.uk/gritting#grittingroutemap\">gritting routes</a> between November and\r\n                  April.\r\n                </p>\r\n              }\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <LocationPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                incidentLayerOptions={layerOptionsBuilder()}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                additionalInformation={state.formData.additionalInformation}\r\n                clearSelectedPoint={clearSelectedFeature}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ProblemPage\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                problemId={state.formData.problemId}\r\n                onProblemTypeChange={(value) => {\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.problemId]: value },\r\n                  });\r\n                }}\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                possibleProblems={possibleProblems}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(clientMyAccountUrl.saltBinProblems.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() =>\r\n                  navigate(clientMyAccountUrl.saltBinProblems.root + clientMyAccountUrl.register)\r\n                }\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.stepUrls[0]}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route path={clientMyAccountUrl.signIn} element={<SignInPage onSuccessfulSignIn={handleSignInCallBack} />} />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default SaltBinProblemsApp;\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, mapConstants, roadDefectTypeIdsSettingName } from '../../common';\r\n\r\nexport class FormConfiguration {\r\n  cycleTrackId = [];\r\n  defectTypes = {};\r\n\r\n  constructor() {\r\n    this.cycleTrackId = ConfigurationService.getEnvironmentSettingByName(roadDefectTypeIdsSettingName).cycleTrack.id;\r\n    this.defectTypes = Object.values(ConfigurationService.getEnvironmentSettingByName(roadDefectTypeIdsSettingName));\r\n  }\r\n\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  // For shortening the urls and having them in 1 place\r\n  baseUrl = clientMyAccountUrl.roadAndPavementProblems;\r\n  // Steps in order\r\n  // Any urls used in graffiti that are not in here get a step count of -1\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n\r\n  pageHeaderText = 'Report a road, pavement or path problem';\r\n  documentTitle = 'My Account - Report a road, pavement or footpath problem';\r\n  totalSteps = 4;\r\n  productId = 44;\r\n  subject = 'Road and Pavement problems';\r\n  // Map constants\r\n  mapIncidentLayerId = 'roadAndPavementIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n\r\n  // For the progress bar\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n}\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  categoryIdsSettingName,\r\n  categorySettingNames,\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  FileInputComponent,\r\n  processCategoryIdsSettingName,\r\n  setInitialPosition,\r\n  AlertMessageComponent,\r\n} from '../../../common';\r\n\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageForm = (props) => {\r\n  const [possibleProblems, setPossibleProblems] = useState(undefined);\r\n  const generalConditionId = ConfigurationService.getDrillDownSettingValue([\r\n    categoryIdsSettingName,\r\n    processCategoryIdsSettingName.roadAndPavementProblems,\r\n    categorySettingNames.roadAndPavementProblems.generalCondition,\r\n  ]).id;\r\n\r\n  const errorBoxRef = useRef();\r\n  const errors = useRef(props.errors);\r\n  const isValid = useRef(props.isValid);\r\n\r\n  useEffect(() => {\r\n    errors.current = props.errors;\r\n    isValid.current = props.isValid;\r\n  }, [props.errors, props.isValid]);\r\n\r\n  useEffect(() => {\r\n    if (!props.isSubmitting && !isValid.current && Object.keys(errors.current).length > 0) {\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  // Get the possible problems based on the selected problem with id\r\n  useEffect(() => {\r\n    const problemWith = props.defectTypes.find((problemWith) => problemWith.id === props.values.problemWithId);\r\n    setPossibleProblems(problemWith !== undefined ? problemWith.categories : undefined);\r\n  }, [props.values.problemWithId, props.defectTypes]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.touched.problemId && props.touched.problemWithId && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n        <h2>About the problem</h2>\r\n        <div className=\"row\">\r\n          <span id=\"WhereIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={props.touched}\r\n              errors={props.errors}\r\n              text=\"Where is the problem?\"\r\n              tag=\"p\"\r\n              id=\"problemWithId\"\r\n              submitCount={props.submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemWithId\"\r\n              value={props.values.problemWithId}\r\n              onChange={(e) => {\r\n                props.handleReset();\r\n                props.setFieldValue('problemWithId', e);\r\n                props.setFieldValue('problemId', '');\r\n                props.onProblemWithChange(e);\r\n              }}\r\n              error={props.errors.problemWithId && props.touched.problemWithId}\r\n              options={props.defectTypes.map((type) => ({\r\n                label: type.displayName,\r\n                value: type.id,\r\n              }))}\r\n            />\r\n            {props.errors.problemWithId && props.touched.problemWithId && (\r\n              <InputErrorComponent>{props.errors.problemWithId}</InputErrorComponent>\r\n            )}\r\n          </span>\r\n        </div>\r\n        {possibleProblems !== undefined && possibleProblems.length > 0 ? (\r\n          <div className=\"row\">\r\n            <span id=\"WhatIsTheProblem\">\r\n              <ErrorLabelHandlerComponent\r\n                touched={props.touched}\r\n                errors={props.errors}\r\n                tag=\"p\"\r\n                text=\"What is the problem?\"\r\n                id=\"problemId\"\r\n                submitCount={props.submitCount}\r\n              />\r\n              <RadiobuttonInputComponent\r\n                name=\"problemId\"\r\n                value={props.values.problemId}\r\n                onChange={(e) => {\r\n                  props.setFieldValue('problemId', e);\r\n                  props.onProblemChange(e);\r\n                }}\r\n                error={props.errors.problemId && props.touched.problemId}\r\n                options={possibleProblems.map((problem) => ({\r\n                  label: problem.displayName,\r\n                  value: problem.id,\r\n                }))}\r\n              />\r\n              {props.errors.problemId && props.touched.problemId && (\r\n                <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n              )}\r\n            </span>\r\n          </div>\r\n        ) : undefined}\r\n\r\n        {props.problemId === generalConditionId && (\r\n          <AlertMessageComponent>\r\n            <p>\r\n              We prioritise our road, pavement and cycle path repairs based on annual 'condition and safety'\r\n              inspections, the{' '}\r\n              <a\r\n                href=\"http://www.ukroadsliaisongroup.org/en/UKRLG-and-boards/uk-roads-board/wellmaintained-highways.cfm\"\r\n                target=\"_blank\"\r\n                rel=\"noopener noreferrer\">\r\n                Code of Practice for Highway Maintenance (opens in new tab)\r\n              </a>\r\n              , and our{' '}\r\n              <a\r\n                href=\"https://www.york.gov.uk/info/20014/streets_roads_and_pavements/1947/highway_maintenance_policy\"\r\n                target=\"_blank\"\r\n                rel=\"noopener noreferrer\">\r\n                Highway maintenance policy (opens in new tab)\r\n              </a>\r\n              .\r\n            </p>\r\n            <p>\r\n              Works are planned on a priority basis and considering budget, meaning we're unable to respond to\r\n              individual resurfacing requests. However, submitting this report helps us to identify areas for concern.\r\n            </p>\r\n          </AlertMessageComponent>\r\n        )}\r\n\r\n        <h3 className=\"mt-3\" id=\"UploadPhoto\">\r\n          Upload a photo\r\n        </h3>\r\n        <FileInputComponent\r\n          uploadedFiles={props.uploadedFiles}\r\n          onUploadFiles={props.onUploadFiles}\r\n          onRemoveFile={props.onRemoveFile}\r\n        />\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPreviousPage}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, problemWithId, goToNextPage, uploadedFiles }) {\r\n    return {\r\n      problemId: problemId,\r\n      problemWithId: problemWithId,\r\n      goToNextPage: goToNextPage,\r\n      uploadedFiles: uploadedFiles || [],\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemWithId: Yup.string().required(\"Please supply details for 'Where is the problem?'.\"),\r\n    problemId: Yup.string().when('problemWithId', {\r\n      is: (val) => val !== undefined && val !== null && val !== '',\r\n      then: Yup.string().required(\"Please supply details for 'What is the problem?'.\"),\r\n      otherwise: Yup.string().notRequired(),\r\n    }),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNextPage();\r\n  },\r\n})(ProblemPageForm);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemWithId: PropTypes.string,\r\n  onProblemWithChange: PropTypes.func.isRequired,\r\n  problemId: PropTypes.string,\r\n  onProblemChange: PropTypes.func.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  goToPreviousPage: PropTypes.func.isRequired,\r\n  defectTypes: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPageForm };\r\n","import React, { useEffect, useReducer, useCallback, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  ContinueFormOrReRoute,\r\n  IncidentFormContainer,\r\n  IncidentService,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n  isEnabled,\r\n  UnadoptedLayerFlag,\r\n} from '../../common';\r\nimport { FormConfiguration } from './form-config';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { getUnadoptedRoadsFeatureOptions } from '../helpers/unadopted-layer.helper';\r\n\r\n// Pages\r\nimport { ConfirmationPage, EntryPage, LocationPage, SummaryPage } from '../components-shared';\r\n\r\nimport ProblemPage from './components/problem-page.component';\r\nimport SignInPage from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\n\r\nconst RoadAndPavementProblemsApp = (props) => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initialState(initState));\r\n  const formData = state.formData;\r\n  const getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.ROAD_AND_PAVEMENT_PROBLEMS}`;\r\n  const defectTypes = formConfig.defectTypes;\r\n  const isCycleTrackSelected = formData.roadDefectTypeId === formConfig.cycleTrackId;\r\n\r\n  // This effect is for updating headers and step urls\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n    // Update the header based on the url.\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // --- ENTRY PAGE ---\r\n  const handleResetForm = useCallback(() => dispatch({ type: actions.resetForm, payload: initState }), [initState]);\r\n\r\n  // Build incident Layer options\r\n  let fieldsBuilder = new FieldsBuilder();\r\n  fieldsBuilder.addIncidentId();\r\n  fieldsBuilder.addFaultType();\r\n  fieldsBuilder.addIncidentReferenceNumber();\r\n  fieldsBuilder.addCreatedTime();\r\n  const incidentLayerOptions = incidentLayersOptionsBuilder({\r\n    mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n    getIncidentsUrl: getIncidentsUrl,\r\n    mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n    popupTemplate: popupTemplateBuilder({\r\n      mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n      tableDataArray: [\r\n        { header: 'Fault type', data: 'faultType' },\r\n        { header: 'Date created', data: 'createdTime' },\r\n      ],\r\n      showAlreadyReportedMessage: true,\r\n    }),\r\n    fields: fieldsBuilder.getBuilderResult(),\r\n  });\r\n\r\n  // Build feature Layer options (currently only unadopted roads)\r\n  const getFeatureLayerOptions = () => {\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(UnadoptedLayerFlag))) {\r\n      return [getUnadoptedRoadsFeatureOptions()];\r\n    }\r\n  };\r\n\r\n  const handleFeatureClicked = (e) => {\r\n    dispatch({ type: actions.resetLocation });\r\n  };\r\n\r\n  // ----- SUMMARY PAGE ----\r\n  const buildTableData = () => {\r\n    const defectType = defectTypes.find((val) => val.id === formData.roadDefectTypeId);\r\n    const problemWith = defectType && defectType.displayName;\r\n    const problem =\r\n      defectType && defectType.categories.find((problem) => problem.id === formData.problemId)?.displayName;\r\n\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Problem with',\r\n        columnTwo: problemWith,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'WhereIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'About the problem',\r\n        columnTwo: problem,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'WhatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'UploadPhoto'),\r\n      },\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n    ];\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n    // Create the incident\r\n    try {\r\n      const result = await IncidentService.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await IncidentService.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      return result.status === 200;\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = {\r\n    formStarted: state.formStarted,\r\n    formCompleted: state.formCompleted,\r\n    formStartUrl: formConfig.stepUrls[0],\r\n    formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n    location: location,\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.roadAndPavementProblems.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{ text: 'road and pavement problems', url: 'https://www.york.gov.uk/ReportRoadsAndPavements' }}\r\n              informationArray={[\r\n                {\r\n                  text: 'problems we can help with',\r\n                  url: 'https://www.york.gov.uk/ReportRoadsAndPavements#problemswecanhelpwith',\r\n                },\r\n                {\r\n                  text: 'our road problem response times',\r\n                  url: 'https://www.york.gov.uk/ReportRoadsAndPavements#responsetimes',\r\n                },\r\n              ]}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ProblemPage\r\n                goToNextPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPreviousPage={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                problemWithId={formData.roadDefectTypeId}\r\n                problemId={formData.problemId}\r\n                onProblemWithChange={(value) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.roadDefectTypeId]: value },\r\n                  })\r\n                }\r\n                onProblemChange={(value) =>\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } })\r\n                }\r\n                uploadedFiles={formData.uploadedFiles}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                defectTypes={defectTypes}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <LocationPage\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                incidentLayerOptions={incidentLayerOptions}\r\n                featureLayerOptions={isCycleTrackSelected ? undefined : getFeatureLayerOptions()}\r\n                handleFeatureClicked={isCycleTrackSelected ? undefined : handleFeatureClicked}\r\n                locationObject={formData.locationObject}\r\n                locationSelected={formData.locationSelected}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                additionalInformation={formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <SummaryPage\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n                responseTimes={[\r\n                  {\r\n                    text: 'road or pavement response times',\r\n                    url: 'https://www.york.gov.uk/ReportRoadsAndPavements#responsetimes',\r\n                  },\r\n                ]}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route path={clientMyAccountUrl.signIn} element={<SignInPage onSuccessfulSignIn={handleSignInCallBack} />} />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default RoadAndPavementProblemsApp;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { mapConstants } from '../../common/constants/map.constants';\r\n\r\nimport { clientMyAccountUrl, processCategoryIdsSettingName, categoryIdsSettingName } from '../../common';\r\n\r\nexport class FormConfiguration {\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n\r\n  baseUrl = clientMyAccountUrl.graffiti;\r\n  pageHeaderText = 'Report a graffiti problem';\r\n  documentTitle = 'My Account - Report a graffiti problem';\r\n  totalSteps = 4;\r\n  productId = 76;\r\n  subject = 'Graffiti';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  // Map constants\r\n  mapIncidentLayerId = 'graffitiIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n\r\n  // Urls\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n\r\n  getGraffitiCategories = () => {\r\n    return Object.values(\r\n      ConfigurationService.getDrillDownSettingValue([categoryIdsSettingName, processCategoryIdsSettingName.graffiti])\r\n    );\r\n  };\r\n\r\n  getProblemIdByName = (problemName) => {\r\n    return ConfigurationService.getDrillDownSettingValue([\r\n      categoryIdsSettingName,\r\n      processCategoryIdsSettingName.graffiti,\r\n      problemName,\r\n    ]).id;\r\n  };\r\n\r\n  shouldDisplayBasedOnStep = (number) => {\r\n    if (number > 0 && number <= this.totalSteps) return true;\r\n    return false;\r\n  };\r\n}\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\n\r\nimport {\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  FileInputComponent,\r\n  ErrorLabelHandlerComponent,\r\n  setInitialPosition,\r\n  AlertMessageComponent,\r\n  OffensiveGraffitiInputComponent,\r\n} from '../../../common';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  errors,\r\n  values,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n  utilityBoxId,\r\n  onOffensiveGraffitiChanged,\r\n  possibleGraffitiLocations,\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && <ErrorBoxComponent errors={errors}></ErrorBoxComponent>}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us more about the graffiti.</p>\r\n        <div className=\"row\">\r\n          <span id=\"graffitiOn\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"What is the graffiti on?\"\r\n              tag=\"h3\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={values.problemId}\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                onProblemTypeChange(e);\r\n              }}\r\n              options={possibleGraffitiLocations.map((location) => ({\r\n                label: location.displayName,\r\n                value: location.id,\r\n              }))}\r\n              error={errors.problemId && touched.problemId}\r\n            />\r\n\r\n            {values.problemId === utilityBoxId ? (\r\n              <AlertMessageComponent>\r\n                <p>We are not responsible for utility boxes in York; we'll inform the owner if you report graffiti.</p>\r\n              </AlertMessageComponent>\r\n            ) : null}\r\n            {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n          </span>\r\n        </div>\r\n\r\n        <div className=\"row\">\r\n          <span id=\"isGraffitiOffensive\">\r\n            <OffensiveGraffitiInputComponent\r\n              offensiveGraffiti={values.offensiveGraffiti}\r\n              onOffensiveGraffitiChange={(value) => {\r\n                setFieldValue('offensiveGraffiti', value);\r\n                onOffensiveGraffitiChanged && onOffensiveGraffitiChanged(value);\r\n              }}\r\n              errors={errors}\r\n              touched={touched}\r\n              submitCount={submitCount}\r\n            />\r\n            {errors.offensiveGraffiti && touched.offensiveGraffiti && (\r\n              <InputErrorComponent>{errors.offensiveGraffiti}</InputErrorComponent>\r\n            )}\r\n          </span>\r\n        </div>\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent uploadedFiles={uploadedFiles} onUploadFiles={onUploadFiles} onRemoveFile={onRemoveFile} />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, goToNext, offensiveGraffiti, uploadedFiles }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      goToNext: goToNext,\r\n      offensiveGraffiti: offensiveGraffiti || undefined,\r\n      uploadedFiles: uploadedFiles || [],\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'What is the graffiti on?'.\"),\r\n    offensiveGraffiti: Yup.bool().nullable().required(\"Please supply details for 'Is the graffiti offensive?'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  offensiveGraffiti: PropTypes.bool,\r\n  possibleGraffitiLocations: PropTypes.array.isRequired,\r\n  utilityBoxId: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useEffect, useReducer, useMemo, useCallback } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { actions, fieldNames, initialState, reducer } from 'incident-forms/incident-form.reducer';\r\nimport * as Services from '../../common/services/incident.service';\r\nimport {\r\n  clientMyAccountUrl,\r\n  ContinueFormOrReRoute,\r\n  apiSettingName,\r\n  apiMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n  categorySettingNames,\r\n} from '../../common';\r\n\r\nimport { FormConfiguration } from './form-config';\r\nimport IncidentFormContainer from '../../common/containers/incident-forms/incident-form.container';\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPage from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport { HeaderTextFromUrl } from 'incident-forms/helpers/header-text-from-url.helper';\r\nimport {\r\n  FieldsBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n  incidentLayersOptionsBuilder,\r\n  popupTemplateBuilder,\r\n} from 'incident-forms/helpers/incident-layer-options-builder.helper';\r\n\r\nconst GraffitiApp = () => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  // Hold state here...\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const getIncidentsUrl = `${ConfigurationService.getEnvironmentSettingByName(apiSettingName)}${\r\n    apiMyAccountUrl.getIncidents.GRAFFITI\r\n  }`;\r\n  const possibleGraffitiLocations = formConfig.getGraffitiCategories();\r\n  const utilityBoxId = formConfig.getProblemIdByName(categorySettingNames.graffiti.utilityBox);\r\n\r\n  // This effect is for updating headers and step urls\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n\r\n    // Update the header based on the url.\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // --- ENTRY PAGE ---\r\n  const handleResetForm = useCallback(() => dispatch({ type: actions.resetForm, payload: initState }), [initState]);\r\n\r\n  // ---- LOCATION PAGE ------\r\n\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addCreatedTime('Date created');\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n      }),\r\n      fields: fieldsBuilder.builder,\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  const handleMapSelected = (location) => {\r\n    const locationObject = {\r\n      ...location,\r\n      easting: location.easting.toString(),\r\n      northing: location.northing.toString(),\r\n      street: location.street,\r\n      usrn: location.usrn,\r\n      postcode: location.postcode,\r\n    };\r\n    dispatch({ type: actions.updateLocationObject, payload: locationObject });\r\n  };\r\n\r\n  // --- PROBLEM PAGE ---\r\n  const buildTableData = () => {\r\n    const { formData } = state;\r\n    const offensiveGraffiti = () => {\r\n      if (formData.offensiveGraffiti === true) {\r\n        return 'Yes';\r\n      }\r\n      if (formData.offensiveGraffiti === false) {\r\n        return 'No';\r\n      }\r\n      return '';\r\n    };\r\n\r\n    const graffitiLocation = possibleGraffitiLocations.filter((val) => val.id === formData.problemId)[0];\r\n    return graffitiLocation\r\n      ? [\r\n          {\r\n            columnOne: 'Location',\r\n            columnTwo:\r\n              formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n                ? formData.locationObject.streetName\r\n                : 'Selected on map',\r\n            onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n          },\r\n          {\r\n            columnOne: 'Additional location information',\r\n            columnTwo: formData.additionalInformation,\r\n            onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n          },\r\n          {\r\n            columnOne: 'What is the graffiti on?',\r\n            columnTwo: graffitiLocation ? graffitiLocation.displayName : null,\r\n            onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'graffitiOn'),\r\n            columnTwoClassName: 'sentence-case',\r\n          },\r\n          {\r\n            columnOne: 'Is the graffiti offensive?',\r\n            columnTwo: offensiveGraffiti(),\r\n            onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'isGraffitiOffensive'),\r\n            columnTwoClassName: 'sentence-case',\r\n          },\r\n          {\r\n            columnOne: 'Upload a photo',\r\n            columnTwo: formData.uploadedFiles ? (\r\n              <ul className=\"uploaded-photos\">\r\n                {formData.uploadedFiles.map((file, index) => (\r\n                  <li key={index}>{file.fileName}</li>\r\n                ))}\r\n              </ul>\r\n            ) : (\r\n              <React.Fragment />\r\n            ),\r\n            onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'uploadPhoto'),\r\n          },\r\n        ]\r\n      : [];\r\n  };\r\n\r\n  const handleProblemTypeChange = (value) => {\r\n    const form = { ...state.formData };\r\n    form.problemId = value;\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } });\r\n  };\r\n\r\n  // ----- SUMMARY PAGE ----\r\n  const submitIncident = async () => {\r\n    const form = { ...state.formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      return result.status === 200;\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = {\r\n    formStarted: state.formStarted,\r\n    formCompleted: state.formCompleted,\r\n    formStartUrl: formConfig.stepUrls[0],\r\n    formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n    location: location,\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.graffiti.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{\r\n                text: 'problems with graffiti',\r\n                url: 'https://www.york.gov.uk/ReportGraffiti',\r\n              }}\r\n              informationArray={[\r\n                {\r\n                  text: 'which graffiti problems we can help with',\r\n                  url: 'https://www.york.gov.uk/ReportGraffiti#problemswecanhelpwith',\r\n                },\r\n                {\r\n                  text: 'our graffiti response times',\r\n                  url: 'https://www.york.gov.uk/ReportGraffiti#graffitiresponsetimes',\r\n                },\r\n              ]}\r\n              goToNextPage={() => {\r\n                dispatch({\r\n                  type: actions.updateStateFields,\r\n                  payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                });\r\n                changeUrlByStepNumberv6(1, formConfig, navigate);\r\n              }}\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <LocationPageComponent\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                incidentLayerOptions={layerOptionsBuilder()}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                onMapSelected={handleMapSelected}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                additionalInformation={state.formData.additionalInformation ? state.formData.additionalInformation : ''}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                getIncidentsUrl={getIncidentsUrl}\r\n                possibleGraffitiLocations={possibleGraffitiLocations}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                problemId={state.formData.problemId}\r\n                offensiveGraffiti={state.formData.offensiveGraffiti}\r\n                onProblemTypeChange={handleProblemTypeChange}\r\n                onOffensiveGraffitiChanged={(value) => {\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.offensiveGraffiti]: value },\r\n                  });\r\n                }}\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                possibleGraffitiLocations={possibleGraffitiLocations}\r\n                utilityBoxId={utilityBoxId}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <SummaryPageComponent\r\n                submitIncident={submitIncident}\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(clientMyAccountUrl.graffiti.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(clientMyAccountUrl.graffiti.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.stepUrls[0]}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default GraffitiApp;\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { clientMyAccountUrl, mapConstants, processCategoryIdsSettingName } from 'common';\r\n\r\n// name used in tests to allow searching them by name\r\nexport const testName = 'Water and Drainage';\r\n\r\nexport default class FormConfiguration {\r\n  surfaceWaterQuestions = [];\r\n  waterAndDrainageTypes = {};\r\n  productId;\r\n  missingAssetProductId;\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n\r\n  constructor() {\r\n    const waterAndDrainageData = ConfigurationService.getEnvironmentSettingByName(\r\n      processCategoryIdsSettingName.waterAndDrainage\r\n    );\r\n\r\n    this.surfaceWaterQuestions = waterAndDrainageData.surfaceWaterQuestions;\r\n    this.waterAndDrainageTypes = waterAndDrainageData.waterAndDrainageTypes;\r\n    this.productId = waterAndDrainageData.productId;\r\n    this.missingAssetProductId = waterAndDrainageData.missingAssetProductId;\r\n  }\r\n\r\n  // get type id based on the name of the setting\r\n  getTypeId = (typeName) => {\r\n    const types = Object.entries(this.waterAndDrainageTypes);\r\n    const result = types.find((type) => type[0] === typeName)[1];\r\n    if (result) return result.id;\r\n    throw Error(`Could not find id for '${typeName}' category`);\r\n  };\r\n\r\n  // For shortening the urls and having them in 1 place\r\n  baseUrl = clientMyAccountUrl.waterAndDrainageProblems;\r\n  // Steps in order\r\n  // Any urls used that are not in here get a step count of -1\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.step4}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n\r\n  // Entry page constants\r\n  whatToReportText = {\r\n    text: 'problems with water or drainage',\r\n    url: 'https://www.york.gov.uk/ReportWaterAndDrainageProblems',\r\n  };\r\n\r\n  beforeYouBeginText = [\r\n    {\r\n      text: 'problems we can help with',\r\n      url: 'https://www.york.gov.uk/ReportWaterAndDrainageProblems#problemswecanhelpwith',\r\n    },\r\n    {\r\n      text: 'our water and drainage problem response times',\r\n      url: 'https://www.york.gov.uk/ReportWaterAndDrainageProblems#responsetimes',\r\n    },\r\n  ];\r\n\r\n  pageHeaderText = 'Report a water or drainage problem';\r\n  documentTitle = 'My Account - Report a water or drainage problem';\r\n  totalSteps = this.stepUrls.length - 1;\r\n\r\n  // subject field passed to OSC\r\n  subject = 'Water and Drainage problems';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  // Map constants\r\n  mapIncidentLayerId = 'waterAndDrainageIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  mapFeatureLayerId = 'waterAndDrainageFeatures';\r\n  mapFeatureLayerTitle = 'Selected gully';\r\n  mapFeatureLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/16';\r\n\r\n  missingAssetCheckBoxLabel = \"I can't find the gully on the map\";\r\n\r\n  // surface water question names for summary page\r\n  sumaryQuestionNames = {\r\n    hasItRained: 'Rained in last 2 hours?',\r\n    waterDangerToUser: 'Danger to road users?',\r\n    riskOfInternalFlooding: 'Risk of internal flooding?',\r\n    reocurringProblem: 'Reoccuring problem?',\r\n  };\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemWithPageForm = (props) => {\r\n  let errorBoxRef = React.createRef();\r\n\r\n  useEffect(() => {\r\n    if (!props.isSubmitting && !props.isValid && Object.keys(props.errors).length > 0) {\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting, errorBoxRef, props.errors, props.isValid]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\" id=\"typeOfTheProblem\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.touched.problemWithId && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n\r\n        <h2>About the problem</h2>\r\n\r\n        {props.types !== undefined && props.types.length > 0 ? (\r\n          <div className=\"row\">\r\n            <span id=\"WhatIsTheProblemWith\">\r\n              <ErrorLabelHandlerComponent\r\n                touched={props.touched}\r\n                errors={props.errors}\r\n                tag=\"p\"\r\n                text=\"What is the problem with?\"\r\n                id=\"problemWithId\"\r\n                submitCount={props.submitCount}\r\n              />\r\n              <RadiobuttonInputComponent\r\n                name=\"problemWithId\"\r\n                value={props.values.problemWithId}\r\n                onChange={(e) => {\r\n                  props.setFieldValue('problemWithId', e);\r\n                  props.onProblemWithChange(e);\r\n                }}\r\n                error={props.errors.problemWithId && props.touched.problemWithId}\r\n                options={props.types.map((type) => ({\r\n                  label: type.displayName,\r\n                  value: type.id,\r\n                }))}\r\n              />\r\n              {props.errors.problemWithId && props.touched.problemWithId && (\r\n                <InputErrorComponent>{props.errors.problemWithId}</InputErrorComponent>\r\n              )}\r\n            </span>\r\n          </div>\r\n        ) : undefined}\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPreviousPage}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemWithPageComponent = withFormik({\r\n  mapPropsToValues({ problemWithId, goToNextPage }) {\r\n    return {\r\n      problemWithId: problemWithId,\r\n      goToNextPage: goToNextPage,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemWithId: Yup.string().required(\"Please supply details for 'What is the problem with?'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNextPage();\r\n  },\r\n})(ProblemWithPageForm);\r\n\r\nProblemWithPageComponent.propTypes = {\r\n  problemWithId: PropTypes.string,\r\n  onProblemWithChange: PropTypes.func.isRequired,\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  goToPreviousPage: PropTypes.func.isRequired,\r\n  types: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemWithPageComponent;\r\nexport { ProblemWithPageForm };\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, FileInputComponent, setInitialPosition, RadioList } from '../../../common';\r\n\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageSurfaceWaterForm = (props) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n\r\n  useEffect(() => {\r\n    if (\r\n      !props.isSubmitting &&\r\n      !props.isValid &&\r\n      Object.keys(props.errors).length > 0 &&\r\n      props.submitCount > previousSubmitCount.current\r\n    ) {\r\n      previousSubmitCount.current = props.submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting, errorBoxRef, props.errors, props.isValid, props.submitCount]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.submitCount > 0 && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Surface water</p>\r\n        <p>Providing the following information will help us assess the problem (All answers are required)</p>\r\n\r\n        {props.surfaceWaterQuestions.map((element) => {\r\n          return (\r\n            <RadioList\r\n              key={element.id}\r\n              question={element.question}\r\n              id={element.id}\r\n              selectedItem={props[element.id]}\r\n              radioOptions={element.radioOptions}\r\n              onChange={(e) => {\r\n                props.setFieldValue(element.id, e);\r\n                props.onSurfaceWaterQuestionChange(element.id, e);\r\n              }}\r\n              touched={props.touched}\r\n              errors={props.errors}\r\n              submitCount={props.submitCount}\r\n            />\r\n          );\r\n        })}\r\n\r\n        <h3 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h3>\r\n\r\n        <FileInputComponent\r\n          uploadedFiles={props.uploadedFiles}\r\n          onUploadFiles={props.onUploadFiles}\r\n          onRemoveFile={props.onRemoveFile}\r\n        />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPreviousPage}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageSurfaceWaterComponent = withFormik({\r\n  mapPropsToValues(props) {\r\n    const valuesObject = {\r\n      goToNextPage: props.goToNextPage,\r\n      uploadedFiles: props.uploadedFiles || [],\r\n    };\r\n\r\n    props.surfaceWaterQuestions.forEach((element) => {\r\n      valuesObject[element.id] = props[element.id];\r\n    });\r\n\r\n    return valuesObject;\r\n  },\r\n  validationSchema: (props) => {\r\n    const validationObject = {\r\n      goToNextPage: Yup.string().required(),\r\n      uploadedFiles: Yup.array(),\r\n    };\r\n\r\n    props.surfaceWaterQuestions.forEach((element) => {\r\n      validationObject[element.id] = Yup.number().required(`Please supply details for '${element.question}'`);\r\n    });\r\n    return Yup.object().shape(validationObject);\r\n  },\r\n  handleSubmit(bag) {\r\n    bag.goToNextPage();\r\n  },\r\n})(ProblemPageSurfaceWaterForm);\r\n\r\nProblemPageSurfaceWaterComponent.propTypes = {\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  goToPreviousPage: PropTypes.func.isRequired,\r\n  onSurfaceWaterQuestionChange: PropTypes.func.isRequired,\r\n  surfaceWaterQuestions: PropTypes.array.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array.isRequired,\r\n  hasItRained: PropTypes.string,\r\n  waterDangerToUser: PropTypes.string,\r\n  riskOfInternalFlooding: PropTypes.string,\r\n  reocurringProblem: PropTypes.string,\r\n};\r\n\r\nexport default ProblemPageSurfaceWaterComponent;\r\nexport { ProblemPageSurfaceWaterForm };\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  FileInputComponent,\r\n  setInitialPosition,\r\n  RadioList,\r\n} from '../../../common';\r\n\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageNonSurfaceWaterForm = (props) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n\r\n  useEffect(() => {\r\n    if (\r\n      !props.isSubmitting &&\r\n      !props.isValid &&\r\n      Object.keys(props.errors).length > 0 &&\r\n      props.submitCount > previousSubmitCount.current\r\n    ) {\r\n      previousSubmitCount.current = props.submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting, errorBoxRef, props.errors, props.isValid, props.submitCount]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  const type = props.waterAndDrainageTypes.find((type) => type.id === props.problemWithId);\r\n  const typeDisplayName = type && type.displayName;\r\n  const problemCategories = type && Object.values(type.categories);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.submitCount > 0 && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n        <h2>About the problem</h2>\r\n        <p>{typeDisplayName}</p>\r\n        <div className=\"row\">\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={props.touched}\r\n              errors={props.errors}\r\n              text=\"What is the problem?\"\r\n              tag=\"p\"\r\n              id=\"problemId\"\r\n              submitCount={props.submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={props.values.problemId}\r\n              onChange={(e) => {\r\n                // reset field values for flooded questions\r\n                props.floodedQuestions.forEach((element) => {\r\n                  props.setFieldValue([element.id], undefined);\r\n                });\r\n                props.setFieldValue('problemId', e);\r\n                props.onProblemChange(e);\r\n              }}\r\n              error={props.errors.problemId && props.touched.problemId}\r\n              options={problemCategories.map((problem) => ({\r\n                label: problem.displayName,\r\n                value: problem.id,\r\n              }))}\r\n            />\r\n            {props.errors.problemId && props.touched.problemId && (\r\n              <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n            )}\r\n          </span>\r\n        </div>\r\n\r\n        {props.areFloodedQuestionsRequired &&\r\n          props.floodedQuestions.map((element) => {\r\n            return (\r\n              <RadioList\r\n                key={element.id}\r\n                question={element.question}\r\n                id={element.id}\r\n                selectedItem={props[element.id]}\r\n                radioOptions={element.radioOptions}\r\n                onChange={(e) => {\r\n                  props.setFieldValue(element.id, e);\r\n                  props.onFloodedQuestionChange(element.id, e);\r\n                }}\r\n                touched={props.touched}\r\n                errors={props.errors}\r\n                submitCount={props.submitCount}\r\n              />\r\n            );\r\n          })}\r\n\r\n        <h3 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h3>\r\n        <FileInputComponent\r\n          uploadedFiles={props.uploadedFiles}\r\n          onUploadFiles={props.onUploadFiles}\r\n          onRemoveFile={props.onRemoveFile}\r\n        />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPreviousPage}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageNonSurfaceWaterComponent = withFormik({\r\n  mapPropsToValues(props) {\r\n    const valuesObject = {\r\n      problemId: props.problemId,\r\n      goToNextPage: props.goToNextPage,\r\n      uploadedFiles: props.uploadedFiles || [],\r\n    };\r\n\r\n    // add fields for flooded questions\r\n    // element.id matches prop name and form field id\r\n    props.floodedQuestions.forEach((element) => {\r\n      valuesObject[element.id] = props[element.id];\r\n    });\r\n\r\n    return valuesObject;\r\n  },\r\n  validationSchema: (props) => {\r\n    const validationObject = {\r\n      problemId: Yup.string().required(\"Please supply details for 'What is the problem?'.\"),\r\n    };\r\n\r\n    if (props.areFloodedQuestionsRequired) {\r\n      props.floodedQuestions.forEach((element) => {\r\n        validationObject[element.id] = Yup.number().required(`Please supply details for '${element.question}'`);\r\n      });\r\n    }\r\n\r\n    return Yup.object().shape(validationObject);\r\n  },\r\n  handleSubmit(bag) {\r\n    bag.goToNextPage();\r\n  },\r\n})(ProblemPageNonSurfaceWaterForm);\r\n\r\nProblemPageNonSurfaceWaterComponent.propTypes = {\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  goToPreviousPage: PropTypes.func.isRequired,\r\n  onProblemChange: PropTypes.func.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array.isRequired,\r\n  problemWithId: PropTypes.string.isRequired,\r\n  problemId: PropTypes.string,\r\n  waterAndDrainageTypes: PropTypes.array.isRequired,\r\n  floodedQuestions: PropTypes.array.isRequired,\r\n  onFloodedQuestionChange: PropTypes.func.isRequired,\r\n  areFloodedQuestionsRequired: PropTypes.bool,\r\n  waterDangerToUser: PropTypes.string,\r\n  riskOfInternalFlooding: PropTypes.string,\r\n};\r\n\r\nexport default ProblemPageNonSurfaceWaterComponent;\r\nexport { ProblemPageNonSurfaceWaterForm };\r\n","import React, { useReducer, useEffect, useCallback, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport {\r\n  getTOIDFromPoint,\r\n  getPostcodeFromPointAsync,\r\n  getStreetFromPoint,\r\n  getUSRNFromPoint,\r\n  getWardFromPoint,\r\n  getParishFromPointAsync,\r\n} from '../../common/components/map-components/esri-location.service';\r\nimport FormConfiguration from './form-config';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { getUnadoptedRoadsFeatureOptions } from '../helpers/unadopted-layer.helper';\r\n\r\nimport {\r\n  ContinueFormOrReRoute,\r\n  IncidentFormContainer,\r\n  IncidentService,\r\n  apiMyAccountUrl,\r\n  clientMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n  waterAndDrainageTypeSettingsNames,\r\n  isEnabled,\r\n  UnadoptedLayerFlag,\r\n  MissingAssetsFlag,\r\n} from 'common';\r\n\r\n// Pages\r\nimport { ConfirmationPage, EntryPage, SummaryPage, LocationPage } from '../components-shared';\r\nimport ProblemWithPage from './components/problem-with-page.component';\r\nimport ProblemPageSurfaceWater from './components/problem-page-surface-water.component';\r\nimport ProblemPageNonSurfaceWater from './components/problem-page-non-surface-water.component';\r\nimport SignInContainer from 'sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\n\r\nconst WaterAndDrainageProblemsApp = () => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const formData = state.formData;\r\n  const getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.WATER_AND_DRAINAGE_PROBLEMS}`;\r\n  const gullyId = formConfig.getTypeId(waterAndDrainageTypeSettingsNames.gully);\r\n  const waterAndDrainageTypes = Object.values(formConfig.waterAndDrainageTypes);\r\n  const surfaceWaterQuestions = Object.values(formConfig.surfaceWaterQuestions);\r\n  const floodedQuestions = [\r\n    formConfig.surfaceWaterQuestions.waterDangerToUser,\r\n    formConfig.surfaceWaterQuestions.riskOfInternalFlooding,\r\n  ];\r\n  const surfaceWaterId = formConfig.getTypeId(waterAndDrainageTypeSettingsNames.surfaceWater);\r\n  const isGullySelected = () => formData.waterDrainageTypeId === gullyId;\r\n  const isSurfaceWaterSelected = () => formData.waterDrainageTypeId === surfaceWaterId;\r\n\r\n  // Updates the header based on location\r\n  const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n  useEffect(() => {\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: { [fieldNames.currentStep]: indexOfStep, [fieldNames.pageHeaderText]: header },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, indexOfStep]);\r\n\r\n  // ----ENTRY PAGE -----\r\n  const handleResetForm = useCallback(\r\n    () => dispatch({ type: actions.resetForm, payload: initState }),\r\n    [dispatch, initState]\r\n  );\r\n\r\n  // ----- PROBLEM PAGE -----\r\n  const handleProblemWithChange = (newProblemWithId) => {\r\n    // reset surfaceWaterQuestions (in case they're not present on new type)\r\n    surfaceWaterQuestions.forEach((question) => {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames[question.id]]: undefined } });\r\n    });\r\n    // reset problemId (in case it is not present on new type, otherwise validation will not trigger)\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: undefined } });\r\n    // If the selection changes to 'Gully' we want to reset the map\r\n    // as the user might think they have aready selected it due to the\r\n    // red circle marking previously selected location\r\n    if (newProblemWithId === gullyId) {\r\n      dispatch({ type: actions.resetLocation });\r\n      dispatch({\r\n        type: actions.updateFormDataFields,\r\n        payload: { [fieldNames.gullyType]: null, [fieldNames.gullyNumber]: null },\r\n      });\r\n    }\r\n    // If they have selected non gully but are coming from gully, reset to avoid markers\r\n    if (formData.waterDrainageTypeId === gullyId && newProblemWithId !== gullyId) {\r\n      dispatch({ type: actions.resetLocation });\r\n    }\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: { [fieldNames.waterDrainageTypeId]: newProblemWithId },\r\n    });\r\n  };\r\n\r\n  // ---- LOCATION PAGE ------\r\n  // We're using custom mapIncidentDetailsToAttributes builder here\r\n  // There is a default available if you don't need custom fields\r\n  // See: DogAndLitterBins form app\r\n  const customMapIncidentDetailsToAttributes = (incident) => {\r\n    const type = waterAndDrainageTypes.find((type) => type.id === incident.waterDrainageTypeId.toString());\r\n    const categories = type && type.categories;\r\n    const category = categories && Object.values(categories).find((cat) => cat.id === incident.categoryId);\r\n    return {\r\n      incidentId: incident.incidentId,\r\n      featureType: type !== undefined ? type.displayName : incident.waterDrainageType,\r\n      faultType: category !== undefined ? category.displayName : incident.category,\r\n      createdTime: new Date(incident.createdTime).toLocaleString('en-GB'),\r\n    };\r\n  };\r\n  const getIncidentLayerOptions = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFeatureType();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addCreatedTime();\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: customMapIncidentDetailsToAttributes,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Feature type', data: 'featureType' },\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.getBuilderResult(),\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  const getFeatureLayerOptions = () => {\r\n    let featureLayer = [];\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(UnadoptedLayerFlag))) {\r\n      featureLayer.push(getUnadoptedRoadsFeatureOptions());\r\n    }\r\n    if (isGullySelected() === true) {\r\n      featureLayer.push({\r\n        layerUrl: formConfig.mapFeatureLayerUrl,\r\n        layerId: formConfig.mapFeatureLayerId,\r\n        popupTemplate: popupTemplateBuilder({\r\n          mapIncidentLayerTitle: formConfig.mapFeatureLayerTitle,\r\n          tableDataArray: [\r\n            { header: 'Gully No', data: 'OBJECTID' },\r\n            { header: 'Type', data: 'TYPE' },\r\n            { header: 'Item ID', data: 'ITEM_ID' }\r\n          ],\r\n        }),\r\n      });\r\n    }\r\n    return featureLayer;\r\n  };\r\n\r\n  const getMissingAssetOptions = () => {\r\n    if (isGullySelected() && isEnabled(FeatureFlagsService.getFeatureFlagByName(MissingAssetsFlag))) {\r\n      return {\r\n        checked: state.missingAssetChecked,\r\n        label: formConfig.missingAssetCheckBoxLabel,\r\n        handleSwitch: () => {\r\n          dispatch({\r\n            type: actions.updateStateFields,\r\n            payload: { [fieldNames.missingAssetChecked]: !state.missingAssetChecked },\r\n          });\r\n        },\r\n        onUploadFiles: (files) => dispatch({ type: actions.updateUploadFiles, payload: files }),\r\n        onRemoveFile: (index) => dispatch({ type: actions.removeUploadedFile, payload: index }),\r\n        uploadedFiles: formData.uploadedFiles,\r\n      };\r\n    }\r\n  };\r\n\r\n  const handleFeatureClicked = async (e) => {\r\n    const toid = await getTOIDFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const postcode = await getPostcodeFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const street = await getStreetFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const usrn = await getUSRNFromPoint(street);\r\n    const ward = await getWardFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const parish = await getParishFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n\r\n    // Start Debug\r\n    const itemId = e.feature.attributes.Item_Id;\r\n    console.log('Feature ItemID: ', itemId);\r\n    // End Debug\r\n\r\n    const locationObject = {\r\n      easting: e.feature.geometry.x.toString(),\r\n      northing: e.feature.geometry.y.toString(),\r\n      street,\r\n      usrn: usrn ? usrn.toString() : null,\r\n      ward,\r\n      parish,\r\n      assetId: e.feature.attributes.Item_Id,\r\n      filter: `Item_Id=${e.feature.attributes.Item_Id}`,\r\n      toid,\r\n      postcode,\r\n    };\r\n\r\n    dispatch({ type: actions.updateLocationObject, payload: locationObject });\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: {\r\n        [fieldNames.gullyType]: e.feature.attributes.TYPE,\r\n        [fieldNames.gullyNumber]: e.feature.attributes.OBJECTID,\r\n      },\r\n    });\r\n  };\r\n\r\n  const getLocationSelectText = () => {\r\n    if (isGullySelected())\r\n      return (\r\n        <>\r\n          Search the map by postcode, street name, or your current location, to view nearby gullies.\r\n          <br />\r\n          Use the <span aria-hidden=\"true\" className=\"esri-icon esri-icon-locate\"></span> icon to report a problem at\r\n          your current location.\r\n          <br />\r\n          Select the gully by clicking the icon on the map.\r\n          <br />\r\n          Select a reported problem to view details.\r\n        </>\r\n      );\r\n  };\r\n\r\n  const incidentExistsCheck = async (e) => {\r\n    const serviceResult = await IncidentService.assetHasLiveIncident({\r\n      assetId: e.feature.attributes.Item_Id,\r\n      productId: formConfig.productId,\r\n    });\r\n    return serviceResult;\r\n  };\r\n  // --- PROBLEM PAGE ---\r\n  const areFloodedQuestionsRequired = () => {\r\n    const type = waterAndDrainageTypes.find((type) => type.id === formData.waterDrainageTypeId);\r\n    const floodedId = type && type.categories.flooded && type.categories.flooded.id;\r\n    return formData.problemId !== '' && floodedId === formData.problemId;\r\n  };\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const selectedType = waterAndDrainageTypes.find((type) => type.id === formData.waterDrainageTypeId);\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'Problem is with?',\r\n        columnTwo: selectedType && selectedType.displayName,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'typeOfTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    const surfaceWaterQuestionsTable = [];\r\n    surfaceWaterQuestions.forEach((question) => {\r\n      if (formData[question.id]) {\r\n        surfaceWaterQuestionsTable.push({\r\n          columnOne: formConfig.sumaryQuestionNames[question.id],\r\n          columnTwo: formConfig.surfaceWaterQuestions[question.id].radioOptions.find(\r\n            (option) => option.id.toString() === formData[question.id]\r\n          ).value,\r\n          onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, question.id),\r\n          columnTwoClassName: 'sentence-case',\r\n        });\r\n      }\r\n    });\r\n\r\n    tableData.splice(3, 0, ...surfaceWaterQuestionsTable);\r\n\r\n    if (!isSurfaceWaterSelected()) {\r\n      const category =\r\n        selectedType && Object.values(selectedType.categories).find((category) => category.id === formData.problemId);\r\n      const categoryDisplayName = category && category.displayName;\r\n      tableData.splice(3, 0, {\r\n        columnOne: 'About the problem',\r\n        columnTwo: categoryDisplayName,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...formData };\r\n    form.productId = state.missingAssetChecked ? formConfig.missingAssetProductId : formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    // if surface water has been chosen, we need to set category id\r\n    // as it's expected in BUI yet we're not setting it anywhere else\r\n    if (formData.waterDrainageTypeId === surfaceWaterId) {\r\n      const surfaceWaterType = waterAndDrainageTypes.find((type) => type.id === surfaceWaterId);\r\n      const categories = surfaceWaterType && surfaceWaterType.categories;\r\n      // there is only one category for the surface water\r\n      const categoryId = categories && categories[0].id;\r\n      form.problemId = categoryId;\r\n    }\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await IncidentService.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await IncidentService.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.waterAndDrainageProblems.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={formConfig.whatToReportText}\r\n              informationArray={formConfig.beforeYouBeginText}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () => {\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                  });\r\n                })\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemWithPage\r\n                goToNextPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPreviousPage={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                problemWithId={formData.waterDrainageTypeId}\r\n                onProblemWithChange={handleProblemWithChange}\r\n                types={waterAndDrainageTypes}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPage\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                // currently selected location object\r\n                locationObject={formData.locationObject}\r\n                // boolean => is location selected?\r\n                locationSelected={formData.locationSelected}\r\n                // on map click\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                // is map click allowed?\r\n                disableFreeSelect={isGullySelected() ? true : false}\r\n                incidentLayerOptions={getIncidentLayerOptions()}\r\n                featureLayerOptions={getFeatureLayerOptions()}\r\n                // on asset click\r\n                handleFeatureClicked={handleFeatureClicked}\r\n                // used to reset location when clicking on a new incident/asset\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                // text above the map with instructions on what to select\r\n                locationSelectText={getLocationSelectText()}\r\n                // content of additionalInformation form field\r\n                additionalInformation={formData.additionalInformation}\r\n                // checks if a given object has an incident logged, marks it as invalid selection\r\n                incidentExistsCheck={incidentExistsCheck}\r\n                // message to display when the above returned a result (required when incidentExistsCheck set)\r\n                incidentExistsAlertMessage=\"This feature already has an incident reported and can therefore not have another.\"\r\n                // custom error message when no location/asset selected\r\n                locationSelectedValidationText={isGullySelected() ? 'Please select an asset on the map.' : undefined}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n                // missing assets options\r\n                missingAssetsOptions={getMissingAssetOptions()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              {isSurfaceWaterSelected() ? (\r\n                <ProblemPageSurfaceWater\r\n                  goToNextPage={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                  goToPreviousPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                  onSurfaceWaterQuestionChange={(questionId, value) =>\r\n                    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames[questionId]]: value } })\r\n                  }\r\n                  surfaceWaterQuestions={surfaceWaterQuestions}\r\n                  onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                  onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                  uploadedFiles={formData.uploadedFiles}\r\n                  hasItRained={formData.hasItRained}\r\n                  waterDangerToUser={formData.waterDangerToUser}\r\n                  riskOfInternalFlooding={formData.riskOfInternalFlooding}\r\n                  reocurringProblem={formData.reocurringProblem}\r\n                />\r\n              ) : (\r\n                <ProblemPageNonSurfaceWater\r\n                  goToNextPage={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                  goToPreviousPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                  onProblemChange={(value) => {\r\n                    // reset surface water questions\r\n                    floodedQuestions.forEach((question) => {\r\n                      dispatch({\r\n                        type: actions.updateFormDataFields,\r\n                        payload: { [fieldNames[question.id]]: undefined },\r\n                      });\r\n                    });\r\n                    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } });\r\n                  }}\r\n                  onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                  onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                  uploadedFiles={formData.uploadedFiles}\r\n                  problemWithId={formData.waterDrainageTypeId}\r\n                  problemId={formData.problemId}\r\n                  waterAndDrainageTypes={waterAndDrainageTypes}\r\n                  floodedQuestions={floodedQuestions}\r\n                  areFloodedQuestionsRequired={areFloodedQuestionsRequired()}\r\n                  onFloodedQuestionChange={(questionId, value) =>\r\n                    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames[questionId]]: value } })\r\n                  }\r\n                  waterDangerToUser={formData.waterDangerToUser}\r\n                  riskOfInternalFlooding={formData.riskOfInternalFlooding}\r\n                />\r\n              )}\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step4}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPage\r\n                goToProblemPage={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => formConfig.userIsLoggedIn()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default WaterAndDrainageProblemsApp;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nimport { clientMyAccountUrl, processCategoryIdsSettingName } from '../../common';\r\nimport { mapConstants } from '../../common/constants/map.constants';\r\n\r\nexport default class FormConfiguration {\r\n  baseUrl = clientMyAccountUrl.dogAndLitterBin;\r\n  documentTitle = 'My Account - Report a dog waste and litter bin problem';\r\n  dogAndLitterBinsFeatureLayerId = 'dogAndLitterBinsFeatures';\r\n  dogAndLitterBinsFeatureLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/14';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  mapIncidentLayerId = 'dogAndLitterBinIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  pageHeaderText = 'Report a dog waste and litter bin problem';\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n  subject = 'Dog/litter bins';\r\n  totalSteps = 4;\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  missingAssetCheckBoxLabel = \"I can't find the bin on the map\";\r\n\r\n  // Entry page constants\r\n  whatToReportText = {\r\n    text: 'problems with dog waste and litter bins',\r\n    url: 'https://www.york.gov.uk/ReportDogWasteAndLitterBins',\r\n  };\r\n\r\n  beforeYouBeginText = [\r\n    {\r\n      text: 'which dog waste and litter bin problems we can help with ',\r\n      url: 'https://www.york.gov.uk/ReportDogWasteAndLitterBins#problemswecanhelpwith',\r\n    },\r\n    {\r\n      text: 'our dog and litter bin response times',\r\n      url: 'https://www.york.gov.uk/ReportDogWasteAndLitterBins#responsetimes',\r\n    },\r\n  ];\r\n\r\n  // Values from configuration service\r\n  binTypes = [];\r\n  binNames = [];\r\n  categories = [];\r\n  productId;\r\n\r\n  constructor() {\r\n    const { productId, categoryIds, binTypes, binNames, missingAssetProductId } =\r\n      ConfigurationService.getEnvironmentSettingByName(processCategoryIdsSettingName.dogAndLitterBins);\r\n\r\n    this.productId = productId;\r\n    this.missingAssetProductId = missingAssetProductId;\r\n    this.categories = Object.values(categoryIds);\r\n    this.binTypes = binTypes;\r\n    this.binNames = binNames;\r\n  }\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n}\r\n\r\nexport const testName = 'DogBins';\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n  InputErrorComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  FileInputComponent,\r\n  ErrorLabelHandlerComponent,\r\n  OffensiveGraffitiInputComponent,\r\n  setInitialPosition,\r\n} from '../../../common';\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  errors,\r\n  values,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  possibleProblems,\r\n  isGraffiti,\r\n  onOffensiveGraffitiChange,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && <ErrorBoxComponent errors={errors}></ErrorBoxComponent>}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us what needs cleaning up.</p>\r\n        <div>\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"What is the problem\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={values.problemId}\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                setFieldValue('offensiveGraffiti', undefined);\r\n                onProblemTypeChange(e);\r\n              }}\r\n              options={possibleProblems.map((problem) => ({\r\n                value: problem.id,\r\n                label: problem.displayName,\r\n              }))}\r\n              error={errors.problemId && touched.problemId}\r\n            />\r\n            {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n          </span>\r\n        </div>\r\n        {isGraffiti === true ? (\r\n          <OffensiveGraffitiInputComponent\r\n            offensiveGraffiti={values.offensiveGraffiti}\r\n            onOffensiveGraffitiChange={(value) => {\r\n              setFieldValue('offensiveGraffiti', value);\r\n              onOffensiveGraffitiChange && onOffensiveGraffitiChange(value);\r\n            }}\r\n            errors={errors}\r\n            touched={touched}\r\n            submitCount={submitCount}\r\n          />\r\n        ) : (\r\n          <React.Fragment />\r\n        )}\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent\r\n          uploadedFiles={uploadedFiles}\r\n          onUploadFiles={onUploadFiles}\r\n          onRemoveFile={onRemoveFile}\r\n        />\r\n\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, goToNext, offensiveGraffiti }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      offensiveGraffiti,\r\n      goToNext,\r\n    };\r\n  },\r\n  validationSchema: (props) =>\r\n    Yup.object().shape({\r\n      problemId: Yup.string().required(\"Please supply details for 'What is the problem'.\"),\r\n      offensiveGraffiti: Yup.bool().when('problemId', {\r\n        is: () => props.isGraffiti === true,\r\n        then: Yup.bool().required(\"Please supply details for 'Is the graffiti offensive?'.\"),\r\n      }),\r\n    }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n  isGraffiti: PropTypes.bool.isRequired,\r\n  offensiveGraffiti: PropTypes.bool,\r\n  onOffensiveGraffitiChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useEffect, useReducer, useCallback, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\nimport FormConfiguration from './form-config';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport {\r\n  IncidentFormContainer,\r\n  ContinueFormOrReRoute,\r\n  apiMyAccountUrl,\r\n  apiSettingName,\r\n  clientMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n  isEnabled,\r\n  MissingAssetsFlag,\r\n} from 'common';\r\nimport * as Services from 'common/services/incident.service';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport {\r\n  getTOIDFromPoint,\r\n  getPostcodeFromPointAsync,\r\n  getUSRNFromPoint,\r\n  getParishFromPointAsync,\r\n  getStreetFromPoint,\r\n  getWardFromPoint,\r\n} from 'common/components/map-components/esri-location.service';\r\n\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPageComponent from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from 'sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\n\r\nconst DogAndLitterBins = (props) => {\r\n  let location = useLocation();\r\n  let navigate = useNavigate();\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const getIncidentsUrl = `${ConfigurationService.getEnvironmentSettingByName(apiSettingName)}${\r\n    apiMyAccountUrl.getIncidents.DOG_AND_LITTER_BINS\r\n  }`;\r\n  const possibleProblems = formConfig.categories;\r\n\r\n  // Change the header text on certain steps\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: {\r\n        [fieldNames.currentStep]: indexOfStep,\r\n        [fieldNames.pageHeaderText]: header,\r\n      },\r\n    });\r\n  }, [dispatch, location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // ---- ENTRY PAGE ------\r\n  const handleResetForm = useCallback(\r\n    () =>\r\n      dispatch({\r\n        type: actions.resetForm,\r\n        payload: initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n      }),\r\n    [dispatch, formConfig.pageHeaderText]\r\n  );\r\n\r\n  // ---- LOCATION PAGE ------\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addIncidentReferenceNumber();\r\n    fieldsBuilder.addCreatedTime();\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.getBuilderResult(),\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  const featureLayerOptionsBuilder = () => {\r\n    return [\r\n      {\r\n        layerUrl: formConfig.dogAndLitterBinsFeatureLayerUrl,\r\n        layerId: formConfig.dogAndLitterBinsFeatureLayerId,\r\n        popupTemplate: popupTemplateBuilder({\r\n          mapIncidentLayerTitle: 'Selected litter bin',\r\n          tableDataArray: [\r\n            { header: 'Bin Type', data: 'BINTYPE' },\r\n            { header: 'Location', data: 'LOCATION' },\r\n            { header: 'Road name', data: 'STREET' },\r\n            { header: 'Ward', data: 'WARD' },\r\n            { header: 'Item ID', data: 'ITEM_ID' }\r\n          ],\r\n        }),\r\n      },\r\n    ];\r\n  };\r\n\r\n  const handleFeatureClicked = async (e) => {\r\n    const toid = getTOIDFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const street = await getStreetFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const ward = await getWardFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const postcode = getPostcodeFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const usrn = getUSRNFromPoint(e.feature.attributes.Street);\r\n    const parish = getParishFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const [toidValue, postcodeValue, usrnValue, parishValue] = await Promise.all([toid, postcode, usrn, parish]);\r\n\r\n    // Start Debug\r\n    const itemId = e.feature.attributes.Item_Id;\r\n    console.log('Feature ItemID: ', itemId);\r\n    // End Debug\r\n\r\n    // data from location service is more reliable so we try to use that where possible\r\n    // if some of the information is not available, we fall back to the asset layer\r\n    const locationObject = {\r\n      easting: e.feature.geometry.x.toString(),\r\n      northing: e.feature.geometry.y.toString(),\r\n      street: street ? street : e.feature.attributes.Street,\r\n      location: e.feature.attributes.Location,\r\n      toid: toidValue,\r\n      postcode: postcodeValue,\r\n      usrn: usrnValue ? usrnValue.toString() : null,\r\n      ward: ward ? ward : e.feature.attributes.Ward,\r\n      parish: parishValue,\r\n      assetId: e.feature.attributes.Item_Id,\r\n      filter: `Item_Id=${e.feature.attributes.Item_Id}`,\r\n    };\r\n    // Note: Map Server now returns the bin type description in BinType property so match on bin type displayName.\r\n    const binType = Object.values(formConfig.binTypes).find((bin) => bin.displayName.toLowerCase() === e.feature.attributes.BinType.toLowerCase());\r\n    const binTypeId = binType && binType.id;\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: {\r\n        [fieldNames.binTypeId]: binTypeId,\r\n      },\r\n    });\r\n    dispatch({ type: actions.updateLocationObject, payload: locationObject });\r\n  };\r\n\r\n  const getMissingAssetOptions = () => {\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(MissingAssetsFlag))) {\r\n      return {\r\n        checked: state.missingAssetChecked,\r\n        label: formConfig.missingAssetCheckBoxLabel,\r\n        handleSwitch: () => {\r\n          dispatch({\r\n            type: actions.updateStateFields,\r\n            payload: { [fieldNames.missingAssetChecked]: !state.missingAssetChecked },\r\n          });\r\n        },\r\n        onUploadFiles: (files) => dispatch({ type: actions.updateUploadFiles, payload: files }),\r\n        onRemoveFile: (index) => dispatch({ type: actions.removeUploadedFile, payload: index }),\r\n        uploadedFiles: state.formData.uploadedFiles,\r\n        useUnadoptedLayer: false,\r\n      };\r\n    }\r\n  };\r\n\r\n  const locationSelectText = (\r\n    <>\r\n      Search the map by postcode, street name, or your current location, to view nearby dog waste and litter bins.\r\n      <br />\r\n      Use the <span aria-hidden=\"true\" className=\"esri-icon esri-icon-locate\"></span> icon to report a problem at your\r\n      current location.\r\n      <br />\r\n      Select the dog waste and litter bin by clicking on the icon on the map.\r\n      <br />\r\n      Select a reported problem to view details.\r\n    </>\r\n  );\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const formData = state.formData;\r\n    const problem = possibleProblems.find((val) => val.id === formData.problemId);\r\n    const binDescription =\r\n      formData.binTypeId && Object.values(formConfig.binTypes).find((bin) => bin.id === formData.binTypeId).displayName;\r\n\r\n    const locationColumn = {\r\n      columnOne: 'Location',\r\n      columnTwo:\r\n        formData.locationObject && formData.locationObject.location && formData.locationObject.location.length > 0\r\n          ? formData.locationObject.location\r\n          : 'Selected on map',\r\n      onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n    };\r\n\r\n    const additionalLocationInformationColumn = {\r\n      columnOne: 'Additional location information',\r\n      columnTwo: formData.additionalInformation,\r\n      onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'additionalInformation'),\r\n    };\r\n\r\n    const streetColumn = {\r\n      columnOne: 'Street',\r\n      columnTwo:\r\n        formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n          ? formData.locationObject.streetName\r\n          : 'Selected on map',\r\n      onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n    };\r\n\r\n    const binTypeColumn = {\r\n      columnOne: 'Bin type',\r\n      columnTwo: binDescription ? binDescription : 'Not available',\r\n      onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'location'),\r\n      columnTwoClassName: 'sentence-case',\r\n    };\r\n\r\n    const whatIsTheProblemColumn = {\r\n      columnOne: 'What is the problem?',\r\n      columnTwo: problem && problem.displayName ? problem.displayName : null,\r\n      onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'whatIsTheProblem'),\r\n      columnTwoClassName: 'sentence-case',\r\n    };\r\n\r\n    const uploadPhotoColumn = {\r\n      columnOne: 'Upload a photo',\r\n      columnTwo: formData.uploadedFiles ? (\r\n        <ul className=\"uploaded-photos\">\r\n          {formData.uploadedFiles.map((file, index) => (\r\n            <li key={index}>{file.fileName}</li>\r\n          ))}\r\n        </ul>\r\n      ) : (\r\n        <React.Fragment />\r\n      ),\r\n      onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'uploadPhoto'),\r\n    };\r\n\r\n    const tableData = state.missingAssetChecked\r\n      ? [locationColumn, additionalLocationInformationColumn, whatIsTheProblemColumn, uploadPhotoColumn]\r\n      : [\r\n          locationColumn,\r\n          additionalLocationInformationColumn,\r\n          streetColumn,\r\n          binTypeColumn,\r\n          whatIsTheProblemColumn,\r\n          uploadPhotoColumn,\r\n        ];\r\n\r\n    // Only show the \"Offensive graffiti\" response if there is a value\r\n    if (formData.offensiveGraffiti !== undefined) {\r\n      tableData.splice(state.missingAssetChecked ? 3 : 5, 0, {\r\n        columnOne: 'Is the graffiti offensive?',\r\n        columnTwo: formData.offensiveGraffiti === true ? 'Yes' : 'No',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'isGraffitiOffensive'),\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...state.formData };\r\n    form.productId = state.missingAssetChecked ? formConfig.missingAssetProductId : formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    const problemType = possibleProblems.find((problem) => problem.id === form.problemId);\r\n    if (problemType.alternative) {\r\n      form = { ...form, ...problemType.alternative };\r\n    }\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // This code was breaking after router V6 changes\r\n  // useEffect(() => {\r\n  //   if (state.formCompleted) {\r\n  //     changeUrlByStepNumberv6(4, formConfig, navigate);\r\n  //   }\r\n  // }, [state.formCompleted, navigate, formConfig]);\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  const handleProblemTypeChange = (value) => {\r\n    const problemType = possibleProblems.find((problem) => problem.id === value);\r\n    if (problemType.alternative === undefined) {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.isAlternative]: false } });\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.offensiveGraffiti]: undefined } });\r\n    } else {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.isAlternative]: true } });\r\n    }\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } });\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  const locationPageIncidentLayerOptions = layerOptionsBuilder();\r\n  const featureLayerOptions = featureLayerOptionsBuilder();\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.dogAndLitterBin.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={formConfig.whatToReportText}\r\n              informationArray={formConfig.beforeYouBeginText}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: false },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPageComponent\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                incidentLayerOptions={locationPageIncidentLayerOptions}\r\n                featureLayerOptions={featureLayerOptions}\r\n                handleFeatureClicked={handleFeatureClicked}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                clearSelectedPoint={() => {\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: {\r\n                      [fieldNames.binTypeId]: undefined,\r\n                    },\r\n                  });\r\n                  dispatch({ type: actions.resetLocation });\r\n                }}\r\n                disableFreeSelect={true}\r\n                locationSelectText={locationSelectText}\r\n                additionalInformation={state.formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n                missingAssetsOptions={getMissingAssetOptions()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                problemId={state.formData.problemId}\r\n                onProblemTypeChange={handleProblemTypeChange}\r\n                isGraffiti={state.formData.isAlternative}\r\n                offensiveGraffiti={state.formData.offensiveGraffiti}\r\n                onOffensiveGraffitiChange={(isOffensive) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.offensiveGraffiti]: isOffensive },\r\n                  })\r\n                }\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                possibleProblems={possibleProblems}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPageComponent\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default DogAndLitterBins;\r\n","import { ConfigurationService } from 'cyc-configuration-service';\r\nimport { CYCServices } from 'cyc-services';\r\n\r\nimport { clientMyAccountUrl, apiMyAccountUrl, streetFurnitureSettingName, graffitiSettingName } from '../../common';\r\nimport { mapConstants } from '../../common/constants/map.constants';\r\n\r\nexport default class FormConfiguration {\r\n  testName = 'Street furniture';\r\n  totalSteps = 5;\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  pageHeaderText = 'Report a street furniture problem';\r\n  documentTitle = 'My Account - Report a street furniture problem';\r\n  subject = 'Street furniture problem';\r\n\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  mapIncidentLayerId = 'streetFurnitureIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n\r\n  getGraffitiSettings = () => {\r\n    return ConfigurationService.getEnvironmentSettingByName(graffitiSettingName);\r\n  };\r\n\r\n  getProblemTypes = () => {\r\n    return Object.entries(ConfigurationService.getDrillDownSettingValue([streetFurnitureSettingName, 'types'])).map(\r\n      (type) => type[1]\r\n    );\r\n  };\r\n\r\n  getProductId = () => {\r\n    return ConfigurationService.getDrillDownSettingValue([streetFurnitureSettingName, 'productId']);\r\n  };\r\n\r\n  getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.STREET_FURNITURE}`;\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  baseUrl = clientMyAccountUrl.streetFurniture;\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.step4}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageForm = (props) => {\r\n  const errorBox = React.createRef();\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <Form>\r\n      <div ref={errorBox}></div>\r\n      {Object.keys(props.errors).length > 0 && props.touched.problemId && (\r\n        <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n      )}\r\n\r\n      <h2 id=\"aboutTheProblem\">About the problem</h2>\r\n\r\n      <div className=\"row\">\r\n        <span>\r\n          <ErrorLabelHandlerComponent\r\n            touched={props.touched}\r\n            errors={props.errors}\r\n            text=\"What is the problem\"\r\n            id=\"problemId\"\r\n            submitCount={props.submitCount}\r\n          />\r\n          <RadiobuttonInputComponent\r\n            name=\"problemId\"\r\n            value={props.values.problemId}\r\n            onChange={(e) => {\r\n              props.setFieldValue('problemId', e);\r\n              props.onProblemTypeChange(e);\r\n            }}\r\n            error={props.errors.problemId && props.touched.problemId}\r\n            options={props.possibleProblems.map((problem) => ({\r\n              label: problem.displayName,\r\n              value: problem.id,\r\n            }))}\r\n          />\r\n          {props.errors.problemId && props.touched.problemId && (\r\n            <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n          )}\r\n        </span>\r\n      </div>\r\n\r\n      <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n        Next\r\n      </ButtonComponent>\r\n      <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n        Previous\r\n      </ButtonComponent>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, goToNext }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    problemId: Yup.string().required(\"Please supply details for 'What is the problem'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPageForm);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  ErrorBoxComponent,\r\n  FileInputComponent,\r\n  ErrorLabelHandlerComponent,\r\n  setInitialPosition,\r\n  OffensiveGraffitiInputComponent,\r\n} from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPageForm = (props) => {\r\n  const errorBox = React.createRef();\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <Form>\r\n      <div ref={errorBox}></div>\r\n      {Object.keys(props.errors).length > 0 && props.touched.problemId && (\r\n        <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n      )}\r\n\r\n      <h2 id=\"whatIsTheProblem\">About the problem</h2>\r\n      <p>What is the problem?</p>\r\n\r\n      <div className=\"row\">\r\n        <span>\r\n          <ErrorLabelHandlerComponent\r\n            touched={props.touched}\r\n            errors={props.errors}\r\n            text=\"What is the problem\"\r\n            id=\"problemId\"\r\n            submitCount={props.submitCount}\r\n          />\r\n          <RadiobuttonInputComponent\r\n            name=\"problemId\"\r\n            value={props.values.problemId}\r\n            onChange={(e) => {\r\n              props.setFieldValue('problemId', e);\r\n              props.setFieldValue('offensiveGraffiti', '');\r\n              props.onProblemTypeChange(\r\n                e,\r\n                props.possibleProblems.find((x) => x.id === e)\r\n              );\r\n            }}\r\n            error={props.errors.problemId && props.touched.problemId}\r\n            options={props.possibleProblems.map((problem) => ({\r\n              label: problem.displayName,\r\n              value: problem.id,\r\n            }))}\r\n          />\r\n          {props.errors.problemId && props.touched.problemId && (\r\n            <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n          )}\r\n        </span>\r\n      </div>\r\n\r\n      {props.isGraffiti === 'true' ? (\r\n        <OffensiveGraffitiInputComponent\r\n          offensiveGraffiti={props.offensiveGraffiti}\r\n          onOffensiveGraffitiChange={(value) => {\r\n            props.setFieldValue('offensiveGraffiti', value);\r\n            props.onOffensiveGraffitiChange(value);\r\n          }}\r\n          errors={props.errors}\r\n          touched={props.touched}\r\n          submitCount={props.submitCount}\r\n        />\r\n      ) : (\r\n        <React.Fragment />\r\n      )}\r\n\r\n      <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n        Upload a photo\r\n      </h2>\r\n\r\n      <FileInputComponent\r\n        uploadedFiles={props.uploadedFiles}\r\n        onUploadFiles={props.onUploadFiles}\r\n        onRemoveFile={props.onRemoveFile}\r\n      />\r\n\r\n      <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n        Next\r\n      </ButtonComponent>\r\n      <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n        Previous\r\n      </ButtonComponent>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst ProblemPageAfterLocationComponent = withFormik({\r\n  mapPropsToValues({ problemId, offensiveGraffiti, goToNext }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      offensiveGraffiti,\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: (props) =>\r\n    Yup.object().shape({\r\n      problemId: Yup.string().required(\"Please supply details for 'What is the problem'.\"),\r\n      offensiveGraffiti: Yup.string().when('problemId', {\r\n        is: () => props.isGraffiti === 'true',\r\n        then: Yup.string().required(\"Please supply details for 'Is the graffiti offensive?'.\"),\r\n      }),\r\n    }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPageForm);\r\n\r\nProblemPageAfterLocationComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n};\r\n\r\nexport default ProblemPageAfterLocationComponent;\r\n","import React, { useEffect, useReducer, useCallback, useMemo } from 'react';\r\nimport { Routes, Route, useLocation, useNavigate } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport FormConfiguration from './form-config';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport {\r\n  IncidentFormContainer,\r\n  ContinueFormOrReRoute,\r\n  clientMyAccountUrl,\r\n  changeUrlByStepNumberv6,\r\n  UnadoptedLayerFlag,\r\n  isEnabled,\r\n} from '../../common';\r\nimport * as Services from '../../common/services/incident.service';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component.component';\r\nimport ProblemPageAfterLocationComponent from './components/problem-page-after-location.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPageComponent from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\nimport { getUnadoptedRoadsFeatureOptions } from '../helpers/unadopted-layer.helper';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nconst StreetFurnitureApp = () => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n\r\n  const [state, dispatch] = useReducer(reducer, initialState(initState));\r\n  const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n  const problemTypes = formConfig.getProblemTypes();\r\n\r\n  // Change the header text on certain steps\r\n  useEffect(() => {\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: {\r\n        [fieldNames.currentStep]: indexOfStep,\r\n        [fieldNames.pageHeaderText]: header,\r\n      },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, indexOfStep]);\r\n\r\n  // --- HELPERS ---\r\n  const checkAndReturnCategory = (customId = undefined) => {\r\n    try {\r\n      // use the input id if it exists, else go for the states one\r\n      const problemId = customId ? customId : state.formData.problemId;\r\n      const problemWith = problemTypes.find((val) => val.id === state.formData.streetFurnitureTypeId);\r\n      for (let props in problemWith.categories) {\r\n        if (problemWith.categories[props].id === problemId) {\r\n          const category = problemWith.categories[props];\r\n          return category;\r\n        }\r\n      }\r\n    } catch {\r\n      return undefined;\r\n    }\r\n  };\r\n\r\n  // ---- ENTRY PAGE -----\r\n  const handleResetForm = useCallback(\r\n    () =>\r\n      dispatch({\r\n        type: actions.resetForm,\r\n        payload: initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n      }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n\r\n  // ---- LOCATION PAGE ------\r\n  // Build feature Layer options (currently only unadopted roads)\r\n  const getFeatureLayerOptions = () => {\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(UnadoptedLayerFlag))) {\r\n      return [getUnadoptedRoadsFeatureOptions()];\r\n    }\r\n  };\r\n\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addIncidentReferenceNumber();\r\n    fieldsBuilder.addCreatedTime();\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: formConfig.getIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.getBuilderResult(),\r\n    });\r\n    return inc;\r\n  };\r\n\r\n  // --- PROBLEM AFTER LOCATION PAGE ---\r\n\r\n  const possibleProblemsBuilder = () => {\r\n    let arr = [];\r\n    const type = problemTypes.find((val) => val.id === state.formData.streetFurnitureTypeId);\r\n    if (type === undefined) return; // Stops the app crashing when dev tools open if refreshing page\r\n    // set out a list of option objects [{}] based on that particular ID\r\n    for (let props in type.categories) {\r\n      arr.push(type.categories[props]);\r\n    }\r\n    return arr;\r\n  };\r\n\r\n  const handleProblemTypeChange = (id, problem) => {\r\n    const isGraffiti = problemTypes.map((x) => x.categories.graffiti && x.categories.graffiti.id).includes(problem.id);\r\n\r\n    if (isGraffiti) {\r\n      dispatch({\r\n        type: actions.updateFormDataFields,\r\n        payload: { [fieldNames.isAlternative]: 'true' },\r\n      });\r\n    } else {\r\n      dispatch({\r\n        type: actions.updateFormDataFields,\r\n        payload: { [fieldNames.isAlternative]: 'false' },\r\n      });\r\n      dispatch({\r\n        type: actions.updateFormDataFields,\r\n        payload: { [fieldNames.offensiveGraffiti]: undefined },\r\n      });\r\n    }\r\n\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: { [fieldNames.problemId]: id },\r\n    });\r\n  };\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const formData = state.formData;\r\n    const problemWith = problemTypes.find((val) => val.id === formData.streetFurnitureTypeId);\r\n    let category = checkAndReturnCategory();\r\n\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Problem with',\r\n        columnTwo: problemWith && problemWith.displayName ? problemWith.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'aboutTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'About the problem',\r\n        columnTwo: category && category.displayName ? category.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    // Only show the \"Offensive graffiti\" response if there is a value\r\n    if (formData.offensiveGraffiti) {\r\n      tableData.splice(4, 0, {\r\n        columnOne: 'Is the graffiti offensive?',\r\n        columnTwo: formData.offensiveGraffiti === true ? 'Yes' : 'No',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'isGraffitiOffensive'),\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...state.formData };\r\n    form.productId = formConfig.getProductId();\r\n    form.subject = formConfig.subject;\r\n\r\n    if (form.isAlternative === 'true') {\r\n      const graffitiSettings = formConfig.getGraffitiSettings();\r\n      form.productId = graffitiSettings['productId'];\r\n      form.subject = graffitiSettings['subject'];\r\n    }\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.streetFurniture.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={{ text: 'problems with street furniture', url: 'https://www.york.gov.uk/ReportStreetFurniture' }}\r\n              informationArray={[\r\n                {\r\n                  text: 'Problems we can help with',\r\n                  url: 'https://www.york.gov.uk/ReportStreetFurniture#problemswecanhelpwith',\r\n                },\r\n                {\r\n                  text: 'Our street furniture problem response times',\r\n                  url: 'https://www.york.gov.uk/ReportStreetFurniture#responsetimes',\r\n                },\r\n              ]}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, undefined, true, () =>\r\n                  dispatch({ type: actions.updateStateFields, payload: { formStarted: true, formCompleted: false } })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                problemId={state.formData.streetFurnitureTypeId}\r\n                onProblemTypeChange={(value) => {\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.streetFurnitureTypeId]: value },\r\n                  });\r\n                }}\r\n                possibleProblems={problemTypes}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPageComponent\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                incidentLayerOptions={layerOptionsBuilder()}\r\n                featureLayerOptions={getFeatureLayerOptions()}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                additionalInformation={state.formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageAfterLocationComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                problemId={state.formData.problemId}\r\n                onProblemTypeChange={handleProblemTypeChange}\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                possibleProblems={possibleProblemsBuilder()}\r\n                isGraffiti={state.formData.isAlternative}\r\n                offensiveGraffiti={state.formData.offensiveGraffiti}\r\n                onOffensiveGraffitiChange={(isOffensive) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.offensiveGraffiti]: isOffensive },\r\n                  })\r\n                }\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.step4}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPageComponent\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default StreetFurnitureApp;\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst AboutProblemPageForm = (props) => {\r\n  const errorBox = React.createRef();\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <Form>\r\n      <div ref={errorBox}></div>\r\n      {Object.keys(props.errors).length > 0 && props.touched.typeId && (\r\n        <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n      )}\r\n      <h2 id=\"aboutTheProblem\">About the problem</h2>\r\n\r\n      <div className=\"row\">\r\n        <span>\r\n          <ErrorLabelHandlerComponent\r\n            touched={props.touched}\r\n            errors={props.errors}\r\n            text=\"What is the problem?\"\r\n            id=\"typeId\"\r\n            submitCount={props.submitCount}\r\n          />\r\n          <RadiobuttonInputComponent\r\n            name=\"typeId\"\r\n            value={props.values.typeId}\r\n            onChange={(e) => {\r\n              props.setFieldValue('typeId', e);\r\n              props.onSignTypeChange(e);\r\n            }}\r\n            error={props.errors.typeId && props.touched.typeId}\r\n            options={props.possibleSignTypes.map((type) => ({\r\n              label: type.displayName,\r\n              value: type.id,\r\n            }))}\r\n          />\r\n          {props.errors.typeId && props.touched.typeId && (\r\n            <InputErrorComponent>{props.errors.typeId}</InputErrorComponent>\r\n          )}\r\n        </span>\r\n      </div>\r\n\r\n      <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n        Next\r\n      </ButtonComponent>\r\n      <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n        Previous\r\n      </ButtonComponent>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst AboutProblemPageComponent = withFormik({\r\n  mapPropsToValues({ signTypeId, goToNext }) {\r\n    return {\r\n      typeId: signTypeId || '',\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    typeId: Yup.string().required(\"Please supply details for 'What is the problem?'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(AboutProblemPageForm);\r\n\r\nAboutProblemPageComponent.propTypes = {\r\n  signTypeId: PropTypes.string,\r\n  onSignTypeChange: PropTypes.func.isRequired,\r\n  possibleSignTypes: PropTypes.array.isRequired,\r\n  goToPrevious: PropTypes.func,\r\n};\r\n\r\nexport default AboutProblemPageComponent;\r\n","import React, { useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nimport {\r\n  ErrorBoxComponent,\r\n  FileInputComponent,\r\n  ErrorLabelHandlerComponent,\r\n  OffensiveGraffitiInputComponent,\r\n  setInitialPosition,\r\n} from '../../../common';\r\n\r\nimport usePrevious from 'common/hooks/use-previous.hook';\r\n\r\nconst ProblemPage = ({\r\n  isSubmitting,\r\n  isValid,\r\n  errors,\r\n  touched,\r\n  submitCount,\r\n  setFieldValue,\r\n  onProblemTypeChange,\r\n  uploadedFiles,\r\n  onUploadFiles,\r\n  onRemoveFile,\r\n  goToPrevious,\r\n  problemId,\r\n  possibleProblems,\r\n  isGraffiti,\r\n  onOffensiveGraffitiChange,\r\n  offensiveGraffiti,\r\n}) => {\r\n  const previousIsSubmitting = usePrevious(isSubmitting);\r\n  const errorBox = useRef();\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (previousIsSubmitting !== undefined && isSubmitting === true && isValid === false) {\r\n      ReactDOM.findDOMNode(errorBox.current).scrollIntoView();\r\n    }\r\n  }, [isSubmitting]);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBox}></div>\r\n        {Object.keys(errors).length > 0 && touched.problemId && <ErrorBoxComponent errors={errors}></ErrorBoxComponent>}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>What is the problem?</p>\r\n        <div>\r\n          <span id=\"whatIsTheProblem\">\r\n            <ErrorLabelHandlerComponent\r\n              touched={touched}\r\n              errors={errors}\r\n              text=\"What is the problem\"\r\n              id=\"problemId\"\r\n              submitCount={submitCount}\r\n            />\r\n            <RadiobuttonInputComponent\r\n              name=\"problemId\"\r\n              value={problemId}\r\n              onChange={(e) => {\r\n                setFieldValue('problemId', e);\r\n                setFieldValue('offensiveGraffiti', undefined);\r\n                onProblemTypeChange(e);\r\n              }}\r\n              error={errors.problemId && touched.problemId}\r\n              options={possibleProblems.map((problem) => ({\r\n                label: problem.displayName,\r\n                value: problem.id,\r\n              }))}\r\n            />\r\n            {errors.problemId && touched.problemId && <InputErrorComponent>{errors.problemId}</InputErrorComponent>}\r\n          </span>\r\n        </div>\r\n        {isGraffiti === 'true' ? (\r\n          <OffensiveGraffitiInputComponent\r\n            offensiveGraffiti={offensiveGraffiti}\r\n            onOffensiveGraffitiChange={(value) => {\r\n              setFieldValue('offensiveGraffiti', value);\r\n              onOffensiveGraffitiChange(value);\r\n            }}\r\n            errors={errors}\r\n            touched={touched}\r\n            submitCount={submitCount}\r\n          />\r\n        ) : (\r\n          <React.Fragment />\r\n        )}\r\n\r\n        <h2 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h2>\r\n\r\n        <FileInputComponent uploadedFiles={uploadedFiles} onUploadFiles={onUploadFiles} onRemoveFile={onRemoveFile} />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={goToPrevious}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, goToNext, offensiveGraffiti }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      offensiveGraffiti,\r\n      goToNext,\r\n    };\r\n  },\r\n  validationSchema: (props) =>\r\n    Yup.object().shape({\r\n      problemId: Yup.string().required(\"Please supply details for 'What is the problem'.\"),\r\n      offensiveGraffiti: Yup.string().when('problemId', {\r\n        is: () => props.isGraffiti === 'true',\r\n        then: Yup.string().required(\"Please supply details for 'Is the graffiti offensive?'.\"),\r\n      }),\r\n    }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  problemId: PropTypes.string,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  onProblemTypeChange: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array,\r\n  possibleProblems: PropTypes.array.isRequired,\r\n  isGraffiti: PropTypes.string.isRequired,\r\n  offensiveGraffiti: PropTypes.bool,\r\n  onOffensiveGraffitiChange: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n  mapConstants,\r\n  processCategoryIdsSettingName,\r\n  apiSettingName,\r\n  graffitiSettingName,\r\n} from '../../common';\r\n\r\nexport const testName = 'Road and street sign problems';\r\n\r\nexport class FormConfiguration {\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n  baseUrl = clientMyAccountUrl.roadAndStreetSign;\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.step4}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n  pageHeaderText = 'Report a road or street sign problem';\r\n  documentTitle = 'My Account - Report a road or street sign problem';\r\n  totalSteps = 5;\r\n  subject = 'Road and street sign';\r\n  missingAssetCheckBoxLabel = \"I can't find the sign on the map\";\r\n  roadSignFeatureLayerId = 'roadSignFeatures';\r\n  roadSignFeatureLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/21';\r\n  streetNameplatesFeatureLayerId = 'streetNameplatesFeatures';\r\n  streetNameplatesFeatureLayerUrl = 'https://maps.york.gov.uk/arcgis/rest/services/Public/LV_TranStreetCare/MapServer/23';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n  mapIncidentLayerId = 'roadAndStreetSignIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  mapIncidentsUrl = `${ConfigurationService.getEnvironmentSettingByName(apiSettingName)}${\r\n    apiMyAccountUrl.getIncidents.ROAD_AND_STREET_SIGN\r\n  }`;\r\n\r\n  // Entry page constants\r\n  whatToReportText = {\r\n    text: 'problems',\r\n    url: 'https://www.york.gov.uk/ReportStreetSigns',\r\n  };\r\n\r\n  beforeYouBeginText = [\r\n    {\r\n      text: 'problems we can help with',\r\n      url: 'https://www.york.gov.uk/ReportStreetSigns#problemswecanhelpwith',\r\n    },\r\n    {\r\n      text: 'our road and street sign problem response times',\r\n      url: 'https://www.york.gov.uk/ReportStreetSigns#responsetimes',\r\n    },\r\n  ];\r\n\r\n  // Values from configuration service\r\n  signTypes = [];\r\n  signTypesPure = []; // Not set on Object.Values so we have access to object name\r\n  categories = [];\r\n  productId;\r\n  missingAssetProductId;\r\n\r\n  constructor() {\r\n    const { productId, categoryIds, signTypes, missingAssetProductId } =\r\n      ConfigurationService.getEnvironmentSettingByName(processCategoryIdsSettingName.roadAndStreetSign);\r\n    this.signTypesPure = signTypes;\r\n    this.productId = productId;\r\n    this.missingAssetProductId = missingAssetProductId;\r\n    this.categories = Object.values(categoryIds);\r\n    this.signTypes = Object.values(signTypes);\r\n  }\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  getGraffitiSettings = () => {\r\n    return ConfigurationService.getEnvironmentSettingByName(graffitiSettingName);\r\n  };\r\n\r\n  getProblemTypes = () => {\r\n    return Object.entries(\r\n      ConfigurationService.getDrillDownSettingValue([processCategoryIdsSettingName.roadAndStreetSign, 'types'])\r\n    ).map((type) => type[1]);\r\n  };\r\n\r\n  getProductId = () => {\r\n    return ConfigurationService.getDrillDownSettingValue([\r\n      processCategoryIdsSettingName.roadAndStreetSign,\r\n      'productId',\r\n    ]);\r\n  };\r\n}\r\n","import React, { useEffect, useCallback, useReducer, useMemo } from 'react';\r\nimport { Routes, Route, useNavigate, useLocation } from 'react-router-dom';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport {\r\n  ContinueFormOrReRoute,\r\n  IncidentFormContainer,\r\n  changeUrlByStepNumberv6,\r\n  clientMyAccountUrl,\r\n  isEnabled,\r\n  UnadoptedLayerFlag,\r\n  MissingAssetsFlag,\r\n} from '../../common';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\nimport { getUnadoptedRoadsFeatureOptions } from '../helpers/unadopted-layer.helper';\r\nimport {\r\n  getTOIDFromPoint,\r\n  getPostcodeFromPointAsync,\r\n  getUSRNFromPoint,\r\n  getParishFromPointAsync,\r\n  getStreetFromPoint,\r\n  getWardFromPoint,\r\n} from 'common/components/map-components/esri-location.service';\r\n\r\nimport * as Services from '../../common/services/incident.service';\r\n\r\nimport EntryPage from '../components-shared/entry-page.component';\r\nimport AboutProblemPageComponent from './components/about-problem-page.component';\r\nimport LocationPageComponent from '../components-shared/location-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SummaryPageComponent from '../components-shared/summary-page.component';\r\nimport ConfirmationPageComponent from '../components-shared/confirmation-page.component';\r\nimport SignInContainer from '../../sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\n\r\nimport { FormConfiguration } from './form-config';\r\nimport { actions, fieldNames, initialState, reducer } from 'incident-forms/incident-form.reducer';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\n\r\nconst RoadAndStreetSignApp = (props) => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n\r\n  // Change the header text on certain steps\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: {\r\n        [fieldNames.currentStep]: indexOfStep,\r\n        [fieldNames.pageHeaderText]: header,\r\n      },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // ---- ENTRY PAGE ------\r\n  const handleResetForm = useCallback(\r\n    () =>\r\n      dispatch({\r\n        type: actions.resetForm,\r\n        payload: initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n      }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n\r\n  // ----ABOUT PROBLEM PAGE -----\r\n  const handleSignTypeChange = (value) => {\r\n    dispatch({ type: actions.resetLocation });\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.signTypeId]: value } });\r\n  };\r\n\r\n  // ----LOCATION PAGE----\r\n  const layerOptionsBuilder = () => {\r\n    let fieldsBuilder = new FieldsBuilder();\r\n    fieldsBuilder.addIncidentId();\r\n    fieldsBuilder.addFaultType();\r\n    fieldsBuilder.addIncidentReferenceNumber();\r\n    fieldsBuilder.addCreatedTime();\r\n    const inc = incidentLayersOptionsBuilder({\r\n      mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n      getIncidentsUrl: formConfig.mapIncidentsUrl,\r\n      mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n        tableDataArray: [\r\n          { header: 'Fault type', data: 'faultType' },\r\n          { header: 'Date created', data: 'createdTime' },\r\n        ],\r\n        showAlreadyReportedMessage: true,\r\n      }),\r\n      fields: fieldsBuilder.getBuilderResult(),\r\n    });\r\n\r\n    return inc;\r\n  };\r\n\r\n  const featureLayerOptionsBuilder = () => {\r\n    const signType = formConfig.signTypes.find((type) => type.id === state.formData.signTypeId);\r\n    const isRoadSign = signType !== undefined && signType.id === formConfig.signTypesPure.road.id;\r\n    const formLayerUrl = isRoadSign ? formConfig.roadSignFeatureLayerUrl : formConfig.streetNameplatesFeatureLayerUrl;\r\n    const formLayerId = isRoadSign ? formConfig.roadSignFeatureLayerId : formConfig.streetNameplatesFeatureLayerId;\r\n\r\n    const normalLayers = {\r\n      layerUrl: formLayerUrl,\r\n      layerId: formLayerId,\r\n      popupTemplate: popupTemplateBuilder({\r\n        mapIncidentLayerTitle: 'Selected sign',\r\n        tableDataArray: [\r\n          { header: 'Sign\\'s Street Text', data: 'TEXT' }, // TEXT only exists on street name plate\r\n          { header: 'Item ID', data: 'Item_Id' },\r\n          { header: 'Type', data: 'IIT_TYPE' },\r\n        ],\r\n      }),\r\n    };\r\n\r\n    let featureLayer = [];\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(UnadoptedLayerFlag))) {\r\n      if (state.missingAssetChecked === true) {\r\n        // Only load layer on missing asset\r\n        featureLayer.push(getUnadoptedRoadsFeatureOptions());\r\n      } else {\r\n        featureLayer.push(normalLayers);\r\n      }\r\n    } else {\r\n      featureLayer.push(normalLayers);\r\n    }\r\n\r\n    return featureLayer;\r\n  };\r\n\r\n  const getMissingAssetOptions = () => {\r\n    if (isEnabled(FeatureFlagsService.getFeatureFlagByName(MissingAssetsFlag))) {\r\n      return {\r\n        checked: state.missingAssetChecked,\r\n        label: formConfig.missingAssetCheckBoxLabel,\r\n        showFileInputOnMapPage: false,\r\n        handleSwitch: () => {\r\n          dispatch({\r\n            type: actions.updateStateFields,\r\n            payload: { [fieldNames.missingAssetChecked]: !state.missingAssetChecked },\r\n          });\r\n        },\r\n      };\r\n    }\r\n  };\r\n\r\n  const handleFeatureClicked = async (e) => {\r\n    const toid = getTOIDFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const street = await getStreetFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const ward = await getWardFromPoint(e.feature.geometry.x, e.feature.geometry.y);\r\n    const postcode = getPostcodeFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const usrn = getUSRNFromPoint(street);\r\n    const parish = getParishFromPointAsync(e.feature.geometry.x, e.feature.geometry.y);\r\n    const [toidValue, postcodeValue, usrnValue, parishValue] = await Promise.all([toid, postcode, usrn, parish]);\r\n    // data from location service is more reliable so we try to use that where possible\r\n    // if some of the information is not available, we fall back to the asset layer\r\n\r\n    const locationObject = {\r\n      easting: e.feature.geometry.x.toString(),\r\n      northing: e.feature.geometry.y.toString(),\r\n      street: street ? street : e.feature.attributes.TEXT,\r\n      toid: toidValue,\r\n      postcode: postcodeValue,\r\n      usrn: usrnValue ? usrnValue.toString() : null,\r\n      ward: ward,\r\n      parish: parishValue,\r\n      assetId: e.feature.attributes.Item_Id,\r\n      filter: `Item_Id=${e.feature.attributes.Item_Id}`,\r\n    };\r\n\r\n    dispatch({ type: actions.updateLocationObject, payload: locationObject });\r\n  };\r\n\r\n  const locationPageIncidentLayerOptions = layerOptionsBuilder();\r\n  const featureLayerOptions = featureLayerOptionsBuilder();\r\n\r\n  const locationSelectText = (\r\n    <>\r\n      Search the map by postcode, street name, or your current location, to view nearby signs.\r\n      <br />\r\n      Use the <span aria-hidden=\"true\" className=\"esri-icon esri-icon-locate\"></span> icon to report a problem at your\r\n      current location.\r\n      <br />\r\n      Select the sign by clicking the icon on the map.\r\n      <br />\r\n      Select a reported problem to view details.\r\n    </>\r\n  );\r\n\r\n  // ---PROBLEM PAGE---\r\n  const handleProblemTypeChange = (value) => {\r\n    const problemType = possibleProblems.find((problem) => problem.id === value);\r\n\r\n    if (problemType.alternative === true) {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.isAlternative]: 'true' } });\r\n    } else {\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.isAlternative]: 'false' } });\r\n      dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.offensiveGraffiti]: undefined } });\r\n    }\r\n\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } });\r\n  };\r\n\r\n  const possibleProblems = formConfig.categories;\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...state.formData };\r\n    const getIdForProduct =\r\n      state.missingAssetChecked === false ? formConfig.getProductId() : formConfig.missingAssetProductId;\r\n    form.productId = getIdForProduct;\r\n    form.subject = formConfig.subject;\r\n\r\n    if (form.isAlternative === 'true') {\r\n      const graffitiSettings = formConfig.getGraffitiSettings();\r\n      form.productId = graffitiSettings['productId'];\r\n      form.subject = graffitiSettings['subject'];\r\n    }\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await Services.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const formData = state.formData;\r\n    const problemWith = formConfig.signTypes.find((val) => val.id === formData.signTypeId);\r\n    let category = formConfig.categories.find((val) => val.id === formData.problemId);\r\n\r\n    const tableData = [\r\n      {\r\n        columnOne: 'Problem with',\r\n        columnTwo: problemWith && problemWith.displayName ? problemWith.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'aboutTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'About the problem',\r\n        columnTwo: category && category.displayName ? category.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    // Only show the \"Offensive graffiti\" response if there is a value\r\n    if (formData.offensiveGraffiti) {\r\n      tableData.splice(4, 0, {\r\n        columnOne: 'Is the graffiti offensive?',\r\n        columnTwo: formData.offensiveGraffiti === true ? 'Yes' : 'No',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'isGraffitiOffensive'),\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await Services.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.roadAndStreetSign.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={formConfig.whatToReportText}\r\n              informationArray={formConfig.beforeYouBeginText}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: {\r\n                      [fieldNames.formStarted]: true,\r\n                      [fieldNames.formCompleted]: false,\r\n                    },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n            />\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <AboutProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                signTypeId={state.formData.signTypeId}\r\n                onSignTypeChange={handleSignTypeChange}\r\n                possibleSignTypes={formConfig.signTypes}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPageComponent\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                incidentLayerOptions={locationPageIncidentLayerOptions}\r\n                featureLayerOptions={featureLayerOptions}\r\n                handleFeatureClicked={handleFeatureClicked}\r\n                locationObject={state.formData.locationObject}\r\n                locationSelected={state.formData.locationSelected}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                disableFreeSelect={true}\r\n                locationSelectText={locationSelectText}\r\n                additionalInformation={state.formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                // IF missing assets is enabled, this property is required for map select to work\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n                // missing assets options\r\n                missingAssetsOptions={getMissingAssetOptions()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                problemId={state.formData.problemId}\r\n                onProblemTypeChange={handleProblemTypeChange}\r\n                isGraffiti={state.formData.isAlternative}\r\n                offensiveGraffiti={state.formData.offensiveGraffiti}\r\n                onOffensiveGraffitiChange={(isOffensive) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.offensiveGraffiti]: isOffensive },\r\n                  })\r\n                }\r\n                uploadedFiles={state.formData.uploadedFiles}\r\n                possibleProblems={possibleProblems}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step4}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPageComponent\r\n                goToProblemPage={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPageComponent\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => CYCServices.JWTAuth.isAuthenticated()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default RoadAndStreetSignApp;\r\n","import { CYCServices } from 'cyc-services';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, vegetationSettingName, mapConstants } from 'common';\r\n\r\nexport default class FormConfiguration {\r\n  baseUrl = clientMyAccountUrl.vegetation;\r\n  documentTitle = 'My Account - Report a vegetation problem';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  pageHeaderText = 'Report a vegetation problem';\r\n  stepUrls = [\r\n    `${this.baseUrl.root}`,\r\n    `${this.baseUrl.root + this.baseUrl.step1}`,\r\n    `${this.baseUrl.root + this.baseUrl.step2}`,\r\n    `${this.baseUrl.root + this.baseUrl.step3}`,\r\n    `${this.baseUrl.root + this.baseUrl.step4}`,\r\n    `${this.baseUrl.root + this.baseUrl.confirmation}`,\r\n  ];\r\n  subject = 'Vegetation problem';\r\n  totalSteps = 5;\r\n  userIsLoggedIn = CYCServices.JWTAuth.isAuthenticated;\r\n\r\n  // Values from configuration service\r\n  vegetationTypes = [];\r\n  categories = [];\r\n  productId;\r\n\r\n  constructor() {\r\n    const { productId, vegetationTypes } = ConfigurationService.getEnvironmentSettingByName(vegetationSettingName);\r\n\r\n    this.productId = productId;\r\n    // this.categories = Object.values(categoryIds);\r\n    this.vegetationTypes = Object.values(vegetationTypes);\r\n  }\r\n\r\n  shouldDisplayBasedOnStep = (number) => number > 0 && number <= this.totalSteps;\r\n\r\n  // Entry page constants\r\n  whatToReportText = {\r\n    text: 'problems with any type of vegetation',\r\n  };\r\n\r\n  beforeYouBeginHeadingText = 'Before you begin, see how we deal with;';\r\n\r\n  beforeYouBeginText = [\r\n    {\r\n      text: 'Issues with trees ',\r\n      url: 'https://www.york.gov.uk/ReportTrees',\r\n    },\r\n    {\r\n      text: 'Issues with hedges ',\r\n      url: 'https://www.york.gov.uk/ReportHedgerows',\r\n    },\r\n    {\r\n      text: 'Issues with grass ',\r\n      url: 'https://www.york.gov.uk/ReportGrass',\r\n    },\r\n    {\r\n      text: 'Issues with leaves and blossom ',\r\n      url: 'https://www.york.gov.uk/ReportLeavesAndBlossom',\r\n    },\r\n    {\r\n      text: 'Issues with weeds and moss ',\r\n      url: 'https://www.york.gov.uk/ReportWeedsAndMoss',\r\n    },\r\n  ];\r\n\r\n  uploadPhotoHelpText = {\r\n    noFiles:\r\n      'Help: Uploaded photos of the problem can support and influence how and when this is dealt with. If you have any photos upload them here (.png or .jpg)',\r\n    withFiles: 'Help: If you would like to change your photo/s, upload them here (.png or .jpg)',\r\n  };\r\n\r\n  disclaimer =\r\n    \"We plan maintenance of vegetation on a priority basis, as part of a programme of work. We'll only take action if problems with grass, trees, blossom or leaves are causing a risk to safety.\";\r\n\r\n  // Map constants\r\n  mapIncidentLayerId = 'vegetationIncidents';\r\n  mapIncidentLayerTitle = 'Problem description';\r\n  enablePointSelectionZoomLevels = mapConstants.enablePointSelectionZoomLevels;\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { withFormik, Form } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ErrorBoxComponent, ErrorLabelHandlerComponent, setInitialPosition } from '../../../common';\r\nimport {\r\n  RadiobuttonInputComponent,\r\n  InputErrorComponent,\r\n  ButtonClasses,\r\n  ButtonComponent,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemWithPageForm = (props) => {\r\n  const errorBox = React.createRef();\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <Form>\r\n      <div ref={errorBox}></div>\r\n      {Object.keys(props.errors).length > 0 && props.touched.typeId && (\r\n        <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n      )}\r\n      <h2 id=\"aboutTheProblem\">About the problem</h2>\r\n      <div className=\"row\">\r\n        <span>\r\n          <ErrorLabelHandlerComponent\r\n            touched={props.touched}\r\n            errors={props.errors}\r\n            text=\"What is the problem with?\"\r\n            id=\"typeId\"\r\n            submitCount={props.submitCount}\r\n          />\r\n          <RadiobuttonInputComponent\r\n            name=\"typeId\"\r\n            value={props.values.typeId}\r\n            onChange={(e) => {\r\n              props.setFieldValue('typeId', e);\r\n              props.onVegetationTypeChange(e);\r\n            }}\r\n            error={props.errors.typeId && props.touched.typeId}\r\n            options={props.possibleVegetationTypes.map((type) => ({\r\n              label: type.displayName,\r\n              value: type.id,\r\n            }))}\r\n          />\r\n          {props.errors.typeId && props.touched.typeId && (\r\n            <InputErrorComponent>{props.errors.typeId}</InputErrorComponent>\r\n          )}\r\n        </span>\r\n      </div>\r\n\r\n      <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n        Next\r\n      </ButtonComponent>\r\n      <ButtonComponent type=\"button\" onClick={props.goToPrevious}>\r\n        Previous\r\n      </ButtonComponent>\r\n    </Form>\r\n  );\r\n};\r\n\r\nconst ProblemWithPageComponent = withFormik({\r\n  mapPropsToValues({ vegetationTypeId, goToNext }) {\r\n    return {\r\n      typeId: vegetationTypeId || '',\r\n      goToNext: goToNext,\r\n    };\r\n  },\r\n  validationSchema: Yup.object().shape({\r\n    typeId: Yup.string().required(\"Please supply details for 'What is the problem with?'.\"),\r\n  }),\r\n  handleSubmit(bag) {\r\n    bag.goToNext();\r\n  },\r\n})(ProblemWithPageForm);\r\n\r\nProblemWithPageComponent.propTypes = {\r\n  vegetationTypeId: PropTypes.string,\r\n  onVegetationTypeChange: PropTypes.func.isRequired,\r\n  possibleVegetationTypes: PropTypes.array.isRequired,\r\n  goToPrevious: PropTypes.func,\r\n};\r\n\r\nexport default ProblemWithPageComponent;\r\n","import React, { useEffect } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { Form, withFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n  ErrorBoxComponent,\r\n  ErrorLabelHandlerComponent,\r\n  FileInputComponent,\r\n  setInitialPosition,\r\n  ADDITIONAL_INFORMATION_MAX_LENGTH,\r\n  msgConstants,\r\n  AdditionalInformationComponent,\r\n} from 'common';\r\n\r\nimport {\r\n  InputErrorComponent,\r\n  ButtonComponent,\r\n  RadiobuttonInputComponent,\r\n  ButtonClasses,\r\n} from 'cyc-react-ui-components';\r\n\r\nconst ProblemPage = (props) => {\r\n  let errorBoxRef = React.createRef();\r\n  const previousSubmitCount = React.useRef(0);\r\n\r\n  const selectedVegetationType = props.vegetationTypes.find((type) => type.id === props.problemWithId);\r\n  const categories = selectedVegetationType.categories ? Object.values(selectedVegetationType.categories) : null;\r\n\r\n  const handleAdditionalInformationChange = (e) => {\r\n    props.setFieldValue('additionalProblemInformation', e.target.value);\r\n    props.onAdditionalInformationChange && props.onAdditionalInformationChange(e);\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (\r\n      !props.isSubmitting &&\r\n      !props.isValid &&\r\n      Object.keys(props.errors).length > 0 &&\r\n      props.submitCount > previousSubmitCount.current\r\n    ) {\r\n      previousSubmitCount.current = props.submitCount;\r\n      const errorBox = ReactDOM.findDOMNode(errorBoxRef.current);\r\n      errorBox.scrollIntoView();\r\n    }\r\n  }, [props.isSubmitting, errorBoxRef, props.errors, props.isValid, props.submitCount]);\r\n\r\n  useEffect(() => {\r\n    setInitialPosition();\r\n  }, []);\r\n\r\n  return (\r\n    <div className=\"page\">\r\n      <Form>\r\n        <div ref={errorBoxRef}></div>\r\n        {Object.keys(props.errors).length > 0 && props.submitCount > 0 && (\r\n          <ErrorBoxComponent errors={props.errors}></ErrorBoxComponent>\r\n        )}\r\n\r\n        <h2>About the problem</h2>\r\n        <p>Tell us more about the issue.</p>\r\n\r\n        {categories ? (\r\n          <div className=\"row\">\r\n            <span id=\"whatIsTheProblem\">\r\n              <ErrorLabelHandlerComponent\r\n                touched={props.touched}\r\n                errors={props.errors}\r\n                text=\"What is the problem?\"\r\n                tag=\"p\"\r\n                id=\"problemId\"\r\n                submitCount={props.submitCount}\r\n              />\r\n              <RadiobuttonInputComponent\r\n                name=\"problemId\"\r\n                onChange={(e) => {\r\n                  props.setFieldValue('problemId', e);\r\n                  props.onProblemChange(e);\r\n                }}\r\n                value={props.values.problemId}\r\n                error={props.errors.problemId && props.touched.problemId}\r\n                options={categories.map((category) => ({\r\n                  label: category.displayName,\r\n                  value: category.id,\r\n                }))}\r\n              />\r\n              {props.errors.problemId && props.touched.problemId && (\r\n                <InputErrorComponent>{props.errors.problemId}</InputErrorComponent>\r\n              )}\r\n            </span>\r\n          </div>\r\n        ) : null}\r\n\r\n        <AdditionalInformationComponent\r\n          showCounter={true}\r\n          maximumCount={ADDITIONAL_INFORMATION_MAX_LENGTH}\r\n          className=\"w-100\"\r\n          name=\"additionalProblemInformation\"\r\n          placeholder=\"Additional details\"\r\n          value={props.additionalProblemInformation}\r\n          onAdditionalInformationChange={handleAdditionalInformationChange}\r\n          headerText=\"Additional details\"\r\n          helpText=\"Help: Details that will help us prioritise the problem. For example, the cuttings are wet and currently presenting a trip hazard.\"\r\n          required={false}\r\n        />\r\n        {props.errors.additionalProblemInformation && props.touched.additionalProblemInformation && (\r\n          <InputErrorComponent>{props.errors.additionalProblemInformation}</InputErrorComponent>\r\n        )}\r\n\r\n        <h3 className=\"mt-3\" id=\"uploadPhoto\">\r\n          Upload a photo\r\n        </h3>\r\n\r\n        <FileInputComponent\r\n          uploadedFiles={props.uploadedFiles}\r\n          onUploadFiles={props.onUploadFiles}\r\n          onRemoveFile={props.onRemoveFile}\r\n          helpText={props.uploadPhotoHelpText}\r\n        />\r\n\r\n        <ButtonComponent type=\"submit\" disabled={props.isSubmitting} className={ButtonClasses.primary + ' float-right'}>\r\n          Next\r\n        </ButtonComponent>\r\n        <ButtonComponent type=\"button\" onClick={props.goToPreviousPage}>\r\n          Previous\r\n        </ButtonComponent>\r\n      </Form>\r\n    </div>\r\n  );\r\n};\r\n\r\nconst ProblemPageComponent = withFormik({\r\n  mapPropsToValues({ problemId, problemWithId, uploadedFiles, goToNextPage, additionalProblemInformation }) {\r\n    return {\r\n      problemId: problemId || '',\r\n      problemWithId: problemWithId,\r\n      goToNextPage: goToNextPage,\r\n      uploadedFiles: uploadedFiles || [],\r\n      additionalProblemInformation: additionalProblemInformation,\r\n    };\r\n  },\r\n  validationSchema: (props) => {\r\n    const validationObject = {\r\n      goToNextPage: Yup.string().required(),\r\n      uploadedFiles: Yup.array(),\r\n      additionalProblemInformation: Yup.string().max(\r\n        ADDITIONAL_INFORMATION_MAX_LENGTH,\r\n        msgConstants.CHARACTER_LIMIT_EXCEEDED_ERROR\r\n      ),\r\n    };\r\n\r\n    const selectedVegetationType = props.vegetationTypes.find((type) => type.id === props.problemWithId);\r\n    const categories = selectedVegetationType.categories ? Object.values(selectedVegetationType.categories) : null;\r\n\r\n    if (categories) {\r\n      validationObject.problemId = Yup.string().required(\"Please supply details for 'What is the problem?'.\");\r\n    }\r\n\r\n    return Yup.object().shape(validationObject);\r\n  },\r\n  handleSubmit(bag) {\r\n    bag.goToNextPage();\r\n  },\r\n})(ProblemPage);\r\n\r\nProblemPageComponent.propTypes = {\r\n  goToNextPage: PropTypes.func.isRequired,\r\n  goToPreviousPage: PropTypes.func.isRequired,\r\n  onProblemChange: PropTypes.func.isRequired,\r\n  vegetationTypes: PropTypes.array.isRequired,\r\n  onUploadFiles: PropTypes.func.isRequired,\r\n  onRemoveFile: PropTypes.func.isRequired,\r\n  uploadedFiles: PropTypes.array.isRequired,\r\n  problemWithId: PropTypes.string,\r\n  problemId: PropTypes.string,\r\n  uploadPhotoHelpText: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default ProblemPageComponent;\r\nexport { ProblemPage };\r\n","import React, { useReducer, useCallback, useMemo, useEffect } from 'react';\r\nimport { Routes, Route, useNavigate, useLocation } from 'react-router-dom';\r\nimport FormConfiguration from './form-config';\r\nimport { reducer, initialState, actions, fieldNames } from '../incident-form.reducer';\r\nimport {\r\n  IncidentFormContainer,\r\n  ContinueFormOrReRoute,\r\n  changeUrlByStepNumberv6,\r\n  clientMyAccountUrl,\r\n  apiMyAccountUrl,\r\n  IncidentService,\r\n} from 'common';\r\nimport { HeaderTextFromUrl } from '../helpers/header-text-from-url.helper';\r\nimport { ConfigurationService } from 'cyc-configuration-service';\r\nimport {\r\n  incidentLayersOptionsBuilder,\r\n  FieldsBuilder,\r\n  popupTemplateBuilder,\r\n  mapIncidentDetailsToAttributesBuilder,\r\n} from '../helpers/incident-layer-options-builder.helper';\r\n\r\nimport { EntryPage, LocationPage, SummaryPage, ConfirmationPage } from '../components-shared';\r\nimport ProblemWithPageComponent from './components/problem-with-page.component';\r\nimport ProblemPageComponent from './components/problem-page.component';\r\nimport SignInContainer from 'sign-in/containers/sign-in.container';\r\nimport RegistrationApp from '../../registration/registration.app';\r\n\r\nconst VegetationApp = () => {\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n\r\n  const formConfig = useMemo(() => new FormConfiguration(), []);\r\n\r\n  const initState = useMemo(\r\n    () => initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n  const [state, dispatch] = useReducer(reducer, initState);\r\n  const formData = state.formData;\r\n  const getIncidentsUrl = `${ConfigurationService.store.apiUrl}${apiMyAccountUrl.getIncidents.VEGETATION}`;\r\n\r\n  // --- render builders ----\r\n  const formRouteInfo = () => {\r\n    return {\r\n      formStarted: state.formStarted,\r\n      formCompleted: state.formCompleted,\r\n      formStartUrl: formConfig.stepUrls[0],\r\n      formEndUrl: formConfig.stepUrls[formConfig.totalSteps],\r\n      location: location,\r\n    };\r\n  };\r\n\r\n  // Change the header text on certain steps\r\n  useEffect(() => {\r\n    const indexOfStep = formConfig.stepUrls.indexOf(location.pathname);\r\n    const header = HeaderTextFromUrl({\r\n      url: location.pathname,\r\n      initialHeaderText: formConfig.pageHeaderText,\r\n    });\r\n\r\n    dispatch({\r\n      type: actions.updateStateFields,\r\n      payload: {\r\n        [fieldNames.currentStep]: indexOfStep,\r\n        [fieldNames.pageHeaderText]: header,\r\n      },\r\n    });\r\n  }, [location.pathname, formConfig.pageHeaderText, formConfig.stepUrls]);\r\n\r\n  // ---- ENTRY PAGE ------\r\n  const handleResetForm = useCallback(\r\n    () =>\r\n      dispatch({\r\n        type: actions.resetForm,\r\n        payload: initialState({ pageHeaderText: formConfig.pageHeaderText }),\r\n      }),\r\n    [formConfig.pageHeaderText]\r\n  );\r\n\r\n  // ---- ABOUT PROBLEM PAGE ----\r\n  const handleVegetationTypeChange = (value) => {\r\n    dispatch({ type: actions.resetLocation });\r\n    dispatch({\r\n      type: actions.updateFormDataFields,\r\n      payload: { [fieldNames.vegetationTypeId]: value, [fieldNames.problemId]: '' },\r\n    });\r\n  };\r\n\r\n  // ---- LOCATION PAGE ----\r\n  // Build incident Layer options\r\n  let fieldsBuilder = new FieldsBuilder();\r\n  fieldsBuilder.addIncidentId();\r\n  fieldsBuilder.addFaultType();\r\n  fieldsBuilder.addIncidentReferenceNumber();\r\n  fieldsBuilder.addCreatedTime();\r\n  const incidentLayerOptions = incidentLayersOptionsBuilder({\r\n    mapIncidentDetailsToAttributes: mapIncidentDetailsToAttributesBuilder,\r\n    getIncidentsUrl: getIncidentsUrl,\r\n    mapIncidentLayerId: formConfig.mapIncidentLayerId,\r\n    popupTemplate: popupTemplateBuilder({\r\n      mapIncidentLayerTitle: formConfig.mapIncidentLayerTitle,\r\n      tableDataArray: [\r\n        { header: 'Fault type', data: 'faultType' },\r\n        { header: 'Date created', data: 'createdTime' },\r\n      ],\r\n      showAlreadyReportedMessage: true,\r\n    }),\r\n    fields: fieldsBuilder.getBuilderResult(),\r\n  });\r\n\r\n  // --- SUMMARY PAGE ---\r\n  const buildTableData = () => {\r\n    const type = formConfig.vegetationTypes.find((type) => type.id === formData.vegetationTypeId);\r\n    const problem =\r\n      type && type.categories && Object.values(type.categories).find((category) => category.id === formData.problemId);\r\n\r\n    const tableData = [\r\n      {\r\n        columnOne: 'What is the problem with?',\r\n        columnTwo: type && type.displayName ? type.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(1, formConfig, navigate, 'aboutTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Location',\r\n        columnTwo:\r\n          formData.locationObject && formData.locationObject.streetName && formData.locationObject.streetName.length > 0\r\n            ? formData.locationObject.streetName\r\n            : 'Selected on map',\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'location'),\r\n      },\r\n      {\r\n        columnOne: 'Additional location information',\r\n        columnTwo: formData.additionalInformation,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(2, formConfig, navigate, 'additionalInformation'),\r\n      },\r\n      {\r\n        columnOne: 'Additional details',\r\n        columnTwo: formData.additionalProblemInformation ? formData.additionalProblemInformation : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'additionalInformation'),\r\n        columnTwoClassName: 'sentence-case',\r\n      },\r\n      {\r\n        columnOne: 'Upload a photo',\r\n        columnTwo: formData.uploadedFiles ? (\r\n          <ul className=\"uploaded-photos\">\r\n            {formData.uploadedFiles.map((file, index) => (\r\n              <li key={index}>{file.fileName}</li>\r\n            ))}\r\n          </ul>\r\n        ) : (\r\n          <React.Fragment />\r\n        ),\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'uploadPhoto'),\r\n      },\r\n    ];\r\n\r\n    // Only show the \"What is the problem\" row when shown on problem page\r\n    if (problem) {\r\n      tableData.splice(3, 0, {\r\n        columnOne: 'What is the problem?',\r\n        columnTwo: problem && problem.displayName ? problem.displayName : null,\r\n        onChangeClicked: () => changeUrlByStepNumberv6(3, formConfig, navigate, 'whatIsTheProblem'),\r\n        columnTwoClassName: 'sentence-case',\r\n      });\r\n    }\r\n\r\n    return tableData;\r\n  };\r\n\r\n  const submitIncident = async () => {\r\n    let form = { ...formData };\r\n    form.productId = formConfig.productId;\r\n    form.subject = formConfig.subject;\r\n\r\n    // Create the incident\r\n    try {\r\n      const result = await IncidentService.createIncident(form);\r\n      if (result.status === 200) {\r\n        dispatch({ type: actions.updateIncidentObject, payload: result.data });\r\n        dispatch({\r\n          type: actions.updateStateFields,\r\n          payload: { [fieldNames.formStarted]: true, [fieldNames.formCompleted]: true },\r\n        });\r\n      }\r\n    } catch {\r\n      return false;\r\n    }\r\n  };\r\n\r\n  // ----- CONFIRMATION PAGE -----\r\n  const sendUpdateIncidentWithUser = async (email) => {\r\n    await IncidentService.updateIncidentWithUser(\r\n      state.incident.referenceNumber,\r\n      state.incident.secretReferenceNumber,\r\n      state.incident.incidentId,\r\n      email\r\n    ).then((result) => {\r\n      if (result.status === 200) {\r\n        return true;\r\n      } else {\r\n        return false;\r\n      }\r\n    });\r\n  };\r\n\r\n  const handleUserRegistered = (userData) => {\r\n    dispatch({ type: actions.updateStateFields, payload: { [fieldNames.userLoggedIn]: true } });\r\n    // only update incident when user's email is not confirmed\r\n    // save the incident into temp table while wait for the user to confirm his/her email.\r\n    if (state.formCompleted && userData.isEmailConfirmed === false) {\r\n      sendUpdateIncidentWithUser(userData.email);\r\n    }\r\n  };\r\n\r\n  const handleSignInCallBack = () => {\r\n    const isSignedIn = formConfig.userIsLoggedIn();\r\n    if (isSignedIn) {\r\n      sendUpdateIncidentWithUser('');\r\n    }\r\n    // after sign in succssfully, navigate back to incident creation confirmation page\r\n    navigate(formConfig.stepUrls[formConfig.totalSteps]);\r\n  };\r\n\r\n  return (\r\n    <IncidentFormContainer\r\n      displayProgressBar={() => formConfig.shouldDisplayBasedOnStep(state.currentStep)}\r\n      pageHeaderText={state.pageHeaderText}\r\n      documentTitle={formConfig.documentTitle}\r\n      totalSteps={formConfig.totalSteps}\r\n      currentStep={state.currentStep}\r\n      breadcrumbs={[{ url: clientMyAccountUrl.vegetation.root, name: formConfig.pageHeaderText }]}>\r\n      <Routes>\r\n        <Route\r\n          path=\"/\"\r\n          element={\r\n            <EntryPage\r\n              report={formConfig.whatToReportText}\r\n              informationHeaderText={formConfig.beforeYouBeginHeadingText}\r\n              informationArray={formConfig.beforeYouBeginText}\r\n              goToNextPage={() =>\r\n                changeUrlByStepNumberv6(1, formConfig, navigate, false, true, () =>\r\n                  dispatch({\r\n                    type: actions.updateStateFields,\r\n                    payload: {\r\n                      [fieldNames.formStarted]: true,\r\n                      [fieldNames.formCompleted]: false,\r\n                    },\r\n                  })\r\n                )\r\n              }\r\n              onResetForm={handleResetForm}\r\n              additionalInformation={<p>{formConfig.disclaimer}</p>}\r\n            />\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step1}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemWithPageComponent\r\n                goToPrevious={() => changeUrlByStepNumberv6(0, formConfig, navigate)}\r\n                goToNext={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                vegetationTypeId={formData.vegetationTypeId}\r\n                onVegetationTypeChange={handleVegetationTypeChange}\r\n                possibleVegetationTypes={formConfig.vegetationTypes}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step2}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <LocationPage\r\n                goToNext={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                goToPrevious={() => changeUrlByStepNumberv6(1, formConfig, navigate)}\r\n                incidentLayerOptions={incidentLayerOptions}\r\n                locationObject={formData.locationObject}\r\n                locationSelected={formData.locationSelected}\r\n                onMapSelected={(location) => dispatch({ type: actions.updateLocationObject, payload: location })}\r\n                clearSelectedPoint={() => dispatch({ type: actions.resetLocation })}\r\n                additionalInformation={formData.additionalInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalInformation]: e.target.value },\r\n                  })\r\n                }\r\n                enablePointSelectionZoomLevels={formConfig.enablePointSelectionZoomLevels}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step3}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ProblemPageComponent\r\n                goToNextPage={() => changeUrlByStepNumberv6(4, formConfig, navigate)}\r\n                goToPreviousPage={() => changeUrlByStepNumberv6(2, formConfig, navigate)}\r\n                onProblemChange={(value) =>\r\n                  dispatch({ type: actions.updateFormDataFields, payload: { [fieldNames.problemId]: value } })\r\n                }\r\n                onUploadFiles={(files) => dispatch({ type: actions.updateUploadFiles, payload: files })}\r\n                onRemoveFile={(index) => dispatch({ type: actions.removeUploadedFile, payload: index })}\r\n                uploadedFiles={formData.uploadedFiles}\r\n                problemWithId={formData.vegetationTypeId}\r\n                problemId={formData.problemId}\r\n                additionalProblemInformation={formData.additionalProblemInformation}\r\n                onAdditionalInformationChange={(e) =>\r\n                  dispatch({\r\n                    type: actions.updateFormDataFields,\r\n                    payload: { [fieldNames.additionalProblemInformation]: e.target.value },\r\n                  })\r\n                }\r\n                vegetationTypes={formConfig.vegetationTypes}\r\n                uploadPhotoHelpText={formConfig.uploadPhotoHelpText}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.step4}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <SummaryPage\r\n                goToProblemPage={() => changeUrlByStepNumberv6(3, formConfig, navigate)}\r\n                submitIncident={submitIncident}\r\n                tableData={buildTableData()}\r\n                additionalInformation={<p>{formConfig.disclaimer}</p>}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={formConfig.baseUrl.confirmation}\r\n          element={\r\n            <ContinueFormOrReRoute {...formRouteInfo()}>\r\n              <ConfirmationPage\r\n                referenceNumber={state.incident.referenceNumber}\r\n                onSignInClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.signIn)}\r\n                onRegisterClicked={() => navigate(formConfig.baseUrl.root + clientMyAccountUrl.register)}\r\n                userLoggedIn={() => formConfig.userIsLoggedIn()}\r\n                goToMyAccount={() => navigate(clientMyAccountUrl.dashboard)}\r\n                restartFormUrl={formConfig.baseUrl.root}\r\n              />\r\n            </ContinueFormOrReRoute>\r\n          }\r\n        />\r\n        <Route\r\n          path={clientMyAccountUrl.signIn}\r\n          element={<SignInContainer onSuccessfulSignIn={handleSignInCallBack} />}\r\n        />\r\n        <Route\r\n          path={`${clientMyAccountUrl.register}/*`}\r\n          element={\r\n            <RegistrationApp\r\n              onSuccessfulRegistration={handleUserRegistered}\r\n              extraSuccessfulContent={<p>Click 'Continue' to view the reference number for your reported problem.</p>}\r\n              onContinueClicked={() => navigate(formConfig.baseUrl.root + formConfig.baseUrl.confirmation)}\r\n            />\r\n          }\r\n        />\r\n      </Routes>\r\n    </IncidentFormContainer>\r\n  );\r\n};\r\n\r\nexport default VegetationApp;\r\n","import React from 'react';\r\nimport { Route, Routes } from 'react-router-dom';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nimport {\r\n  incidentFormRoot,\r\n  GraffitiForm,\r\n  RoadAndPavementProblemsForm,\r\n  WaterAndDrainageProblemsForm,\r\n  isEnabled,\r\n  StreetFurnitureForm,\r\n  DogAndLitterBinsForm,\r\n  RoadAndStreetSignForm,\r\n  VegetationForm,\r\n} from '../common';\r\nimport StreetLightingApp from './street-lighting/street-lighting.app';\r\nimport FlyTippingApp from './fly-tipping/fly-tipping.app';\r\nimport StreetCleaningApp from './street-cleaning/street-cleaning.app';\r\nimport SaltBinProblemsApp from './salt-bins-problems/salt-bin-problems.app';\r\nimport RoadAndPavementProblemsApp from './road-and-pavement-problems/road-and-pavement-problems.app';\r\nimport GraffitiApp from './graffiti/graffiti.app';\r\nimport WaterAndDrainageProblemsApp from './water-and-drainage-problems/water-and-drainage-problems.app';\r\nimport { NotFoundComponent } from '../common';\r\nimport DogAndLitterBins from './dog-and-litter-bins/dog-and-litter-bins.app';\r\nimport StreetFurnitureApp from './street-furniture/street-furniture.app';\r\nimport RoadAndStreetSignApp from './road-and-street-sign/road-and-street-sign.app';\r\nimport VegetationApp from './vegetation/vegetation.app';\r\n\r\n// Routes are currently hard coded because this is the only place they are used without the /form/ on the front\r\nconst IncidentFormRouter = () => (\r\n  <Routes>\r\n    <Route path=\"street-lighting/*\" element={<StreetLightingApp />} />\r\n\r\n    <Route path=\"fly-tipping/*\" element={<FlyTippingApp />} />\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(GraffitiForm)) ? (\r\n      <Route path=\"graffiti/*\" element={<GraffitiApp />} />\r\n    ) : undefined}\r\n\r\n    <Route path=\"street-cleaning/*\" element={<StreetCleaningApp />} />\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(RoadAndPavementProblemsForm)) ? (\r\n      <Route path=\"road-and-pavement-problems/*\" element={<RoadAndPavementProblemsApp />} />\r\n    ) : undefined}\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(WaterAndDrainageProblemsForm)) ? (\r\n      <Route path=\"water-and-drainage-problems/*\" element={<WaterAndDrainageProblemsApp />} />\r\n    ) : undefined}\r\n\r\n    <Route path=\"salt-bin-problems/*\" element={<SaltBinProblemsApp />} />\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(DogAndLitterBinsForm)) ? (\r\n      <Route path=\"dog-and-litter-bins/*\" element={<DogAndLitterBins />} />\r\n    ) : undefined}\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(StreetFurnitureForm)) ? (\r\n      <Route path=\"street-furniture/*\" element={<StreetFurnitureApp />} />\r\n    ) : undefined}\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(RoadAndStreetSignForm)) ? (\r\n      <Route path=\"/road-and-street-sign/*\" element={<RoadAndStreetSignApp />} />\r\n    ) : undefined}\r\n\r\n    {isEnabled(FeatureFlagsService.getFeatureFlagByName(VegetationForm)) ? (\r\n      <Route path=\"vegetation/*\" element={<VegetationApp />} />\r\n    ) : undefined}\r\n\r\n    <Route path=\"*\" element={<NotFoundComponent />} />\r\n  </Routes>\r\n);\r\n\r\nexport default IncidentFormRouter;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport {\r\n  BinCollectionsContainer,\r\n  MyAccountPageComponent,\r\n  clientMyAccountUrl,\r\n  PageHeaderComponent,\r\n} from '../../../common';\r\nimport { getContactDetailAsync } from '../../../account/services/account.service';\r\n\r\nconst MyCollectionsContainer = () => {\r\n  const [isLoading, setIsLoading] = useState(true);\r\n  const [customerUprn, setCustomerUprn] = useState();\r\n  const [customerAddress, setCustomerAddress] = useState();\r\n\r\n  // Getting the uprn on load\r\n  useEffect(() => {\r\n    const myGetContactDetails = async () => {\r\n      try {\r\n        const contactDetails = await getContactDetailAsync(true);\r\n\r\n        if (contactDetails.status !== 200) {\r\n          throw Error();\r\n        }\r\n\r\n        setCustomerUprn(contactDetails.data.uprn);\r\n        setCustomerAddress(contactDetails.data.address);\r\n        setIsLoading(false);\r\n      } catch {\r\n        setIsLoading(false);\r\n      }\r\n    };\r\n\r\n    myGetContactDetails();\r\n  }, []);\r\n\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"My collection details\" />\r\n      <MyAccountPageComponent className=\"bin-collections-lookup\">\r\n        <h2>Your next collection dates</h2>\r\n\r\n        <p>{customerAddress}</p>\r\n\r\n        {isLoading && (\r\n          <div className=\"network-loader cyc-box network-loader--loading\">\r\n            <i>Loading...</i>\r\n          </div>\r\n        )}\r\n\r\n        {customerUprn && customerUprn.length > 0 && (\r\n          <BinCollectionsContainer\r\n            uprn={customerUprn}\r\n            calendarUrl={clientMyAccountUrl.refuseAndRecycling.myCalendar}></BinCollectionsContainer>\r\n        )}\r\n\r\n        <Link className=\"link-inline-with-button\" to={clientMyAccountUrl.dashboard}>\r\n          Back to My Account\r\n        </Link>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default MyCollectionsContainer;\r\n","export default __webpack_public_path__ + \"static/media/recycle-logo.6639a8f7.png\";","export default __webpack_public_path__ + \"static/media/house-icon.044e009c.svg\";","export default __webpack_public_path__ + \"static/media/recycling-icon.cf5bfaca.svg\";","export default __webpack_public_path__ + \"static/media/garden-icon.6e1a5382.svg\";","import React, { useEffect, useState, useMemo } from 'react';\r\nimport { useParams, Link } from 'react-router-dom';\r\nimport appInsights from 'cyc-application-insights-react';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\nimport { binCollectionsRoot } from 'common';\r\n\r\nimport { getBinCalendarForUPRNAsync, groupBy } from '../../services/bin-collections.service';\r\n\r\nimport RecycleLogo from './recycle-logo.png';\r\nimport RefuseIcon from './house-icon.svg';\r\nimport RecyclingIcon from './recycling-icon.svg';\r\nimport GardenIcon from './garden-icon.svg';\r\n\r\nimport * as constants from '../../constants/bin-collections.constants';\r\n\r\nconst RecyclingIconComponent = () => <img src={RecyclingIcon} alt=\"Recycling collection icon\" />;\r\nconst RefuseIconComponent = () => <img src={RefuseIcon} alt=\"Household waste collection icon\" />;\r\nconst GardenIconComponent = () => <img src={GardenIcon} alt=\"Garden waste collection icon\" />;\r\n\r\nconst BinCalendarComponent = () => {\r\n  const [collections, setCollections] = useState([]);\r\n  const [loading, setLoading] = useState(false);\r\n  const [showSimpleCalendar, setShowSimpleCalendar] = useState(false);\r\n  const { uprn } = useParams();\r\n\r\n  useEffect(() => {\r\n    const binData = async () => {\r\n      setLoading(true);\r\n      const apiData = await getBinCalendarForUPRNAsync(uprn);\r\n      const data = [...groupBy(apiData, (collection) => collection.date.month())] // Group into a Map (dictionary) on month, then convert Map to array\r\n        .map((x) => x[1]) // Only keep the values, discard the key\r\n        .map((x) => x.sort((a, b) => a.date - b.date)) // Sort the collections in each month\r\n        .sort((a, b) => a[0].date - b[0].date); // Sort the months\r\n\r\n      setCollections(data);\r\n      setLoading(false);\r\n    };\r\n    binData();\r\n  }, [uprn]);\r\n\r\n  const handlePrintClick = () => {\r\n    appInsights.trackEvent({ name: 'Print waste calendar option selected' });\r\n    window.print();\r\n  };\r\n\r\n  const RoundComponent = ({ collection }) => {\r\n    let RoundIcon;\r\n    let classes = 'bin-collections-lookup__calendar__months__month__collection ';\r\n\r\n    switch (collection.roundType) {\r\n      case 'REFUSE':\r\n        RoundIcon = RefuseIconComponent;\r\n        classes += 'bin-collections-lookup__calendar__months__month__collection--refuse';\r\n        break;\r\n      case 'RECYCLING':\r\n        RoundIcon = RecyclingIconComponent;\r\n        classes += 'bin-collections-lookup__calendar__months__month__collection--recycling';\r\n        break;\r\n      case 'GARDEN':\r\n        RoundIcon = GardenIconComponent;\r\n        classes += 'bin-collections-lookup__calendar__months__month__collection--garden';\r\n        break;\r\n      default:\r\n        RoundIcon = () => <span>{collection.roundType}</span>;\r\n        break;\r\n    }\r\n\r\n    return (\r\n      <div className={classes} title={`${constants.collectionTypeTitles[collection.roundType]} collection`}>\r\n        <span className=\"bin-collections-lookup__calendar__months__month__day\">{collection.date.format('ddd DD')}</span>\r\n        <span className=\"bin-collections-lookup__calendar__months__month__round-type\">\r\n          <RoundIcon />\r\n        </span>\r\n      </div>\r\n    );\r\n  };\r\n\r\n  const KeyComponent = ({ media }) => (\r\n    <div className={`bin-collections-lookup__calendar__key bin-collections-lookup__calendar__key--${media}`}>\r\n      <div className=\"bin-collections-lookup__calendar__key__refuse\">\r\n        <span>Household waste collection</span>\r\n        <RefuseIconComponent />\r\n      </div>\r\n      <div className=\"bin-collections-lookup__calendar__key__recycling\">\r\n        <span>Recycling collections</span>\r\n        <RecyclingIconComponent />\r\n      </div>\r\n      <div className=\"bin-collections-lookup__calendar__key__garden\">\r\n        <span>Garden waste collections</span>\r\n        <GardenIconComponent />\r\n      </div>\r\n    </div>\r\n  );\r\n\r\n  const RoundChangesWarningComponent = ({ media }) => (\r\n    <h2\r\n      className={`bin-collections-lookup__round-changes-warning bin-collections-lookup__round-changes-warning--${media}`}>\r\n      Please note: this schedule is subject to change, owing to process updates, collection requirements, availability\r\n      of resources, or inclement weather.\r\n    </h2>\r\n  );\r\n\r\n  return (\r\n    <div className=\"bin-collections-lookup__calendar\">\r\n      {loading && (\r\n        <div className=\"network-loader cyc-box network-loader--loading\">\r\n          <i>Retrieving bin calendar data...</i>\r\n        </div>\r\n      )}\r\n      {loading === false && (\r\n        <>\r\n          <RoundChangesWarningComponent media=\"screen\" />\r\n          <ButtonComponent\r\n            className={`${ButtonClasses.primary} bin-collections-lookup__calendar__print-button float-right`}\r\n            onClick={() => setShowSimpleCalendar(!showSimpleCalendar)}>\r\n            {showSimpleCalendar ? 'Colour version' : 'Text only version'}\r\n          </ButtonComponent>\r\n          <ButtonComponent\r\n            className={`${ButtonClasses.primary} bin-collections-lookup__calendar__print-button float-right`}\r\n            onClick={handlePrintClick}>\r\n            Print\r\n          </ButtonComponent>\r\n          {/* Standard collection calendar view */}\r\n          {showSimpleCalendar === false && (\r\n            <>\r\n              <KeyComponent media=\"screen\" />\r\n              <div className=\"bin-collections-lookup__calendar__months\">\r\n                {/* This is to enable screen reader navigation by heading, invisible in the UI */}\r\n                <h2 style={{ display: 'none' }}>Bin collection calendar</h2>\r\n                {collections &&\r\n                  collections.map((month, monthKey) => (\r\n                    <div className=\"bin-collections-lookup__calendar__months__month\" key={monthKey}>\r\n                      <h3>{month[0].date.format('MMM YYYY')}</h3>\r\n                      {month.map((collection, collectionKey) => (\r\n                        <div key={collectionKey}>\r\n                          <RoundComponent collection={collection} />\r\n                        </div>\r\n                      ))}\r\n                    </div>\r\n                  ))}\r\n              </div>\r\n              <KeyComponent media=\"print\" />\r\n            </>\r\n          )}\r\n        </>\r\n      )}\r\n      <RoundChangesWarningComponent media=\"print\" />\r\n      {/* Simple text only version of calendar view */}\r\n      {loading === false && showSimpleCalendar === true && (\r\n        <>\r\n          {collections &&\r\n            collections.map((month, monthKey) => (\r\n              <div key={month[0].date.toString()}>\r\n                <h3>\r\n                  <strong>{month[0].date.format('MMMM YYYY')}</strong>\r\n                </h3>\r\n                <ul>\r\n                  {month.map((collection, collectionKey) => (\r\n                    <li key={collectionKey}>\r\n                      {collection.date.format('dddd, Do MMMM YYYY')} - <strong>{collection.roundType}</strong>\r\n                    </li>\r\n                  ))}\r\n                </ul>\r\n              </div>\r\n            ))}\r\n        </>\r\n      )}\r\n      {loading === false && (\r\n        <div className=\"bin-collections-lookup__calendar__help-links\">\r\n          <p>See also</p>\r\n          <ul>\r\n            <li>\r\n              Check <Link to={binCollectionsRoot}>waste collection details for a different address</Link>\r\n            </li>\r\n            <li>\r\n              Find out more about our <a href=\"https://www.york.gov.uk/WasteAndRecycling\">Waste Services</a>\r\n            </li>\r\n          </ul>\r\n        </div>\r\n      )}\r\n      <div className=\"bin-collections-lookup__calendar__footer\">\r\n        <div className=\"bin-collections-lookup_calendar__footer__message\">\r\n          <strong>Important information:</strong> Putting your waste out incorrectly can cause problems; check\r\n          collection details for <a href=\"https://www.york.gov.uk/HouseholdWaste\">household waste collections</a>,{' '}\r\n          <a href=\"https://www.york.gov.uk/RecyclingCollections\">recycling collections</a>, and{' '}\r\n          <a href=\"https://www.york.gov.uk/GardenWaste\">garden waste collections</a>, and{' '}\r\n          <strong>always put containers out by 7am.</strong>\r\n        </div>\r\n        <div className=\"bin-collections-lookup_calendar__footer__icon\">\r\n          <img src={RecycleLogo} alt=\"Recycle for York icon\" />\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default BinCalendarComponent;\r\n","import React from 'react';\r\nimport BinCalendarComponent from '../../../common/components/bin-collections/bin-calendar.component';\r\nimport { MyAccountPageComponent, PageHeaderComponent } from '../../../common';\r\n\r\nconst MyCalendarContainer = () => {\r\n  return (\r\n    <React.Fragment>\r\n      <PageHeaderComponent text=\"My collection calendar\" />\r\n      <MyAccountPageComponent className=\"bin-collections-lookup\">\r\n        <BinCalendarComponent></BinCalendarComponent>\r\n      </MyAccountPageComponent>\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nexport default MyCalendarContainer;\r\n","import React from 'react';\r\nimport { Route, Routes } from 'react-router-dom';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\n\r\nimport { clientMyAccountUrl, NotFoundComponent, MyCollections, isEnabled } from '../common';\r\nimport MyCollectionsContainer from './my-collections/containers/my-collections.container';\r\nimport MyCalendarContainer from './my-collections/containers/my-calendar.container';\r\nimport WithAuthentication from 'common/components/with-authentication/with-authentication.component';\r\n\r\nconst RefuseAndRecyclingRouter = () => (\r\n  <WithAuthentication>\r\n    <Routes>\r\n      {isEnabled(FeatureFlagsService.getFeatureFlagByName(MyCollections)) ? (\r\n        <>\r\n          <Route path={clientMyAccountUrl.refuseAndRecycling.myCollections} element={<MyCollectionsContainer />} />\r\n          <Route path={`${clientMyAccountUrl.refuseAndRecycling.myCalendar}/:uprn`} element={<MyCalendarContainer />} />\r\n        </>\r\n      ) : null}\r\n\r\n      <Route path=\"/\" element={<NotFoundComponent />} />\r\n    </Routes>\r\n  </WithAuthentication>\r\n);\r\n\r\nexport default RefuseAndRecyclingRouter;\r\n","import React, { useRef, useEffect, useState } from 'react';\r\nimport { useSearchParams, useNavigate } from 'react-router-dom';\r\n\r\nimport { clientMyAccountUrl } from 'common';\r\n\r\nconst ParkingCustomerDetails = () => {\r\n  const formRef = useRef();\r\n  const [formData, setFormData] = useState({\r\n    fullCustomerDetails: '',\r\n    hashedFullCustomerDetails: '',\r\n  });\r\n  const [searchParams] = useSearchParams();\r\n  const navigate = useNavigate();\r\n\r\n  // For initial loading of the page\r\n  useEffect(() => {\r\n    // get form data from query params\r\n    const hash = searchParams.get('hash');\r\n    const xml = searchParams.get('xml');\r\n\r\n    if (!hash || !xml) {\r\n      navigate(clientMyAccountUrl.dashboard);\r\n      return;\r\n    }\r\n\r\n    setFormData({\r\n      fullCustomerDetails: xml,\r\n      hashedFullCustomerDetails: hash,\r\n    });\r\n  }, []);\r\n\r\n  // When the form data is populated, we can assume the client is ready to post to WSP\r\n  useEffect(() => {\r\n    if (formData.fullCustomerDetails !== '' && formData.hashedFullCustomerDetails !== '') {\r\n      formRef.current.submit();\r\n    }\r\n  }, [formData]);\r\n\r\n  return (\r\n    <form\r\n      ref={formRef}\r\n      action=\"https://york.tarantopermits.com/customerDetails\"\r\n      method=\"post\"\r\n      id=\"authenticated--form-submit\">\r\n      <input type=\"hidden\" id=\"FullCustomerDetails\" name=\"FullCustomerDetails\" value={formData.fullCustomerDetails} />\r\n      <input\r\n        type=\"hidden\"\r\n        id=\"HashedFullCustomerDetails\"\r\n        name=\"HashedFullCustomerDetails\"\r\n        value={formData.hashedFullCustomerDetails}\r\n      />\r\n    </form>\r\n  );\r\n};\r\n\r\nexport default ParkingCustomerDetails;\r\n","import React from 'react';\r\nimport { withFormik, Form } from 'formik';\r\n\r\nimport { AddressLookupContainer, BinCollectionsContainer, msgConstants, clientMyAccountUrl } from 'common';\r\n\r\nimport * as constants from '../../common/constants/bin-collections.constants';\r\n\r\nconst BinCollectionsLookupContainer = ({ setFieldValue, setFieldTouched, setErrors, touched, errors, values }) => {\r\n  const handleAddressChange = async (address, outOfYork) => {\r\n    setFieldValue('uprn', address.uprn, true);\r\n    setFieldValue('address', address.shortAddress, true);\r\n    setFieldValue('selectedAddress', address, true);\r\n    setFieldValue('outOfYork', outOfYork);\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <p>{constants.ServiceDescription}</p>\r\n      <Form>\r\n        <AddressLookupContainer\r\n          className=\"bin-collections-lookup__address-lookup\"\r\n          touched={touched}\r\n          errors={errors}\r\n          onAddressChange={handleAddressChange}\r\n          onAddressSearch={(data) => {\r\n            if (data.results === null || data.results.length < 1) {\r\n              setFieldTouched('postcode', true, false);\r\n              setFieldTouched('address', false, false);\r\n              setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n            } else {\r\n              setFieldValue('addressSource', data.source, false);\r\n              setFieldTouched('postcode', true, true);\r\n              setFieldTouched('address', false, false);\r\n            }\r\n          }}\r\n          onValidationError={(type) => {\r\n            setFieldTouched('postcode', true, false);\r\n            setFieldTouched('address', true, false);\r\n\r\n            if (type === 'REQUIRED') {\r\n              setErrors({ postcode: msgConstants.NO_POSTCODE_MESSAGE });\r\n            }\r\n            if (type === 'INVALID') {\r\n              setErrors({ postcode: msgConstants.INVALID_POSTCODE_MESSAGE });\r\n            }\r\n          }}\r\n        />\r\n      </Form>\r\n      {values.outOfYork === true && (\r\n        <div className=\"bin-collections-lookup__loader\">\r\n          <p>We can't show you data for this premise</p>\r\n          <p>This address is not in York and we can't show you collection details for it.</p>\r\n        </div>\r\n      )}\r\n      {values.outOfYork === false && values.uprn && values.uprn.length > 0 && (\r\n        <BinCollectionsContainer\r\n          uprn={values.uprn}\r\n          calendarUrl={clientMyAccountUrl.binCollections.calendarWithRoute}></BinCollectionsContainer>\r\n      )}\r\n    </>\r\n  );\r\n};\r\n\r\nexport default withFormik({})(BinCollectionsLookupContainer);\r\n","import React from 'react';\r\nimport { Route, Routes } from 'react-router-dom';\r\n\r\nimport { PageHeaderComponent, MyAccountPageComponent, DocumentTitleComponent, clientMyAccountUrl } from 'common';\r\n\r\nimport * as constants from '../common/constants/bin-collections.constants';\r\n\r\nimport BinCollectionsLookupContainer from './containers/bin-collections-lookup.container';\r\nimport BinCalendarComponent from '../common/components/bin-collections/bin-calendar.component';\r\n\r\nconst BinCollectionsApp = () => {\r\n  return (\r\n    <>\r\n      <PageHeaderComponent text={constants.AppName} icon=\"icon-waste-and-recycling\" />\r\n      <DocumentTitleComponent title={constants.AppName} />\r\n      <MyAccountPageComponent className=\"bin-collections-lookup\">\r\n        <Routes>\r\n          <Route path=\"/\" element={<BinCollectionsLookupContainer />} />\r\n          <Route path={`${clientMyAccountUrl.binCollections.calendar}/:uprn`} element={<BinCalendarComponent />} />\r\n        </Routes>\r\n      </MyAccountPageComponent>\r\n    </>\r\n  );\r\n};\r\n\r\nexport default BinCollectionsApp;\r\n","import React from 'react';\r\nimport { Route, Navigate, Routes } from 'react-router-dom';\r\nimport { FeatureFlagsService } from 'cyc-configuration-service';\r\nimport { AccountRouterComponent } from '../account';\r\nimport RegistrationApp from '../registration/registration.app';\r\nimport { WebChatDetailsRouterComponent, WebChatRedirect } from '../web-chat-details';\r\nimport MyReportsApp from '../my-reports/my-reports.app';\r\nimport {\r\n  clientMyAccountUrl as urls,\r\n  binCollectionsRoot,\r\n  ErrorPageComponent,\r\n  incidentFormRoot,\r\n  NotFoundComponent,\r\n  refuseAndRecyclingRoot,\r\n  isEnabled,\r\n  RefuseAndRecycling,\r\n  ParkingPortalErrorPageComponent,\r\n  ParkingServices,\r\n  MyCollections,\r\n  TestingPage,\r\n} from '../common';\r\nimport HomePageContainer from '../dashboard/containers/home/home-page.container';\r\nimport SignInRouter from '../sign-in/sign-in.router';\r\nimport { TestingApp } from '../testing';\r\nimport IncidentFormRouter from '../incident-forms/incident-form.router';\r\nimport RefuseAndRecyclingRouter from '../refuse-and-recycling/refuse-and-recycling.router';\r\nimport ParkingCustomerDetails from 'parking-services/parking-portal-customer-details.component';\r\nimport BinCollectionsApp from '../bin-collections/bin-collections.app';\r\n\r\nconst SiteRouter = () => {\r\n  return (\r\n    <Routes>\r\n      <Route path=\"/\" element={<Navigate to={urls.dashboard} />} />\r\n      <Route path={urls.dashboard} element={<HomePageContainer />} />\r\n      <Route path={`${urls.registration.root}/*`} element={<RegistrationApp />} />\r\n      <Route path={`${urls.myReports.root}/*`} element={<MyReportsApp />} />\r\n      <Route path={urls.error} element={<ErrorPageComponent />} />\r\n      {isEnabled(FeatureFlagsService.getFeatureFlagByName(TestingPage)) ? (\r\n        <Route path={urls.testing.root} element={<TestingApp />} />\r\n      ) : null}\r\n      <Route path={`${urls.account.root}/*`} element={<AccountRouterComponent />} />\r\n      <Route path={urls.signIn} element={<SignInRouter />} />\r\n      <Route path={`${incidentFormRoot}/*`} element={<IncidentFormRouter />} />\r\n\r\n      <Route path={`${urls.webchat.root}/*`} element={<WebChatRedirect url={'https://www.york.gov.uk/ContactUs'} />} />\r\n\r\n      {/* Web chat is currently turned off and redirecting to the ContactUs page (line above)  */}\r\n      {/* <Route path={`${urls.webchat.root}/*`} element={<WebChatDetailsRouterComponent />} /> */}\r\n\r\n      {isEnabled(FeatureFlagsService.getFeatureFlagByName(RefuseAndRecycling)) ? (\r\n        <Route path={`${refuseAndRecyclingRoot}/*`} element={<RefuseAndRecyclingRouter />} />\r\n      ) : null}\r\n      <Route path={urls.parkingPortalErrorPage} element={<ParkingPortalErrorPageComponent />} />\r\n\r\n      {isEnabled(FeatureFlagsService.getFeatureFlagByName(MyCollections)) && (\r\n        <Route path={`${binCollectionsRoot}/*`} element={<BinCollectionsApp />} />\r\n      )}\r\n      {isEnabled(FeatureFlagsService.getFeatureFlagByName(ParkingServices)) && (\r\n        <Route path=\"/GetCustomerDetails\" element={<ParkingCustomerDetails />} />\r\n      )}\r\n\r\n      <Route path=\"*\" element={<NotFoundComponent />} />\r\n    </Routes>\r\n  );\r\n};\r\n\r\nexport default SiteRouter;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport './confirm-dialog.component.scss';\r\nimport { ButtonComponent, ButtonClasses } from 'cyc-react-ui-components';\r\n\r\n/**\r\n * A simple confirm dialog wcomponent\r\n *\r\n * props\r\n * @param {function} onClose - Callback for when the dialog is closed\r\n * @param {bool} isOpen - Whether dialog is open\r\n * @param {string=} confirmText - overrides the default confirmation button text\r\n * @param {string=} cancelText - overrides the default cancel button text\r\n * @param {string} title - The title text for the dialog\r\n *\r\n */\r\nconst ConfirmDialog = (props) => {\r\n  const { onClose, isOpen, confirmText, cancelText, title, children } = props;\r\n\r\n  const handleConfirm = () => {\r\n    onClose(true);\r\n  };\r\n\r\n  const handleCancel = () => {\r\n    onClose(false);\r\n  };\r\n\r\n  return (\r\n    <React.Fragment>\r\n      {isOpen && (\r\n        <div className=\"dialog-background\">\r\n          <div className=\"dialog\">\r\n            <div className=\"dialog__header\">\r\n              <h2>{title}</h2>\r\n            </div>\r\n            <div className=\"dialog__body\">{children}</div>\r\n            <div>\r\n              <ButtonComponent onClick={handleConfirm} type=\"button\" className={ButtonClasses.primary + ' float-right'}>\r\n                {confirmText || 'Yes'}\r\n              </ButtonComponent>\r\n              <ButtonComponent onClick={handleCancel} type=\"button\" className=\"float-left\">\r\n                {cancelText || 'No'}\r\n              </ButtonComponent>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      )}\r\n    </React.Fragment>\r\n  );\r\n};\r\n\r\nConfirmDialog.propTypes = {\r\n  isOpen: PropTypes.bool.isRequired,\r\n  title: PropTypes.string.isRequired,\r\n  confirmText: PropTypes.string,\r\n  cancelText: PropTypes.string,\r\n  onClose: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default ConfirmDialog;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport ConfirmDialog from './confirm-dialog.component';\r\n\r\n/**\r\n * A dialog for displaying when a session is about to timeout.\r\n *\r\n * props\r\n * @param {Boolean} isOpen - Whether to show the AutoLogoutDialog\r\n * @param {number} timeRemaining - How long before the session will timeout in seconds\r\n * @param {function} onClose - The callback for when the dialog is closed (return bool)\r\n */\r\nconst AutoLogoutDialog = (props) => {\r\n  const remainingSeconds = `${props.timeRemaining} ${props.timeRemaining === 1 ? 'second' : 'seconds'}`;\r\n\r\n  if (props.timeRemaining < 1 && props.isOpen === true) {\r\n    props.onClose(false);\r\n  }\r\n\r\n  return (\r\n    <ConfirmDialog title=\"Session timing out\" isOpen={props.isOpen} onClose={props.onClose}>\r\n      <p>\r\n        Your session is about to time out due to inactivity. For security reasons you will be logged out in{' '}\r\n        <strong>{remainingSeconds}</strong>\r\n      </p>\r\n      <p>Do you want to continue your session?</p>\r\n    </ConfirmDialog>\r\n  );\r\n};\r\n\r\nAutoLogoutDialog.propTypes = {\r\n  isOpen: PropTypes.bool.isRequired,\r\n  timeRemaining: PropTypes.number.isRequired,\r\n  onClose: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default AutoLogoutDialog;\r\n","// Live\r\nexport const myAccountSessionConstants = {\r\n  duration: [15, 'minutes'],\r\n  rateLimit: [3, 'minutes'],\r\n  warningDuration: [30, 'seconds'],\r\n  eventListeners: ['click', 'keyup', 'mousemove', 'scroll'],\r\n};\r\n\r\n// Test\r\n// export const myAccountSessionConstants = {\r\n//     duration: [20, 'seconds'],\r\n//     rateLimit: [5, 'seconds'],\r\n//     warningDuration: [10, 'seconds'],\r\n//     eventListeners: ['click', 'keyup', 'mousemove', 'scroll']\r\n// };\r\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { ConfigurationService, FeatureFlagsService } from 'cyc-configuration-service';\r\nimport appInsights, { SeverityLevel } from 'cyc-application-insights-react';\r\nimport { CYCServices } from 'cyc-services';\r\nimport { createBrowserHistory } from 'history';\r\nimport { name as app_name, version as app_version } from '../package.json';\r\n\r\nimport registerServiceWorker, { unregister } from './registerServiceWorker';\r\nimport {\r\n  FooterComponent,\r\n  clientMyAccountUrl,\r\n  ErrorBoundaryComponent,\r\n  cycConfigurationUrls,\r\n  isEnabled,\r\n  SiteLoaderComponent,\r\n  DownForMaintenance,\r\n} from './common';\r\n\r\nimport HeaderComponent from 'common/components/header/header.component';\r\nimport SiteRouter from './site-router/site.router';\r\nimport AutoLogoutDialog from './common/components/dialog/auto-logout-dialog.component';\r\nimport sessionActivityService from './common/services/session-activity.service';\r\nimport { myAccountSessionConstants } from './common/constants/my-account-session.constants';\r\n\r\nimport MaintenanceApp from './maintenance/maintenance.app';\r\n\r\nimport './app.scss';\r\n\r\nconst App = () => {\r\n  let history = createBrowserHistory();\r\n  const location = useLocation();\r\n  const navigate = useNavigate();\r\n  const [configurationLoaded, setConfigurationLoaded] = useState(false);\r\n  const [featureFlagsLoaded, setFeatureFlagsLoaded] = useState(false);\r\n  const [downForMaintenance, setDownForMaintenance] = useState(false);\r\n  const [session, setSession] = useState({ isTimingOut: false, timeRemaining: -1 });\r\n\r\n  const message = app_name + ': v' + app_version;\r\n  console.log(message);\r\n\r\n  const resetSessionState = () => {\r\n    setSession({\r\n      isTimingOut: false,\r\n      timeRemaining: -1,\r\n    });\r\n  };\r\n\r\n  // Reset the session activity state\r\n  const handleSessionRefresh = useCallback(async () => {\r\n    // Renew the session token\r\n    const url = `${ConfigurationService.store.apiUrl}/api/Account/JwtRenew`;\r\n    await CYCServices.JWTAuth.renewToken(url);\r\n\r\n    sessionActivityService.refresh();\r\n    resetSessionState();\r\n  }, []);\r\n\r\n  // Called from the sessionActivityService with the number of seconds remaining before timing out\r\n  const handleSessionWarning = (timeRemaining) => {\r\n    setSession({\r\n      isTimingOut: true,\r\n      timeRemaining: timeRemaining,\r\n    });\r\n  };\r\n\r\n  const handleLogOut = useCallback(() => {\r\n    sessionActivityService.end();\r\n    resetSessionState();\r\n\r\n    const signOutPath = `${ConfigurationService.store.apiUrl}/api/Account/Logout`;\r\n    CYCServices.JWTAuth.signOut(signOutPath);\r\n    navigate(clientMyAccountUrl.signIn);\r\n  }, []);\r\n\r\n  // The method called from AutoLogoutDialog when either the buttons are clicked\r\n  // or the remainingTime prop is less than 1\r\n  const handleAutoLogoutDialogClose = (result) => {\r\n    if (result === true) {\r\n      handleSessionRefresh();\r\n    } else {\r\n      handleLogOut();\r\n    }\r\n  };\r\n\r\n  const AppStatus = useMemo(\r\n    () => () => {\r\n      if (downForMaintenance) {\r\n        return <MaintenanceApp />;\r\n      } else if (configurationLoaded === true && featureFlagsLoaded === true) {\r\n        return <SiteRouter />;\r\n      }\r\n      return <SiteLoaderComponent />;\r\n    },\r\n    [downForMaintenance, configurationLoaded, featureFlagsLoaded]\r\n  );\r\n\r\n  useEffect(() => {\r\n    const initialiseApp = async () => {\r\n      try {\r\n        // Set up the session activity service & initialise it\r\n        const sessionOptions = {\r\n          duration: myAccountSessionConstants.duration,\r\n          rateLimit: myAccountSessionConstants.rateLimit,\r\n          warningDuration: myAccountSessionConstants.warningDuration,\r\n          refreshCallback: handleSessionRefresh,\r\n          warningCallback: handleSessionWarning,\r\n          timedOutCallback: handleLogOut,\r\n          eventListeners: myAccountSessionConstants.eventListeners,\r\n        };\r\n        sessionActivityService.initialise(sessionOptions);\r\n\r\n        // Start Debug\r\n        console.log('my-account CYC Config Set: ', process.env.REACT_APP_CYC_CONFIGURATION_SET);\r\n        // End Debug\r\n\r\n        await ConfigurationService.load(\r\n          `${process.env.REACT_APP_CYC_CONFIGURATION_URL}`,\r\n          'configuration',\r\n          process.env.REACT_APP_CYC_CONFIGURATION_SET\r\n        );\r\n        appInsights.initialize(history, ConfigurationService.store.applicationInsightsKey, defaults);\r\n\r\n        await FeatureFlagsService.load(\r\n          `${process.env.REACT_APP_CYC_FEATURE_FLAGS_URL}${cycConfigurationUrls.features}`,\r\n          'my-account',\r\n          process.env.REACT_APP_CYC_FEATURE_FLAGS_SET\r\n        );\r\n        // If the user is authenticated then begin the sessionActivityService\r\n        if (CYCServices.JWTAuth.isAuthenticated()) {\r\n          sessionActivityService.begin();\r\n        }\r\n\r\n        setConfigurationLoaded(true);\r\n        setFeatureFlagsLoaded(true);\r\n        setDownForMaintenance(isEnabled(FeatureFlagsService.getFeatureFlagByName(DownForMaintenance)));\r\n\r\n        if (ConfigurationService.store.registerServiceWorker === true) {\r\n          registerServiceWorker();\r\n        } else {\r\n          unregister();\r\n        }\r\n\r\n        const defaults = { severityLevel: SeverityLevel.Error };\r\n\r\n        appInsights.trackEvent({ name: 'My Account initialized' });\r\n      } catch (err) {\r\n        if (appInsights.initialized) {\r\n          // Error is to do with feature flags because if it was configuration then app insights wouldnt even load...\r\n          appInsights.trackException({\r\n            exception: new Error('Uncaught exception when loading feature flag service'),\r\n            properties: { err },\r\n          });\r\n        }\r\n        setConfigurationLoaded(true);\r\n        setFeatureFlagsLoaded(true);\r\n      }\r\n    };\r\n    initialiseApp();\r\n    return () => sessionActivityService.remove();\r\n  }, [handleLogOut, handleSessionRefresh]);\r\n\r\n  useEffect(() => {\r\n    if (featureFlagsLoaded === true) {\r\n      // We reload to we ensure we get the newest values from the api.\r\n      FeatureFlagsService.load(\r\n        `${process.env.REACT_APP_CYC_FEATURE_FLAGS_URL}${cycConfigurationUrls.features}`,\r\n        'my-account',\r\n        process.env.REACT_APP_CYC_FEATURE_FLAGS_SET\r\n      )\r\n        .then(() => setDownForMaintenance(isEnabled(FeatureFlagsService.getFeatureFlagByName(DownForMaintenance))))\r\n        .catch((err) => {\r\n          if (appInsights.initialized) {\r\n            // Error is to do with feature flags because if it was configuration then app insights wouldnt even load...\r\n            appInsights.trackException({\r\n              exception: new Error('Uncaught exception when loading feature flag service'),\r\n              properties: { err },\r\n            });\r\n          }\r\n        });\r\n    }\r\n  }, [location, featureFlagsLoaded, handleLogOut, handleSessionRefresh]);\r\n\r\n  return (\r\n    <ErrorBoundaryComponent>\r\n      <header id=\"pageTop\">\r\n        <HeaderComponent onLogOut={handleLogOut} />\r\n      </header>\r\n      <main className=\"mainBody\">\r\n        <AppStatus />\r\n      </main>\r\n      <footer>\r\n        <FooterComponent />\r\n      </footer>\r\n      <AutoLogoutDialog\r\n        isOpen={session.isTimingOut}\r\n        timeRemaining={session.timeRemaining}\r\n        onClose={handleAutoLogoutDialogClose}\r\n      />\r\n    </ErrorBoundaryComponent>\r\n  );\r\n};\r\n\r\nexport default App;\r\n","import 'react-app-polyfill/ie11'; // For IE 11 support - needed for window.fetch pollyfill\r\nimport 'core-js/stable';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\n\r\nimport './resources/styles/cyc-styles.scss';\r\nimport 'cyc-react-ui-components/public/index.css';\r\n\r\nimport App from './app';\r\n\r\nReactDOM.render(\r\n  <BrowserRouter>\r\n    <App />\r\n  </BrowserRouter>,\r\n  document.getElementById('root')\r\n);\r\n\r\n// Enable WCAG / accessibility checking in developer environments\r\n// Problems will be output to the dev tools console\r\nif (process.env.NODE_ENV !== 'production') {\r\n  console.log(\r\n    'Accessibility checking is enabled, problems will be logged to console. You can disable this in the root index.js file'\r\n  );\r\n  const axe = require('@axe-core/react');\r\n  axe(React, ReactDOM, 1000);\r\n}\r\n"],"sourceRoot":""}