{"version":3,"sources":["i18n.ts","services/axios.service.ts","services/api-errors/error-types.ts","types.ts","config.ts","services/api-errors/factory.ts","services/http.service.ts","services/request-params.service.ts","helpers/build-route-with-params.ts","services/api-errors/api-errors-impl.ts","services/api-errors/api-catch.ts","endpoints/BaseEndpoint.ts","endpoints/SettingsEndpoint.ts","services/selection-guests-service.ts","services/selection-calendar-date.service.ts","stores/selection.store.ts","services/local-storage.service.ts","utils.ts","stores/commercials.store.ts","stores/pending-booking.store.ts","services/facebook-pixel.service.ts","services/language-switcher.service.ts","stores/module-settings.store.ts","requests/settings.request.ts","components/language-switcher/language-switcher.tsx","services/create-pending-booking.service.ts","endpoints/PendingBooking.ts","requests/pending-booking.requests.ts","components/action-button/action-button.tsx","helpers/set-inner-html.ts","components/update-banner/update-banner.tsx","components/header/header.tsx","components/confirmation/confirmation-validation/reservation-status.tsx","services/booking-service.ts","components/confirmation/confirmation-validation/booking-summary.tsx","stores/booking.store.ts","components/footer/LogoRR.tsx","components/confirmation/confirmation-validation/rr-message.tsx","components/loader/loader.tsx","components/continue-button/button-link-style.tsx","components/continue-button/button-default-style.tsx","components/continue-button/continue-button.tsx","endpoints/BookingEndpoint.ts","requests/booking.requests.ts","components/title/title.tsx","components/confirmation/confirmation-validation/share-reservation.tsx","services/tag-manager.service.ts","theme-manager/theme-manager.ts","endpoints/TagManagerEndpoint.ts","requests/tag-manager.request.ts","theme-manager/Theme.ts","helpers/set-color.ts","components/rounded-icon/rounded-icon.tsx","components/information-text/information-text.tsx","components/confirmation/confirmation-validation/confirmation-validation.tsx","assets/images/user-group.tsx","components/input-with-icon/input-with-icon.tsx","services/commercials.service.ts","components/summary-criteria/summary-criteria.tsx","components/confirmation/confirmation-contact-form/gol-contact-error-field.tsx","components/confirmation/confirmation-contact-form/gol-contact-text-field.tsx","components/confirmation/confirmation-contact-form/gol-contact-form-interfaces.tsx","components/confirmation/confirmation-contact-form/gol-contact-name-field.tsx","assets/json/countries.tsx","components/confirmation/confirmation-contact-form/gol-autocomplete.tsx","components/confirmation/confirmation-contact-form/gol-country-picker.tsx","components/confirmation/confirmation-contact-form/gol-contact-phone-field.tsx","components/confirmation/confirmation-contact-form/gol-contact-css.tsx","components/confirmation/confirmation-contact-form/gol-check-field.tsx","components/errors/message-error-view.tsx","components/dropdown/dropdown.tsx","components/confirmation/confirmation-contact-form/gol-contact-gender-selection.tsx","services/contact-info-service.ts","components/confirmation/confirmation-contact-form/confirmation-contact-form.tsx","components/confirmation/confirmation-payment/checkout-form.tsx","components/confirmation/confirmation-payment/confirmation-payments.tsx","components/confirmation/confirmation-commit-pending-booking.tsx","components/confirmation/summary/summary-commercial-item.tsx","components/tooltip/tooltip.tsx","components/voucher/voucher-item.tsx","components/confirmation/summary/summary.tsx","endpoints/ReCaptchaEndpoint.ts","requests/recaptcha.requests.ts","components/confirmation/confirmation-layout.tsx","components/confirmation/refresh-on-payment/refresh-on-payment.tsx","components/confirmation/confirmation-router/confirmation-router.tsx","contexts/commercial-context.tsx","components/background-circle-button/background-circle-button.tsx","components/voucher/voucher-input.tsx","components/details/details-vouchers/details-vouchers.tsx","components/commercials/commercial-title.tsx","components/commercials/commercial-text.tsx","services/commercial-service.ts","components/commercials/event/commercials-event-item.tsx","components/commercials/commercial-menu-offer-common.tsx","components/commercials/offer/commercials-offer-item.tsx","components/commercials/menu-offer-wrapper.tsx","components/commercials/menu/commercial-menu.tsx","components/commercials/menu/commercials-menu-item.tsx","components/commercials/menu/commercials-for-all-guests-menu-item.tsx","components/commercials/commercial-menus.tsx","components/commercials/commercials-display/commercials-display.tsx","components/commercials/commercials.tsx","components/general-message/general-message.tsx","assets/images/children-group.tsx","components/selection/slot-icons/slot-icons.tsx","components/selection/slot-item/slot-item.tsx","services/gol-event-handler.ts","services/selection-store-changes.service.ts","services/calendar-service.ts","components/calendar/day/day.tsx","components/calendar/gol-calendar/gol-day-picker-single-date-controller.tsx","components/calendar/gol-calendar/gol-calendar.tsx","endpoints/WithRestaurantIdEndpoint.ts","endpoints/DailyAvailabilitiesEndpoint.ts","components/calendar/daily-availabilities-fetcher.tsx","requests/daily_availabilities.requests.ts","components/calendar/calendar.tsx","components/selection/selection-guests/selection-guests.tsx","components/selection/selection-guests/selection-pax.tsx","components/calendar/calendar-legend-item/calendar-legend-item.tsx","components/calendar/calendar-legend/calendar-legend.tsx","components/selection/selection-calendar/selection-calendar.tsx","components/selection/time-section/time-section.tsx","components/selection/no-time-section/no-time-section.tsx","components/selection/selection-time/periods-view.tsx","components/selection/time-slot-legend/time-slot-legend.tsx","endpoints/PeriodsEndpoint.ts","services/area-service.ts","services/filters.service.ts","services/i-display-periods-builder.service.ts","requests/periods.requests.ts","components/selection/selection-time/selection-time.tsx","components/filters/filters.tsx","components/dropdown/dropdown-transform.ts","components/selection/selection-criteria/selection.tsx","components/selection/scroll-to-top/scroll-to-top.tsx","components/waiting-message/waiting-message.tsx","components/main-content/main-content.tsx","components/errors/api-error-view.tsx","components/loader/loader-dots.tsx","components/footer/Logo.tsx","components/footer/footer.tsx","components/main-layout/main-layout.tsx","components/app-properties/app-properties.tsx","components/errors/restaurant-error/restaurant-error.tsx","components/floating-button/floating-button.tsx","endpoints/ContactsEndpoint.ts","stores/contact.store.ts","requests/subscribe-to-newsletter.ts","components/newsletter/newsletter-form.tsx","components/newsletter/newsletter-main-content.tsx","components/newsletter/newsletter-main-layout.tsx","components/newsletter/newsletter.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["resources","ca","translation","LOCALE_CA","ch","LOCALE_CH","de","LOCALE_DE","ee","en","LOCALE_EN","es","fi","fr","it","ja","nl","no","ro","ru","se","i18n","use","initReactI18next","init","lng","process","supportedLngs","fallbackLng","load","interpolation","escapeValue","returnNull","returnEmptyString","AxiosService","ApiResourceCodeError","ApiErrorCode","ErrorType","AxiosClass","opts","from","axios","request","CommericalAction","Periods","config","baseUrl","baseApiUrl","token","apiVersion","appPlatform","minBackendVersion","baseImageUrl","routes","base","url","selection","commercials","confirmation","confirmationOnRefresh","confirmationEnd","floatingButton","newsletter","default_language","BookingState","AvailableCommercials","SelectionSteps","DayStatus","EngineMode","ButtonStyle","HeaderStyle","CommercialKeys","CommercialsObject","ExtraParams","Gender","male","female","male_and_female","periodsArray","Object","values","instance","httpService","RequestParamsService","referralKey","restaurantId","version","bookingId","bookingToken","preview","_referralKey","_restaurantId","_version","_token","_bookingId","_bookingToken","_preview","this","requestParamsImpl","_requestParamsService","_overwrittenParams","_hashParams","urlParams","searchParams","hashParams","undefined","get","moduleSettings","settingsAreDefined","getReferralKey","getRestaurantId","buildOverwrittenParams","buildHashParams","paxNumber","pax","Number","persons","isNaN","note","date","parsedMoment","moment","isValid","getLocaleForOverwrittenParams","_locale","locale","toLocaleLowerCase","area_id","time","first_name","last_name","email","country_code","mobile_phone","background_color","hide_general_terms","searchQuery","_this","entries","forEach","enumEntry","key","value","extraParamsKey","info","overwrittenParams","searchValue","requestParamsService","getParams","restaurantIdValue","referralKeyValue","buildRouteWithParams","route","displayQuery","requestParams","redirectUrl","computeSearchQueryForOverwrittenParams","ApiErrorImpl","error","response","status","code","data","unknown","errorCode","t","getMessagKey","restaurant_blank","restaurant_id_missing","ValidationErrorApiErrorImpl","_transKey","errorKey","getResourcesInError","AlreadyOnWaitingList","NoMoreMenuAvailable","NoMenuLeft","MenuSelectionRequested","menu","VoucherDetails","voucher_details","transKey","includes","LimitVouchersNumber","keys","capture_failed","payment_refused","setup_intent_invalid","stripe_customer_creation_failed","no_menu_left","ResourceNotFoundApiErrorImpl","menu_unfound","runtime_commercial_unfound","BadRequestApiErrorImpl","bad_request","pending_booking_creation_failed","message","AccessDeniedApiErrorImpl","isPartnerNameNeeded","partner_name","partnerName","access_denied","partnership_disabled","partnership_not_yet_created","UpdateFromBookingErrorImpl","Error","update_from_booking_error","SetupIntentApiErrorImpl","ApiErrorFactory","err","apiCatch","apiError","getApiError","Observable","observer","complete","Axios","HttpService","params","queryString","encodeURIComponent","endPoint","mergedParams","options","store","method","getEndpoint","headers","getHeaders","pipe","map","catchError","resp","getHttpService","apiBase","Endpoint","queryParams","endpoint","length","queryParam","queryParamName","queryParamValue","join","getModuleToken","SettingsEndpoint","SelectionGuestsService","_guestsCapacity","_isUpdateFromBooking","isUpdateFromBooking","selectOnlyPaxFirst","overwrittenPax","selectionStore","guests","booked_persons_number","settings","update_from_booking","children_number","children","defaultPersons","guestsCapacity","minGuests","i","childrenManagementEnabled","maxGuests","push","displayText","isSelected","childrenMaxAge","type","max_children_age","maxChildrenAge","selectedGuests","setTypeOfGuestsToString","getCapacity","service","SelectionCalendarDate","bookingDate","overwrittenDate","defaultDate","computeDefaultDate","calendarDate","startOf","bookingTime","overwrittenTime","defaultTime","computeDefaultTime","require","localStorageService","_date","_calendarDate","_time","_guests","_children","_period","_area","_selectedMenus","_menusCount","_selectedOffer","_backButtonClicked","selectedOfferChanged","Subject","selectionGuestsService","setDefaultSelectedGuest","selectionCalendarDateService","setDefaultDate","setDefaultTime","setDefaultAreaId","period","selectedOffer","selectedMenus","menusCount","areaId","overwrittenArea","area","computeDefaultAreaId","offer","changedMenuId","newQuantity","index","findIndex","menuId","count","reduce","prev","curr","engineMode","capacity","numberOfMonthToAdd","newCalendarDate","clone","add","momentDate","format","currentStep","subtract","guestNumber","childrenNumber","newDate","newTime","next","menus","newMenusCount","selectedPeriod","selectedArea","isClicked","localStorageKeys","LocalStorageService","defaultLocale","_navigatorLanguage","available_locales","navigator","language","slice","changeLanguage","getLanguageSwitcherService","localeForCountryCode","preferredLanguageCookie","overwrittenLocale","countries","switcherData","countryCodeForLocale","initLocalLanguage","getDefaultLocale","localStorage","getItem","toLowerCase","setItem","getLocalStorageService","numberFormat","currencyFormat","Intl","NumberFormat","style","currency","capitalize","string","charAt","toUpperCase","commercialsStore","_events","_offers","_menus","filter","for_all_guests","offers","events","pendingBookingStore","_pendingBooking","_stripeToken","_acceptTerms","_acceptAllergiesTerms","pendingBooking","booking_state","validated","bookingState","waiting","lang","golLocaleFromSwitcher","localeRestaurant","bookings_detail","encoded_note","_note","decodeURIComponent","prepayment","payment_kind","amount","voucher_enabled","allow_vouchers","menuIds","assign","id","accept","newPendingBooking","noteInfo","stripe_account","stripeAccountInfo","stripeAccount","loadStripe","stripe_key","contact_info","contactInfo","priceWithPrecision","getPrepaymentPriceWithPrecision","priceAndCurrency","getPendingBookingPrepaymentCurrency","delay","delayBeforeDepositCapture","daysToRemove","Math","floor","hoursToRemove","dateWithTime","Date","hour","hours","getHours","setHours","delayedDate","translationKey","getPendingBookingPrepaymentKind","prepaymentInfos","selected_menus","sameNumberMenu","statisfySameMenusPaxCounterMandatory","selectedMenuCounter","counter","quantity","vouchers","menu_selection_requested","menuSelectionRequested","same_number_menu","skip_prepayment_for_contact","hasSkippingGroupPpt","selectedMenu","commercial_id","_selectedMenuForAllGuests","selectedMenuForAllGuests","setMenuIdsAvailiable","individualMenuIds","individualMenus","recaptchaValue","autoConfig","debug","FacebookPixelService","facebookPixelModuleInitialized","hasConsent","externalPartner","facebook_pixel_id","ReactPixel","revokeConsent","grantConsent","languageSwitcherService","initialBookingCreated","moduleInitialized","initFromModuleSettings","String","restaurant","referral_key","setDefaultLocalLanguage","facebookPixelService","initFacebookPixel","URLSearchParams","document","location","search","callFromFloatingButton","name","min_persons","max_persons","endsWith","getGeneralInfoMessage","getPendingBookingMessage","isWaitingState","computeWaitingMessage","waiting_messages","translations","find","waitingMessage","loadWaitingMessageForLocale","restaurant_message","default_message","poweredByTexts","powered_by","powered_by_texts","poweredByText","text","errorMessages","error_message","errorMessage","renamingPeriod","periods","_periods","periods_translations","periodsTranslations","toLocaleString","test","setQueryParams","getModuleSettings","tap","terms","disclaimer_url","prepayment_disclaimer_url","privacy_policy_url","customFields","field","optional_contact_form_fields","partner_display_name","product_name","defaultRequiredFields","allow_blank_email","allow_multi_vouchers","online_booking_enabled","banner_url","background_picture_url","theme","bodyBackgroundColor","google_font","time_zone","areas","advanced_options","force_area_selection","areaIds","hide_filter_selection","has_group_skipping_prepayment","recaptcha_enabled","last_booking_date","primaryColor","select_only_pax_first","default_persons","reservation_responsable_enabled","delay_before_deposit_capture","display_allergies_field","external_partner","logo","children_management_enabled","children_max_age","isUpdateFromBookingError","booking_date","booking_time","tz","restaurantTimezone","isFrPlt","isTourArgentGroupRestaurant","redirection_link","LanguageSwitcherService","listeners","registerListener","listener","unregisterListeners","callListeners","countryCode","_supportedLngs","getAvailableLocales","localeForMoment","localeFromSwitcher","createPendingBooking","ChangeLanguage","styled","div","props","textColor","backgroundTransparentWhite","LanguageSwitcher","memo","useTranslation","selectedCountryCode","data-test","selectButtonClassName","selected","showSecondarySelectedLabel","showSelectedLabel","onSelect","alignOptionsToRight","fullWidth","customLabels","countryFlagLabel","optionsSize","PendingBookingEndpoint","UpdatePendingBookingFromBookingEndPoint","UpdatePendingBookingEndpoint","pendingBookingId","PendingBookingValidateGiftCodeEndpoint","PendingBookingRemoveVoucher","PendingBookingAddOfferEndpoint","PendingBookingRemoveOfferEndpoint","PendingBookingAddMenuEndpoint","PendingBookingRemoveMenuEndpoint","CommitPendingBooking","CreatePendingBookingService","user_locale","restaurant_id","overwrittenNote","createInitialPendingBookingRequest","createInitialPendingBooking","booking_token","post","cancelPendingBookingRequest","_id","delete","commitPendingBooking","pending_booking_id","stripe_token","put","ActionButtonLoad","a","textColorDarken","ActionButtonLink","Link","ActionButton","handleOnClick","cancelPB","resetBookingState","handleClick","content","action","to","onClick","ArrowBackIos","href","Close","handleContent","setDangerouslyInnerHtml","translationParams","__html","UpdateBannerWrapper","informationTextBackgroundColor","UpdateBanner","updateFromBooking","timezone","dangerouslySetInnerHTML","setMessage","setParams","HeaderWrapper","headerHeight","headerStyle","headerBackgroundColor","invertFontColor","fontFamily","LanguageSwitcherWrapper","ReserveOnline","displayPointer","RestaurantLogo","img","CloseButton","Header","restaurantName","getRestaurantName","restaurantLogoUrl","useLocation","goHome","pathname","onHeaderClick","src","alt","StatusWrapper","StatusText","success","ReservationStatus","statusColor","rank","waiting_rank","className","BookingService","firstname","lastname","civility","element","_service","SummaryWrapper","backgroundColor","BookingSummary","contact","bookingService","displayName","bookingStore","_booking","bookingResponse","Img","LogoRR","link","target","rel","RRMessageWrapper","textColorGray","RRMessageTitle","RRMessageText","RRMessage","title","booking","rr_data","spinner","keyframes","LoaderSpinnerContainer","position","LoaderSpinner","size","Loader","ButtonLinkStyle","buttonStyle","contained","outlined","disabled","AcceptedPositions","ButtonDefaultStyle","setColor","inverted","disabledColor","setBackgroundColor","setBorder","invertedColor","ButtonWrapper","ButtonBackground","ContinueButton","center","loader","buttonTextKey","InviteFriendsEndpoint","TitleWrapper","ExtraText","span","Title","mandatory","extraText","tagManagerService","currentTheme","ShareReservationWrapper","ShareReservationContent","FullElement","CustomErrorField","TextField","MessageText","ShareReservation","useState","messageError","setMessageError","emails","setEmails","emailsError","setEmailsError","formattedEmails","setFormattedEmails","isShared","setIsShared","throwError","useErrorHandler","useEffect","subscription","inviteFriends","subscribe","unsubscribe","updateField","messageCb","errorCb","contentAfterSharing","contentForSharing","multiline","placeholder","rows","variant","onChange","ev","newMessage","newEmails","split","formattedEmail","trim","TagManagerEndpoint","TagManagerService","step","getTagManagerArgs","tagManagerArgs","TagManager","initialize","gtmId","dataLayer","console","log","getTagManagerService","Theme","source","secondaryColor","footerHeight","legendBorderGray","reservationSuccess","buttonBackgroundOnHover","voucherBackgroundColor","voucherTextColor","isBackground","globalPadding","ThemeManager","getCustomTheme","backgroundImageUrl","setBackgroundColorIcon","getTheme","setTextColorIcon","RoundedIconWrapper","setSize","border","setTopPosition","setLeftPosition","setSVGSize","RoundedIcon","icon","renderIcon","InformationWrapper","InformationStyle","collapsed","InformationText","isCollapsed","setIsCollapsed","mappedText","setTextColor","backgroundColorIcon","textColorIcon","notDisplayDefaultIcon","isRoPlt","event","collapsable","ValidationWrapper","ConfirmationValidation","canSharingFriend","show_sharing_friend_on_module","shoudDiplayRRMessage","pushTags","booking_id","toString","pageView","redirectionLink","window","replace","Cypress","__urlToUpdateFromEmail__","UserGroup","fill","viewBox","width","height","xmlns","d","InputWithIconWrapper","isSummary","BackgroundInput","TextInput","OutlinedInput","InputWithIcon","readOnly","isNumeric","label","placeholderKey","endAdornment","InputAdornment","inputProps","dataTest","CommercialsService","hasMenus","hasOffers","hasEvents","forAllGuestsMenus","SummaryCriteriaWrapper","BackButton","Inputs","SummaryCriteria","selectedDate","selectedTime","hasCommercialPage","getIsVoucherEnabled","commercialsService","hasCommercials","setLocaleForMoment","windowWidth","setWindowWidth","handleResize","innerWidth","addEventListener","removeEventListener","setBackRoute","setCancelPB","selectedGuestsValue","setSelectedGuestsToString","selectedDateValue","backButtonClicked","helperText","GolContactErrorField","clazz","errorMsg","required","textSize","defaultValue","CustomTextField","GolContactTextField","rowsMax","inputLabelProps","InputLabelProps","GolContactInfoFormContext","React","createContext","GolContactFormContext","form","fieldsInErrors","handleFormChange","requiredFields","GolContactNameField","formContext","useContext","fieldInError","defaultClazzName","defaultFieldValues","Countries","phone","suggested","Autocomplete","disableClearable","classes","autoHighlight","getOptionLabel","renderOption","renderInput","AutocompleteWrapper","CustomField","country","setCountry","autoComplete","defaultCountryError","option","Box","component","sx","mr","flexShrink","loading","srcSet","svg","claszName","Prefix","PhoneNumber","PhoneWrapper","useStyles","makeStyles","marginRight","fontSize","GolContactPhoneField","defaultPhoneFieldValues","RadioWrapper","FormControlStyledLabel","FormControlLabel","GolCheckField","controlName","controlId","isChecked","setIsChecked","control","Checkbox","checked","ErrorMessageWrapper","ErrorMessage","DropdownStyle","CustomIcon","CustomSelect","Select","Helper","normalizeOption","Dropdown","optionClicked","itemValue","setOptions","onItemClick","placeholderOption","defaultOptionSelectable","placeholderSelectable","normalizedOptions","normalized","guestsClass","isGuestsSelection","iconClass","FormControl","InputLabel","item","getValue","input","labelWidth","requiredWithPlaceholder","helper","GolContactGenderSelection","ContactInfoServiceImpl","genderStr","genderInt","selectedValue","buildGenderDropdownOption","contactInfoService","ContactBloc","ConfirmationFormWrapper","minHeight","ConfirmationFormLayout","FormInnerLine","PersonalDataLine","NewsletterLine","Legend","FormLine","ContactLine","GolContactGenderLine","ConfirmationContactForm","displayAllergiesField","diplayAllergiesField","setTerms","policy","setPolicy","setFieldsInErrors","requiredContactFields","pendingBookingContact","gender","setGender","overwrittenMobilePhone","showAcceptSms","setShowAcceptSms","overwrittenEmail","showAcceptEmail","setShowAcceptEmail","selectedCountry","selectedCountryForAddress","overwrittenCountryCode","newsLetterLine","isPreCatelanRestaurant","customLabelSmsSpamRestaurantGroup","isLeCastelletGroupRestaurant","legend","useRef","overwrittenFirstName","overwrittenLastName","birthday","company","allergies","acceptTerms","allergyTerms","acceptAllergiesTerms","accept_sms_spam","accept_email_spam","postcode","extra_address","address","city","localeUrl","disclaimerUrl","privacyPolicyUrl","checkContactInfoFormValidity","setCheckContactInfoFormValidity","setValidContactInfo","checkFormValidity","errorDetails","hasOwnProperty","fieldsInErrorFromUpdateReq","updatedFieldsInErrors","Array","Set","current","pendingBookingCountryCode","restaurantCountryCode","defaultCountry","labelSmsSpam","labelEmailSpam","valueAsDate","toISOString","array","indexOf","splice","fieldFilled","overwrittenHideGeneralTerms","requiredFieldsInError","requiredFieldsFilled","requiredCustomFieldsInError","show_allergies_terms_on_module","requiredCustomFieldsFilled","updatePendingContactInfo","genderOptions","computeGenderOptions","addressSub","countryPicker","addressMain","Provider","show_gender","show_birthday","shrink","show_company","show_address","show_country","accept_partner_spam","partner","show_tol_spam","CheckoutFormWrapper","CheckoutLine","BottomInfo","CardNumber","CardNumberElement","CardExpiry","CardExpiryElement","CardCvc","CardCvcElement","CheckoutFormLayout","CheckoutForm","state","setError","stripeError","setStripeError","clientSecret","setClientSecret","stripe","useStripe","elements","useElements","termsChecked","setTermsChecked","termsError","setTermsError","prepaymentType","setPrepaymentType","stripeToken","setStripeToken","allElementsAreEmpty","setAllElementsAreEmpty","inValidMode","setInValidMode","productName","checkContactPptInfoFormValidity","setValidPptInfo","client_secret","validatePayment","handleChange","empty","updatedErrors","elementType","handleSubmit","handleDeposit","confirmCardSetup","payment_method","card","getElement","setupIntent","handleDownPayment","confirmCardPayment","paymentIntent","stripe_submit_failed","removeItem","Sentry","scope","setTag","ConfirmationPayment","stripePromise","stripeOption","ConfirmationCommitPendingBooking","history","useHistory","CommercialItemWrapper","grid","Commercial","CommercialTitle","CommercialQuantity","CommercialPrice","SummaryCommercialItem","price","unitPrice","toFixed","commercialId","image","TooltipLayout","TooltipPreview","TooltipTitle","TooltipText","ShowMoreIcon","VisibilityIcon","CustomTooltip","Tooltip","disableTouchListener","popper","tooltipClasses","tooltip","color","boxShadow","marginTop","GolTooltip","showTooltip","setShowTooltip","tooltipContent","open","onOpen","onClose","VoucherWrapper","VoucherName","CustomGolTooltip","VoucherRemove","CloseIcon","VoucherItem","voucher","description","isRemovable","onRemoveVoucher","Subtitle","Separator","hr","CommercialsTotal","Summary","_event","commercial","_offer","hasVoucher","hasEvent","hasOffer","origin","object","has_prepayment","kind","displaySelector","commercialKind","selectedEvent","unit_price","addedVouchers","ReCaptchaEndpoint","PrepaymentInfoWrapper","ConfirmationLayoutWrapper","Anchor","ReCaptcha","ReCAPTCHA","ConfirmationLayout","getBookingState","prepaymentInfo","setPrepaymentInfo","showPptForm","setShowPptForm","submitText","setSubmitButtonText","validContactInfo","validPptInfo","setCheckContactPptInfoFormValidity","canCommit","setCanCommit","isRecaptchaEnabled","captchaValue","setCaptchaValue","buttonText_","initialized","anchor","querySelector","rect","getBoundingClientRect","top","left","bottom","innerHeight","documentElement","clientHeight","right","clientWidth","isInViewport","scrollIntoView","block","inline","verifyCanCommit","updatePendingBookingRequest","verifyReCaptcha","sitekey","hl","RefreshOnPaymentWrapper","RefreshOnPayment","_pendingBookingId","clearLocaleStorage","payment_intent_failed","performance","ConfirmationRouter","exact","path","CommercialMenuItemCtx","CommercialMenusCtx","useCommercialMenusContext","DetailsVoucherCtx","useDetailsVoucherContext","BackgroundCircleButtonStyle","CheckCircleButton","BackgroundCircleButton","CheckCircle","InputWrapper","VoucherInput","setCode","isLoading","setIsLoading","validateCode","setValidateCode","voucherCtx","VoucherInputCtx","updateMessageError","updateVouchers","voucherAllowed","updateDisabledBtnFromVoucher","updateValidVoucherCode","hasError","gift_code","voucher_infos","checkVoucherCode","_getVoucherDetailsError","getVoucherDetailsError","selectedVouchers","DiscountWrapper","VouchersWrapper","VoucherInputWrapper","VoucherItems","MessageInfo","MessageError","DetailsVouchers","handleCanDisplayInput","multiVouchersEnabled","getIsVoucherAllowed","setVoucherAllowed","setVouchers","voucherToRemove","setVoucherToRemove","messageInfo","canDisplayInput","setCanDisplayInput","handleRemoveVoucher","removeVoucherCodeToPendingBooking","renderVouchers","updatedVouchers","handleAddVoucher","TitleDisplay","TextDisplay","CommercialText","CommercialService","_commercial","_translationInCurrentLocale","_translationInRestaurantLocale","loadCommercialTranslationForLocale","forLocale","com","property","keyPpty","loadInCurrentLocale","loadInRestaurantLocale","loadDefault","hasPrepayment","_commercialKind","_prepayment","price_and_currency","MoreAction","CommercialEvent","CommercialsEventItem","commercialService","CommercialWrapper","CommercialImage","MenuOfferCommon","OfferSelection","CommercialsOfferItem","setIsSelected","setAction","observable","offer_id","addOfferToPendingBooking","removeOfferToPendingBooking","addOffer","removeOffer","setChildLoading","setErrorMessage","getMessage","remove","SectionWrapper","MenuOfferWrapper","CommercialMenuActions","CommercialMenu","unavailableReasonKey","canInteract","rightFooter","unavailable","CommercialMenuCounter","ChangedMenuCount","CommercialsMenuItem","menuItem","menusNumber","setMenusNumber","canLowerMenuCount","setCanLowerMenuCount","canRaiseMenuCount","setCanRaiseMenuCount","menusAvailabilities","performAction","availableMenus","available_menus","statisfySameMenusPaxCounterMandatoryForRaiseBtn","newMenuCount","updateSelectedMenus","RightFooterWrapper","CheckboxLabel","CommercialsForAllGuestsMenuItem","selectedMenusIds","canIteract","MenusBloc","MenusSubBloc","CommercialMenus","setMenusAvailabilities","actionDetails","updateStatisfyMenusMandatory","setSelectedMenusIds","actionDetailsValue","menu_id","addMenuToPendingBooking","removeMenuFromPendingBooking","statisfyMenusMandatory","resetMenusAvailabilities","details","CommercialsDisplay","availableCommercials","setErrorMsg","setErrorMessageFromChild","titleProps","CommercialsWrapper","CommericalContentWrapper","Commercials","isDisabled","setIsDisabled","isVoucherEnabled","redirect","validVoucherCode","setValidVoucherCode","setStatisfyMenusMandatory","disabledBtnReqFromVoucher","setDisabledBtnReqFromVoucher","buttonText","satisfied","GeneralMessage","generalInfoMessage","headerMessage","ChildrenGroup","SlotIconsGroup","SlotIcons","icons","hasWaitingList","SlotStyle","SlotItem","GolEventHandler","observeProps","reducer","_componentName","_reducers","dispatch","observeProp","reducersForObserver","golReducer","reducers","newReducers","SelectionStoreChangesService","subscribers","componentName","observableStoreProps","useCallbackOnChanged","unregisterListener","subscriber","selectionStoreChangesService","CalendarService","_dailyAvailabilities","_dailyEngine","DATE_NOW","FORMAT","dailyLightInfoResponseData","computeDailyAvailabilities","computeDailyEngine","controlSelectedDate","dailyEngine","formattedDate","day","diff","isDayInThePast","getStatus","full","closed","dailyAvailabilities","daily_availabilities","daily_avail","engine_mode","resetDate","dailyAvailabilitiesData","dailyEngineData","CustomDay","today","DayOutOfDate","DayFullStyle","DayClosedStyle","DayUnavailable","Day","lastBookingDate","calendarService","isToday","isSame","available","ArrowLeft","ArrowBackIosIcon","ArrowRight","ArrowForwardIosIcon","onDateChange","focused","onFocusChange","numberOfMonths","navNext","navPrev","firstDayOfWeek","initialVisibleMonth","renderDayContents","currentDate","isDayBlocked","renderMonthElement","month","renderWeekHeaderElement","onPrevMonthClick","onPrevMonth","onNextMonthClick","onNextMonth","noNavPrevButton","hasPrevMonth","noNavNextButton","hasNextMonth","hideKeyboardShortcutsPanel","daySize","setNumberOfMonthToAdd","setSelectedDate","selectedEngineMode","updateCalendateDate","GolEventListener","CalendarMonth","updateDate","CalendarDate","getEngineMode","endOf","WithRestaurantIdEndpoint","DailyAvailabilitiesEndpoint","LoaderWrapper","startDate","addQueryParams","getDailyAvailabilities","setupServiceData","OnComplete","CalendarWrapper","CalendarLayout","setSelectedGuests","fetchData","setFetchData","Period","Area","Guests","SelectionGuestsWrapper","isChildren","GuestSlots","GuestInput","GuestSlotsWrapper","TextButton","SelectionGuests","isFirstStep","selectionStoreService","guestsDropdownOption","showInput","setShowInput","isSlotsDisplayed","setIsSlotsDisplayed","inputGuests","setInputGuests","first_step","debounceTimer","setTimeout","storeSelectedGuests","clearTimeout","setDefaultSelectedGuestWhenChildren","handleClickSlot","buttonShowHideInput","resetChildrenButton","setTypeOfGuestToPlaceholder","autoFocus","e","onKeyDown","borderStyles","SelectionPaxWrapper","SelectionPax","LegendWrapper","LegendItem","LegendTitle","LegendCircle","CalendarLegendItem","borderStyle","explanation","LegendStyle","LegendItemsStyle","CalendarLegend","dashed","solid","SelectionCalendar","shouldHideLegend","Time","TimeSectionStyle","TimeSectionTitle","TimeSection","setSelectedTime","storeSelectedTime","timeSlots","sectionTimeSlots","timeSlot","sectionTitleKey","NoHourReasonStyle","NonBookableEventTooltip","NoTimeSection","noHourReason","nonBookableEvent","event_name","event_description","TimeSectionWrapper","PeriodsView","displayPeriods","displayPeriod","titleKey","LegendText","TimeSlotLegend","PeriodsEndpoint","AreaService","displayedLanguageArea","getNameFromI18nLanguage","getNameFromDefaultRestaurantLocale","loadFirstTranslation","FiltersService","areasTranslations","loadAreaTranslations","loadAreaDropdownOption","getTranslation","moduleSettingAreas","timePeriods","canBuildArea","table","x","timePeriod","IDisplayPeriodsBuilderService","getAvailablePeriods","buildIDisplayPeriods","filters","filterService","getFiltersFromPeriods","dispPeriod","nonBookableEventIds","non_bookable_event","event_id","isUniqEvent","no_hour_reason","builsITimeSlots","buildITimeSlotsFromHours","iTimeSlots","buildITimeSlotDetails","FiltersPosition","SelectionTimeWrapper","SelectionTime","hasPeriods","requestingData","setRequestingData","initialDate","setInitialDate","scrollToAnchor","iDisplayPeriodsService","getAvailableIDisplayPeriods","flat","checkPeriodAndTime","stringToDropdown","prefix","FilterStyle","forceAreaSelection","alignPosition","Filters","valueArr","periodsOptions","areasOptions","areaDropdownOptions","areaPlaceholder","hideServiceSelection","shouldForceAreaSelection","SelectionCriteriaWrapper","SelectionCriteriaLayout","Selection","setSelectedChildren","isSelectOnlyPaxFirst","selectedOnlyPaxDone","setSelectedOnlyPaxDone","selectedPaxDone","setSelectedPaxDone","canContinue","setCanContinue","setRedirect","setShouldForceAreaSelection","initPendingBooking","useCallback","available_commercials","availableMenu","pending_booking_unfound","ScrollToTop","scrollTo","WaitingMessage","waitingInfoMessage","MainContentFlex","parseInt","MainContentWrapper","MainContentLayout","MainContent","onlineBookingEnabled","hasServices","areaNoMoreAvailaible","isRefreshOnPayment","mainContent","fallback","resetError","resetStore","getRedirectPath","errorType","getErrorType","ErrorStyle","isLayout","ErrorDescriptionStyle","ApiErrorView","setContext","LoaderContainer","LoaderDotsWrapper","scaleDot","LoaderDot","LoaderDots","GolLogo","Logo","poweredByLogo","getPoweredByText","poweredByUrl","FooterWrapper","PowerBy","RREnabled","Footer","reservationResponsableEnabled","poweredBy","show_powered_by","MainLayoutWrapper","backgroundImage","bodyBackgrounColor","MainLayout","useParams","hash","setModuleInitialized","setApiError","overwrittenBackgroundColor","redirectToHome","setRedirectToHome","muiTheme","createMuiTheme","typography","palette","secondary","main","overrides","MuiInputLabel","root","MuiFormControlLabel","WebFont","google","families","set","initModuleSettings","computeUpdateFromBookingErrorMessage","hasFacebookPixel","wholeDomain","privacyPolicyLinkText","necessaryOptionText","preferencesOptionText","statisticsOptionText","marketingOptionText","acceptButtonText","declineButtonText","managePreferencesButtonText","savePreferencesButtonText","preferencesDefaultChecked","statisticsDefaultChecked","marketingDefaultChecked","onAcceptStatistics","onDeclineStatistics","styles","dialog","zIndex","padding","AppPropertiesWrapper","AppPropertiesStyle","PropertyStyle","PropertyName","Property","AppProperties","RestaurantError","LinkButton","background","FloatingButton","buttonBackground","setButtonBackground","SubscribeToNewsletterEndpoint","contactStore","_contact","contact_","SuccessWrapper","NewsletterFormWrapper","NewsletterForm","submitSubscription","setSubmitSubscription","subscriptionSucceed","setSubscriptionSucceed","subscriptionFailed","setSubscriptionFailed","setLoading","contactDetails","subscribeToNewsletter","rightEmailFormat","NewsletterMainContent","NewsletterMainLayout","Newsletter","AppStyle","MuiFormLabel","Boolean","hostname","match","ReactDOM","render","getElementById","serviceWorker","ready","then","registration","unregister","catch"],"mappings":";iy8UAkBMA,EAAY,CAChBC,GAAI,CACFC,YAAaC,GAEfC,GAAI,CACFF,YAAaG,GAEfC,GAAI,CACFJ,YAAaK,GAEfC,GAAI,CACFN,Y,QAEFO,GAAI,CACFP,YAAaQ,GAEfC,GAAI,CACFT,Y,QAEFU,GAAI,CACFV,Y,QAEFW,GAAI,CACFX,Y,QAEFY,GAAI,CACFZ,Y,QAEFa,GAAI,CACFb,Y,QAEFc,GAAI,CACFd,Y,QAEFe,GAAI,CACFf,Y,QAEFgB,GAAI,CACFhB,Y,QAEFiB,GAAI,CACFjB,Y,QAEFkB,GAAI,CACFlB,Y,SAIJmB,IACGC,IAAIC,KACJC,KAAK,CACJxB,YACAyB,IAAKC,KACLC,cAAe,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEFC,YAAa,KACbC,KAAM,MACNC,cAAe,CACbC,aAAa,GAEfC,YAAY,EACZC,mBAAmB,IAGRZ,IC9FXa,ECqBQC,EASAC,EA6BAC,EFmCGhB,IAAf,E,6CC5FMiB,E,gGACWC,GACb,OAAOC,YAAKC,IAAMC,QAAQH,Q,iECiBlBJ,K,iCAAAA,E,+CAAAA,E,6CAAAA,E,0BAAAA,E,kDAAAA,E,6CAAAA,M,cASAC,K,kBAAAA,E,oCAAAA,E,8CAAAA,E,oCAAAA,E,sBAAAA,E,8BAAAA,E,4CAAAA,E,0DAAAA,E,gCAAAA,E,0BAAAA,E,kBAAAA,E,sDAAAA,E,kDAAAA,E,4BAAAA,E,wDAAAA,E,kEAAAA,E,kCAAAA,E,4CAAAA,E,8CAAAA,E,kEAAAA,E,gDAAAA,E,4BAAAA,E,kDAAAA,E,uDAAAA,M,cA6BAC,K,cAAAA,E,mBAAAA,M,SCrDAM,EAKAC,E,QCdCC,EAAS,CACpBC,QAAO,OAAEpB,wDAAqC,GAC9CqB,WAAU,OAAErB,0DAAyC,GACrDsB,MAAK,OAAEtB,8CAAkC,GACzCuB,WAAU,OAAEvB,UAAqC,GACjDwB,YAAaxB,UACbyB,kBAAmB,WACnBC,aACE,oEACFC,OAAQ,CACNC,KAAM,sBACNC,IAAK,CACH,yDACA,qEACA,kDAEFC,UAAW,YACXC,YAAa,cACbC,aAAc,eACdC,sBAAuB,uBACvBC,gBAAiB,uBACjBC,eAAgB,8BAChBC,WAAY,sCAEdC,iBAAgB,OAAErC,UAAwC,K,SDfhDiB,K,UAAAA,E,iBAAAA,M,cAKAC,K,cAAAA,E,gBAAAA,E,sBAAAA,E,sBAAAA,E,iBAAAA,M,KAkBL,IAQKoB,EAOAC,EAKAC,EAUAC,EAQAC,EAKAC,EAgBAC,EAoBAC,EAiNAC,EAyUAC,GAzmBCC,GAAS,CACpBC,KAAM,EACNC,OAAQ,EACRC,gBAAiB,GAGNC,GAA8BC,OAAOC,OAAOpC,I,SAE7CoB,K,0BAAAA,E,kBAAAA,E,sBAAAA,E,qBAAAA,M,cAOAC,K,cAAAA,E,iBAAAA,M,cAKAC,K,gBAAAA,E,YAAAA,E,YAAAA,E,gBAAAA,E,YAAAA,E,cAAAA,E,aAAAA,M,cAUAC,K,kBAAAA,E,gBAAAA,E,sBAAAA,E,YAAAA,E,2BAAAA,M,cAQAC,K,sBAAAA,E,eAAAA,M,cAKAC,K,YAAAA,E,sBAAAA,E,qBAAAA,M,cAgBAC,K,YAAAA,E,uBAAAA,M,cAoBAC,K,aAAAA,E,eAAAA,E,gBAAAA,M,cAiNAC,K,YAAAA,E,cAAAA,E,eAAAA,M,cAyUAC,K,UAAAA,E,kBAAAA,E,YAAAA,E,YAAAA,E,gBAAAA,E,kBAAAA,E,YAAAA,E,oCAAAA,E,sCAAAA,E,6BAAAA,E,2CAAAA,E,2CAAAA,E,oCAAAA,E,wCAAAA,E,8BAAAA,E,SAAAA,Q,SEtmBRQ,GC8DAC,G,oBC3FEC,G,WASJ,WACEC,EACAC,EACAC,EACAC,EACAC,EACAC,GACC,yBAfKC,kBAeN,OAdMC,mBAcN,OAbMC,cAaN,OAZMC,YAYN,OAXMC,gBAWN,OAVMC,mBAUN,OATMC,cASN,EACAC,KAAKP,aAAeN,EACpBa,KAAKN,cAAgBN,EACrBY,KAAKL,SAAWN,EAChBW,KAAKH,WAAaP,EAClBU,KAAKF,cAAgBP,EACrBS,KAAKD,SAAWP,E,wDAWhB,MAAO,CACLL,YAAaa,KAAKP,aAClBL,aAAcY,KAAKN,cACnBL,QAASW,KAAKL,SACdL,UAAWU,KAAKH,WAChBN,aAAcS,KAAKF,cACnBN,QAASQ,KAAKD,Y,uCAKhB,OAAOC,KAAKJ,QAAUhD,EAAOG,Q,iCAGPqC,GACtBY,KAAKN,cAAgBN,I,gCAEAD,GACrBa,KAAKP,aAAeN,M,KAyQXc,GAAoB,I,iDApQvBC,2B,OACAC,wB,OACAC,iB,mEAINjB,EACAC,EACAC,GASA,OAPKW,KAAKE,uBAAyBf,GAAeC,IAChDY,KAAKE,sBAAwB,IAAIhB,GAC/BC,EACAC,EACAC,IAGGW,KAAKE,wB,0BAGZG,EACAC,EACAC,GAEA,IAAIhB,EACFC,OAAUgB,OACSA,IAAjBF,IACFf,EAAee,EAAaG,IAAI,uBAAoBD,EACpDhB,EAAUc,EAAaG,IAAI,iBAAcD,GAE3C,IAAIrB,EAAckB,EAAUlB,YACxBC,EAAeiB,EAAUjB,aAE3BsB,IACAA,GAAeC,oBACA,MAAfxB,IAKAA,EAAcuB,GAAeE,iBAC7BxB,EAAesB,GAAeG,mBAEhCb,KAAKG,mBAAqBH,KAAKc,uBAAuBR,GAClDC,IACFP,KAAKI,YAAcJ,KAAKe,gBAAgBR,IAE1CP,KAAKE,sBAAwB,IAAIhB,GAC/BC,EACAC,EACAiB,EAAUhB,QACVgB,EAAUf,UACVC,EACAC,K,uCAuBkC,IAAD,MAC/BwB,OAAgCR,EACpC,aAAIR,KAAKI,mBAAT,aAAI,EAAkBa,IACpBD,EAAYE,OAAOlB,KAAKI,YAAYa,UAC/B,aAAIjB,KAAKG,0BAAT,aAAI,EAAyBc,IAAK,CAAC,IAAD,EACvCD,EAAYE,OAAM,UAAClB,KAAKG,0BAAN,aAAC,EAAyBc,UACvC,UAAIjB,KAAKG,0BAAT,aAAI,EAAyBgB,WAClCH,EAAYE,OAAOlB,KAAKG,mBAAmBgB,UAE7C,OAAOH,EACHE,OAAOE,MAAMJ,QACXR,EACAQ,OACFR,I,wCAIJ,OAAOR,KAAKG,mBAAmBkB,O,wCAKM,IAAD,IAChCC,OAAOd,EAEX,aAAIR,KAAKI,mBAAT,aAAI,EAAkBkB,KACpBA,EAAOtB,KAAKI,YAAYkB,UACnB,aAAItB,KAAKG,0BAAT,aAAI,EAAyBmB,KAAM,CAAC,IAAD,EACxCA,EAAI,UAAGtB,KAAKG,0BAAR,aAAG,EAAyBmB,KAElC,IAAIC,EAAeD,EAAOE,KAAOF,QAAQd,EACzC,OAAmB,OAAZe,QAAY,IAAZA,OAAA,EAAAA,EAAcE,WAAYF,OAAef,I,0CAIhD,OAAOR,KAAKG,mBACRH,KAAK0B,qCACLlB,I,sDAG+C,IAAD,EAC9CmB,EAAO,UAAG3B,KAAKG,mBAAmByB,cAA3B,aAAG,EAAgCC,oBAC9C,MAAgB,OAAZF,EACK,KAEO,OAAZA,EACK,KAEFA,I,wCAIP,OAAO3B,KAAKG,mBACRH,KAAKG,mBAAmB2B,aACxBtB,I,wCAGiC,IAAD,IAID,EAHnC,iBAAIR,KAAKI,mBAAT,aAAI,EAAkB2B,MACb/B,KAAKI,YAAY2B,MAE1B,UAAI/B,KAAKG,0BAAT,aAAI,EAAyB4B,MAC3B,UAAO/B,KAAKG,0BAAZ,aAAO,EAAyB4B,UADlC,I,6CAM0C,IAAD,IAIA,EAHzC,iBAAI/B,KAAKI,mBAAT,aAAI,EAAkB4B,YACbhC,KAAKI,YAAY4B,YAE1B,UAAIhC,KAAKG,0BAAT,aAAI,EAAyB6B,YAC3B,UAAOhC,KAAKG,0BAAZ,aAAO,EAAyB6B,gBADlC,I,4CAMyC,IAAD,IAIA,EAHxC,iBAAIhC,KAAKI,mBAAT,aAAI,EAAkB6B,WACbjC,KAAKI,YAAY6B,WAE1B,UAAIjC,KAAKG,0BAAT,aAAI,EAAyB8B,WAC3B,UAAOjC,KAAKG,0BAAZ,aAAO,EAAyB8B,eADlC,I,yCAMsC,IAAD,IAID,EAHpC,iBAAIjC,KAAKI,mBAAT,aAAI,EAAkB8B,OACblC,KAAKI,YAAY8B,OAE1B,UAAIlC,KAAKG,0BAAT,aAAI,EAAyB+B,OAC3B,UAAOlC,KAAKG,0BAAZ,aAAO,EAAyB+B,WADlC,I,+CAM4C,IAAD,IAIA,EAH3C,iBAAIlC,KAAKI,mBAAT,aAAI,EAAkB+B,cACbnC,KAAKI,YAAY+B,cAE1B,UAAInC,KAAKG,0BAAT,aAAI,EAAyBgC,cAC3B,UAAOnC,KAAKG,0BAAZ,aAAO,EAAyBgC,kBADlC,I,+CAM4C,IAAD,IAIA,EAH3C,iBAAInC,KAAKI,mBAAT,aAAI,EAAkBgC,cACbpC,KAAKI,YAAYgC,cAE1B,UAAIpC,KAAKG,0BAAT,aAAI,EAAyBiC,cAC3B,UAAOpC,KAAKG,0BAAZ,aAAO,EAAyBiC,kBADlC,I,mDAMgD,IAAD,EAC/C,OAAO,UAAApC,KAAKG,0BAAL,eAAyBkC,kBAC5BrC,KAAKG,mBAAmBkC,sBACxB7B,I,oDAGkC,IAAD,EACrC,MAAuD,UAAhD,UAAAR,KAAKG,0BAAL,eAAyBmC,sB,+DAIhC,IAAIC,EACAC,EAAQxC,KAaZ,OAXAlB,OAAO2D,QAAQjE,IAAakE,SAAQ,SAACC,GACnC,IAAMC,EAAMD,EAAU,GAChBE,EAAQF,EAAU,GAClBG,EAAiBF,EACjBG,EAAOP,EAAMrC,mBAAmB2C,GAClCC,IACFR,EACKA,GAAW,WAAQM,EAAR,YAAiBE,GAC5BR,EAAW,WAAOM,EAAP,YAAgBE,OAG7BR,I,6CAIPjC,GAEA,IAAI0C,EAAuC,GAgB3C,YAfqBxC,IAAjBF,GACFxB,OAAO2D,QAAQjE,IAAakE,SAAQ,SAACC,GACnC,IAAMC,EAAMD,EAAU,GAChBE,EAAQF,EAAU,GACpBM,EAAc3C,EAAcG,IAAIoC,GAChB,OAAhBI,IACFD,EAAoBA,EAAiB,2BAE5BA,GAF4B,kBAG9BJ,EAAMK,IAHwB,eAK9BL,EAAMK,OAIZD,I,sCAGOzC,GACd,IAAIyC,EAAuC,GAY3C,OAXAlE,OAAO2D,QAAQjE,IAAakE,SAAQ,SAACC,GACnC,IAAMC,EAAMD,EAAU,GAChBE,EAAQF,EAAU,GACpBM,EAAc1C,EAAYE,IAAIoC,GACd,OAAhBI,IACFD,EAAiB,2BACZA,GADY,kBAEdJ,EAAMK,QAIND,I,oCA/LP,OAAOhD,KAAKkD,uBAAuBC,c,iCAGpBC,GACfpD,KAAKkD,uBAAuB9D,aAAegE,I,gCAG7BC,GACdrD,KAAKkD,uBAAuB/D,YAAckE,M,MCpIjCC,GAAuB,SAClCC,GAEY,IADZC,IACW,2DAETvD,GAAkBwD,cADZtE,EADG,EACHA,YAAaC,EADV,EACUA,aAAcC,EADxB,EACwBA,QAE/BvC,GAHO,EACiCyC,aADjC,EAC+CD,UAEzCD,EAAO,UACjBzC,EAAOQ,OAAOC,KADG,YACKgC,GACzBzC,EAAOQ,OAAOC,MACdqG,EAAW,UAAM5G,GACjBsC,IACFsE,GAAW,WAAQtE,IAErBsE,GAAW,WAAQvE,EAAR,YAAuBoE,GAKlC,IAAIhB,EAActC,GAAkB0D,yCAGpC,OAFIpB,GAAeiB,GAAgB5G,EAAOQ,OAAOG,YAAcgG,IAC7DG,GAAW,UAAOnB,IACbmB,GCRIE,GAAb,WAME,WAAYC,GAKV,GALgD,yBALlDC,cAKiD,OAJjDC,YAIiD,OAHjDC,UAGiD,OAFjDC,UAEiD,EAC/CjE,KAAK8D,SAAWD,EAAMC,SACtB9D,KAAKgE,KAAO7H,EAAa+H,QACzBlE,KAAK+D,QAAU,EAEXF,EAAMC,SAAU,CAAC,IAAD,IAClB9D,KAAK+D,OAASF,EAAMC,SAASC,OAC7B/D,KAAKiE,KAAL,UAAYJ,EAAMC,SAASG,YAA3B,aAAY,EAAqBJ,MACjC,IACe,EADXM,EAAS,UAAGnE,KAAKiE,YAAR,aAAG,EAAWD,KAC3B,GAAIG,EACFnE,KAAKgE,KAAL,UACE7H,EAAagI,UADf,QAEEhI,EAAa+H,SAlBvB,8DAwBI,OAAOZ,GAAqB1G,EAAOQ,OAAOG,WAAW,KAxBzD,qCA4BI,OAAOnB,EAAUyH,QA5BrB,mCAgCI,OAAOzI,EAAKgJ,EAAEpE,KAAKqE,kBAhCvB,qCAoCI,OAAQrE,KAAKgE,MACX,KAAK7H,EAAamI,iBAClB,KAAKnI,EAAaoI,sBAChB,MAAM,oCAER,QACE,MAAM,oBAAN,OAA2BvE,KAAKgE,WA1CxC,KAgDaQ,GAAb,4MACSC,UAAoB,eAD7B,6DAYI,IAAIC,EAAW1E,KAAK2E,sBAAsB,GAK1C,OAJiB,SAAbD,IACFA,EAAW1E,KAAKgE,MAGVU,GACN,KAAKxI,EAAqB0I,qBAAuB,IAAD,EAC9C,iBAAO5E,KAAK8D,SAASG,YAArB,aAAO,EAAoBJ,MAAMa,GAAU,GAE7C,KAAKxI,EAAqB2I,oBAC1B,KAAK3I,EAAqB4I,WAC1B,KAAK5I,EAAqB6I,uBAAyB,IAAD,EAChD,iBAAO/E,KAAK8D,SAASG,YAArB,aAAO,EAAoBJ,MAAMmB,KAAK,GAExC,KAAK9I,EAAqB+I,eAAiB,IAAD,EACxC,iBAAOjF,KAAK8D,SAASG,YAArB,aAAO,EAAoBJ,MAAMqB,gBAAgB,GAEnD,QACE,MAAM,oBAAN,OAA2BlF,KAAKmF,aA9BxC,+CAoCI,OACEnF,KAAK2E,sBAAsBS,SAASlJ,EAAqB+I,gBAElD/I,EAAqB+I,eAE5BjF,KAAK2E,sBAAsBS,SACzBlJ,EAAqBmJ,qBAGhBnJ,EAAqBmJ,yBALvB,IAxCX,4CAmDI,OAAIrF,KAAKiE,KACAnF,OAAOwG,KAAKtF,KAAKiE,MAEnB,KAtDX,wCA0DI,MACE,CACE9H,EAAaoJ,eACbpJ,EAAaqJ,gBACbrJ,EAAasJ,qBACbtJ,EAAauJ,iCACbN,SAASpF,KAAKgE,MAETV,GAAqB1G,EAAOQ,OAAOK,cACjCtB,EAAawJ,eAAiB3F,KAAKgE,KACrCV,GAAqB1G,EAAOQ,OAAOI,aAE1BwC,KAAK2E,sBACPS,SAAS,gBACd9B,GAAqB1G,EAAOQ,OAAOK,cAGvC6F,GAAqB1G,EAAOQ,OAAOG,aA3E9C,6BAGeqF,GACX5C,KAAKyE,UAAY7B,GAJrB,eAQI,OAAO5C,KAAKyE,cARhB,GAAiDb,IA8EpCgC,GAAb,6KAEI,OAAQ5F,KAAKgE,MACX,KAAK7H,EAAa0J,aAChB,MAAO,eAET,KAAK1J,EAAa2J,2BAChB,MAAO,8CAET,KAAK3J,EAAamI,iBAChB,MAAM,oCAER,QACE,MAAM,sCAbd,wCAmBI,OAAQtE,KAAKgE,MACX,KAAK7H,EAAa2J,2BAChB,OAAOxC,GAAqB1G,EAAOQ,OAAOI,aAC5C,QACE,OAAO,6EAvBf,GAAkDoG,IA4BrCmC,GAAb,kDACE,WAAYlC,GAAsC,IAAD,8BAC/C,cAAMA,IACDG,KAAO7H,EAAa6J,YAFsB,EADnD,2DAMkB,IAAD,EACb,iBAAQhG,KAAKiE,YAAb,aAAQ,EAAWD,MACjB,KAAK7H,EAAa8J,gCAChB,OAAO7K,EAAKgJ,EAAL,0BAET,QACE,OAAIpE,KAAK8D,SAASG,KAAKJ,MAAMqC,QACpBlG,KAAK8D,SAASG,KAAKJ,MAAMqC,QAE5B,8BAfd,GAA4CtC,IAqB/BuC,GAAb,2KAKI,OAAInG,KAAKoG,sBACAhL,EAAKgJ,EAAEpE,KAAKqE,eAAgB,CAAEgC,aAAcrG,KAAKsG,gBAEnD,qEARX,oCAWiB,IAAD,IACZ,2BAAQtG,KAAKiE,YAAb,aAAO,EAAmCoC,oBAA1C,QAA0D,KAZ9D,4CAgBI,OACErG,KAAKgE,OAAS7H,EAAaoK,eAC3BvG,KAAKgE,OAAS7H,EAAaqK,sBAC3BxG,KAAKgE,OAAS7H,EAAasK,gCAnBjC,GACU7C,IA2CG8C,IApByBC,MAoBtC,WAKE,WAAYT,GAAkB,yBAJ9BnC,YAI6B,OAH7BC,UAG6B,OAF7BkC,aAE6B,EAC3BlG,KAAK+D,OAAS,IACd/D,KAAKgE,KAAO7H,EAAayK,0BACzB5G,KAAKkG,QAAUA,EARnB,yDAYI,OAAOlG,KAAKkG,UAZhB,qCAgBI,OAAO9J,EAAUyH,UAhBrB,MAoBagD,GAAb,6KAEI,MAAO,wCAFX,wCAMI,OAAOvD,GAAqB1G,EAAOQ,OAAOG,eAN9C,GAA6CqG,IJrPvCkD,G,oGAEeC,GACjB,GAAIA,EAAIjD,SAEN,OADaiD,EAAIjD,SAASC,QAExB,KAAK,IACL,KAAK,IACH,OAAO,IAAIoC,GAAyBY,GAEtC,KAAK,IACH,OAAO,IAAIhB,GAAuBgB,GAEpC,KAAK,IACH,OAAO,IAAInB,GAA6BmB,GAE1C,KAAK,IACH,OAAO,IAAIvC,GAA4BuC,GAI7C,OAAO,IAAInD,GAAamD,O,KK5BfC,GAAW,SAACD,GACrB,IAAME,GLkCHjI,KACHA,GAAW,IAAI8H,IAEV9H,IKrCiCkI,YAAYH,GAClD,OAAO,IAAII,cAAW,SAACC,GACnBA,EAASvD,MAAMoD,GACfG,EAASC,eJAXC,ILKCrL,IACHA,EAAe,IAAII,GAEdJ,GKNHsL,G,iDACGpE,UAAY,SAACqE,GAGlB,IAFA,IAAIC,EAAc,KAElB,MADa3I,OAAOwG,KAAKkC,GACzB,eAAwB,CAAnB,IAAM5E,EAAG,KACR6E,IACFA,GAAe,KAEjBA,EAAcA,EACVA,EAAc7E,EAAM,IAAM4E,EAAO5E,GACjCA,EAAM,IAAM8E,mBAAmBF,EAAO5E,IAE5C,MAAO,IAAM6E,G,gDAGJE,GAA0D,IAAtCH,EAAqC,uDAAvB,KACvCI,EAAe,GACfJ,IACFI,EAAe5H,KAAKmD,UAAUqE,IAEhC,IAAMK,EAAoC,CACxCC,MAAO9H,KACP+H,OAAQ,MACRzK,IAAI,GAAD,OAAKqK,EAASK,eAAd,OAA8BJ,GACjCK,QAASN,EAASO,cAEpB,OAAOZ,GAAM7K,QAAQoL,GAASM,KAC5BC,aAAI,SAACtE,GACH,OAAOA,EAASG,QAElBoE,aAAW,SAACtB,GACV,OAAOC,GAASD,S,2BAKVY,EAAoB1D,GAC9B,IAAM4D,EAA8B,CAClCE,OAAQ,OACRzK,IAAKqK,EAASK,cACdC,QAASN,EAASO,aAClBjE,QAEF,OAAOqD,GAAM7K,QAAQoL,GAASM,KAC5BC,aAAI,SAACE,GACH,OAAOA,EAAKrE,QAEdoE,aAAW,SAACtB,GACV,OAAOC,GAASD,S,0BAKXY,EAAoB1D,GAC7B,IAAM4D,EAA8B,CAClCE,OAAQ,MACRzK,IAAKqK,EAASK,cACdC,QAASN,EAASO,aAClBjE,QAEF,OAAOqD,GAAM7K,QAAQoL,GAASM,KAC5BC,aAAI,SAACE,GACH,OAAOA,EAAKrE,QAEdoE,aAAW,SAACtB,GACV,OAAOC,GAASD,S,6BAKRY,EAAoB1D,GAChC,IAAM4D,EAA8B,CAClCE,OAAQ,SACRzK,IAAKqK,EAASK,cACdC,QAASN,EAASO,aAClBjE,QAEF,OAAOqD,GAAM7K,QAAQoL,GAASM,KAC5BC,aAAI,SAACE,GACH,OAAOA,EAAKrE,QAEdoE,aAAW,SAACtB,GACV,OAAOC,GAASD,W,KAQXwB,GAAiB,WAI5B,OAHKtJ,KACHA,GAAc,IAAIsI,IAEbtI,IKnGHuJ,GAAU5L,EAAOE,WAEV2L,GAAb,WAKE,WACEd,GAGC,IAFDtK,EAEA,uDAFemL,GACfE,EACA,gEARKrL,UAQL,OAPKsK,cAOL,OANKe,iBAML,EACA1I,KAAK3C,KAAOA,EACZ2C,KAAK2H,SAAWA,EAChB3H,KAAK0I,YAAL,OAAmBA,QAAnB,IAAmBA,IAAe,KAZtC,2DAewBA,GACpB1I,KAAK0I,YAAcA,IAhBvB,oCAoBI,IAAIC,EAAQ,UAAM3I,KAAK3C,KAAX,YAAmBT,EAAOI,WAA1B,YAAwCgD,KAAK2H,UAWzD,OAVI3H,KAAK0I,aAA2C,IAA5B1I,KAAK0I,YAAYE,SACvCD,GACE,IACA3I,KAAK0I,YACFN,KACC,SAACS,GAAD,gBACKA,EAAWC,eADhB,YACkCD,EAAWE,oBAE9CC,KAAK,MAELL,IA/BX,mCAmCI,IAAMzF,EAAuBjD,GAAkBiD,uBACvC/D,EAAgB+D,EAAqBC,YAArChE,YACF8I,EAAqC,CACzC,UAAW/E,EAAqB+F,iBAChC,eAAgB,oBAKlB,YAHoBzI,IAAhBrB,IACF8I,EAAQ,gBAAkB9I,GAErB8I,MA5CX,KCJaiB,GAAb,kDACE,aAAe,uCACP,mBAFV,UAAsCT,I,oBCIhCU,G,iDAEIC,qB,wEAgBN,IAAMC,EAAuB3I,GAAe4I,oBAC5C,IAAK5I,GAAe6I,oBAAsBF,EAAsB,CAC9D,IAAMG,EAAiBvJ,GAAkBuJ,iBACzC,GAAIA,EACFC,GAAeC,OAASF,MACnB,CAAC,IAAD,EACCG,EACHN,GACC3I,GAAekJ,SAASC,oBACrBF,uBACL,EACIG,EACHpJ,GAAe4I,sBAAf,UACC5I,GAAekJ,SAASC,2BADzB,aACC,EAA6CC,kBAC/C,EACFL,GAAeM,SAAWD,EAAkB,EAAIA,EAAkB,EAClEL,GAAeC,OACbC,EAAwB,EACpBA,EAAwBF,GAAeM,SACvCrJ,GAAesJ,gBAAkBhK,KAAKiK,eAAeC,c,4DAM3DT,GAAeM,SAAW,GAA8B,GAAzBN,GAAeC,SAChDD,GAAeC,OAAS,K,6CAO1B,IAFA,IACI7B,EAAiC,GAE/BsC,EAH4BzJ,GAAe0J,0BAGX,EAAIpK,KAAKiK,eAAeC,UAC5DC,GAAKnK,KAAKiK,eAAeI,UACzBF,IAEAtC,EAAQyC,KAAK,CACXzH,MAAM,GAAD,OAAKsH,GACVI,YAAY,GAAD,OAAKJ,GAChBK,WAAYL,IAAMV,GAAeC,SAGrC,OAAO7B,I,uCAIP,MACE,MACAnH,GAAe+J,eACf,IACArP,EAAKgJ,EAAE,0BACP,M,kDAIwBsG,GAC1B,OAAQA,GACN,IAAK,SACH,OAAOtP,EAAKgJ,EAAE,6BAChB,IAAK,WACH,OAAOhJ,EAAKgJ,EAAE,8BAA+B,CAC3CuG,iBAAkB3K,KAAK4K,mBAE3B,QACE,OAAOxP,EAAKgJ,EAAE,iC,gDAKlByG,GAES,IADTH,EACQ,uDADO,UAEf,OAAQG,GACN,KAAK,EACH,MAAO,GACT,QACE,OACEA,EACA,IACA7K,KAAK8K,wBAAwBD,EAAgBH,M,8CAK7BG,EAAwBH,GAC9C,OAAQA,GACN,IAAK,SACH,OAAOG,EAAiB,EACpBzP,EAAKgJ,EAAE,2BACPhJ,EAAKgJ,EAAE,0BACb,IAAK,WAKH,OAHEyG,EAAiB,EACbzP,EAAKgJ,EAAE,6BACPhJ,EAAKgJ,EAAE,2BACU,IAAMpE,KAAK4K,iBACpC,QACE,OAAOC,EAAiB,EACpBzP,EAAKgJ,EAAE,2BACPhJ,EAAKgJ,EAAE,8B,qCA5Gf,OACEpE,KAAKoJ,kBACJpJ,KAAKoJ,gBAAkB1I,GAAeqK,kB,6BANzC,OAHK/K,KAAKgL,UACRhL,KAAKgL,QAAU,IAAI7B,GAEdnJ,KAAKgL,Y,KAPV7B,GACG6B,a,EA2HM7B,UAAuB1I,MC7HhCwK,G,6GAUF,IAAMC,EAAcxK,GAAewK,YAC7BC,EAAkBlL,GAAkBkL,kBAC1C,OAAOD,IAEHC,QAEA3K,K,uCAGJ,IAAI4K,EAAkCpL,KAAKqL,qBAC3C5B,GAAenI,KAAO8J,EACtB3B,GAAe6B,aAAeF,GAE1B5J,OAAS+J,QAAQ,W,2CAGrB,IAAMC,EAAc9K,GAAe8K,YAC7BC,EAAkBxL,GAAkBwL,kBAC1C,OAAOD,IAEHC,QAEAjL,K,uCAGJ,IAAIkL,EAAkC1L,KAAK2L,qBACxCD,IACDjC,GAAe1H,KAAO2J,M,6BA/BxB,OAHK1L,KAAKgL,UACRhL,KAAKgL,QAAU,IAAIC,GAEdjL,KAAKgL,Y,KANVC,GACGD,a,EAyCMC,UAAsBxK,MClCrCmL,EAAQ,K,ICiDJC,GDgKSpC,GAAiB,I,iDA9MpBqC,W,OACAC,cAA+BvK,OAAS+J,QAAQ,S,KAChDS,MAAgB,G,KAChBC,QAAkB,E,KAClBC,UAAoB,E,KACpBC,QAAyB,K,KACzBC,MAAuB,K,KACvBC,eAAuC,G,KACvCC,YAAsB,E,KACtBC,eAAuC,K,KACvCC,oBAA8B,E,KAC/BC,qBAAsD,IAAIC,K,yDAG/DC,GAAuBC,0BAGvBC,GAA6BC,iBAC7BD,GAA6BE,iBAE7B/M,KAAKgN,mBAELhN,KAAK+B,KAAO,GACZ/B,KAAKiN,OAAS,KACdjN,KAAKkN,cAAgB,KACrBlN,KAAKmN,cAAgB,GACrBnN,KAAKoN,WAAa,I,6CAIlB,IAAMC,EAAS3M,GAAe2M,OACxBC,EAAkBrN,GAAkBqN,kBAC1C,OAAOD,IAAkBC,GAAoC,Q,yCAI7DtN,KAAKuN,KAAOvN,KAAKwN,yB,+BA4CHC,GACVzN,KAAKkN,gBACPlN,KAAKkN,cAAc1C,YAAa,GAElCiD,EAAMjD,YAAa,EACnBxK,KAAKkN,cAAgBO,I,oCAIjBzN,KAAKkN,gBACPlN,KAAKkN,cAAc1C,YAAa,GAElCxK,KAAKkN,cAAgB,O,0CAWIQ,EAAuBC,GAChD,IAAMC,EAAQ5N,KAAKqM,eAAewB,WAChC,SAAC7I,GAAD,OAAyBA,EAAK8I,SAAWJ,MAE5B,IAAXE,IACF5N,KAAKqM,eAAeuB,GAAOG,MAAQJ,EACnC3N,KAAKoN,WAAapN,KAAKqM,eAAe2B,QACpC,SAACC,EAAcC,GACb,OAAOD,EAAOC,EAAKH,QAErB,M,wCA6BmBI,GACnBhQ,EAAWiQ,WAAaD,IAC1BnO,KAAKuN,KAAO,Q,0CAIWc,GACzB,IAAIC,EAAkBtO,KAAKsL,aACxBiD,QACAC,IAAIH,EAAoB,UACxB9C,QAAQ,SACPvL,KAAKsL,eAAiBgD,IACxBtO,KAAKsL,aAAe9J,KAAO8M,M,iCAIbG,GAAkB,IAAD,GAC7B,UAAAzO,KAAKsB,YAAL,eAAWoN,OAAO,kBAAmBD,EAAWC,OAAO,iBACzD1O,KAAKsB,KAAOmN,K,gCAqBCE,GACf,OAAQA,GACN,KAAK1Q,EAAeyL,OAClB1J,KAAK0J,OAAS,EACd1J,KAAK+J,SAAW,EAChB,MACF,KAAK9L,EAAeqD,KAClBtB,KAAKsB,KAAOE,OAASoN,SAAS,EAAG,QACjC,MACF,KAAK3Q,EAAe8D,KAClB/B,KAAK+B,KAAO,M,kCAUhB/B,KAAKsB,KAAOE,KAAO,MACnBxB,KAAK+B,KAAO,K,6BAlKZ,OAAO/B,KAAKiM,S,aAGI4C,GAChB7O,KAAKiM,QAAU4C,I,+BAIf,OAAO7O,KAAKkM,W,aAGM4C,GAClB9O,KAAKkM,UAAY4C,I,2BAIjB,OAAO9O,KAAK8L,O,aAGEiD,GACd/O,KAAK8L,MAAQiD,I,2BAIb,OAAO/O,KAAKgM,O,aAGEgD,GACdhP,KAAKgM,MAAQgD,I,kCAGUvB,GACvBzN,KAAKuM,eAAiBkB,EACtBzN,KAAKyM,qBAAqBwC,KAAKxB,I,eAI/B,OAAOzN,KAAKuM,iB,kCAkBW2C,GACvBlP,KAAKqM,eAAiB6C,G,eAItB,OAAOlP,KAAKqM,iB,iCAmBZ,OAAOrM,KAAKsM,a,aAGQ6C,GACpBnP,KAAKsM,YAAc6C,I,2BAGHC,GAChBpP,KAAKmM,QAAUiD,G,eAIf,OAAOpP,KAAKmM,U,yBAGEkD,GACdrP,KAAKoM,MAAQiD,G,eAIb,OAAOrP,KAAKoM,Q,mCA0BZ,OAAOpM,KAAK+L,e,aAGUgD,GACtB/O,KAAK+L,cAAgBgD,I,wCAIrB,OAAO/O,KAAKwM,oB,aAGe8C,GAC3BtP,KAAKwM,mBAAqB8C,M,MC5LxBC,GACe,8CAIfC,G,0GACqBC,GACvB,IAGMC,IAFU,OAAdhP,SAAc,IAAdA,QAAA,EAAAA,GAAgBkJ,SAAS+F,oBAAqBvU,EAAKyM,QAAQnM,eAEf0J,SAC5CwK,UAAUC,SAASC,MAAM,EAAG,IAE1BF,UAAUC,SAASC,MAAM,EAAG,GAC5B,GACJ1U,EAAK2U,eACHC,KAA6BC,qBAC3BjQ,KAAKkQ,yBAA2BR,GAAsBD,M,gDAQ1D,IAAMU,EACJlQ,GAAkBkQ,oBACdC,EAAYJ,KAA6BK,aAC7CjV,EAAKyM,QAAQnM,eAEfyU,GACAC,EAAUhL,SACR4K,KAA6BM,qBAAqBH,IAEhD/U,EAAK2U,eAAeI,GACpBnQ,KAAKuQ,kBAAkB7P,GAAe8P,sB,8CAI1C,IAAK,IAAD,EACF,OACE,UAAAC,aACGC,QAAQnB,WADX,eAEIoB,gBAAiB,GAEvB,MAAO9M,GACP,MAAO,K,aAIwBhB,GACjC,IACE4N,aAAaG,QAAQrB,GAAoC1M,GACzD,e,KAMOgO,GAAyB,WAIpC,OAHKhF,KACHA,GAAsB,IAAI2D,IAErB3D,I,mBC3DIiF,GAAe,SAC1BlP,EACAiB,EACAkO,GAH0B,OAK1B,IAAIC,KAAKC,aAAarP,EAAQ,CAC5BsP,MAAO,WACPC,SAAUJ,IACTrC,OAAO7L,IAECuO,GAAa,SAACC,GACzB,OAAOA,EAAOC,OAAO,GAAGC,cAAgBF,EAAOvB,MAAM,ICoB1C0B,GAAmB,I,iDArCtBC,QAAsB,G,KACtBC,QAAsB,G,KACtBC,OAAqB,G,kDAG3B,OAAO3R,KAAK2R,Q,aAWGzC,GACflP,KAAK2R,OAASzC,I,wCARd,OAAOlP,KAAK2R,OAAOC,QAAO,SAAA5M,GAAI,OAA4B,IAAxBA,EAAK6M,oB,sCAIvC,OAAO7R,KAAK2R,OAAOC,QAAO,SAAA5M,GAAI,OAA4B,IAAxBA,EAAK6M,oB,6BAQvC,OAAO7R,KAAK0R,S,aAGII,GAChB9R,KAAK0R,QAAUI,I,6BAIf,OAAO9R,KAAKyR,S,aAGIM,GAChB/R,KAAKyR,QAAUM,M,MC8RNC,GAAsB,I,iDAhTzBC,gBAAkC,G,KAClCC,kB,OACAC,cAAwB,E,KACxBC,uBAAiC,E,gEA+BvCpS,KAAKqS,eAAeC,cAAgBvU,EAAawU,Y,uCAWjD,SAAIvS,MAAQA,KAAKqS,gBAAkBrS,KAAKwS,eAC/BxS,KAAKwS,eAAiBzU,EAAa0U,U,+CA6CdC,GAA8B,IAAD,QACrD9Q,EAASoO,KAA6B2C,sBAAsBD,GAC5DE,EAAmBlS,GAAe8P,mBAClCnP,EAAI,8BACRrB,KAAKiS,gBAAgBY,uBADb,aACR,EAAsCC,oBAD9B,kBAER9S,KAAKiS,gBAAgBY,uBAFb,aAER,EAAsCxR,YAF9B,QAGR,KACF,GAAIA,EAAM,CACR,IAAM0R,EAAQ1R,EAAKO,IAAWP,EAAKuR,IAAqBvR,EAAI,GAC5D,OAAO2R,mBAAmBD,GAE5B,OAAO,O,wDAaP,MAAuB,cADL/S,KAAKiT,WAAWC,aACG,UAAY,iB,4DAIjD,OAAOlT,KAAKiT,WAAW9B,W,wDAGqC,IAAD,EAC3D,KAAI,UAACnR,KAAKiT,kBAAN,aAAC,EAAiBE,QACpB,OAAO,EAET,IAAIA,EAASnT,KAAKiT,WAAWE,OAC7B,OAAIA,EACKA,EAAS,SADlB,I,4CAMA,OAAOnT,KAAKiS,gBAAgBmB,kB,4CAGS,IAAD,EACpC,iBAAOpT,KAAKiS,gBAAgBoB,sBAA5B,W,wCAIA,OAAOrT,KAAKiS,gBAAgBK,gB,2CA4H5BpD,EACAoE,GAEA,OAAOxU,OAAOyU,OAAP,MAAAzU,OAAM,CACX,IADW,oBAERoQ,EAAM9G,KAAI,SAACpD,GAAD,sBAAoBA,EAAKwO,GAAKF,EAAQlO,SAASJ,EAAKwO,a,yCAzQ5CC,GACvBzT,KAAKoS,sBAAwBqB,G,eAI7B,OAAOzT,KAAKoS,wB,gCAGEqB,GACdzT,KAAKmS,aAAesB,G,eAIpB,OAAOzT,KAAKmS,e,mCAGKuB,GACjB1T,KAAKiS,gBAAkByB,G,eA0DvB,OAAO1T,KAAKiS,kB,8BAtDZ,OAAOjS,KAAKqS,eAAelR,U,+BAI3B,OAAOnB,KAAKqS,eAAetI,W,mCAQ3B,GAAI/J,KAAKqS,eACP,OAAOrS,KAAKqS,eAAeC,gB,yBAWtBqB,GACP3T,KAAKqS,eAAehR,KAAOsS,I,gCAGb5W,GACdiD,KAAKkS,aAAenV,G,eAIpB,OAAOiD,KAAKkS,e,oCAIZ,IAAIe,EAAajT,KAAKqS,eAAeY,WACrC,GAAIA,EAAY,CACd,GAAkC,OAA9BA,EAAWW,eAAyB,CACtC,IAAIC,EAAoB,CACtBC,cAAeb,EAAWW,gBAE5B,OAAOG,sBACL/T,KAAKqS,eAAeY,WAAWe,WAC/BH,GAGF,OAAOE,sBAAW/T,KAAKqS,eAAeY,WAAWe,e,4CAUrD,OAAOhU,KAAKiS,gBAAgBgC,c,aAGJC,GACxBlU,KAAKiS,gBAAgBgC,aAAeC,I,iCAkBpC,OAAOlU,KAAKiS,gBAAgBgB,Y,aAGRA,GACpBjT,KAAKiS,gBAAgBgB,WAAaA,I,qCAmClC,GAAKjT,KAAKiT,WAAV,CAGA,IAAIkB,EAAqBnU,KAAKoU,kCAC9B,GAAID,EAAoB,CACtB,IAAIE,EAAmBvD,GACrB1V,EAAKyU,SACLsE,EACAnU,KAAKsU,uCAEDC,EAAQ7T,GAAe8T,0BACvBC,EAAeC,KAAKC,MAAMJ,EAAQ,IAClCK,EAAgBF,KAAKC,MAAMJ,EAAQ,IACnCM,EAAe,IAAIC,KACvB9U,KAAKqS,eAAe/Q,KAAO,IAAMtB,KAAKqS,eAAe0C,KAAO,OAExDC,EAAQH,EAAaI,WAAaL,EACxCC,EAAaK,SAASF,GACtB,IAAIG,EAAc3T,KAAOqT,GACtBrG,KAAK,EAAIiG,EAAc,QACvB7S,OAAOxG,EAAKyU,UACXvO,EAAO6T,EAAYzG,OAAO,MAC1B3M,EAAOoT,EAAYzG,OAAO,MACxB0G,EACsC,WAA1CpV,KAAKqV,kCACDd,EAAQ,EACN,UACA,wBACF,eACFe,EAAkBla,EAAKgJ,EAAL,0CACegR,GACnC,CACEjC,OAAQkB,EACR/S,KAAMA,EACNS,KAAMA,IAKV,OAFAuT,GAAmB,OACnBA,GAAmBla,EAAKgJ,EAAE,yC,kCAK5B,OAAOpE,KAAKiS,gBAAgB9P,e,oCAEmB,IAAD,EAC9C,iBAAOnC,KAAKiS,gBAAgBsD,sBAA5B,QAA8C,I,aAwBvBpI,GACvBnN,KAAKiS,gBAAgBsD,eAAiBpI,I,sEArBtC,OAAOnN,KAAKwV,iBACPxV,KAAKyV,uC,2DAKV,OACEzV,KAAK0V,sBAAwB1V,KAAKmB,SAClCsI,GAAe2D,YAAcpN,KAAKmB,U,0CAKpC,OAAOnB,KAAKmN,cAAca,QACxB,SAAC2H,EAAiB3Q,GAAlB,OACa2Q,EAAU3Q,EAAK4Q,WAC5B,K,+CAQiD,IAAD,EAClD,iBACE5V,KAAKmN,cAAcyE,QAAO,SAAC5M,GAAD,OAAkC,IAAxBA,EAAK6M,kBAAyB,UADpE,QAEE,O,uCAKF,OAAO7R,KAAKiS,gBAAgB4D,W,oCAI5B,OAAO7V,KAAKiS,gBAAgBxE,Q,6CAGS,IAAD,EACpC,iBAAOzN,KAAKiS,gBAAgB6D,gCAA5B,W,6CAIA,OAAQ9V,KAAK+V,yBAET/V,KAAKwV,eACLxV,KAAKyV,qCACLzV,KAAKmN,cAAcvE,OAAS,K,qCAEH,IAAD,EAC5B,iBAAO5I,KAAKiS,gBAAgB+D,wBAA5B,W,kDAE0C,IAAD,EACzC,iBAAOhW,KAAKqS,eAAe4D,mCAA3B,W,kCAIA,OAAOjW,KAAKiW,8BAEPvV,GAAewV,sB,uCAIpB,OAAOlW,KAAKmN,cAAc/E,KAAI,SAAC+N,GAAD,OAC5BjV,OAAOiV,EAAaC,oB,0CAetB,GAAiD,IAA7CpE,GAAoB7E,cAAcvE,OACpC,OAAO9J,OAAOyU,OAAP,MAAAzU,OAAM,CACX,IADW,oBAER0S,GAAiBtC,MAAM9G,KAAI,SAACpD,GAAD,sBAAoBA,EAAKwO,IAAK,SAIhE,IAAI6C,EAA4BrW,KAAKsW,yBACrC,GAAkC,OAA9BD,EAGF,OAAOrW,KAAKuW,qBAAqB/E,GAAiBtC,MAAO,CACvDhO,OAAOmV,EAA0BD,iBAIrC,IAAII,EAAmChF,GAAiBiF,gBAAgBrO,KACtE,SAACpD,GACC,OAAOA,EAAKwO,MAGhB,OAAOxT,KAAKuW,qBAAqB/E,GAAiBtC,MAAOsH,K,mCAGjCE,GACxB1W,KAAKiS,gBAAgByE,eAAiBA,M,8CC3TpC7O,GAAU,CACd8O,YAAY,EACZC,OAAO,GAGHC,G,iDACJC,gCAA0C,E,KAC1CC,YAAsB,E,gEAWpB,IAAMC,EAAkBtW,GAAesW,iBACvC,OAAIA,QAAJ,IAAIA,OAAJ,EAAIA,EAAiBC,qBACnBC,KAAW3b,KAAKyb,EAAgBC,uBAAmBzW,EAAWqH,IAC9D7H,KAAK8W,gCAAiC,EACtC9W,KAAKmX,mB,sCAKPnX,KAAK+W,YAAa,EACd/W,KAAK8W,gCACPI,KAAWC,kB,qCAKbnX,KAAK+W,YAAa,EACd/W,KAAK8W,gCACPI,KAAWE,kB,6BAtBb,OAHKpX,KAAKgL,UACRhL,KAAKgL,QAAU,IAAI6L,GAEd7W,KAAKgL,Y,KATV6L,GAGG7L,a,EAiCM6L,ICkCXQ,GDlCWR,MAAqBpW,ME4bvBC,GAAiB,I,4DA3crBkJ,SAA2B,G,KAC3B0N,uBAAiC,E,KACjCC,mBAA6B,E,KA8a7BC,uBAAyB,SAAC1T,GAC/B,EAAK8F,SAAW9F,EAChB7D,GAAkBb,aAAeqY,OAAO,EAAK7N,SAAS8N,WAAWlE,IACjEvT,GAAkBd,YAAc,EAAKyK,SAAS+N,aACzCjX,GAAe6W,oBAClB1G,KAAyB+G,0BACzB/K,GAA6BC,kBAE/BH,GAAuBC,0BACvBnD,GAAeuD,mBACfH,GAA6BE,iBAC7B8K,GAAqBC,oBACrB,IAAMxX,EAAe,IAAIyX,gBAAgBC,SAASC,SAASC,QAC3D,EAAKtO,SAASuO,yBAA2B7X,EAAaG,IAAI,Q,kEAxb1D,OAAOT,KAAK4J,SAAS+F,oB,yCAGY,IAAD,IAChC,2BAAO3P,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0B9V,cAAjC,QAA2C,O,0CAGT,IAAD,IACjC,2BAAO5B,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0BU,YAAjC,QAAyC,K,wCAGT,IAAD,EAC/B,OAAOX,OAAM,UAACzX,KAAK4J,SAAS8N,kBAAf,aAAC,EAA0BlE,M,uCAMxC,OAAOxT,KAAK4J,SAAS+N,e,oCAGe,IAAD,IACnC,MAAO,CACLzN,UAAS,UAAElK,KAAK4J,SAAS8N,WAAWW,mBAA3B,QAA0C,EACnDhO,UAAS,UAAErK,KAAK4J,SAAS8N,WAAWY,mBAA3B,QAA0C,M,oCAoLlC5F,EAAcuF,GACjC,IAAMtW,EAAUqO,KAA6B2C,sBAAsBD,GACnE,OAAIuF,EAASM,SAAS,aACbvY,KAAKwY,sBAAsB7W,GAE7BqQ,GAAoByG,yBAAyB9W,K,qCAGhCC,GACpB,OAAIoQ,GAAoB0G,iBACf1Y,KAAK2Y,sBAAsB/W,GAE7B,O,kDAIPA,GAEA,IAAID,EAAUqO,KAA6B2C,sBAAsB/Q,GACzDgX,EAAqB5Y,KAAK4J,SAA1BgP,iBACR,OAAOA,GAAoBA,EAAiBC,aACxCD,EAAiBC,aAAaC,MAC5B,SAACC,GAAD,OAAoCA,EAAenX,SAAWD,UAEhEnB,I,4CAGuBoB,GAC3B,IAGoB,EAHdmX,EACJ/Y,KAAKgZ,4BAA4BpX,GAC/BsE,EAAyB,KACzB6S,IACF7S,EAAO,UACL6S,EAAeE,0BADV,QACgCF,EAAeG,iBAExD,OAAOhT,I,4CAGoBwM,GAA8B,IAAD,QAClDrR,EAAI,8BACRrB,KAAK4J,SAAS8N,WAAW7E,uBADjB,aACR,EAA0CC,oBADlC,kBAER9S,KAAK4J,SAAS8N,WAAW7E,uBAFjB,aAER,EAA0CxR,YAFlC,QAGR,KACF,GAAIA,EAAM,CACR,IAAM0R,EACJ1R,EAAKqR,IAASrR,EAAKrB,KAAK4J,SAAS8N,WAAW9V,SAAWP,EAAI,GAC7D,OAAO2R,mBAAmBD,GAE5B,OAAO,O,uCAGenR,GAAqC,IAAD,EACpDuX,EAAiBnZ,KAAK4J,SAASwP,WAAWC,iBAI1C1X,EAHUwX,EAAeN,aAAazQ,KAC1C,SAACnO,GAAD,OAAiBA,EAAY2H,UAEPwD,SAASxD,GAAUA,EAAS,KACpD,OAAOuX,GAAkBA,EAAeN,aAAjC,UACHM,EAAeN,aAAaC,MAC1B,SAACQ,GAAD,OAAgCA,EAAc1X,SAAWD,YAFxD,aACH,EAEG4X,UACH/Y,I,2DA6GJoB,GACqB,IAAD,EACdD,EAAUqO,KAA6B2C,sBAAsB/Q,GAC7D4X,EAAgBxZ,KAAK4J,SAASC,oBAAoB4P,cACxD,OAAOD,EAAa,UAChBA,EAAcV,MACZ,SAACY,GAAD,OAAgCA,EAAa9X,SAAWD,YAF1C,aAChB,EAEG8X,mBACHjZ,I,yCAO8B,IAAD,EACjC,SAAQ,UAACR,KAAKgX,uBAAN,aAAC,EAAsBC,qB,qCAGXhK,GACpB,IAGI0M,EAHAhY,EAAUqO,KAA6B2C,sBACzCvX,EAAKyU,UAGP,GAAmD,kBAAxC7P,KAAK4J,SAAS8N,WAAWkC,QAAQ,GAAiB,CAC3D,IAAIC,EAAkC,QACgBrZ,IAAlDR,KAAK4J,SAAS8N,WAAWoC,uBAC3BD,EAAW7Z,KAAK4J,SAAS8N,WAAWoC,qBAAqBlI,QACvD,SAACmI,GAAD,OACEjb,OAAOwG,KAAKyU,GAAqBC,mBAAqB/M,MAG5D0M,EACEE,EAASjR,OAAS,EACd9J,OAAOC,OAAO8a,EAAS,IAAI,GAAGlY,QAC9BnB,MACD,CAAC,IAAD,EACC2L,EAAUnM,KAAK4J,SAAS8N,WAAWkC,QAAQd,MAC/C,SAACc,GAAD,OAAkCA,EAAQ3M,SAAWA,KAEvD0M,EAAiBxN,EAAO,UACpBA,EAAQ0M,aAAaC,MACnB,SAAC7e,GAAD,OAAqCA,EAAY2H,SAAWD,YAF1C,aACpB,EAEG4X,UACH/Y,EAEN,OAAOmZ,GAEHve,EAAKgJ,EAAE,qBAAuB6I,K,2CAsBlC,IAAMzF,EAASvH,GAAkBwD,cACjC,OC1d6B,SAC/BrE,EACAE,EACAC,EACAC,GAEA,IAAMmJ,EAAW,IAAIO,GACjBR,EAAc,GAwBlB,YAvBqBlI,IAAjBpB,GAA8B,WAAW6a,KAAK7a,IAChDsJ,EAAY4B,KAAK,CACfxB,eAAgB,gBAChBC,gBAAiB3J,SAGHoB,IAAdlB,QAA4CkB,IAAjBjB,IAC7BmJ,EAAY4B,KAAK,CACfxB,eAAgB,aAChBC,gBAAiBzJ,IAEnBoJ,EAAY4B,KAAK,CACfxB,eAAgB,gBAChBC,gBAAiBxJ,KAGjBC,GACFkJ,EAAY4B,KAAK,CACfxB,eAAgB,UAChBC,gBAAiBvJ,IAGrBmJ,EAASuR,eAAexR,GACjBH,KAAiB9H,IAAIkI,GD2bnBwR,CACL3S,EAAOpI,aACPoI,EAAOlI,UACPkI,EAAOjI,aACPiI,EAAOhI,SACP2I,KAAKiS,aAAIpa,KAAKwX,2B,uCAtahB,MAAM,GAAN,OAAU9W,GAAeE,iBAAzB,YAA6CF,GAAeG,qB,oCAG1B,IAAD,IACjC,2BAAOb,KAAK4J,SAASyQ,aAArB,aAAO,EAAqBC,sBAA5B,QAA8C,K,8CAGF,IAAD,IAC3C,2BAAOta,KAAK4J,SAASyQ,aAArB,aAAO,EAAqBE,iCAA5B,QAAyD,K,uCAGpB,IAAD,IACpC,2BAAOva,KAAK4J,SAASyQ,aAArB,aAAO,EAAqBG,0BAA5B,QAAkD,K,mCAGA,IAAD,OAC7CC,EAAeza,KAAK4J,SAMxB,MALA,CAAC,WAAY,SAAU,UAAW,WAAWlH,SAAQ,SAACgY,GAAW,IAAD,EAE9DD,EADwB,QAAUC,GAClC,UACE,EAAK9Q,SAAS+Q,oCADhB,aACE,EAA4CvV,SAASsV,MAElDD,I,kCAIP,OAAOza,KAAK4J,SAASgR,uB,kCAIrB,OAAO5a,KAAK4J,SAASiR,e,4CAIrB,IAAIC,EAAwB,CAC1B,WACA,YACA,eACA,SAIF,OAFK9a,KAAK4J,SAASmR,mBAAmBD,EAAsBxQ,KAAK,SAE1DwQ,I,2CAIP,OAAO9a,KAAK4J,SAAS8N,WAAWsD,uB,2CAGU,IAAD,EACzC,iBAAOhb,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0BuD,yB,wCAIjC,OAAOjb,KAAK4J,SAASsR,a,yCAIrB,OAAOlb,KAAK4J,SAASuR,yB,0CAGgB,IAAD,EACpC,iBAAOnb,KAAK4J,SAASwR,aAArB,aAAO,EAAqBC,sB,iCAI5B,OAAOrb,KAAK4J,SAAS0R,aAAe,W,yCAGG,IAAD,IACtC,2BAAOtb,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0B6D,iBAAjC,QAA8C,iB,4BAI9C,OAAOvb,KAAK4J,SAAS8N,WAAY8D,Q,8BAIjC,OAAOxb,KAAK4J,SAAS8N,WAAY8D,MAAMpT,KAAI,SAACmF,GAAD,OAAUA,EAAKiG,Q,yCAGlB,IAAD,IACvC,kBACG,UAAAxT,KAAK4J,SAAS6R,wBAAd,eAAgCC,uBAC/B1b,KAAK2b,QAAQ/S,OAAS,SAF1B,W,2CAO0C,IAAD,IACzC,2BAAO5I,KAAK4J,SAAS6R,wBAArB,aAAO,EAAgCG,6BAAvC,W,0CAGkC,IAAD,IACjC,2BACE5b,KAAK4J,SAAS6R,wBADhB,aACE,EAAgCI,qCADlC,W,yCAKiC,IAAD,IAChC,2BAAO7b,KAAK4J,SAAS6R,wBAArB,aAAO,EAAgCK,yBAAvC,W,8BAIA,MAAoD,kBAAzC9b,KAAK4J,SAAS8N,WAAYkC,QAAQ,GAEzC5Z,KAAK4J,SAAS8N,WAAYkC,QACZxR,KAAI,qBAAG6E,UAElBjN,KAAK4J,SAAS8N,WAAYkC,U,wCAIjC,OAAO5Z,KAAK4J,SAAS8N,WAAYqE,oB,qCAIjC,OAAO/b,KAAK4J,SAASwR,Q,mCAIrB,OAAOpb,KAAK4J,SAASwR,MAAMY,e,6CAI3B,OAAOhc,KAAK4J,SAASuO,yB,yCAGmB,IAAD,IACvC,2BAAOnY,KAAK4J,SAAS6R,wBAArB,aAAO,EAAgCQ,6BAAvC,W,qCAGmC,IAAD,EAClC,iBAAOjc,KAAK4J,SAAS8N,WAAWwE,uBAAhC,QAAmD,I,yCAInD,OAA6C,IAAtCpd,OAAOwG,KAAKtF,KAAK4J,UAAUhB,S,oDAGiB,IAAD,IAClD,2BACE5I,KAAK4J,SAAS6R,wBADhB,aACE,EAAgCU,uCADlC,W,gDAK8C,IAAD,IAC7C,2BAAOnc,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0B0E,oCAAjC,QAAiE,I,2CAGvB,IAAD,IACzC,2BAAOpc,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0B2E,+BAAjC,W,sCAIA,OAAOrc,KAAK4J,SAAS0S,mB,oCAIrB,OAAOtc,KAAK4J,SAASwP,WAAWmD,O,mCAIhC,OAAOvc,KAAK4J,SAASwP,WAAW9b,M,gDAGe,IAAD,MAC9C,2BACE0C,KAAK4J,SAAS8N,kBADhB,iBACE,EAA0B3N,gBAD5B,aACE,EAAoCyS,mCADtC,W,qCAKmC,IAAD,MAClC,2BAAOxc,KAAK4J,SAAS8N,kBAArB,iBAAO,EAA0B3N,gBAAjC,aAAO,EAAoC0S,wBAA3C,QAA+D,K,kCAoE/D,OAAOzc,KAAKsJ,sBACTtJ,KAAK0c,0BACN1c,KAAK4J,SAASC,oBAAoB8S,aAChCnb,KAAOxB,KAAK4J,SAASC,oBAAoB8S,mBACzCnc,I,kCAIJ,OAAOR,KAAKsJ,sBACTtJ,KAAK0c,0BACN1c,KAAK4J,SAASC,oBAAoB+S,aAChCpb,KAAOxB,KAAK4J,SAASC,oBAAoB+S,cACtCC,GAAG7c,KAAK8c,oBACRpO,OAAO,MACR,IACAlN,KAAOxB,KAAK4J,SAASC,oBAAoB+S,cAAclO,OAAO,WAChElO,I,wCAIJ,OAAOR,KAAK4J,SAASC,sB,qCAIrB,OAAO7J,KAAKsJ,sBACTtJ,KAAK0c,0BACN1c,KAAK4J,SAASC,oBAAoBC,gBAChC9J,KAAK4J,SAASC,oBAAoBC,qBAClCtJ,I,6BAIJ,OAAOR,KAAKsJ,sBACTtJ,KAAK0c,0BACN1c,KAAK4J,SAASC,oBAAoB/H,QAChC9B,KAAK4J,SAASC,oBAAoB/H,QAClC,O,0CAIJ,IAAK9B,KAAK4J,SAASC,oBACjB,OAAO,EAFwB,MAK/B7J,KAAK4J,SAASC,oBADRF,EAJyB,EAIzBA,sBAAuBgT,EAJE,EAIFA,aAAcC,EAJZ,EAIYA,aAE7C,OAC4B,OAA1BjT,GACiB,OAAjBgT,GACiB,OAAjBC,I,+CAKF,OACE5c,KAAKsJ,qBACkD,OAAvDtJ,KAAK4J,SAASC,oBAAoB4P,cAAc,K,6CAIb,IAAD,EACpC,QAAOzZ,KAAK+c,SACR,CAAC,KAAM,MAAM3X,SAAb,UAAsBpF,KAAK4J,SAAS8N,kBAApC,aAAsB,EAA0BlE,M,kDAIV,IAAD,EACzC,QAAOxT,KAAK+c,SACR,CAAC,KAAM,KAAM,KAAM,MAAM3X,SAAzB,UAAkCpF,KAAK4J,SAAS8N,kBAAhD,aAAkC,EAA0BlE,M,mDAIrB,IAAD,EAC1C,QAAOxT,KAAK+c,SACR,CAAC,KAAM,KAAM,MAAM3X,SAAnB,UAA4BpF,KAAK4J,SAAS8N,kBAA1C,aAA4B,EAA0BlE,M,8BAIpC,IAAD,IACrB,MAAqE,QAA9D,UAAA5W,EAAOK,mBAAP,eAAoB6S,OAAM,UAAAlT,EAAOK,mBAAP,eAAoB2L,QAAS,M,8BAGxC,IAAD,IACrB,MAAqE,QAA9D,UAAAhM,EAAOK,mBAAP,eAAoB6S,OAAM,UAAAlT,EAAOK,mBAAP,eAAoB2L,QAAS,M,wDAI9D,OAAI5I,KAAKgd,4BACA,qBAEF,O,uCAGwB,IAAD,EAC9B,MAGQ,QAFN,OAAAvhB,eAAA,EAAAA,UAAgCqU,OAC9B,OAAArU,eAAA,EAAAA,UAAgCmN,QAAS,KAC7B,CAAC,KAAM,MAAMxD,SAAb,UAAsBpF,KAAK4J,SAAS8N,kBAApC,aAAsB,EAA0BlE,M,sCAKhE,OAAOxT,KAAK4J,SAASqT,mB,4CAeqB,IAAD,IACzC,2BAAOjd,KAAK4J,SAAS8N,kBAArB,aAAO,EAA0BvV,oBAAjC,QAAiD,S,MDla/C+a,G,4DACGC,UAA+B,G,KAE/BC,iBAAmB,SAACC,GACzB,EAAKF,UAAU7S,KAAK+S,I,KAGfC,oBAAsB,WAC3B,EAAKH,UAAY,I,KAGZI,cAAgB,WACrB,EAAKJ,UAAUza,SAAQ,SAAC2a,GACtBA,Q,KAcGpN,qBAAuB,SAACuN,GAC7B,MAAI,CAAC,KAAM,MAAMpY,SAASoY,GACjB,KAEL,CAAC,KAAM,MAAMpY,SAASoY,GACjB,KAEFA,EAAY3b,qB,KAGdyO,qBAAuB,SAAC1O,GAC7B,MAAe,OAAXA,EACK,KAEM,OAAXA,EACK,KAEFA,EAAO2P,e,KAGTlB,aAAe,SAAC3U,GACrB,IAAI0U,EAAsB,GACpBqN,GAAmC,IAAlB/hB,EAA0B,GAAKA,EAQtD,OAPAgF,GAAegd,sBAAsBhb,SAAQ,SAACd,GAC5C,GAAI6b,EAAerY,SAASxD,GAAS,CACnC,IAAI4b,EAAc,EAAKlN,qBAAqB1O,GAC5CwO,EAAU9F,KAAKkT,OAIZpN,G,KAGFuN,gBAAkB,WACvB,OAAQviB,EAAKyU,UACX,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,QACT,IAAK,KACH,MAAO,QACT,IAAK,KACH,MAAO,KACT,QACE,OAAOzU,EAAKyU,W,kEAtDW+N,GAC3B,MAAyC,OAArCA,EAAmBjN,cACd,KAEgC,OAArCiN,EAAmBjN,cACd,KAEFiN,EAAmBjN,kB,KAsDjBX,GAA6B,WAIxC,OAHKqH,KACHA,GAA0B,IAAI6F,IAEzB7F,I,ghBG3ET,IC4BIwG,GD5BEC,GAAiBC,IAAOC,IAAV,MAET,SAACC,GAAD,OAAWA,EAAM7C,MAAM8C,aAOhB,SAACD,GAAD,OAAWA,EAAM7C,MAAM+C,8BAwD5BC,GAAmBC,gBAnCf,WAAO,IACdjjB,EAASkjB,cAATljB,KASFmjB,EAAsBvO,KAA6BM,qBACvDlV,EAAKyU,UAGDO,EAAYJ,KAA6BK,aAC7CjV,EAAKyM,QAAQnM,eAGf,OACE,kBAACoiB,GAAD,CAAgBU,YAAU,kBACxB,kBAAC,IAAD,CACEC,sBAAuB,oBACvBC,SAAUH,EACVnO,UAAWA,EACXuO,4BAA4B,EAC5BC,mBAAmB,EACnBC,SAAU,SAAC7a,GAAD,OAvBQwZ,EAuByBxZ,EAtB/C5I,EAAK2U,eACHC,KAA6BC,qBAAqBuN,SAEpD3M,KAAyBX,wBAA0BsN,GAJ9B,IAACA,GAwBlBsB,qBAAqB,EACrBC,WAAW,EACXC,aAAcC,GACdC,YAAa,S,SEnERC,GAAb,kDACE,aAAe,uCACP,oBAFV,UAA4C1W,IAM/B2W,GAAb,kDACE,WAAY9f,GAAoB,IAAD,8BAC7B,gBACKqI,UAAL,+BAAyCrI,GAFZ,EADjC,UAA6D6f,IAOhDE,GAAb,kDACE,WAAYC,GAA2B,IAAD,8BACpC,gBACK3X,UAAL,WAAqB2X,GAFe,EADxC,UAAkDH,IAOrCI,GAAb,kDACE,WAAYD,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,sBAFmB,EADxC,UAA4D0X,IAO/CG,GAAb,kDACE,WAAYF,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,kBAFmB,EADxC,UAAiD0X,IAOpCI,GAAb,kDACE,WAAYH,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,aAFmB,EADxC,UAAoD0X,IAOvCK,GAAb,kDACE,WAAYJ,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,gBAFmB,EADxC,UAAuD0X,IAM1CM,GAAb,kDACE,WAAYL,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,aAFmB,EADxC,UAAmD0X,IAOtCO,GAAb,kDACE,WAAYN,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,eAFmB,EADxC,UAAsD0X,IAczCQ,GAAb,kDACE,WAAYP,GAA2B,IAAD,8BACpC,cAAMA,IACD3X,UAAY,UAFmB,EADxC,UAA0C0X,ID/DpCS,G,sHAEF,IAAMhe,EAAU2H,GAAe8D,KACzBjM,EAAOmI,GAAenI,KAAMoN,OAAO,cACnCqG,EAAOtL,GAAe1H,KACtBZ,EAAUsI,GAAeC,OAASD,GAAeM,SACjDA,EAAWN,GAAeM,SAC1BgW,EAAc/P,KAA6BC,qBAC/C7U,EAAKyU,UAGDwC,EAA+C,CACnD/Q,OACAyT,OACA5T,UACA4I,WACAiW,eANqBtf,GAAeG,kBAOpCkf,eAEI1e,EAAOpB,GAAkBggB,kBAO/B,OANI5e,IACFgR,EAAehR,KAAOA,GAEpBS,GAAW,QAAUA,IACvBuQ,EAAevQ,QAAUA,GAEpBuQ,M,KEbLpT,GAAcsJ,KAEP2X,GAAqC,WAChD,IAAIvX,EAAW,KADwD,EAEnC1I,GAAkBwD,cAA9CnE,EAF+D,EAE/DA,UAAWC,EAFoD,EAEpDA,aACb8S,GFgBCwL,KACHA,GAAuB,IAAIiC,IAEtBjC,IElB0BsC,8BAOnC,OANA9N,EAAe+N,cAAgB7gB,EAE7BoJ,EADErJ,GAAaC,EACJ,IAAI6f,GAAwC9f,GAE5C,IAAI6f,GAEVlgB,GAAYohB,KAAK1X,EAAU0J,IAkBvBiO,GAA8B,SAAC9M,GAC1C,IAAM+M,EAAMvO,GAAoBK,eAAemB,IAAMA,EAC/C7K,EAAW,IAAI0W,GAA6BkB,GAClD,OAAOthB,GAAYuhB,OAAO7X,EAAU,KA2DzB8X,GAAuB,SAACxc,GAInC,IAAMuP,EAAKvP,EAAKyc,mBACZzc,EAAKyc,mBACL1O,GAAoBK,eAAemB,GACjCkD,EAAiB1E,GAAoBK,eAAeqE,eACpDiK,EAAe1c,EAAK0c,aACpBhY,EAAW,IAAIkX,GAAqBrM,GAC1C,OAAOvU,GAAY2hB,IAAIjY,EAAU,CAAEgY,eAAcjK,oB,6hBC3GnD,IAAMmK,GAAmB9C,IAAO+C,EAAV,MAGN,SAAC7C,GAAD,OAAWA,EAAM7C,MAAM+C,8BAO1B,SAACF,GAAD,OAAWA,EAAM7C,MAAM2F,mBAI9BC,GAAmBjD,YAAOkD,KAAPlD,CAAH,MAGN,SAACE,GAAD,OAAWA,EAAM7C,MAAM+C,8BAO1B,SAACF,GAAD,OAAWA,EAAM7C,MAAM2F,mBA8CvBG,GAAe7C,gBA1Cb,SAACJ,GACd,IAAMkD,EAAgB,WAChBlD,EAAMmD,WACRpP,GAAoBqP,oBACpBf,MAEErC,EAAMqD,aACRrD,EAAMqD,eA+BJC,EA3BgB,SAACC,GACrB,OAAQA,GACN,IAAK,OACH,OACE,kBAACR,GAAD,CACExN,GAAIgO,EACJhD,YAAU,cACViD,GAAIne,GAAqB2a,EAAM1a,OAC/Bme,QAASP,GAET,kBAACQ,GAAA,EAAD,OAGN,QACE,OACE,kBAACd,GAAD,CACErN,GAAIgO,EACJhD,YAAU,iBACVoD,KAAM3D,EAAM1a,MACZme,QAASP,GAET,kBAACU,GAAA,EAAD,QAMMC,CAAc7D,EAAMuD,QAEpC,OAAO,oCAAGD,MClFCQ,GAA0B,SACrC9nB,EACAmb,EACA4M,GAEA,MAAO,CACLC,OAAQhoB,EAAYmb,EAAgB4M,K,yOCAxC,IAAME,GAAsBnE,IAAOC,IAAV,MAOH,SAACC,GAAD,OAAWA,EAAM7C,MAAM+G,kCA+DhCC,GAAe/D,gBA5DJ,WAAO,IACrBja,EAAMka,cAANla,EACR5C,KAAOI,OAAOoO,KAA6B2N,mBAC3C,IAAM0E,EAAoB3hB,GAAe2hB,kBACnCtU,EAAQsU,EAAkB1Y,sBAC1BmF,EAAiBuT,EAAkBvY,gBACnCwY,EAAW5hB,GAAeoc,mBAC1Bxb,EAAOE,KAAO6gB,EAAkBzF,cACnCC,GAAGyF,GACH5T,OAAO,UACJqG,EACJvT,KAAO6gB,EAAkBzF,cAAcC,GAAGyF,GAAU5T,OAAO,MAC3D,IACAlN,KAAO6gB,EAAkBzF,cAAclO,OAAO,MAmChD,OACE,kBAACwT,GAAD,CAAqB1D,YAAU,iBAC7B,0BACE+D,wBAAyBR,GACvB3d,EArCW,WACjB,OAAQ0K,GACN,KAAK,EACH,OAAOf,EAAS,EACZ,yCACA,uCACN,QACE,MAAO,kDA+BLyU,GA3BU,WAChB,OAAQ1T,GACN,KAAK,EACH,MAAO,CACLf,QACAzM,OACAyT,QAEJ,QACE,IAAMhL,EACJ+E,EAAkB,EACdA,EAAiB,IAAM1K,EAAE,6BACzB,KAAUA,EAAE,0BAClB,MAAO,CACL2J,QACAhE,WACAzI,OACAyT,SAWA0N,U,8kCCnDV,IAAMC,GAAgB3E,IAAOC,IAAV,MACP,SAACC,GAAD,OAAWA,EAAM7C,MAAMuH,gBAEb,SAAC1E,GAAD,OAClBA,EAAM7C,MAAMwH,cAAgBvkB,EAAYkb,KACpC,QACA0E,EAAM7C,MAAMyH,yBACT,SAAC5E,GAAD,OACPA,EAAM7C,MAAMwH,cAAgBvkB,EAAYkb,KACpC0E,EAAM7C,MAAMyH,sBACZ5E,EAAM7C,MAAM0H,mBACH,SAAC7E,GAAD,OAAWA,EAAM8E,cAClB,SAAC9E,GAAD,OACZA,EAAM7C,MAAMwH,cAAgBvkB,EAAYkb,KACpC,gCACA,UAMa,SAAC0E,GAAD,OACjBA,EAAM9F,uBAAyB,SAAW,aAOxC6K,GAA0BjF,IAAOC,IAAV,MAUvBiF,GAAgBlF,IAAOC,IAAV,MAKL,SAACC,GAAD,OAAqC,IAAzBA,EAAMiF,eAA2B,KAAO,aAY5DC,GAAiBpF,IAAOqF,IAAV,MACR,SAACnF,GAAD,OAAqC,IAAzBA,EAAMiF,eAA2B,KAAO,aAK1DG,GAActF,IAAOC,IAAV,MA0EJsF,GAASjF,gBApEJ,SAACJ,GACjB,IAAMsF,EAAiB7iB,GAAe8iB,oBAChCC,EAAoB/iB,GAAe+iB,kBACnCtL,EAAyBzX,GAAeyX,uBACxC4K,EAAariB,GAAeqiB,WAC5B5jB,EAAcuB,GAAeE,iBAC7B8C,EAAW,UAAM9G,EAAOC,QAAb,0BAAsCsC,GAC/CiF,EAAMka,cAANla,EACF6T,EAAWyL,eACXpa,EAAsB5I,GAAe4I,oBAErCqa,EAAS,WACTxL,IAIFF,EAAS2L,SAASrL,SAAS,cAC3BN,EAAS2L,SAASrL,SAAS,qBAG3BvG,GAAoBqP,oBACpBf,WAE0B9f,IAAxByd,EAAM4F,eAGV5F,EAAM4F,kBAGFtC,EAAUkC,EACd,kBAACN,GAAD,CACED,oBAAwC1iB,IAAxByd,EAAM4F,cACtBnC,QAASiC,EACTG,IAAKL,EACLM,IAAI,KAGN,kBAACd,GAAD,CAAeC,oBAAwC1iB,IAAxByd,EAAM4F,oBACVrjB,IAAxByd,EAAM4F,eAA+Bzf,EAAE,wBAAyB,IACjE,0BAAMsd,QAASiC,GAASJ,IAI5B,OACE,oCACE,kBAACb,GAAD,CACElE,YAAU,SACVrG,uBAAwBA,EACxB4K,WAAYA,GAEX5K,GACC,kBAACkL,GAAD,KACE,kBAACnC,GAAD,CACE3d,MAAOG,EACP0d,UAAU,EACVI,OAAQ,WAIbD,EACD,kBAACyB,GAAD,KACE,kBAAC5E,GAAD,QAGH9U,GAAuB,kBAAC8Y,GAAD,U,2YC9I9B,IAAM4B,GAAgBjG,IAAOC,IAAV,MAKbiG,GAAalG,IAAOC,IAAV,MAOQ,SAACC,GAAD,OAAWA,EAAM7C,MAAM8I,WAIlC,SAACjG,GAAD,OAAWA,EAAM7C,MAAM8C,aACZ,SAACD,GAAD,OAAWA,EAAM7C,MAAM8I,WA+ClCC,GAAoB9F,gBA3ClB,SAACJ,GAAyB,IAC/B7Z,EAAMka,cAANla,EAEJ8B,EAAU,GACVke,EAAc,UAElB,OAAQnG,EAAMla,QACZ,IAAK,YACHmC,EAAU9B,EAAE,mCACZ,MACF,IAAK,cACH8B,EAAU9B,EAAE,uDACZ,MACF,IAAK,UACH8B,EACE,0BACEqc,wBAAyBR,GACvB3d,EACA,qCACA,CACEigB,KAAMpG,EAAMqG,iBAKpB,MACF,IAAK,kBACHpe,EAAU9B,EACR,+DAEFggB,EAAc,OACd,MACF,QACEle,EAAU9B,EAAE,mCAGhB,OACE,kBAAC4f,GAAD,CAAexF,YAAU,sBACvB,kBAACyF,GAAD,CAAYM,UAAWH,GAAcle,OCnErCse,G,oGAUQC,EAAmBC,EAAkBC,GAa/C,MAZuB,CACrBA,EACIvpB,EAAKgJ,EAAL,yCAAyCugB,SACzCnkB,EACJikB,EACAC,GAGuC9S,QAAO,SAACgT,GAC/C,YAAmBpkB,IAAZokB,KAGc5b,KAAK,Q,6BAhB5B,OAHKhJ,KAAK6kB,WACR7kB,KAAK6kB,SAAW,IAAIL,GAEfxkB,KAAK6kB,a,KAPVL,GACWK,c,EA0BFL,UAAe/jB,M,wNCX9B,IAAMqkB,GAAiB/G,IAAOC,IAAV,MAKE,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAiFhCC,GAAiB3G,gBA7Ed,SAACJ,GAAyB,IAChC7Z,EAAMka,cAANla,EACF6gB,EAAUC,GAAeC,YAC7BlH,EAAMwG,UACNxG,EAAMyG,SACNzG,EAAM0G,UAEF5W,EAAQkQ,EAAMtU,sBACdmF,EAAiBmP,EAAMnU,gBACvBwY,EAAW5hB,GAAeoc,mBAChCtb,KAAOI,OAAOoO,KAA6B2N,mBAC3C,IAAMrc,EAAOE,KAAOyc,EAAMlc,MAAM8a,GAAGyF,GAAU5T,OAAO,UAC9CuH,EACJjE,GAAoBiE,4BAEhBlB,EACJvT,KAAOyc,EAAMlc,MAAM8a,GAAGyF,GAAU5T,OAAO,MACvC,IACAlN,KAAOyc,EAAMlc,MAAM2M,OAAO,MACtBgJ,EAAahX,GAAe8iB,oBAuClC,OACE,kBAACsB,GAAD,CAAgBtG,YAAU,mBACxB,0BACE+D,wBAAyBR,GACvB3d,EAzCW,WACjB,OAAQ0K,GACN,KAAK,EACH,OAAOf,EAAQ,EACX,mCACA,iCACN,QACE,MAAO,4CAmCLyU,GA/BU,WAChB,OAAQ1T,GACN,KAAK,EACH,MAAO,CACLmW,UACAlX,QACAzM,OACAyT,OACA2C,cAEJ,QACE,IAAM3N,EACJ+E,EAAiB,EACbA,EAAiB,IAAM1K,EAAE,6BACzB,KAAUA,EAAE,0BAClB,MAAO,CACL6gB,UACAlX,QACAhE,WACAzI,OACAyT,OACA2C,eAWA+K,MAGHxM,GACC,0BACEsM,wBAAyB,CACvBN,OAAQ7d,EAAE,6DCpFTghB,GAAe,I,iDAXlBC,SAAoB,G,kDAEhBC,GACVtlB,KAAKqlB,SAAWC,G,eAIhB,OAAOtlB,KAAKqlB,a,gGCLhB,IAAME,GAAMxH,IAAOqF,IAAV,MAyBIoC,GAASnH,gBArBN,WAAO,IAEfoH,GADWnH,cAATljB,KAEDyU,SACD,4CAGN,OACE,uBACE6V,OAAO,SACPC,IAAI,sBACJ/D,KAAM6D,EACNjH,YAAU,WAEV,kBAAC+G,GAAD,CACEzB,IAAKlnB,EAAOO,aAAe,mCAC3B4mB,IAAI,S,6mBCpBZ,IAAM6B,GAAmB7H,IAAOC,IAAV,MAOA,SAACC,GAAD,OAAWA,EAAM7C,MAAM+G,kCAClC,SAAClE,GAAD,OAAWA,EAAM7C,MAAMyK,iBAO5BC,GAAiB/H,IAAOC,IAAV,MAMd+H,GAAgBhI,IAAOC,IAAV,MAwBNgI,GAAY3H,gBAlBD,WAAO,IAAD,IACtB4H,EAAK,UAAGb,GAAac,QAAQC,eAAxB,aAAG,EAA8BF,MACtC1M,EAAI,UAAG6L,GAAac,QAAQC,eAAxB,aAAG,EAA8B5M,KAE3C,OACE,kBAACqM,GAAD,CAAkBpH,YAAU,cAC1B,kBAACgH,GAAD,MACA,kBAACM,GAAD,CACEtH,YAAU,mBACV+D,wBAAyB,CAAEN,OAAQgE,KAErC,kBAACF,GAAD,CACEvH,YAAU,kBACV+D,wBAAyB,CAAEN,OAAQ1I,S,qpBCrC3C,IAAM6M,GAAUC,YAAH,MAUPC,GAAyBvI,IAAOC,IAAV,MACd,SAACC,GAAD,MAA+B,UAAnBA,EAAMsI,SAAuB,QAAU,cAW3DC,GAAgBzI,IAAOC,IAAV,MAEP,SAACC,GAAD,MAA2B,UAAfA,EAAMwI,KAAmB,OAAS,UAC1C,SAACxI,GAAD,MAA2B,UAAfA,EAAMwI,KAAmB,OAAS,UACxD,SAACxI,GAAD,OAAWA,EAAM7C,MAAMY,gBAElB,SAACiC,GAAD,MAA2B,UAAfA,EAAMwI,KAAmB,QAAU,WAC9C,SAACxI,GAAD,MAA2B,UAAfA,EAAMwI,KAAmB,QAAU,UAC5CL,IAUFM,GAASrI,gBAPJ,SAACJ,GACjB,OACE,kBAACqI,GAAD,CAAwB9H,YAAU,UAAU+H,SAAUtI,EAAMsI,UAC1D,kBAACC,GAAD,CAAeC,KAAMxI,EAAMwI,W,uTCxCjC,IA8BeE,GA9BS5I,YAAOkD,KAAPlD,CAAH,MAEV,SAACE,GAAD,OACPA,EAAM7C,MAAMwL,cAAgBxoB,EAAYyoB,UACpC5I,EAAM7C,MAAM0H,gBACZ7E,EAAM7C,MAAMY,gBACC,SAACiC,GAAD,OACjBA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,YAAc,UAClD,SAAC0E,GAAD,OACXA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,OAAS,UAEtD,SAAC0E,GAAD,OACAA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,OAAS,UACxC,SAAC0E,GAAD,OAClBA,EAAM7C,MAAMwL,cAAgBxoB,EAAYyoB,UACpC5I,EAAM7C,MAAMY,aACZ,iBACI,SAACiC,GAAD,OACRA,EAAM7C,MAAMwL,cAAgBxoB,EAAY0oB,SAAxC,oBACiB7I,EAAM7C,MAAMY,cACzB,UACQ,SAACiC,GAAD,OACZA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KACpC,kCACA,UAEK,SAAC0E,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAC5B,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,OAAS,U,uTC5B1D,ICmBYC,GDnBNC,GAAqBlJ,IAAOC,IAAV,MAEb,SAACC,GAAD,OACPiJ,GACEjJ,EAAM7C,MAAMwL,YACZ3I,EAAMkJ,WAAY,EAClBlJ,EAAM7C,MAAMY,aACZiC,EAAM7C,MAAM0H,gBACZ7E,EAAM7C,MAAMgM,kBAEG,SAACnJ,GAAD,OACjBA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,YAAc,UAClD,SAAC0E,GAAD,OACXA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,OAAS,UAEtD,SAAC0E,GAAD,OACAA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KAAO,OAAS,UACxC,SAAC0E,GAAD,OAClBoJ,GACEpJ,EAAM7C,MAAMwL,YACZ3I,EAAMkJ,WAAY,EAClBlJ,EAAM7C,MAAMY,iBAEN,SAACiC,GAAD,OACRqJ,GACErJ,EAAM7C,MAAMwL,YACZ3I,EAAMkJ,WAAY,EAClBlJ,EAAM7C,MAAMY,aACZiC,EAAM7C,MAAMgM,kBAEF,SAACnJ,GAAD,OACZA,EAAM7C,MAAMwL,cAAgBxoB,EAAYmb,KACpC,kCACA,UAEK,SAAC0E,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAC5B,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,OAAS,UAGpDG,GAAW,SACfN,EACAO,EACAnL,EACAuL,EACAH,GAEA,OAAQR,GACN,KAAKxoB,EAAYyoB,UACf,OAAOM,EAAWnL,EAAeuL,EACnC,QACE,OAAOJ,EAAWC,EAAgBpL,IAIlCqL,GAAqB,SACzBT,EACAO,EACAnL,GAEA,OAAQ4K,GACN,KAAKxoB,EAAYyoB,UACf,OAAOM,EAAW,cAAgBnL,EACpC,QACE,MAAO,gBAIPsL,GAAY,SAChBV,EACAO,EACAnL,EACAoL,GAEA,OAAQR,GACN,KAAKxoB,EAAYyoB,UACf,OAAOM,EAAQ,oBAAgBnL,GAAiB,OAClD,KAAK5d,EAAY0oB,SACf,MAAe,oBAARK,EACUC,EACApL,GACnB,QACE,MAAO,SAGEiL,M,ucCjEHD,K,cAAAA,E,gBAAAA,E,aAAAA,Q,KAMZ,IAAMQ,GAAgBzJ,IAAOC,IAAV,MAkBbyJ,GAAmB1J,IAAOC,IAAV,MAEA,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAGjC,SAAC9G,GAAD,OAAYA,EAAM8I,SAAW,UAAY,aAqCxCW,GAAiBrJ,gBAlCf,SAACJ,GAAmB,IACzB7Z,EAAMka,cAANla,EACR,OACE,kBAACojB,GAAD,CACEjD,UAAWtG,EAAMsI,UAAYS,GAAkBW,OAC/CnJ,YAAU,kBACVhL,GAAG,mBAEFyK,EAAM2J,QAAU,kBAAClB,GAAD,CAAQH,SAAU,UACnC,kBAACkB,GAAD,CAAkBV,SAAU9I,EAAM8I,UAC/B9I,EAAM1a,MACL,kBAAC,GAAD,CACEib,YAAU,uBACVkD,QAASzD,EAAMyD,QACfD,GAAIxD,EAAM1a,MACVwjB,SAAU9I,EAAM8I,SAChBI,SAAUlJ,EAAMkJ,UAEf/iB,EAAE6Z,EAAM4J,gBAGX,kBAAC,GAAD,CACErJ,YAAU,0BACVkD,QAASzD,EAAMyD,QACfqF,SAAU9I,EAAM8I,SAChBI,SAAUlJ,EAAMkJ,UAEf/iB,EAAE6Z,EAAM4J,qBCtERC,GAAb,kDACE,WAAYxoB,GAAoB,IAAD,8BAC7B,cAAMA,IACDqI,UAAY,kBAFY,EADjC,UATA,kDACE,WAAYrI,GAAqB,IAAD,6BAC9B,cAAM,YACFA,IACF,EAAKqI,UAAL,WAAqBrI,IAHO,EADlC,UAAqCmJ,KCE/BxJ,GAAcsJ,K,+hBCUpB,IAAMwf,GAAehK,IAAOC,IAAV,MAGI,SAACC,GAAD,OAAWA,EAAM7C,MAAM+C,8BAElC,SAACF,GAAD,OAAWA,EAAM7C,MAAM2F,mBAQ5BiH,GAAYjK,IAAOkK,KAAV,MAoBFC,GAAQ7J,gBAZD,SAACJ,GACnB,OACE,kBAAC8J,GAAD,CAAcvJ,YAAU,QAAQ9T,KAAMuT,EAAMvT,MACzCuT,EAAM1E,KACN0E,EAAMkK,WAAa,KACnBlK,EAAMmK,WACL,kBAACJ,GAAD,CAAWxJ,YAAU,cAAcP,EAAMmK,e,48BChCjD,ICuBIC,GC7BAC,GFMEC,GAA0BxK,IAAOC,IAAV,MAClB,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAQ5BoB,GAA0BzK,IAAOC,IAAV,MACP,SAACC,GAAD,OAAWA,EAAM7C,MAAM+C,8BAKvCsK,GAAc1K,IAAOC,IAAV,MAKK,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAIvC2D,GAAmB3K,YAAO4K,KAAP5K,CAAH,MAGA,SAACE,GAAD,OAAWA,EAAM7C,MAAMvX,SAI9B,SAACoa,GAAD,OAAWA,EAAM7C,MAAMvX,SAMhC+kB,GAAc7K,IAAOC,IAAV,MAGK,SAACC,GAAD,OAAWA,EAAM7C,MAAM8I,WAuHhC2E,GAAmBxK,gBAhHlB,WAAO,IACXja,EAAMka,cAANla,EADU,EAEY0kB,mBAAiB,IAF7B,mBAEX5iB,EAFW,KAEFsc,EAFE,OAGsBsG,oBAAkB,GAHxC,mBAGXC,EAHW,KAGGC,EAHH,OAIUF,mBAAiB,IAJ3B,mBAIXG,EAJW,KAIHC,EAJG,OAKoBJ,oBAAkB,GALtC,mBAKXK,EALW,KAKEC,EALF,OAM4BN,mBAAmB,IAN/C,mBAMXO,EANW,KAMMC,EANN,OAOcR,oBAAkB,GAPhC,mBAOXS,EAPW,KAODC,EAPC,KASZC,EAAaC,6BAEnBC,qBAAU,WACR,GAAIN,EAAgBzgB,OAAS,EAAG,CAC9B,IAAMghB,EF/DiB,SAAC1jB,EAAiB+iB,GAC7C,IAAMzV,EAAK4R,GAAac,QAAQ1S,GAC1B7K,EAAW,IAAImf,GAAsBtU,GAC3C,OAAOvU,GAAY2hB,IAAIjY,EAAU,CAAEzC,UAAS+iB,WE4DnBY,CAAc3jB,EAAUmjB,GAAiBS,WAC5D,SAACxhB,GACCkhB,GAAY,KAEdC,GAEF,OAAO,WACLG,EAAaG,kBAGhB,CAACV,EAAiBI,EAAYvjB,IAEjC,IA+BM8jB,EAAc,SAClBnnB,EACAonB,EACAC,GAEAD,EAAUpnB,GACNA,EAAM+F,QACRshB,GAAQ,IAINC,EACJ,kBAACvB,GAAD,KAAcxkB,EAAE,8CAGZgmB,EACJ,oCACE,kBAAC,GAAD,CAAO7Q,KAAMnV,EAAE,qCACf,kBAACokB,GAAD,KACE,kBAACC,GAAD,KACE,kBAACC,GAAD,CACE3J,WAAW,EACXsL,WAAW,EACX9F,UAAWwE,EAAe,QAAU,GACpCuB,YAAalmB,EAAE,wCACfmmB,KAAK,IACLC,QAAS,WACTC,SAzCa,SACrBC,GAEA,IAAMC,EAAaD,EAAGhF,OAAO7iB,MAC7BmnB,EAAYW,EAAYnI,EAAYwG,OAwChC,kBAACP,GAAD,KACE,kBAACC,GAAD,CACE3J,WAAW,EACXsL,WAAW,EACX9F,UAAW4E,EAAc,QAAU,GACnCmB,YAAalmB,EAAE,6CACfmmB,KAAK,IACLC,QAAS,WACTC,SA7CW,SACnBC,GAEA,IAAME,EAAYF,EAAGhF,OAAO7iB,MAC5BmnB,EAAYY,EAAW1B,EAAWE,QA6ChC,kBAAC1B,GAAD,CACEhG,QA1EmB,WACvB,IAAI7d,GAAQ,GACR,OAACqC,QAAD,IAACA,OAAD,EAACA,EAAS0C,UACZ/E,GAAQ,EACRmlB,GAAgB,KAEd,OAACC,QAAD,IAACA,OAAD,EAACA,EAAQrgB,UACX/E,GAAQ,EACRulB,GAAe,IAEZvlB,GACHylB,EACEL,EAAO4B,MAAM,KAAKziB,KAAI,SAAC0iB,GAAD,OAA4BA,EAAeC,YA+DjElD,cAAezjB,EAAE,uCAKvB,OACE,kBAACmkB,GAAD,CAAyB/J,YAAU,qBAChC+K,EAAWY,EAAsBC,MGjK3BY,GAAb,kDACE,aAAe,uCACP,oBAFV,UAAwCviB,ICElCxJ,GAAcsJ,K,qBHAd0iB,G,WAIJ,WAAY7rB,GAAuB,yBAH3BA,kBAG0B,OAF1B7D,UAE0B,EAChCyE,KAAKZ,aAAeA,EACpBY,KAAKzE,MAAO,E,qDAGE2vB,EAAcrjB,GAAoC,IAAD,QGPlC,SAC/BzI,EACA8rB,EACArjB,GAEA,IAAMc,EAAW,IAAIqiB,GACftiB,EAAc,GAWpB,GAVItJ,GAAgB8rB,IAClBxiB,EAAY4B,KAAK,CACfxB,eAAgB,gBAChBC,gBAAiB3J,IAEnBsJ,EAAY4B,KAAK,CACfxB,eAAgB,OAChBC,gBAAiBmiB,KAGjBrjB,EACF,cAA2B/I,OAAO2D,QAAQoF,GAA1C,eAAoD,CAAC,IAAD,sBAAxCjF,EAAwC,KAAnCC,EAAmC,KAClD6F,EAAY4B,KAAK,CACfxB,eAAgBlG,EAChBmG,gBAAiBlG,IAKvB,OADA8F,EAASuR,eAAexR,GACjBzJ,GAAYwB,IAAIkI,IHlBrBwiB,CAAkBnrB,KAAKZ,aAAc8rB,EAAMrjB,GAASiiB,WAClD,SAACxhB,GACC,IAAM8iB,EAAiB9iB,EACA,OAAnB8iB,IACG,EAAK7vB,OACR8vB,KAAWC,WAAW,CAAEC,MAAOH,EAAeG,QAC9C,EAAKhwB,MAAO,GAEd8vB,KAAWG,UAAUJ,OAGzB,SAACvnB,GACC4nB,QAAQC,IAAI,QAAS7nB,U,KAQhB8nB,GAAuB,SAClCvsB,GAKA,OAHKipB,SAAsC7nB,IAAjBpB,IACxBipB,GAAoB,IAAI4C,GAAkB7rB,IAErCipB,I,kNIvBIuD,GA4BX,WAAY3N,GjC7Ca,IAACyH,EAAamG,EiC6CL,yBA3B3B7P,aAfe,UA0CW,KA1B1B8P,eAfc,UAyCY,KAzB1B/G,gBANa,UA+Ba,KAxB1BlC,sBAlBe,UA0CW,KAvB1BxH,oBARa,UA+Ba,KAtB1BuH,YAA2BvkB,EAAYwoB,UAsBb,KArB1B/D,gBAVa,UA+Ba,KApB1B5E,UAhBW,UAoCe,KAnB1B2H,cAhBY,UAmCc,KAlB1B9E,gBAnBkB,UAqCQ,KAjB1BqG,cAfkB,UAgCQ,KAhB1BzE,aAAuB,OAgBG,KAf1BoJ,aAAuB,OAeG,KAd1B5J,+BAAiC,2BAcP,KAb1B6J,iBAtBY,UAmCc,KAZ1BC,mBA5BiB,UAwCS,KAX1B/H,QA9Bc,UAyCY,KAV1B0C,YAA2BxoB,EAAYmb,KAUb,KAT1B2S,wBAxBmB,UAiCO,KAR1BroB,MAtBa,UA8Ba,KAP1BsoB,uBA3BiB,UAkCS,KAN1BC,iBA1BkB,UAgCQ,KAL1BjO,2BAAqC,2BAKX,KAJ1BkO,cAAwB,EAIE,KAF1BC,cAAwB,MAGzBrO,IjC9CoByH,EiC+CV1lB,KjC/CuB6rB,EiC+CjB5N,EjC9CtBnf,OAAOwG,KAAKumB,GAAQnpB,SAAQ,SAACE,EAAKgL,QACZpN,IAAhBqrB,EAAOjpB,KACT8iB,EAAO9iB,GAAOipB,EAAOjpB,S8BCd2pB,GAAb,wGAEI,IAAInR,EAAQ1a,GAAe8rB,eAO3B,OANIpR,IACFkN,GAAe,IAAIsD,GAAMxQ,IACrB1a,GAAe+rB,oBAAuB/rB,GAAe2a,qBAA8D,YAAvC3a,GAAe2a,uBAC7FiN,GAAa+D,cAAe,IAGzB/D,OATX,KIWaoE,GAAyB,SAAC3oB,GACrC,IAAMqX,EAAQmR,GAAaI,WAC3B,OAAQ5oB,GACN,IAAK,QACL,IAAK,QACH,MAAO,UACT,IAAK,UACH,MAAO,UACT,IAAK,gBACL,IAAK,eACH,OAAOqX,EAAMgM,cACf,QACE,MAAO,YAuBAwF,GAAmB,SAAC7oB,GAC/B,IAAMqX,EAAQmR,GAAaI,WAC3B,OAAQ5oB,GACN,IAAK,UACH,OAAOqX,EAAM8I,QACf,IAAK,QACL,IAAK,QACH,MAAO,UACT,IAAK,UACL,IAAK,UACH,MAAO,UACT,IAAK,UACL,IAAK,gBACL,IAAK,eACH,MAAO,UACT,IAAK,OACH,MAAO,UACT,QACE,OAAO9I,EAAMyK,gB,ggBCpCnB,IAAMgH,GAAqB9O,IAAOC,IAAV,MACV,SAACC,GAAD,MACS,QAAnBA,EAAMsI,UAAyC,WAAnBtI,EAAMsI,SAC9B,WACA,cAKG,SAACtI,GAAD,OAAW6O,GAAQ7O,EAAMwI,SACrB,SAACxI,GAAD,OAAW6O,GAAQ7O,EAAMwI,SAC5B,SAACxI,GAAD,OAAW6O,GAAQ7O,EAAMwI,SACf,SAACxI,GAAD,OAClBA,EAAM8G,gBAAkB9G,EAAM8G,gBAAkB,WACzC,SAAC9G,GAAD,OACPA,EAAMC,UAAYD,EAAMC,UAAYD,EAAM7C,MAAMyK,iBAE9C,SAAC5H,GAAD,OAAYA,EAAM8O,OAAS9O,EAAMC,UAAY,iBAC1C,SAACD,GAAD,OAAW+O,GAAe/O,EAAMsI,SAAUtI,EAAMwI,SAC/C,SAACxI,GAAD,OAAWgP,GAAgBhP,EAAMsI,SAAUtI,EAAMwI,SAChD,SAACxI,GAAD,MAA+B,SAAnBA,EAAMsI,SAAsB,GAAK,UAI3C,SAACtI,GAAD,OAAWiP,GAAWjP,EAAMwI,SAC3B,SAACxI,GAAD,OAAWiP,GAAWjP,EAAMwI,SASpCqG,GAAU,SAACrG,GACf,OAAQA,GACN,IAAK,QACH,MAAO,OACT,IAAK,SACH,MAAO,OACT,IAAK,SACH,MAAO,OACT,QACE,MAAO,SAIPyG,GAAa,SAACzG,GAClB,OAAQA,GACN,IAAK,QACH,MAAO,OACT,IAAK,SACH,MAAO,OACT,QACE,MAAO,SAIPuG,GAAiB,SAACzG,EAAmBE,GACzC,OAAQF,GACN,IAAK,OACH,MAAgB,UAATE,EAAmB,QAAU,OACtC,IAAK,QACH,MAAO,OACT,QACE,OAAO,IAIPwG,GAAkB,SAAC1G,EAAmBE,GAC1C,OAAQF,GACN,IAAK,OACH,MAAgB,UAATE,EAAmB,QAAU,OACtC,IAAK,QACH,MAAO,GACT,QACE,OAAO,IA0CA0G,GAAc9O,gBAfJ,SAACJ,GACtB,OACE,kBAAC4O,GAAD,CACE9H,gBAAiB2H,GAAuBzO,EAAMmP,MAC9ClP,UAAW0O,GAAiB3O,EAAMmP,MAClC3G,KAAMxI,EAAMwI,KACZsG,OAAQ9O,EAAM8O,OACdxG,SAAUtI,EAAMsI,SAChB/H,YAAU,eA/BG,SAAC4O,GAClB,OAAQA,GACN,IAAK,UACH,OAAO,kBAAC,KAAD,MACT,IAAK,UACL,IAAK,UACH,OAAO,kBAAC,KAAD,MACT,IAAK,QACL,IAAK,QACH,OAAO,kBAAC,KAAD,MACT,IAAK,gBACH,OAAO,kBAAC,KAAD,MACT,IAAK,eACH,OAAO,kBAAC,KAAD,MACT,IAAK,OACH,OAAO,kBAAC,KAAD,MACT,IAAK,UACH,OAAO,kBAAC,KAAD,MACT,QACE,OAAO,kBAAC,KAAD,OAcNC,CAAWpP,EAAMmP,U,6yBCxHxB,IAAME,GAAqBvP,IAAOC,IAAV,MAIF,SAACC,GAAD,OAAWA,EAAM8G,mBAC5B,SAAC9G,GAAD,OAAWA,EAAMC,aAatBqP,GAAmBxP,IAAOC,IAAV,MAGV,SAACC,GAAD,OAAYA,EAAMuP,UAAY,OAAS,UAClC,SAACvP,GAAD,OAAYA,EAAMuP,UAAY,OAAS,aAOhC,SAACvP,GAAD,OAAYA,EAAMuP,UAAY,EAAI,MAwD7CC,GAAkBpP,gBAlDX,SAACJ,GAAmB,IAAD,EACC6K,oBAAS,GADV,mBAC9B4E,EAD8B,KACjBC,EADiB,KAE/BC,EAAa3P,EAAM1E,KAAKsR,MAAM,QAAQ7hB,KAAK,SAC3C+b,EF7D0B,SAAChhB,GACjC,IAAMqX,EAAQmR,GAAaI,WAC3B,OAAQ5oB,GACN,IAAK,UACH,OAAOqX,EAAM8I,QACf,IAAK,QACL,IAAK,QACH,MAAO,UACT,QACE,OAAO9I,EAAM+G,gCEoDOkF,CAAmBpJ,EAAMla,QAC3Cma,EFjCoB,SAACna,GAC3B,IAAMqX,EAAQmR,GAAaI,WAC3B,OAAQ5oB,GACN,IAAK,QACL,IAAK,QACH,MAAO,UACT,IAAK,UACH,MAAO,UACT,IAAK,gBACL,IAAK,UACL,IAAK,eACH,MAAO,UACT,IAAK,UACH,MAAO,UACT,QACE,OAAOqX,EAAMyK,eEkBCgI,CAAa5P,EAAMla,QAC/B+pB,EAAsBpB,GAAuBzO,EAAMla,QACnDgqB,EAAgBnB,GAAiB3O,EAAMla,QAEvCiqB,EADUttB,GAAeutB,UAEA,KAAjBhQ,EAAMla,aAAkCvD,IAAjByd,EAAMla,QAErCud,EAAc,SAAC4M,GACnBP,GAAgBD,IAGZN,EAAOM,EACX,kBAAC,KAAD,CACEnJ,UAAU,iBACV7C,QAASJ,EACT9C,YAAU,qBAGZ,kBAAC,KAAD,CACE+F,UAAU,iBACV7C,QAASJ,EACT9C,YAAU,qBAId,OACE,kBAAC8O,GAAD,CAAoBvI,gBAAiBA,EAAiB7G,UAAWA,IAC7D8P,GACA,kBAACb,GAAD,CACEC,KAAMnP,EAAMla,QAAU,GACtBghB,gBAAiB+I,EACjB5P,UAAW6P,EACXtH,KAAK,QACLsG,OAAyB,YAAjB9O,EAAMla,OACdwiB,SAAS,SAGb,kBAACgH,GAAD,CACEhL,wBAAyB,CAAEN,OAAQ2L,GACnCJ,UAAWE,EACXlP,YAAU,qBAEXP,EAAMkQ,aAAef,M,iGC3F5B,IAAMgB,GAAoBrQ,IAAOC,IAAV,MAyDVqQ,GAAyBhQ,gBArDnB,WAAO,IAAD,EACfja,EAAMka,cAANla,EACF8hB,EAAUd,GAAac,QACvBoI,EACJ5tB,GAAekJ,SAAS2kB,+BACxBrI,EAAQ5T,gBAAkBvU,EAAawU,UACnCic,GACJ,UAAAtI,EAAQC,eAAR,eAAiBF,QAASC,EAAQ5T,gBAAkBvU,EAAawU,UAC7DwK,EAAUrc,GAAeqc,QAE/B4M,qBAAU,WAAO,IAAD,EACM,QAApB,EAAAgC,YAAA,SAAwB8C,SAAS,UAAW,CAC1CC,WAAYxI,EAAQ1S,GAAGmb,aAEzBzX,KAAW0X,aACV,IAECluB,GAAemuB,iBACjBC,OAAO7W,SAAS8W,QAAQruB,GAAemuB,iBAGrCC,OAAOE,UACTF,OAAOG,yBAAP,8BAAyD/I,EAAQ1S,GAAjE,6CAAwG0S,EAAQ9F,gBAGlH,IAAMmB,EACJ,kBAAC6M,GAAD,CAAmB5P,YAAU,cAC3B,kBAACwG,GAAD,CACEL,SAAUuB,EAAQvB,SAClBF,UAAWyB,EAAQzB,UACnBC,SAAUwB,EAAQxB,SAClB/a,sBAAuBuc,EAAQvc,sBAC/BG,gBAAiBoc,EAAQpc,gBACzB/H,KAAMmkB,EAAQtJ,eAEhB,kBAACuH,GAAD,CACEpgB,OAAQmiB,EAAQ5T,cAChBgS,aAAc4B,EAAQ5B,eAEvBgK,GAAoB,kBAACzF,GAAD,MACpB9L,GACC,kBAAC0Q,GAAD,CACElU,KAAMnV,EAAE,6BACRL,OAAQ,SAGXyqB,GAAwB,kBAACxI,GAAD,OAI7B,OAAO,oCAAGtlB,GAAemuB,gBAAkB,kBAACnI,GAAD,MAAanF,MCvD3C2N,GAZG,SAACjR,GAAD,OAChB,uBACEkR,KAAK,OACLC,QAAQ,YACRC,MAAM,KACNC,OAAO,KACPC,MAAM,8BAEN,wBAAMC,EAAE,6rB,q2BCJZ,IAAMC,GAAuB1R,IAAOC,IAAV,MAOb,SAACC,GAAD,OAAYA,EAAMyR,UAAY,UAAY,UAIjDC,GAAkB5R,IAAOC,IAAV,MACV,SAACC,GAAD,OAAYA,EAAMyR,UAAY,OAAS,WAG5B,SAACzR,GAAD,OAAWA,EAAM7C,MAAM2J,mBAIvC6K,GAAY7R,YAAO8R,KAAP9R,CAAH,MAEC,SAACE,GAAD,OACZA,EAAM8I,SAAW9I,EAAM7C,MAAMY,aAAe,GAAK,MAIvC,SAACiC,GAAD,OAAYA,EAAM8I,SAAW,cAAgB,aAM/C,SAAC9I,GAAD,OAAWA,EAAM7C,MAAMgM,iBAIf,SAACnJ,GAAD,OACdA,EAAM8I,SACF9I,EAAM7C,MAAMY,aAAe,GAC3BiC,EAAM7C,MAAMgM,iBA4CT0I,GAAgBzR,gBApCD,SAACJ,GAA2B,IAAD,EAC7C7iB,EAASkjB,cAATljB,KAD6C,EAEE6iB,EAA/C8R,gBAF6C,WAEE9R,EAA9B7F,YAF4B,MAErB,QAFqB,EAEZsX,EAAczR,EAAdyR,UACzC,OACE,kBAACD,GAAD,CACEjR,YAAU,oBACVkR,UAAWA,EACXnL,UAAU,mBAEV,kBAACoL,GAAD,CAAiBD,UAAWA,GAC1B,kBAACE,GAAD,CACExX,KAAMA,EACNvU,MAAOoa,EAAMpa,MACbhB,MACkB,IAAhBob,EAAMpb,OAAgBob,EAAM+R,WAAa5uB,MAAM6c,EAAMpb,OACjD,GACAob,EAAMpb,MAEZotB,MAAOhS,EAAMgS,MACb3F,YAAarM,EAAMiS,eAAiB90B,EAAKgJ,EAAE6Z,EAAMiS,gBAAkB,GACnEzF,SAAUxM,EAAMwM,SAChB/I,QAASzD,EAAMyD,QACfqF,SAAU2I,EACVS,aACE,kBAACC,GAAA,EAAD,CAAgB7J,SAAS,OAAOtI,EAAMmP,MAExCiD,WAAY,CACVN,SAAUA,GAEZvR,YAAA,UAAWP,EAAMqS,gBAAjB,QAA6B,UChFjCC,G,mGA+BF,QAASvwB,KAAKkP,MAAMtG,S,kCAIpB,QAAS5I,KAAK8R,OAAOlJ,S,kCAIrB,QAAS5I,KAAK+R,OAAOnJ,S,uCAIrB,OAAO5I,KAAKwwB,YAAcxwB,KAAKywB,aAAezwB,KAAK0wB,c,6CAQnD,MAAO,CACLA,UAAW1wB,KAAK0wB,YAChBD,UAAWzwB,KAAKywB,YAChBD,SAAUxwB,KAAKwwB,c,4BA3CjB,OAAOhf,GAAiBtC,Q,sCAIxB,OAAOsC,GAAiBiF,kB,wCAIxB,OAAOjF,GAAiBmf,oB,6BAIxB,OAAOnf,GAAiBM,S,6BAIxB,OAAON,GAAiBO,U,6BApBxB,OAHK/R,KAAKgL,UACRhL,KAAKgL,QAAU,IAAIulB,GAEdvwB,KAAKgL,Y,KAPVulB,GACWvlB,a,EA0DFulB,UAAmB9vB,M,wtCC5ClC,IAAMmwB,GAAyB7S,IAAOC,IAAV,MAStB6S,GAAa9S,IAAOC,IAAV,MAiBV8S,GAAS/S,IAAOC,IAAV,MAoIC+S,GAAkB1S,gBA7FD,WAAO,IAC3BjjB,EAASkjB,cAATljB,KACF6c,EAAWyL,eACX7Y,EAAiBpB,GAAeC,OAASD,GAAeM,SACxDinB,EAAevnB,GAAenI,KAC9B2vB,EAAexnB,GAAe1H,KAC9BmvB,EACJlf,GAAoBmf,uBACpBC,GAAmBC,iBARa,EASYvI,mBAAwB,MATpC,mBAS3BnL,EAT2B,KASV2T,EATU,OAUIxI,mBAAS,GAVb,mBAU3ByI,EAV2B,KAUdC,EAVc,KAgBlC7H,qBAAU,WACR,IAAM8H,EAAe,WACnBD,EAAe1C,OAAO4C,aAIxB,OAFA5C,OAAO6C,iBAAiB,SAAUF,GAClCA,IACO,kBAAM3C,OAAO8C,oBAAoB,SAAUH,MACjD,IAEH9H,qBAAU,WACR2H,EAAmBthB,KAA6B2N,qBAC/C,CAACviB,EAAKyU,WAET,IAAMgiB,EACJ5Z,EAAS2L,SAASrL,SAAS,iBAAmB2Y,EAC1C,cACA,YAEAY,GACJ7Z,EAAS2L,SAASrL,SAAS,kBAAmB2Y,EAI1Ca,EACJR,EAAc,IACV5kB,GAAuBqlB,0BAA0BnnB,GACjDA,EAEA6D,EAAS6iB,EAAc,IAAM,UAAY,IAEzCU,EACJ/wB,OAAO8vB,GAAgB,GAAOrT,EAC1BvM,GAAW5P,KAAOwvB,GAAcpvB,OAAO+b,GAAiBjP,OAAOA,IAC/D,GAEN,OACE,kBAACkiB,GAAD,CAAwBpS,YAAU,oBAChC,kBAACqS,GAAD,KACE,kBAAC3P,GAAD,CACE3d,MAAOsuB,EACPzQ,SAAU0Q,EACVtQ,OAAQ,OACRF,YA9CiB,WACvB7X,GAAeyoB,mBAAoB,MAgDjC,kBAACpB,GAAD,KACE,kBAAChB,GAAD,CACEjsB,OAAO,EACPhB,MAAOkvB,EACPI,WAAY,GACZ3H,QAAS,WACT4C,KAAM,kBAAC,GAAD,MACNsC,WAAW,EACXY,SAAS,iBAEX,kBAACR,GAAD,CACEjsB,OAAO,EACPhB,MAAOovB,EACPE,WAAY,GACZ3H,QAAS,WACT4C,KAAM,kBAAC,KAAD,MACNsC,WAAW,EACXY,SAAS,kBAEX,kBAACR,GAAD,CACEjsB,OAAO,EACPhB,MAAOouB,EACPkB,WAAY,GACZ3H,QAAS,WACT4C,KAAM,kBAAC,KAAD,MACNsC,WAAW,EACXY,SAAS,uB,oNCpKnB,IAAM5H,GAAmB3K,YAAO4K,KAAP5K,CAAH,MAGA,SAACE,GAAD,OAAWA,EAAM7C,MAAMvX,SAI9B,SAACoa,GAAD,OAAWA,EAAM7C,MAAMvX,SAMhCuuB,GAAuB/T,gBAAK,SAACJ,GAA4B,IAE3DoU,EAQEpU,EARFoU,MACA5H,EAOExM,EAPFwM,SACA6H,EAMErU,EANFqU,SAJ0D,EAUxDrU,EALFsU,gBAL0D,SAM1D1vB,EAIEob,EAJFpb,MACAotB,EAGEhS,EAHFgS,MACA7X,EAEE6F,EAFF7F,KAR0D,EAUxD6F,EADFuU,gBAT0D,MAS/C,QAT+C,EAW5D,OACE,kBAAC,GAAD,CACEzT,WAAW,EACX0H,KAAM+L,EACNpa,KAAMA,EACNqS,SAAUA,EACVlG,UAAW8N,EACXE,SAAUA,EACVtC,MAAOA,EACPzF,QAAS,WACT2H,WAAYG,EACZG,aAAc5vB,O,8OClCpB,IAAM6vB,GAAkB3U,YAAO4K,KAAP5K,CAAH,MAER,SAACE,GAAD,OAAWA,EAAM7C,MAAM8C,aAU9ByU,GAAsBtU,gBAAK,SAACJ,GAAqC,IAAD,EAgBhEA,EAdFoM,iBAFkE,WAgBhEpM,EAbFsM,YAHkE,MAG3D,EAH2D,IAgBhEtM,EAZF2U,eAJkE,MAIxD,EAJwD,IAgBhE3U,EAXF4U,uBALkE,MAKhD,GALgD,IAgBhE5U,EAVFc,iBANkE,SAOlEkR,EASEhS,EATFgS,MACAptB,EAQEob,EARFpb,MACAynB,EAOErM,EAPFqM,YACA+H,EAMEpU,EANFoU,MACA5H,EAKExM,EALFwM,SACArS,EAIE6F,EAJF7F,KAZkE,EAgBhE6F,EAHFoS,kBAbkE,MAarD,GAbqD,IAgBhEpS,EAFFuU,gBAdkE,MAcvD,QAduD,IAgBhEvU,EADFvT,YAfkE,MAe3D,OAf2D,EAiBpE,OACE,kBAACgoB,GAAD,CACEjM,KAAM+L,EACNpa,KAAMA,EACNqS,SAAUA,EACV/f,KAAMA,EACN6Z,UAAW8N,EACXI,aAAc5vB,EACdotB,MAAOA,EACP3F,YAAaA,EACbE,QAAS,WACTH,UAAWA,EACXE,KAAMA,EACNqI,QAASA,EACT7T,UAAWA,EACXsR,WAAYA,EACZyC,gBAAiBD,OCgBVE,GACXC,IAAMC,cAAuC,IAElCC,GAAwBF,IAAMC,cAAc,CACvDE,KAAM,GACNC,eAAgB,GAChBC,iBAAkB,SAAC3I,KACnB4I,eAAgB,KCjEZC,GAAsBlV,gBAAK,SAACJ,GAA4B,IAAD,EACnD7Z,EAAMka,cAANla,EACAgU,EAAS6F,EAAT7F,KACFob,EAAcC,qBAAWP,IACvBC,EACNK,EADML,KAAMC,EACZI,EADYJ,eAAgBC,EAC5BG,EAD4BH,iBAAkBC,EAC9CE,EAD8CF,eAE1CzwB,EAAQswB,EAAK/a,GACbma,IAAWtU,EAAMsU,UAAkBe,EAAeluB,SAASgT,GAC3Dsb,EAAeN,EAAehuB,SAASgT,GAEvCka,EAAWoB,EAEXtvB,EADFmuB,KAFgC,qBAAV1vB,GAAkC,MAATA,GAG3C,0CACA,kCACJ,GACE8wB,EAAgB,UAAG1V,EAAMoU,aAAT,QAAkBja,EAClCia,EAAoB,UACnBsB,EADOD,EAAY,cAIpBE,EAAkB,2BACnB3V,GADmB,IAEtBpb,QACAotB,MAAO7rB,EAAE,sBAAD,OAAuBgU,IAC/Bia,QACAE,WACAD,WACA7H,SAAU4I,IAEZ,OACE,oCACGd,EACC,kBAACH,GAAyBwB,GAE1B,kBAACjB,GAAwBiB,O,UC3CpBC,GAAY,CACvB,CAAE7vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,uBAAwB6D,MAAO,OACpD,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,sBAAuB6D,MAAO,SACnD,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,SACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,MACzC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,SAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,KAAMC,WAAW,GAC1D,CAAE/vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,OAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,yBAA0B6D,MAAO,OACtD,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,SACxC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,mBAAoB6D,MAAO,OAChD,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,SACvC,CAAE9vB,KAAM,KAAMisB,MAAO,oBAAqB6D,MAAO,OACjD,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,SACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,MAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,IAAKC,WAAW,GACtD,CAAE/vB,KAAM,KAAMisB,MAAO,0BAA2B6D,MAAO,MACvD,CAAE9vB,KAAM,KAAMisB,MAAO,oCAAqC6D,MAAO,OACjE,CAAE9vB,KAAM,KAAMisB,MAAO,2BAA4B6D,MAAO,OACxD,CAAE9vB,KAAM,KAAMisB,MAAO,yBAA0B6D,MAAO,OACtD,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,MACxC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,MACpC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,mBAAoB6D,MAAO,MAChD,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,OAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,KAAMC,WAAW,GACxD,CAAE/vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,SACxC,CAAE9vB,KAAM,KAAMisB,MAAO,qBAAsB6D,MAAO,SAClD,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,OAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,8BAA+B6D,MAAO,OAC3D,CAAE9vB,KAAM,KAAMisB,MAAO,kCAAmC6D,MAAO,OAC/D,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,KAAMC,WAAW,GACvD,CAAE/vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,MAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,SACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,MACxC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,oBAAqB6D,MAAO,OACjD,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CACE9vB,KAAM,KACNisB,MAAO,+CACP6D,MAAO,OAET,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,SACpC,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,oCAAqC6D,MAAO,OACjE,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,MACzC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,iCAAkC6D,MAAO,OAC9D,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,4BAA6B6D,MAAO,MACzD,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,MACrC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,SACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,KAAMC,WAAW,GACtD,CAAE/vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,wBAAyB6D,MAAO,SACrD,CAAE9vB,KAAM,KAAMisB,MAAO,yCAA0C6D,MAAO,OACtE,CAAE9vB,KAAM,KAAMisB,MAAO,qBAAsB6D,MAAO,MAClD,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,SAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,KAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,mCAAoC6D,MAAO,OAChE,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,SAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,MACzC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,uBAAwB6D,MAAO,OACpD,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,6BAA8B6D,MAAO,OAC1D,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,mBAAoB6D,MAAO,OAChD,CACE9vB,KAAM,KACNisB,MAAO,6CACP6D,MAAO,OAET,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,2BAA4B6D,MAAO,SACxD,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,SAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,MACxC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,OAC7C,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,iBAAkB6D,MAAO,OAC9C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,MACpC,CAAE9vB,KAAM,KAAMisB,MAAO,mBAAoB6D,MAAO,OAChD,CAAE9vB,KAAM,KAAMisB,MAAO,mBAAoB6D,MAAO,OAChD,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,MAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,MACxC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,4BAA6B6D,MAAO,OACzD,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,KAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,sBAAuB6D,MAAO,OACnD,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,qBAAsB6D,MAAO,KAClD,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,kBAAmB6D,MAAO,OAC/C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,MACzC,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,yBAA0B6D,MAAO,MACtD,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,OACxC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,OAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,wBAAyB6D,MAAO,OACrD,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,OAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,4BAA6B6D,MAAO,SACzD,CAAE9vB,KAAM,KAAMisB,MAAO,uBAAwB6D,MAAO,OACpD,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,OACzC,CAAE9vB,KAAM,KAAMisB,MAAO,2BAA4B6D,MAAO,SACxD,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,8BAA+B6D,MAAO,OAC3D,CAAE9vB,KAAM,KAAMisB,MAAO,OAAQ6D,MAAO,OACpC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,MACxC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,cAAe6D,MAAO,OAC3C,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,OAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,MACtC,CAAE9vB,KAAM,KAAMisB,MAAO,sBAAuB6D,MAAO,SACnD,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,4BAA6B6D,MAAO,OACzD,CAAE9vB,KAAM,KAAMisB,MAAO,8BAA+B6D,MAAO,OAC3D,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,gBAAiB6D,MAAO,IAAKC,WAAW,GAC7D,CAAE/vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,aAAc6D,MAAO,OAC1C,CAAE9vB,KAAM,KAAMisB,MAAO,gCAAiC6D,MAAO,OAC7D,CAAE9vB,KAAM,KAAMisB,MAAO,mCAAoC6D,MAAO,SAChE,CAAE9vB,KAAM,KAAMisB,MAAO,YAAa6D,MAAO,MACzC,CAAE9vB,KAAM,KAAMisB,MAAO,yBAA0B6D,MAAO,SACtD,CAAE9vB,KAAM,KAAMisB,MAAO,oBAAqB6D,MAAO,SACjD,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,MACvC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,oBAAqB6D,MAAO,OACjD,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,QAAS6D,MAAO,OACrC,CAAE9vB,KAAM,KAAMisB,MAAO,UAAW6D,MAAO,OACvC,CAAE9vB,KAAM,KAAMisB,MAAO,eAAgB6D,MAAO,MAC5C,CAAE9vB,KAAM,KAAMisB,MAAO,SAAU6D,MAAO,OACtC,CAAE9vB,KAAM,KAAMisB,MAAO,WAAY6D,MAAO,Q,UCtO3BzV,mBAvBS,SAACJ,GAMlB,IAAD,EACF,OAAO,kBAAC+V,GAAA,EAAD,CACHjV,WAAS,EACTvL,GAAIyK,EAAMzK,GACVygB,kBAAgB,EAChBxN,KAAI,UAAExI,EAAMwI,YAAR,QAAgB,QACpB5e,QAASoW,EAAMpW,QACfhF,MAAOob,EAAMpb,MACbqxB,QAASjW,EAAMiW,QACfC,eAAa,EACbC,eAAgBnW,EAAMmW,eACtBC,aAAcpW,EAAMoW,aACpB5J,SAAUxM,EAAMwM,SAChB6J,YAAarW,EAAMqW,iB,6gBCL3B,IAAMC,GAAsBxW,IAAOC,IAAV,MAYnBwW,GAAczW,IAAOC,IAAV,MAIX0K,GAAmB3K,YAAO4K,KAAP5K,CAAH,MAGA,SAACE,GAAD,OAAWA,EAAM7C,MAAMvX,SAI9B,SAACoa,GAAD,OAAWA,EAAM7C,MAAMvX,SAmGvBwa,mBA9FU,SAACJ,GAA0C,IAAD,IACnC6K,mBAC5B7K,EAAMwU,cAFyD,mBAC1DgC,EAD0D,KACjDC,EADiD,KAIjE/K,qBAAU,WACR+K,EAAWzW,EAAMwU,gBAChB,CAACxU,IAN6D,IAOzD7Z,EAAMka,cAANla,EAmEFkwB,EACU,WAAdrW,EAAM7F,KAdmB,SAAC5Q,GAAD,OACzB,kBAACmhB,GAAA,EAAD,eACEvQ,KAAK,kBACD5Q,EAFN,CAGEgjB,QAAS,WACTzL,WAAW,EACXkR,MAAOhS,EAAMgS,MACbI,WAAU,2BACL7oB,EAAO6oB,YADF,IAERsE,aAAc,qBAvBW,SAACntB,GAAD,OAC7B,kBAAC,GAAD,iBACMA,EADN,CAEE4Q,KAAM,iBACN6X,MAAO7rB,EAAE,6BACTmgB,UAAWtG,EAAM2W,oBAAsB,QAAU,GACjDpK,QAAS,WACT+H,UAAU,EACVlC,WAAU,eACL7oB,EAAO6oB,gBAoBVgE,EACW,YAAfpW,EAAM7F,KApDoB,SAACyc,EAAiB5W,GAAlB,OAC1B,kBAAC6W,GAAA,EAAD,eACEC,UAAU,MACVC,GAAI,CAAE,UAAW,CAAEC,GAAI,EAAGC,WAAY,KAClCjX,GAEJ,yBACEkX,QAAQ,OACR9F,MAAM,KACNvL,IAAG,kCAA6B+Q,EAAO7wB,KAAK2M,cAAzC,QACHykB,OAAM,kCAA6BP,EAAO7wB,KAAK2M,cAAzC,WACNoT,IAAI,KAEL8Q,EAAO5E,MAZV,KAYmB4E,EAAO7wB,KAZ1B,MAe8B,SAAC6wB,GAAD,OAC9B,kBAACL,GAAD,KACE,kBAAC,KAAD,CAAkBhX,YAAaqX,EAAO7wB,KAAMqxB,KAAG,IADjD,IACsDR,EAAO5E,MAD7D,KAEG4E,EAAOf,QAkCZ,OACE,kBAACS,GAAD,CAAqBhQ,UAAS,UAAEtG,EAAMqX,iBAAR,QAAqB,IACjD,kBAAC,GAAD,CACE9hB,GAAIyK,EAAMzK,GACV0gB,QAASjW,EAAMiW,QACfrxB,MAAO4xB,EACPhK,SA5EsB,SAC1ByD,EACArrB,GAMoB,iBAATA,IACT6xB,EAAW,CACT1wB,KAAMnB,EAAMmB,KACZisB,MAAOptB,EAAMotB,MACb6D,MAAOjxB,EAAMixB,QAEf7V,EAAMwM,SAAS,CAAE/E,OAAQ,CAAEtN,KAAM6F,EAAM7F,KAAMvV,MAAOA,OA+DlDuxB,eAAgBnW,EAAMmW,eACtBvsB,QAASgsB,GACTQ,aAAcA,EACdC,YAAaA,Q,4iBC3HrB,IAAMiB,GAASxX,IAAOC,IAAV,MASNwX,GAAczX,IAAOC,IAAV,MAOXyX,GAAe1X,IAAOC,IAAV,MAQZ0X,GAAYC,aAAW,CAC3Bd,OAAQ,CACN,wBAAyB,CACvBe,YAAa,GACbC,SAAU,OAIVC,GAAuBzX,gBAAK,SAACJ,GAA4B,IAAD,EACpD7Z,EAAMka,cAANla,EACAgU,EAAS6F,EAAT7F,KACFob,EAAcC,qBAAWP,IACvBC,EACNK,EADML,KAAMC,EACZI,EADYJ,eAAgBC,EAC5BG,EAD4BH,iBAAkBC,EAC9CE,EAD8CF,eAE1CzwB,EAAQswB,EAAK/a,GACbma,EAAWe,EAAeluB,SAASgT,GACnCsb,EAAeN,EAAehuB,SAASgT,GAEvCka,EAAWoB,EAEXtvB,EADFmuB,KAFgC,qBAAV1vB,GAAkC,MAATA,GAG3C,0CACA,kCACJ,GACE8wB,EAAgB,UAAG1V,EAAMoU,aAAT,QAAkBja,EAClCia,EAAoB,UACnBsB,EADOD,EAAY,cAGpBqC,EAAuB,2BACxB9X,GADwB,IAE3Bpb,QACAotB,MAAO7rB,EAAE,sBAAD,OAAuBgU,IAC/Bia,QACAE,WACAD,WACA7H,SAAU4I,IAGNa,EAAUwB,KAChB,OACE,kBAACD,GAAD,CAAclR,UAAU,2BACtB,kBAACgR,GAAD,KACE,kBAAC,GAAD,CACE/hB,GAAG,iBACH4E,KAAK,eACLqS,SAAU4I,EACVZ,aAAcU,EAAI,aAClByB,qBAC8C,IAA5CxB,EAAehuB,SAAS,gBAA2B,QAAU,GAE/DgvB,eAAgB,SAACS,GAAD,MAAqB,IAAMA,EAAOf,OAClDI,QAAS,CACPW,OAAQX,EAAQW,WAItB,kBAACW,GAAD,KACE,kBAACpD,GAAyB2D,Q,uYCvF3B,IAAMC,GAAejY,IAAOC,IAAV,MAKZiY,GAAyBlY,YAAOmY,KAAPnY,CAAH,MAItB,SAACE,GAAD,OAAWA,EAAM7C,MAAMY,gBAYrB,SAACiC,GAAD,OAAWA,EAAM7C,MAAMvX,SChBhCsyB,GAAgB9X,gBAAK,SAACJ,GAAkC,IAAD,EACnD7F,EAAwC6F,EAAxC7F,KAAMge,EAAkCnY,EAAlCmY,YAAaC,EAAqBpY,EAArBoY,UAAWpG,EAAUhS,EAAVgS,MAChCuD,EAAcC,qBAAWP,IACvBE,EAA2CI,EAA3CJ,eAAgBC,EAA2BG,EAA3BH,iBAAkBF,EAASK,EAATL,KAHiB,EAIzBrK,mBAAQ,UAACqK,EAAK/a,UAAN,UAJiB,mBAIpDke,EAJoD,KAIzCC,EAJyC,KAKrDlE,EAAQe,EAAehuB,SAASgT,GAAxB,WAOd,OACE,kBAAC4d,GAAD,KACE,kBAACC,GAAD,CACExL,SARU,SAACC,GACf6L,GAAcD,GACdjD,EAAiB3I,IAOblX,GAAI6iB,EACJ9R,UAAW8N,EACXmE,QAAS,kBAACC,GAAA,EAAD,CAAUre,KAAMge,IACzBnG,MAAOA,EACPyG,QAAO,OAAEJ,QAAF,IAAEA,W,yFCnBjB,IAAMK,GAAsB5Y,IAAOC,IAAV,MAgBZ4Y,GAAevY,gBAZH,SAACJ,GACxB,OACE,kBAAC0Y,GAAD,KACE,kBAAClJ,GAAD,CACEjP,YAAU,qBACVjF,KAAM0E,EAAMpa,MACZE,OAAQka,EAAMla,a,y7BCOtB,IAAM8yB,GAAgB9Y,IAAOC,IAAV,MAEG,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAIvC+R,GAAa/Y,IAAOC,IAAV,MAWV+Y,GAAehZ,YAAOiZ,KAAPjZ,CAAH,MAoBH,SAACE,GAAD,OAAWA,EAAM7C,MAAMgM,iBAShC6P,GAASlZ,IAAOC,IAAV,MAMNkZ,GAAkB,SAACrC,GACvB,OAAOA,EAAOhK,MAAM,KAAK7hB,KAAK,KAAK2H,eAwFxBwmB,GAAW9Y,gBArFE,SAACJ,GACzB,IAAMmZ,EAAgB,SAACC,GACrB,IAAMx0B,EAAQw0B,EACdxvB,EAAQnF,SAAQ,SAACmyB,GACfA,EAAOrqB,WAAaqqB,EAAOhyB,QAAUA,KAEvCy0B,EAAW,aAAIzvB,IACXoW,EAAMsZ,aACRtZ,EAAMsZ,YAAYF,IAGhBG,EAAoBvZ,EAAMuZ,kBAC1BC,EAA0BxZ,EAAMyZ,sBAZK,EAab5O,mBAAQ,aACjC7K,EAAMpW,UAdgC,mBAapCA,EAboC,KAa3ByvB,EAb2B,KAgB3C3N,qBAAU,WACR,IAAMgO,EAAoB1Z,EAAMpW,QAAQO,KAAI,SAACysB,GAC3C,OAAO,2BACFA,GADL,IAEErqB,WAAYqqB,EAAOrqB,WACnBotB,WAAYV,GAAgBrC,EAAOhyB,YAGvCy0B,EAAW,aAAIK,MACd,CAAC1Z,IACJ,IAQQgS,EAAUhS,EAAVgS,MACF4H,EAAc5Z,EAAM6Z,kBAAoB,mBAAqB,GAC7DC,EAAY9Z,EAAMmP,KAAO,cAAgB,GAC/C,OACE,kBAACyJ,GAAD,CAAetS,UAAU,cAAc/F,YAAWP,EAAMqS,UACtD,kBAAC0H,GAAA,EAAD,CACExN,QAAQ,WACR/D,KAAMxI,EAAMwI,KAAOxI,EAAMwI,UAAOjmB,GAE/ByvB,GAAS,kBAACgI,GAAA,EAAD,CAAYzN,QAAS,YAAayF,GAC5C,kBAAC8G,GAAD,CACExS,UAAS,UAAKsT,EAAL,YAAoBE,GAC7Bl1B,MApBS,WACf,IAAMq1B,EAAOrwB,EAAQiR,MAAK,SAAC+b,GAAD,OAAYA,EAAOrqB,cAC7C,OAAO0tB,EACHA,EAAKr1B,MACLob,EAAMuZ,kBACJvZ,EAAMuZ,kBAAmB30B,MACzB,GAcOs1B,GACPC,MACE,kBAACvI,GAAA,EAAD,CACEI,MAAOA,EACP7X,KAAM,UACNigB,WAAYpI,OAAQzvB,EAAY,KAInCg3B,GACC,kBAAC,KAAD,CACEzQ,UAAW0Q,EACX70B,IAAKs0B,GAAgBM,EAAkB30B,OACvCA,MAAO20B,EAAkB30B,MACzB6e,QAAS,kBAAM0V,EAAcI,EAAkB30B,SAE9C20B,EAAkBjtB,YAClB0T,EAAMqa,yBAA2B,sCAnBxC,OAsBGzwB,QAtBH,IAsBGA,OAtBH,EAsBGA,EAASO,KAAI,SAACysB,EAA0BjnB,GACvC,OACE,kBAAC,KAAD,CACEhL,IAAKgL,EACL/K,MAAOgyB,EAAOhyB,MACd6b,SAAUmW,EAAOrqB,WACjBkX,QAAS,kBAAM0V,EAAcvC,EAAOhyB,SAEnCgyB,EAAOtqB,iBAKf0T,EAAMmP,KAAO,kBAAC0J,GAAD,KAAa7Y,EAAMmP,MAAqB,IAEvDnP,EAAMsa,QAAU,kBAACtB,GAAD,KAAShZ,EAAMsa,YC/JhCC,GAA4Bna,gBAAK,SAACJ,GAItC,OACE,kBAACkZ,GAAD,CACE1Q,KAAK,QACL6J,SAAS,iBACTzoB,QAASoW,EAAMpW,QACf6vB,uBAAuB,EACvBH,YATgB,SAACrJ,GACnBjQ,EAAMwM,SAAS,CAAE/E,OAAQ,CAAEtN,KAAM6F,EAAM7F,KAAMvV,MAAOqrB,MASlD+B,MAAOhS,EAAMgS,WCZbwI,G,uGASWC,GACb,OAAO,I,wCAGSC,GAChB,MAAO,K,gDAGPD,EACA71B,EACA+1B,GAEA,MAAO,CACL/1B,QACA0H,YAAanP,EAAKgJ,EAAL,6BAA6Bs0B,IAC1CluB,aAAYouB,GAAgBA,IAAkB/1B,K,2CAI7B+1B,GAEnB,IADA,IAAI/wB,EAA4B,GAChC,MAA2B/I,OAAO2D,QAAQhE,IAA1C,eAAmD,CAAC,IAAD,sBAAvCmE,EAAuC,KAAlCC,EAAkC,KACjDgF,EAAQyC,KACNtK,KAAK64B,0BACHj2B,EACAC,EAAM8rB,WAFR,OAGEiK,QAHF,IAGEA,OAHF,EAGEA,EAAejK,aAKrB,OAAO9mB,K,6BAlCP,OAHK7H,KAAK6kB,WACR7kB,KAAK6kB,SAAW,IAAI4T,GAEfz4B,KAAK6kB,a,KANV4T,GACG5T,c,EA2CF,IAAMiU,GAAqBL,GAAuBh4B,M,s8EChBzD,IAAMs4B,GAAchb,IAAOC,IAAV,MAOK,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAehC,SAAC9G,GAAD,OAAWA,EAAM7C,MAAM2F,mBAGvBiY,GAA0Bjb,IAAOoV,KAAV,MAMpB,SAAClV,GAAD,YACOzd,GAAnByd,EAAMgb,UAAyBhb,EAAMgb,UAAY,WAC/B,SAAChb,GAAD,OAAWA,EAAM7C,MAAM+C,8BA4BhC+a,GAAyBnb,IAAOC,IAAV,MAW7Bmb,GAAgBpb,IAAOC,IAAV,MAQbob,GAAmBrb,YAAOob,GAAPpb,CAAH,MAIhBsb,GAAiBtb,YAAOob,GAAPpb,CAAH,MAIdub,GAASvb,IAAOkK,KAAV,MAKCsR,GAAWxb,IAAOC,IAAV,MASRwb,GAAczb,YAAOwb,GAAPxb,CAAH,MAgBlB0b,GAAuB1b,YAAOwb,GAAPxb,CAAH,MA+uBb2b,GAA0Brb,gBA3uBnB,SAAC,GAAiC,IAAD,0CAA9BgU,EAA8B,EAA9BA,MACf5X,EAAe/Z,GAAe+Z,aAC9Bkf,EAAwBj5B,GAAek5B,qBAFM,EAG/Btb,cAAZla,EAH2C,EAG3CA,EAAGhJ,EAHwC,EAGxCA,KAHwC,EAIzB0tB,mBAAS,IAJgB,mBAI5CzO,EAJ4C,KAIrCwf,EAJqC,OAKvB/Q,mBAAS,IALc,mBAK5CgR,EAL4C,KAKpCC,EALoC,OAMPjR,mBAAmB,IANZ,mBAM5CsK,EAN4C,KAM5B4G,EAN4B,KAO7C1G,EAAiB5yB,GAAeu5B,sBAPa,EAQvBnR,mBAC1B9W,GAAoBkoB,sBAChBloB,GAAoBkoB,sBAAsBC,OAC1C,GAX6C,mBAQ5CA,EAR4C,KAQpCC,EARoC,OAaTtR,qBACxC7oB,GAAkBo6B,4BAEdroB,GAAoBkoB,uBACpBloB,GAAoBkoB,sBAAsB93B,cAjBG,mBAa5Ck4B,EAb4C,KAa7BC,GAb6B,QAoBLzR,qBAC5C7oB,GAAkBu6B,sBAEdxoB,GAAoBkoB,uBACpBloB,GAAoBkoB,sBAAsBh4B,OAxBG,qBAoB5Cu4B,GApB4C,MAoB3BC,GApB2B,MA2B/CC,GAAkC,KAClCC,GAA4C,KAEhD,QAA2Dp6B,KAAvD,UAAAwR,GAAoBkoB,6BAApB,eAA2CzF,SAAuB,CACpE,IAAMA,GAAUZ,GAAU/a,MAAK,SAAC2b,GAAkB,IAAD,EAC/C,OACEA,EAAQxE,MAAMtf,iBAAd,UACAqB,GAAoBkoB,sBAAsBzF,eAD1C,aACA,EAAmD9jB,kBAGnD8jB,KACFmG,GAA4BnG,IAGhC,GAAIx0B,GAAkB46B,yBAA0B,CAC9C,IAAMpG,GAAUZ,GAAU/a,MAAK,SAAC2b,GAAkB,IAAD,EAC/C,OACEA,EAAQzwB,KAAKuN,iBAAb,UACAtR,GAAkB46B,gCADlB,aACA,EAA4CtpB,kBAG5CkjB,KACFkG,GAAkBlG,IAItB,IAAMqG,GAAiB12B,EAAE,2CAEnB22B,GAAyBr6B,GAAeq6B,uBACxCC,GACJt6B,GAAes6B,kCACXC,GACJv6B,GAAeu6B,6BACXC,GAAS92B,EAAE,uCAEX+uB,GAAOgI,iBAAO,CAClBhB,OAAQnoB,GAAoBkoB,sBACxBloB,GAAoBkoB,sBAAsBC,OAC1C,GACJ1V,WAAW,UAAAzS,GAAoBkoB,6BAApB,eAA2CzV,WAClDzS,GAAoBkoB,sBAAsBzV,UADnC,oBAEPxkB,GAAkBm7B,8BAFX,aAEP,EAA0CrQ,cAFnC,QAE6C,KACxDrG,UAAU,UAAA1S,GAAoBkoB,6BAApB,eAA2CxV,UACjD1S,GAAoBkoB,sBAAsBxV,SADpC,oBAENzkB,GAAkBo7B,6BAFZ,aAEN,EAAyCtQ,cAFnC,QAE6C,KACvD3oB,cAAc,UAAA4P,GAAoBkoB,6BAApB,eAA2C93B,cACrD4P,GAAoBkoB,sBAAsB93B,aADhC,oBAEVnC,GAAkBo6B,gCAFR,aAEV,EAA4CtP,cAFlC,QAE4C,KAC1D5oB,aAAcw4B,GACdz4B,OAAO,UAAA8P,GAAoBkoB,6BAApB,eAA2Ch4B,OAC9C8P,GAAoBkoB,sBAAsBh4B,MADvC,oBAEHjC,GAAkBu6B,0BAFf,aAEH,EAAsCzP,cAFnC,QAE6C,KACpDuQ,SAAUtpB,GAAoBkoB,sBAC1BloB,GAAoBkoB,sBAAsBoB,SAC1C,GACJC,QAASvpB,GAAoBkoB,sBACzBloB,GAAoBkoB,sBAAsBqB,QAC1C,GACJr1B,QAAS8L,GAAoBkoB,sBACzBloB,GAAoBkoB,sBAAsBh0B,QAC1C,GACJs1B,UAAWxpB,GAAoBkoB,sBAC3BloB,GAAoBkoB,sBAAsBsB,UAC1C,GACJnhB,MAAOrI,GAAoBypB,YAC3BC,aAAc1pB,GAAoB2pB,qBAClCC,kBAAiB5pB,GAAoBkoB,uBACjCloB,GAAoBkoB,sBAAsB0B,gBAE9CC,oBAAmB7pB,GAAoBkoB,uBACnCloB,GAAoBkoB,sBAAsB2B,kBAE9CpH,QAASmG,GACTkB,SAAQ,oBAAE9pB,GAAoBkoB,6BAAtB,aAAE,EAA2C4B,gBAA7C,QAAyD,GACjEC,cAAa,oBACX/pB,GAAoBkoB,6BADT,aACX,EAA2C6B,qBADhC,QACiD,GAC9DC,QAAO,oBAAEhqB,GAAoBkoB,6BAAtB,aAAE,EAA2C8B,eAA7C,QAAwD,GAC/DC,KAAI,oBAAEjqB,GAAoBkoB,6BAAtB,aAAE,EAA2C+B,YAA7C,QAAqD,KAG3DtS,qBAAU,WACR,IAAMuS,EAAYlsB,KAA6B2C,sBAC7CvX,EAAKyU,UAQP,OANAgqB,EAAS,GAAD,OAAIn5B,GAAey7B,cAAnB,mBAA2CD,IACnDnC,EAAU,GAAD,OACJr5B,GAAe07B,iBADX,mBAEL,CAAC,KAAM,KAAM,MAAMh3B,SAAS82B,GAAa,KAAO,OAG7C,WACLlsB,KAA6BsN,yBAE9B,CAACliB,EAAKyU,WAET,IAAM2jB,GAAcC,qBAAWV,IAG7BsJ,GAIE7I,GAJF6I,6BACAC,GAGE9I,GAHF8I,gCACAhK,GAEEkB,GAFFlB,SACAiK,GACE/I,GADF+I,oBAGF5S,qBAAU,WACJ0S,IACFG,OAED,CAACH,KAEJ1S,qBAAU,WACR,IAAM8S,EAA2B,MAAZnK,GAAmBA,GAAQ,aAAmB,KACnE,GAAqB,OAAjBmK,GACEA,EAAaC,eAAe,gBAAiB,CAC/C,IAAMxoB,EAAcuoB,EAAY,aAC1BE,EAA6B79B,OAAOwG,KAAK4O,GAC/C,GAAIyoB,EAA4B,CAC9B,IAAMC,EAAqB,uBACtBxJ,GADsB,aAEtBuJ,IAEL3C,EAAkB6C,MAAMtgC,KAAK,IAAIugC,IAAIF,KACrCN,IAAgC,OAIrC,CAAChK,GAAUluB,IAEdulB,qBAAU,WAER,IAAKwJ,GAAK4J,QAAL,aAA8B,CAAC,IAAD,EAC3BC,EAAiC,UACrChrB,GAAoBwL,mBADiB,QAErCxN,KAA6BM,qBAC3B5P,GAAeu8B,uBAEbC,EAAiBrJ,GAAU/a,MAAK,SAAC2b,GACrC,OACEA,EAAQzwB,KAAK2M,gBAAkBqsB,EAA0BrsB,iBAIzDusB,IACF/J,GAAK4J,QAAL,2BACK5J,GAAK4J,SADV,IAEE56B,aAAc+6B,QAInB,CAAC9hC,EAAKyU,WAET8Z,qBAAU,WAAO,IAAD,EACM,QAApB,EAAAgC,YAAA,SAAwB8C,SAAS,eAAgB,CAC/C/kB,OAAQD,GAAeC,SAEzBwN,KAAW0X,aACV,IAEH,IAiNIuO,GAsCAC,GAvPE/J,GAAmB,SAACnF,GAEpB,MAG0CA,EAAMxI,OAA5CtN,EAHJ,EAGIA,KAAMvV,EAHV,EAGUA,MAAO6zB,EAHjB,EAGiBA,QAAS2G,EAH1B,EAG0BA,YAC1B5K,EAAe5vB,QAASrC,EAC5B,OAAQ4X,GACN,IAAK,SACHgiB,EAAUl5B,OAAO2B,IACjB,MACF,IAAK,WACoC,oBAA5Bw6B,EAAYC,cACrB7K,EAAe4K,EAAYC,eAE7B,MACF,IAAK,eACH/C,GAAiB9H,GAAgBA,EAAa7pB,QAC9C,MACF,IAAK,QACH8xB,GAAmBjI,GAAgBA,EAAa7pB,QAapD,GALAuqB,GAAK4J,QAAL,2BACK5J,GAAK4J,SADV,kBAEG3kB,EAAOse,GAAoBjE,IAGzBA,GAAgBA,EAAa7pB,QAAW8tB,EAAS,CACpD,IAAM6G,EAAK,aAAOnK,GACZxlB,EAAQ2vB,EAAMC,QAAQplB,IACb,IAAXxK,IACF2vB,EAAME,OAAO7vB,EAAO,GACpBosB,EAAkB6C,MAAMtgC,KAAK,IAAIugC,IAAIS,QAerCG,GAAc,SAAChjB,GACnB,IAAI7X,EAAQswB,GAAK4J,QAAQriB,GACzB,MAAc,UAAVA,EACKza,GAAkB09B,+BAAiC96B,EAExD,CAAC,gBAAgBuC,SAASsV,GACrB7X,EAEe,qBAAVA,GAAkC,MAATA,GAkFnC25B,GAAoB,WACxB,IAAII,EAAqB,uBACpBxJ,GADoB,aArGE,WAC3B,IAAIwK,EAAkC,GAMtC,OALAtK,EAAe5wB,SAAQ,SAACgY,GACjBgjB,GAAYhjB,IACfkjB,EAAsBtzB,KAAKoQ,MAGxBkjB,EAgGFC,IAFoB,aAhFQ,WACjC,IAAIC,EAAwC,GAC5C,GAAIrjB,EAAasjB,+BAAgC,CAE1CL,GADO,iBAEVI,EAA4BxzB,KAFlB,gBAMd,OAAOwzB,EA0EFE,KAELhE,EAAkB6C,MAAMtgC,KAAK,IAAIugC,IAAIF,KACA,IAAjCA,EAAsBh0B,OA3EK,WAAO,IAAD,EAoBjCuqB,GAAK4J,QAlBPtY,EAFmC,EAEnCA,UACAC,EAHmC,EAGnCA,SACAviB,EAJmC,EAInCA,aACAC,EALmC,EAKnCA,aACAF,EANmC,EAMnCA,MACAgE,EAPmC,EAOnCA,QACAs1B,EARmC,EAQnCA,UACAF,EATmC,EASnCA,SACAC,EAVmC,EAUnCA,QACAlhB,EAXmC,EAWnCA,MACAqhB,EAZmC,EAYnCA,aACAjH,EAbmC,EAanCA,QACAuH,EAdmC,EAcnCA,QACAD,EAfmC,EAenCA,cACAD,EAhBmC,EAgBnCA,SACAG,EAjBmC,EAiBnCA,KACAJ,EAlBmC,EAkBnCA,kBACAD,EAnBmC,EAmBnCA,gBAEI3nB,EAAsC,CAC1CwQ,YACAC,WACAtiB,eACAF,MAAOA,GAAgB,GACvBgE,QAASA,GAAoB,GAC7Bs1B,UAAWA,GAAwB,GACnCF,WACAn5B,aAAc,GACd65B,UACAD,gBACAE,OACAH,WACArH,UACAmH,gBAAe,OAAEA,QAAF,IAAEA,KACjBC,kBAAiB,OAAEA,QAAF,IAAEA,MAGfz5B,GAAgBA,EAAawG,SACjCqL,EAAa2nB,iBAAkB,GAG3B15B,GAASA,EAAM0G,SACnBqL,EAAa4nB,mBAAoB,GAGd,OAAjB15B,IACF8R,EAAa9R,aAAeA,EAAa6B,MAG3B,OAAZywB,IACFxgB,EAAawgB,QAAUA,EAAQxE,OAG7BsL,GAAWA,EAAQ3yB,SACrBqL,EAAasnB,QAAUA,GAGrBpB,GAAUA,EAAS,IACrBlmB,EAAakmB,OAASA,GAGxBnoB,GAAoBkoB,sBAAwBjmB,EAC5CjC,GAAoB2pB,qBAAuBD,EAC3C1pB,GAAoBypB,YAAcphB,EAClCkiB,IAAoB,GAUlB0B,GAEA3B,IAAgC,IAI9Bz5B,GAAQ,CACZswB,KAAMA,GAAK4J,QACX3J,eAAgBA,EAChBC,oBACAC,kBAGI4K,GAAgBpF,GAAmBqF,qBAAqBhE,GACxDiE,GACJ,oCACE,kBAACzL,GAAD,CACEva,KAAM,WACN6X,MAAO7rB,EAAE,+BACTqmB,SAAU4I,GACVxwB,MAAOswB,GAAK4J,QAAL,SACP1K,MAAM,kBAER,kBAACkB,GAAD,CACE9I,SAAU4I,GACVjb,KAAM,OACNia,MAAM,iBACNxvB,MAAOswB,GAAK4J,QAAL,QAKPsB,GACJ,kBAAC,GAAD,CACE7qB,GAAG,iBACH8hB,UAAU,0BACV7C,aAAcU,GAAK4J,QAAL,QACd3kB,KAAK,UACLqS,SAAU4I,GACVpD,MAAO7rB,EAAE,8BACTgwB,eAAgB,SAACS,GAAD,OAAqBA,EAAO5E,SAG1CqO,GACJ,oCACE,kBAAC9E,GAAD,CACEhb,YAAU,UACV+F,UAAU,kCAEV,kBAACgP,GAAD,CAAqBnb,KAAM,UAAWia,MAAM,4BAC5C,kBAACkB,GAAD,CACEnb,KAAM,gBACNia,MAAM,8BAkFd,OA1EE8K,GADEpC,GAEA,0BACExY,wBAAyBR,GACvB3d,EACA,oDAIyC,OAAtC42B,GAEP,0BACEzY,wBAAyBR,GACvB3d,EACA,2CACA,CACEsT,WAAYtG,GAAW4pB,QAO7B,0BACEzY,wBAAyBR,GACvB3d,EACA,qCACA,CACEsT,WAAYujB,GACR,0BACA7pB,GAAW1Q,GAAe8iB,yBAStC4Z,GADErC,GAEA,0BACExY,wBAAyBR,GACvB3d,EACA,sDAIyC,OAAtC42B,GAEP,0BACEzY,wBAAyBR,GACvB3d,EACA,6CACA,CACEsT,WAAYtG,GAAW4pB,QAO7B,0BACEzY,wBAAyBR,GACvB3d,EACA,uCACA,CACEsT,WAAYujB,GACR,0BACA7pB,GAAW1Q,GAAe8iB,yBAQtC,kBAAC0V,GAAD,KACE,kBAAC,GAAD,CAAO3f,KAAMnV,EAAE,kCACf,kBAAC40B,GAAD,CAAyBzU,UAAW8N,GACjCC,IACC,kBAACsE,GAAD,CAAc/yB,MAAOyuB,GAAQ,MAAWvuB,OAAQuuB,GAAQ,SAE1D,kBAACY,GAAsBqL,SAAvB,CAAgC17B,MAAOA,IACrC,kBAACk2B,GAAD,KACE,kBAACU,GAAD,CAAsBjb,YAAU,UAC7B/D,EAAa+jB,aACZ,kBAAChG,GAAD,CACEvI,MAAO7rB,EAAE,6BACTgU,KAAM,SACNqS,SAAU4I,GACVxrB,QAASq2B,MAIf,kBAAC1E,GAAD,CACEhb,YAAU,qBACV+F,UAAU,kCAEV,kBAACgP,GAAD,CACEnb,KAAM,YACNia,MAAM,4BAER,kBAACkB,GAAD,CACEnb,KAAM,WACNia,MAAM,6BAGV,kBAACmH,GAAD,CACEhb,YAAU,iBACV+F,UAAU,kCAEV,kBAACuR,GAAD,CAAsBzD,MAAM,aAAaja,KAAM,iBAC/C,kBAACmb,GAAD,CACElB,MAAM,0BACNja,KAAM,WAIV,kBAACohB,GAAD,KACG/e,EAAagkB,eACZ,kBAAC9L,GAAD,CACEE,gBAAiB,CAAE6L,QAAQ,GAC3Bh0B,KAAK,OACL+f,SAAU4I,GACVhB,MAAM,0BACNja,KAAK,WACL6X,MAAO7rB,EAAE,iCAGZqW,EAAakkB,cACZ,kBAAChM,GAAD,CACElI,SAAU4I,GACVhB,MAAM,0BACNja,KAAK,UACL2G,WAAW,EACXsL,WAAW,EACX4F,MAAO7rB,EAAE,8BACTmmB,KAAM,KAIXwQ,IACC,kBAAC,GAAD,CAAQvc,YAAU,2BAA2B0c,MAG/CzgB,EAAamkB,cAAgBnkB,EAAaokB,eAC1C,kBAAC9F,GAAD,KACGte,EAAamkB,aACZnkB,EAAaokB,aACX,oCACGP,GACD,kBAAC9E,GAAD,CACEhb,YAAU,sBACV+F,UAAU,sDAET6Z,GACAC,KAIL,oCACGC,GACD,kBAAC9E,GAAD,CACEhb,YAAU,eACV+F,UAAU,kCAET6Z,UAIL59B,GAEFia,EAAamkB,cAAgBnkB,EAAaokB,cAC1C,kBAACrF,GAAD,CACEjV,UAAU,aACV/F,YAAU,wBAET6f,KAKT,kBAACtF,GAAD,KACE,kBAACS,GAAD,CAAahb,YAAU,sBACpBuc,GACC,kBAACpI,GAAD,CACElI,SAAU4I,GACVb,SAAS,SACTH,MAAM,eACNja,KAAK,UACL2G,WAAW,EACXsL,WAAW,EACXuI,QAAS,EACT3C,MAAO7rB,EAAE,8BACTkmB,YAAalmB,EAAE,0CACfyuB,gBAAiB,CAAE6L,QAAQ,KAG7B,kBAAC/L,GAAD,CACElI,SAAU4I,GACVb,SAAS,SACTH,MAAM,eACNja,KAAK,UACL2G,WAAW,EACXsL,WAAW,EACXuI,QAAS,EACT3C,MAAO7rB,EAAE,iCAIdu1B,GACC,kBAACH,GAAD,KACE,kBAAC7G,GAAD,CACElI,SAAU4I,GACVb,SAAS,SACTH,MAAM,eACNja,KAAK,YACL2G,WAAW,EACXsL,WAAW,EACXuI,QAAS,EACT3C,MAAO7rB,EAAE,gCACTvB,MAAOswB,GAAK4J,QAAL,aAKZtiB,EAAasjB,gCACZ,kBAAC5H,GAAD,CACE/d,KAAK,eACL6X,MACE,8BAAO7rB,EAAE,8CAEXgyB,YAAY,eACZC,UAAW,qBAIbp2B,GAAkB09B,+BAClB,kBAACxH,GAAD,CACE/d,KAAK,QACL6X,MACE,0BACE1N,wBAAyBR,GACvB3d,EACA,kCACA,CACEiW,YAKR+b,YAAY,QACZC,UAAW,UAIdiE,GACC,kBAACnE,GAAD,CACE9D,MAAM,eACNja,KAAK,kBACL6X,MAAOkN,GACP/G,YAAY,kBACZC,UAAW,oBAGdoE,IACC,kBAACtE,GAAD,CACE9D,MAAM,eACNja,KAAK,oBACL6X,MAAOmN,GACPhH,YAAY,oBACZC,UAAW,sBAId5b,EAAaqkB,sBAAwB/D,IACpC,kBAAC5E,GAAD,CACE9D,MAAM,eACNja,KAAK,sBACL6X,MACE,0BACE1N,wBAAyBR,GACvB3d,EACA,iCACA,CACE26B,QAAS3tB,GAAW1Q,GAAe4F,iBAK3C8vB,YAAY,sBACZC,UAAW,wBAGd5b,EAAaukB,gBAAkBjE,IAC9B,kBAAC5E,GAAD,CACE9D,MAAM,eACNja,KAAK,gBACL6X,MACE,0BACE1N,wBAAyBR,GACvB3d,EACA,wCAINgyB,YAAY,gBACZC,UAAW,mBAGboE,IACAH,GACA7f,EAAaqkB,uBACd/D,GACC,kBAAC1B,GAAD,CACE9U,UAAU,aACV/F,YAAU,yBAETsc,IAGH,qCAGF,kBAAC1B,GAAD,CAAkB5a,YAAU,sBACzBuc,GACCN,IAAmBH,EACjB,0BACE/X,wBAAyBR,GACvB3d,EACA,iDAIJ,qCAGF,0BACEme,wBAAyBR,GACvB3d,EACA,kCACA,CAAE01B,OAAQA,c,68CC51B9B,IAAMmF,GAAsBlhB,IAAOoV,KAAV,MAMH,SAAClV,GAAD,OAAWA,EAAM7C,MAAM2J,mBAM1B,SAAC9G,GAAD,OACfA,EAAM7C,MAAMiR,aAAe,gBAAkB,SAY3C6S,GAAenhB,YAAOwb,GAAPxb,CAAH,MASZohB,GAAaphB,IAAOC,IAAV,MAEL,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAM5BgY,GAAarhB,YAAOshB,qBAAPthB,CAAH,MACM,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAOvCsT,GAAavhB,YAAOwhB,qBAAPxhB,CAAH,MACM,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAOvCwT,GAAUzhB,YAAO0hB,kBAAP1hB,CAAH,MACS,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAOvC0T,GAAqB3hB,YAAOmb,GAAPnb,CAAH,MA8MX4hB,GAAethB,gBA5MX,SAAC,GAAe,IAAbgU,EAAY,EAAZA,MACVjuB,EAAMka,cAANla,EADsB,EAEJ0kB,mBAASpF,eAAckc,OAFnB,mBAEvB/7B,EAFuB,KAEhBg8B,EAFgB,OAGQ/W,mBAAS,IAHjB,mBAGvBgX,EAHuB,KAGVC,EAHU,OAIUjX,mBAAS,IAJnB,mBAIvBkX,EAJuB,KAITC,EAJS,KAKxBC,EAASC,uBACTC,EAAWC,yBACXhmB,EAAQ3Z,GAAey7B,cACvBrC,EAASp5B,GAAe07B,iBARA,EASUtT,oBAAS,GATnB,mBASvBwX,EATuB,KASTC,EATS,OAUMzX,oBAAS,GAVf,mBAUvB0X,EAVuB,KAUXC,EAVW,OAWc3X,mBAAS,IAXvB,mBAWvB4X,EAXuB,KAWPC,EAXO,OAYQ7X,mBAAwB,MAZhC,mBAYvB8X,EAZuB,KAYVC,EAZU,OAawB/X,oBAAS,GAbjC,mBAavBgY,EAbuB,KAaFC,EAbE,OAcQjY,oBAAS,GAdjB,mBAcvBkY,EAduB,KAcVC,EAdU,KAexBpmB,EAAena,GAAewgC,YAO9B1N,EAAcC,qBAAWV,IAE7BoO,EAGE3N,EAHF2N,gCACA7E,EAEE9I,EAFF8I,gCACA8E,EACE5N,EADF4N,gBAGFzX,qBAAU,WACR,IAAM1W,EAAajB,GAAoBiB,WACvCgtB,EAAgBhtB,EAAWouB,eAC3BV,EAAkB1tB,EAAWC,gBAC5B,IAEHyW,qBAAU,WACJiX,GAAeN,GAGjBc,GAAgB,KAEjB,CAACR,EAAaN,IAEjB3W,qBAAU,WACJwX,IACFF,GAAe,GACfK,QAED,CAACH,IAEJxX,qBAAU,YACJ9lB,GAAS/E,OAAOwG,KAAKw6B,GAAal3B,OAAS,GAAK43B,IAClDlE,GAAgC,KAEjC,CAACz4B,EAAOi8B,EAAaU,IAExB,IAAMe,GAAY,yCAAG,WAAOrT,GAAP,kBAAApN,EAAA,sDAGnBigB,EAAuBD,GAAuB5S,EAAMsT,OAChDtT,EAAMrqB,OACJ49B,EADW,2BAEV3B,GAFU,kBAGZ5R,EAAMwT,YAAcxT,EAAMrqB,MAAMqC,UAEnC65B,EAAe0B,YAEXA,EADC,eACoB3B,IACJ5R,EAAMwT,aAC3B3B,EAAe0B,IAbE,2CAAH,sDAiBZH,GAAkB,WACjBhB,EAKLqB,KAJElB,GAAc,IAOZmB,GAAa,yCAAG,iCAAA9gB,EAAA,sEACiBof,EAAQ2B,iBAC3C7B,EACA,CACE8B,eAAgB,CACdC,KAAM3B,EAAU4B,WAAW3C,yBALb,uBACZx7B,EADY,EACZA,MAAOo+B,EADK,EACLA,YADK,kBAUb,CACLnC,YAAaj8B,EACb+8B,YAAaqB,EAAcA,EAAYzuB,QAAKhT,IAZ1B,2CAAH,qDAgBb0hC,GAAiB,yCAAG,iCAAAphB,EAAA,sEACeof,EAAQiC,mBAC7CnC,EACA,CACE8B,eAAgB,CACdC,KAAM3B,EAAU4B,WAAW3C,yBALT,uBAChBx7B,EADgB,EAChBA,MAAOu+B,EADS,EACTA,cADS,kBASjB,CACLxB,YAAawB,EAAgBA,EAAc5uB,QAAKhT,EAChDs/B,YAAaj8B,IAXS,2CAAH,qDAejB89B,GAAY,yCAAG,iCAAA7gB,EAAA,yDACdof,GAAWE,EADG,uBAEjBP,EAAS,CAAEh8B,MAAO,8BAClBk8B,EAAe,CAAEsC,qBAAsB,8BAHtB,6BAOnB5xB,aAAaG,QACX,mBACAoB,GAAoBK,eAAemB,IAErC/C,aAAaG,QAAQ,cAAelQ,GAAeE,kBAGjD,cAAgB8/B,EAdC,iCAePkB,KAfO,4DAgBPM,KAhBO,mCAaXpC,EAbW,EAaXA,YAAac,EAbF,EAaEA,YAIrBC,EAAeD,GAA4B,MAE3CnwB,aAAa6xB,WAAW,oBACxB7xB,aAAa6xB,WAAW,eAEpBxC,GACFD,EAAS,CAAEh8B,MAAOi8B,EAAa55B,UAC/B65B,EAAe,CAAEsC,qBAAsBvC,EAAa55B,UACpDq8B,MAAiB,SAAUC,GACzBA,EAAMC,OAAO,cAAe/B,GAC5B6B,KAAwB,IAAI57B,MAAMm5B,EAAa55B,eAGjD65B,EAAe,IACfF,EAAS,OA/BQ,4CAAH,qDAkClB,OACE,kBAACH,GAAD,CAAoBlhB,YAAU,gBAC3BsiB,GAAuBE,GACtB,kBAACpK,GAAD,CACE/yB,MAAOO,EAAE,oCACTL,OAAQ,UAGXjF,OAAOwG,KAAKw6B,GAAal3B,OAAS,GACjC,kBAACguB,GAAD,CACE/yB,MAAO/E,OAAOC,OAAO+gC,GAAa92B,KAAK,SACvCjF,OAAQ,UAGXy8B,GACC,kBAAC5J,GAAD,CACE/yB,MAAOO,EAAE,+CACTL,OAAQ,UAGZ,kBAAC,GAAD,CAAOwV,KAAMnV,EAAE,oCACf,kBAAC66B,GAAD,CAAqB1a,UAAW8N,GAC9B,kBAAC6M,GAAD,KACE,kBAACE,GAAD,CAAY3U,SAAU8W,KACtB,kBAACjC,GAAD,CAAY7U,SAAU8W,KACtB,kBAAC/B,GAAD,CAAS/U,SAAU8W,MAErB,kBAACpC,GAAD,KACG/6B,EAAE,sCAAuC,CAAEyW,kBAI9C,kBAACqkB,GAAD,CAAc3a,UAAU,eACtB,kBAACyR,GAAD,KACE,kBAACC,GAAD,CACExL,SAtKiB,SAACC,EAASgM,GACrC6J,EAAgB7J,GACZA,GACF+J,GAAc,IAoKNlc,UAAWic,EAAa,QAAU,GAClChK,QAAS,kBAACC,GAAA,EAAD,CAAUre,KAAK,aACxB6X,MACE,0BACE1N,wBAAyBR,GACvB3d,EACA,4CACA,CACEiW,QACAyf,sBCrQT4I,GAAsBrkB,gBArBnB,SAAC,GAAe,IAAbgU,EAAY,EAAZA,MAAY,EACZvJ,mBAAS9W,GAAoB2wB,eAAvCzC,EADsB,oBAErB9kC,EAASkjB,cAATljB,KACRuuB,qBAAU,cAEP,IACH,IAAMiZ,EAAsC,CAC1ChhC,OAAQxG,EAAKyU,UAGf,OACE,oCACGqwB,GACC,kBAAC,YAAD,CAAUt9B,IAAKxH,EAAKyU,SAAUhI,QAAS+6B,EAAc1C,OAAQA,GAC3D,kBAACP,GAAD,CAActN,MAAOA,SCXzBwQ,GAAmCxkB,gBAAK,WAC5C,IAAMoL,EAAaC,6BACboZ,EAAUC,eAUhB,OATApZ,qBAAU,WACR,IAAMC,EAAenJ,GAAqB,IAAIqJ,WAAU,SAACxhB,GAGvD,OAFA8c,GAAac,QAAU5d,EACvBw6B,EAAQx4B,KAAKhH,GAAqB1G,EAAOQ,OAAOO,kBACzC,WACLisB,EAAaG,iBAEdN,MAEE,kBAAC/C,GAAD,CAAQH,SAAU,a,8xBCN3B,IAAMyc,GAAwBjlB,IAAOC,IAAV,MAEA,SAACC,GAAD,OAAWA,EAAMglB,QAQtCC,GAAanlB,IAAOC,IAAV,MAKVmlB,GAAkBplB,IAAOkK,KAAV,MASfmb,GAAqBrlB,IAAOkK,KAAV,MAIlBob,GAAkBtlB,IAAOC,IAAV,MAmCRslB,GAAwBjlB,gBA7BxB,SAACJ,GACZ,IAGIglB,EAHErtB,EAAQ,UAAMqI,EAAMrI,SAAZ,OACR2tB,EAAQtlB,EAAMulB,WAAavlB,EAAMulB,UAAY,KAAKC,QAAQ,GAAK,EAMrE,OAHuBR,EAAvBhlB,EAAMrI,SAAY,EAAY,YAAuB,OACvCqtB,GAAdM,EAAS,EAAa,QAAoB,GAGxC,kBAACP,GAAD,CACExkB,YAAA,kCAAsCP,EAAMylB,cAC5CT,KAAMA,GAELhlB,EAAMrI,SAAY,GACjB,kBAACwtB,GAAD,KAAqBxtB,GAEvB,kBAACstB,GAAD,KACGjlB,EAAM0lB,OAAS,yBAAK7f,IAAK7F,EAAM0lB,MAAO5f,IAAK9F,EAAM7F,OAClD,kBAAC+qB,GAAD,KAAkBllB,EAAM7F,OAEzBmrB,EAAS,GACR,kBAACF,GAAD,KACGE,EADH,IACWtlB,EAAM9M,c,+qBCzDzB,IAAMyyB,GAAgB7lB,IAAOC,IAAV,MACF,SAACC,GAAD,OAAWA,EAAM8E,cAG5B8gB,GAAiB9lB,IAAOC,IAAV,MAKd8lB,GAAe/lB,IAAOC,IAAV,MAMZ+lB,GAAchmB,IAAOC,IAAV,MAQXgmB,GAAejmB,YAAOkmB,KAAPlmB,CAAH,MACP,SAACE,GAAD,OAAWA,EAAM7C,MAAMgM,iBAG5B8c,GAAgBnmB,aAAO,gBAAGwG,EAAH,EAAGA,UAActG,EAAjB,qCAC3B,kBAACkmB,GAAA,EAAD,eAASC,sBAAoB,GAAKnmB,EAAlC,CAAyCiW,QAAS,CAAEmQ,OAAQ9f,QADxCxG,EAEnB,8CACMumB,KAAeC,SAAY,CAChCxf,gBAAgB,QAChByf,MAAO,OACPC,UAAU,mCACVC,UAAU,sBAiCDC,GAAatmB,gBA7BH,SAACJ,GAAqB,IAAD,EACJ6K,oBAAS,GADL,mBACnC8b,EADmC,KACtBC,EADsB,KAEpCjX,EAAa3P,EAAM1E,KAAKsR,MAAM,QAAQ7hB,KAAK,SAC3C+Z,EAAariB,GAAeqiB,WAE5B+hB,EACJ,kBAAClB,GAAD,CAAe7gB,WAAYA,GACzB,kBAAC+gB,GAAD,KAAe7lB,EAAMgI,OACrB,kBAAC8d,GAAD,KACE,0BAAMxhB,wBAAyB,CAAEN,OAAQ2L,OAK/C,OACE,kBAACsW,GAAD,CACE1lB,YAAU,aACVyH,MAAO6e,EACPC,KAAMH,EACNI,OAAQ,kBAAMH,GAAe,IAC7BI,QAAS,kBAAMJ,GAAe,KAE9B,kBAAChB,GAAD,KACE,kBAACG,GAAD,CAActiB,QAAS,kBAAMmjB,GAAgBD,W,kmBChErD,IAAMM,GAAiBnnB,IAAOC,IAAV,MAKE,SAACC,GAAD,OAAWA,EAAM7C,MAAM+Q,0BAClC,SAAClO,GAAD,OAAWA,EAAM7C,MAAMgR,oBAK5B+Y,GAAcpnB,IAAOC,IAAV,MAIXonB,GAAmBrnB,IAAOC,IAAV,MAIhBqnB,GAAgBtnB,YAAOunB,KAAPvnB,CAAH,MACR,SAACE,GAAD,OAAWA,EAAM7C,MAAMgR,oBAwBrBmZ,GAAclnB,gBAlBd,SAACJ,GACZ,IAAMunB,EAAUvnB,EAAMunB,QAMtB,OACE,kBAACN,GAAD,CAAgB1mB,YAAU,wBACxB,kBAAC2mB,GAAD,KAAcK,EAAQxhC,MACtB,kBAACohC,GAAD,KACE,kBAACT,GAAD,CAAY1e,MAAOuf,EAAQptB,KAAMmB,KAAMisB,EAAQC,eAEhDxnB,EAAMynB,aAAe,kBAACL,GAAD,CAAe7mB,YAAU,iBAAiBkD,QAV5C,WACtBzD,EAAM0nB,gBAAiBH,EAAQxhC,a,koBCjCnC,IAAM8gB,GAAiB/G,IAAOC,IAAV,MAKE,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBACvB,SAACnJ,GAAD,OAAWA,EAAM7C,MAAM2J,mBAIvC6gB,GAAW7nB,IAAOC,IAAV,MACH,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAI5Bye,GAAY9nB,IAAO+nB,GAAV,MACJ,SAAC7nB,GAAD,OAAWA,EAAM7C,MAAMgM,iBAO5B2e,GAAmBhoB,IAAOC,IAAV,MAgJTgoB,GAAU3nB,gBAzII,WAAO,IAAD,MACvBja,EAAMka,cAANla,EADuB,EAS3B4N,GAAoBK,eANtBlR,EAH6B,EAG7BA,QACA+sB,EAJ6B,EAI7BA,MACAzgB,EAL6B,EAK7BA,MACgByB,EANa,EAM7BqG,eACAtC,EAP6B,EAO7BA,WACA4C,EAR6B,EAQ7BA,SAEIowB,EACJ/X,IAAK,UACL1c,GAAiBO,cADZ,aACL,EAAyBH,QACvB,SAACs0B,GAAD,OAAgBA,EAAW1yB,KAAO0a,EAAM9X,iBACxC,IACE+vB,EACJ14B,IAAK,UACL+D,GAAiBM,cADZ,aACL,EAAyBF,QACvB,SAACs0B,GAAD,OAAgBA,EAAW1yB,KAAO/F,EAAM2I,iBACxC,IAEEgwB,KAAc,OAACvwB,QAAD,IAACA,OAAD,EAACA,EAAUjN,QACzBy9B,IAAanY,EACboY,IAAa74B,EACb+iB,KAAY,OAACthB,QAAD,IAACA,OAAD,EAACA,EAAOtG,QAEpBgN,EAAW,SAACswB,GAChB,OAAc,OAAVjzB,QAAU,IAAVA,OAAA,EAAAA,EAAYszB,UAAWL,EAAWM,QAAUN,EAAWO,gBACjC,UAApBxzB,EAAWyzB,KACNvlC,EAGJ,GAGHqiC,EAAY,SAAC0C,GACjB,OAAc,OAAVjzB,QAAU,IAAVA,OAAA,EAAAA,EAAYszB,UAAWL,EAAWM,QAAUN,EAAWO,eACpB,IAA9BP,EAAWjzB,WAAWswB,MAExB,GAGHpyB,EAAW,SAAC+0B,GAChB,OAAc,OAAVjzB,QAAU,IAAVA,OAAA,EAAAA,EAAYszB,UAAWL,EAAWM,QAAUN,EAAWO,eAClDP,EAAWjzB,WAAW9B,SAExB,GAGHw1B,EAAkB,SAACC,GACvB,OACE,oCACE,kBAAChB,GAAD,CAAUpnB,YAAU,qBAAqBooB,GACzC,kBAACf,GAAD,QAKAgB,EAAgBR,EACpB,kBAAC/C,GAAD,CACE1gC,IAAKqjC,EAAOzyB,GACZkwB,aAAcuC,EAAOzyB,GAAGmb,WACxBvW,KAAM6tB,EAAO7tB,KACbxC,SAAUA,EAASqwB,GACnBzC,UAAWA,EAAUyC,GACrB90B,SAAUA,EAAS80B,GACnBtC,MAAOsC,EAAOtC,QAGhB,qCAGIz2B,EAAgBo5B,EACpB,kBAAChD,GAAD,CACE1gC,IAAKujC,EAAO3yB,GACZkwB,aAAcyC,EAAO3yB,GACrB4E,KAAM+tB,EAAO/tB,KACbxC,SAAUA,EAASuwB,GACnB3C,UAAWA,EAAU2C,GACrBh1B,SAAUA,EAASg1B,GACnBxC,MAAOwC,EAAOxC,QAGhB,qCAGIx2B,EAAgBqjB,EAClBthB,EAAM9G,KAAI,SAACpD,GAAD,OACR,kBAACs+B,GAAD,CACE1gC,IAAKoC,EAAKoR,cACVstB,aAAc1+B,EAAKoR,cACnBgC,KAAMpT,EAAKoT,KACXxC,SAAU5Q,EAAK4Q,SACf4tB,UAAWx+B,EAAK8hC,WAChB31B,SAAUnM,EAAKmM,SACfwyB,MAAO3+B,EAAK2+B,WAGhB,GAEEoD,EAAgBX,EAClBvwB,EAASzN,KAAI,SAACo9B,GAAD,OACX,kBAACD,GAAD,CAAaC,QAASA,EAAS5iC,IAAK4iC,EAAQxhC,UAE9C,GAIJ,OAF0BoiC,GAAcC,GAAYC,GAAY9V,EAG9D,kBAAC,GAAD,CAAgBhS,YAAU,WACvB4nB,GAAcO,EAAgBviC,EAAE,6BAChCgiC,GAAcW,EAEdV,GAAYM,EAAgBviC,EAAE,2BAC9BiiC,EAAW,oCAAGQ,GAAoB,GAElCP,GAAYK,EAAgBviC,EAAE,2BAC9BkiC,EAAW,oCAAGp5B,GAAoB,GAElCsjB,GAAYmW,EAAgBviC,EAAE,2BAC9BosB,EAAW,oCAAGrjB,GAAoB,GAElC8F,GAAc0zB,EAAgBviC,EAAE,+BAChC6O,GACC,kBAAC8yB,GAAD,CAAkBvnB,YAAU,qBAC1B,wCACGxM,GAAoBoC,yCADvB,aACG,EAAuDqvB,QAAQ,GAAI,IACnExwB,EAAW9B,YAMpB,wC,UC1KS61B,GAAb,kDACE,aAAe,uCACP,oBAFV,UAAuCv+B,ICCjCxJ,GAAcsJ,K,kcCoBpB,IAAM0+B,GAAwBlpB,IAAOC,IAAV,MAKdkpB,GAA4BnpB,IAAOC,IAAV,MAMhCmpB,GAASppB,IAAOC,IAAV,MAKNopB,GAAYrpB,YAAOspB,KAAPtpB,CAAH,MAwNFupB,GAAqBjpB,gBApNb,WAAO,IAClBja,EAAMka,cAANla,EADiB,EAEF0kB,mBAAS9W,GAAoBu1B,mBAA7C/0B,EAFkB,sBAGNsW,mBAASpF,eAAckc,OAAnCtN,EAHkB,sBAImBxJ,mBAC1C9W,GAAoBw1B,gBALG,mBAIlBA,EAJkB,KAIFC,EAJE,OAQa3e,oBACnCpoB,GAAewV,qBATO,mBAQlBwxB,EARkB,KAQLC,EARK,OAWiB7e,mBAAS,IAX1B,mBAWlB8e,EAXkB,KAWNC,EAXM,OAYuB/e,oBAAS,GAZhC,mBAYlBgf,EAZkB,KAYAvL,EAZA,OAaezT,oBAAS,GAbxB,mBAalBif,EAbkB,KAaJ3G,EAbI,OAevBtY,oBAAS,GAfc,mBAclBuT,EAdkB,KAcYC,EAdZ,OAiBvBxT,oBAAS,GAjBc,mBAgBlBqY,EAhBkB,KAgBe6G,EAhBf,OAkBSlf,oBAAS,GAlBlB,mBAkBlBmf,EAlBkB,KAkBPC,EAlBO,KAmBnBC,EAAqBznC,GAAeynC,mBAnBjB,EAoBerf,mBAAS,MApBxB,mBAoBlBsf,EApBkB,KAoBJC,EApBI,KAqBnB5e,EAAaC,6BAEXtuB,EAASkjB,cAATljB,KACRuuB,qBAAU,WACR8d,EAAkBz1B,GAAoBw1B,kBACrC,CAACpsC,EAAKyU,WAET8Z,qBAAU,WACR,IAAI2e,EAAc,kBACdd,GAAkBh1B,IAAiBzU,EAAawqC,eAClDD,EAAc,8BAEZ91B,IAAiBzU,EAAa0U,UAChC61B,EAAc,+BAEZZ,GAAehnC,GAAewV,sBAChCoyB,EAAc,0BAGhBT,EAAoBS,KACnB,CACD91B,EACAg1B,EACAE,EACAhnC,GAAewV,sBAcjByT,qBAAU,WACR,GAAIjpB,GAAewV,qBAAuBsxB,GAAkBE,EAAa,CACvE,IAAMc,EAASxwB,SAASywB,cAAc,uBAClCD,IAda,SAAC5jB,GACpB,IAAM8jB,EAAO9jB,EAAQ+jB,wBACrB,OACED,EAAKE,KAAO,GACZF,EAAKG,MAAQ,GACbH,EAAKI,SACFha,OAAOia,aAAe/wB,SAASgxB,gBAAgBC,eAClDP,EAAKQ,QAAUpa,OAAO4C,YAAc1Z,SAASgxB,gBAAgBG,aAO9CC,CAAaZ,KACpB,OAANA,QAAM,IAANA,KAAQa,eAAe,CAAEC,MAAO,MAAOC,OAAQ,iBAKrD5f,qBAAU,WACH0S,GAA8BE,GAAoB,GACvDyL,GAAmC,KAClC,CAAC3L,IAEJ1S,qBAAU,WACJoe,GAeFyB,MAED,CAACzB,EAActe,IAElBE,qBAAU,WACR,GAAIme,EAAkB,CACpB,IAAMle,ExDtG+B,SAAC3lB,GAK1C,IAAMuP,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAI0W,GAA6B7L,GAClD,OAAOvU,GAAY2hB,IAAIjY,EAAU1E,GwD+FRwlC,CAA4B,CAC/Cx1B,aAAcjC,GAAoBkoB,wBACjCpQ,WAAU,SAACxhB,GACZ0J,GAAoBK,eAApB,2BACKL,GAAoBK,gBACpB/J,GAEDA,EAAK2K,WACHjB,GAAoBiE,4BACtBuzB,IAEI9oC,GAAewV,oBACZwxB,EAIHM,GAAmC,IAHnCL,GAAe,GACfrL,GAAgC,IAKlC0L,GAAmC,GAIvCwB,MAED/f,GACH,OAAO,WACLG,EAAaG,eAGfuS,GAAgC,KAEjC,CAACwL,EAAkBre,IAEtB,IAIM+f,EAAkB,WACtB,GAAIrB,EAAoB,CACtB,IAAMve,ED7KmB,SAACwe,GAC9B,IAAMz/B,EAAW,IAAIq+B,GACrB,OAAO/nC,GAAYohB,KAAK1X,EAAU,CAAE5L,MAAOqrC,IC2KlBsB,CAAgBtB,GAAete,WAAU,SAACxhB,GAChD,MAATA,IACF0J,GAAoB0E,eAAiB0xB,EACrCF,GAAa,MAEdze,GACH,OAAO,WACLG,EAAaG,eAGfme,GAAa,IAQXrlC,EAAiC,CACrC05B,sBACA6E,kBACA/E,+BACA8E,kCACA7E,kCACA0L,qCACA1V,YAGI/Q,EACJ,oCACE,kBAAC2lB,GAAD,KACE,kBAACnW,GAAD,CAAiBvS,YAAU,uBAC3B,kBAAC,GAAD,MAEA,kBAACuU,GAA0BwL,SAA3B,CAAoC17B,MAAOA,GACzC,kBAAC62B,GAAD,CACErH,MAAOgK,EAA+B,WAAa,KAEpDmL,GAAkBE,GACjB,kBAACT,GAAD,CAAuBzoB,YAAU,oBAC/B,kBAACiP,GAAD,CAAiBlU,KAAMiuB,IACvB,kBAAC/Z,GAAD,CACElU,KAAMnV,EAAE,uCACRL,OAAQ,UAIbyjC,GAAkBE,GACjB,kBAAChF,GAAD,CACElkB,YAAU,uBACV6T,MAAOgK,EAA+B,WAAa,KAGtD8L,GACC,kBAACf,GAAD,CACEuC,QAASluC,2CACTgvB,SA1CK,SAAC5nB,GAChBwlC,EAAgBxlC,IA0CN+mC,GAAIxuC,EAAKyU,WAGb,kBAAC6X,GAAD,CACEG,cAAe+f,EACflmB,QApEgB,WACxB4a,GAAgC,IAoExB1U,OAAQyU,EACRtV,SACEsV,GACC8L,IAAuBC,IAG5B,kBAACjB,GAAD,CAAQ3zB,GAAG,0BAKnB,OAAO,oCAAGy0B,EAAY,kBAACpF,GAAD,MAAuCthB,M,sHCzO/D,IAAMsoB,GAA0B9rB,IAAOC,IAAV,MA4DhB8rB,GAAmBzrB,gBAvDN,WAAO,IACvBja,EAAMka,cAANla,EACF0+B,EAAUC,eACVgH,EAAoBt5B,aAAaC,QAAQ,qBAAuB,GAChEjR,EAAegR,aAAaC,QAAQ,eACpC+Y,EAAaC,6BAEbsgB,EAAqB,WACzBv5B,aAAa6xB,WAAW,oBACxB7xB,aAAa6xB,WAAW,gBAkC1B,OA/BA3Y,qBAAU,WAER,GAAIogB,GAAqBtqC,IAAiBiB,GAAeE,iBAAkB,CACzE,IAAMgpB,EAAenJ,GAAqB,CACxCC,mBAAoBqpB,IACnBjgB,UAAU,CACX7a,KAAM,SAAC3G,GACL0hC,IACA5kB,GAAac,QAAU5d,EACvBw6B,EAAQx4B,KAAKhH,GAAqB1G,EAAOQ,OAAOO,mBAElDkG,MAAO,SAACA,GACNmmC,IACA,IAAIjjC,EAAM,GAERlD,EAAMG,OAAS7H,EAAasJ,sBAC5B5B,EAAMG,OAAS7H,EAAa8tC,wBAE5B3pB,GAA4BypB,GAC5BhjC,EAAM,IAAIF,GAAwBhD,IAEpC4lB,EAAW1iB,MAGf,OAAO,WACL6iB,EAAaG,kBAIhB,CAAC+E,OAAOob,cAGT,kBAACL,GAAD,KACE,kBAACpc,GAAD,CACE7qB,IAAK,gCACL2W,KAAMnV,EAAE,yCACRL,OAAQ,SAEV,kBAAC2iB,GAAD,UCrCOyjB,GAAqB9rB,gBA7Bb,WACnB,OACE,oCACE,kBAAC,KAAD,KACE,kBAAC,KAAD,CACE+rB,OAAO,EACPC,KAAI,UAAK/mC,GAAqB1G,EAAOQ,OAAOK,cAAc,KAE1D,kBAAC6pC,GAAD,OAEF,kBAAC,KAAD,CACE8C,OAAO,EACPC,KAAM/mC,GACJ1G,EAAOQ,OAAOM,uBACd,IAGF,kBAACosC,GAAD,OAEF,kBAAC,KAAD,CACEM,OAAO,EACPC,KAAM/mC,GAAqB1G,EAAOQ,OAAOO,iBAAiB,IAE1D,kBAAC0wB,GAAD,Y,qBCtBGic,GAAwBrX,wBACnC,IAWWsX,GAAqBtX,wBAChC,IAEWuX,GAA4B,kBAAM/W,qBAAW8W,KAiB7CE,IAXoBxX,wBAC/B,IAU+BA,wBAC/B,KAEWyX,GAA2B,kBAAMjX,qBAAWgX,K,8YCnCzD,IAAME,GAA8B5sB,IAAOC,IAAV,MAMX,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAIvC6lB,GAAoB7sB,IAAOC,IAAV,MACV,SAACC,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAC5B,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,OAAS,UAC9C,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,UAAY,aAEzC,SAAC9I,GAAD,OAAWA,EAAM7C,MAAMY,gBAkBtB6uB,GAAyBxsB,gBAdA,SAACJ,GACrC,OACE,kBAAC0sB,GAAD,KACE,kBAACC,GAAD,CACEpsB,YAAU,qBACVkD,QAASzD,EAAMyD,QACfqF,SAAU9I,EAAM8I,UAEhB,kBAAC+jB,GAAA,EAAD,W,mUCrBR,IAAMC,GAAehtB,IAAOC,IAAV,MAGP,SAACC,GAAD,OAAWA,EAAM7C,MAAMY,gBAgHrBgvB,GAAe3sB,gBAhGJ,WAAO,IACrBja,EAAMka,cAANla,EADoB,EAEJ0kB,mBAAS,IAFL,mBAErB9kB,EAFqB,KAEfinC,EAFe,OAGMniB,oBAAS,GAHf,mBAGrBoiB,EAHqB,KAGVC,EAHU,OAIYriB,oBAAS,GAJrB,mBAIrBsiB,EAJqB,KAIPC,EAJO,KAKtBC,EAAa7X,qBAAW8X,IACtBC,EACNF,EADME,mBAAoBziB,EAC1BuiB,EAD0BviB,aAAc0iB,EACxCH,EADwCG,eAAgBC,EACxDJ,EADwDI,eAN9B,EAS1BhB,KADMiB,EARoB,EAQpBA,6BAA8BC,EARV,EAQUA,uBAsBhCC,IAAW9iB,GAAuC,IAAxBA,EAAangB,OACvC6gB,EAAaC,6BAuCnB,OAtCAC,qBAAU,WACRgiB,EAA6C,IAAhB3nC,EAAK4E,UACjC,CAAC5E,IAEJ2lB,qBAAU,WAER,GADAwhB,EAAaC,GACTA,EAAc,CAChB,IAAMxhB,E7DhBoB,SAACkiB,GAC/B,IAAMt4B,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAI4W,GAAuC/L,GACtDu4B,EAAgB,CAAED,aACxB,OAAO7sC,GAAY2hB,IAAIjY,EAAUojC,G6DYRC,CAAiBhoC,GAAM8lB,UAAU,CACpD7a,KAAM,SAAC3G,GACL0J,GAAoBK,eAAiB/J,EACrC2iC,EAAQ,IACRQ,EAAenjC,EAAKuN,UACpBs1B,GAAa,GACbE,GAAgB,GAChBO,GAAuB,IAEzB/nC,MAAO,SAACA,GAEN,GADAwnC,GAAgB,GACZxnC,aAAiBW,GAA6B,CAChD,IAAMynC,EAA0BpoC,EAAMqoC,8BACN1rC,IAA5ByrC,GACFT,EACE3nC,EAAMC,SAASG,KAAf,MACEgoC,EAAyBtd,YACzB,SAINlF,EAAW5lB,MAIjB,OAAO,WACL+lB,EAAaG,kBAGhB,CAACqhB,IAGF,oCACGF,GAAa,kBAACxkB,GAAD,MACd,kBAACqkB,GAAD,CACEvsB,YAAU,wBACV+F,UAAW2mB,EAAY,WAAa,IAEpC,kBAACpb,GAAD,CACEjsB,MAAOgoC,EACPzzB,KAAM,UACN2X,UAAU,EACVltB,MAAOmB,EACPksB,eAAgB,kCAChB1F,QAAS,WACTC,SAzEmB,SAACC,GAC1B8gB,EAAmB,IADmB,IAE9B3oC,EAAU6nB,EAAGhF,OAAb7iB,MACRooC,EAAQpoC,IAuEFuqB,KAAM,kBAAC,KAAD,QAER,kBAACyd,GAAD,CACEnpB,QAvEwB,WAE9B,GADyB1P,GAAoBm6B,iBAE1Bv6B,QAAO,SAAC4zB,GAAD,OAAaA,EAAQxhC,OAASA,KAAM4E,OAAS,EAGrE,OADA4iC,EAAmBpnC,EAAE,sCACdinC,GAAgB,GAErBK,GACFL,GAAgB,IA+DZtkB,WAAU8kB,GAAkC,IAAhB7nC,EAAK4E,c,yxBCxG3C,IAAMwjC,GAAkBruB,IAAOC,IAAV,MAMfquB,GAAkBtuB,IAAOC,IAAV,MAEC,SAACC,GAAD,OAAWA,EAAM7C,MAAM+C,8BAKvCmuB,GAAsBvuB,IAAOC,IAAV,MACZ,SAACC,GAAD,OAAYA,EAAMytB,eAAiB,EAAI,MAChC,SAACztB,GAAD,OAAYA,EAAMytB,eAAiB,OAAS,UAG1Da,GAAexuB,IAAOC,IAAV,MAKZwuB,GAAczuB,IAAOC,IAAV,MAOXyuB,GAAe1uB,YAAOyuB,GAAPzuB,CAAH,MAULwtB,GAAkBtY,wBAC7B,IAqHWyZ,GAAkBruB,gBAnHd,WAAO,IACdja,EAAMka,cAANla,EAEFuoC,EAAwB,SAAC92B,GAC7B,QAAO+2B,GAA8B/2B,GAAYA,EAASjN,OAAS,GAG/DgkC,EAAuBlsC,GAAeksC,qBAPvB,EAQuB9jB,mBAC1C9W,GAAoB66B,uBATD,mBAQdnB,EARc,KAQEoB,EARF,OAWWhkB,mBAC9B9W,GAAoBm6B,kBAZD,mBAWdt2B,EAXc,KAWJk3B,EAXI,OAcyBjkB,mBAAS,IAdlC,mBAcdkkB,EAdc,KAcGC,EAdH,OAemBnkB,wBACtCtoB,GAhBmB,mBAeduoB,EAfc,KAeAC,EAfA,KAkBfkkB,EAAc9oC,EAAE,2CAlBD,EAmByB0kB,mBAC5C6jB,EAAsB92B,IApBH,mBAmBds3B,EAnBc,KAmBGC,EAnBH,KAsBbxB,EAA2BlB,KAA3BkB,uBAEFyB,EAAsB,SAACxqC,GAC3BoqC,EAAmBpqC,IAOf4mB,EAAaC,6BAEnBC,qBAAU,WACR,GAAIqjB,EAAiB,CACnB,IAAMpjB,E9DlCqC,SAC/CkiB,GAEA,IAAMt4B,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAI6W,GAA4BhM,GACjD,OAAOvU,GAAYuhB,OAAO7X,EAAU,CAAE3E,KAAM8nC,I8D6BnBwB,CACnBN,GACAljB,UAAU,CACV7a,KAAM,SAAC3G,GACL0J,GAAoBK,eAAiB/J,EACrCykC,EAAYzkC,EAAKuN,UACjBo3B,EAAmB,IACnBG,EAAmBT,EAAsBrkC,EAAKuN,WAC9Ci3B,EAAkB96B,GAAoB66B,uBACtCjB,EAAuBtjC,EAAKuN,SAASjN,OAAS,IAEhD/E,MAAO,SAACA,GACN,GAAIA,aAAiBW,GAA6B,CAChD,IAAMynC,EAA0BpoC,EAAMqoC,8BACN1rC,IAA5ByrC,GACFjjB,EACEnlB,EAAMC,SAASG,KAAf,MACEgoC,EAAyBtd,YACzB,SAINlF,EAAW5lB,MAIjB,OAAO,WACL+lB,EAAaG,kBAGhB,CAACijB,IAEJ,IAAMO,EAAc,OAAG13B,QAAH,IAAGA,OAAH,EAAGA,EAAUzN,KAAI,SAACo9B,GACpC,OACE,kBAACD,GAAD,CACE3iC,IAAK4iC,EAAQxhC,KACbwhC,QAASA,EACTG,gBAAiB0H,EACjB3H,aAAa,OAKnB,OACE,kBAAC0G,GAAD,CAAiB5tB,YAAU,kBACzB,kBAAC,GAAD,CACEjF,KAAMnV,EAAE,gDACRsG,KAAK,QAEP,kBAAC2hC,GAAD,KACE,kBAACd,GAAgBhN,SAAjB,CACE17B,MAAO,CACL2oC,mBAAoB,SAAClZ,GAAD,OAClBtJ,EAAgBsJ,IAClBmZ,eAAgB,SAAC+B,GAAD,OA9DD,SAACA,GACxBT,EAAYS,GACZJ,EAAmBT,EAAsBa,IA6D/BC,CAAiBD,IACnB9B,iBACA3iB,iBAGF,kBAACujB,GAAD,CACE9tB,YAAU,kBACVktB,eAAgBA,GAEfyB,GAAmB,kBAACnC,GAAD,OACC,KAExBjiB,GACC,kBAAC0jB,GAAD,CAAcjuB,YAAU,iBAAiBuK,IAEzC2iB,GACA,kBAACc,GAAD,CAAahuB,YAAU,gBAAgB0uB,GAEzC,kBAACX,GAAD,KAAegB,Q,kSCnKvB,IAAMG,GAAe3vB,IAAOC,IAAV,MAMP,SAACC,GAAD,OAAWA,EAAM7C,MAAM2F,mBAoBrBoiB,GAAkB9kB,gBATjB,SAACJ,GACb,OACE,kBAACyvB,GAAD,KACGzvB,EAAMmP,KAAOnP,EAAMmP,KAAO,GAC1BnP,EAAMgI,U,+QCtBN,IAAM0nB,GAAc5vB,IAAOC,IAAV,MACb,SAACC,GAAD,OAAWA,EAAM7C,MAAM2F,mBAmBrB6sB,GAAiBvvB,gBATjB,SAACJ,GACZ,IAAM2P,EAAa3P,EAAM1E,KAAKsR,MAAM,QAAQ7hB,KAAK,SACjD,OACE,kBAAC2kC,GAAD,KACE,0BAAMprB,wBAAyB,CAAEN,OAAQ2L,SChBlCigB,GAAb,WAKE,WAAY3H,EAA+BtkC,GAAiB,yBAAjBA,SAAgB,KAJnDksC,iBAImD,OAHnDC,iCAGmD,OAFnDC,oCAEmD,EACzDhuC,KAAK8tC,YAAc5H,EACnBlmC,KAAK4B,OAASoO,KAA6B2C,sBAAsB/Q,GACjE5B,KAAK+tC,4BACH/tC,KAAKiuC,qCACPjuC,KAAKguC,+BACHhuC,KAAKiuC,mCACHvtC,GAAe8P,oBAZvB,iFAqFwC,IADpC09B,EACmC,uDADfluC,KAAK4B,OAEzB,OAAO5B,KAAK8tC,YAAYj1B,aACpB7Y,KAAK8tC,YAAYj1B,aAAaC,MAC5B,SAACq1B,GAAD,OAAgCA,EAAIvsC,SAAWssC,UAEjD1tC,IA1FR,0CA6FsB4tC,EAAkB5rC,GAEpC,IAAM6rC,EAAUD,EAChB,OAAOpuC,KAAK+tC,4BACR/tC,KAAK+tC,4BAA4BM,QACjC7tC,IAlGR,6CAqGyB4tC,EAAkB5rC,GAEvC,IAAM6rC,EAAUD,EAChB,OAAOpuC,KAAKguC,+BACRhuC,KAAKguC,+BAA+BK,QACpC7tC,IA1GR,kCA6Gc4tC,EAAkB5rC,GAAc,IAAD,EAEnC6rC,EAAUD,EAChB,iBAAOpuC,KAAK8tC,YAAYO,UAAxB,QAAoC,KAhHxC,4BAgBI,OAAOruC,KAAK8tC,YAAYnK,QAhB5B,kCAoBI,OACE3jC,KAAKsuC,oBAAoB,cAAetuC,OACxCA,KAAKuuC,uBAAuB,cAAevuC,OAC3CA,KAAKwuC,YAAY,cAAexuC,QAvBtC,yBA4BI,OAAOA,KAAK8tC,YAAYt6B,KA5B5B,2BAgCI,OACExT,KAAKsuC,oBAAoB,OAAQtuC,OACjCA,KAAKuuC,uBAAuB,OAAQvuC,OACpCA,KAAKwuC,YAAY,OAAQxuC,QAnC/B,4BAwCI,OAAOA,KAAK8tC,YAAY11B,OAxC5B,oCA4CI,OAAOpY,KAAK8tC,YAAYrH,iBAAkB,IA5C9C,sCAgDI,GAAKzmC,KAAKyuC,cAAV,CAGA,IACIC,EADEC,EAAc3uC,KAAK8tC,YAAY76B,WAGrC,GAAI07B,GAAeA,EAAYpL,MAAO,CACpC,IAAMlvB,EAAmBvD,GACvB1V,EAAKyU,SACL8+B,EAAYpL,MACZoL,EAAYx9B,UAGd,OAAQnR,KAAK8tC,YAAYtH,QACvB,IAAK,OACHkI,EAAkB,QAClB,MACF,IAAK,QACHA,EAAkB,SAClB,MACF,IAAK,QACHA,EAAkB,SAUtB,OANyBtzC,EAAKgJ,EAAL,oBACVsqC,EADU,6BAC0BC,EAAYz7B,cAC7D,CACE07B,mBAAoBv6B,UA5E9B,K,uhBCMA,IAAMw6B,GAAa9wB,IAAOC,IAAV,MAOV8wB,GAAkB/wB,IAAOC,IAAV,MACC,SAACC,GAAD,OAAWA,EAAM7C,MAAM+G,kCAMvCmX,GAASvb,IAAOC,IAAV,MAID,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAiCrB2nB,GAAuB1wB,gBA5BvB,SAACJ,GAAuC,IAC3C7iB,EAASkjB,cAATljB,KACF4zC,EAAoB,IAAInB,GAC5B5vB,EAAMioB,WACN9qC,EAAKyU,UAEP,OACE,kBAACi/B,GAAD,CAAiBtwB,YAAU,oBACzB,kBAAC,GAAD,CAAiByH,MAAO+oB,EAAkB52B,KAAMgV,KAAM,kBAAC,KAAD,QACrD4hB,EAAkBP,eACjB,kBAAC,GAAD,CAAQjwB,YAAU,+BACfwwB,EAAkB15B,iBAGvB,kBAACs4B,GAAD,CACEpvB,YAAU,oBACVjF,KAAMy1B,EAAkBvJ,cAE1B,kBAACoJ,GAAD,CAAYrwB,YAAU,qBACpB,kBAACmmB,GAAD,CACE1e,MAAO+oB,EAAkB52B,KACzBmB,KAAMy1B,EAAkBvJ,mB,8hBC3ClC,IAAMwJ,GAAoBlxB,IAAOC,IAAV,MAOD,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAChC,SAAC9G,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAG1CuS,GAASvb,IAAOC,IAAV,MAID,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAK5B8nB,GAAkBnxB,IAAOC,IAAV,MA8BRmxB,GAAkB9wB,gBA1BhB,SAACJ,GAAkC,IAAD,IAC/C,OACE,kBAACgxB,GAAD,CACE1qB,UAAW,UAAAtG,EAAM8I,gBAAN,SAA0B,gBAAavmB,EAClDumB,SAAQ,UAAE9I,EAAM8I,gBAAR,SACRvI,YAAA,6BAAiCP,EAAM+wB,kBAAkBx7B,KAExDyK,EAAM+wB,kBAAkBrL,OAAS,kBAACuL,GAAD,MAClC,kBAAC,GAAD,CACE1wB,YAAU,mBACVyH,MAAOhI,EAAM+wB,kBAAkB52B,OAEhC6F,EAAM+wB,kBAAkBP,eACvB,kBAAC,GAAD,CAAQjwB,YAAU,+BACfP,EAAM+wB,kBAAkB15B,iBAG7B,kBAACs4B,GAAD,CACEpvB,YAAU,yBACVjF,KAAM0E,EAAM+wB,kBAAkBvJ,cAE/BxnB,EAAMlU,a,yOChCb,IAAMqlC,GAAiBrxB,IAAOC,IAAV,MAoFPqxB,GAAuBhxB,gBA3EvB,SAACJ,GAAuC,IAAD,IACd6K,oBAClC,UAAArf,GAAeyD,qBAAf,eAA8BsG,MAAOyK,EAAMxQ,MAAM+F,IAFD,mBAC3ChJ,EAD2C,KAC/B8kC,EAD+B,OAItBxmB,mBAAkC,MAJZ,mBAI3CtH,EAJ2C,KAInC+tB,EAJmC,KAK1Cn0C,EAASkjB,cAATljB,KAEF4zC,EAAoB,IAAInB,GAAkB5vB,EAAMxQ,MAAOrS,EAAKyU,UAClE8Z,qBAAU,WACR,IAAMC,EAAengB,GAAegD,qBAAqBqd,WACvD,SAAC5c,GACCoiC,GAA2B,OAAbpiC,QAAa,IAAbA,OAAA,EAAAA,EAAesG,MAAOyK,EAAMxQ,MAAM+F,OAGpD,OAAO,WACLoW,EAAaG,kBAIjBJ,qBAAU,WAAO,IAAD,EAEV6lB,EACJ,OAAQhuB,GACN,IAAK,MACHguB,EpEqBgC,SAACC,GACvC,IAAMj8B,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAI8W,GAA+BjM,GACpD,OAAOvU,GAAY2hB,IAAIjY,EAAU,CAAE8mC,aoExBhBC,CAAyBzxB,EAAMxQ,MAAM+F,IAClD,MACF,IAAK,SACHg8B,EpEUmC,SACzCC,GAEA,IAAMj8B,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAI+W,GAAkClM,GACvD,OAAOvU,GAAYuhB,OAAO7X,EAAU,CAAE8mC,aoEfnBE,CAA4B1xB,EAAMxQ,MAAM+F,IAkBzD,OAfU,QAAV,EAAAg8B,SAAA,SAAY1lB,UAAU,CACpB7a,KAAM,SAAC3G,GACLkZ,IAAW9kB,EAAiB8R,IACxB/E,GAAemmC,SAAS3xB,EAAMxQ,OAC9BhE,GAAeomC,cACnBN,EAAU,MACVv9B,GAAoBK,eAAiB/J,EACrC2V,EAAM6xB,iBAAgB,IAExBjsC,MAAO,SAACA,GACN0rC,EAAU,MACVtxB,EAAM8xB,gBAAgBlsC,EAAMmsC,cAC5B/xB,EAAM6xB,iBAAgB,MAGnB,gBAzBHlmB,KA4BH,CAACpI,IASJ,OACE,kBAAC2tB,GAAD,CAAiBH,kBAAmBA,GAClC,kBAACI,GAAD,KACE,kBAACzK,GAAD,CACE1e,MAAO+oB,EAAkB52B,KACzBmB,KAAMy1B,EAAkBvJ,cAE1B,kBAAC,KAAD,CACEjnB,YAAA,sBAA0BP,EAAMxQ,MAAM+F,IACtCkjB,QAASlsB,EACTigB,SAlBqB,SAACC,GAC5BzM,EAAM6xB,iBAAgB,GACtB7xB,EAAM8xB,gBAAgB,MACtBrlB,EAAGhF,OAAOgR,QACN6Y,EAAU7yC,EAAiB8R,KAC3B+gC,EAAU7yC,EAAiBuzC,SAczBxpB,KAAK,e,yaChGR,IAAMypB,GAAiBnyB,IAAOC,IAAV,MAOL,SAACC,GAAD,OAAWA,EAAM7C,MAAM+C,8BAmBhCgyB,GAAmB9xB,gBAJhB,SAACJ,GACf,OAAO,kBAACiyB,GAAD,KAAiBjyB,EAAMlU,a,wZCfhC,IAAMuvB,GAASvb,IAAOC,IAAV,MAID,SAACC,GAAD,OAAWA,EAAM7C,MAAMgM,iBAK5BgpB,GAAwBryB,IAAOC,IAAV,MAiCdqyB,GAAiBhyB,gBAvBb,SAACJ,GAAsB,IAAD,MACjBK,cAAZla,EAD6B,EAC7BA,EAAGhJ,EAD0B,EAC1BA,KACLk1C,EAAoB,UAAGryB,EAAMqyB,4BAAT,QAAiC,qCACrDtB,EAAoB,IAAInB,GAAkB5vB,EAAMjZ,KAAM5J,EAAKyU,UACjE,OACE,kBAACs/B,GAAD,CACEpoB,WAAU,UAAE9I,EAAMsyB,mBAAR,UACVvB,kBAAmBA,GAEnB,kBAACoB,GAAD,KACE,kBAACzL,GAAD,CACE1e,MAAO+oB,EAAkB52B,KACzBmB,KAAMy1B,EAAkBvJ,cAEzBxnB,EAAMuyB,YACNvyB,EAAMwyB,aACL,kBAAC,GAAD,KAASrsC,EAAE,GAAD,OAAIksC,U,0iBCpCxB,IAAMI,GAAwB3yB,IAAOC,IAAV,MAChB,SAACC,GAAD,OAAWA,EAAM7C,MAAM8C,aAsBrByyB,GAAmB5yB,IAAOC,IAAV,MACjB,SAACC,GAAD,OAAYA,EAAM8I,SAAW,UAAY,aACxC,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAC5B,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,OAAS,aAqF7C6pB,GAAsBvyB,gBAlFtB,SAACJ,GAAsC,IAAD,IAEX6K,oBACpC,UAAA9W,GAAoB7E,cAAc2L,MAChC,SAAC+3B,GAAD,OAAcA,EAASz6B,gBAAkB6H,EAAMjZ,KAAKwO,GAAGmb,qBADzD,eAEG/Y,WAAY,GALgC,mBAE1Ck7B,EAF0C,KAE7BC,EAF6B,OAOCjoB,mBAASgoB,EAAc,GAPxB,mBAO1CE,EAP0C,KAOvBC,EAPuB,OAQCnoB,oBAAS,GARV,mBAQ1CooB,EAR0C,KAQvBC,EARuB,OASF3G,KAAvC4G,EATyC,EASzCA,oBAAqBC,EAToB,EASpBA,cAToB,EAUrBvoB,mBAAkC,MAVb,mBAU1CtH,EAV0C,KAUlC+tB,EAVkC,KAqBjD5lB,qBAAU,WATgB,IAAC2nB,EAA6BxjC,EAUtDyhC,EAAU,MAVe+B,EAYvBt/B,GAAoBK,eAAek/B,gBAZiBzjC,EAapDmQ,EAAMjZ,KAAKwO,GAZby9B,EAAqBH,EAAc,GACnCK,EACEn/B,GAAoBw/B,kDACN,OAAdF,QAAc,IAAdA,OAAA,EAAAA,EAAgB1/B,QAAO,SAACi/B,GAAD,OAAcA,EAASr9B,KAAO1F,KAAQlF,QAAS,IACtE,KAUD,CAACoJ,GAAoBK,eAAek/B,gBAAiB9nC,GAAe2D,aAEvEuc,qBAAU,WACJnI,GACF6vB,EAAc7vB,EAAD,eAAYvD,EAAMjZ,KAAKwO,GAAKs9B,MAE1C,CAACtvB,IAmBJ,OACE,kBAAC6uB,GAAD,CACE7xB,YAAA,0BAA8BP,EAAMjZ,KAAKwO,IACzCi9B,aAAcS,EACdZ,qBAAsBt+B,GAAoBwD,eAAiB,uDAAoDhV,EAC/G+vC,YAAaa,EAAoBnzB,EAAMjZ,KAAKwO,IAC5CxO,KAAMiZ,EAAMjZ,KACZwrC,YACE,kBAACE,GAAD,CAAuBlyB,YAAU,gBAC/B,kBAACmyB,GAAD,CACE5pB,UAAWiqB,EACXtvB,QA5Be,WACvB,GAAIovB,EAnCgB,EAmCa,CAC/B,IAAMW,EAAeX,EAAc,EACnC7yB,EAAM6xB,iBAAgB,GAEtBP,EAA2B,IAAjBkC,EAAqB/0C,EAAiBuzC,OAASvzC,EAAiB8R,KAC1EuiC,EAAeU,GACfhoC,GAAeioC,oBAAoBzzB,EAAMjZ,KAAKwO,GAAIi+B,KAsB5CjzB,YAAA,sBAA0BP,EAAMjZ,KAAKwO,KAHvC,KAOA,yBAAKgL,YAAA,uBAA2BP,EAAMjZ,KAAKwO,KAAOs9B,GAClD,kBAACH,GAAD,CACE5pB,UAAWmqB,EACXxvB,QA1Be,WACvB,IAAM+vB,EAAeX,EAAc,EACnC7yB,EAAM6xB,iBAAgB,GACtBP,EAAU7yC,EAAiB8R,KAC3BuiC,EAAeU,GACfhoC,GAAeioC,oBAAoBzzB,EAAMjZ,KAAKwO,GAAIi+B,IAsB1CjzB,YAAA,sBAA0BP,EAAMjZ,KAAKwO,KAHvC,W,8UCxGV,IAAMm+B,GAAqB5zB,IAAOC,IAAV,MAMlB4zB,GAAgB7zB,IAAOC,IAAV,MAGR,SAACC,GAAD,OAAWA,EAAM7C,MAAM8C,aA+CrB2zB,GAAkCxzB,gBAzClB,SAACJ,GAAsC,IAC1D7Z,EAAMka,cAANla,EADyD,EAErC0kB,mBAAkC,MAFG,mBAE1DtH,EAF0D,KAElD+tB,EAFkD,OAI/D/E,KADM4G,EAHyD,EAGzDA,oBAAqBC,EAHoC,EAGpCA,cAAeS,EAHqB,EAGrBA,iBAHqB,EAU7BhpB,oBAAkB,GAVW,mBAU1Dte,EAV0D,KAU9C8kC,EAV8C,KAWjE3lB,qBAAU,WACR2lB,EAAcwC,EAAiB1sC,SAAS6Y,EAAMjZ,KAAKwO,OAClD,CAACs+B,IAEJnoB,qBAAU,WACJnI,GACF6vB,EAAc7vB,EAAD,eAAYvD,EAAMjZ,KAAKwO,QAAKhT,MAE1C,CAACghB,IACJ,IAAMuwB,EAAaX,EAAoBnzB,EAAMjZ,KAAKwO,IAClD,OACE,kBAAC68B,GAAD,CACErrC,KAAMiZ,EAAMjZ,KACZurC,YAAawB,EACbvB,YACE,kBAACmB,GAAD,KACE,kBAACC,GAAD,KAAgBxtC,EAAE,mCAClB,kBAAC,KAAD,CACE2iB,UAAWgrB,EACXvzB,YAAA,qBAAyBP,EAAMjZ,KAAKwO,IACpCkjB,QAASlsB,EACTigB,SA1BM,SAACC,EAASgM,GACxBzY,EAAM6xB,iBAAgB,GACtBP,EAAU7Y,EAAUh6B,EAAiB8R,IAAM9R,EAAiBuzC,SAyBpDxpB,KAAK,gB,sWC1CjB,IAAMurB,GAAYj0B,YAAOmyB,GAAPnyB,CAAH,MAKTk0B,GAAel0B,IAAOC,IAAV,MAqILk0B,GAAkB7zB,gBArHd,SAACJ,GACd,IAAMmT,EAAqBb,GADoB,EAEOzH,mBAAqC,IAF5C,mBAExCsoB,EAFwC,KAEnBe,EAFmB,OAGnBrpB,mBAAkC,MAHf,mBAGxCtH,EAHwC,KAGhC+tB,EAHgC,KAIzC6C,EAAgBjX,sBAA6D36B,GAC3E6xC,Ed5BsC5e,qBAAW6W,Ic4BjD+H,6BALuC,EAMCvpB,mBAAS9W,GAAoB8/B,kBAN9B,mBAMxCA,EANwC,KAMtBQ,EANsB,KAOzC7oB,EAAaC,6BACnBC,qBAAU,WACNwoB,EAAuBngC,GAAoBo/B,uBAC5C,IAEHznB,qBAAU,WACN,IAAIC,OAAyCppB,EACzCgvC,OAA0ChvC,EAC9C,GAAIghB,QAC8BhhB,IAA1B4xC,EAAcrV,QAAuB,CACrC,IAAIwV,EAA+DH,EAAcrV,QAC7EjvB,EAAiB5M,OAAOpC,OAAOwG,KAAKitC,GAAoB,IACxD38B,EAA+B28B,EAAmBzkC,GACtD,OAAQ0T,GACJ,IAAK,MACDguB,EzE6Be,SACrCgD,EACA58B,GAEA,IAAMpC,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAIgX,GAA8BnM,GACnD,YAAgBhT,GAAZoV,EACK3W,GAAY2hB,IAAIjY,EAAU,CAAE6pC,UAAS58B,aAEvC3W,GAAY2hB,IAAIjY,EAAU,CAAE6pC,YyEtCAC,CACT3kC,EACA8H,GAEJ,MACJ,IAAK,SACD45B,EzEmCoB,SAC1CgD,GAEA,IAAMh/B,EAAKxB,GAAoBK,eAAemB,GACxC7K,EAAW,IAAIiX,GAAiCpM,GACtD,OAAOvU,GAAYuhB,OAAO7X,EAAU,CAAE6pC,YyExCHE,CAA6B5kC,GAG9C0hC,IACA5lB,EAAe4lB,EAAW1lB,WACtB,SAACxhB,GACG0J,GAAoBK,eAAiB/J,EACrC+pC,EACIrgC,GAAoB2gC,wBAExBpD,EAAU,MACVqD,IACAN,EAAoBtgC,GAAoB8/B,kBACxC7zB,EAAM6xB,iBAAgB,KAG1BrmB,GACA,WACI4oB,EACIrgC,GAAoB2gC,wBAExB10B,EAAM6xB,iBAAgB,OAQ1C,OAAO,WACClmB,GACAA,EAAaG,iBAGtB,CAACvI,IAEJ,IAIMoxB,EAA2B,WAC7BT,EAAuBngC,GAAoBo/B,sBAEzC36B,EAAkB2a,EAAmB3a,gBAAgBrO,KAAI,SAACpD,GAC5D,OACI,kBAAC4rC,GAAD,CACIhuC,IAAKoC,EAAKwO,GACVxO,KAAMA,EACN8qC,gBAAiB7xB,EAAM6xB,qBAK7Bnf,EACFS,EAAmBT,kBAAkBvoB,KAAI,SAACpD,GACtC,OACI,kBAAC6sC,GAAD,CACIjvC,IAAKoC,EAAKwO,GACVxO,KAAMA,EACN8qC,gBAAiB7xB,EAAM6xB,qBAIvC,OACI,kBAACvF,GAAmBhM,SAApB,CACI17B,MAAO,CACH+vC,2BACAvB,cA/BU,SAAC7vB,EAA0BqxB,GAC7CT,EAAcrV,QAAU8V,EACxBtD,EAAU/tB,IA8BFswB,mBACAV,wBAGJ,yBAAK5yB,YAAU,qBACX,kBAAC,GAAUP,EAAMgI,OACjB,kBAAC+rB,GAAD,KACI,kBAACC,GAAD,KACKx7B,GAEL,kBAACw7B,GAAD,KACKthB,SCjDZmiB,GAAqBz0B,gBA1ElB,SAACJ,GAAqB,IAC5B7Z,EAAMka,cAANla,EACFgtB,EAAqBb,GAFQ,EAIjCa,EAAmB2hB,uBADbriB,EAH2B,EAG3BA,UAAWF,EAHgB,EAGhBA,SAAUC,EAHM,EAGNA,UAHM,EAKH3H,mBAAwB,MALrB,mBAK5BwJ,EAL4B,KAKlB0gB,EALkB,KAM7BC,EAA2B,SAAC/sC,GAAD,OAAqB8sC,EAAY9sC,IAC5D6P,EAAyB/D,GAAoB+D,uBAE7ChE,EAAS2e,EACXU,EAAmBrf,OAAO3J,KAAI,SAACsiB,GAC7B,OAAO,kBAACqkB,GAAD,CAAsBnsC,IAAK8nB,EAAGlX,GAAI0yB,WAAYxb,OAEvD,GAEE5Y,EAAS2e,EACXW,EAAmBtf,OAAO1J,KAAI,SAACqF,GAC7B,IAAMP,EAAa,2BAAQO,GAAR,IAAejD,YAAY,IAC9C,OACE,kBAAC6kC,GAAD,CACEzsC,IAAKsK,EAAcsG,GACnB/F,MAAOP,EACP4iC,gBAAiB7xB,EAAM6xB,gBACvBC,gBAAiBkD,OAIvB,GAEJtpB,qBAAU,WACR,IAAMvqB,EAAesB,GAAeG,kBACpC8qB,GAAqBvsB,GAAcqvB,SAAS,eAC5CvX,KAAW0X,aACV,IAEH,IAAMskB,EAAan9B,EACf,CACEoS,UAAWpS,EACXqS,UAAWhkB,EAAE,uCACbmV,KAAMnV,EAAE,yBACRsG,KAAM,OAER,CACE6O,KAAMnV,EAAE,yBACR+jB,UAAWpS,EACXrL,KAAM,OAGNtL,EAAesB,GAAeG,kBAEpC,OADA8qB,GAAqBvsB,GAAcqvB,SAAS,eAE1C,yBAAKjQ,YAAU,uBACZ8T,GAAY,kBAACsE,GAAD,CAAc/yB,MAAOyuB,EAAUvuB,OAAQ3H,EAAUyH,QAC7D6sB,GACC,yBAAKlS,YAAU,sBACb,kBAAC,GAAD,CAAOjF,KAAMnV,EAAE,4BACd2N,GAGJye,GACC,kBAAC0hB,GAAD,CACEjsB,MAAOitB,EACPpD,gBAAiB7xB,EAAM6xB,kBAG1Brf,GACC,yBAAKjS,YAAU,sBACb,kBAAC,GAAD,CAAOjF,KAAMnV,EAAE,4BACf,kBAAC+rC,GAAD,KAAmBr+B,Q,sNClE7B,IAAMqhC,GAAqBp1B,IAAOC,IAAV,MAIlBo1B,GAA2Br1B,IAAOC,IAAV,MAgGjBq1B,GAAch1B,gBA3FZ,WACb,IAAM+S,EAAqBb,GACrBc,EAAiBD,EAAmBC,iBAFvB,EAGOvI,mBAAcpF,eAAckc,OAHnC,mBAGZ/7B,EAHY,KAGLg8B,EAHK,OAIe/W,oBAAS,GAJxB,mBAIZoiB,EAJY,KAIDC,EAJC,OAKiBriB,oBAAS,GAL1B,mBAKZwqB,EALY,KAKAC,EALA,KAMbC,EAAmBxhC,GAAoBmf,sBAN1B,EAOArI,oBAAUuI,IAAmBmiB,GAAzCC,EAPY,sBAQ6B3qB,oBAAS,GARtC,mBAQZ4qB,EARY,KAQMC,EARN,OASyC7qB,oBAC1D9W,GAAoB+D,wBAChB/D,GAAoB7E,cAAcvE,OAAS,GAX9B,mBASZ+pC,EATY,KASYiB,EATZ,OAejB9qB,oBAAS,GAfQ,mBAcZ+qB,EAdY,KAceC,EAdf,KAiBnBnqB,qBAAU,WACRwhB,GAAa,KACZ,CAAC/Z,IAEJzH,qBAAU,WACR4pB,EAAcM,IAA8BlB,KAC3C,CAACA,EAAwBkB,IAE5B,IAKIE,EAAa,eAGf3iB,EAAmBV,aACnB1e,GAAoB+D,wBACpB/D,GAAoB7E,cAAcvE,OAAS,GAC3CoJ,GAAoB9E,eACpBwmC,KAEAK,EAAa,mBAGf,IAAMxyB,EACJ,kBAAC6xB,GAAD,KACGvvC,GAASA,EAAK,cACb,kBAAC+yB,GAAD,CACE/yB,MAAOA,EAAK,MACZE,OAAQ,QACRya,YAAU,kBAGd,kBAACuS,GAAD,MACA,kBAAC0Z,GAAkBlM,SAAnB,CACE17B,MAAO,CACL8oC,6BAA8B,SAAC5kB,GAAD,OAC5B+sB,EAA6B/sB,IAC/B6kB,uBAAwB,SAACzW,GAAD,OAAawe,EAAoBxe,MAG1Dqe,GAAoB,kBAAC9G,GAAD,OAEvB,kBAACpC,GAAsB/L,SAAvB,CACE17B,MAAO,CACLwvC,6BAA8B,SAAC2B,GAAD,OAC5BJ,EAA0BI,MAG7B3iB,GACC,kBAACyhB,GAAD,CAAoBhD,gBA3CJ,SAAClQ,GACvBuL,EAAavL,GACbC,EAAS,QA4CP,kBAACnY,GAAD,CACEnB,SAAUS,GAAkBW,OAC5BpkB,MAAOD,GAAqB1G,EAAOQ,OAAOK,cAC1CoqB,cAAeksB,EACfhtB,SAAUusB,IAEXG,GACC,kBAAC,KAAD,CAAUhyB,GAAIne,GAAqB1G,EAAOQ,OAAOK,iBAKvD,OACE,kBAAC01C,GAAD,KACG5xB,EACA2pB,EAAY,kBAACxkB,GAAD,MAAa,OC5FnButB,GAAiB51B,gBAlBd,WAAO,IACbjjB,EAASkjB,cAATljB,KACF6c,EAAWyL,eAEXwwB,EAAqBxzC,GAAeyzC,cACxC/4C,EAAKyU,SACLoI,EAAS2L,UAEX,OACE,6BACGswB,EACC,kBAACzmB,GAAD,CAAiBlU,KAAM26B,EAAoB/lB,aAAa,IAExD,OCFOimB,GAfO,SAACn2B,GAAD,OACpB,uBACEkR,KAAK,OACLC,QAAQ,YACRC,MAAM,KACNC,OAAO,KACPC,MAAM,8BAEN,wBAAMC,EAAE,quBACR,wBAAMA,EAAE,kOACR,wBAAMA,EAAE,oOACR,wBAAMA,EAAE,wI,mLCRZ,IAAM6kB,GAAiBt2B,IAAOC,IAAV,MA6BPs2B,GAAYj2B,gBArBA,SAACJ,GACxB,OACE,kBAACo2B,GAAD,KACGp2B,EAAMs2B,MAAMC,eACX,kBAACrnB,GAAD,CAAaC,KAAK,UAAU7G,SAAS,QAErC,GAEDtI,EAAMs2B,MAAMjO,SACX,kBAACnZ,GAAD,CAAaC,KAAK,gBAAgB7G,SAAS,QAE3C,GAEDtI,EAAMs2B,MAAM9F,cACX,kBAACthB,GAAD,CAAaC,KAAK,eAAe7G,SAAS,QAE1C,O,waCxBR,IAAMkuB,GAAY12B,IAAOC,IAAV,MAIJ,SAACC,GAAD,OAAWA,EAAM7C,MAAM8C,aAYV,SAACD,GAAD,OAAWA,EAAM7C,MAAMY,gBAClC,SAACiC,GAAD,OAAWA,EAAM7C,MAAM0H,mBAmBvB4xB,GAAWr2B,gBAfX,SAACJ,GAKZ,OACE,kBAACw2B,GAAD,CACE/yB,QANgB,SAACwM,GACnBjQ,EAAMyD,QAAQzD,EAAMpb,QAMlB0hB,UAAWtG,EAAMzT,WAAa,uBAAyB,aAEtDyT,EAAMs2B,MAAQ,kBAACD,GAAD,CAAWC,MAAOt2B,EAAMs2B,QAAY,GACnD,8BAAOt2B,EAAMpb,WCnCE8xC,G,WAInB,WACE5f,EACA6f,EACAC,GACC,IAAD,gCAPMC,oBAON,OANMC,eAMN,OA0BKC,SAAW,SAACC,GACjB,OAAO,EAAKC,oBAAoBD,GAAavyC,SAAQ,SAACyyC,GACpDA,EAAWN,cA3Bb70C,KAAK80C,eAAiB/f,EACtB/0B,KAAK+0C,UAAY,CACf,CACEH,aAAcA,EACdC,QAASA,I,uDAKJD,EAA6BC,GACtC70C,KAAK+0C,UAAUzqC,KAAK,CAAEsqC,aAAcA,EAAcC,QAASA,M,0CAqBlCI,GACzB,OAAOj1C,KAAKo1C,SAASxjC,QAAO,SAACijC,GAAD,OAC1BA,EAAQD,aAAaxvC,SAAS6vC,Q,6BApBrBI,GACXr1C,KAAK+0C,UAAYM,G,eAIjB,OAAOr1C,KAAK+0C,Y,oCAIZ,OAAO/0C,KAAK80C,mB,KChCVQ,G,4DACGC,YAAsC,G,KAQtCn4B,iBAAmB,SACxBo4B,EACAC,EACAC,GAEA,EAAKH,YAAYjrC,KACf,IAAIqqC,GACFa,EACAC,EACAC,K,KAKCC,mBAAqB,SAAC5gB,GAC3B,EAAKwgB,YAAc,EAAKA,YAAY3jC,QAClC,SAACgkC,GAAD,OAAgBA,EAAWJ,gBAAkBzgB,M,KAI1CigB,SAAW,SAACJ,GACjB,EAAKW,YAAY7yC,SAAQ,SAACkzC,GAAD,OAAgBA,EAAWZ,SAASJ,O,uDAvB7D,OAHK50C,KAAKgL,UACRhL,KAAKgL,QAAU,IAAIsqC,GAEdt1C,KAAKgL,Y,KAPVsqC,GAEGtqC,a,EAgCF,IAAM6qC,GAA+BP,GAA6B70C,MC/BnEq1C,G,iDAEIC,0B,OACAC,kB,OACCC,SAAkB,WACzB,IAAI30C,EAAO,IAAIwT,KAEf,OADAxT,EAAK4T,SAAS,EAAG,EAAG,EAAG,GAChB5T,EAHkB,G,KAMlB40C,OAAiB,a,6DA2BTC,GACfn2C,KAAKo2C,2BAA2BD,GAChCn2C,KAAKq2C,mBAAmBF,GACxBn2C,KAAKs2C,wB,oCAGOh1C,GACZ,OAAOtB,KAAKu2C,YACRv2C,KAAKu2C,YAAYv2C,KAAKw2C,cAAcl1C,IACpCnD,EAAWiQ,W,qCAGFqoC,GACb,OAAOA,EAAIC,KAAK12C,KAAKi2C,UAAY,I,mCAGtBQ,GACX,GAAIz2C,KAAK22C,eAAeF,GAAM,OAAO,EACrC,IAAM1yC,EAAS/D,KAAK42C,UAAUH,GAC9B,OAAe,OAAX1yC,GACG,CAAC7F,EAAU24C,KAAM34C,EAAU44C,QAAQ1xC,SAASrB,K,gCAG3CzC,GACR,OAAOtB,KAAK+2C,oBACR/2C,KAAK+2C,oBAAqB/2C,KAAKw2C,cAAcl1C,IAC7C,O,oCAGgBA,GACpB,OAAOA,EAAKoN,OAAO1O,KAAKk2C,U,iDAIxBC,GAEAn2C,KAAK+2C,oBAAsBj4C,OAAOyU,OAAP,MAAAzU,OAAM,CAC/B,IAD+B,oBAE5Bq3C,EAA2Ba,qBAAqB5uC,KAAI,SAAC6uC,GAAD,sBACpDA,EAAY31C,KAAO21C,EAAYlzC,gB,yCAMpCoyC,GAEAn2C,KAAKu2C,YAAcz3C,OAAOyU,OAAP,MAAAzU,OAAM,CACvB,IADuB,oBAEpBq3C,EAA2Ba,qBAAqB5uC,KAAI,SAAC6uC,GAAD,sBACpDA,EAAY31C,KAAO21C,EAAYC,qB,4CAMpC,GAAKztC,GAAenI,KAApB,CACA,IAAI0vB,EAAevnB,GAAenI,KAC9ByC,EAAS/D,KAAK42C,UAAU5lB,GAC5B,OAAe,OAAXjtB,GAA8B,gBAAXA,EACd0F,GAAe0tC,iBADxB,K,wCA5EAC,GAEAp3C,KAAK+1C,qBAAuBqB,G,eAI5B,OAAOp3C,KAAK+1C,uB,gCAGEsB,GACdr3C,KAAKg2C,aAAeqB,G,eAIpB,OAAOr3C,KAAKg2C,gB,6BAlBZ,OAHKh2C,KAAKgL,UACRhL,KAAKgL,QAAU,IAAI8qC,GAEd91C,KAAKgL,Y,KAhBV8qC,GACW9qC,a,EAoGF8qC,UAAgBr1C,M,i8BCpF/B,IAAM62C,GAAYv5B,IAAOC,IAAV,MAOO,SAACC,GAAD,OAAWA,EAAM7C,MAAMY,gBACxB,SAACiC,GAAD,OAAYA,EAAMs5B,MAAQ,YAAc,UAClC,SAACt5B,GAAD,OAAWA,EAAM7C,MAAMY,gBAIrC,SAACiC,GAAD,OAAWA,EAAM7C,MAAM0H,mBACZ,SAAC7E,GAAD,OAAWA,EAAM7C,MAAMY,gBAClB,SAACiC,GAAD,OAAWA,EAAM7C,MAAM0H,mBAI9C00B,GAAez5B,YAAOu5B,GAAPv5B,CAAH,MAML,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAI9ByrB,GAAe15B,YAAOy5B,GAAPz5B,CAAH,MACK,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAGxC0rB,GAAiB35B,YAAOy5B,GAAPz5B,CAAH,MACE,SAACE,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAGvC2rB,GAAiB55B,YAAOu5B,GAAPv5B,CAAH,MACE,SAACE,GAAD,OAAWA,EAAM7C,MAAMY,gBAoD9B47B,GAjDH,SAAC,GAA4D,IAA1D7zC,EAAyD,EAAzDA,OAAQyG,EAAiD,EAAjDA,WAAYisC,EAAqC,EAArCA,IAC3Bc,GADgE,EAAhCM,gBACxBC,GAAgB7B,UACxB8B,EAAUtB,EAAIuB,OAAOT,EAAO,OAGlC,GAFoBd,EAAIC,KAAKa,GAAS,EAGpC,OAAO,kBAACC,GAAD,CAAcD,OAAO,GAAQd,EAAI/nC,OAAO,MAE/C,OAAQ3K,GACN,KAAK7F,EAAUuU,QACb,OACE,kBAAC6kC,GAAD,CACE94B,YAAU,gBACV+4B,MAAOQ,EACPxzB,UAAW/Z,EAAa,aAAe,IAEtCisC,EAAI/nC,OAAO,KACZ,kBAACye,GAAD,CAAaC,KAAK,UAAU7G,SAAS,WAI3C,KAAKroB,EAAU24C,KACb,OAAO,kBAACY,GAAD,CAAcF,MAAOQ,GAAUtB,EAAI/nC,OAAO,MAEnD,KAAKxQ,EAAU44C,OACb,OACE,kBAACY,GAAD,CAAgBH,MAAOQ,GAAUtB,EAAI/nC,OAAO,MAGhD,KAAKxQ,EAAU+5C,UACb,OACE,kBAACX,GAAD,CACEC,MAAOQ,EACPxzB,UAAW/Z,EAAa,aAAe,GACvCgU,YAAU,iBAETi4B,EAAI/nC,OAAO,MAIlB,QACE,OACE,kBAACipC,GAAD,CAAgBJ,MAAOQ,EAASv5B,YAAU,mBACvCi4B,EAAI/nC,OAAO,Q,kQC1ExB,IAAMwpC,GAAYn6B,YAAOo6B,KAAPp6B,CAAH,MAMTq6B,GAAar6B,YAAOs6B,KAAPt6B,CAAH,MA+DDM,mBAzD0B,SACvCJ,GACI,IAAD,EACiBK,cAAZla,EADL,EACKA,EAAGhJ,EADR,EACQA,KADR,EAE2C0tB,mBAAS,MAFpD,mBAEInL,EAFJ,KAEqB2T,EAFrB,KAGH3H,qBAAU,WACR2H,EAAmBthB,KAA6B2N,qBAC/C,CAACviB,EAAKyU,WAyBT,OACE,kBAAC,iCAAD,CACEyoC,aAAcr6B,EAAMq6B,aACpBC,SAAS,EACTC,cAAe,SAACD,GAAD,OAAaA,GAC5Bj3C,KAAM2c,EAAM3S,aACZmtC,eAAgBx6B,EAAMw6B,eACtBC,QAAS,kBAACN,GAAD,CAAY55B,YAAU,qBAC/Bm6B,QAAS,kBAACT,GAAD,CAAW15B,YAAU,qBAC9Bo6B,eAAgB,EAChBC,oBAAqB,kBAAMpvC,GAAe6B,cAC1CwtC,kBAxBsB,SAACC,GACzB,OACE,kBAAC,GAAD,CACEtC,IAAKsC,EACLh1C,OAAQ+zC,GAAgBlB,UAAUmC,IAAgB76C,EAAUuyC,YAC5DjmC,WACEyT,EAAM+S,cAAgB+nB,EAAYf,OAAO/5B,EAAM+S,aAAc,OAE/D6mB,gBAAiB55B,EAAM45B,mBAiBzBmB,aA7BoB,SAACvC,GACvB,OAAOqB,GAAgBkB,aAAavC,IA6BlCwC,mBApCuB,SAAC,GAAkC,IAAhCC,EAA+B,EAA/BA,MAC5B,OAAO9nC,GACL5P,KAAO03C,GAAOt3C,OAAO+b,GAAiBjP,OAAO,eAmC7CyqC,wBAAyB,SAAC1C,GAAD,OAASrlC,GAAWhN,EAAEqyC,EAAI9lC,iBACnDyoC,iBAAkBn7B,EAAMo7B,YACxBC,iBAAkBr7B,EAAMs7B,YACxBC,iBAAkBv7B,EAAMw7B,aACxBC,iBAAkBz7B,EAAM07B,aACxBC,4BAA0B,EAC1BC,QAAS,QCpBAx7B,mBAjEK,WAClB,IAAMw5B,EACiC,OAArCn3C,GAAeqb,mBACsB,OAArCrb,GAAeqb,kBACXva,OAASgN,IAAI,EAAG,SAChBhN,KAAOd,GAAeqb,mBALJ,EAM4B+M,mBAAS,GANrC,mBAMjBza,EANiB,KAMGyrC,EANH,OAOIhxB,mBAASrf,GAAenI,MAA3Cy4C,EAPe,oBAQlBC,EAAqB7e,iBAAmBh9B,EAAWiQ,UAEzDub,qBAAU,WACR,GAAI,IAAMtb,EAGV,OAFA5E,GAAewwC,oBAAoB5rC,GACnCwnC,GAA6Bb,SAASkF,GAAiBC,eAChD,eACN,CAAC9rC,IAiCJ,OACE,yBAAKmQ,YAAU,yCACb,kBAAC,GAAD,CACE85B,aA1Be,SAAC7pC,GACpBhF,GAAe2wC,WAAW3rC,GAC1BsrC,EAAgBtwC,GAAenI,MAC/Bu0C,GAA6Bb,SAASkF,GAAiBG,cACvDL,EAAmBjd,QAAU+a,GAAgBwC,cAAc7rC,IAuBvDkrC,aAXFlwC,GAAe6B,aACZiD,QACAgsC,MAAM,SACN7D,KAAKmB,IAAoB,EAS1B4B,aAlBFhwC,GAAe6B,aAAaiD,QAAQmoC,KAAKoB,GAAgB7B,UAAY,EAmBnEwC,eAAgB,EAChBc,YAtCc,WAClBO,EAAsB,IAsClBT,YAnCc,WAClBS,GAAuB,IAmCnB9oB,aAAcvnB,GAAenI,KAC7Bu2C,gBAAiBA,EACjBvsC,aAAc7B,GAAe6B,mBChE/B9C,GAAU5L,EAAOE,WACV09C,GAAb,kDACE,WACE7yC,GAGC,IAFDtK,EAEA,uDAFemL,GACfE,EACA,8EACMf,EAAUtK,EAAMqL,GAN1B,2DASwBA,GACpB,IACQtJ,EADqBa,GAAkBiD,uBACDC,YAAtC/D,aACJA,IACmBsJ,EAAYN,KAC/B,SAACM,GAAD,OAAiBA,EAAYI,kBAEX1D,SAAS,kBAC3BsD,EAAY4B,KAAK,CACfxB,eAAgB,gBAChBC,gBAAiB3J,KAIvBY,KAAKka,eAAexR,OAvBxB,GAA8CD,ICJjCgyC,GAAb,kDACE,aAAe,uCACP,wBAFV,UAAiDD,I,2ICQjD,IAAME,GAAgB38B,IAAOC,IAAV,MA6BJK,mBAvBoB,WACjC,IAAMoL,EAAaC,6BAenB,OAdAC,qBAAU,WACR,IAAMC,ECVR,WACE,IAAMjhB,EAAW,IAAI8xC,GACfE,EAAYlxC,GAAe6B,aAAaiD,QAAQhD,QAAQ,SAASmD,OAAO,cACxEvN,GAAWsI,GAAeC,OAASD,GAAeM,UAAU4kB,WAC5Dvf,EAAiB3F,GAAewD,OAChCoC,EAAe5F,GAAe8D,KAE9B7E,EAAc,CAClB,CACEI,eAAgB,aAChBC,gBAAiB4xC,GAEnB,CACE7xC,eAAgB,UAChBC,gBAAiB5H,IAmBrB,OAfIiO,GAAqC,QAAnBA,GACpB1G,EAAY4B,KAAK,CACfxB,eAAgB,SAChBC,gBAAiBqG,IAIjBC,GAAiC,QAAjBA,GAClB3G,EAAY4B,KAAK,CACfxB,eAAgB,UAChBC,gBAAiBsG,IAIrB1G,EAASiyC,eAAelyC,GACjBH,KAAiB9H,IAAIkI,GDvBPkyC,GAAyB/wB,WAC5C,SAACqsB,GACC2B,GAAgBgD,iBAAiB3E,GACjCN,GAA6Bb,SAASkF,GAAiBa,cAEzDtxB,GAGF,OAAO,WACLG,EAAaG,iBAEd,CAACN,IAGF,kBAACixB,GAAD,KACE,kBAACh0B,GAAD,U,0OEtBN,IAUYwzB,GAVNc,GAAkBj9B,IAAOC,IAAV,MAMD,SAACC,GAAD,OAAYA,EAAM8I,SAAW,OAAS,UAC7C,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,GAAM,M,SAGpCmzB,K,gBAAAA,E,6BAAAA,E,+BAAAA,E,gBAAAA,E,YAAAA,E,wBAAAA,E,aAAAA,Q,KAcZ,IAoEae,GAAiB58B,gBApEb,SAACJ,GAA0B,IAAD,IACG6K,mBAASrf,GAAeC,QAD3B,mBAClCmB,EADkC,KAClBqwC,EADkB,OAEPpyB,mBAAQ,UAAC7K,EAAMk9B,iBAAP,UAFD,mBAElCA,EAFkC,KAEvBC,EAFuB,KAGnCv3C,EAAQs3B,iBACZzX,eAAckc,OAGhBjW,qBAAU,WAkBR,OAjBAksB,GAA6Bz4B,iBAC3B,WACA,CACE88B,GAAiBC,cACjBD,GAAiBmB,OACjBnB,GAAiBoB,KACjBpB,GAAiBqB,SAEnB,WACE13C,EAAMk5B,QAAU,KAChBme,EAAkBzxC,GAAeC,QAC7BD,GAAeC,OAAS,GAC1B0xC,GAAa,MAKZ,WACLvF,GAA6BF,mBAAmB,eAEjD,IAEHhsB,qBAAU,WASR,OARAksB,GAA6Bz4B,iBAC3B,uBACA,CAAC88B,GAAiBa,aAClB,WACEK,GAAa,MAIV,WACLvF,GAA6BF,mBAAmB,2BAEjD,IAaH,OACE,kBAACqF,GAAD,CACEx8B,YAAU,kBACVuI,SAA6B,IAAnBlc,GAETswC,EACC,kBAAC,GAAD,CAA4B38B,YAAU,iCAfxC,kBAACw8B,GAAD,CACEx8B,YAAU,mBACVuI,SAA6B,IAAnBlc,GAEV,kBAAC,GAAD,CAAa2T,YAAU,sB,itCC1D/B,IAAMg9B,GAAyBz9B,IAAOC,IAAV,MAEZ,SAACC,GAAD,OAAYA,EAAMw9B,WAAa,MAAQ,MAGjDC,GAAa39B,IAAOC,IAAV,MAEV29B,GAAa59B,IAAOC,IAAV,MA+BJ,SAACC,GAAD,OAAWA,EAAM7C,MAAMY,gBAI7B4/B,GAAoB79B,IAAOC,IAAV,MAED,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAChC,SAAC9G,GAAD,OAAWA,EAAM7C,MAAMkR,iBAU9BuvB,GAAa99B,IAAO+C,EAAV,MA6KHg7B,GAAkBz9B,gBAvKhB,SAACJ,GAA4B,IAClC7Z,EAAMka,cAANla,EACF23C,OACkBv7C,IAAtByd,EAAM89B,aAAmC99B,EAAM89B,YAC3CN,EAA2B,YAAdx9B,EAAMvT,KAJgB,EAKvBoe,mBAASkzB,GAAsBC,wBAA1Cp0C,EALkC,sBAMPihB,oBAAS,GANF,mBAMlCozB,EANkC,KAMvBC,EANuB,OAOlBrzB,mBAASpoB,GAAeG,mBAAxCzB,EAPkC,sBAQO0pB,oBAAS,GARhB,mBAQlCszB,EARkC,KAQhBC,EARgB,OASHvzB,mBAAS,GATN,mBASlCwzB,EATkC,KASrBC,EATqB,OAUGzzB,mBAC1C2yB,EAAahyC,GAAeM,SAAWN,GAAeC,QAXf,mBAUlCmB,EAVkC,KAUlBqwC,EAVkB,KAczCvvB,GAAqBvsB,GAAcqvB,SAAS,MAAO,CACjD+tB,WAAYT,IAEd7kC,KAAW0X,WAEXjF,qBAAU,WAUR,OATAksB,GAA6Bz4B,iBAC3B,mBACA,CAAC88B,GAAiBqB,SAClB,WAEML,EADJO,EACsBhyC,GAAeM,SACfN,GAAeC,WAGlC,WACLmsC,GAA6BF,mBAAmB,uBAEjD,IAEHhsB,qBAAU,WACR,GAAI2yB,EAAc,EAAG,CACnB,IAAMG,EAAgBC,YAAW,WAC/BC,EAAoBL,KACnB,KACH,OAAO,kBAAMM,aAAaH,OAE3B,CAACH,IAEJ,IAAMK,EAAsB,SAAC95C,GAC3Bq4C,EAAkBh6C,OAAO2B,IACrB44C,GACFhyC,GAAeM,SAAW7I,OAAO2B,GACjC8J,GAAuBkwC,uCAEvBpzC,GAAeC,OAASxI,OAAO2B,GAEjCgzC,GAA6Bb,SAASkF,GAAiBqB,SAmBnDuB,EAAkB,SAACj6C,GACvB85C,EAAoB95C,GACpBw5C,GAAoB,IAGhB/6B,EAAc,WACd46B,GAAaI,EAAc,GAC7BK,EAAoBL,GACpBD,GAAoB,KAEpBE,EAAe,GACfI,EAAoB,IAEtBR,GAAa,SAACD,GAAD,OAAgBA,MAGzBa,EAAsBb,EAC1B,kBAACrR,GAAD,CACEnpB,QAASJ,EACTyF,WAAYu1B,EAAc,KAG5B,kBAAC,KAAD,CAAK56B,QAASJ,EAAa9C,YAAU,sBAoBjCw+B,EACJ,kBAACnB,GAAD,CAAYn6B,QAlBc,WAC1Bw5B,EAAkB,GAClBzxC,GAAeM,SAAW,EAC1B8rC,GAA6Bb,SAASkF,GAAiBqB,QACvDc,GAAqBD,IAcqB59B,YAAU,gBACjDpa,EAAE,gBAIP,OACE,kBAACo3C,GAAD,CACEh9B,YAAA,oBAAwBP,EAAMvT,MAC9B+wC,WAAYA,GAEZ,kBAAC3rB,GAAD,CACEjsB,OAAO,EACPhB,MAAO8J,GAAuBqlB,0BAC5BnnB,EACAoT,EAAMvT,MAERwlB,eAAgBvjB,GAAuBswC,4BACrCh/B,EAAMvT,MAERynB,WAAY,GACZ3H,QAAS,WACTC,SAAUkyB,EACVj7B,QAjFwB,WAC5B26B,GAAqBD,GACrBD,GAAa,IAgFT/uB,KAAMquB,EAAa,kBAAC,GAAD,MAAoB,kBAAC,GAAD,QAEzC,oCACGW,GACC,kBAACR,GAAD,CAAmBp9B,YAAU,uBAC1Bi9B,GAAc5wC,EAAiB,GAAKmyC,EACrC,kBAACtB,GAAD,CAAYl9B,YAAU,eACnB3W,EACEiI,MAAM,EAAG,GACT1H,KAAI,SAACysB,GAAD,OAtFE,SAACA,GACpB,OACE,kBAAC6f,GAAD,CACE9xC,IAAKiyB,EAAOhyB,MACZA,MAAOgyB,EAAOhyB,MACd2H,WAAYtJ,OAAO2zB,EAAOhyB,SAAWgI,EACrC6W,QAASo7B,IAgFgCzoB,CAAaQ,OAElD,kBAAC8mB,GAAD,KACGO,GACC,kBAACvzB,GAAA,EAAD,CACEu0B,WAAS,EACTxyC,KAAK,SACL8I,GAAG,cACHgL,YAAU,cACVgM,QAAQ,WACRC,SArDU,SAAC0yB,GACzBZ,EAAer7C,OAAOi8C,EAAEz3B,OAAO7iB,SAqDjBu6C,UAlDM,SAACD,GACP,UAAVA,EAAEv6C,KACJ0e,OAmDSy7B,S,uEChPf,ICJYM,GAKAt5C,MDDNu5C,GAAsBv/B,IAAOC,IAAV,MA6BZu/B,GAAel/B,gBA3BhB,WAAO,IAAD,EACcyK,mBAASrf,GAAeC,QAA7CwxC,EADO,oBAEV9wC,EAA4B1J,GAAe0J,0BAejD,OAbAuf,qBAAU,WAQR,OAPAksB,GAA6Bz4B,iBAC3B,MACA,CAAC88B,GAAiBqB,SAClB,WACEL,EAAkBzxC,GAAeC,WAG9B,WACLmsC,GAA6BF,mBAAmB,UAEjD,IAGD,kBAAC2H,GAAD,CAAqB9+B,YAAU,gBAAgBhL,GAAG,iBAChD,kBAACsoC,GAAD,CACEpxC,KAAMN,EAA4B,SAAW,YAE9CA,GAA6B,kBAAC0xC,GAAD,CAAiBpxC,KAAK,iB,85BC5B9C2yC,K,gBAAAA,E,eAAAA,Q,MAKAt5C,W,yBAAAA,G,wBAaZ,IAAMy5C,GAAgBz/B,IAAOC,IAAV,MAKby/B,GAAa1/B,IAAOC,IAAV,MAMV0/B,GAAc3/B,IAAOC,IAAV,MAGN,SAACC,GAAD,OAAWA,EAAM7C,MAAMyK,iBAI5B83B,GAAe5/B,IAAOC,IAAV,MASP,SAACC,GAAD,OAAWA,EAAM7C,MAAM4Q,oBACZ,SAAC/N,GAAD,OAAWA,EAAM7C,MAAMY,gBAGpB,SAACiC,GAAD,OAAWA,EAAM7C,MAAM4Q,oBAIxB,SAAC/N,GAAD,OAAWA,EAAM7C,MAAM4Q,oBASvB,SAAC/N,GAAD,OAAWA,EAAM7C,MAAMY,gBAqBlC4hC,GAAqBv/B,gBAjBrB,SAACJ,GACZ,OACE,kBAACu/B,GAAD,KACE,kBAACC,GAAD,KACE,kBAACE,GAAD,CACEp5B,UAAS,UAAKtG,EAAM4/B,YAAX,YAA0B5/B,EAAMla,OAAhC,oBAGRka,EAAMmP,MACL,kBAACD,GAAD,CAAaC,KAAMnP,EAAMmP,KAAM7G,SAAUtI,EAAMsI,YAGnD,kBAACm3B,GAAD,KAAcz/B,EAAM6/B,kB,2bC1E5B,IAAMC,GAAchgC,IAAOC,IAAV,MAQK,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBACvB,SAAC9G,GAAD,OAAWA,EAAM7C,MAAM+G,kCAIvC67B,GAAmBjgC,IAAOC,IAAV,MAqCTigC,GAAiB5/B,gBA/Bf,WAAO,IACZja,EAAMka,cAANla,EACR,OACE,kBAAC25C,GAAD,KACE,kBAACC,GAAD,CAAkBx/B,YAAU,eAC1B,kBAACo/B,GAAD,CACEE,YAAa15C,EAAE,uCAEjB,kBAACw5C,GAAD,CACExwB,KAAM,UACN7G,SAAU,QACVu3B,YAAa15C,EAAE,qCAEjB,kBAACw5C,GAAD,CACEE,YAAa15C,EAAE,mCACfL,OAAQ,gBAEV,kBAAC65C,GAAD,CACEC,YAAaR,GAAaa,OAC1BJ,YAAa15C,EAAE,gCACfL,OAAQ,aAEV,kBAAC65C,GAAD,CACEC,YAAaR,GAAac,MAC1BL,YAAa15C,EAAE,kCACfL,OAAQ,kB,0FCpClB,IAAMi3C,GAAkBj9B,IAAOC,IAAV,MA6DRogC,GAAoB//B,gBAzDhB,WAAO,IACdjjB,EAASkjB,cAATljB,KADa,EAEmB0tB,mBAASrf,GAAenI,MAF3C,mBAEd0vB,EAFc,KAEA+oB,EAFA,OAGyBjxB,mBAAS,MAHlC,mBAGdnL,EAHc,KAGG2T,EAHH,KAIfyJ,EAAyBr6B,GAAeq6B,uBACxCsjB,EACJ39C,GAAe29C,kBAAoBtjB,EA6BrC,OA3BApR,qBAAU,WACR2H,EAAmBthB,KAA6B2N,qBAC/C,CAACviB,EAAKyU,WAET8Z,qBAAU,WAkBR,OAjBAksB,GAA6Bz4B,iBAC3B,qBACA,CAAC88B,GAAiBG,eAClB,WACE,IAAMt2C,EACJ+zC,GAAgBlB,UAAUntC,GAAenI,OACzCpD,EAAUuyC,YACR1sC,IAAW7F,EAAU+5C,WAAal0C,IAAW7F,EAAUuU,QACzDsnC,EAAgBtwC,GAAenI,OAE/By4C,EAAgB,MAChBtwC,GAAe1H,KAAO,GACtB8zC,GAA6Bb,SAASkF,GAAiBoE,UAKtD,WACLzI,GAA6BF,mBAAmB,yBAEjD,IAGD,kBAAC,GAAD,CAAiBn3B,YAAU,iBAAiBhL,GAAG,kBAC7C,kBAACsc,GAAD,CACEjsB,OAAO,EACPhB,MACE3B,OAAO8vB,GAAgB,EACnB5f,GACE5P,KAAOwvB,GAAcpvB,OAAO+b,GAAiBjP,OAAO,YAEtD,GAENwhB,eAAgB,0BAChBiC,WAAY,GACZ3H,QAAS,WACT4C,KAAM,kBAAC,KAAD,MACNsC,WAAW,IAEb,kBAACurB,GAAD,OACEoD,GAAoB,kBAACJ,GAAD,U,uPC1DrB,IAAMM,GAAmBxgC,IAAOC,IAAV,MAKhBwgC,GAAmBzgC,IAAOC,IAAV,MAsDhBygC,GAAcpgC,gBAhDd,SAACJ,GACEK,cAANla,EADuB,IAAD,EAEU0kB,mBAASrf,GAAe1H,MAFlC,mBAEvBkvB,EAFuB,KAETytB,EAFS,KAIxBC,EAAoB,SAAC97C,GACzB67C,EAAgB77C,GAChB4G,GAAe1H,KAAOc,EACtBgzC,GAA6Bb,SAASkF,GAAiBoE,OAGzD30B,qBAAU,WASR,OARAksB,GAA6Bz4B,iBAC3B,iBACA,CAAC88B,GAAiBoE,OAClB,WACEI,EAAgBj1C,GAAe1H,SAI5B,WACL8zC,GAA6BF,mBAAmB,qBAEjD,IAEH,IAAMiJ,EAAY3gC,EAAM4gC,iBAAiBz2C,KAAI,SAAC02C,GAAqB,IAAD,MAChE,OACE,kBAACpK,GAAD,CACEH,MAAO,CACLC,eAAc,UAAEsK,EAASvK,aAAX,aAAE,EAAgBC,eAChClO,SAAQ,UAAEwY,EAASvK,aAAX,aAAE,EAAgBjO,SAC1BmI,cAAa,UAAEqQ,EAASvK,aAAX,aAAE,EAAgB9F,eAEjC5rC,MAAOi8C,EAASj8C,MAChBD,IAAKk8C,EAASj8C,MACd2H,WAAYs0C,EAASj8C,QAAUouB,EAC/BvP,QAASi9B,OAIf,OACE,kBAACJ,GAAD,CAAkB//B,YAAU,gBAC1B,kBAACggC,GAAD,KACG99C,GAAeiZ,eAAesE,EAAM8gC,kBAEvC,yBAAKx6B,UAAU,aAAaq6B,O,mbCrD3B,IAAMI,GAAoBjhC,IAAOC,IAAV,MAYjBihC,GAA0BlhC,IAAOC,IAAV,MA+BvBkhC,GAAgB7gC,gBAxBd,SAACJ,GACAK,cAANla,EAER,OACE,kBAACm6C,GAAD,CAAkB//B,YAAU,mBACzBP,EAAM8gC,iBACL,kBAACP,GAAD,KACG99C,GAAeiZ,eAAesE,EAAM8gC,kBAGzC,kBAACC,GAAD,CACEz8B,wBAAyB,CAAEN,OAAQhE,EAAMkhC,gBAE1ClhC,EAAMmhC,kBACL,kBAACH,GAAD,KACE,kBAACta,GAAD,CACE1e,MAAOhI,EAAMmhC,iBAAiBC,WAC9B9lC,KAAM0E,EAAMmhC,iBAAiBE,yB,uSCxCzC,IAAMC,GAAqBxhC,IAAOC,IAAV,MAEF,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAKzB,SAAC9G,GAAD,OAAYA,EAAM8I,SAAW,OAAS,UAC7C,SAAC9I,GAAD,OAAYA,EAAM8I,SAAW,GAAM,KAOnCy4B,GAAc,SAACvhC,GAAyB,IAAD,EACN6K,mBAASrf,GAAeC,QADlB,mBAC3CmB,EAD2C,KAC3BqwC,EAD2B,KAGlDvxB,qBAAU,WASR,OARAksB,GAA6Bz4B,iBAC3B,SACA,CAAC88B,GAAiBqB,SAClB,WACEL,EAAkBzxC,GAAeC,WAI9B,WACLmsC,GAA6BF,mBAAmB,aAEjD,IAwBH,OACE,kBAAC4J,GAAD,CACE/gC,YAAU,eACVuI,SAA6B,IAAnBlc,GAxBLoT,EAAMwhC,eAAer3C,KAAI,SAACs3C,GAC/B,OAAIA,EAAc1qC,MAEd,kBAACypC,GAAD,CACE77C,IAAK88C,EAAcC,SACnBZ,gBAAiBW,EAAcC,SAC/Bd,iBAAkBa,EAAc1qC,QAKlC,kBAACkqC,GAAD,CACEt8C,IAAK88C,EAAcC,SACnBZ,gBAAiBW,EAAcC,SAC/BR,aAAcO,EAAcP,aAC5BC,iBAAkBM,EAAcN,wB,opBCxD5C,IAAMrB,GAAchgC,IAAOC,IAAV,MAMXggC,GAAmBjgC,IAAOC,IAAV,MAIA,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBACvB,SAAC9G,GAAD,OAAWA,EAAM7C,MAAM+G,kCAMvCs7B,GAAa1/B,IAAOC,IAAV,MAQV4hC,GAAa7hC,IAAOC,IAAV,MAyBH6hC,GAAiBxhC,gBArBf,WAAO,IACZja,EAAMka,cAANla,EACR,OACE,kBAAC,GAAD,KACE,kBAAC,GAAD,CAAkBmgB,UAAW,gBAC3B,kBAAC,GAAD,CAAY/F,YAAU,gBACpB,kBAAC2O,GAAD,CAAaC,KAAK,UAAU3G,KAAK,SAASF,SAAS,WACnD,kBAACq5B,GAAD,KAAax7C,EAAE,qCAEjB,kBAAC,GAAD,CAAYoa,YAAU,iBACpB,kBAAC2O,GAAD,CAAaC,KAAK,gBAAgB3G,KAAK,SAASF,SAAS,WACzD,kBAACq5B,GAAD,KAAax7C,EAAE,mCAEjB,kBAAC,GAAD,CAAYoa,YAAU,gBACpB,kBAAC2O,GAAD,CAAaC,KAAK,eAAe3G,KAAK,SAASF,SAAS,WACxD,kBAACq5B,GAAD,KAAax7C,EAAE,yCChDZ07C,GAAb,kDACE,aAAe,uCACP,WAFV,UAAqCtF,ICIxBuF,GAAb,WAEE,WAAYxyC,GAAa,yBADzBA,UACwB,EACtBvN,KAAKuN,KAAOA,EAHhB,6DAMI,IAAIyyC,OAAwBx/C,EAoB5B,OAlBIR,KAAKuN,KAAKsL,kBACZmnC,EAAwBhgD,KAAKigD,4BAI1BD,IAA0BA,EAAsB5nC,QAEjD4nC,EAAwBhgD,KAAKkgD,wCAI5BF,GACAA,IAA0BA,EAAsB5nC,QAEjD4nC,EAAwBhgD,KAAKmgD,yBAI1BH,IA1BX,6CA8BI,OAAOhgD,KAAKuN,KAAKsL,aAAa,KA9BlC,gDAkCI,OAAO7Y,KAAKuN,KAAKsL,aAAaC,MAC5B,SAAC7e,GAAD,OACEA,EAAY2H,SACZoO,KAA6B2C,sBAAsBvX,EAAKyU,eArChE,2DA0CI,OAAO7P,KAAKuN,KAAKsL,aAAaC,MAC5B,SAAC7e,GAAD,OACEA,EAAY2H,SAAWlB,GAAe8P,0BA5C9C,KCKM4vC,G,4GAWF5kC,EACAnM,GAEA,IAAMgxC,EAGDrgD,KAAKsgD,qBAAqB9kC,GACzB3T,EAAU7H,KAAKugD,uBACnBF,EACAhxC,GAEF,OAAKxH,EAAQe,OAGNf,EAFE,O,6CAMTw4C,EACAhxC,GAEA,OAAOgxC,EAAkBj4C,KACvB,SAACnO,GACC,IAAMsQ,EAActQ,EAAYA,YAAYme,KACtCvV,EAAQ5I,EAAYuZ,GAC1B,MAAO,CACL3Q,MAAOA,EAAM8rB,WACbpkB,cACAC,WAAY3H,EAAM8rB,cAAN,OAAqBtf,QAArB,IAAqBA,OAArB,EAAqBA,EAAcsf,kB,2CAOrDnT,GAEA,IAAM6kC,EAGD,GAUL,OATA7kC,EAAM9Y,SAAQ,SAAC6K,GACb,IAAIyyC,EAAwB,IAAID,GAAYxyC,GAAMizC,iBAC9CR,GACFK,EAAkB/1C,KAAK,CACrBkJ,GAAIjG,EAAKiG,GACTvZ,YAAa+lD,OAIZK,I,4CAIPI,EACAC,EACAvyC,GAEA,IAAIqN,EAAoB,GAClB5B,EAA0B,GAC1B+mC,EAAexyC,GAAcA,IAAehQ,EAAWyiD,MAuB7D,OAtBAF,EACG9uC,QAAO,SAACivC,GAAD,OAAY,MAALA,KACdn+C,SAAQ,SAACo+C,GACR,GAAIH,EAAc,CAChB,IAAMtzC,EAASyzC,EAAWh/C,QAC1B,GAAIuL,IAAWmO,EAAMpT,KAAI,SAACmF,GAAD,OAAgBA,EAAKiG,MAAIpO,SAASiI,GAAS,CAClE,IAAME,EAAOkzC,EAAmB3nC,MAC9B,SAACvL,GAAD,OAAgBA,EAAKiG,KAAOnG,KAE1BE,GACFiO,EAAMlR,KAAKiD,IAIjB,IAAMN,EAAS6zC,EAAW7zC,OACrB2M,EAAQxU,SAAS6H,IACpB2M,EAAQtP,KAAK2C,MAGE,IAAjBuO,EAAM5S,QAAgB+3C,IACxBnlC,EAAQilC,GAEH,CACLjlC,QACA5B,c,6BAzFF,OAHK5Z,KAAKgL,UACRhL,KAAKgL,QAAU,IAAIo1C,GAEdpgD,KAAKgL,Y,KAPVo1C,GACGp1C,a,EAoGMo1C,UAAe3/C,MC/FxBsgD,G,oHAWF5yC,GACuC,IAAD,OACtC,OCrB+B,WACjC,IAAMzE,GAAUD,GAAeC,OAASD,GAAeM,UAAU4kB,WAC3DrtB,EAAOmI,GAAenI,KAAMoN,OAAO,YAAYigB,WAC/ChmB,EAAW,IAAIm3C,GACfp3C,EAAc,CAClB,CACEI,eAAgB,OAChBC,gBAAiBzH,GAEnB,CACEwH,eAAgB,UAChBC,gBAAiBW,IAkCrB,OA/BID,GAAewD,QAAUpO,GAAauG,SAASqE,GAAewD,SAChEvE,EAAY4B,KAAK,CACfxB,eAAgB,SAChBC,gBAAiBU,GAAewD,SAGhCxD,GAAe8D,OAASnM,OAAOqI,GAAe8D,OAChD7E,EAAY4B,KAAK,CACfxB,eAAgB,UAChBC,gBAAiBU,GAAe8D,OAIpC7E,EAAY4B,KAAK,CACfxB,eAAgB,qBAChBC,gBAAiB,SAGnBL,EAAY4B,KAAK,CACfxB,eAAgB,SAChBC,gBAAiBiH,KAA6BC,qBAC5C7U,EAAKyU,YAITnH,EAAY4B,KAAK,CACfxB,eAAgB,YAChBC,gBAAiB,0BAGnBJ,EAASiyC,eAAelyC,GACjBH,KAAiB9H,IAAIkI,GDxBnBq4C,GAAsB74C,KAC3BC,aAAI,SAACE,GACH,MAAO,CACLm3C,eAAgB,EAAKwB,qBAAqB34C,EAAKsR,SAC/CsnC,QAASC,GAAcC,sBACrB1gD,GAAe8a,MACflT,EAAKsR,QACLzL,GAAcA,EAAU,YAE1BjI,QAASoC,EAAKpC,e,2CAMM0T,GAC1B,IAAIynC,EAAoC,GAEpCC,EAAgC,GACpC1nC,EAAQlX,SAAQ,SAAAuK,GACZ,GAAIA,EAAOs0C,mBACT,OAAOD,EAAoBh3C,KAAK2C,EAAOs0C,mBAAmBC,aAGhE,IAAMC,EAAoE,IAArD5kB,MAAMtgC,KAAK,IAAIugC,IAAIwkB,IAAuB14C,OAW/D,OATIgR,EAAQhR,SAAW04C,EAAoB14C,QAAU64C,EACnDJ,EAAW/2C,KAAK,CACdq1C,SAAU,GACVR,aAAcvlC,EAAQ,GAAG8nC,eACzBtC,iBAAkBxlC,EAAQ,GAAG2nC,qBAG/BF,EAAarhD,KAAK2hD,gBAAgB/nC,GAE7BynC,I,sCAGeznC,GAAoB,IAAD,OACnCynC,EAAoC,GACpCpwB,EAAexnB,GAAe1H,KAkBpC,OAjBA6X,EACGhI,QAAO,SAACivC,GAAD,OAAY,MAALA,KACdn+C,SAAQ,SAACuK,GACR,GAAKA,GAAkC,IAAxBA,EAAO+H,MAAMpM,OAMrB,CACL,IAAMoM,EAAsB,EAAK4sC,yBAC/B30C,EAAO+H,MACPic,GAEFowB,EAAW/2C,KAAK,CAAEq1C,SAAU1yC,EAAOA,OAAQ+H,MAAOA,SAVlDqsC,EAAW/2C,KAAK,CACdq1C,SAAU1yC,EAAOA,OACjBkyC,aAAclyC,EAAOy0C,eACrBtC,iBAAkBnyC,EAAOs0C,wBAU1BF,I,+CAIPrsC,EACAic,GACe,IAAD,OACR4wB,EAA2B,GASjC,OARA7sC,EAAMtS,SAAQ,SAACqS,GAAD,OACZ8sC,EAAWv3C,KACT,EAAKw3C,sBACH/sC,IACAkc,GAAeA,IAAiBlc,EAAKhT,UAIpC8/C,I,4CAGqB9sC,EAAYvK,GACxC,MAAO,CACL3H,MAAOkS,EAAKhT,KACZwyC,MAAO,CACLjO,SAAUvxB,EAAKmZ,OAAUnZ,EAAKjD,QAAUiD,EAAKjD,OAAOlJ,OAAS,EAC7D4rC,eAAgBz/B,EAAKzC,gBAAkBvU,EAAa0U,QACpDg8B,cAAe15B,EAAK0xB,gBAEtBj8B,WAAYA,M,6BA3Fd,OAHKxK,KAAKgL,UACRhL,KAAKgL,QAAU,IAAI+1C,GAEd/gD,KAAKgL,Y,KAPV+1C,GACG/1C,a,EAqGM+1C,UAA8BtgD,M,gdEnG7C,ICIYshD,GDJNC,GAAuBjkC,IAAOC,IAAV,MASpBwuB,GAAczuB,IAAOC,IAAV,MAEK,SAACC,GAAD,OAAWA,EAAM7C,MAAM2J,mBAKvCoiB,GAASppB,IAAOC,IAAV,MAoJCikC,GAAgB5jC,gBA/IhB,WAAO,IAAD,EACGC,cAAZla,EADS,EACTA,EAAGhJ,EADM,EACNA,KACLqkD,EAAiBtkB,iBAA8B,IAC/C+lB,EAAU/lB,iBAAY,IACtB+mB,EAAa/mB,kBAAO,GACpBhtB,EAAagtB,iBAAOzX,eAAckc,OALvB,EAMa9W,mBAAS,IANtB,mBAMV5iB,EANU,KAMDsc,EANC,OAO2BsG,oBAAS,GAPpC,mBAOVq5B,EAPU,KAOMC,EAPN,OAQuBt5B,mBAASrf,GAAenI,MAR/C,mBAQV0vB,EARU,KAQI+oB,EARJ,OASuBjxB,mBAASrf,GAAe1H,MAT/C,mBASVkvB,EATU,KASIytB,EATJ,OAUqB51B,mBAASkI,GAV9B,mBAUVqxB,EAVU,KAUGC,EAVH,KAWXjE,EAAmB39C,GAAe29C,iBAElC50B,EAAaC,6BA4Bb64B,EAAiB,WACrB,IAAM/Z,EAASxwB,SAASywB,cAAc,2BAZnB,SAAC7jB,GACpB,IAAM8jB,EAAO9jB,EAAQ+jB,wBACrB,OACED,EAAKE,KAAO,GACZF,EAAKG,MAAQ,GACbH,EAAKI,SACFha,OAAOia,aAAe/wB,SAASgxB,gBAAgBC,eAClDP,EAAKQ,QAAUpa,OAAO4C,YAAc1Z,SAASgxB,gBAAgBG,cAM1DC,CAAaZ,IACV,OAANA,QAAM,IAANA,KAAQa,eAAe,CAAEC,MAAO,MAAOC,OAAQ,aAInD5f,qBAAU,WAYR,OAXAksB,GAA6Bz4B,iBAC3B,wBACA,CAAC88B,GAAiBG,aAAcH,GAAiBa,aACjD,WACEhB,EAAgBtwC,GAAenI,MAC3BmI,GAAenI,MAAQmI,GAAenI,KAAKG,WAC7C2gD,GAAkB,MAKjB,WACLvM,GAA6BF,mBAAmB,4BAEjD,IAEHhsB,qBAAU,WASR,OARAksB,GAA6Bz4B,iBAC3B,iBACA,CAAC88B,GAAiBoE,KAAMpE,GAAiBa,aACzC,WACE2D,EAAgBj1C,GAAe1H,SAI5B,WACL8zC,GAA6BF,mBAAmB,qBAEjD,CAAC3kB,IAEJrH,qBAAU,WACR,GAAKqH,GACAmxB,EAAL,CACA1C,EAAe1iB,QAAU,GACzBmlB,EAAWnlB,SAAU,EACrB,IAAMnT,EAAe44B,GAClBC,4BAA4Bt0C,EAAW4uB,SACvCjT,UAAU,CACT7a,KAAM,SAAC3G,GACL,IAAMsR,EAAUtR,EAAKm3C,eACrBA,EAAe1iB,QAAUz0B,EAAKm3C,eAC9ByB,EAAQnkB,QAAUz0B,EAAK44C,QACvBgB,EAAWnlB,QAA6B,IAAnBnjB,EAAQhR,OAC7B4Z,EAAWla,EAAKpC,SA7EG,SAAC0T,GAC1B,GAAKqX,EAAL,CACA,IAAIjc,EAAa,GACjB4E,EAAQlX,SAAQ,SAACuK,GACXA,EAAO+H,OACTA,EAAM1K,KAAK2C,EAAO+H,MAAM5M,KAAI,SAAC2M,GAAD,OAAUA,EAAKlS,aAG1CmS,EAAM0tC,OAAOt9C,SAAS6rB,KACzBytB,EAAgB,IAChBj1C,GAAe1H,KAAO,GACtB8zC,GAA6Bb,SAASkF,GAAiBoE,QAmEnDqE,CAAmB/oC,GACnB+R,KAAuB8C,SAAS,SAChCvX,KAAW0X,WACXwzB,GAAkB,GACdC,IAAgBrxB,IAClBuxB,IACAD,EAAetxB,KAGnBntB,MAAO,SAACA,GACN2e,EAAW3e,EAAMI,KAAKiC,SACtBk8C,GAAkB,MAIxB,OAAO,WACLx4B,EAAaG,kBAEd,CAACo4B,EAAgB/mD,EAAKyU,SAAU4Z,IAEnC,IAAMyjB,EAAchnC,GAEhB9B,EAAE,oEAEAmd,EAAUyP,GAAgBA,EAAavvB,WAC3C,8BACIygD,EAAWnlB,SAAW,kBAAC,GAAD,KAAcmQ,GACrCgV,EAAWnlB,SACV,kBAAC,GAAD,CAAa0iB,eAAgBA,EAAe1iB,UAE7CmlB,EAAWnlB,UAAYshB,GAAoB,kBAACwB,GAAD,OAIhD,OACE,kBAACmC,GAAD,CAAsBxjC,YAAU,iBAAiBhL,GAAG,kBAClD,kBAACsc,GAAD,CACEjsB,OAAO,EACPhB,MAAOouB,EACPf,eAAgB,0BAChBiC,WAAY,GACZ3H,QAAS,WACT4C,KAAM,kBAAC,KAAD,MACNsC,WAAW,IAEZyyB,EAAiB,kBAACz7B,GAAD,MAAanF,EAC/B,kBAAC,GAAD,CAAQ/N,GAAG,8BErKJovC,GAAmB,SAC9B//C,EACA+1B,EACAiqB,GAEA,MAAO,CACLhgD,QACA0H,YACa,aAAXs4C,EACIniD,GAAeiZ,eAAe9W,GAC9BzH,EAAKgJ,EAAL,oBAAoBy+C,GAAkB,IAAtC,OAA2ChgD,IACjD2H,WAAYouB,IAAkB/1B,I,m5BDFtBk/C,K,cAAAA,E,iBAAAA,Q,KAKZ,IAAMe,GAAc/kC,IAAOC,IAAV,MAEG,SAACC,GAAD,OAChBA,EAAM8kC,mBAAqB,cAAgB,SAE1B,SAAC9kC,GAAD,OAAWA,EAAM7C,MAAM4nC,iBAqBpB,SAAC/kC,GAAD,OAChBA,EAAM8kC,mBAAqB,iBAAmB,YA0FzCE,GAAU5kC,gBA/DA,SAACJ,GACRK,cAANla,EADmC,IC7E3C8+C,EACAtqB,EACAiqB,ED4FMM,GC9FND,ED+FExiD,GAAekZ,QC9FjBgf,ED+FEnvB,GAAewD,OC9FjB41C,ED+FE,WC7FKK,EAAS96C,KAAI,SAACvF,GAAD,OAClB+/C,GAAiB//C,EAAO+1B,EAAeiqB,OD8FnCO,EAAejC,GAAckC,oBACjC3iD,GAAe8a,MACf/R,GAAe8D,MAEXw1C,EAAqBriD,GAAeqiD,mBACpCO,EAAkBP,EAAqB,cAAgB,MACvDQ,EAAuB7iD,GAAe6iD,qBAE5C,OACE,kBAACT,GAAD,CACEtkC,YAAU,UACVpD,MAAO6C,EACP8kC,mBAAoBA,IAElBQ,GACAJ,EAAev6C,OAAS,IACvBqV,EAAMulC,0BACL,kBAACrsB,GAAD,CACE7G,SAAS,kBACTzoB,QAASs7C,EACT3rB,kBAAmBorB,GAAiB,MAAO,KAAM,YACjDlrB,uBAAuB,EACvBH,YAzCY,SAAC10B,GACjB4G,GAAewD,SAAWpK,IAC5B4G,GAAewD,OAASpK,EACxBgzC,GAA6Bb,SAASkF,GAAiBmB,YAyCtD+H,EACC,kBAACjsB,GAAD,CACEmB,wBAAyByqB,EACzBzyB,SAAS,gBACTzoB,QAASu7C,EACT5rB,kBAAmBorB,GAAiBU,EAAiB,KAAM,UAC3D5rB,uBAAwBqrB,EACxBxrB,YA5CY,SAAC10B,GACf4G,GAAe8D,OAAS1K,IAC1B4G,GAAe8D,KAAO1K,EACtBgzC,GAA6Bb,SAASkF,GAAiBoB,UA4CrD,O,4hBE/GR,IAAMmI,GAA2B1lC,IAAOC,IAAV,MAOxB0lC,GAA0B3lC,IAAOC,IAAV,MAkPhB2lC,GAAYtlC,gBAhOQ,WAAO,IAC9Bja,EAAMka,cAANla,EAD6B,EAEX0kB,mBAAcpF,eAAckc,OAFjB,mBAE9B/7B,EAF8B,KAEvBg8B,EAFuB,OAGP/W,mBAASrf,GAAeC,QAA7CwxC,EAH4B,sBAILpyB,mBAASrf,GAAeM,UAA/C65C,EAJ4B,sBAKT96B,mBAASrf,GAAe1H,MAA3C28C,EAL4B,oBAM/Bt0C,EAA4B1J,GAAe0J,0BAC3Cy5C,EAAuBnjD,GAAe6I,mBACtCD,EAAsB5I,GAAe4I,oBARN,EASiBwf,oBACnD+6B,KAA0Bp6C,GAAeC,QAVP,mBAS9Bo6C,EAT8B,KASTC,EATS,OAYSj7B,qBAC1Crf,GAAeC,QAbkB,mBAY9Bs6C,EAZ8B,KAYbC,EAZa,OAeCn7B,oBACnCxf,GACCw6C,GACAr6C,GAAeC,QACfD,GAAenI,MACfmI,GAAenI,KAAKG,WACpBgI,GAAe1H,MArBkB,mBAe9BmiD,EAf8B,KAejBC,EAfiB,KAuB/B16B,EAAaC,6BAvBkB,EAwBLZ,oBAAS,GAxBJ,mBAwB9B2qB,EAxB8B,KAwBpB2Q,EAxBoB,OAyBHt7B,oBAAS,GAzBN,mBAyB9BoiB,EAzB8B,KAyBnBC,EAzBmB,OA0B2BriB,mBAC9DpoB,GAAeqiD,qBAAuBt5C,GAAe8D,MA3BlB,mBA0B9Bi2C,EA1B8B,KA0BJa,EA1BI,KA8BrC16B,qBAAU,WAaR,OAZAksB,GAA6Bz4B,iBAC3B,yBACA,CACE88B,GAAiBqB,OACjBrB,GAAiBG,aACjBH,GAAiBoE,OAEnB,WACEze,EAAS,OAIN,WACLgW,GAA6BF,mBAAmB,6BAEjD,IAEHhsB,qBAAU,WAgBR,OAfAksB,GAA6Bz4B,iBAC3B,4BACA,CAAC88B,GAAiBqB,SAClB,WACEL,EAAkBzxC,GAAeC,QACjCk6C,EAAoBn6C,GAAeM,UACnCN,GAAeC,OAAS,GAAKD,GAAeM,SAAW,EACnDk6C,GAAmB,GACnBA,GAAmB,GAClB75C,GAA8B05C,GACjCC,GAAuB,MAKtB,WACLlO,GAA6BF,mBAC3B,gCAGH,IAEHhsB,qBAAU,WAmBR,OAlBAksB,GAA6Bz4B,iBAC3B,0BACA,CAAC88B,GAAiBoE,OAClB,WACEI,EAAgBj1C,GAAe1H,MAC/BoiD,EACEL,GACEr6C,GAAeC,QACfD,GAAenI,MACfmI,GAAenI,KAAKG,WACpBgI,GAAe1H,MAEf0H,GAAe1H,MACjBuiD,OAKC,WACLzO,GAA6BF,mBAC3B,8BAGH,IAEHhsB,qBAAU,WASR,OARAksB,GAA6Bz4B,iBAC3B,SACA,CAAC88B,GAAiBoB,OAClB,WACE+I,EAAoD,KAAxB56C,GAAe8D,SAIxC,WACLsoC,GAA6BF,mBAAmB,aAEjD,IAEH,IAAMl1B,EAAuB8jC,uBAAY,WACvC,IAAM36B,EAAe1J,KAAqC4J,WACxD,SAACxhB,GACC5H,GAAe4W,uBAAwB,EACvCtF,GAAoBK,eAAiB/J,EACjCA,EAAKk8C,uBACP/6C,GAAeyD,cAAgB,KAC/BsE,GAAiBM,OAASxJ,EAAKk8C,sBAAsB5yC,QACnD,SAACs0B,GAAD,OAAgBA,EAAWM,SAAWloC,EAAewT,UAEvDN,GAAiBO,OAASzJ,EAAKk8C,sBAAsB5yC,QACnD,SAACs0B,GAAD,OAAgBA,EAAWM,SAAWloC,EAAeyT,YAGvDP,GAAiBM,OAAS,GAC1BN,GAAiBO,OAAS,IAExBzJ,EAAKipC,iBACP//B,GAAiBtC,MAAQ5G,EAAKipC,gBAC9B9nC,GAAe0D,cAAgB7E,EAAKipC,gBAAgBnpC,KAClD,SAACq8C,GACC,MAAO,CAAE32C,OAAQ22C,EAAcjxC,GAAIzF,MAAO,OAI9CyD,GAAiBtC,MAAQ,GAE3Bi8B,GAAa,GACbiZ,GAAY,KAEd36B,GAGF,OAAO,WACLG,EAAaG,iBAEd,CAACN,IAOE66B,EAAqB,WACzBnZ,GAAa,GACTzqC,GAAe4W,wBACjB5W,GAAe4W,uBAAwB,EACvCtF,GAAoBqP,oBACpBf,MAEFG,KAcF,OAXAkJ,qBAAU,WAEN1pB,GAAkBuJ,kBAClBvJ,GAAkBkL,mBAClBlL,GAAkBwL,oBACjBhC,GAAeyoB,mBAEhBoyB,OAKF,kBAACb,GAAD,CAA0BjlC,YAAU,sBACjC3a,GAASA,EAAK,cACb,kBAAC+yB,GAAD,CACE/yB,MAAOA,EAAK,MACZE,OACEF,EAAK,aAAL,OACA1H,EAAauoD,wBACT,UACA,QAENlmC,YAAU,kBAGd,kBAACykC,GAAD,CACED,cAAejB,GAAgBp6B,OAC/B67B,yBAA0BA,KAE1BA,GACA,kBAACE,GAAD,KACE,kBAACnG,GAAD,OACEj0C,GAAuBw6C,IACvB,kBAAC1F,GAAD,OAEA90C,GAAuBw6C,IAAwB,kBAAC7B,GAAD,QAGnDiC,GACA56C,GACCc,GACCy5C,IACCC,IACH,kBAACp8B,GAAD,CACEX,SAAU3c,IAA8B45C,EACxCn8B,cAAezjB,EAAE,gBACjBsd,QACEpY,GAAwB06C,GAAmBE,EACvCI,EA/DgB,WAC5BP,GAAuB,GACvBE,GAAmB,MAkEhB/Y,GAAa,kBAACxkB,GAAD,CAAQH,SAAU,UAC/BktB,GACC,kBAAC,KAAD,CAAUhyB,GAAIne,GAAqB1G,EAAOQ,OAAOI,mBCpQ5CmnD,GAActmC,gBATA,SAACJ,GAC1B,IAAMhG,EAAWyL,eAKjB,OAJAiG,qBAAU,WACRmF,OAAO81B,SAAS,EAAG,KAClB,CAAC3sC,IAEG,oCAAGgG,EAAMlU,aCUL86C,GAAiBxmC,gBAbd,WAAO,IACbjjB,EAASkjB,cAATljB,KACRsoB,eACA,IAAMohC,EAAqBpkD,GAAeqY,eAAe3d,EAAKyU,UAE9D,OACE,oCACGi1C,GACC,kBAACr3B,GAAD,CAAiBlU,KAAMurC,EAAoB/gD,OAAO,gB,iuBCenD,IAAMghD,GAAkBhnC,IAAOC,IAAV,MAGZ,SAACC,GAAD,OACZA,EAAM3U,oBAAN,kCAIE07C,SAAS/mC,EAAM7C,MAAMuH,aAAc,GACnCqiC,SAAS/mC,EAAM7C,MAAM2Q,aAAc,GALrC,iDAUEi5B,SAAS/mC,EAAM7C,MAAMuH,aAAc,GACnCqiC,SAAS/mC,EAAM7C,MAAM2Q,aAAc,GAXrC,kBAcO,SAAC9N,GAAD,OAAWA,EAAM7C,MAAM8C,aAc5B+mC,GAAqBlnC,IAAOC,IAAV,MAKlBknC,GAAoBnnC,IAAOC,IAAV,MA6HVmnC,GAAc9mC,gBAjHJ,WAAO,IACpBja,EAAMka,cAANla,EACFghD,EAAuB1kD,GAAe0kD,qBACtC97C,EAAsB5I,GAAe4I,oBACrC+7C,EAAc3kD,GAAekZ,QAAQhR,OAAS,EAE9C08C,EACJ5kD,GAAe2hB,kBAAkBvgB,UAChCpB,GAAeib,QAAQvW,SACtBlE,OAAOR,GAAe2hB,kBAAkBvgB,UAGtCyjD,EACJ90C,aAAaC,QAAQ,qBACrBD,aAAaC,QAAQ,iBAAmBhQ,GAAeE,iBAuCnD4kD,EACHJ,GAAyBC,EAOxB,oCACGC,GACC,kBAAC73B,GAAD,CACE7qB,IAAK,0BACL2W,KAAMnV,EAAE,4CACRL,OAAQ,YAGZ,kBAAC,KAAD,KACE,kBAAC4gD,GAAD,KACE,kBAAC,KAAD,CAAsBc,SAvDV,SAAC,GAMhB,IALL5hD,EAKI,EALJA,MACA6hD,EAII,EAJJA,WAWA,OANI7hD,EAAMG,OAAS7H,EAAauoD,yBAC9Bj7C,GAAek8C,aAGjBD,IAGE,kBAAC,KAAD,CACEjkC,GAAI,CACFmC,SACmC,oBAA1B/f,EAAM+hD,gBACT/hD,EAAM+hD,kBACNtiD,GAAqB,aAAa,GACxC4U,OAAQjY,GAAkB0D,yCAC1Bi8B,MAAO,CACL/7B,MAC8B,oBAArBA,EAAMmsC,WACTnsC,EAAMmsC,aACN5rC,EAAE,0BACRyhD,UACgC,oBAAvBhiD,EAAMiiD,aACTjiD,EAAMiiD,eACN1pD,EAAUyH,MAChB44B,aAAc54B,EAAMI,WA0BlB,kBAACgwC,GAAD,MACA,kBAAC4Q,GAAD,MACA,kBAAC,KAAD,CACExa,KAAM/mC,GAAqB1G,EAAOQ,OAAOG,WAAW,IAEpD,kBAAComD,GAAD,OAEF,kBAAC,KAAD,CACEtZ,KAAM/mC,GAAqB1G,EAAOQ,OAAOI,aAAa,IAEtD,kBAAC61C,GAAD,OAEF,kBAAC,KAAD,CACEhJ,KAAM/mC,GAAqB1G,EAAOQ,OAAOK,cAAc,IAEvD,kBAAC0sC,GAAD,WAhCV,kBAAC1c,GAAD,CACE7qB,IAAK,gCACL2W,KAAMnV,EAAE,8BACRL,OAAQ,YAqCd,OACE,kBAACghD,GAAD,CAAiBz7C,oBAAqBA,GACpC,kBAAC,KAAD,KACE,kBAAC27C,GAAD,KACE,kBAACC,GAAD,KAAoBM,GACpB,kBAAC,KAAD,CACE/jC,GAAIne,GACFiiD,EACI3oD,EAAOQ,OAAOM,sBACdd,EAAOQ,OAAOG,mB,0oBCrKhC,IAAMwoD,GAAahoC,IAAOC,IAAV,MAMJ,SAACC,GAAD,OACRA,EAAM+nC,SAAN,8CACY,SAAC/nC,GAAD,OAAYA,EAAM+nC,SAAW,QAAU,KAEzC,SAAC/nC,GAAD,OACRA,EAAM+nC,SAAN,8CAIAC,GAAwBloC,IAAOC,IAAV,MAkDdkoC,GAAe7nC,gBAjCb,SAACJ,GAA+B,IACrC7Z,EAAMka,cAANla,EAERulB,qBAAU,WACRvuB,EAAK2U,eACHc,KAAyBN,kBAAzB,UACK9U,UAGN,IAEH,IAAIie,EAAetV,EAAE,0BAarB,MAZsC,oBAA3B6Z,EAAMpa,MAAMmsC,WACrBt2B,EAAeuE,EAAMpa,MAAMmsC,aAE3BzN,KACE,IAAI57B,MAAJ,uCAA0CsX,EAAMpa,SAChD,SAAC2+B,GAGC,OAFAA,EAAMC,OAAO,aAAc,gBAC3BD,EAAM2jB,WAAW,gBAAjB,eAAuCloC,EAAMpa,QACtC2+B,KAKX,kBAACujB,GAAD,CAAYC,SAAU/nC,EAAM+nC,UAC1B,kBAACC,GAAD,CAAuBznC,YAAU,iBAC9B9E,O,qkCCzET,IAAM0sC,GAAkBroC,IAAOC,IAAV,MAWfqoC,GAAoBtoC,IAAOC,IAAV,MAQjBsoC,GAAWjgC,YAAH,MAeRkgC,GAAYxoC,IAAOC,IAAV,KAOAsoC,IA2BFE,GAAanoC,gBAZJ,WACpB,OACE,kBAAC+nC,GAAD,CAAiB5nC,YAAU,eACzB,kBAAC6nC,GAAD,KACE,kBAACE,GAAD,MACA,kBAACA,GAAD,MACA,kBAACA,GAAD,W,meC3DR,IAAME,GAAU1oC,IAAOC,IAAV,MAoBPuH,GAAMxH,IAAOqF,IAAV,MAwBIsjC,GAAOroC,gBAnBJ,WAAO,IACbjjB,EAASkjB,cAATljB,KACFurD,EAAgBjmD,GAAeimD,cAC/BrtC,EAAgB5Y,GAAekmD,iBAAiBxrD,EAAKyU,UACrDg3C,EAAenmD,GAAemmD,aAEpC,OACE,kBAACJ,GAAD,CAASjoC,YAAU,YACjB,uBACEkH,OAAO,SACPC,IAAI,sBACJ/D,KAAMilC,EAAal4B,YAEnB,8BAAOrV,GACP,kBAAC,GAAD,CAAKwK,IAAKlnB,EAAOO,aAAewpD,EAAe5iC,IAAI,U,+oBC/B3D,IAAM+iC,GAAgB/oC,IAAOC,IAAV,MACF,SAACC,GAAD,OAAWA,EAAM8E,cAgB5BgkC,GAAUhpC,IAAOC,IAAV,MAYU,SAACC,GAAD,OAAYA,EAAM+oC,UAAY,gBAAkB,SAoB1DC,GAAS5oC,gBAhBJ,WAChB,IAAM2oC,EAAYtmD,GAAewmD,8BAC3BnkC,EAAariB,GAAeqiB,WAC5BokC,EACJ,kBAACJ,GAAD,CAASC,UAAWA,GACjBA,GAAa,kBAACxhC,GAAD,MACd,kBAACkhC,GAAD,OAIJ,OACE,kBAACI,GAAD,CAAetoC,YAAU,SAASuE,WAAYA,GAC3CriB,GAAekJ,SAASw9C,gBAAkBD,EAAY,O,yQC3BtD,IAAME,GAAoBtpC,IAAOC,IAAV,MAId,SAACC,GAAD,OACZA,EAAMqpC,gBAAN,cACWrpC,EAAMqpC,gBADjB,mCAEIrpC,EAAMspC,sBAEG,SAACtpC,GAAD,OAAWA,EAAM8E,cAwLrBykC,GAAanpC,gBArLJ,WAAO,IACnBja,EAAMka,cAANla,EACF6T,EAAWyL,eACXlc,EAAcigD,eACdnnD,EAAe,IAAIyX,gBAAgBE,EAASC,QAC5C3X,EAAa,IAAIwX,gBAAgBE,EAASyvC,KAAK34B,QAAQ,IAAK,MALxC,EAMwBjG,oBAAS,GANjC,mBAMnBvR,EANmB,KAMAowC,EANA,OAQM7+B,qBARN,mBAQnB7hB,EARmB,KAQT2gD,EARS,KASpBvnD,EAAYonD,eACZh7B,EAAqB/rB,GAAe+rB,mBACpCo7B,EACJ5nD,GAAkB4nD,6BAChBxsC,EAAsB3a,GAAe2a,oBACrCwsC,EACFxsC,EAAsBwsC,EACbp7B,IACTpR,EAAsB,eAjBE,MAoBkByN,oBAAS,GApB3B,mBAoBnBg/B,EApBmB,KAoBHC,EApBG,KAsBtB9vC,EAAS2L,SAASxe,SAAS,uBAC7BxI,EAAOQ,OAAOC,KAAd,8BAA4CmK,EAAOlI,UAAnD,uBAGF,IAAMyjB,EAAariB,GAAeqiB,WAE5BilC,EAAWC,aAAe,CAC9BC,WAAY,CACVnlC,WAAYA,GAEdolC,QAAS,CACPC,UAAW,CACTC,KAAM,YAGVC,UAAW,CACTC,cAAe,CACbC,KAAM,CACJ3yB,SAAU,KAGd4yB,oBAAqB,CACnBx4B,MAAO,CACL4F,SAAU,QAyClB,GAnCAlM,qBAAU,WACR++B,KAAQ9sD,KAAK,CACX+sD,OAAQ,CACNC,SAAU,CAAC7lC,QAGd,CAACxL,IAEJtX,GAAkB4oD,IAAIxoD,EAAWC,EAAcC,GAE/CopB,qBAAU,WACRjpB,GAAeooD,qBAAqBh/B,WAClC,WAGE,GAFA69B,GAAqB,GACrBjnD,GAAe6W,mBAAoB,EAC/BU,EAAS2L,SAASxe,SAAS,sBACzB1E,GAAegc,yBAA0B,CAC3C,IAAMygC,EACJ,IAAIz2C,GACFhG,GAAeqoD,qCACb3tD,EAAKyU,WAGX+3C,EAAYzK,GAGhBnlC,SAASiO,MACPvlB,GAAe8iB,oBAAsB,MAAQpf,EAAE,wBAEnD,SAAC+4C,GACCyK,EAAYzK,QAGf,IAEC2K,EACF,OAAO,kBAAC,GAAD,MAGT,IAAKvwC,IAAsBtQ,EACzB,OAAO,kBAACu/C,GAAD,MAGT,IAAMjlC,EAAUta,EACd,kBAACi/C,GAAD,CAAcriD,MAAOoD,EAAU++C,SAAUzuC,IAEzC,kBAAC4tC,GAAD,MAYF,OACE,kBAAC,KAAD,CAAkB/pC,MAAO4sC,GACvB,kBAACX,GAAD,CACE7oC,YAAU,eACV+oC,mBAAoBlsC,EACpBisC,gBAAiB76B,EACjB1J,WAAYA,EACZvP,GAAG,gBAEH,kBAAC,IAAa+qB,SAAd,CAAuB17B,MAAO0pB,GAAaI,YACxCpV,GAAqB,kBAAC+L,GAAD,CAAQO,cApBhB,WAChB5L,EAAS2L,SAASxe,SAAS,uBAC7BxI,EAAOQ,OAAOC,KAAO,sBACrByxB,OAAO7W,SAAS2J,KAAOte,GACrB1G,EAAOQ,OAAOG,WACd,IAGJwqD,GAAkB,MAaXxmC,IAGL,kBAAC0lC,GAAD,MACC1vC,GAAqB7W,GAAesoD,oBACnC,kBAAC,gBAAD,CACE9iD,QACE,0BACEqc,wBAAyB,CACvBN,OAAQ7d,EAAE,mCAIhB6kD,aAAa,EACbC,sBAAuB9kD,EAAE,uCACzB+kD,oBAAqB/kD,EACnB,iDAEFglD,sBAAuBhlD,EACrB,mDAEFilD,qBAAsBjlD,EACpB,kDAEFklD,oBAAqBllD,EACnB,iDAEFmlD,iBAAkBnlD,EAAE,8CACpBolD,kBAAmBplD,EAAE,+CACrBqlD,4BAA6BrlD,EAC3B,0DAEFslD,0BAA2BtlD,EACzB,wDAEFulD,2BAA2B,EAC3BC,0BAA0B,EAC1BC,yBAAyB,EACzBC,mBAAoB,WAClBjyC,GAAqBT,gBAEvB2yC,oBAAqB,WACnBlyC,GAAqBV,iBAEvB6yC,OAAQ,CACNC,OAAQ,CACN1jC,SAAU,QACVuiB,OAAQ,EACRD,KAAM,EACNxZ,MAAO,OACPtK,gBAAiB,QACjBmlC,OAAQ,IACRC,QAAS,e,qpBC/MvB,IAAMC,GAAuBrsC,IAAOC,IAAV,MAQpBqsC,GAAqBtsC,IAAOC,IAAV,MAYlBssC,GAAgBvsC,IAAOC,IAAV,MAKbusC,GAAexsC,IAAOkK,KAAV,MAKZuiC,GAAW,SAAC,GAAqC,IAAnCpyC,EAAkC,EAAlCA,KAAMvV,EAA4B,EAA5BA,MACxB,OACE,kBAACynD,GAAD,KACE,kBAACC,GAAD,eAAkBnyC,EAAlB,OACA,0BAAMoG,YAAA,yBAA6BpG,IAASvV,KAyBrC4nD,GAAgBpsC,gBApBJ,WACvB,OACE,kBAAC+rC,GAAD,CAAsB5rC,YAAU,kBAC9B,kBAAC6rC,GAAD,KACE,kBAAC,GAAD,CAAUjyC,KAAK,UAAUvV,MAAK,UAAKpH,cACnC,kBAAC,GAAD,CACE2c,KAAK,KACLvV,MAAK,UAAKpH,gCAEZ,kBAAC,GAAD,CAAU2c,KAAK,MAAMvV,MAAOjG,EAAOI,aACnC,kBAAC,GAAD,CAAUob,KAAK,UAAUvV,MAAOjG,EAAOM,oBACvC,kBAAC,GAAD,CACEkb,KAAK,SACLvV,MAAK,UAAKpH,aCvDPivD,I,OAAkBrsC,gBAJjB,WACZ,OAAO,yD,uaCST,IAAMssC,GAAa5sC,IAAO+C,EAAV,MAGA,SAAC7C,GAAD,OAAWA,EAAM2sC,cAsDpBC,GAAiBxsC,gBAtCb,WAAO,IAAD,EACDC,cAAZla,EADa,EACbA,EAAGhJ,EADU,EACVA,KACLiF,EAAYonD,eACZxvC,EAAWyL,eAEX7T,EADe,IAAIkI,gBAAgBE,EAASC,QACpBzX,IAAI,aAAe,KAL5B,EAM6BqoB,oBAAS,GANtC,mBAMdvR,EANc,KAMKowC,EANL,OAO2B7+B,mBAAS,WAPpC,mBAOdgiC,EAPc,KAOIC,EAPJ,KAQfxkB,EAASzX,OAAO7W,SAASsuB,OACzB9gB,EAAI,UAAM8gB,EAAN,kCAAsClmC,EAAUlB,YAAhD,cAcV,OAZAc,GAAkB4oD,IAAIxoD,GACtBspB,qBAAU,WACRjpB,GAAeooD,qBAAqBh/B,WAAU,WAC5C69B,GAAqB,GACrBoD,EAAoBrqD,GAAesb,mBAEpC,IAEH2N,qBAAU,WACRvuB,EAAK2U,eAAeF,KACnB,IAGD,oCACG0H,GACC,kBAACozC,GAAD,CACE/oC,KAAM6D,EACNmlC,WAAYE,EACZvmC,UAAU,sBAETngB,EAAE,6B,UCtDA4mD,I,OAAb,kDACI,aAAe,IAAD,8BACV,gBACKrjD,UAAY,2BAFP,EADlB,UANA,kDACI,aAAe,uCACL,YAFd,UAAsCc,MCYzBwiD,GAAe,I,iDAXhBC,SAAoB,G,kDAEhBC,GACRnrD,KAAKkrD,SAAWC,G,eAIhB,OAAOnrD,KAAKkrD,a,MCNdjsD,GAAcsJ,K,+VCqBpB,IAAM6iD,GAAiBrtC,IAAOC,IAAV,MAMdqtC,GAAwBttC,YAAOib,GAAPjb,CAAH,MACP,SAACE,GAAD,OAAWA,EAAM7C,MAAM2J,mBAG1B,SAAC9G,GAAD,OACbA,EAAM7C,MAAMiR,aAAe,gBAAkB,SA8MpCi/B,GAAiBjtC,gBA1MN,WAAO,IAAD,EACwByK,oBAAS,GADjC,mBACrByiC,EADqB,KACDC,EADC,OAEY1iC,mBAAS,IAFrB,mBAErBC,EAFqB,KAEPC,EAFO,OAG0BF,oBAAS,GAHnC,mBAGrB2iC,EAHqB,KAGAC,EAHA,OAIwB5iC,oBAAS,GAJjC,mBAIrB6iC,EAJqB,KAIDC,EAJC,OAKE9iC,oBAAS,GALX,mBAKrBqM,EALqB,KAKZ02B,EALY,OAMgB/iC,mBAAmB,IANnC,mBAMrBsK,EANqB,KAML4G,EANK,OAOAlR,mBAAS,IAPT,mBAOrBgR,EAPqB,KAObC,EAPa,OAQRzb,cAAZla,EARoB,EAQpBA,EAAGhJ,EARiB,EAQjBA,KACL+3B,EAAOgI,iBAAO,CAClB1W,eAAWjkB,EACXkkB,cAAUlkB,EACV0B,WAAO1B,EACPwf,cAAeglC,SAAStkD,GAAeG,qBAEzC8oB,qBAAU,WACR,IAAMuS,EAAYlsB,KAA6B2C,sBAC7CvX,EAAKyU,UAEPkqB,EAAU,GAAD,OAAIr5B,GAAe07B,iBAAnB,mBAA8CF,MACtD,CAAC9gC,EAAKyU,WAET8Z,qBAAU,WACR,GAAI4hC,EAAoB,CACtBM,GAAW,GADW,MAOlB14B,EAAK4J,QAJPtY,EAHoB,EAGpBA,UACAC,EAJoB,EAIpBA,SACAxiB,EALoB,EAKpBA,MACA8d,EANoB,EAMpBA,cAEFirC,GAAahmC,QAAU,CAAER,UAAS,OAAEA,QAAF,IAAEA,IAAa,GAAIC,SAAQ,OAAEA,QAAF,IAAEA,IAAY,GAAIxiB,MAAK,OAAEA,QAAF,IAAEA,IAAS,GAAI8d,iBACnG,IAAM4J,EDnEyB,WACjC,IAAMkiC,EAAiBb,GAAahmC,QAC9Btc,EAAW,IAAIqiD,GACrB,OAAO/rD,GAAYohB,KAAK1X,EAAU,CAAEsc,QAAQ,eAAM6mC,KCgE3BC,GAAwBjiC,UAAU,CACrD7a,KAAM,SAAC3G,GACL2iD,GAAahmC,QAAU3c,EACvBojD,GAAuB,GACvBE,GAAsB,GACtBC,GAAW,IAEbhoD,MAAO,SAACA,GACN6nD,GAAuB,GACvBG,GAAW,GACXD,GAAsB,GACtB5iC,EAAgBnlB,EAAMC,SAASG,KAAf,UAGpB,OAAO,WACL2lB,EAAaG,kBAGhB,CAACwhC,IACJ,IAAMj4B,EAAiB,CAAC,WAAY,YAAa,QAAS,SA8CpDuK,EAAuB,WAC3B,IAAID,EAAkC,GAUtC,OATAtK,EAAe5wB,SAAQ,SAACgY,IAxBN,SAACA,GACnB,IAAI7X,EAAQswB,EAAK4J,QAAQriB,GACzB,MAAI,UAAYA,EACP7X,EAEe,qBAAVA,GAAkC,MAATA,EAoBhC66B,CAAYhjB,GACfkjB,EAAsBtzB,KAAKoQ,GACR,UAAVA,IATU,SAAC7X,GACxB,MAAO,4CAA4CoX,KAAKpX,GAS/CmpD,CAAiB74B,EAAK4J,QAAQriB,KACjCkjB,EAAsBtzB,KAAKoQ,OAI1BkjB,GAGH/6B,EAAQ,CACZswB,KAAMA,EAAK4J,QACX1J,iBA5DuB,SAACnF,GAEnB,IAAD,EAC6BA,EAAMxI,OAA/BtN,EADJ,EACIA,KAAMvV,EADV,EACUA,MAAO6zB,EADjB,EACiBA,QACjBjE,EAAe5vB,QAASrC,EAQ5B,GALA2yB,EAAK4J,QAAL,2BACK5J,EAAK4J,SADV,kBAEG3kB,EAAOse,GAAoBjE,IAGzBA,GAAgBA,EAAa7pB,QAAW8tB,EAAS,CACpD,IAAM6G,EAAK,aAAOnK,GACZxlB,EAAQ2vB,EAAMC,QAAQplB,IACb,IAAXxK,IACF2vB,EAAME,OAAO7vB,EAAO,GACpBosB,EAAkB6C,MAAMtgC,KAAK,IAAIugC,IAAIS,QA4CzCnK,iBACAE,kBAEF,OAAI6B,EACK,kBAACzO,GAAD,CAAQH,SAAU,UAGvBklC,EAEA,kBAACL,GAAD,KACE,kBAAC39B,GAAD,CACElU,KAAMnV,EAAE,gCACRL,OAAO,aAOb,oCACE,kBAACmjC,GAAD,KACE,kBAAChO,GAAD,KACE,kBAAC,GAAD,CACE3f,KAAMnV,EAAE,8BACRgkB,UAAWhkB,EAAE,kCAEdunD,GACC,kBAAC/0B,GAAD,CACE/yB,MACEklB,EACI3kB,EAAE,6BAA8B2kB,GAChC3kB,EAAE,0BAERL,OAAQ,UAGZ,kBAACsnD,GAAD,CAAuBpyB,UAAW,SAChC,kBAAC/F,GAAsBqL,SAAvB,CAAgC17B,MAAOA,GACrC,kBAAC22B,GAAD,CACEhb,YAAU,qBACV+F,UAAU,kCAEV,kBAACgP,GAAD,CACEnb,KAAM,YACNia,MAAM,4BAER,kBAACkB,GAAD,CACEnb,KAAM,WACNia,MAAM,6BAGV,kBAACmH,GAAD,CACEhb,YAAU,QACV+F,UAAU,kCAEV,kBAACgP,GAAD,CACElB,MAAM,0BACNja,KAAM,WAGV,kBAAC+d,GAAD,CACE/d,KAAK,QACL6X,MACE,0BACE1N,wBAAyBR,GACvB3d,EACA,6BACA,CACE01B,aAKR1D,YAAY,QACZC,UAAW,YAIjB,kBAAC3O,GAAD,CACEG,cAAezjB,EAAE,iCACjBsd,QA/GgB,WACxB,IAAIkb,EAAqB,uBAAOxJ,GAAP,aAA0ByK,MACnD7D,EAAkB6C,MAAMtgC,KAAK,IAAIugC,IAAIF,KACA,IAAjCA,EAAsBh0B,OACxB4iD,GAAsB,GAEtBA,GAAsB,YChHfS,GAAwB5tC,gBAZN,WACbC,cAANla,EACR,OACI,oCACI,kBAAC2gD,GAAD,KACI,kBAACuG,GAAD,WCsBHY,GAAuB7tC,gBAxBN,WAC1B,IAAMoO,EAAqB/rB,GAAe+rB,mBACpCpR,EAAsBoR,EACtB,cACA/rB,GAAe2a,oBACrB,OACI,kBAACgsC,GAAD,CACI7oC,YAAU,yBACV+oC,mBAAoBlsC,EACpBisC,gBAAiB76B,EACjBjZ,GAAG,0BAEH,kBAAE,IAAa+qB,SAAf,CAAwB17B,MAAO0pB,GAAaI,YACxC,kBAACrJ,GAAD,MACA,kBAAC2oC,GAAD,MACA,kBAAChF,GAAD,WCmBHkF,GAAa9tC,gBA9BD,WAAO,IACpBja,EAAMka,cAANla,EACF6T,EAAWyL,eACbpjB,EAAe,IAAIyX,gBAAgBE,EAASC,QAHrB,EAIK4Q,qBAJL,mBAIpB7hB,EAJoB,KAIV2gD,EAJU,OAKuB9+B,oBAAS,GALhC,mBAKpBvR,EALoB,KAKDowC,EALC,KAMrBtnD,EAAYonD,eAclB,GAbAxnD,GAAkB4oD,IAAIxoD,EAAWC,GACjCqpB,qBAAU,WACNjpB,GAAeooD,qBAAqBh/B,WAChC,WACI69B,GAAqB,GACrB3vC,SAASiO,MACLvlB,GAAe8iB,oBAAsB,MAAQpf,EAAE,2BAEvD,SAAC+4C,GACGyK,EAAYzK,QAGrB,KACE5lC,IAAsBtQ,EACvB,OAAO,kBAACu/C,GAAD,MAEX,IAAMjlC,EAAUta,EACZ,kBAACi/C,GAAD,CAAcriD,MAAOoD,IACpB,kBAACilD,GAAD,MAEL,OAAO,oCAAG3qC,M,yFClBd,IAAM6qC,GAAWruC,IAAOC,IAAV,MAIRgqC,GAAWC,aAAe,CAC9BE,QAAS,CACPC,UAAW,CACTC,KAAM,YAGVC,UAAW,CACT+D,aAAc,CACZ7D,KAAM,CACJ3yB,SAAU,KAGd0yB,cAAe,CACbC,KAAM,CACJ3yB,SAAU,KAGd4yB,oBAAqB,CACnBx4B,MAAO,CACL4F,SAAU,QA4FH0M,aA/Bf,WACE,OACE,kBAAC,KAAD,CAAkBnnB,MAAO4sC,IACvB,kBAAC,IAAD,KACE,0BAAM5vC,KAAK,SAASmJ,QAAQ,aAE9B,kBAAC6qC,GAAD,KACE,kBAAC,KAAD,KACE,kBAAC,KAAD,KACE,kBAAC,KAAD,CAAO/hB,KAAK,gBACV,kBAACogB,GAAD,OAEF,kBAAC,KAAD,CAAOpgB,KAAMztC,EAAOQ,OAAOQ,gBACzB,kBAACitD,GAAD,OAEF,kBAAC,KAAD,CAAOxgB,KAAMztC,EAAOQ,OAAOS,YACzB,kBAACsuD,GAAD,OAEF,kBAAC,KAAD,CAAO9hB,KAAMztC,EAAOQ,OAAOE,KACzB,kBAACkqD,GAAD,OAEF,kBAAC,KAAD,KACE,kBAACkD,GAAD,cCnHM4B,QACW,cAA7Bx9B,OAAO7W,SAASs0C,UAEe,UAA7Bz9B,OAAO7W,SAASs0C,UAEhBz9B,OAAO7W,SAASs0C,SAASC,MACvB,2DCTNC,IAASC,OAAO,kBAAC,GAAD,MAAS10C,SAAS20C,eAAe,SDqH3C,kBAAmB/8C,WACrBA,UAAUg9C,cAAcC,MACrBC,MAAK,SAACC,GACLA,EAAaC,gBAEdC,OAAM,SAACppD,S","file":"static/js/main.6d7976fc.chunk.js","sourcesContent":["import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport LOCALE_CA from \"./locales/ca.json\";\nimport LOCALE_CH from \"./locales/ch.json\";\nimport LOCALE_DE from \"./locales/de.json\";\nimport LOCALE_EN from \"./locales/en.json\";\nimport LOCALE_EE from \"./locales/ee.json\";\nimport LOCALE_ES from \"./locales/es.json\";\nimport LOCALE_FI from \"./locales/fi.json\";\nimport LOCALE_FR from \"./locales/fr.json\";\nimport LOCALE_IT from \"./locales/it.json\";\nimport LOCALE_JA from \"./locales/ja.json\";\nimport LOCALE_NL from \"./locales/nl.json\";\nimport LOCALE_NO from \"./locales/no.json\";\nimport LOCALE_RO from \"./locales/ro.json\";\nimport LOCALE_RU from \"./locales/ru.json\";\nimport LOCALE_SE from \"./locales/sv.json\";\n\nconst resources = {\n ca: {\n translation: LOCALE_CA,\n },\n ch: {\n translation: LOCALE_CH,\n },\n de: {\n translation: LOCALE_DE,\n },\n ee: {\n translation: LOCALE_EE,\n },\n en: {\n translation: LOCALE_EN,\n },\n es: {\n translation: LOCALE_ES,\n },\n fi: {\n translation: LOCALE_FI,\n },\n fr: {\n translation: LOCALE_FR,\n },\n it: {\n translation: LOCALE_IT,\n },\n ja: {\n translation: LOCALE_JA,\n },\n nl: {\n translation: LOCALE_NL,\n },\n no: {\n translation: LOCALE_NO,\n },\n ro: {\n translation: LOCALE_RO,\n },\n ru: {\n translation: LOCALE_RU,\n },\n se: {\n translation: LOCALE_SE,\n },\n};\n\ni18n\n .use(initReactI18next) // passes i18n down to react-i18next\n .init({\n resources,\n lng: process.env.REACT_APP_DEFAULT_LOCALE,\n supportedLngs: [\n \"ca\",\n \"ch\",\n \"de\",\n \"ee\",\n \"en\",\n \"es\",\n \"fi\",\n \"fr\",\n \"it\",\n \"ja\",\n \"nl\",\n \"no\",\n \"ro\",\n \"ru\",\n \"se\",\n ],\n fallbackLng: \"en\",\n load: \"all\",\n interpolation: {\n escapeValue: false, // react already safes from xss\n },\n returnNull: false,\n returnEmptyString: false,\n });\n\nexport default i18n;\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport { from, Observable } from \"rxjs\";\n\nlet AxiosService: AxiosClass;\n\nclass AxiosClass {\n public request(opts: AxiosRequestConfig): Observable {\n return from(axios.request(opts));\n }\n}\n\nexport const getAxios = (): AxiosClass => {\n if (!AxiosService) {\n AxiosService = new AxiosClass();\n }\n return AxiosService;\n};\n","export interface ApiError extends GolBaseError {\n status: number;\n code: ApiErrorCode;\n data?: ApiErrorBody;\n response?: any;\n}\n\nexport interface GolBaseError {\n getMessage(): string;\n}\n\nexport interface ApiErrorBody {\n message: string;\n code?: string;\n}\n\nexport interface ApiErrorResponse {\n error: ApiErrorBody;\n}\n\nexport interface AccessApiErrorBody extends ApiErrorBody {\n partner_name: string;\n}\n\nexport enum ApiResourceCodeError {\n VoucherDetails = \"voucher_details\",\n AlreadyOnWaitingList = \"already_on_waiting_list\",\n NoMoreMenuAvailable = \"no_more_menu_available\",\n NoMenuLeft = \"no_menu_left\",\n MenuSelectionRequested = \"menu_selection_requested\",\n LimitVouchersNumber = \"limit_vouchers_number\",\n}\n\nexport enum ApiErrorCode {\n unknown = \"unknown\",\n connection_error = \"connection_error\",\n restaurant_id_missing = \"restaurant_id_missing\",\n restaurant_blank = \"restaurant_blank\",\n no_access = \"no_access\",\n access_denied = \"access_denied\",\n partnership_disabled = \"partnership_disabled\",\n partnership_not_yet_created = \"partnership_not_yet_created\",\n capture_failed = \"capture_failed\",\n bad_request = \"bad_request\",\n unfound = \"unfound\",\n resource_validation_error = \"resource_validation_error\",\n pending_booking_unfound = \"pending_booking_unfound\",\n menu_unfound = \"menu_unfound\",\n runtime_commercial_unfound = \"runtime_commercial_unfound\",\n pending_booking_creation_failed = \"pending_booking_creation_failed\",\n payment_refused = \"payment_refused\",\n setup_intent_invalid = \"setup_intent_invalid\",\n payment_intent_failed = \"payment_intent_failed\",\n stripe_customer_creation_failed = \"stripe_customer_creation_failed\",\n no_more_menu_available = \"no_more_menu_available\",\n no_menu_left = \"no_menu_left\",\n requested_area_but_capa = \"requested_area_but_capa\",\n update_from_booking_error = \"update_from_booking_error\",\n}\n\nexport interface AccessDeniedError extends ApiError {}\n\nexport enum ErrorType {\n error = \"error\",\n warning = \"warning\",\n}\n","import { StripeError } from \"@stripe/stripe-js\";\n\ndeclare global {\n interface Window {\n Cypress?: Cypress.Cypress;\n __urlToUpdateFromEmail__: string;\n }\n}\n\nexport enum CommericalAction {\n add = \"add\",\n remove = \"remove\",\n}\n\nexport enum Periods {\n lunch = \"lunch\",\n dinner = \"dinner\",\n afternoon = \"afternoon\",\n breakfast = \"breakfast\",\n brunch = \"brunch\",\n}\n\nexport interface PeriodsTranslations {\n period: string;\n translations: Array;\n}\n\nexport interface PeriodTranslations {\n locale: string;\n renamingPeriod: string;\n}\n\nexport const Gender = {\n male: 1,\n female: 2,\n male_and_female: 3,\n};\n\nexport const periodsArray: Array = Object.values(Periods);\n\nexport enum BookingState {\n initialized = \"initialized\",\n waiting = \"waiting\",\n validated = \"validated\",\n canceled = \"canceled\",\n}\n\nexport enum AvailableCommercials {\n menus = \"menus\",\n offers = \"offers\",\n}\n\nexport enum SelectionSteps {\n guests = \"guests\",\n date = \"date\",\n area = \"area\",\n period = \"period\",\n time = \"time\",\n offer = \"offer\",\n menu = \"menu\",\n}\n\nexport enum DayStatus {\n waiting = \"waiting\",\n closed = \"closed\",\n available = \"available\",\n full = \"full\",\n unavailable = \"unavailable\",\n}\n\nexport enum EngineMode {\n capacity = \"capacitive\",\n table = \"table\",\n}\n\nexport enum ButtonStyle {\n text = \"text\",\n contained = \"contained\",\n outlined = \"outlined\",\n}\n\nexport interface IStyle {\n disabled?: boolean;\n isSummary?: boolean;\n inverted?: boolean;\n}\n\nexport interface IFromStyle {\n minHeight?: string;\n}\n\nexport enum HeaderStyle {\n text = \"text\",\n contained = \"contained\",\n}\n\nexport interface DailyLightInfo {\n date: string;\n status: DayStatus;\n engine_mode: EngineMode;\n}\n\nexport interface DailyLightInfoResponse {\n daily_availabilities: Array;\n}\n\nexport interface GuestsCapacity {\n minGuests: number;\n maxGuests: number;\n}\n\nexport enum CommercialKeys {\n menus = \"menu\",\n offers = \"offer\",\n events = \"event\",\n}\n\nexport interface BaseInterface {\n object: string;\n}\n\nexport interface Area extends BaseInterface {\n id: number;\n bookable_online: boolean;\n translations: Array;\n}\n\nexport interface AreaTranslation extends BaseInterface {\n locale: string;\n name: string;\n}\n\nexport interface RestaurantBookingDetail extends BaseInterface {\n encoded_note: { [key: string]: string };\n note: { [key: string]: string };\n}\n\nexport interface Period extends BaseInterface {\n area_id?: number;\n booking_details: Array;\n date: string;\n hours: Array;\n period: Periods;\n persons: number;\n restaurant_id: number;\n restaurant_name: string;\n total_left_seats: number;\n no_hour_reason: string;\n non_bookable_event: NonBookableEvent;\n}\n\nexport interface NonBookableEvent {\n event_id: string;\n event_name: string;\n event_description: string;\n}\n\nexport interface PeriodsResponse {\n periods: Array;\n next_available_date?: string;\n message?: string;\n}\n\nexport interface PeriodsRequest {\n date: string;\n persons: number;\n restaurant_id?: number;\n area_id?: number;\n period?: Periods;\n expand?: any;\n}\n\nexport interface Hour extends BaseInterface {\n bookable_area_ids: Array;\n booking_state: \"validated\" | \"initialized\" | \"waiting\";\n event: any;\n waitingList?: boolean;\n offers: Array;\n time: string;\n has_prepayment: boolean;\n}\n\nexport interface BookingDetail extends BaseInterface {\n encoded_note: Array;\n note: Array;\n}\n\nexport interface BookingDetailTranslation {\n [key: string]: string;\n}\n\nexport interface InitialPendingBookingRequest {\n area_id?: string;\n date: string;\n hour: string;\n persons: number;\n children: number;\n restaurant_id: number;\n booking_token?: string;\n contact_info?: PendingBookingContact;\n metadata?: any;\n user_locale?: string;\n note?: string;\n}\n\nexport interface PendingBooking extends BaseInterface {\n note?: string;\n area_id?: null;\n available_commercials: Array;\n available_menus: Array;\n booking_state: BookingState;\n bookings_detail?: RestaurantBookingDetail;\n commitable: boolean;\n contact_info: PendingBookingContact;\n date: string;\n hour: string;\n id: string;\n menu_selection_requested?: boolean;\n same_number_menu?: boolean;\n metadata: any;\n event?: CommercialLight;\n offer: CommercialLight;\n opening_id?: string;\n optional: boolean;\n persons: number;\n children: number;\n prepayment: Prepayment;\n restaurant_id: number;\n selected_menus?: Array;\n user_locale?: string;\n voucher_enabled: boolean;\n allow_vouchers: boolean;\n voucher_infos?: any;\n vouchers: Array;\n country_code?: string;\n skip_prepayment_for_contact?: boolean;\n recaptchaValue?: string;\n}\n\nexport interface PendingBookingContact {\n lastname: string;\n firstname: string;\n mobile_phone: string;\n country_code: string;\n country?: string;\n address?: string;\n extra_address?: string;\n postcode?: string;\n city?: string;\n email: string;\n message?: string;\n gender?: number;\n birthday?: string;\n company?: string;\n allergies?: string;\n accept_sms_spam?: boolean;\n accept_email_spam?: boolean;\n}\nexport interface Contact extends BaseInterface {\n email: string;\n lastname: string;\n firstname: string;\n restaurant_id: number;\n}\nexport interface Booking extends BaseInterface {\n id: number;\n booking_state: BookingState;\n booked_persons_number: number;\n children_number: number | 0;\n present_persons_number: number;\n cancel_actor: null;\n cancel_reason: null;\n booking_type: string;\n note: null;\n period: Periods;\n booking_date: string;\n booking_time: string;\n booking_token: string;\n email: string;\n firstname: string;\n lastname: string;\n send_reminders: boolean;\n user_locale: string;\n metadata: any;\n contact_id: number;\n restaurant_id: number;\n waiting_rank: number;\n civility?: number;\n rr_data?: RRData;\n}\n\nexport interface Prepayment {\n client_secret: string;\n intent_id: string;\n stripe_account: any;\n kind: string;\n amount: number;\n stripe_key: string;\n payment_kind: string;\n currency: string;\n origin?: string;\n}\n\nexport interface PrepaymentInfos {\n currency: string;\n kind: string;\n parent_id: string;\n payment_kind: string;\n price: number;\n}\n\nexport interface CommercialLight extends BaseInterface {\n commercial_id: number;\n}\n\nexport interface QueryParam {\n queryParamName: string;\n queryParamValue: string;\n}\n\nexport enum CommercialsObject {\n menu = \"menu\",\n event = \"event\",\n offer = \"offer\",\n}\n\nexport interface CommercialsResponse {\n commercials: Array;\n current_page: number;\n num_pages: number;\n total_count: number;\n total_pages: number;\n}\n\nexport interface PaymentSecretResponse {\n secret: string;\n}\n\nexport interface Commercial extends BaseInterface {\n bookable: boolean;\n commercial_recurrencies: Array;\n description: string;\n end_date: string | null;\n end_time: string | null;\n has_prepayment: boolean;\n id: number;\n maximum_dishes: number;\n minimum_dishes: number;\n name: string;\n permanent: boolean;\n restaurant_id: number;\n start_date: any | null;\n start_time: string | null;\n translations: Array;\n image: string;\n prepayment?: PrepaymentInfos;\n}\n\nexport interface Menu extends Commercial {\n left: number;\n for_all_guests?: boolean;\n}\n\nexport interface CommercialTranslation extends BaseInterface {\n locale: string;\n name: string;\n description: string;\n}\n\nexport interface CommercialRecurrence extends BaseInterface {\n end_hour: string;\n month_week: number;\n start_hour: string;\n week_day: number;\n}\n\nexport interface CustomContactFormFields {\n accept_partner_spam: boolean;\n allow_blank_email: boolean;\n show_birthday: boolean;\n show_gender: boolean;\n show_company: boolean;\n show_tol_spam: boolean;\n show_address: boolean;\n show_country: boolean;\n show_sharing_friend_on_module: boolean;\n show_allergies_terms_on_module: boolean;\n}\n\nexport interface UrlParams {\n referralKey: string;\n version?: string;\n restaurantId: string;\n bookingId?: string;\n}\n\nexport interface IThemeProps {\n primaryColor?: string;\n secondaryColor?: string;\n backgroundColor?: string;\n headerBackgroundColor?: string;\n bodyBackgroundColor?: string;\n headerStyle?: HeaderStyle;\n textColor?: string;\n textColorGray?: string;\n disabledColor?: string;\n success?: string;\n buttonStyle?: ButtonStyle;\n}\n\nexport interface AdvancedOptions {\n select_only_pax_first: boolean;\n reservation_responsable_enabled: boolean;\n force_area_selection: boolean;\n hide_filter_selection: boolean;\n has_group_skipping_prepayment?: boolean;\n recaptcha_enabled?: boolean;\n}\nexport interface WaitingMessages {\n translations: Array;\n}\nexport interface WaitingMessage {\n locale: string;\n restaurant_message: string | null;\n default_message: string | null;\n}\n\nexport interface PoweredBy {\n logo: string;\n powered_by_texts: Translations;\n url: string;\n}\n\nexport interface Translations {\n translations: Array;\n}\nexport interface Translation {\n locale: string;\n text: string;\n}\n\nexport interface ModuleSettings extends BaseInterface, CustomContactFormFields {\n google_font: string;\n available_locales: Array;\n callback_url?: string | null;\n restaurant: SettingsRestaurant;\n show_powered_by: boolean;\n side_picture_url: string;\n banner_url: string;\n redirection_link: string;\n referral_key: string;\n update_from_booking: UpdateFromBooking;\n terms?: Terms;\n partner_display_name: string;\n theme: IThemeProps;\n product_name: string;\n external_partner?: ExternalPartner;\n advanced_options: AdvancedOptions;\n optional_contact_form_fields: Array;\n background_picture_url: string;\n callFromFloatingButton: boolean;\n force_area_selection?: boolean;\n waiting_messages: WaitingMessages;\n powered_by: PoweredBy;\n}\n\nexport interface ErrorMessage {\n locale: string;\n error_message: string;\n}\n\nexport interface UpdateFromBooking {\n area_id: string | null;\n booked_persons_number: number | null;\n booking_date: string | null;\n booking_time: string | null;\n children_number: number | null;\n error_message: Array;\n}\n\nexport interface ExternalPartner {\n facebook_pixel_id?: string;\n}\n\nexport interface RRData {\n title: string | undefined;\n text: string | undefined;\n}\n\nexport interface SettingsRestaurant extends BaseInterface {\n areas: Array;\n bookings_detail: RestaurantBookingDetail;\n capacity: number;\n events: Array;\n first_step: string;\n id: number;\n time_zone: string;\n imageUrl?: string;\n last_booking_date: string;\n locale: string;\n max_persons: number;\n menus: Array;\n min_persons: number;\n default_persons: number;\n name: string;\n offers: Array;\n periods: Array;\n periods_translations: Array;\n online_booking_enabled: boolean;\n allow_multi_vouchers: boolean;\n delay_before_deposit_capture: number;\n display_allergies_field: boolean;\n children?: Children;\n country_code?: string;\n}\n\nexport interface Children {\n children_management_enabled: boolean;\n children_max_age: number;\n}\n\nexport interface Terms {\n disclaimer_url: string;\n prepayment_disclaimer_url: string;\n privacy_policy_url: string;\n}\n\nexport interface IInputWithIcon {\n error: boolean;\n value: any;\n isNumeric?: boolean;\n label?: string;\n placeholderKey?: string;\n variant?: any;\n helperText?: string;\n onChange?: any;\n onClick?: any;\n icon: any;\n isSummary?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n name?: string;\n dataTest?: string;\n}\n\nexport interface ISlot {\n value: string;\n isSelected?: boolean;\n onClick?: any;\n icons?: ISlotIcons;\n}\n\nexport interface ISlotIcons {\n hasWaitingList?: boolean;\n hasOffer?: boolean;\n hasPrepayment?: boolean;\n}\n\nexport interface IDisplayPeriod {\n titleKey: string;\n hours?: Array;\n noHourReason?: string;\n nonBookableEvent?: NonBookableEvent;\n}\n\nexport interface IDisplayAvailablePeriods {\n displayPeriods: IDisplayPeriod[];\n filters: any;\n message?: string;\n}\n\nexport interface DropdownOption {\n value: any;\n displayText: string;\n isSelected?: boolean;\n}\n\nexport interface NormalizedOption extends DropdownOption {\n normalized?: string;\n}\n\nexport interface TagManagerOptions {\n first_step?: boolean;\n booking_id?: string;\n pending_booking_id?: string;\n guests?: number;\n}\n\nexport interface GolReducer {\n observeProps: Array;\n reducer: () => void;\n}\n\nexport interface GolError {\n errorMessage: Array;\n field: string;\n}\n\nexport interface GolResourceError {\n resource: string;\n errors: Array;\n}\n\nexport interface GolStripeCallbackResponse {\n stripeToken?: string;\n stripeError?: StripeError;\n}\n\nexport interface SelectedMenu extends BaseInterface {\n name: string;\n commercial_id: string;\n quantity: number;\n currency: string;\n unit_price: number;\n image?: string;\n for_all_guests?: boolean;\n}\n\nexport interface WarrantVoucher extends BaseInterface {\n name: string;\n description: string;\n status: string;\n currency: string;\n}\n\nexport interface GiftVoucher extends WarrantVoucher {\n amount: number;\n}\n\nexport interface MenuSelection {\n menuId: number;\n count: number;\n for_all_guests?: boolean;\n}\n\nexport interface SelectedOffer extends Commercial {\n isSelected: boolean;\n}\n\nexport interface Voucher {\n amount: number;\n code: string;\n description: string;\n name: string;\n status: string;\n type: string;\n voucher_type: string;\n}\n\nexport enum ExtraParams {\n pax = \"pax\",\n persons = \"persons\",\n date = \"date\",\n time = \"time\",\n locale = \"locale\",\n area_id = \"area_id\",\n note = \"note\",\n last_name = \"contact_infos[lastname]\",\n first_name = \"contact_infos[firstname]\",\n email = \"contact_infos[email]\",\n country_code = \"contact_infos[country_code]\",\n mobile_phone = \"contact_infos[mobile_phone]\",\n background_color = \"background_color\",\n hide_general_terms = \"hide_general_terms\",\n axeptio_token = \"axeptio_token\",\n ga = \"ga\",\n}\nexport interface OverwrittenParams {\n readonly pax?: string;\n readonly persons?: string;\n readonly date?: string;\n readonly time?: string;\n readonly locale?: string;\n readonly area_id?: string;\n readonly note?: string;\n readonly last_name?: string;\n readonly first_name?: string;\n readonly email?: string;\n readonly country_code?: string;\n readonly mobile_phone?: string;\n readonly background_color?: string;\n readonly hide_general_terms?: string;\n readonly axeptio_token?: string;\n readonly ga?: string;\n}\n\nexport interface ICommercialsMenuItemProps {\n menu: Menu;\n setChildLoading: (state: boolean) => void;\n}\n\nexport interface IDisabled {\n disabled?: boolean;\n}\n","export const config = {\n baseUrl: process.env.REACT_APP_IB_BASE_URL ?? \"\",\n baseApiUrl: process.env.REACT_APP_IB_API_BASE_URL ?? \"\",\n token: process.env.REACT_APP_IB_TOKEN ?? \"\",\n apiVersion: process.env.REACT_APP_API_VERSION ?? \"\",\n appPlatform: process.env.REACT_APP_PLATFORM,\n minBackendVersion: \"1.8.12_5\",\n baseImageUrl:\n \"https://s3-eu-west-1.amazonaws.com/gol-data-fr-ireland/instabook/\",\n routes: {\n base: \"/instabook/bookings\",\n url: [\n \"/instabook/bookings/:bookingId(\\\\d+)/update_from_email\",\n \"/instabook/bookings/:version(v3)?/:restaurantId(\\\\d+)/:referralKey\",\n \"/instabook/bookings/:version(v3)?/:referralKey\",\n ],\n selection: \"selection\",\n commercials: \"commercials\",\n confirmation: \"confirmation\",\n confirmationOnRefresh: \"confirmation/refresh\",\n confirmationEnd: \"confirmation/sharing\",\n floatingButton: \"/instabook/cta/:referralKey\",\n newsletter: \"/instabook/newsletter/:referralKey\",\n },\n default_language: process.env.REACT_APP_DEFAULT_LOCALE ?? \"\",\n};\n","import { AxiosError } from \"axios\";\nimport { ApiError } from \"./error-types\";\nimport {\n AccessDeniedApiErrorImpl,\n ApiErrorImpl,\n BadRequestApiErrorImpl,\n ResourceNotFoundApiErrorImpl,\n ValidationErrorApiErrorImpl,\n} from \"./api-errors-impl\";\n\nclass ApiErrorFactory {\n // Returns ApiError based given Axios error\n public getApiError(err: AxiosError): ApiError {\n if (err.response) {\n let status = err.response.status;\n switch (status) {\n case 401:\n case 403: {\n return new AccessDeniedApiErrorImpl(err);\n }\n case 400: {\n return new BadRequestApiErrorImpl(err);\n }\n case 404: {\n return new ResourceNotFoundApiErrorImpl(err);\n }\n case 422: {\n return new ValidationErrorApiErrorImpl(err);\n }\n }\n }\n return new ApiErrorImpl(err);\n }\n}\n\nlet instance: ApiErrorFactory;\n\nexport const getApiErrorFactory = (): ApiErrorFactory => {\n if (!instance) {\n instance = new ApiErrorFactory();\n }\n return instance;\n};\n","import { AxiosRequestConfig } from \"axios\";\nimport { Observable } from \"rxjs\";\nimport { catchError, map } from \"rxjs/operators\";\nimport { getAxios } from \"./axios.service\";\nimport { Endpoint } from \"../endpoints/BaseEndpoint\";\nimport { apiCatch } from \"./api-errors/api-catch\";\n\nconst Axios = getAxios();\n\nclass HttpService {\n public getParams = (params: any) => {\n let queryString = null;\n const keys = Object.keys(params);\n for (const key of keys) {\n if (queryString) {\n queryString += \"&\";\n }\n queryString = queryString\n ? queryString + key + \"=\" + params[key]\n : key + \"=\" + encodeURIComponent(params[key]);\n }\n return \"?\" + queryString;\n };\n\n public get(endPoint: Endpoint, params: any = null): Observable {\n let mergedParams = \"\";\n if (params) {\n mergedParams = this.getParams(params);\n }\n const options: AxiosRequestConfig | any = {\n store: this,\n method: \"GET\",\n url: `${endPoint.getEndpoint()}${mergedParams}`,\n headers: endPoint.getHeaders(),\n };\n return Axios.request(options).pipe(\n map((response: any) => {\n return response.data;\n }),\n catchError((err) => {\n return apiCatch(err)\n })\n );\n }\n\n public post(endPoint: Endpoint, data: any): Observable {\n const options: AxiosRequestConfig = {\n method: \"POST\",\n url: endPoint.getEndpoint(),\n headers: endPoint.getHeaders(),\n data,\n };\n return Axios.request(options).pipe(\n map((resp) => {\n return resp.data;\n }),\n catchError((err) => {\n return apiCatch(err)\n })\n );\n }\n\n public put(endPoint: Endpoint, data: any): Observable {\n const options: AxiosRequestConfig = {\n method: \"PUT\",\n url: endPoint.getEndpoint(),\n headers: endPoint.getHeaders(),\n data,\n };\n return Axios.request(options).pipe(\n map((resp) => {\n return resp.data;\n }),\n catchError((err) => {\n return apiCatch(err)\n })\n );\n }\n\n public delete(endPoint: Endpoint, data: any): Observable {\n const options: AxiosRequestConfig = {\n method: \"DELETE\",\n url: endPoint.getEndpoint(),\n headers: endPoint.getHeaders(),\n data,\n };\n return Axios.request(options).pipe(\n map((resp) => {\n return resp.data;\n }),\n catchError((err) => {\n return apiCatch(err)\n })\n );\n }\n}\n\nlet httpService: HttpService;\n\nexport const getHttpService = (): HttpService => {\n if (!httpService) {\n httpService = new HttpService();\n }\n return httpService;\n};\n","import { config } from \"../config\";\nimport { ExtraParams, OverwrittenParams, UrlParams } from \"../types\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { Moment } from \"moment\";\nimport moment from \"moment\";\n\nclass RequestParamsService {\n private _referralKey: string;\n private _restaurantId: string;\n private _version?: string;\n private _token?: string;\n private _bookingId?: string;\n private _bookingToken?: string;\n private _preview?: string;\n\n constructor(\n referralKey: string,\n restaurantId: string,\n version?: string,\n bookingId?: string,\n bookingToken?: string,\n preview?: string\n ) {\n this._referralKey = referralKey;\n this._restaurantId = restaurantId;\n this._version = version;\n this._bookingId = bookingId;\n this._bookingToken = bookingToken;\n this._preview = preview;\n }\n\n public getParams(): {\n referralKey: string;\n restaurantId: string;\n version?: string;\n bookingId?: string;\n bookingToken?: string;\n preview?: string;\n } {\n return {\n referralKey: this._referralKey,\n restaurantId: this._restaurantId,\n version: this._version,\n bookingId: this._bookingId,\n bookingToken: this._bookingToken,\n preview: this._preview,\n };\n }\n\n public getModuleToken(): string {\n return this._token || config.token;\n }\n\n public set restaurantId(restaurantId: string) {\n this._restaurantId = restaurantId;\n }\n public set referralKey(referralKey: string) {\n this._referralKey = referralKey;\n }\n}\n\nclass RequestParamsImpl {\n private _requestParamsService: RequestParamsService;\n private _overwrittenParams: OverwrittenParams;\n private _hashParams: OverwrittenParams;\n\n //!\\TODO check if params are requested\n requestParamsService(\n referralKey?: string,\n restaurantId?: string,\n version?: string\n ): RequestParamsService {\n if (!this._requestParamsService && referralKey && restaurantId) {\n this._requestParamsService = new RequestParamsService(\n referralKey,\n restaurantId,\n version\n );\n }\n return this._requestParamsService;\n }\n set(\n urlParams: UrlParams,\n searchParams?: URLSearchParams | undefined,\n hashParams?: URLSearchParams\n ) {\n let bookingToken,\n preview = undefined;\n if (searchParams !== undefined) {\n bookingToken = searchParams.get(\"booking_token\") || undefined;\n preview = searchParams.get(\"preview\") || undefined;\n }\n let referralKey = urlParams.referralKey;\n let restaurantId = urlParams.restaurantId;\n if (\n moduleSettings &&\n moduleSettings.settingsAreDefined &&\n referralKey == null\n ) {\n //!\\TODO on update_from email referal_key is not setted\n //!\\ hence if moduleSettings.settings == {}\n //!\\ moduleSetting.getReferralKey may since settings.referak_key is undefined\n referralKey = moduleSettings.getReferralKey();\n restaurantId = moduleSettings.getRestaurantId();\n }\n this._overwrittenParams = this.buildOverwrittenParams(searchParams);\n if (hashParams) {\n this._hashParams = this.buildHashParams(hashParams);\n }\n this._requestParamsService = new RequestParamsService(\n referralKey,\n restaurantId,\n urlParams.version,\n urlParams.bookingId,\n bookingToken,\n preview\n );\n }\n\n get requestParams(): {\n referralKey: string;\n restaurantId: string;\n version?: string;\n bookingId?: string;\n bookingToken?: string;\n preview?: string;\n } {\n return this.requestParamsService().getParams();\n }\n\n set restaurantId(restaurantIdValue: string) {\n this.requestParamsService().restaurantId = restaurantIdValue;\n }\n\n set referralKey(referralKeyValue: string) {\n this.requestParamsService().referralKey = referralKeyValue;\n }\n\n overwrittenPax(): number | undefined {\n let paxNumber: number | undefined = undefined;\n if (this._hashParams?.pax) {\n paxNumber = Number(this._hashParams.pax);\n } else if (this._overwrittenParams?.pax) {\n paxNumber = Number(this._overwrittenParams?.pax);\n } else if (this._overwrittenParams?.persons) {\n paxNumber = Number(this._overwrittenParams.persons);\n }\n return paxNumber\n ? Number.isNaN(paxNumber)\n ? undefined\n : paxNumber\n : undefined;\n }\n\n overwrittenNote(): string | undefined {\n return this._overwrittenParams.note;\n }\n\n //!\\moment is tz\n //ex: Fri Jul 01 2022 00:00:00 GMT+0200\n overwrittenDate(): Moment | undefined {\n let date = undefined;\n\n if (this._hashParams?.date) {\n date = this._hashParams.date;\n } else if (this._overwrittenParams?.date) {\n date = this._overwrittenParams?.date;\n }\n let parsedMoment = date ? moment(date) : undefined;\n return parsedMoment?.isValid() ? parsedMoment : undefined;\n }\n\n overwrittenLocale(): string | undefined {\n return this._overwrittenParams\n ? this.getLocaleForOverwrittenParams()\n : undefined;\n }\n\n getLocaleForOverwrittenParams(): string | undefined {\n let _locale = this._overwrittenParams.locale?.toLocaleLowerCase();\n if (_locale === \"et\") {\n return \"ee\";\n }\n if (_locale === \"jp\") {\n return \"ja\";\n }\n return _locale;\n }\n\n overwrittenArea(): string | undefined {\n return this._overwrittenParams\n ? this._overwrittenParams.area_id\n : undefined;\n }\n\n overwrittenTime(): string | undefined {\n if (this._hashParams?.time) {\n return this._hashParams.time;\n }\n if (this._overwrittenParams?.time) {\n return this._overwrittenParams?.time;\n }\n return undefined;\n }\n\n overwrittenFirstName(): string | undefined {\n if (this._hashParams?.first_name) {\n return this._hashParams.first_name;\n }\n if (this._overwrittenParams?.first_name) {\n return this._overwrittenParams?.first_name;\n }\n return undefined;\n }\n\n overwrittenLastName(): string | undefined {\n if (this._hashParams?.last_name) {\n return this._hashParams.last_name;\n }\n if (this._overwrittenParams?.last_name) {\n return this._overwrittenParams?.last_name;\n }\n return undefined;\n }\n\n overwrittenEmail(): string | undefined {\n if (this._hashParams?.email) {\n return this._hashParams.email;\n }\n if (this._overwrittenParams?.email) {\n return this._overwrittenParams?.email;\n }\n return undefined;\n }\n\n overwrittenCountryCode(): string | undefined {\n if (this._hashParams?.country_code) {\n return this._hashParams.country_code;\n }\n if (this._overwrittenParams?.country_code) {\n return this._overwrittenParams?.country_code;\n }\n return undefined;\n }\n\n overwrittenMobilePhone(): string | undefined {\n if (this._hashParams?.mobile_phone) {\n return this._hashParams.mobile_phone;\n }\n if (this._overwrittenParams?.mobile_phone) {\n return this._overwrittenParams?.mobile_phone;\n }\n return undefined;\n }\n\n overwrittenBackgroundColor(): string | undefined {\n return this._overwrittenParams?.background_color\n ? this._overwrittenParams.background_color\n : undefined;\n }\n\n overwrittenHideGeneralTerms(): boolean {\n return this._overwrittenParams?.hide_general_terms === \"true\";\n }\n\n computeSearchQueryForOverwrittenParams(): string | undefined {\n let searchQuery: string | undefined;\n let _this = this;\n type ObjectKey = keyof typeof _this._overwrittenParams;\n Object.entries(ExtraParams).forEach((enumEntry) => {\n const key = enumEntry[0];\n const value = enumEntry[1];\n const extraParamsKey = key as ObjectKey;\n const info = _this._overwrittenParams[extraParamsKey];\n if (info) {\n searchQuery\n ? (searchQuery += `&${value}=${info}`)\n : (searchQuery = `?${value}=${info}`);\n }\n });\n return searchQuery;\n }\n\n buildOverwrittenParams(\n searchParams?: URLSearchParams | undefined\n ): OverwrittenParams {\n let overwrittenParams: OverwrittenParams = {} as OverwrittenParams;\n if (searchParams !== undefined) {\n Object.entries(ExtraParams).forEach((enumEntry) => {\n const key = enumEntry[0];\n const value = enumEntry[1];\n let searchValue = searchParams!.get(value);\n if (searchValue !== null) {\n overwrittenParams = overwrittenParams\n ? {\n ...overwrittenParams,\n [key]: searchValue,\n }\n : { [key]: searchValue };\n }\n });\n }\n return overwrittenParams;\n }\n\n buildHashParams(hashParams: URLSearchParams): OverwrittenParams {\n let overwrittenParams: OverwrittenParams = {} as OverwrittenParams;\n Object.entries(ExtraParams).forEach((enumEntry) => {\n const key = enumEntry[0];\n const value = enumEntry[1];\n let searchValue = hashParams!.get(value);\n if (searchValue !== null) {\n overwrittenParams = {\n ...overwrittenParams,\n [key]: searchValue,\n };\n }\n });\n return overwrittenParams;\n }\n}\n\nexport const requestParamsImpl = new RequestParamsImpl();\n","import { requestParamsImpl } from \"../services/request-params.service\";\nimport { config } from \"../config\";\n\nexport const buildRouteWithParams = (\n route: string,\n displayQuery: boolean = true\n): string => {\n const { referralKey, restaurantId, version, bookingToken, bookingId } =\n requestParamsImpl.requestParams;\n let baseApiUrl = version\n ? `${config.routes.base}/${version}`\n : config.routes.base;\n let redirectUrl = `${baseApiUrl}`;\n if (restaurantId) {\n redirectUrl += `/${restaurantId}`;\n }\n redirectUrl += `/${referralKey}/${route}`;\n // if (displayQuery && bookingToken && bookingId) {\n // redirectUrl += `?booking_token=${bookingToken}&booking_id=${bookingId}`;\n // }\n\n let searchQuery = requestParamsImpl.computeSearchQueryForOverwrittenParams();\n if (searchQuery && displayQuery && config.routes.selection === route)\n redirectUrl += `${searchQuery}`;\n return redirectUrl;\n};\n","import i18n from \"../../i18n\";\nimport { AxiosError } from \"axios\";\nimport {\n AccessApiErrorBody,\n AccessDeniedError,\n ApiError,\n ApiErrorResponse,\n ApiErrorBody,\n ApiErrorCode,\n ErrorType,\n GolBaseError,\n ApiResourceCodeError,\n} from \"./error-types\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\nimport { config } from \"../../config\";\n\nexport class ApiErrorImpl implements ApiError, GolBaseError {\n response?: any;\n status: number;\n code: ApiErrorCode;\n data?: ApiErrorBody;\n\n constructor(error: AxiosError) {\n this.response = error.response;\n this.code = ApiErrorCode.unknown;\n this.status = -1;\n\n if (error.response) {\n this.status = error.response.status;\n this.data = error.response.data?.error;\n let errorCode = this.data?.code;\n if (errorCode) {\n this.code =\n ApiErrorCode[errorCode as keyof typeof ApiErrorCode] ??\n ApiErrorCode.unknown;\n }\n }\n }\n\n getRedirectPath() {\n return buildRouteWithParams(config.routes.selection, false);\n }\n\n getErrorType() {\n return ErrorType.error;\n }\n\n getMessage() {\n return i18n.t(this.getMessagKey());\n }\n\n getMessagKey() {\n switch (this.code) {\n case ApiErrorCode.restaurant_blank:\n case ApiErrorCode.restaurant_id_missing: {\n return `instabook.errors.connection_error`;\n }\n default: {\n return `instabook.errors.${this.code}`;\n }\n }\n }\n}\n\nexport class ValidationErrorApiErrorImpl extends ApiErrorImpl {\n public _transKey: string = \"invalid_data\";\n\n set transKey(key: string) {\n this._transKey = key;\n }\n\n get transKey(): string {\n return this._transKey;\n }\n\n getMessagKey() {\n let errorKey = this.getResourcesInError()[0];\n if (errorKey === \"code\") {\n errorKey = this.code;\n }\n\n switch (errorKey) {\n case ApiResourceCodeError.AlreadyOnWaitingList: {\n return this.response.data?.error[errorKey][0];\n }\n case ApiResourceCodeError.NoMoreMenuAvailable:\n case ApiResourceCodeError.NoMenuLeft:\n case ApiResourceCodeError.MenuSelectionRequested: {\n return this.response.data?.error.menu[0];\n }\n case ApiResourceCodeError.VoucherDetails: {\n return this.response.data?.error.voucher_details[0];\n }\n default: {\n return `instabook.errors.${this.transKey}`;\n }\n }\n }\n\n getVoucherDetailsError(): String | undefined {\n if (\n this.getResourcesInError().includes(ApiResourceCodeError.VoucherDetails)\n ) {\n return ApiResourceCodeError.VoucherDetails;\n } else if (\n this.getResourcesInError().includes(\n ApiResourceCodeError.LimitVouchersNumber\n )\n ) {\n return ApiResourceCodeError.LimitVouchersNumber;\n }\n return undefined;\n }\n\n getResourcesInError(): Array {\n if (this.data) {\n return Object.keys(this.data);\n }\n return [];\n }\n\n getRedirectPath() {\n if (\n [\n ApiErrorCode.capture_failed,\n ApiErrorCode.payment_refused,\n ApiErrorCode.setup_intent_invalid,\n ApiErrorCode.stripe_customer_creation_failed,\n ].includes(this.code)\n ) {\n return buildRouteWithParams(config.routes.confirmation);\n } else if (ApiErrorCode.no_menu_left === this.code) {\n return buildRouteWithParams(config.routes.commercials);\n } else {\n let resources = this.getResourcesInError();\n if (resources.includes(\"contact_info\")) {\n return buildRouteWithParams(config.routes.confirmation);\n }\n }\n return buildRouteWithParams(config.routes.selection);\n }\n}\nexport class ResourceNotFoundApiErrorImpl extends ApiErrorImpl {\n getMessagKey() {\n switch (this.code) {\n case ApiErrorCode.menu_unfound: {\n return \"menu unfound\";\n }\n case ApiErrorCode.runtime_commercial_unfound: {\n return \"instabook.errors.runtime_commercial_unfound\";\n }\n case ApiErrorCode.restaurant_blank: {\n return `instabook.errors.connection_error`;\n }\n default: {\n return `instabook.errors.session_expired`;\n }\n }\n }\n\n getRedirectPath() {\n switch (this.code) {\n case ApiErrorCode.runtime_commercial_unfound:\n return buildRouteWithParams(config.routes.commercials);\n default:\n return super.getRedirectPath();\n }\n }\n}\n\nexport class BadRequestApiErrorImpl extends ApiErrorImpl {\n constructor(error: AxiosError) {\n super(error);\n this.code = ApiErrorCode.bad_request;\n }\n\n getMessagKey() {\n switch (this.data?.code) {\n case ApiErrorCode.pending_booking_creation_failed: {\n return i18n.t(`instabook.errors.error`);\n }\n default: {\n if (this.response.data.error.message) {\n return this.response.data.error.message;\n }\n return `instabook.errors.error`;\n }\n }\n }\n}\n\nexport class AccessDeniedApiErrorImpl\n extends ApiErrorImpl\n implements AccessDeniedError\n{\n getMessage() {\n if (this.isPartnerNameNeeded()) {\n return i18n.t(this.getMessagKey(), { partner_name: this.partnerName() });\n }\n return super.getMessage();\n }\n\n partnerName() {\n return (this.data as AccessApiErrorBody)?.partner_name ?? \"\";\n }\n\n isPartnerNameNeeded() {\n return (\n this.code === ApiErrorCode.access_denied ||\n this.code === ApiErrorCode.partnership_disabled ||\n this.code === ApiErrorCode.partnership_not_yet_created\n );\n }\n}\n\nexport class RuntimeErrorImpl extends Error implements GolBaseError {\n constructor() {\n super();\n this.message = i18n.t(\n \"instabook.messages.booking_not_available_for_people_table_engine\"\n );\n }\n\n getRedirectPath() {\n return buildRouteWithParams(config.routes.selection);\n }\n getMessage() {\n return this.message;\n }\n\n getErrorType() {\n return ErrorType.warning;\n }\n}\n\nexport class UpdateFromBookingErrorImpl implements ApiError, GolBaseError {\n status: number;\n code: ApiErrorCode;\n message: string;\n\n constructor(message: string) {\n this.status = 422;\n this.code = ApiErrorCode.update_from_booking_error;\n this.message = message;\n }\n\n getMessage() {\n return this.message;\n }\n\n getErrorType() {\n return ErrorType.error;\n }\n}\n\nexport class SetupIntentApiErrorImpl extends ApiErrorImpl {\n getMessagKey() {\n return \"instabook.errors.refresh_on_payment\";\n }\n\n getRedirectPath() {\n return buildRouteWithParams(config.routes.selection);\n }\n}\n","import { Observable } from \"rxjs/internal/Observable\";\nimport { getApiErrorFactory } from \"./factory\";\n\nexport const apiCatch = (err: any) => {\n const apiError = getApiErrorFactory().getApiError(err)\n return new Observable((observer) => {\n observer.error(apiError);\n observer.complete();\n });\n}\n","import { config } from \"../config\";\nimport { QueryParam } from \"../types\";\nimport { requestParamsImpl } from \"../services/request-params.service\";\n\nconst apiBase = config.baseApiUrl;\n\nexport class Endpoint {\n public base: string;\n public endPoint: string;\n public queryParams?: Array | null;\n\n constructor(\n endPoint: string,\n base: string = apiBase,\n queryParams?: Array\n ) {\n this.base = base;\n this.endPoint = endPoint;\n this.queryParams = queryParams ?? null;\n }\n\n public setQueryParams(queryParams: Array) {\n this.queryParams = queryParams;\n }\n\n public getEndpoint() {\n let endpoint = `${this.base}/${config.apiVersion}/${this.endPoint}`;\n if (this.queryParams && this.queryParams.length !== 0) {\n endpoint +=\n \"?\" +\n this.queryParams\n .map(\n (queryParam: QueryParam) =>\n `${queryParam.queryParamName}=${queryParam.queryParamValue}`\n )\n .join(\"&\");\n }\n return endpoint;\n }\n\n public getHeaders() {\n const requestParamsService = requestParamsImpl.requestParamsService();\n const { referralKey } = requestParamsService.getParams();\n const headers: { [key: string]: string } = {\n \"X-Token\": requestParamsService.getModuleToken(),\n \"Content-Type\": \"application/json\",\n };\n if (referralKey !== undefined) {\n headers[\"Referral-Key\"] = referralKey;\n }\n return headers;\n }\n}\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class SettingsEndpoint extends Endpoint {\n constructor() {\n super(\"module_settings\");\n }\n}\n","import i18n from \"../i18n\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { selectionStore } from \"../stores/selection.store\";\nimport { DropdownOption, GuestsCapacity } from \"../types\";\nimport { requestParamsImpl } from \"./request-params.service\";\n\nclass SelectionGuestsService {\n static service: SelectionGuestsService | undefined;\n private _guestsCapacity: GuestsCapacity | undefined;\n static get(): SelectionGuestsService {\n if (!this.service) {\n this.service = new SelectionGuestsService();\n }\n return this.service!;\n }\n\n get guestsCapacity(): GuestsCapacity {\n return (\n this._guestsCapacity ||\n (this._guestsCapacity = moduleSettings.getCapacity())\n );\n }\n\n setDefaultSelectedGuest() {\n const _isUpdateFromBooking = moduleSettings.isUpdateFromBooking;\n if (!moduleSettings.selectOnlyPaxFirst || _isUpdateFromBooking) {\n const overwrittenPax = requestParamsImpl.overwrittenPax();\n if (overwrittenPax) {\n selectionStore.guests = overwrittenPax;\n } else {\n const booked_persons_number =\n (_isUpdateFromBooking &&\n moduleSettings.settings.update_from_booking\n .booked_persons_number) ||\n 0;\n const children_number =\n (moduleSettings.isUpdateFromBooking &&\n moduleSettings.settings.update_from_booking?.children_number) ||\n 0;\n selectionStore.children = children_number > 0 ? children_number : 0;\n selectionStore.guests =\n booked_persons_number > 0\n ? booked_persons_number - selectionStore.children\n : moduleSettings.defaultPersons || this.guestsCapacity.minGuests;\n }\n }\n }\n\n setDefaultSelectedGuestWhenChildren() {\n if (selectionStore.children > 0 && selectionStore.guests == 0) {\n selectionStore.guests = 1;\n }\n }\n\n guestsDropdownOption(): Array {\n const childrenManagementEnabled = moduleSettings.childrenManagementEnabled;\n let options: Array = [];\n for (\n let i = childrenManagementEnabled ? 1 : this.guestsCapacity.minGuests;\n i <= this.guestsCapacity.maxGuests;\n i++\n ) {\n options.push({\n value: `${i}`,\n displayText: `${i}`,\n isSelected: i === selectionStore.guests,\n });\n }\n return options;\n }\n\n maxChildrenAge(): string {\n return (\n \"(< \" +\n moduleSettings.childrenMaxAge +\n \" \" +\n i18n.t(\"instabook.common.years\") +\n \")\"\n );\n }\n\n setTypeOfGuestToPlaceholder(type: string): string {\n switch (type) {\n case \"adults\":\n return i18n.t(\"instabook.bookings.adults\");\n case \"children\":\n return i18n.t(\"instabook.bookings.children\", {\n max_children_age: this.maxChildrenAge(),\n });\n default:\n return i18n.t(\"instabook.bookings.persons\");\n }\n }\n\n setSelectedGuestsToString(\n selectedGuests: number,\n type: string = \"persons\"\n ): string {\n switch (selectedGuests) {\n case 0:\n return \"\";\n default:\n return (\n selectedGuests +\n \" \" +\n this.setTypeOfGuestsToString(selectedGuests, type)\n );\n }\n }\n\n setTypeOfGuestsToString(selectedGuests: number, type: string): string {\n switch (type) {\n case \"adults\":\n return selectedGuests > 1\n ? i18n.t(\"instabook.common.adults\")\n : i18n.t(\"instabook.common.adult\");\n case \"children\":\n const _typeOfGuests =\n selectedGuests > 1\n ? i18n.t(\"instabook.common.children\")\n : i18n.t(\"instabook.common.child\");\n return _typeOfGuests + \" \" + this.maxChildrenAge();\n default:\n return selectedGuests > 1\n ? i18n.t(\"instabook.common.people\")\n : i18n.t(\"instabook.common.person\");\n }\n }\n}\n\nexport default SelectionGuestsService.get();\n","import moment, { Moment } from \"moment\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { selectionStore } from \"../stores/selection.store\";\nimport { requestParamsImpl } from \"./request-params.service\";\n\nclass SelectionCalendarDate {\n static service: SelectionCalendarDate | undefined;\n static get(): SelectionCalendarDate {\n if (!this.service) {\n this.service = new SelectionCalendarDate();\n }\n return this.service!;\n }\n\n computeDefaultDate(): Moment | undefined {\n const bookingDate = moduleSettings.bookingDate;\n const overwrittenDate = requestParamsImpl.overwrittenDate();\n return bookingDate\n ? bookingDate\n : overwrittenDate\n ? overwrittenDate\n : undefined;\n }\n setDefaultDate() {\n let defaultDate: Moment | undefined = this.computeDefaultDate();\n selectionStore.date = defaultDate;\n selectionStore.calendarDate = defaultDate\n ? defaultDate\n : moment().startOf(\"month\");\n }\n computeDefaultTime(): string | undefined {\n const bookingTime = moduleSettings.bookingTime;\n const overwrittenTime = requestParamsImpl.overwrittenTime();\n return bookingTime\n ? bookingTime\n : overwrittenTime\n ? overwrittenTime\n : undefined;\n }\n setDefaultTime() {\n let defaultTime: string | undefined = this.computeDefaultTime();\n if(defaultTime) {\n selectionStore.time = defaultTime;\n }\n }\n}\n\nexport default SelectionCalendarDate.get();\n","import moment from \"moment\";\nimport {\n EngineMode,\n MenuSelection,\n SelectedOffer,\n SelectionSteps,\n} from \"../types\";\nimport { Subject } from \"rxjs\";\nimport selectionGuestsService from \"../services/selection-guests-service\";\nimport selectionCalendarDateService from \"../services/selection-calendar-date.service\";\nimport { requestParamsImpl } from \"../services/request-params.service\";\nimport { moduleSettings } from \"./module-settings.store\";\n\nrequire(\"moment/min/locales.min\");\n\nclass SelectionStore {\n private _date: moment.Moment | undefined;\n private _calendarDate: moment.Moment = moment().startOf(\"month\");\n private _time: string = \"\";\n private _guests: number = 0;\n private _children: number = 0;\n private _period: string | null = null;\n private _area: string | null = null;\n private _selectedMenus: Array = [];\n private _menusCount: number = 0;\n private _selectedOffer: SelectedOffer | null = null;\n private _backButtonClicked: boolean = false;\n public selectedOfferChanged: Subject = new Subject();\n\n public resetStore() {\n selectionGuestsService.setDefaultSelectedGuest();\n\n //!\\ reset -this.date, this.calendar\n selectionCalendarDateService.setDefaultDate();\n selectionCalendarDateService.setDefaultTime();\n\n this.setDefaultAreaId();\n\n this.time = \"\";\n this.period = null;\n this.selectedOffer = null;\n this.selectedMenus = [];\n this.menusCount = 0;\n }\n\n public computeDefaultAreaId(): string | null {\n const areaId = moduleSettings.areaId;\n const overwrittenArea = requestParamsImpl.overwrittenArea();\n return areaId ? areaId : overwrittenArea ? overwrittenArea : null;\n }\n\n public setDefaultAreaId() {\n this.area = this.computeDefaultAreaId();\n }\n\n public get guests(): number {\n return this._guests;\n }\n\n public set guests(guestNumber: number) {\n this._guests = guestNumber;\n }\n\n public get children(): number {\n return this._children;\n }\n\n public set children(childrenNumber: number) {\n this._children = childrenNumber;\n }\n\n public get date(): moment.Moment | undefined {\n return this._date;\n }\n\n public set date(newDate: moment.Moment | undefined) {\n this._date = newDate;\n }\n\n public get time() {\n return this._time;\n }\n\n public set time(newTime: string) {\n this._time = newTime;\n }\n\n public set selectedOffer(offer: SelectedOffer | null) {\n this._selectedOffer = offer;\n this.selectedOfferChanged.next(offer);\n }\n\n public get selectedOffer(): SelectedOffer | null {\n return this._selectedOffer;\n }\n\n public addOffer(offer: SelectedOffer) {\n if (this.selectedOffer) {\n this.selectedOffer.isSelected = false;\n }\n offer.isSelected = true;\n this.selectedOffer = offer;\n }\n\n public removeOffer() {\n if (this.selectedOffer) {\n this.selectedOffer.isSelected = false;\n }\n this.selectedOffer = null;\n }\n\n public set selectedMenus(menus: Array) {\n this._selectedMenus = menus;\n }\n\n public get selectedMenus(): Array {\n return this._selectedMenus;\n }\n\n public updateSelectedMenus(changedMenuId: number, newQuantity: number) {\n const index = this._selectedMenus.findIndex(\n (menu: MenuSelection) => menu.menuId === changedMenuId\n );\n if (index !== -1) {\n this._selectedMenus[index].count = newQuantity;\n this.menusCount = this._selectedMenus.reduce(\n (prev: number, curr: MenuSelection) => {\n return prev + curr.count;\n },\n 0\n );\n }\n }\n\n public get menusCount(): number {\n return this._menusCount;\n }\n\n public set menusCount(newMenusCount: number) {\n this._menusCount = newMenusCount;\n }\n\n public set period(selectedPeriod: string | null) {\n this._period = selectedPeriod;\n }\n\n public get period(): string | null {\n return this._period;\n }\n\n public set area(selectedArea: string | null) {\n this._area = selectedArea;\n }\n\n public get area(): string | null {\n return this._area;\n }\n\n public resetSelectedArea(engineMode: EngineMode) {\n if (EngineMode.capacity === engineMode) {\n this.area = null;\n }\n }\n\n public updateCalendateDate(numberOfMonthToAdd: number) {\n let newCalendarDate = this.calendarDate\n .clone()\n .add(numberOfMonthToAdd, \"months\")\n .startOf(\"month\");\n if (this.calendarDate !== newCalendarDate) {\n this.calendarDate = moment(newCalendarDate);\n }\n }\n\n public updateDate(momentDate: any) {\n if (this.date?.format(\"D MMMM YYYY\") !== momentDate.format(\"D MMMM YYYY\")) {\n this.date = momentDate;\n }\n }\n\n public get calendarDate(): moment.Moment {\n return this._calendarDate;\n }\n\n public set calendarDate(newDate: moment.Moment) {\n this._calendarDate = newDate;\n }\n\n public get backButtonClicked(): boolean {\n return this._backButtonClicked;\n }\n\n public set backButtonClicked(isClicked) {\n this._backButtonClicked = isClicked;\n }\n\n //TODO see with fred is still needed\n public clearStep(currentStep: SelectionSteps) {\n switch (currentStep) {\n case SelectionSteps.guests:\n this.guests = 0;\n this.children = 0;\n break;\n case SelectionSteps.date:\n this.date = moment().subtract(1, \"days\");\n break;\n case SelectionSteps.time:\n this.time = \"\";\n break;\n default:\n break;\n }\n }\n\n //TODO to see with fred\n //selectionCalendarDateService with now reset calendarDate also\n public resetDate() {\n this.date = moment(null);\n this.time = \"\";\n }\n}\n\nexport const selectionStore = new SelectionStore();\n","import i18n from \"../i18n\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { getLanguageSwitcherService } from \"./language-switcher.service\";\nimport { requestParamsImpl } from \"./request-params.service\";\n\nconst localStorageKeys = {\n preferredLanguage: \"329491-hnbvch-sa7rf8-ans75j-3mc8hs-language\",\n selection: \"snhudo-sadnh2-3897hb-u9ochn-02879f-selection\",\n};\n\nclass LocalStorageService {\n public initLocalLanguage(defaultLocale: string) {\n const availables_locales =\n moduleSettings?.settings.available_locales || i18n.options.supportedLngs;\n\n const _navigatorLanguage = availables_locales.includes(\n navigator.language.slice(0, 2)\n )\n ? navigator.language.slice(0, 2)\n : \"\";\n i18n.changeLanguage(\n getLanguageSwitcherService().localeForCountryCode(\n this.preferredLanguageCookie || _navigatorLanguage || defaultLocale\n )\n );\n }\n\n //!\\if a preferredLanguageCookie is present\n //the restaurantLocale will get overwritten\n setDefaultLocalLanguage() {\n const overwrittenLocale: string | undefined =\n requestParamsImpl.overwrittenLocale();\n const countries = getLanguageSwitcherService().switcherData(\n i18n.options.supportedLngs!\n );\n overwrittenLocale &&\n countries.includes(\n getLanguageSwitcherService().countryCodeForLocale(overwrittenLocale)\n )\n ? i18n.changeLanguage(overwrittenLocale!)\n : this.initLocalLanguage(moduleSettings.getDefaultLocale());\n }\n\n public get preferredLanguageCookie(): string {\n try {\n return (\n localStorage\n .getItem(localStorageKeys.preferredLanguage)\n ?.toLowerCase() || \"\"\n );\n } catch (error) {\n return \"\";\n }\n }\n\n public set preferredLanguageCookie(value: string) {\n try {\n localStorage.setItem(localStorageKeys.preferredLanguage, value);\n } catch {}\n }\n}\n\nlet localStorageService: LocalStorageService;\n\nexport const getLocalStorageService = (): LocalStorageService => {\n if (!localStorageService) {\n localStorageService = new LocalStorageService();\n }\n return localStorageService;\n};\n","export const assignProps = (target: any, source: any): any => {\n Object.keys(source).forEach((key, index) => {\n if (source[key] !== undefined) {\n target[key] = source[key];\n }\n });\n return target;\n};\n\nexport const numberFormat = (\n locale: string,\n value: number,\n currencyFormat: string\n) =>\n new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currencyFormat,\n }).format(value);\n\nexport const capitalize = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.slice(1);\n};\n","import { Menu } from \"src/types\";\n\nclass CommercialsStore {\n private _events: Array = [];\n private _offers: Array = [];\n private _menus: Array = [];\n\n public get menus(): Array {\n return this._menus;\n }\n\n public get forAllGuestsMenus(): Array {\n return this._menus.filter(menu => menu.for_all_guests === true);\n }\n\n public get individualMenus(): Array {\n return this._menus.filter(menu => menu.for_all_guests !== true);\n }\n\n public set menus(menus: Array) {\n this._menus = menus;\n }\n\n public get offers(): Array {\n return this._offers;\n }\n\n public set offers(offers: Array) {\n this._offers = offers;\n }\n\n public get events(): Array {\n return this._events;\n }\n\n public set events(events: Array) {\n this._events = events;\n }\n}\n\nexport const commercialsStore = new CommercialsStore();\n","import {\n BookingState,\n Menu,\n PendingBooking,\n PendingBookingContact,\n Prepayment,\n SelectedMenu,\n} from \"../types\";\nimport { loadStripe } from \"@stripe/stripe-js/pure\";\nimport { Stripe } from \"@stripe/stripe-js\";\nimport i18n from \"../i18n\";\nimport { numberFormat } from \"../utils\";\nimport { moduleSettings } from \"./module-settings.store\";\nimport { getLanguageSwitcherService } from \"../services/language-switcher.service\";\nimport moment from \"moment\";\nimport { commercialsStore } from \"./commercials.store\";\nimport { selectionStore } from \"./selection.store\";\nclass PendingBookingStore {\n private _pendingBooking: PendingBooking = {} as PendingBooking;\n private _stripeToken?: string | null | undefined;\n private _acceptTerms: boolean = false;\n private _acceptAllergiesTerms: boolean = false;\n\n set acceptAllergiesTerms(accept: boolean) {\n this._acceptAllergiesTerms = accept;\n }\n\n get acceptAllergiesTerms() {\n return this._acceptAllergiesTerms;\n }\n\n set acceptTerms(accept: boolean) {\n this._acceptTerms = accept;\n }\n\n get acceptTerms() {\n return this._acceptTerms;\n }\n\n set pendingBooking(newPendingBooking: PendingBooking) {\n this._pendingBooking = newPendingBooking;\n }\n\n get persons(): number {\n return this.pendingBooking.persons;\n }\n\n get children(): number {\n return this.pendingBooking.children;\n }\n\n resetBookingState() {\n this.pendingBooking.booking_state = BookingState.validated;\n }\n\n get bookingState(): string | undefined {\n if (this.pendingBooking) {\n return this.pendingBooking.booking_state;\n }\n return undefined;\n }\n\n public isWaitingState(): Boolean {\n if (this && this.pendingBooking && this.bookingState) {\n return this.bookingState === BookingState.waiting;\n }\n return false;\n }\n set note(noteInfo: string) {\n this.pendingBooking.note = noteInfo;\n }\n\n set stripeToken(token: string | null | undefined) {\n this._stripeToken = token;\n }\n\n get stripeToken(): string | null | undefined {\n return this._stripeToken;\n }\n\n get stripePromise(): PromiseLike | undefined {\n let prepayment = this.pendingBooking.prepayment;\n if (prepayment) {\n if (prepayment.stripe_account !== null) {\n let stripeAccountInfo = {\n stripeAccount: prepayment.stripe_account,\n };\n return loadStripe(\n this.pendingBooking.prepayment.stripe_key,\n stripeAccountInfo\n );\n } else {\n return loadStripe(this.pendingBooking.prepayment.stripe_key);\n }\n }\n }\n\n get pendingBooking(): PendingBooking {\n return this._pendingBooking;\n }\n\n get pendingBookingContact(): PendingBookingContact {\n return this._pendingBooking.contact_info;\n }\n\n set pendingBookingContact(contactInfo: PendingBookingContact) {\n this._pendingBooking.contact_info = contactInfo;\n }\n\n public getPendingBookingMessage(lang: string): string | null {\n const locale = getLanguageSwitcherService().golLocaleFromSwitcher(lang);\n const localeRestaurant = moduleSettings.getDefaultLocale();\n const note =\n this._pendingBooking.bookings_detail?.encoded_note ??\n this._pendingBooking.bookings_detail?.note ??\n null;\n if (note) {\n const _note = note[locale] || note[localeRestaurant] || note[\"en\"];\n return decodeURIComponent(_note);\n }\n return null;\n }\n\n public get prepayment(): Prepayment {\n return this._pendingBooking.prepayment;\n }\n\n public set prepayment(prepayment: Prepayment) {\n this._pendingBooking.prepayment = prepayment;\n }\n\n public getPendingBookingPrepaymentKind(): string {\n let paymentKind = this.prepayment.payment_kind;\n return paymentKind === \"guarantee\" ? \"deposit\" : \"down_payment\";\n }\n\n public getPendingBookingPrepaymentCurrency(): string {\n return this.prepayment.currency;\n }\n\n public getPrepaymentPriceWithPrecision(): number | undefined {\n if (!this.prepayment?.amount) {\n return 0;\n }\n let amount = this.prepayment.amount;\n if (amount) {\n return amount / 100;\n }\n }\n\n public getIsVoucherEnabled(): boolean {\n return this._pendingBooking.voucher_enabled;\n }\n\n public getIsVoucherAllowed(): boolean {\n return this._pendingBooking.allow_vouchers ?? true;\n }\n\n public getBookingState(): BookingState {\n return this._pendingBooking.booking_state;\n }\n\n public get prepaymentInfo(): string | undefined {\n if (!this.prepayment) {\n return;\n }\n let priceWithPrecision = this.getPrepaymentPriceWithPrecision();\n if (priceWithPrecision) {\n let priceAndCurrency = numberFormat(\n i18n.language,\n priceWithPrecision,\n this.getPendingBookingPrepaymentCurrency()\n );\n const delay = moduleSettings.delayBeforeDepositCapture;\n const daysToRemove = Math.floor(delay / 24);\n const hoursToRemove = Math.floor(delay % 24);\n const dateWithTime = new Date(\n this.pendingBooking.date + \"T\" + this.pendingBooking.hour + \":00\"\n );\n const hours = dateWithTime.getHours() - hoursToRemove;\n dateWithTime.setHours(hours);\n let delayedDate = moment(dateWithTime)\n .add(-1 * daysToRemove, \"days\")\n .locale(i18n.language);\n let date = delayedDate.format(\"LL\");\n let time = delayedDate.format(\"LT\");\n const translationKey =\n this.getPendingBookingPrepaymentKind() == \"deposit\"\n ? delay > 0\n ? \"deposit\"\n : \"deposit_without_delay\"\n : \"down_payment\";\n let prepaymentInfos = i18n.t(\n `instabook.prepayment.intro_text.${translationKey}`,\n {\n amount: priceAndCurrency,\n date: date,\n time: time,\n }\n );\n prepaymentInfos += \"
\";\n prepaymentInfos += i18n.t(\"instabook.prepayment.intro_text_2\");\n return prepaymentInfos;\n }\n }\n get countryCode(): string | undefined {\n return this._pendingBooking.country_code;\n }\n public get selectedMenus(): Array {\n return this._pendingBooking.selected_menus ?? [];\n }\n\n get statisfySameMenusPaxCounterMandatoryForRaiseBtn(): boolean {\n return this.sameNumberMenu\n ? !this.statisfySameMenusPaxCounterMandatory\n : true;\n }\n\n get statisfySameMenusPaxCounterMandatory(): boolean {\n return (\n this.selectedMenuCounter === this.persons ||\n selectionStore.menusCount == this.persons\n );\n }\n\n public get selectedMenuCounter(): number {\n return this.selectedMenus.reduce(\n (counter: number, menu: SelectedMenu) =>\n (counter = counter + menu.quantity),\n 0\n );\n }\n\n public set selectedMenus(selectedMenus) {\n this._pendingBooking.selected_menus = selectedMenus;\n }\n\n get selectedMenuForAllGuests(): SelectedMenu | null {\n return (\n this.selectedMenus.filter((menu) => menu.for_all_guests === true)[0] ??\n null\n );\n }\n\n public get selectedVouchers() {\n return this._pendingBooking.vouchers;\n }\n\n public get selectedOffer() {\n return this._pendingBooking.offer;\n }\n\n get menuSelectionRequested(): boolean {\n return this._pendingBooking.menu_selection_requested ?? false;\n }\n\n get statisfyMenusMandatory(): boolean {\n return !this.menuSelectionRequested\n ? true\n : this.sameNumberMenu\n ? this.statisfySameMenusPaxCounterMandatory\n : this.selectedMenus.length > 0;\n }\n get sameNumberMenu(): boolean {\n return this._pendingBooking.same_number_menu ?? false;\n }\n get skip_prepayment_for_contact(): boolean {\n return this.pendingBooking.skip_prepayment_for_contact ?? false;\n }\n\n get showPptForm(): boolean {\n return this.skip_prepayment_for_contact\n ? false\n : !moduleSettings.hasSkippingGroupPpt;\n }\n\n public get selectedMenusIds(): Array {\n return this.selectedMenus.map((selectedMenu: SelectedMenu) =>\n Number(selectedMenu.commercial_id)\n );\n }\n\n public setMenuIdsAvailiable(\n menus: Array,\n menuIds: Array\n ): { [key: number]: boolean } {\n return Object.assign(\n {},\n ...menus.map((menu: Menu) => ({ [menu.id]: menuIds.includes(menu.id) }))\n );\n }\n\n public get menusAvailabilities(): { [key: number]: boolean } {\n if (pendingBookingStore.selectedMenus.length === 0)\n return Object.assign(\n {},\n ...commercialsStore.menus.map((menu: Menu) => ({ [menu.id]: true }))\n );\n\n //if pendingBooking selectedMenus include allForGuest\n let _selectedMenuForAllGuests = this.selectedMenuForAllGuests;\n if (_selectedMenuForAllGuests !== null) {\n //set individual menu to false\n //and forAllGuestsMenus !== currentSelected menu to false\n return this.setMenuIdsAvailiable(commercialsStore.menus, [\n Number(_selectedMenuForAllGuests.commercial_id),\n ]);\n }\n //set allForGuestsMenu to false\n let individualMenuIds: Array = commercialsStore.individualMenus.map(\n (menu: Menu) => {\n return menu.id;\n }\n );\n return this.setMenuIdsAvailiable(commercialsStore.menus, individualMenuIds);\n }\n\n public set recaptchaValue(recaptchaValue: string) {\n this._pendingBooking.recaptchaValue = recaptchaValue;\n }\n}\n\nexport const pendingBookingStore = new PendingBookingStore();\n","import ReactPixel from \"react-facebook-pixel\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\n\nconst options = {\n autoConfig: true,\n debug: false,\n};\n\nclass FacebookPixelService {\n facebookPixelModuleInitialized: boolean = false;\n hasConsent: boolean = false;\n static service: FacebookPixelService | undefined;\n\n static get(): FacebookPixelService {\n if (!this.service) {\n this.service = new FacebookPixelService();\n }\n return this.service!;\n }\n\n initFacebookPixel() {\n const externalPartner = moduleSettings.externalPartner;\n if (externalPartner?.facebook_pixel_id) {\n ReactPixel.init(externalPartner.facebook_pixel_id, undefined, options);\n this.facebookPixelModuleInitialized = true;\n this.revokeConsent();\n }\n }\n\n revokeConsent() {\n this.hasConsent = false;\n if (this.facebookPixelModuleInitialized) {\n ReactPixel.revokeConsent();\n }\n }\n\n grantConsent() {\n this.hasConsent = true;\n if (this.facebookPixelModuleInitialized) {\n ReactPixel.grantConsent();\n }\n }\n}\n\nexport default FacebookPixelService.get();\n","import i18n from \"../i18n\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nclass LanguageSwitcherService {\n public listeners: Array<() => void> = [];\n\n public registerListener = (listener: () => void) => {\n this.listeners.push(listener);\n };\n\n public unregisterListeners = () => {\n this.listeners = [];\n };\n\n public callListeners = () => {\n this.listeners.forEach((listener) => {\n listener();\n });\n };\n\n public golLocaleFromSwitcher(localeFromSwitcher: string): string {\n if (localeFromSwitcher.toLowerCase() === \"gb\") {\n return \"en\";\n }\n if (localeFromSwitcher.toLowerCase() === \"jp\") {\n return \"ja\";\n }\n return localeFromSwitcher.toLowerCase();\n }\n\n public localeForCountryCode = (countryCode: string) => {\n if ([\"GB\", \"gb\"].includes(countryCode)) {\n return \"en\";\n }\n if ([\"JP\", \"jp\"].includes(countryCode)) {\n return \"ja\";\n }\n return countryCode.toLocaleLowerCase();\n };\n\n public countryCodeForLocale = (locale: string) => {\n if (locale === \"en\") {\n return \"GB\";\n }\n if (locale === \"ja\") {\n return \"JP\";\n }\n return locale.toUpperCase();\n };\n\n public switcherData = (supportedLngs: string[] | false): string[] => {\n var countries: string[] = [];\n const _supportedLngs = supportedLngs === false ? [] : supportedLngs;\n moduleSettings.getAvailableLocales().forEach((locale) => {\n if (_supportedLngs.includes(locale)) {\n var countryCode = this.countryCodeForLocale(locale);\n countries.push(countryCode);\n }\n });\n\n return countries;\n };\n\n public localeForMoment = () => {\n switch (i18n.language) {\n case \"ee\":\n return \"et\";\n case \"ca\":\n return \"fr-ca\";\n case \"ch\":\n return \"fr-ch\";\n case \"se\":\n return \"sv\";\n default:\n return i18n.language;\n }\n };\n}\n\nlet languageSwitcherService: LanguageSwitcherService;\n\nexport const getLanguageSwitcherService = (): LanguageSwitcherService => {\n if (!languageSwitcherService) {\n languageSwitcherService = new LanguageSwitcherService();\n }\n return languageSwitcherService;\n};\n","import { getModuleSettings } from \"../requests/settings.request\";\nimport {\n Area,\n CustomContactFormFields,\n GuestsCapacity,\n ModuleSettings,\n ExternalPartner,\n WaitingMessage,\n Translation,\n PeriodsTranslations,\n PeriodTranslations,\n UpdateFromBooking,\n ErrorMessage,\n} from \"../types\";\nimport { Observable } from \"rxjs\";\nimport { tap } from \"rxjs/operators\";\nimport { selectionStore } from \"./selection.store\";\nimport { requestParamsImpl } from \"../services/request-params.service\";\nimport { getLocalStorageService } from \"../services/local-storage.service\";\nimport selectionGuestsService from \"../services/selection-guests-service\";\nimport { pendingBookingStore } from \"./pending-booking.store\";\nimport moment, { Moment } from \"moment-timezone\";\nimport facebookPixelService from \"../services/facebook-pixel.service\";\nimport { getLanguageSwitcherService } from \"../services/language-switcher.service\";\nimport selectionCalendarDateService from \"../services/selection-calendar-date.service\";\nimport i18n from \"../i18n\";\nimport { config } from \"../config\";\n\nclass ModuleSettingsStore {\n public settings: ModuleSettings = {} as ModuleSettings;\n public initialBookingCreated: boolean = false;\n public moduleInitialized: boolean = false;\n\n public getAvailableLocales(): Array {\n return this.settings.available_locales;\n }\n\n public getDefaultLocale(): string {\n return this.settings.restaurant?.locale ?? \"en\";\n }\n\n public getRestaurantName(): string {\n return this.settings.restaurant?.name ?? \"\";\n }\n\n public getRestaurantId(): string {\n return String(this.settings.restaurant?.id);\n }\n //!\\TODO on update_from email referal_key is not setted\n //!\\ hence if moduleSettings.settings == {}\n //!\\ moduleSetting.getReferralKey may since settings.referak_key is undefined\n public getReferralKey(): string {\n return this.settings.referral_key;\n }\n\n public getCapacity(): GuestsCapacity {\n return {\n minGuests: this.settings.restaurant.min_persons ?? 0,\n maxGuests: this.settings.restaurant.max_persons ?? 12,\n };\n }\n public get monitoringUserId(): string {\n return `${moduleSettings.getReferralKey()}_${moduleSettings.getRestaurantId()}`;\n }\n\n public get disclaimerUrl(): string {\n return this.settings.terms?.disclaimer_url ?? \"\";\n }\n\n public get prepaymentDisclaimerUrl(): string {\n return this.settings.terms?.prepayment_disclaimer_url ?? \"\";\n }\n\n public get privacyPolicyUrl(): string {\n return this.settings.terms?.privacy_policy_url ?? \"\";\n }\n\n public get customFields(): CustomContactFormFields {\n var customFields = this.settings as CustomContactFormFields;\n [\"birthday\", \"gender\", \"company\", \"address\"].forEach((field) => {\n const customFieldsKey = \"show_\" + field;\n customFields[customFieldsKey as keyof CustomContactFormFields] =\n this.settings.optional_contact_form_fields?.includes(field);\n });\n return customFields;\n }\n\n public get partnerName(): string {\n return this.settings.partner_display_name;\n }\n\n public get productName(): string {\n return this.settings.product_name;\n }\n\n public get requiredContactFields(): string[] {\n let defaultRequiredFields = [\n \"lastname\",\n \"firstname\",\n \"mobile_phone\",\n \"terms\",\n ];\n if (!this.settings.allow_blank_email) defaultRequiredFields.push(\"email\");\n\n return defaultRequiredFields;\n }\n\n public get multiVouchersEnabled(): boolean {\n return this.settings.restaurant.allow_multi_vouchers;\n }\n\n public get onlineBookingEnabled(): boolean {\n return this.settings.restaurant?.online_booking_enabled;\n }\n\n public get restaurantLogoUrl(): string {\n return this.settings.banner_url;\n }\n\n public get backgroundImageUrl(): any {\n return this.settings.background_picture_url;\n }\n\n public get bodyBackgroundColor(): any {\n return this.settings.theme?.bodyBackgroundColor;\n }\n\n public get fontFamily(): any {\n return this.settings.google_font || \"Roboto\";\n }\n\n public get restaurantTimezone(): string {\n return this.settings.restaurant?.time_zone ?? \"Europe/Paris\";\n }\n\n public get areas(): Array {\n return this.settings.restaurant!.areas;\n }\n\n public get areaIds(): Array {\n return this.settings.restaurant!.areas.map((area) => area.id);\n }\n\n public get forceAreaSelection(): boolean {\n return (\n (this.settings.advanced_options?.force_area_selection &&\n this.areaIds.length > 1) ??\n false\n );\n }\n\n public get hideServiceSelection(): boolean {\n return this.settings.advanced_options?.hide_filter_selection ?? false;\n }\n\n get hasSkippingGroupPpt(): boolean {\n return (\n this.settings.advanced_options?.has_group_skipping_prepayment ?? false\n );\n }\n\n get isRecaptchaEnabled(): boolean {\n return this.settings.advanced_options?.recaptcha_enabled ?? false;\n }\n\n public get periods(): Array {\n if (typeof this.settings.restaurant!.periods[0] === \"object\") {\n const _periods: Array =\n this.settings.restaurant!.periods;\n return _periods.map(({ period }) => period);\n }\n return this.settings.restaurant!.periods;\n }\n\n public get last_booking_date(): string {\n return this.settings.restaurant!.last_booking_date;\n }\n\n public get getCustomTheme(): any {\n return this.settings.theme;\n }\n\n public get primaryColor(): any {\n return this.settings.theme.primaryColor;\n }\n\n public get callFromFloatingButton(): any {\n return this.settings.callFromFloatingButton;\n }\n\n public get selectOnlyPaxFirst(): boolean {\n return this.settings.advanced_options?.select_only_pax_first ?? false;\n }\n\n public get defaultPersons(): number {\n return this.settings.restaurant.default_persons ?? 0;\n }\n\n public get settingsAreDefined(): boolean {\n return Object.keys(this.settings).length !== 0;\n }\n\n public get reservationResponsableEnabled(): boolean {\n return (\n this.settings.advanced_options?.reservation_responsable_enabled ?? false\n );\n }\n\n public get delayBeforeDepositCapture(): number {\n return this.settings.restaurant?.delay_before_deposit_capture ?? 0;\n }\n\n public get diplayAllergiesField(): boolean {\n return this.settings.restaurant?.display_allergies_field ?? false;\n }\n\n public get externalPartner(): ExternalPartner | undefined {\n return this.settings.external_partner;\n }\n\n public get poweredByLogo(): string {\n return this.settings.powered_by.logo;\n }\n\n public get poweredByUrl(): string {\n return this.settings.powered_by.url;\n }\n\n public get childrenManagementEnabled(): boolean {\n return (\n this.settings.restaurant?.children?.children_management_enabled ?? false\n );\n }\n\n public get childrenMaxAge(): number {\n return this.settings.restaurant?.children?.children_max_age ?? 12;\n }\n\n public headerMessage(lang: string, location: string): string | null {\n const _locale = getLanguageSwitcherService().golLocaleFromSwitcher(lang);\n if (location.endsWith(\"selection\")) {\n return this.getGeneralInfoMessage(_locale);\n }\n return pendingBookingStore.getPendingBookingMessage(_locale);\n }\n\n public waitingMessage(locale: string): string | null {\n if (pendingBookingStore.isWaitingState()) {\n return this.computeWaitingMessage(locale);\n }\n return null;\n }\n\n public loadWaitingMessageForLocale(\n locale: string\n ): WaitingMessage | undefined {\n let _locale = getLanguageSwitcherService().golLocaleFromSwitcher(locale);\n const { waiting_messages } = this.settings;\n return waiting_messages && waiting_messages.translations\n ? waiting_messages.translations.find(\n (waitingMessage: WaitingMessage) => waitingMessage.locale === _locale\n )\n : undefined;\n }\n\n public computeWaitingMessage(locale: string): string | null {\n const waitingMessage: WaitingMessage | undefined =\n this.loadWaitingMessageForLocale(locale);\n let message: string | null = null;\n if (waitingMessage) {\n message =\n waitingMessage.restaurant_message ?? waitingMessage.default_message;\n }\n return message;\n }\n\n public getGeneralInfoMessage(lang: string): string | null {\n const note =\n this.settings.restaurant.bookings_detail?.encoded_note ??\n this.settings.restaurant.bookings_detail?.note ??\n null;\n if (note) {\n const _note =\n note[lang] || note[this.settings.restaurant.locale] || note[\"en\"];\n return decodeURIComponent(_note);\n }\n return null;\n }\n\n public getPoweredByText(locale: string): string | undefined {\n const poweredByTexts = this.settings.powered_by.powered_by_texts;\n const locales = poweredByTexts.translations.map(\n (translation) => translation.locale\n );\n const _locale = locales.includes(locale) ? locale : \"en\";\n return poweredByTexts && poweredByTexts.translations\n ? poweredByTexts.translations.find(\n (poweredByText: Translation) => poweredByText.locale === _locale\n )?.text\n : undefined;\n }\n\n get bookingDate(): Moment | undefined {\n return this.isUpdateFromBooking &&\n !this.isUpdateFromBookingError &&\n this.settings.update_from_booking.booking_date\n ? moment(this.settings.update_from_booking.booking_date)\n : undefined;\n }\n\n get bookingTime(): string | undefined {\n return this.isUpdateFromBooking &&\n !this.isUpdateFromBookingError &&\n this.settings.update_from_booking.booking_time\n ? moment(this.settings.update_from_booking.booking_time)\n .tz(this.restaurantTimezone)\n .format(\"HH\") +\n \":\" +\n moment(this.settings.update_from_booking.booking_time).format(\"mm\")\n : undefined;\n }\n\n get updateFromBooking(): UpdateFromBooking {\n return this.settings.update_from_booking;\n }\n\n get childrenNumber(): number | undefined {\n return this.isUpdateFromBooking &&\n !this.isUpdateFromBookingError &&\n this.settings.update_from_booking.children_number\n ? this.settings.update_from_booking.children_number\n : undefined;\n }\n\n get areaId(): string | null {\n return this.isUpdateFromBooking &&\n !this.isUpdateFromBookingError &&\n this.settings.update_from_booking.area_id\n ? this.settings.update_from_booking.area_id\n : null;\n }\n\n get isUpdateFromBooking(): boolean {\n if (!this.settings.update_from_booking) {\n return false;\n }\n const { booked_persons_number, booking_date, booking_time } =\n this.settings.update_from_booking;\n return (\n booked_persons_number !== null &&\n booking_date !== null &&\n booking_time !== null\n );\n }\n\n get isUpdateFromBookingError(): boolean {\n return (\n this.isUpdateFromBooking &&\n this.settings.update_from_booking.error_message[0] !== null\n );\n }\n\n get isPreCatelanRestaurant(): boolean {\n return this.isFrPlt\n ? [7894, 8580].includes(this.settings.restaurant?.id)\n : false;\n }\n\n get isTourArgentGroupRestaurant(): boolean {\n return this.isFrPlt\n ? [1997, 8338, 8339, 1469].includes(this.settings.restaurant?.id)\n : false;\n }\n\n get isLeCastelletGroupRestaurant(): boolean {\n return this.isFrPlt\n ? [8184, 8185, 8572].includes(this.settings.restaurant?.id)\n : false;\n }\n\n get isFrPlt(): boolean {\n return config.appPlatform?.slice(config.appPlatform?.length - 2) === \"fr\";\n }\n\n get isRoPlt(): boolean {\n return config.appPlatform?.slice(config.appPlatform?.length - 2) === \"ro\";\n }\n\n get customLabelSmsSpamRestaurantGroup(): string | null {\n if (this.isTourArgentGroupRestaurant) {\n return \"Tour d’Argent\";\n }\n return null;\n }\n\n get shouldHideLegend(): boolean {\n return (\n process.env.REACT_APP_PLATFORM?.slice(\n process.env.REACT_APP_PLATFORM?.length - 2\n ) === \"fi\" && [1444, 1470].includes(this.settings.restaurant?.id)\n );\n }\n\n get redirectionLink(): string | null {\n return this.settings.redirection_link;\n }\n\n public computeUpdateFromBookingErrorMessage(\n locale: string\n ): string | undefined {\n const _locale = getLanguageSwitcherService().golLocaleFromSwitcher(locale);\n const errorMessages = this.settings.update_from_booking.error_message;\n return errorMessages\n ? errorMessages.find(\n (errorMessage: ErrorMessage) => errorMessage.locale === _locale\n )?.error_message\n : undefined;\n }\n\n public get restaurantCountryCode(): string {\n return this.settings.restaurant?.country_code ?? \"en\";\n }\n\n public hasFacebookPixel(): boolean {\n return !!this.externalPartner?.facebook_pixel_id;\n }\n\n public renamingPeriod(period: string): string {\n let _locale = getLanguageSwitcherService().golLocaleFromSwitcher(\n i18n.language\n );\n let renamingPeriod: string;\n if (typeof this.settings.restaurant.periods[0] === \"string\") {\n let _periods: PeriodsTranslations[] = [];\n if (this.settings.restaurant.periods_translations !== undefined) {\n _periods = this.settings.restaurant.periods_translations.filter(\n (periodsTranslations: PeriodsTranslations) =>\n Object.keys(periodsTranslations).toLocaleString() === period\n );\n }\n renamingPeriod =\n _periods.length > 0\n ? Object.values(_periods[0])[0][_locale]\n : undefined;\n } else {\n const _period = this.settings.restaurant.periods.find(\n (periods: PeriodsTranslations) => periods.period === period\n );\n renamingPeriod = _period\n ? _period.translations.find(\n (translation: PeriodTranslations) => translation.locale === _locale\n )?.text\n : undefined;\n }\n return renamingPeriod\n ? renamingPeriod\n : i18n.t(\"instabook.periods.\" + period);\n }\n\n //Initialize store from given ModuleSettings\n // keep arrow function to handle this when called from initModuleSettings\n public initFromModuleSettings = (response: ModuleSettings) => {\n this.settings = response;\n requestParamsImpl.restaurantId = String(this.settings.restaurant.id);\n requestParamsImpl.referralKey = this.settings.referral_key;\n if (!moduleSettings.moduleInitialized) {\n getLocalStorageService().setDefaultLocalLanguage();\n selectionCalendarDateService.setDefaultDate();\n }\n selectionGuestsService.setDefaultSelectedGuest();\n selectionStore.setDefaultAreaId();\n selectionCalendarDateService.setDefaultTime();\n facebookPixelService.initFacebookPixel();\n const searchParams = new URLSearchParams(document.location.search);\n this.settings.callFromFloatingButton = !!searchParams.get(\"cta\");\n };\n\n public initModuleSettings(): Observable {\n const params = requestParamsImpl.requestParams;\n return getModuleSettings(\n params.restaurantId,\n params.bookingId,\n params.bookingToken,\n params.preview\n ).pipe(tap(this.initFromModuleSettings));\n }\n}\n\nexport const moduleSettings = new ModuleSettingsStore();\n","import { getHttpService } from \"../services/http.service\";\nimport { SettingsEndpoint } from \"../endpoints/SettingsEndpoint\";\nimport { Observable } from \"rxjs\";\n\n\nexport const getModuleSettings = (\n restaurantId?: string,\n bookingId?: string,\n bookingToken?: string,\n preview?: string\n): Observable => {\n const endpoint = new SettingsEndpoint();\n var queryParams = [];\n if (restaurantId !== undefined && /^[0-9]+$/.test(restaurantId)) {\n queryParams.push({\n queryParamName: \"restaurant_id\",\n queryParamValue: restaurantId,\n });\n }\n if (bookingId !== undefined && bookingToken !== undefined) {\n queryParams.push({\n queryParamName: \"booking_id\",\n queryParamValue: bookingId,\n });\n queryParams.push({\n queryParamName: \"booking_token\",\n queryParamValue: bookingToken,\n });\n }\n if (preview) {\n queryParams.push({\n queryParamName: \"preview\",\n queryParamValue: preview,\n });\n }\n endpoint.setQueryParams(queryParams);\n return getHttpService().get(endpoint);\n};\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\n// @ts-ignore\nimport ReactFlagsSelect from \"react-flags-select\";\nimport { getLanguageSwitcherService } from \"../../services/language-switcher.service\";\nimport countryFlagLabel from \"../../assets/json/country_flag.json\";\nimport { getLocalStorageService } from \"../../services/local-storage.service\";\n\nconst ChangeLanguage = styled.div`\n width: 100%;\n color: ${(props) => props.theme.textColor};\n position: relative;\n display: flex;\n border-radius: 4px;\n\n .menu-flags-button {\n border: none;\n background: ${(props) => props.theme.backgroundTransparentWhite};\n padding: 0 10px 0 4px;\n }\n\n .ReactFlagsSelect-module_flagsSelect__2pfa2 {\n padding-bottom: 0;\n\n ul {\n max-height: 200px;\n }\n }\n\n @media screen and (min-width: 769px) {\n &:hover {\n .languages {\n display: block;\n }\n }\n }\n`;\n\nconst Switcher = () => {\n const { i18n } = useTranslation();\n\n const changeLanguage = (countryCode: string) => {\n i18n.changeLanguage(\n getLanguageSwitcherService().localeForCountryCode(countryCode)\n );\n getLocalStorageService().preferredLanguageCookie = countryCode;\n };\n\n const selectedCountryCode = getLanguageSwitcherService().countryCodeForLocale(\n i18n.language\n );\n\n const countries = getLanguageSwitcherService().switcherData(\n i18n.options.supportedLngs!\n );\n\n return (\n \n changeLanguage(code)}\n alignOptionsToRight={true}\n fullWidth={false}\n customLabels={countryFlagLabel}\n optionsSize={14}\n />\n \n );\n};\nexport const LanguageSwitcher = memo(Switcher);\n","import { InitialPendingBookingRequest } from \"../types\";\nimport { selectionStore } from \"../stores/selection.store\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport i18n from \"../i18n\";\nimport { getLanguageSwitcherService } from \"./language-switcher.service\";\nimport { requestParamsImpl } from \"./request-params.service\";\n\nclass CreatePendingBookingService {\n createInitialPendingBooking(): InitialPendingBookingRequest {\n const area_id = selectionStore.area;\n const date = selectionStore.date!.format(\"YYYY-MM-DD\");\n const hour = selectionStore.time;\n const persons = selectionStore.guests + selectionStore.children;\n const children = selectionStore.children;\n const user_locale = getLanguageSwitcherService().localeForCountryCode(\n i18n.language\n );\n const restaurant_id = +moduleSettings.getRestaurantId();\n const pendingBooking: InitialPendingBookingRequest = {\n date,\n hour,\n persons,\n children,\n restaurant_id,\n user_locale,\n };\n const note = requestParamsImpl.overwrittenNote();\n if (note) {\n pendingBooking.note = note;\n }\n if (area_id && \"all\" !== area_id) {\n pendingBooking.area_id = area_id;\n }\n return pendingBooking;\n }\n}\n\nlet createPendingBooking: CreatePendingBookingService;\n\nexport const getCreatePendingBookingService =\n (): CreatePendingBookingService => {\n if (!createPendingBooking) {\n createPendingBooking = new CreatePendingBookingService();\n }\n return createPendingBooking;\n };\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class PendingBookingEndpoint extends Endpoint {\n constructor() {\n super(\"pending_bookings\");\n }\n}\n\nexport class UpdatePendingBookingFromBookingEndPoint extends PendingBookingEndpoint {\n constructor(bookingId: string) {\n super();\n this.endPoint += `/update_from_booking/${bookingId}`;\n }\n}\n\nexport class UpdatePendingBookingEndpoint extends PendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super();\n this.endPoint += `/${pendingBookingId}`;\n }\n}\n\nexport class PendingBookingValidateGiftCodeEndpoint extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/validate_gift_code\";\n }\n}\n\nexport class PendingBookingRemoveVoucher extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/remove_voucher\";\n }\n}\n\nexport class PendingBookingAddOfferEndpoint extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/add_offer\";\n }\n}\n\nexport class PendingBookingRemoveOfferEndpoint extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/remove_offer\";\n }\n}\nexport class PendingBookingAddMenuEndpoint extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/pick_menu\";\n }\n}\n\nexport class PendingBookingRemoveMenuEndpoint extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/remove_menu\";\n }\n}\n\nexport class PendingBookingPaymentConfirmed extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/payment_confirmed\";\n }\n}\n\nexport class CommitPendingBooking extends UpdatePendingBookingEndpoint {\n constructor(pendingBookingId: string) {\n super(pendingBookingId);\n this.endPoint += \"/commit\";\n }\n}\n","import { getHttpService } from \"../services/http.service\";\nimport {\n CommitPendingBooking,\n PendingBookingAddMenuEndpoint,\n PendingBookingValidateGiftCodeEndpoint,\n PendingBookingRemoveVoucher,\n PendingBookingEndpoint,\n PendingBookingRemoveMenuEndpoint,\n UpdatePendingBookingEndpoint,\n UpdatePendingBookingFromBookingEndPoint,\n PendingBookingAddOfferEndpoint,\n PendingBookingRemoveOfferEndpoint,\n PendingBookingPaymentConfirmed,\n} from \"../endpoints/PendingBooking\";\nimport { PendingBookingContact } from \"../types\";\nimport { Observable } from \"rxjs\";\nimport { pendingBookingStore } from \"../stores/pending-booking.store\";\nimport { getCreatePendingBookingService } from \"../services/create-pending-booking.service\";\nimport { requestParamsImpl } from \"../services/request-params.service\";\n\nconst httpService = getHttpService();\n\nexport const createInitialPendingBookingRequest = (): Observable => {\n let endpoint = null;\n const { bookingId, bookingToken } = requestParamsImpl.requestParams;\n const pendingBooking =\n getCreatePendingBookingService().createInitialPendingBooking();\n pendingBooking.booking_token = bookingToken;\n if (bookingId && bookingToken) {\n endpoint = new UpdatePendingBookingFromBookingEndPoint(bookingId);\n } else {\n endpoint = new PendingBookingEndpoint();\n }\n return httpService.post(endpoint, pendingBooking);\n};\n\nexport const updatePendingBookingRequest = (data: {\n contact_info?: PendingBookingContact;\n selected_offer?: number | null;\n stripe_token?: string | null;\n}): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new UpdatePendingBookingEndpoint(id);\n return httpService.put(endpoint, data);\n};\n\nexport const getPendingBookingRequest = (id: string): Observable => {\n const endpoint = new UpdatePendingBookingEndpoint(id!);\n return httpService.put(endpoint, {});\n};\n\nexport const cancelPendingBookingRequest = (id?: string): Observable => {\n const _id = pendingBookingStore.pendingBooking.id || id;\n const endpoint = new UpdatePendingBookingEndpoint(_id!);\n return httpService.delete(endpoint, {});\n};\n\nexport const checkVoucherCode = (gift_code: string): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingValidateGiftCodeEndpoint(id);\n const voucher_infos = { gift_code };\n return httpService.put(endpoint, voucher_infos);\n};\n\nexport const removeVoucherCodeToPendingBooking = (\n gift_code: string\n): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingRemoveVoucher(id);\n return httpService.delete(endpoint, { code: gift_code });\n};\n\nexport const removeOfferToPendingBooking = (\n offer_id: number\n): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingRemoveOfferEndpoint(id);\n return httpService.delete(endpoint, { offer_id });\n};\n\nexport const addOfferToPendingBooking = (offer_id: number): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingAddOfferEndpoint(id);\n return httpService.put(endpoint, { offer_id });\n};\n\nexport const addMenuToPendingBooking = (\n menu_id: number,\n quantity?: number\n): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingAddMenuEndpoint(id);\n if (quantity != undefined) {\n return httpService.put(endpoint, { menu_id, quantity });\n }\n return httpService.put(endpoint, { menu_id });\n};\n\nexport const removeMenuFromPendingBooking = (\n menu_id: number\n): Observable => {\n const id = pendingBookingStore.pendingBooking.id;\n const endpoint = new PendingBookingRemoveMenuEndpoint(id);\n return httpService.delete(endpoint, { menu_id });\n};\n\nexport const getPaymentConfirmed = (\n pending_booking_id: string\n): Observable => {\n const endpoint = new PendingBookingPaymentConfirmed(pending_booking_id);\n return httpService.put(endpoint, {});\n};\n\nexport const commitPendingBooking = (data: {\n stripe_token?: string;\n pending_booking_id?: string;\n}): Observable => {\n const id = data.pending_booking_id\n ? data.pending_booking_id\n : pendingBookingStore.pendingBooking.id;\n const recaptchaValue = pendingBookingStore.pendingBooking.recaptchaValue;\n const stripe_token = data.stripe_token;\n const endpoint = new CommitPendingBooking(id);\n return httpService.put(endpoint, { stripe_token, recaptchaValue });\n};\n","import { ArrowBackIos } from \"@material-ui/icons\";\nimport { Close } from \"@material-ui/icons\";\nimport React, { memo } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\nimport { cancelPendingBookingRequest } from \"../../requests/pending-booking.requests\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\n\ninterface IProps {\n route: string;\n cancelPB?: boolean;\n action: string;\n handleClick?: () => void;\n}\n\nconst ActionButtonLoad = styled.a`\n min-width: 32px;\n height: 32px;\n background: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n color: ${(props) => props.theme.textColorDarken};\n }\n`;\n\nconst ActionButtonLink = styled(Link)`\n min-width: 32px;\n height: 32px;\n background: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n color: ${(props) => props.theme.textColorDarken};\n }\n`;\n\nconst Button = (props: IProps) => {\n const handleOnClick = () => {\n if (props.cancelPB) {\n pendingBookingStore.resetBookingState();\n cancelPendingBookingRequest();\n }\n if (props.handleClick) {\n props.handleClick();\n }\n };\n\n const handleContent = (action: string) => {\n switch (action) {\n case \"back\":\n return (\n \n \n \n );\n default:\n return (\n \n \n \n );\n }\n };\n\n const content = handleContent(props.action);\n\n return <>{content};\n};\nexport const ActionButton = memo(Button);\n","import { TFunction } from \"i18next\";\n\nexport const setDangerouslyInnerHtml = (\n translation: TFunction,\n translationKey: string,\n translationParams?: any\n): any => {\n return {\n __html: translation(translationKey, translationParams),\n };\n};\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { setDangerouslyInnerHtml } from \"../../helpers/set-inner-html\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport moment from \"moment-timezone\";\nimport { getLanguageSwitcherService } from \"../../services/language-switcher.service\";\n\nconst UpdateBannerWrapper = styled.div`\n display: flex;\n justify-content: center;\n text-align: center;\n margin-top: -32px;\n margin-bottom: 32px;\n padding: 4px 0;\n background-color: ${(props) => props.theme.informationTextBackgroundColor};\n`;\n\nconst UpdateBannerDef = () => {\n const { t } = useTranslation();\n moment.locale(getLanguageSwitcherService().localeForMoment());\n const updateFromBooking = moduleSettings.updateFromBooking;\n const count = updateFromBooking.booked_persons_number;\n const childrenNumber = updateFromBooking.children_number;\n const timezone = moduleSettings.restaurantTimezone;\n const date = moment(updateFromBooking.booking_time)\n .tz(timezone)\n .format(\"D MMMM\");\n const hour =\n moment(updateFromBooking.booking_time).tz(timezone).format(\"HH\") +\n \"h\" +\n moment(updateFromBooking.booking_time).format(\"mm\");\n\n const setMessage = (): string => {\n switch (childrenNumber) {\n case 0:\n return count! > 1\n ? \"instabook.bookings.update_banner.other\"\n : \"instabook.bookings.update_banner.one\";\n default:\n return \"instabook.bookings.update_banner_with_children\";\n }\n };\n\n const setParams = () => {\n switch (childrenNumber) {\n case 0:\n return {\n count,\n date,\n hour,\n };\n default:\n const children =\n childrenNumber! > 1\n ? childrenNumber + \" \" + t(\"instabook.common.children\")\n : 1 + \" \" + t(\"instabook.common.child\");\n return {\n count,\n children,\n date,\n hour,\n };\n }\n };\n\n return (\n \n \n \n );\n};\nexport const UpdateBanner = memo(UpdateBannerDef);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { LanguageSwitcher } from \"../language-switcher/language-switcher\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { useTranslation } from \"react-i18next\";\nimport { HeaderStyle } from \"../../types\";\nimport { useLocation } from \"react-router-dom\";\nimport { cancelPendingBookingRequest } from \"../../requests/pending-booking.requests\";\nimport { ActionButton } from \"../action-button/action-button\";\nimport { config } from \"../../config\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport { UpdateBanner } from \"../update-banner/update-banner\";\ninterface HeaderProps {\n onHeaderClick?: () => void;\n}\n\ninterface IStyle {\n callFromFloatingButton: boolean;\n fontFamily: string;\n}\n\nconst HeaderWrapper = styled.div`\n height: ${(props) => props.theme.headerHeight};\n width: 100%;\n background-color: ${(props) =>\n props.theme.headerStyle === HeaderStyle.text\n ? \"white\"\n : props.theme.headerBackgroundColor};\n color: ${(props) =>\n props.theme.headerStyle === HeaderStyle.text\n ? props.theme.headerBackgroundColor\n : props.theme.invertFontColor};\n font-family: ${(props) => props.fontFamily};\n box-shadow: ${(props) =>\n props.theme.headerStyle === HeaderStyle.text\n ? \"0 2px 4px rgba(0, 0, 0, 0.25)\"\n : \"none\"};\n padding: 8px 20px;\n display: flex;\n align-items: center;\n margin-bottom: 32px;\n overflow: hidden;\n justify-content: ${(props) =>\n props.callFromFloatingButton ? \"center\" : \"inherit\"};\n\n @media screen and (min-width: 781px) {\n justify-content: center;\n }\n`;\n\nconst LanguageSwitcherWrapper = styled.div`\n position: absolute;\n right: 40px;\n width: 45px;\n`;\n\ninterface DisplayPointerI {\n displayPointer: boolean;\n}\n\nconst ReserveOnline = styled.div`\n font-size: 18px;\n line-height: 22px;\n max-width: calc(100% - 55px);\n &:hover {\n cursor: ${(props) => (props.displayPointer === false ? null : \"pointer\")};\n }\n span {\n font-weight: bold;\n }\n\n @media screen and (max-width: 780px) {\n font-size: 16px;\n line-height: 19px;\n } ;\n`;\n\nconst RestaurantLogo = styled.img`\n cursor: ${(props) => (props.displayPointer === false ? null : \"pointer\")};\n max-height: 50px;\n max-width: 100%;\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n left: 12px;\n top: 9px;\n`;\n\nconst HeaderDef = (props: HeaderProps) => {\n const restaurantName = moduleSettings.getRestaurantName();\n const restaurantLogoUrl = moduleSettings.restaurantLogoUrl;\n const callFromFloatingButton = moduleSettings.callFromFloatingButton;\n const fontFamily = moduleSettings.fontFamily;\n const referralKey = moduleSettings.getReferralKey();\n const redirectUrl = `${config.baseUrl}/instabook/cta/${referralKey}`;\n const { t } = useTranslation();\n const location = useLocation();\n const isUpdateFromBooking = moduleSettings.isUpdateFromBooking;\n\n const goHome = () => {\n if (callFromFloatingButton) {\n return;\n }\n let needToCancelPending =\n location.pathname.endsWith(\"selection\") ||\n location.pathname.endsWith(\"confirmationEnd\");\n\n if (!needToCancelPending) {\n pendingBookingStore.resetBookingState();\n cancelPendingBookingRequest();\n }\n if (props.onHeaderClick === undefined) {\n return;\n }\n props.onHeaderClick!();\n };\n\n const content = restaurantLogoUrl ? (\n \n ) : (\n \n {props.onHeaderClick !== undefined && t(\"instabook.button_txt\")}{\" \"}\n {restaurantName}\n \n );\n\n return (\n <>\n \n {callFromFloatingButton && (\n \n \n \n )}\n {content}\n \n \n \n \n {isUpdateFromBooking && }\n \n );\n};\nexport const Header = memo(HeaderDef);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { Booking } from \"../../../types\";\nimport { setDangerouslyInnerHtml } from \"../../../helpers/set-inner-html\";\n\ninterface IStatusProps {\n status: string;\n waiting_rank?: number;\n}\n\nconst StatusWrapper = styled.div`\n display: flex;\n justify-content: center;\n`;\n\nconst StatusText = styled.div`\n color: white;\n padding: 20px 60px;\n border-radius: 4px;\n margin-bottom: 36px;\n\n &.success {\n background-color: ${(props) => props.theme.success};\n }\n\n &.info {\n color: ${(props) => props.theme.textColor};\n background-color: ${(props) => props.theme.success}40;\n }\n`;\n\nconst Status = (props: IStatusProps) => {\n const { t } = useTranslation();\n\n let message = {};\n let statusColor = \"success\";\n\n switch (props.status) {\n case \"validated\":\n message = t(\"instabook.bookings.success.info\");\n break;\n case \"initialized\":\n message = t(\"instabook.bookings.success.waiting_for_confirmation\");\n break;\n case \"waiting\":\n message = (\n \n );\n break;\n case \"waiting_payment\":\n message = t(\n \"instabook.bookings.success.waiting_for_payment_confirmation\"\n );\n statusColor = \"info\";\n break;\n default:\n message = t(\"instabook.bookings.success.info\");\n }\n\n return (\n \n {message}\n \n );\n};\n\nexport const ReservationStatus = memo(Status);\n","import { Booking } from \"src/types\";\nimport i18n from \"../i18n\";\n\nclass BookingService {\n private static _service: BookingService | undefined;\n\n public static get(): BookingService {\n if (!this._service) {\n this._service = new BookingService();\n }\n return this._service;\n }\n\n displayName(firstname: string, lastname: string, civility?: number): String {\n let displayNameArray = [\n civility\n ? i18n.t(`instabook.contacts.gender_type.${civility}`)\n : undefined,\n firstname,\n lastname,\n ];\n\n const displayNameInfo = displayNameArray.filter((element) => {\n return element !== undefined;\n });\n\n return displayNameInfo.join(\" \");\n }\n}\n\nexport default BookingService.get();\n","import React, { memo } from \"react\";\nimport moment from \"moment-timezone\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { setDangerouslyInnerHtml } from \"../../../helpers/set-inner-html\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { getLanguageSwitcherService } from \"../../../services/language-switcher.service\";\nimport bookingService from \"../../../services/booking-service\";\nimport i18n from \"../../../../src/i18n\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\ninterface SummaryProps {\n civility?: number;\n firstname: string;\n lastname: string;\n booked_persons_number: number;\n children_number: number;\n time: string;\n}\n\nconst SummaryWrapper = styled.div`\n max-width: 500px;\n padding: 24px 32px;\n margin: 24px auto 32px;\n text-align: center;\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n`;\n\nconst Summary = (props: SummaryProps) => {\n const { t } = useTranslation();\n const contact = bookingService.displayName(\n props.firstname,\n props.lastname,\n props.civility\n );\n const count = props.booked_persons_number;\n const childrenNumber = props.children_number;\n const timezone = moduleSettings.restaurantTimezone;\n moment.locale(getLanguageSwitcherService().localeForMoment());\n const date = moment(props.time).tz(timezone).format(\"D MMMM\");\n const skip_prepayment_for_contact =\n pendingBookingStore.skip_prepayment_for_contact;\n\n const hour =\n moment(props.time).tz(timezone).format(\"HH\") +\n \"h\" +\n moment(props.time).format(\"mm\");\n const restaurant = moduleSettings.getRestaurantName();\n\n const setMessage = (): string => {\n switch (childrenNumber) {\n case 0:\n return count > 1\n ? \"instabook.bookings.summary.other\"\n : \"instabook.bookings.summary.one\";\n default:\n return \"instabook.bookings.summary_with_children\";\n }\n };\n\n const setParams = () => {\n switch (childrenNumber) {\n case 0:\n return {\n contact,\n count,\n date,\n hour,\n restaurant,\n };\n default:\n const children =\n childrenNumber > 1\n ? childrenNumber + \" \" + t(\"instabook.common.children\")\n : 1 + \" \" + t(\"instabook.common.child\");\n return {\n contact,\n count,\n children,\n date,\n hour,\n restaurant,\n };\n }\n };\n\n return (\n \n \n {skip_prepayment_for_contact && (\n \n )}\n \n );\n};\nexport const BookingSummary = memo(Summary);\n","import { Booking } from \"../types\";\n\nclass BookingStore {\n private _booking: Booking = {} as Booking;\n\n set booking(bookingResponse: Booking) {\n this._booking = bookingResponse;\n }\n\n get booking(): Booking {\n return this._booking;\n }\n}\n\nexport const bookingStore = new BookingStore();\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { config } from \"../../config\";\n\nconst Img = styled.img`\n height: 50px;\n`;\n\nconst AppLogo = () => {\n const { i18n } = useTranslation();\n const link =\n i18n.language !== \"fr\"\n ? \"https://www.reservation-responsable.org/\"\n : \"https://www.reservation-responsable.org/\";\n\n return (\n \n \n \n );\n};\nexport const LogoRR = memo(AppLogo);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { bookingStore } from \"../../../stores/booking.store\";\nimport { LogoRR } from \"../../footer/LogoRR\";\n\nconst RRMessageWrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 18px;\n margin: 24px auto 32px;\n border-radius: 5px;\n background-color: ${(props) => props.theme.informationTextBackgroundColor};\n color: ${(props) => props.theme.textColorGray};\n\n @media screen and (max-width: 780px) {\n position: inherit;\n }\n`;\n\nconst RRMessageTitle = styled.div`\n font-size: 20px;\n font-weight: bold;\n text-align: center;\n margin: 12px 0;\n`;\nconst RRMessageText = styled.div`\n line-height: 16px;\n text-align: center;\n margin: 12px;\n`;\n\nconst InsertRRMessage = () => {\n const title = bookingStore.booking.rr_data?.title;\n const text = bookingStore.booking.rr_data?.text;\n\n return (\n \n \n \n \n \n );\n};\nexport const RRMessage = memo(InsertRRMessage);\n","import React, { memo } from \"react\";\nimport styled, { keyframes } from \"styled-components\";\n\ninterface ILoaderStyle {\n size?: string;\n position?: string;\n}\n\nconst spinner = keyframes`\n from {\n transform: rotate(0deg);\n }\n\n to {\n transform: rotate(360deg);\n }\n`;\n\nconst LoaderSpinnerContainer = styled.div`\n position: ${(props) => (props.position === \"fixed\" ? \"fixed\" : \"absolute\")};\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 30;\n`;\n\nconst LoaderSpinner = styled.div`\n position: absolute;\n border: ${(props) => (props.size === \"large\" ? \"20px\" : \"10px\")} solid #f3f3f3;\n border-top: ${(props) => (props.size === \"large\" ? \"20px\" : \"10px\")} solid\n ${(props) => props.theme.primaryColor};\n border-radius: 50%;\n width: ${(props) => (props.size === \"large\" ? \"200px\" : \"100px\")};\n height: ${(props) => (props.size === \"large\" ? \"200px\" : \"100px\")};\n animation: ${spinner} 2s linear infinite;\n`;\n\nconst LoaderDef = (props: ILoaderStyle) => {\n return (\n \n \n \n );\n};\nexport const Loader = memo(LoaderDef);\n","import { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { IStyle, ButtonStyle } from \"../../types\";\n\nconst ButtonLinkStyle = styled(Link)`\n display: inline-block;\n color: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.contained\n ? props.theme.invertFontColor\n : props.theme.primaryColor};\n text-decoration: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"underline\" : \"none\"};\n font-size: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"16px\" : \"14px\"};\n padding: 12px\n ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"12px\" : \"24px\"};\n background-color: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.contained\n ? props.theme.primaryColor\n : \"transparent\"};\n border: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.outlined\n ? `1px solid ${props.theme.primaryColor}`\n : \"none\"};\n box-shadow: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text\n ? \"0px 2px 4px rgba(0, 0, 0, 0.25)\"\n : \"none\"};\n border-radius: 3px;\n opacity: ${(props) => (props.disabled ? 0.4 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n`;\n\nexport default ButtonLinkStyle;\n","import styled from \"styled-components\";\nimport { IStyle, ButtonStyle } from \"../../types\";\n\nconst ButtonDefaultStyle = styled.div`\n display: inline-block;\n color: ${(props) =>\n setColor(\n props.theme.buttonStyle,\n props.inverted || false,\n props.theme.primaryColor,\n props.theme.invertFontColor,\n props.theme.disabledColor\n )};\n text-decoration: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"underline\" : \"none\"};\n font-size: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"16px\" : \"14px\"};\n padding: 12px\n ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text ? \"12px\" : \"24px\"};\n background-color: ${(props) =>\n setBackgroundColor(\n props.theme.buttonStyle,\n props.inverted || false,\n props.theme.primaryColor\n )};\n border: ${(props) =>\n setBorder(\n props.theme.buttonStyle,\n props.inverted || false,\n props.theme.primaryColor,\n props.theme.disabledColor\n )};\n box-shadow: ${(props) =>\n props.theme.buttonStyle === ButtonStyle.text\n ? \"0px 2px 4px rgba(0, 0, 0, 0.25)\"\n : \"none\"};\n border-radius: 3px;\n opacity: ${(props) => (props.disabled ? 0.4 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n`;\n\nconst setColor = (\n buttonStyle: string,\n inverted: boolean,\n primaryColor: string,\n invertedColor: string,\n disabledColor: string\n) => {\n switch (buttonStyle) {\n case ButtonStyle.contained:\n return inverted ? primaryColor : invertedColor;\n default:\n return inverted ? disabledColor : primaryColor;\n }\n};\n\nconst setBackgroundColor = (\n buttonStyle: string,\n inverted: boolean,\n primaryColor: string\n) => {\n switch (buttonStyle) {\n case ButtonStyle.contained:\n return inverted ? \"transparent\" : primaryColor;\n default:\n return \"transparent\";\n }\n};\n\nconst setBorder = (\n buttonStyle: string,\n inverted: boolean,\n primaryColor: string,\n disabledColor: string\n) => {\n switch (buttonStyle) {\n case ButtonStyle.contained:\n return inverted ? `1px solid ${primaryColor}` : \"none\";\n case ButtonStyle.outlined:\n return inverted\n ? `1px solid ${disabledColor}`\n : `1px solid ${primaryColor}`;\n default:\n return \"none\";\n }\n};\nexport default ButtonDefaultStyle;\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { Loader } from \"../loader/loader\";\nimport ButtonLinkStyle from \"./button-link-style\";\nimport ButtonDefaultStyle from \"./button-default-style\";\n\ninterface IProps {\n buttonTextKey: string;\n route?: string;\n onClick?: any;\n position?: AcceptedPositions;\n id?: string;\n disabled?: boolean;\n loader?: boolean;\n inverted?: boolean;\n}\n\ninterface IStyle {\n disabled?: boolean;\n}\n\nexport enum AcceptedPositions {\n right = \"right\",\n center = \"center\",\n left = \"left\",\n}\n\nconst ButtonWrapper = styled.div`\n margin: 0 auto;\n z-index: 20;\n cursor: pointer;\n\n &.right {\n text-align: right;\n }\n\n &.left {\n text-align: left;\n }\n\n &.center {\n text-align: center;\n }\n`;\n\nconst ButtonBackground = styled.div`\n width: fit-content;\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n margin: 32px 0 48px;\n cursor: ${(props) => (props.disabled ? \"default\" : \"pointer\")};\n`;\n\nconst Button = (props: IProps) => {\n const { t } = useTranslation();\n return (\n \n {props.loader && }\n \n {props.route ? (\n \n {t(props.buttonTextKey)}\n \n ) : (\n \n {t(props.buttonTextKey)}\n \n )}\n \n \n );\n};\nexport const ContinueButton = memo(Button);\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class BookingEndpoint extends Endpoint {\n constructor(bookingId?: number) {\n super(\"bookings\");\n if (bookingId) {\n this.endPoint += `/${bookingId}`;\n }\n }\n}\n\nexport class InviteFriendsEndpoint extends BookingEndpoint {\n constructor(bookingId: number) {\n super(bookingId);\n this.endPoint += \"/invite_friends\";\n }\n}\n","import { InviteFriendsEndpoint } from \"../endpoints/BookingEndpoint\";\nimport { getHttpService } from \"../services/http.service\";\nimport { bookingStore } from \"../stores/booking.store\";\n\nconst httpService = getHttpService();\n\nexport const inviteFriends = (message: string, emails: Array) => {\n const id = bookingStore.booking.id;\n const endpoint = new InviteFriendsEndpoint(id);\n return httpService.put(endpoint, { message, emails });\n};\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface IProps {\n text: string;\n type?: string;\n mandatory?: boolean | false;\n extraText?: string | null;\n}\n\nexport interface IStyle {\n type?: string;\n}\n\nconst TitleWrapper = styled.div`\n position: relative;\n width: fit-content;\n background-color: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 4px 4px 0 0;\n color: ${(props) => props.theme.textColorDarken};\n text-transform: uppercase;\n font-style: normal;\n font-weight: 300;\n font-size: 16px;\n line-height: 14px;\n padding: 12px 16px;\n`;\nconst ExtraText = styled.span`\n font-size: 10px;\n display: block;\n font-style: italic;\n text-transform: none;\n margin-top: 2px;\n margin-bottom: -8px;\n`;\nconst TitleLayout = (props: IProps) => {\n return (\n \n {props.text}\n {props.mandatory && \" *\"}\n {props.extraText && (\n {props.extraText}\n )}\n \n );\n};\n\nexport const Title = memo(TitleLayout);\n","import React, { memo, useState, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { TextField } from \"@material-ui/core\";\nimport { useTranslation } from \"react-i18next\";\nimport { ContinueButton } from \"../../continue-button/continue-button\";\nimport { inviteFriends } from \"../../../requests/booking.requests\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport { Title } from \"../../title/title\";\n\nconst ShareReservationWrapper = styled.div`\n color: ${(props) => props.theme.disabledColor};\n\n #continue-button {\n margin-top: -18px;\n margin-left: 18px;\n }\n`;\n\nconst ShareReservationContent = styled.div`\n background-color: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 0 8px 8px 8px;\n padding: 6px 4px 2px 4px;\n`;\n\nconst FullElement = styled.div`\n display: flex;\n flex: 0 0 100%;\n max-width: 100%;\n margin-bottom: 4px;\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n`;\n\nconst CustomErrorField = styled(TextField)`\n &.error {\n fieldset {\n border-color: ${(props) => props.theme.error};\n }\n\n p.Mui-required {\n color: ${(props) => props.theme.error};\n margin-top: 0;\n }\n }\n`;\n\nconst MessageText = styled.div`\n display: flex;\n justify-content: center;\n background-color: ${(props) => props.theme.success};\n color: white;\n padding: 20px 60px;\n border-radius: 5px;\n margin-bottom: 36px;\n`;\n\nconst Share = () => {\n const { t } = useTranslation();\n const [message, setMessage] = useState(\"\");\n const [messageError, setMessageError] = useState(false);\n const [emails, setEmails] = useState(\"\");\n const [emailsError, setEmailsError] = useState(false);\n const [formattedEmails, setFormattedEmails] = useState([]);\n const [isShared, setIsShared] = useState(false);\n\n const throwError = useErrorHandler();\n\n useEffect(() => {\n if (formattedEmails.length > 0) {\n const subscription = inviteFriends(message!, formattedEmails).subscribe(\n (resp: any) => {\n setIsShared(true);\n },\n throwError\n );\n return () => {\n subscription.unsubscribe();\n };\n }\n }, [formattedEmails, throwError, message]);\n\n const shareReservation = () => {\n let error = false;\n if (!message?.length) {\n error = true;\n setMessageError(true);\n }\n if (!emails?.length) {\n error = true;\n setEmailsError(true);\n }\n if (!error) {\n setFormattedEmails(\n emails.split(\",\").map((formattedEmail: string) => formattedEmail.trim())\n );\n }\n };\n\n const messageChanged = (\n ev: React.ChangeEvent\n ) => {\n const newMessage = ev.target.value;\n updateField(newMessage, setMessage, setMessageError);\n };\n\n const emailChanged = (\n ev: React.ChangeEvent\n ) => {\n const newEmails = ev.target.value;\n updateField(newEmails, setEmails, setEmailsError);\n };\n\n const updateField = (\n value: string,\n messageCb: (value: React.SetStateAction) => void,\n errorCb: (value: React.SetStateAction) => void\n ) => {\n messageCb(value);\n if (value.length) {\n errorCb(false);\n }\n };\n\n const contentAfterSharing = (\n {t(\"instabook.bookings.friend_sharing.success\")}\n );\n\n const contentForSharing = (\n <>\n \n <ShareReservationContent>\n <FullElement>\n <CustomErrorField\n fullWidth={true}\n multiline={true}\n className={messageError ? \"error\" : \"\"}\n placeholder={t(\"instabook.booking_sharing.to_friends\")}\n rows=\"4\"\n variant={\"outlined\" as any}\n onChange={messageChanged}\n />\n </FullElement>\n <FullElement>\n <CustomErrorField\n fullWidth={true}\n multiline={true}\n className={emailsError ? \"error\" : \"\"}\n placeholder={t(\"instabook.booking_sharing.send_to_friends\")}\n rows=\"1\"\n variant={\"outlined\" as any}\n onChange={emailChanged}\n />\n </FullElement>\n </ShareReservationContent>\n <ContinueButton\n onClick={shareReservation}\n buttonTextKey={t(\"instabook.booking_sharing.invite\")}\n />\n </>\n );\n\n return (\n <ShareReservationWrapper data-test=\"share-reservation\">\n {isShared ? contentAfterSharing : contentForSharing}\n </ShareReservationWrapper>\n );\n};\n\nexport const ShareReservation = memo(Share);\n","import { TagManagerOptions } from \"../types\";\nimport { getTagManagerArgs } from \"../requests/tag-manager.request\";\nimport TagManager, { TagManagerArgs } from \"react-gtm-module\";\n\nclass TagManagerService {\n private restaurantId: string;\n private init: boolean;\n\n constructor(restaurantId: string) {\n this.restaurantId = restaurantId;\n this.init = false;\n }\n\n public pushTags(step: string, options?: TagManagerOptions): void {\n getTagManagerArgs(this.restaurantId, step, options).subscribe(\n (resp: TagManagerArgs) => {\n const tagManagerArgs = resp;\n if (tagManagerArgs !== null) {\n if (!this.init) {\n TagManager.initialize({ gtmId: tagManagerArgs.gtmId });\n this.init = true;\n }\n TagManager.dataLayer(tagManagerArgs);\n }\n },\n (error: any) => {\n console.log(\"err: \", error);\n }\n );\n }\n}\n\nlet tagManagerService: TagManagerService;\n\nexport const getTagManagerService = (\n restaurantId?: string\n): TagManagerService => {\n if (!tagManagerService && restaurantId !== undefined) {\n tagManagerService = new TagManagerService(restaurantId);\n }\n return tagManagerService;\n};\n","import { moduleSettings } from \"../stores/module-settings.store\";\nimport { Theme } from \"./Theme\";\n\nlet currentTheme: Theme;\nexport class ThemeManager {\n public static getTheme(): Theme {\n let theme = moduleSettings.getCustomTheme;\n if (theme) {\n currentTheme = new Theme(theme);\n if (moduleSettings.backgroundImageUrl || (moduleSettings.bodyBackgroundColor && moduleSettings.bodyBackgroundColor !== \"#ffffff\"))\n currentTheme.isBackground = true;\n }\n\n return currentTheme;\n }\n}\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class TagManagerEndpoint extends Endpoint {\n constructor() {\n super(\"tag_manager_args\");\n }\n}\n","import { getHttpService } from \"../services/http.service\";\nimport { TagManagerEndpoint } from \"../endpoints/TagManagerEndpoint\";\nimport { TagManagerOptions } from \"../types\";\n\nconst httpService = getHttpService();\n\nexport const getTagManagerArgs = (\n restaurantId: string,\n step: string,\n options?: TagManagerOptions\n): any => {\n const endpoint = new TagManagerEndpoint();\n const queryParams = [];\n if (restaurantId && step) {\n queryParams.push({\n queryParamName: \"restaurant_id\",\n queryParamValue: restaurantId,\n });\n queryParams.push({\n queryParamName: \"step\",\n queryParamValue: step,\n });\n }\n if (options) {\n for (const [key, value] of Object.entries(options)) {\n queryParams.push({\n queryParamName: key,\n queryParamValue: value,\n });\n }\n }\n endpoint.setQueryParams(queryParams);\n return httpService.get(endpoint);\n};\n","import { IThemeProps, HeaderStyle, ButtonStyle } from \"../types\";\nimport { assignProps } from \"../utils\";\n\nconst blueGol: string = \"#20b8cf\";\nconst orange: string = \"#e7601c\";\nconst greenDark: string = \"#2fcc95\";\n// const greenLight: string = \"#9ac328\";\n// const yellow: string = \"#ffcc33\";\nconst blackLight: string = \"#222222\";\nconst kei: string = \"#646470\"; // kei\nconst gray: string = \"#888888\";\nconst grayLight: string = \"#ececec\";\nconst grayRegular: string = \"#dddddd\";\nconst grayMedium: string = \"#bbbbbb\";\nconst white: string = \"#ffffff\";\nconst error: string = \"#f44336\";\n\nexport class Theme {\n public primaryColor: string = blueGol;\n public secondaryColor: string = orange;\n public backgroundColor: string = white;\n public headerBackgroundColor: string = blueGol;\n public bodyBackgroundColor: string = white;\n public headerStyle: HeaderStyle = HeaderStyle.contained;\n public invertFontColor: string = white;\n public textColor: string = kei;\n public textColorGray: string = gray;\n public textColorDarken: string = blackLight;\n public disabledColor: string = grayMedium;\n public headerHeight: string = \"50px\";\n public footerHeight: string = \"60px\";\n public informationTextBackgroundColor = \"rgba(248, 248, 248, 0.9)\";\n public legendBorderGray: string = gray;\n public reservationSuccess: string = greenDark;\n public success: string = orange;\n public buttonStyle: ButtonStyle = ButtonStyle.text;\n public buttonBackgroundOnHover = grayRegular;\n public error: string = error;\n public voucherBackgroundColor: string = grayLight;\n public voucherTextColor: string = grayMedium;\n public backgroundTransparentWhite: string = \"rgba(255, 255, 255, 0.8)\";\n public isBackground: boolean = false;\n\n public globalPadding: string = \"8px\";\n\n constructor(props?: IThemeProps) {\n if (props) {\n assignProps(this, props);\n }\n }\n}\n","import { ThemeManager } from \"../theme-manager/theme-manager\";\n\nexport const setBackgroundColor = (status?: string) => {\n const theme = ThemeManager.getTheme();\n switch (status) {\n case \"success\":\n return theme.success;\n case \"Error\":\n case \"error\":\n return \"#f5e0df\";\n default:\n return theme.informationTextBackgroundColor;\n }\n};\n\nexport const setBackgroundColorIcon = (status?: string) => {\n const theme = ThemeManager.getTheme();\n switch (status) {\n case \"Error\":\n case \"error\":\n return \"#f5e0df\";\n case \"waiting\":\n return \"#e7601c\";\n case \"flash-on-icon\":\n case \"payment-icon\":\n return theme.disabledColor;\n default:\n return \"#FFFFFF\";\n }\n};\n\nexport const setTextColor = (status?: string) => {\n const theme = ThemeManager.getTheme();\n switch (status) {\n case \"Error\":\n case \"error\":\n return \"#e74c3c\";\n case \"warning\":\n return \"#f57c00\";\n case \"flash-on-icon\":\n case \"success\":\n case \"payment-icon\":\n return \"#FFFFFF\";\n case \"waiting\":\n return \"#0e1318\";\n default:\n return theme.textColorGray;\n }\n};\n\nexport const setTextColorIcon = (status?: string) => {\n const theme = ThemeManager.getTheme();\n switch (status) {\n case \"success\":\n return theme.success;\n case \"Error\":\n case \"error\":\n return \"#e74c3c\";\n case \"message\":\n case \"warning\":\n return \"#f57c00\";\n case \"waiting\":\n case \"flash-on-icon\":\n case \"payment-icon\":\n return \"#FFFFFF\";\n case \"info\":\n return \"#F0BC0F\";\n default:\n return theme.textColorGray;\n }\n};\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport PauseIcon from \"@material-ui/icons/Pause\";\nimport CheckIcon from \"@material-ui/icons/Check\";\nimport LocalDining from \"@material-ui/icons/LocalDining\";\nimport CloseRounded from \"@material-ui/icons/CloseRounded\";\nimport FlashOnIcon from \"@material-ui/icons/FlashOn\";\nimport PaymentIcon from \"@material-ui/icons/Payment\";\nimport Warning from \"@material-ui/icons/PriorityHighRounded\";\nimport Info from \"@material-ui/icons/Info\";\nimport {\n setBackgroundColorIcon,\n setTextColorIcon,\n} from \"../../helpers/set-color\";\n\ninterface IProps {\n icon: string | \"\";\n backgroundColor?: string;\n textColor?: string;\n size?: string;\n border?: boolean | false;\n position?: string;\n}\n\ninterface IStyled {\n backgroundColor?: string;\n textColor?: string;\n size?: string | \"small\";\n border?: boolean | false;\n position?: string;\n}\n\nconst RoundedIconWrapper = styled.div<IStyled>`\n position: ${(props) =>\n props.position === \"tag\" || props.position === \"legend\"\n ? \"relative\"\n : \"absolute\"};\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 50%;\n width: ${(props) => setSize(props.size)};\n min-width: ${(props) => setSize(props.size)};\n height: ${(props) => setSize(props.size)};\n background-color: ${(props) =>\n props.backgroundColor ? props.backgroundColor : \"white\"};\n color: ${(props) =>\n props.textColor ? props.textColor : props.theme.textColorGray};\n border: 1px solid\n ${(props) => (props.border ? props.textColor : \"transparent\")};\n top: ${(props) => setTopPosition(props.position, props.size)};\n left: ${(props) => setLeftPosition(props.position, props.size)};\n right: ${(props) => (props.position === \"left\" ? \"\" : \"-4px\")};\n margin: 0 2px;\n\n svg {\n width: ${(props) => setSVGSize(props.size)};\n height: ${(props) => setSVGSize(props.size)};\n }\n\n @media screen and (max-width: 768px) {\n margin-right: 2px;\n margin-top: 2px;\n }\n`;\n\nconst setSize = (size?: string) => {\n switch (size) {\n case \"large\":\n return \"32px\";\n case \"normal\":\n return \"24px\";\n case \"legend\":\n return \"20px\";\n default:\n return \"12px\";\n }\n};\n\nconst setSVGSize = (size?: string) => {\n switch (size) {\n case \"large\":\n return \"24px\";\n case \"normal\":\n return \"16px\";\n default:\n return \"10px\";\n }\n};\n\nconst setTopPosition = (position?: string, size?: string) => {\n switch (position) {\n case \"left\":\n return size === \"large\" ? \"-12px\" : \"-4px\";\n case \"right\":\n return \"-4px\";\n default:\n return 0;\n }\n};\n\nconst setLeftPosition = (position?: string, size?: string) => {\n switch (position) {\n case \"left\":\n return size === \"large\" ? \"-12px\" : \"-4px\";\n case \"right\":\n return \"\";\n default:\n return 0;\n }\n};\n\nconst renderIcon = (icon: string) => {\n switch (icon) {\n case \"waiting\":\n return <PauseIcon />;\n case \"warning\":\n case \"message\":\n return <Warning />;\n case \"error\":\n case \"Error\":\n return <CloseRounded />;\n case \"flash-on-icon\":\n return <FlashOnIcon />;\n case \"payment-icon\":\n return <PaymentIcon />;\n case \"info\":\n return <Info />;\n case \"success\":\n return <CheckIcon />;\n default:\n return <LocalDining />;\n }\n};\n\nconst RoundedIconDef = (props: IProps) => {\n return (\n <RoundedIconWrapper\n backgroundColor={setBackgroundColorIcon(props.icon)}\n textColor={setTextColorIcon(props.icon)}\n size={props.size}\n border={props.border}\n position={props.position}\n data-test=\"status-icon\"\n >\n {renderIcon(props.icon)}\n </RoundedIconWrapper>\n );\n};\n\nexport const RoundedIcon = memo(RoundedIconDef);\n","import React, { memo, useState } from \"react\";\nimport styled from \"styled-components\";\nimport ExpandMore from \"@material-ui/icons/ExpandMore\";\nimport ExpandLess from \"@material-ui/icons/ExpandLess\";\nimport { RoundedIcon } from \"../rounded-icon/rounded-icon\";\nimport {\n setBackgroundColor,\n setBackgroundColorIcon,\n setTextColor,\n setTextColorIcon,\n} from \"../../helpers/set-color\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\n\ninterface IProps {\n text: string;\n status?: string;\n collapsable?: boolean;\n}\n\ninterface IStyled {\n backgroundColor?: string;\n textColor?: string;\n collapsed?: boolean;\n}\n\nconst InformationWrapper = styled.div<IStyled>`\n position: relative;\n display: flex;\n justify-content: center;\n background-color: ${(props) => props.backgroundColor};\n color: ${(props) => props.textColor};\n text-align: center;\n border-radius: 5px;\n padding: 12px 22px;\n margin-bottom: 32px;\n\n .showMoreOrLess {\n position: absolute;\n right: 8px;\n bottom: 8px;\n }\n`;\n\nconst InformationStyle = styled.div<IStyled>`\n position: relative;\n width: 100%;\n height: ${(props) => (props.collapsed ? \"60px\" : \"100%\")};\n line-height: ${(props) => (props.collapsed ? \"20px\" : \"inherit\")};\n text-align: center;\n overflow: hidden;\n display: -webkit-box;\n white-space: normal;\n word-wrap: normal;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: ${(props) => (props.collapsed ? 3 : \"\")};\n -webkit-transition: all 0.3s ease-in-out;\n -moz-transition: all 0.3s ease-in-out;\n transition: all 0.3s ease-in-out;\n`;\n\nconst Information = (props: IProps) => {\n const [isCollapsed, setIsCollapsed] = useState(false);\n const mappedText = props.text.split(\"\\r\\n\").join(\"</br>\");\n const backgroundColor = setBackgroundColor(props.status);\n const textColor = setTextColor(props.status);\n const backgroundColorIcon = setBackgroundColorIcon(props.status);\n const textColorIcon = setTextColorIcon(props.status);\n const isRoPlt = moduleSettings.isRoPlt;\n const notDisplayDefaultIcon =\n isRoPlt && (props.status === \"\" || props.status === undefined);\n\n const handleClick = (event: any) => {\n setIsCollapsed(!isCollapsed);\n };\n\n const icon = isCollapsed ? (\n <ExpandMore\n className=\"showMoreOrLess\"\n onClick={handleClick}\n data-test=\"collapsable-icon\"\n />\n ) : (\n <ExpandLess\n className=\"showMoreOrLess\"\n onClick={handleClick}\n data-test=\"collapsable-icon\"\n />\n );\n\n return (\n <InformationWrapper backgroundColor={backgroundColor} textColor={textColor}>\n {!notDisplayDefaultIcon && (\n <RoundedIcon\n icon={props.status || \"\"}\n backgroundColor={backgroundColorIcon}\n textColor={textColorIcon}\n size=\"large\"\n border={props.status === \"waiting\" ? false : true}\n position=\"left\"\n />\n )}\n <InformationStyle\n dangerouslySetInnerHTML={{ __html: mappedText }}\n collapsed={isCollapsed}\n data-test=\"text-information\"\n />\n {props.collapsable && icon}\n </InformationWrapper>\n );\n};\nexport const InformationText = memo(Information);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { ReservationStatus } from \"./reservation-status\";\nimport { BookingSummary } from \"./booking-summary\";\nimport { RRMessage } from \"./rr-message\";\nimport { ShareReservation } from \"./share-reservation\";\nimport styled from \"styled-components\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { bookingStore } from \"../../../stores/booking.store\";\nimport { BookingState } from \"../../../types\";\nimport { getTagManagerService } from \"../../../services/tag-manager.service\";\nimport ReactPixel from \"react-facebook-pixel\";\nimport { Loader } from \"../../loader/loader\";\nimport { InformationText } from \"../../information-text/information-text\";\n\nconst ValidationWrapper = styled.div`\n margin-bottom: 50px;\n`;\n\nconst Validation = () => {\n const { t } = useTranslation();\n const booking = bookingStore.booking;\n const canSharingFriend =\n moduleSettings.settings.show_sharing_friend_on_module &&\n booking.booking_state === BookingState.validated;\n const shoudDiplayRRMessage =\n booking.rr_data?.title && booking.booking_state === BookingState.validated;\n const isFrPlt = moduleSettings.isFrPlt;\n\n useEffect(() => {\n getTagManagerService()?.pushTags(\"sharing\", {\n booking_id: booking.id.toString(),\n });\n ReactPixel.pageView();\n }, []);\n\n if (moduleSettings.redirectionLink) {\n window.location.replace(moduleSettings.redirectionLink);\n }\n\n if (window.Cypress) {\n window.__urlToUpdateFromEmail__ = `/instabook/bookings/${booking.id}/update_from_email/?booking_token=${booking.booking_token}`;\n }\n\n const content = (\n <ValidationWrapper data-test=\"validation\">\n <BookingSummary\n civility={booking.civility}\n firstname={booking.firstname}\n lastname={booking.lastname}\n booked_persons_number={booking.booked_persons_number}\n children_number={booking.children_number}\n time={booking.booking_time}\n />\n <ReservationStatus\n status={booking.booking_state}\n waiting_rank={booking.waiting_rank}\n />\n {canSharingFriend && <ShareReservation />}\n {isFrPlt && (\n <InformationText\n text={t(\"instabook.bloctel_message\")}\n status={\"info\"}\n />\n )}\n {shoudDiplayRRMessage && <RRMessage />}\n </ValidationWrapper>\n );\n\n return <>{moduleSettings.redirectionLink ? <Loader /> : content}</>;\n};\n\nexport const ConfirmationValidation = memo(Validation);\n","import * as React from \"react\";\n\nconst UserGroup = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M13 8C13 10.2094 11.2094 12 9 12C6.79062 12 5 10.2094 5 8C5 5.79063 6.79062 4 9 4C11.2094 4 13 5.79063 13 8ZM2 19.0719C2 15.9938 4.49375 13.5 7.57187 13.5H10.4281C13.5062 13.5 16 15.9938 16 19.0719C16 19.5844 15.5844 20 15.0719 20H2.92813C2.41563 20 2 19.5844 2 19.0719ZM21.0406 20H16.7312C16.9 19.7063 17 19.3656 17 19V18.75C17 16.8531 16.1531 15.15 14.8188 14.0063C14.8938 14.0031 14.9656 14 15.0406 14H16.9594C19.7438 14 22 16.2563 22 19.0406C22 19.5719 21.5687 20 21.0406 20ZM15.5 12C14.5312 12 13.6563 11.6063 13.0219 10.9719C13.6375 10.1406 14 9.1125 14 8C14 7.1625 13.7938 6.37188 13.4281 5.67813C14.0094 5.25313 14.725 5 15.5 5C17.4344 5 19 6.56563 19 8.5C19 10.4344 17.4344 12 15.5 12Z\" />\n </svg>\n);\n\nexport default UserGroup;\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { InputAdornment, OutlinedInput } from \"@material-ui/core\";\nimport { IInputWithIcon, IStyle } from \"../../types\";\n\nconst InputWithIconWrapper = styled.div<IStyle>`\n position: relative;\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n\n @media screen and (max-width: 930px) {\n width: ${(props) => (props.isSummary ? \"inherit\" : \"100%\")};\n }\n`;\n\nconst BackgroundInput = styled.div<IStyle>`\n width: ${(props) => (props.isSummary ? \"100%\" : \"300px\")};\n height: 56px;\n /* margin: 0 auto; */\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n`;\n\nconst TextInput = styled(OutlinedInput)<IStyle>`\n width: 300px;\n background: ${(props) =>\n props.disabled ? props.theme.primaryColor + 20 : \"\"};\n border-radius: 4px;\n\n input {\n cursor: ${(props) => (props.disabled ? \"not-allowed\" : \"pointer\")};\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n svg {\n fill: ${(props) => props.theme.disabledColor};\n }\n\n .MuiOutlinedInput-notchedOutline {\n border-color: ${(props) =>\n props.disabled\n ? props.theme.primaryColor + 20\n : props.theme.disabledColor} !important;\n }\n\n @media screen and (max-width: 930px) {\n width: 100%;\n }\n`;\n\nconst InputWithIconLayout = (props: IInputWithIcon) => {\n const { i18n } = useTranslation();\n const { readOnly = true, name = \"input\", isSummary } = props;\n return (\n <InputWithIconWrapper\n data-test=\"text-icon-wrapper\"\n isSummary={isSummary}\n className=\"input-with-icon\"\n >\n <BackgroundInput isSummary={isSummary}>\n <TextInput\n name={name}\n error={props.error}\n value={\n props.value === 0 || (props.isNumeric && isNaN(props.value))\n ? \"\"\n : props.value\n }\n label={props.label}\n placeholder={props.placeholderKey ? i18n.t(props.placeholderKey) : \"\"}\n onChange={props.onChange}\n onClick={props.onClick}\n disabled={isSummary}\n endAdornment={\n <InputAdornment position=\"end\">{props.icon}</InputAdornment>\n }\n inputProps={{\n readOnly: readOnly,\n }}\n data-test={props.dataTest ?? \"\"}\n />\n </BackgroundInput>\n </InputWithIconWrapper>\n );\n};\n\nexport const InputWithIcon = memo(InputWithIconLayout);\n","import { commercialsStore } from \"../stores/commercials.store\";\n\nclass CommercialsService {\n private static service: CommercialsService;\n\n static get(): CommercialsService {\n if (!this.service) {\n this.service = new CommercialsService();\n }\n return this.service;\n }\n\n public get menus(): Array<any> {\n return commercialsStore.menus;\n }\n\n public get individualMenus(): Array<any> {\n return commercialsStore.individualMenus;\n }\n\n public get forAllGuestsMenus(): Array<any> {\n return commercialsStore.forAllGuestsMenus;\n }\n\n public get offers(): Array<any> {\n return commercialsStore.offers;\n }\n\n public get events(): Array<any> {\n return commercialsStore.events;\n }\n\n public hasMenus(): boolean {\n return !!this.menus.length;\n }\n\n public hasOffers(): boolean {\n return !!this.offers.length;\n }\n\n public hasEvents(): boolean {\n return !!this.events.length;\n }\n\n public hasCommercials(): boolean {\n return this.hasMenus() || this.hasOffers() || this.hasEvents();\n }\n\n public availableCommercials(): {\n hasEvents: boolean;\n hasOffers: boolean;\n hasMenus: boolean;\n } {\n return {\n hasEvents: this.hasEvents(),\n hasOffers: this.hasOffers(),\n hasMenus: this.hasMenus(),\n };\n }\n}\n\nexport default CommercialsService.get();\n","import React, { memo, useEffect, useState } from \"react\";\nimport moment, { LocaleSpecifier } from \"moment\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { capitalize } from \"../../utils\";\nimport UserGroup from \"../../assets/images/user-group\";\nimport DateRangeIcon from \"@material-ui/icons/DateRange\";\nimport AccessTimeIcon from \"@material-ui/icons/AccessTime\";\nimport { selectionStore } from \"../../stores/selection.store\";\nimport { InputWithIcon } from \"../input-with-icon/input-with-icon\";\nimport { ActionButton } from \"../action-button/action-button\";\nimport selectionGuestsService from \"../../services/selection-guests-service\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport commercialsService from \"../../services/commercials.service\";\nimport { useLocation } from \"react-router-dom\";\nimport { getLanguageSwitcherService } from \"../../services/language-switcher.service\";\n\nconst SummaryCriteriaWrapper = styled.div`\n display: flex;\n position: relative;\n align-items: center;\n padding-bottom: 32px;\n width: 100%;\n justify-content: end;\n`;\n\nconst BackButton = styled.div`\n position: absolute;\n margin-left: -36px;\n left: 0;\n display: flex;\n align-items: center;\n\n @media screen and (max-width: 930px) {\n margin-left: 0;\n left: 0;\n }\n\n #back svg {\n transform: translateX(4px);\n }\n`;\n\nconst Inputs = styled.div`\n display: flex;\n width: 100%;\n\n .input-with-icon {\n padding-right: 6px;\n }\n\n @media screen and (max-width: 930px) {\n width: calc(100% - 32px - 4px);\n margin-left: 36px;\n\n .input-with-icon:nth-child(1) {\n width: 25%;\n }\n\n .input-with-icon:nth-child(2) {\n width: 50%;\n }\n\n .input-with-icon:nth-child(3) {\n width: 30%;\n padding-right: 0;\n }\n\n .input-with-icon input {\n text-align: center;\n position: relative;\n left: 50%;\n transform: translateX(-50%);\n margin-right: -3px;\n }\n\n .input-with-icon svg {\n display: none;\n }\n }\n`;\n\nconst SummaryCriteriaLayout = () => {\n const { i18n } = useTranslation();\n const location = useLocation();\n const selectedGuests = selectionStore.guests + selectionStore.children;\n const selectedDate = selectionStore.date;\n const selectedTime = selectionStore.time;\n const hasCommercialPage =\n pendingBookingStore.getIsVoucherEnabled() ||\n commercialsService.hasCommercials();\n const [localeForMoment, setLocaleForMoment] = useState<string | null>(null);\n const [windowWidth, setWindowWidth] = useState(0);\n\n const handleBackButton = () => {\n selectionStore.backButtonClicked = true;\n };\n\n useEffect(() => {\n const handleResize = () => {\n setWindowWidth(window.innerWidth);\n };\n window.addEventListener(\"resize\", handleResize);\n handleResize();\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n useEffect(() => {\n setLocaleForMoment(getLanguageSwitcherService().localeForMoment());\n }, [i18n.language]);\n\n const setBackRoute =\n location.pathname.endsWith(\"confirmation\") && hasCommercialPage\n ? \"commercials\"\n : \"selection\";\n\n const setCancelPB =\n location.pathname.endsWith(\"confirmation\") && hasCommercialPage\n ? false\n : true;\n\n const selectedGuestsValue =\n windowWidth > 550\n ? selectionGuestsService.setSelectedGuestsToString(selectedGuests)\n : selectedGuests;\n\n const format = windowWidth > 550 ? \"dddd LL\" : \"L\";\n\n const selectedDateValue =\n Number(selectedDate) > 0 && !!localeForMoment\n ? capitalize(moment(selectedDate).locale(localeForMoment).format(format))\n : \"\";\n\n return (\n <SummaryCriteriaWrapper data-test=\"summary-criteria\">\n <BackButton>\n <ActionButton\n route={setBackRoute}\n cancelPB={setCancelPB}\n action={\"back\"}\n handleClick={handleBackButton}\n />\n </BackButton>\n <Inputs>\n <InputWithIcon\n error={false}\n value={selectedGuestsValue}\n helperText={\"\"}\n variant={\"outlined\"}\n icon={<UserGroup />}\n isSummary={true}\n dataTest=\"selected-pax\"\n />\n <InputWithIcon\n error={false}\n value={selectedDateValue}\n helperText={\"\"}\n variant={\"outlined\"}\n icon={<DateRangeIcon />}\n isSummary={true}\n dataTest=\"selected-date\"\n />\n <InputWithIcon\n error={false}\n value={selectedTime}\n helperText={\"\"}\n variant={\"outlined\"}\n icon={<AccessTimeIcon />}\n isSummary={true}\n dataTest=\"selected-time\"\n />\n </Inputs>\n </SummaryCriteriaWrapper>\n );\n};\nexport const SummaryCriteria = memo(SummaryCriteriaLayout);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { GolFieldElement } from \"./gol-contact-form-interfaces\";\nimport { TextField } from \"@material-ui/core\";\n\nconst CustomErrorField = styled(TextField)`\n &.error {\n fieldset {\n border-color: ${(props) => props.theme.error};\n }\n\n p.Mui-required {\n color: ${(props) => props.theme.error};\n margin-top: 0;\n }\n }\n`;\n\nconst GolContactErrorField = memo((props: GolFieldElement) => {\n const {\n clazz,\n onChange,\n errorMsg,\n required = false,\n value,\n label,\n name,\n textSize = \"small\",\n } = props;\n return (\n <CustomErrorField\n fullWidth={false}\n size={textSize}\n name={name}\n onChange={onChange}\n className={clazz}\n required={required}\n label={label}\n variant={\"outlined\" as any}\n helperText={errorMsg}\n defaultValue={value}\n />\n );\n});\n\nexport { GolContactErrorField };\n","import React, { memo } from \"react\";\nimport { GolContactTextFieldProps } from \"./gol-contact-form-interfaces\";\nimport { TextField } from \"@material-ui/core\";\nimport { withStyles } from \"@material-ui/styles\";\nimport styled from \"styled-components\";\n\nconst CustomTextField = styled(TextField)`\n input[type=\"date\"] {\n color: ${(props) => props.theme.textColor};\n font-size: 0.8em;\n margin-bottom: 4px;\n padding: 10px;\n }\n input::placeholder {\n font-size: 12px;\n }\n`;\n\nconst GolContactTextField = memo((props: GolContactTextFieldProps) => {\n const {\n multiline = false,\n rows = 1,\n rowsMax = 1,\n inputLabelProps = {},\n fullWidth = false,\n label,\n value,\n placeholder,\n clazz,\n onChange,\n name,\n inputProps = {},\n textSize = \"small\",\n type = \"text\",\n } = props;\n return (\n <CustomTextField\n size={textSize}\n name={name}\n onChange={onChange}\n type={type}\n className={clazz}\n defaultValue={value}\n label={label}\n placeholder={placeholder}\n variant={\"outlined\"}\n multiline={multiline}\n rows={rows}\n rowsMax={rowsMax}\n fullWidth={fullWidth}\n inputProps={inputProps}\n InputLabelProps={inputLabelProps}\n />\n );\n});\n\nexport { GolContactTextField };\n","import {\n AutocompleteChangeDetails,\n AutocompleteChangeReason,\n} from \"@mui/material/Autocomplete\";\nimport React, { ReactNode, SetStateAction } from \"react\";\nimport { DropdownOption } from \"../../../types\";\nimport { Country } from \"./gol-country-picker\";\n\nexport interface GolContactTextFieldProps extends GolFieldElement {\n multiline?: boolean;\n rowsMax?: number;\n rows?: number;\n fullWidth?: boolean;\n placeholder?: string;\n}\n\nexport interface GolControlStyledLabel extends GolBaseField {\n controlName?: string;\n controlId?: string;\n label?: ReactNode;\n}\n\nexport interface GolFieldElement extends GolBaseField {\n label?: string;\n}\n\nexport interface GolContactCountryAutoComplete {\n id: string;\n label?: string;\n onChange: (ev: any) => void;\n name: string;\n claszName?: string;\n classes?: any;\n defaultValue: Country | undefined | string;\n defaultCountryError?: string;\n getOptionLabel: any;\n}\n\nexport interface GolContactGenderDropdown {\n onChange: (ev: any) => void;\n label?: string;\n options: DropdownOption[];\n name: string;\n}\ninterface GolBaseField {\n value?: string;\n onChange?: (ev: any) => void;\n name: string;\n clazz?: string;\n required?: boolean;\n errorMsg?: string;\n textSize?: \"small\" | \"medium\" | undefined;\n type?: string;\n inputProps?: { [key: string]: any };\n inputLabelProps?: { [key: string]: any };\n}\n\nexport interface GolContactInfoInterface {\n errorMsg: { [key: string]: any };\n setValidContactInfo: React.Dispatch<SetStateAction<boolean>>;\n setValidPptInfo: React.Dispatch<SetStateAction<boolean>>;\n checkContactInfoFormValidity: boolean;\n checkContactPptInfoFormValidity: boolean;\n setCheckContactInfoFormValidity: React.Dispatch<SetStateAction<boolean>>;\n setCheckContactPptInfoFormValidity: React.Dispatch<SetStateAction<boolean>>;\n}\n\nexport const GolContactInfoFormContext =\n React.createContext<GolContactInfoInterface>({} as GolContactInfoInterface);\n\nexport const GolContactFormContext = React.createContext({\n form: {} as { [key: string]: any },\n fieldsInErrors: [] as string[],\n handleFormChange: (ev: any) => {},\n requiredFields: [] as string[],\n});\n","import React, { memo, useContext } from \"react\";\nimport { GolContactErrorField } from \"./gol-contact-error-field\";\nimport { GolContactTextField } from \"./gol-contact-text-field\";\nimport {\n GolContactFormContext,\n GolFieldElement,\n} from \"./gol-contact-form-interfaces\";\nimport { useTranslation } from \"react-i18next\";\n\nconst GolContactNameField = memo((props: GolFieldElement) => {\n const { t } = useTranslation();\n const { name } = props;\n const formContext = useContext(GolContactFormContext);\n const { form, fieldsInErrors, handleFormChange, requiredFields } =\n formContext;\n const value = form[name];\n const required = props.required ? true : requiredFields.includes(name);\n const fieldInError = fieldsInErrors.includes(name);\n const fieldFills = typeof value !== \"undefined\" && value != null;\n const errorMsg = fieldInError\n ? required && !fieldFills\n ? t(\"instabook.contacts.required_field_error\")\n : t(\"instabook.errors.invalid_field\")\n : \"\";\n const defaultClazzName = props.clazz ?? name;\n const clazz = fieldInError\n ? `${defaultClazzName} error`\n : `${defaultClazzName} `;\n\n const defaultFieldValues = {\n ...props,\n value,\n label: t(`instabook.contacts.${name}`),\n clazz,\n required,\n errorMsg,\n onChange: handleFormChange,\n } as GolFieldElement;\n return (\n <>\n {required ? (\n <GolContactErrorField {...defaultFieldValues} />\n ) : (\n <GolContactTextField {...defaultFieldValues} />\n )}\n </>\n );\n});\n\nexport { GolContactNameField };\n","export const Countries = [\n { code: \"AD\", label: \"Andorra\", phone: \"376\" },\n { code: \"AE\", label: \"United Arab Emirates\", phone: \"971\" },\n { code: \"AF\", label: \"Afghanistan\", phone: \"93\" },\n { code: \"AG\", label: \"Antigua and Barbuda\", phone: \"1-268\" },\n { code: \"AI\", label: \"Anguilla\", phone: \"1-264\" },\n { code: \"AL\", label: \"Albania\", phone: \"355\" },\n { code: \"AM\", label: \"Armenia\", phone: \"374\" },\n { code: \"AO\", label: \"Angola\", phone: \"244\" },\n { code: \"AQ\", label: \"Antarctica\", phone: \"672\" },\n { code: \"AR\", label: \"Argentina\", phone: \"54\" },\n { code: \"AS\", label: \"American Samoa\", phone: \"1-684\" },\n { code: \"AT\", label: \"Austria\", phone: \"43\" },\n { code: \"AU\", label: \"Australia\", phone: \"61\", suggested: true },\n { code: \"AW\", label: \"Aruba\", phone: \"297\" },\n { code: \"AX\", label: \"Alland Islands\", phone: \"358\" },\n { code: \"AZ\", label: \"Azerbaijan\", phone: \"994\" },\n { code: \"BA\", label: \"Bosnia and Herzegovina\", phone: \"387\" },\n { code: \"BB\", label: \"Barbados\", phone: \"1-246\" },\n { code: \"BD\", label: \"Bangladesh\", phone: \"880\" },\n { code: \"BE\", label: \"Belgium\", phone: \"32\" },\n { code: \"BF\", label: \"Burkina Faso\", phone: \"226\" },\n { code: \"BG\", label: \"Bulgaria\", phone: \"359\" },\n { code: \"BH\", label: \"Bahrain\", phone: \"973\" },\n { code: \"BI\", label: \"Burundi\", phone: \"257\" },\n { code: \"BJ\", label: \"Benin\", phone: \"229\" },\n { code: \"BL\", label: \"Saint Barthelemy\", phone: \"590\" },\n { code: \"BM\", label: \"Bermuda\", phone: \"1-441\" },\n { code: \"BN\", label: \"Brunei Darussalam\", phone: \"673\" },\n { code: \"BO\", label: \"Bolivia\", phone: \"591\" },\n { code: \"BR\", label: \"Brazil\", phone: \"55\" },\n { code: \"BS\", label: \"Bahamas\", phone: \"1-242\" },\n { code: \"BT\", label: \"Bhutan\", phone: \"975\" },\n { code: \"BV\", label: \"Bouvet Island\", phone: \"47\" },\n { code: \"BW\", label: \"Botswana\", phone: \"267\" },\n { code: \"BY\", label: \"Belarus\", phone: \"375\" },\n { code: \"BZ\", label: \"Belize\", phone: \"501\" },\n { code: \"CA\", label: \"Canada\", phone: \"1\", suggested: true },\n { code: \"CC\", label: \"Cocos (Keeling) Islands\", phone: \"61\" },\n { code: \"CD\", label: \"Congo, Democratic Republic of the\", phone: \"243\" },\n { code: \"CF\", label: \"Central African Republic\", phone: \"236\" },\n { code: \"CG\", label: \"Congo, Republic of the\", phone: \"242\" },\n { code: \"CH\", label: \"Switzerland\", phone: \"41\" },\n { code: \"CI\", label: \"Cote d'Ivoire\", phone: \"225\" },\n { code: \"CK\", label: \"Cook Islands\", phone: \"682\" },\n { code: \"CL\", label: \"Chile\", phone: \"56\" },\n { code: \"CM\", label: \"Cameroon\", phone: \"237\" },\n { code: \"CN\", label: \"China\", phone: \"86\" },\n { code: \"CO\", label: \"Colombia\", phone: \"57\" },\n { code: \"CR\", label: \"Costa Rica\", phone: \"506\" },\n { code: \"CU\", label: \"Cuba\", phone: \"53\" },\n { code: \"CV\", label: \"Cape Verde\", phone: \"238\" },\n { code: \"CW\", label: \"Curacao\", phone: \"599\" },\n { code: \"CX\", label: \"Christmas Island\", phone: \"61\" },\n { code: \"CY\", label: \"Cyprus\", phone: \"357\" },\n { code: \"CZ\", label: \"Czech Republic\", phone: \"420\" },\n { code: \"DE\", label: \"Germany\", phone: \"49\", suggested: true },\n { code: \"DJ\", label: \"Djibouti\", phone: \"253\" },\n { code: \"DK\", label: \"Denmark\", phone: \"45\" },\n { code: \"DM\", label: \"Dominica\", phone: \"1-767\" },\n { code: \"DO\", label: \"Dominican Republic\", phone: \"1-809\" },\n { code: \"DZ\", label: \"Algeria\", phone: \"213\" },\n { code: \"EC\", label: \"Ecuador\", phone: \"593\" },\n { code: \"EE\", label: \"Estonia\", phone: \"372\" },\n { code: \"EG\", label: \"Egypt\", phone: \"20\" },\n { code: \"EH\", label: \"Western Sahara\", phone: \"212\" },\n { code: \"ER\", label: \"Eritrea\", phone: \"291\" },\n { code: \"ES\", label: \"Spain\", phone: \"34\" },\n { code: \"ET\", label: \"Ethiopia\", phone: \"251\" },\n { code: \"FI\", label: \"Finland\", phone: \"358\" },\n { code: \"FJ\", label: \"Fiji\", phone: \"679\" },\n { code: \"FK\", label: \"Falkland Islands (Malvinas)\", phone: \"500\" },\n { code: \"FM\", label: \"Micronesia, Federated States of\", phone: \"691\" },\n { code: \"FO\", label: \"Faroe Islands\", phone: \"298\" },\n { code: \"FR\", label: \"France\", phone: \"33\", suggested: true },\n { code: \"GA\", label: \"Gabon\", phone: \"241\" },\n { code: \"GB\", label: \"United Kingdom\", phone: \"44\" },\n { code: \"GD\", label: \"Grenada\", phone: \"1-473\" },\n { code: \"GE\", label: \"Georgia\", phone: \"995\" },\n { code: \"GF\", label: \"French Guiana\", phone: \"594\" },\n { code: \"GG\", label: \"Guernsey\", phone: \"44\" },\n { code: \"GH\", label: \"Ghana\", phone: \"233\" },\n { code: \"GI\", label: \"Gibraltar\", phone: \"350\" },\n { code: \"GL\", label: \"Greenland\", phone: \"299\" },\n { code: \"GM\", label: \"Gambia\", phone: \"220\" },\n { code: \"GN\", label: \"Guinea\", phone: \"224\" },\n { code: \"GP\", label: \"Guadeloupe\", phone: \"590\" },\n { code: \"GQ\", label: \"Equatorial Guinea\", phone: \"240\" },\n { code: \"GR\", label: \"Greece\", phone: \"30\" },\n {\n code: \"GS\",\n label: \"South Georgia and the South Sandwich Islands\",\n phone: \"500\",\n },\n { code: \"GT\", label: \"Guatemala\", phone: \"502\" },\n { code: \"GU\", label: \"Guam\", phone: \"1-671\" },\n { code: \"GW\", label: \"Guinea-Bissau\", phone: \"245\" },\n { code: \"GY\", label: \"Guyana\", phone: \"592\" },\n { code: \"HK\", label: \"Hong Kong\", phone: \"852\" },\n { code: \"HM\", label: \"Heard Island and McDonald Islands\", phone: \"672\" },\n { code: \"HN\", label: \"Honduras\", phone: \"504\" },\n { code: \"HR\", label: \"Croatia\", phone: \"385\" },\n { code: \"HT\", label: \"Haiti\", phone: \"509\" },\n { code: \"HU\", label: \"Hungary\", phone: \"36\" },\n { code: \"ID\", label: \"Indonesia\", phone: \"62\" },\n { code: \"IE\", label: \"Ireland\", phone: \"353\" },\n { code: \"IL\", label: \"Israel\", phone: \"972\" },\n { code: \"IM\", label: \"Isle of Man\", phone: \"44\" },\n { code: \"IN\", label: \"India\", phone: \"91\" },\n { code: \"IO\", label: \"British Indian Ocean Territory\", phone: \"246\" },\n { code: \"IQ\", label: \"Iraq\", phone: \"964\" },\n { code: \"IR\", label: \"Iran, Islamic Republic of\", phone: \"98\" },\n { code: \"IS\", label: \"Iceland\", phone: \"354\" },\n { code: \"IT\", label: \"Italy\", phone: \"39\" },\n { code: \"JE\", label: \"Jersey\", phone: \"44\" },\n { code: \"JM\", label: \"Jamaica\", phone: \"1-876\" },\n { code: \"JO\", label: \"Jordan\", phone: \"962\" },\n { code: \"JP\", label: \"Japan\", phone: \"81\", suggested: true },\n { code: \"KE\", label: \"Kenya\", phone: \"254\" },\n { code: \"KG\", label: \"Kyrgyzstan\", phone: \"996\" },\n { code: \"KH\", label: \"Cambodia\", phone: \"855\" },\n { code: \"KI\", label: \"Kiribati\", phone: \"686\" },\n { code: \"KM\", label: \"Comoros\", phone: \"269\" },\n { code: \"KN\", label: \"Saint Kitts and Nevis\", phone: \"1-869\" },\n { code: \"KP\", label: \"Korea, Democratic People's Republic of\", phone: \"850\" },\n { code: \"KR\", label: \"Korea, Republic of\", phone: \"82\" },\n { code: \"KW\", label: \"Kuwait\", phone: \"965\" },\n { code: \"KY\", label: \"Cayman Islands\", phone: \"1-345\" },\n { code: \"KZ\", label: \"Kazakhstan\", phone: \"7\" },\n { code: \"LA\", label: \"Lao People's Democratic Republic\", phone: \"856\" },\n { code: \"LB\", label: \"Lebanon\", phone: \"961\" },\n { code: \"LC\", label: \"Saint Lucia\", phone: \"1-758\" },\n { code: \"LI\", label: \"Liechtenstein\", phone: \"423\" },\n { code: \"LK\", label: \"Sri Lanka\", phone: \"94\" },\n { code: \"LR\", label: \"Liberia\", phone: \"231\" },\n { code: \"LS\", label: \"Lesotho\", phone: \"266\" },\n { code: \"LT\", label: \"Lithuania\", phone: \"370\" },\n { code: \"LU\", label: \"Luxembourg\", phone: \"352\" },\n { code: \"LV\", label: \"Latvia\", phone: \"371\" },\n { code: \"LY\", label: \"Libya\", phone: \"218\" },\n { code: \"MA\", label: \"Morocco\", phone: \"212\" },\n { code: \"MC\", label: \"Monaco\", phone: \"377\" },\n { code: \"MD\", label: \"Moldova, Republic of\", phone: \"373\" },\n { code: \"ME\", label: \"Montenegro\", phone: \"382\" },\n { code: \"MF\", label: \"Saint Martin (French part)\", phone: \"590\" },\n { code: \"MG\", label: \"Madagascar\", phone: \"261\" },\n { code: \"MH\", label: \"Marshall Islands\", phone: \"692\" },\n {\n code: \"MK\",\n label: \"Macedonia, the Former Yugoslav Republic of\",\n phone: \"389\",\n },\n { code: \"ML\", label: \"Mali\", phone: \"223\" },\n { code: \"MM\", label: \"Myanmar\", phone: \"95\" },\n { code: \"MN\", label: \"Mongolia\", phone: \"976\" },\n { code: \"MO\", label: \"Macao\", phone: \"853\" },\n { code: \"MP\", label: \"Northern Mariana Islands\", phone: \"1-670\" },\n { code: \"MQ\", label: \"Martinique\", phone: \"596\" },\n { code: \"MR\", label: \"Mauritania\", phone: \"222\" },\n { code: \"MS\", label: \"Montserrat\", phone: \"1-664\" },\n { code: \"MT\", label: \"Malta\", phone: \"356\" },\n { code: \"MU\", label: \"Mauritius\", phone: \"230\" },\n { code: \"MV\", label: \"Maldives\", phone: \"960\" },\n { code: \"MW\", label: \"Malawi\", phone: \"265\" },\n { code: \"MX\", label: \"Mexico\", phone: \"52\" },\n { code: \"MY\", label: \"Malaysia\", phone: \"60\" },\n { code: \"MZ\", label: \"Mozambique\", phone: \"258\" },\n { code: \"NA\", label: \"Namibia\", phone: \"264\" },\n { code: \"NC\", label: \"New Caledonia\", phone: \"687\" },\n { code: \"NE\", label: \"Niger\", phone: \"227\" },\n { code: \"NF\", label: \"Norfolk Island\", phone: \"672\" },\n { code: \"NG\", label: \"Nigeria\", phone: \"234\" },\n { code: \"NI\", label: \"Nicaragua\", phone: \"505\" },\n { code: \"NL\", label: \"Netherlands\", phone: \"31\" },\n { code: \"NO\", label: \"Norway\", phone: \"47\" },\n { code: \"NP\", label: \"Nepal\", phone: \"977\" },\n { code: \"NR\", label: \"Nauru\", phone: \"674\" },\n { code: \"NU\", label: \"Niue\", phone: \"683\" },\n { code: \"NZ\", label: \"New Zealand\", phone: \"64\" },\n { code: \"OM\", label: \"Oman\", phone: \"968\" },\n { code: \"PA\", label: \"Panama\", phone: \"507\" },\n { code: \"PE\", label: \"Peru\", phone: \"51\" },\n { code: \"PF\", label: \"French Polynesia\", phone: \"689\" },\n { code: \"PG\", label: \"Papua New Guinea\", phone: \"675\" },\n { code: \"PH\", label: \"Philippines\", phone: \"63\" },\n { code: \"PK\", label: \"Pakistan\", phone: \"92\" },\n { code: \"PL\", label: \"Poland\", phone: \"48\" },\n { code: \"PM\", label: \"Saint Pierre and Miquelon\", phone: \"508\" },\n { code: \"PN\", label: \"Pitcairn\", phone: \"870\" },\n { code: \"PR\", label: \"Puerto Rico\", phone: \"1\" },\n { code: \"PS\", label: \"Palestine, State of\", phone: \"970\" },\n { code: \"PT\", label: \"Portugal\", phone: \"351\" },\n { code: \"PW\", label: \"Palau\", phone: \"680\" },\n { code: \"PY\", label: \"Paraguay\", phone: \"595\" },\n { code: \"QA\", label: \"Qatar\", phone: \"974\" },\n { code: \"RE\", label: \"Reunion\", phone: \"262\" },\n { code: \"RO\", label: \"Romania\", phone: \"40\" },\n { code: \"RS\", label: \"Serbia\", phone: \"381\" },\n { code: \"RU\", label: \"Russian Federation\", phone: \"7\" },\n { code: \"RW\", label: \"Rwanda\", phone: \"250\" },\n { code: \"SA\", label: \"Saudi Arabia\", phone: \"966\" },\n { code: \"SB\", label: \"Solomon Islands\", phone: \"677\" },\n { code: \"SC\", label: \"Seychelles\", phone: \"248\" },\n { code: \"SD\", label: \"Sudan\", phone: \"249\" },\n { code: \"SE\", label: \"Sweden\", phone: \"46\" },\n { code: \"SG\", label: \"Singapore\", phone: \"65\" },\n { code: \"SH\", label: \"Saint Helena\", phone: \"290\" },\n { code: \"SI\", label: \"Slovenia\", phone: \"386\" },\n { code: \"SJ\", label: \"Svalbard and Jan Mayen\", phone: \"47\" },\n { code: \"SK\", label: \"Slovakia\", phone: \"421\" },\n { code: \"SL\", label: \"Sierra Leone\", phone: \"232\" },\n { code: \"SM\", label: \"San Marino\", phone: \"378\" },\n { code: \"SN\", label: \"Senegal\", phone: \"221\" },\n { code: \"SO\", label: \"Somalia\", phone: \"252\" },\n { code: \"SR\", label: \"Suriname\", phone: \"597\" },\n { code: \"SS\", label: \"South Sudan\", phone: \"211\" },\n { code: \"ST\", label: \"Sao Tome and Principe\", phone: \"239\" },\n { code: \"SV\", label: \"El Salvador\", phone: \"503\" },\n { code: \"SX\", label: \"Sint Maarten (Dutch part)\", phone: \"1-721\" },\n { code: \"SY\", label: \"Syrian Arab Republic\", phone: \"963\" },\n { code: \"SZ\", label: \"Swaziland\", phone: \"268\" },\n { code: \"TC\", label: \"Turks and Caicos Islands\", phone: \"1-649\" },\n { code: \"TD\", label: \"Chad\", phone: \"235\" },\n { code: \"TF\", label: \"French Southern Territories\", phone: \"262\" },\n { code: \"TG\", label: \"Togo\", phone: \"228\" },\n { code: \"TH\", label: \"Thailand\", phone: \"66\" },\n { code: \"TJ\", label: \"Tajikistan\", phone: \"992\" },\n { code: \"TK\", label: \"Tokelau\", phone: \"690\" },\n { code: \"TL\", label: \"Timor-Leste\", phone: \"670\" },\n { code: \"TM\", label: \"Turkmenistan\", phone: \"993\" },\n { code: \"TN\", label: \"Tunisia\", phone: \"216\" },\n { code: \"TO\", label: \"Tonga\", phone: \"676\" },\n { code: \"TR\", label: \"Turkey\", phone: \"90\" },\n { code: \"TT\", label: \"Trinidad and Tobago\", phone: \"1-868\" },\n { code: \"TV\", label: \"Tuvalu\", phone: \"688\" },\n { code: \"TW\", label: \"Taiwan, Province of China\", phone: \"886\" },\n { code: \"TZ\", label: \"United Republic of Tanzania\", phone: \"255\" },\n { code: \"UA\", label: \"Ukraine\", phone: \"380\" },\n { code: \"UG\", label: \"Uganda\", phone: \"256\" },\n { code: \"US\", label: \"United States\", phone: \"1\", suggested: true },\n { code: \"UY\", label: \"Uruguay\", phone: \"598\" },\n { code: \"UZ\", label: \"Uzbekistan\", phone: \"998\" },\n { code: \"VA\", label: \"Holy See (Vatican City State)\", phone: \"379\" },\n { code: \"VC\", label: \"Saint Vincent and the Grenadines\", phone: \"1-784\" },\n { code: \"VE\", label: \"Venezuela\", phone: \"58\" },\n { code: \"VG\", label: \"British Virgin Islands\", phone: \"1-284\" },\n { code: \"VI\", label: \"US Virgin Islands\", phone: \"1-340\" },\n { code: \"VN\", label: \"Vietnam\", phone: \"84\" },\n { code: \"VU\", label: \"Vanuatu\", phone: \"678\" },\n { code: \"WF\", label: \"Wallis and Futuna\", phone: \"681\" },\n { code: \"WS\", label: \"Samoa\", phone: \"685\" },\n { code: \"XK\", label: \"Kosovo\", phone: \"383\" },\n { code: \"YE\", label: \"Yemen\", phone: \"967\" },\n { code: \"YT\", label: \"Mayotte\", phone: \"262\" },\n { code: \"ZA\", label: \"South Africa\", phone: \"27\" },\n { code: \"ZM\", label: \"Zambia\", phone: \"260\" },\n { code: \"ZW\", label: \"Zimbabwe\", phone: \"263\" },\n];\n","import Autocomplete, { AutocompleteClassKey, AutocompleteRenderInputParams, AutocompleteRenderOptionState } from \"@material-ui/lab/Autocomplete\";\nimport { ClassNameMap } from \"@mui/material\";\nimport React, { memo } from \"react\";\nconst GolAutoComplete = (props: {\n id: string,\n size?: \"small\" | \"medium\"\n getOptionLabel: (option: any) => string, value: any, options: any, classes?: Partial<ClassNameMap<AutocompleteClassKey>> | undefined,\n renderInput: (params: AutocompleteRenderInputParams) => JSX.Element, renderOption: (options: any, state: any) => JSX.Element,\n onChange: (event: React.ChangeEvent<{}>, value: any) => void\n}) => {\n return <Autocomplete\n fullWidth\n id={props.id}\n disableClearable\n size={props.size ?? \"small\"}\n options={props.options}\n value={props.value}\n classes={props.classes}\n autoHighlight\n getOptionLabel={props.getOptionLabel}\n renderOption={props.renderOption}\n onChange={props.onChange}\n renderInput={props.renderInput}\n />\n};\n\nexport default memo(GolAutoComplete);","import { memo, useEffect, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport { TextField } from \"@material-ui/core\";\nimport React from \"react\";\nimport { Countries } from \"../../../assets/json/countries\";\nimport { GolContactCountryAutoComplete } from \"./gol-contact-form-interfaces\";\nimport GolAutocomplete from \"./gol-autocomplete\";\nimport styled from \"styled-components\";\nimport ReactCountryFlag from \"react-country-flag\";\nimport { useTranslation } from \"react-i18next\";\nimport { AutocompleteRenderInputParams } from \"@mui/material\";\nexport interface Country {\n code: string;\n label: string;\n phone: string;\n}\n\nconst AutocompleteWrapper = styled.div`\n display: flex;\n\n [class*=\"MuiOutlinedInput-root\"] {\n height: 40px;\n }\n\n input#country-picker {\n font-size: 14px;\n }\n`;\n\nconst CustomField = styled.div`\n font-size: 14px;\n`;\n\nconst CustomErrorField = styled(TextField)`\n &.error {\n fieldset {\n border-color: ${(props) => props.theme.error};\n }\n\n p.Mui-required {\n color: ${(props) => props.theme.error};\n margin-top: 0;\n }\n }\n`;\nconst GolCountryPicker = (props: GolContactCountryAutoComplete) => {\n const [country, setCountry] = useState<undefined | Country | string>(\n props.defaultValue\n );\n useEffect(() => {\n setCountry(props.defaultValue);\n }, [props]);\n const { t } = useTranslation();\n const handleSelectCountry = (\n event: any,\n value: {\n code: string;\n label: string;\n phone: string;\n }\n ) => {\n if (typeof value != \"string\") {\n setCountry({\n code: value.code,\n label: value.label,\n phone: value.phone,\n } as Country);\n props.onChange({ target: { name: props.name, value: value } });\n }\n };\n const renderOptionCountry = (option: Country, props: any) => (\n <Box\n component=\"div\"\n sx={{ \"& > img\": { mr: 2, flexShrink: 0 } }}\n {...props}\n >\n <img\n loading=\"lazy\"\n width=\"20\"\n src={`https://flagcdn.com/w20/${option.code.toLowerCase()}.png`}\n srcSet={`https://flagcdn.com/w40/${option.code.toLowerCase()}.png 2x`}\n alt=\"\"\n />\n {option.label} ({option.code})\n </Box>\n );\n const renderOptionCountryCode = (option: Country) => (\n <CustomField>\n <ReactCountryFlag countryCode={option.code} svg /> {option.label} +\n {option.phone}\n </CustomField>\n );\n const renderInputCountryCode = (params: AutocompleteRenderInputParams) => (\n <CustomErrorField\n {...params}\n name={\"defaultCountry\"}\n label={t(\"instabook.contacts.prefix\")}\n className={props.defaultCountryError ? \"error\" : \"\"}\n variant={\"outlined\" as any}\n required={true}\n inputProps={{\n ...params.inputProps,\n // autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n );\n const renderInputCountry = (params: AutocompleteRenderInputParams) => (\n <TextField\n name=\"country-picker\"\n {...params}\n variant={\"outlined\" as any}\n fullWidth={true}\n label={props.label}\n inputProps={{\n ...params.inputProps,\n autoComplete: \"new-password\", // disable autocomplete and autofill\n }}\n />\n );\n const renderInput =\n props.name == \"country\" ? renderInputCountry : renderInputCountryCode;\n const renderOption =\n props.name === \"country\" ? renderOptionCountry : renderOptionCountryCode;\n return (\n <AutocompleteWrapper className={props.claszName ?? \"\"}>\n <GolAutocomplete\n id={props.id}\n classes={props.classes}\n value={country}\n onChange={handleSelectCountry}\n getOptionLabel={props.getOptionLabel}\n options={Countries}\n renderOption={renderOption}\n renderInput={renderInput}\n />\n </AutocompleteWrapper>\n );\n};\n\nexport default memo(GolCountryPicker);\n","import React, { memo, useContext } from \"react\";\nimport styled from \"styled-components\";\nimport {\n GolFieldElement,\n GolContactFormContext,\n} from \"./gol-contact-form-interfaces\";\nimport { GolContactErrorField } from \"./gol-contact-error-field\";\nimport { useTranslation } from \"react-i18next\";\nimport GolCountryPicker, { Country } from \"./gol-country-picker\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nconst Prefix = styled.div`\n flex: 1;\n display: flex;\n @media screen and (max-width: 980px) {\n flex: 0 0 10%;\n margin-right: 8px;\n }\n`;\n\nconst PhoneNumber = styled.div`\n flex: 2;\n display: flex;\n @media screen and (max-width: 980px) {\n flex: 2 0 60%;\n }\n`;\nconst PhoneWrapper = styled.div`\n display: flex;\n\n input#country-select {\n min-width: 40px !important;\n margin-right: -4px;\n }\n`;\nconst useStyles = makeStyles({\n option: {\n \"MuiIconButton-label-*\": {\n marginRight: 10,\n fontSize: 18,\n },\n },\n});\nconst GolContactPhoneField = memo((props: GolFieldElement) => {\n const { t } = useTranslation();\n const { name } = props;\n const formContext = useContext(GolContactFormContext);\n const { form, fieldsInErrors, handleFormChange, requiredFields } =\n formContext;\n const value = form[name];\n const required = requiredFields.includes(name);\n const fieldInError = fieldsInErrors.includes(name);\n const fieldFills = typeof value !== \"undefined\" && value != null;\n const errorMsg = fieldInError\n ? required && !fieldFills\n ? t(\"instabook.contacts.required_field_error\")\n : t(\"instabook.errors.invalid_field\")\n : \"\";\n const defaultClazzName = props.clazz ?? name;\n const clazz = fieldInError\n ? `${defaultClazzName} error`\n : `${defaultClazzName} `;\n const defaultPhoneFieldValues = {\n ...props,\n value,\n label: t(`instabook.contacts.${name}`),\n clazz,\n required,\n errorMsg,\n onChange: handleFormChange,\n } as GolFieldElement;\n\n const classes = useStyles();\n return (\n <PhoneWrapper className=\"contactField golFlexOne\">\n <Prefix>\n <GolCountryPicker\n id=\"country-select\"\n name=\"country_code\"\n onChange={handleFormChange}\n defaultValue={form[\"country_code\"]}\n defaultCountryError={\n fieldsInErrors.includes(\"country_code\") === true ? \"error\" : \"\"\n }\n getOptionLabel={(option: Country) => \"+\" + option.phone}\n classes={{\n option: classes.option,\n }}\n />\n </Prefix>\n <PhoneNumber>\n <GolContactErrorField {...defaultPhoneFieldValues} />\n </PhoneNumber>\n </PhoneWrapper>\n );\n});\n\nexport { GolContactPhoneField };\n","import styled from \"styled-components\";\nimport { FormControlLabel } from \"@material-ui/core\";\n\nexport const RadioWrapper = styled.div`\n flex: 0 0 100%;\n padding: 0 10px;\n`;\n\nexport const FormControlStyledLabel = styled(FormControlLabel)`\n display: flex;\n\n a {\n color: ${(props) => props.theme.primaryColor};\n }\n\n svg {\n font-size: 1rem;\n margin-left: 2px;\n }\n\n &.error {\n svg,\n a,\n span {\n color: ${(props) => props.theme.error};\n }\n }\n`;\n","import { Checkbox } from \"@material-ui/core\";\nimport React, { memo, useContext, useState } from \"react\";\nimport { FormControlStyledLabel, RadioWrapper } from \"./gol-contact-css\";\nimport {\n GolContactFormContext,\n GolControlStyledLabel,\n} from \"./gol-contact-form-interfaces\";\n\nconst GolCheckField = memo((props: GolControlStyledLabel) => {\n const { name, controlName, controlId, label } = props;\n const formContext = useContext(GolContactFormContext);\n const { fieldsInErrors, handleFormChange, form } = formContext;\n const [isChecked, setIsChecked] = useState(form[name] ?? false);\n const clazz = fieldsInErrors.includes(name) ? `error` : ``;\n\n const onCheck = (ev) => {\n setIsChecked(!isChecked);\n handleFormChange(ev);\n };\n\n return (\n <RadioWrapper>\n <FormControlStyledLabel\n onChange={onCheck}\n id={controlId}\n className={clazz}\n control={<Checkbox name={controlName} />}\n label={label}\n checked={isChecked ?? false}\n />\n </RadioWrapper>\n );\n});\n\nexport { GolCheckField };\n","import React, { memo } from \"react\";\nimport { InformationText } from \"../information-text/information-text\";\nimport styled from \"styled-components\";\n\ninterface IProps {\n error: string;\n status?: string;\n}\n\nconst ErrorMessageWrapper = styled.div`\n width: 100%;\n`;\n\nconst ErrorMessageView = (props: IProps) => {\n return (\n <ErrorMessageWrapper>\n <InformationText\n data-test=\"error-message-view\"\n text={props.error}\n status={props.status}\n />\n </ErrorMessageWrapper>\n );\n};\n\nexport const ErrorMessage = memo(ErrorMessageView);\n","import React, { memo, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport {\n FormControl,\n InputLabel,\n MenuItem,\n OutlinedInput,\n Select,\n} from \"@material-ui/core\";\nimport { DropdownOption, NormalizedOption } from \"../../types\";\n\ninterface IProps {\n options: Array<DropdownOption>;\n placeholderOption?: DropdownOption;\n isGuestsSelection?: boolean;\n placeholderIcon?: string;\n placeholderSelectable?: boolean;\n onItemClick?: (event: React.ChangeEvent<{ value: any }>) => void;\n icon?: any;\n dataTest?: string;\n label?: string;\n size?: \"small\" | \"medium\" | undefined;\n requiredWithPlaceholder?: boolean;\n helper?: string;\n}\n\nconst DropdownStyle = styled.div`\n position: relative;\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n`;\n\nconst CustomIcon = styled.div`\n position: absolute;\n right: 15px;\n top: 50%;\n transform: translateY(-50%);\n height: 100%;\n display: flex;\n align-items: center;\n z-index: 0;\n`;\n\nconst CustomSelect = styled(Select)`\n min-width: 200px;\n z-index: 10;\n\n &.custom-icon {\n /* padding-right: 40px; */\n\n svg {\n display: none;\n }\n }\n\n &.guests-selection {\n min-width: 100px;\n }\n\n .MuiSelect-select {\n text-align: left;\n\n span {\n color: ${(props) => props.theme.disabledColor};\n }\n }\n\n .MuiSelect-icon {\n right: 10px;\n }\n`;\n\nconst Helper = styled.div`\n font-size: 12px;\n margin-top: 2px;\n text-align: left;\n`;\n\nconst normalizeOption = (option: string) => {\n return option.split(\" \").join(\"-\").toLowerCase();\n};\n\nconst DropdownComponent = (props: IProps) => {\n const optionClicked = (itemValue: any) => {\n const value = itemValue;\n options.forEach((option) => {\n option.isSelected = option.value === value;\n });\n setOptions([...options]);\n if (props.onItemClick) {\n props.onItemClick(itemValue);\n }\n };\n const placeholderOption = props.placeholderOption;\n const defaultOptionSelectable = props.placeholderSelectable;\n const [options, setOptions] = useState<Array<NormalizedOption>>([\n ...props.options,\n ]);\n useEffect(() => {\n const normalizedOptions = props.options.map((option: DropdownOption) => {\n return {\n ...option,\n isSelected: option.isSelected,\n normalized: normalizeOption(option.value),\n };\n });\n setOptions([...normalizedOptions]);\n }, [props]);\n const getValue = () => {\n const item = options.find((option) => option.isSelected);\n return item\n ? item.value\n : props.placeholderOption\n ? props.placeholderOption!.value\n : \"\";\n };\n const { label } = props;\n const guestsClass = props.isGuestsSelection ? \"guests-selection\" : \"\";\n const iconClass = props.icon ? \"custom-icon\" : \"\";\n return (\n <DropdownStyle className=\"notranslate\" data-test={props.dataTest}>\n <FormControl\n variant=\"outlined\"\n size={props.size ? props.size : undefined}\n >\n {label && <InputLabel variant={\"outlined\"}>{label}</InputLabel>}\n <CustomSelect\n className={`${guestsClass} ${iconClass}`}\n value={getValue()}\n input={\n <OutlinedInput\n label={label}\n name={\"outline\"}\n labelWidth={label ? undefined : 0}\n />\n }\n >\n {placeholderOption && (\n <MenuItem\n disabled={!defaultOptionSelectable}\n key={normalizeOption(placeholderOption.value)}\n value={placeholderOption.value}\n onClick={() => optionClicked(placeholderOption.value)}\n >\n {placeholderOption.displayText}\n {props.requiredWithPlaceholder && <span> * </span>}\n </MenuItem>\n )}\n {options?.map((option: NormalizedOption, index: number) => {\n return (\n <MenuItem\n key={index}\n value={option.value}\n selected={option.isSelected}\n onClick={() => optionClicked(option.value)}\n >\n {option.displayText}\n </MenuItem>\n );\n })}\n </CustomSelect>\n {props.icon ? <CustomIcon>{props.icon}</CustomIcon> : \"\"}\n </FormControl>\n {props.helper && <Helper>{props.helper}</Helper>}\n </DropdownStyle>\n );\n};\nexport const Dropdown = memo(DropdownComponent);\n","import React, { memo } from \"react\";\nimport { Dropdown } from \"../../dropdown/dropdown\";\nimport { GolContactGenderDropdown } from \"./gol-contact-form-interfaces\";\n\nconst GolContactGenderSelection = memo((props: GolContactGenderDropdown) => {\n const onItemClick = (event: React.ChangeEvent<{ value: any }>) => {\n props.onChange({ target: { name: props.name, value: event } });\n };\n return (\n <Dropdown\n size=\"small\"\n dataTest=\"dropdownGender\"\n options={props.options}\n placeholderSelectable={false}\n onItemClick={onItemClick}\n label={props.label}\n />\n );\n});\n\nexport { GolContactGenderSelection };\n","import i18n from \"../i18n\";\nimport { DropdownOption, Gender } from \"../types\";\n\nclass ContactInfoServiceImpl {\n static _service: ContactInfoServiceImpl | undefined;\n static get(): ContactInfoServiceImpl {\n if (!this._service) {\n this._service = new ContactInfoServiceImpl();\n }\n return this._service;\n }\n\n genderIntValue(genderStr: string): number {\n return 0;\n }\n\n genderStringValue(genderInt: string): string {\n return \"\";\n }\n buildGenderDropdownOption(\n genderStr: string,\n value: string,\n selectedValue: string | undefined\n ): DropdownOption {\n return {\n value,\n displayText: i18n.t(`instabook.contacts.${genderStr}`),\n isSelected: selectedValue ? selectedValue === value : false,\n };\n }\n\n computeGenderOptions(selectedValue: number | undefined): DropdownOption[] {\n let options: DropdownOption[] = [];\n for (const [key, value] of Object.entries(Gender)) {\n options.push(\n this.buildGenderDropdownOption(\n key,\n value.toString(),\n selectedValue?.toString()\n )\n );\n }\n\n return options;\n }\n}\n\nexport const contactInfoService = ContactInfoServiceImpl.get();\n","import React, { memo, useContext, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { setDangerouslyInnerHtml } from \"../../../helpers/set-inner-html\";\nimport { getTagManagerService } from \"../../../services/tag-manager.service\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { getLanguageSwitcherService } from \"../../../services/language-switcher.service\";\nimport { capitalize } from \"../../../utils\";\nimport styled from \"styled-components\";\nimport { GolContactNameField } from \"./gol-contact-name-field\";\nimport { GolContactPhoneField } from \"./gol-contact-phone-field\";\nimport { GolContactTextField } from \"./gol-contact-text-field\";\nimport { GolCheckField } from \"./gol-check-field\";\nimport {\n GolContactFormContext,\n GolContactInfoFormContext,\n} from \"./gol-contact-form-interfaces\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { Countries } from \"../../../assets/json/countries\";\nimport { ErrorMessage } from \"../../errors/message-error-view\";\nimport { IFromStyle, PendingBookingContact } from \"../../../types\";\nimport { Title } from \"../../title/title\";\nimport ReactPixel from \"react-facebook-pixel\";\nimport { GolContactGenderSelection } from \"./gol-contact-gender-selection\";\nimport GolCountryPicker, { Country } from \"./gol-country-picker\";\nimport { contactInfoService } from \"../../../services/contact-info-service\";\nimport { requestParamsImpl } from \"../../../services/request-params.service\";\ninterface ContactFormProps {\n clazz?: string | undefined;\n}\n\nconst ContactBloc = styled.div`\n display: flex;\n width: inherit;\n flex-wrap: wrap;\n padding: 4px;\n border-radius: 8px;\n /* white */\n background-color: ${(props) => props.theme.backgroundColor};\n margin-bottom: 5px;\n\n border: 1px solid #f8f8f8;\n box-sizing: border-box;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);\n\n @media screen and (max-width: 980px) {\n height: inherit;\n width: 100%;\n }\n\n textarea::placeholder {\n font-size: 11.8px;\n line-height: 15px;\n color: ${(props) => props.theme.textColorDarken};\n }\n`;\nexport const ConfirmationFormWrapper = styled.form<IFromStyle>`\nborder-radius: 0 8px 8px 8px;\n display: flex;\n padding: 4px;\n flex-wrap: wrap;\n width: 610px;\n min-height: ${(props) =>\n props.minHeight != undefined ? props.minHeight : \"140px\"};\n background-color: ${(props) => props.theme.backgroundTransparentWhite};\n &.disabled {\n pointer-events: none;\n }\n\n @media screen and (max-width: 980px) {\n align-items: center;\n max-width: 100%;\n height: inherit;\n width: inherit;\n }\n\n .displayFlex{\n display: flex;\n }\n\n .golFlexOne {\n flex: 1;\n }\n\n .golFlewDirectionResponsiveMode {\n @media screen and (max-width: 980px) {\n flex-direction: column;\n }\n }\n}\n`;\n\nexport const ConfirmationFormLayout = styled.div`\n display: flex;\n flex-flow: column wrap;\n max-width: 610px;\n /* align-content: center; */\n @media screen and (max-width: 980px) {\n /* align-items:center; */\n flex-wrap: wrap;\n }\n`;\n\nconst FormInnerLine = styled.div`\n display: flex;\n justify-content: center;\n margin: 4px 36px;\n line-height: 15px;\n font-size: 12px;\n`;\n\nconst PersonalDataLine = styled(FormInnerLine)`\n display: inline-block;\n`;\n\nconst NewsletterLine = styled(FormInnerLine)`\n font-style: italic;\n`;\n\nconst Legend = styled.span`\n font-size: 10px;\n margin-left: 6px;\n`;\n\nexport const FormLine = styled.div`\n display: flex;\n flex-grow: 3;\n width: 100%;\n @media screen and (max-width: 980px) {\n flex-wrap: wrap;\n }\n`;\n\nexport const ContactLine = styled(FormLine)`\n @media screen and (min-width: 980px) {\n .contactField {\n width: 50%;\n flex: auto;\n }\n &.cityPostcodeCountry .contactField {\n width: calc(100% / 3);\n }\n }\n\n .contactField {\n margin: 4px;\n }\n`;\n\nconst GolContactGenderLine = styled(FormLine)`\n margin: 4px;\n`;\n\nconst ContactForm = ({ clazz }: ContactFormProps) => {\n const customFields = moduleSettings.customFields;\n const displayAllergiesField = moduleSettings.diplayAllergiesField;\n const { t, i18n } = useTranslation();\n const [terms, setTerms] = useState(\"\");\n const [policy, setPolicy] = useState(\"\");\n const [fieldsInErrors, setFieldsInErrors] = useState<string[]>([]);\n const requiredFields = moduleSettings.requiredContactFields;\n const [gender, setGender] = useState(\n pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.gender\n : 0\n );\n const [showAcceptSms, setShowAcceptSms] = useState(\n requestParamsImpl.overwrittenMobilePhone()\n ? true\n : pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.mobile_phone\n : false\n );\n const [showAcceptEmail, setShowAcceptEmail] = useState(\n requestParamsImpl.overwrittenEmail()\n ? true\n : pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.email\n : false\n );\n let selectedCountry: Country | null = null as Country | null;\n let selectedCountryForAddress: Country | null = null as Country | null;\n\n if (pendingBookingStore.pendingBookingContact?.country !== undefined) {\n const country = Countries.find((country: any) => {\n return (\n country.label.toLowerCase() ===\n pendingBookingStore.pendingBookingContact.country?.toLowerCase()\n );\n });\n if (country) {\n selectedCountryForAddress = country;\n }\n }\n if (requestParamsImpl.overwrittenCountryCode()) {\n const country = Countries.find((country: any) => {\n return (\n country.code.toUpperCase() ===\n requestParamsImpl.overwrittenCountryCode()?.toUpperCase()\n );\n });\n if (country) {\n selectedCountry = country as Country;\n }\n }\n\n const newsLetterLine = t(\"instabook.contacts.unsubcribe_newletter\");\n\n const isPreCatelanRestaurant = moduleSettings.isPreCatelanRestaurant;\n const customLabelSmsSpamRestaurantGroup: string | null =\n moduleSettings.customLabelSmsSpamRestaurantGroup;\n const isLeCastelletGroupRestaurant =\n moduleSettings.isLeCastelletGroupRestaurant;\n const legend = t(\"instabook.contacts.mandatory_fields\");\n\n const form = useRef({\n gender: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.gender\n : \"\",\n firstname: pendingBookingStore.pendingBookingContact?.firstname\n ? pendingBookingStore.pendingBookingContact.firstname\n : requestParamsImpl.overwrittenFirstName()?.trim() ?? null,\n lastname: pendingBookingStore.pendingBookingContact?.lastname\n ? pendingBookingStore.pendingBookingContact.lastname\n : requestParamsImpl.overwrittenLastName()?.trim() ?? null,\n mobile_phone: pendingBookingStore.pendingBookingContact?.mobile_phone\n ? pendingBookingStore.pendingBookingContact.mobile_phone\n : requestParamsImpl.overwrittenMobilePhone()?.trim() ?? null,\n country_code: selectedCountry,\n email: pendingBookingStore.pendingBookingContact?.email\n ? pendingBookingStore.pendingBookingContact.email\n : requestParamsImpl.overwrittenEmail()?.trim() ?? null,\n birthday: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.birthday\n : \"\",\n company: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.company\n : \"\",\n message: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.message\n : \"\",\n allergies: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.allergies\n : \"\",\n terms: pendingBookingStore.acceptTerms,\n allergyTerms: pendingBookingStore.acceptAllergiesTerms,\n accept_sms_spam: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.accept_sms_spam\n : false,\n accept_email_spam: pendingBookingStore.pendingBookingContact\n ? pendingBookingStore.pendingBookingContact.accept_email_spam\n : false,\n country: selectedCountryForAddress,\n postcode: pendingBookingStore.pendingBookingContact?.postcode ?? \"\",\n extra_address:\n pendingBookingStore.pendingBookingContact?.extra_address ?? \"\",\n address: pendingBookingStore.pendingBookingContact?.address ?? \"\",\n city: pendingBookingStore.pendingBookingContact?.city ?? \"\",\n } as { [key: string]: any });\n\n useEffect(() => {\n const localeUrl = getLanguageSwitcherService().golLocaleFromSwitcher(\n i18n.language\n );\n setTerms(`${moduleSettings.disclaimerUrl}&locale=${localeUrl}`);\n setPolicy(\n `${moduleSettings.privacyPolicyUrl}&locale=${\n [\"fr\", \"ca\", \"ch\"].includes(localeUrl) ? \"fr\" : \"en\"\n }`\n );\n return () => {\n getLanguageSwitcherService().unregisterListeners();\n };\n }, [i18n.language]);\n\n const formContext = useContext(GolContactInfoFormContext);\n\n const {\n checkContactInfoFormValidity,\n setCheckContactInfoFormValidity,\n errorMsg,\n setValidContactInfo,\n } = formContext;\n\n useEffect(() => {\n if (checkContactInfoFormValidity) {\n checkFormValidity();\n }\n }, [checkContactInfoFormValidity]);\n\n useEffect(() => {\n const errorDetails = errorMsg != null ? errorMsg[\"errorDetails\"] : null;\n if (errorDetails !== null) {\n if (errorDetails.hasOwnProperty(\"contact_info\")) {\n const contactInfo = errorDetails[\"contact_info\"];\n const fieldsInErrorFromUpdateReq = Object.keys(contactInfo);\n if (fieldsInErrorFromUpdateReq) {\n const updatedFieldsInErrors = [\n ...fieldsInErrors,\n ...fieldsInErrorFromUpdateReq,\n ];\n setFieldsInErrors(Array.from(new Set(updatedFieldsInErrors)));\n setCheckContactInfoFormValidity(false);\n }\n }\n }\n }, [errorMsg, t]);\n\n useEffect(() => {\n // @ts-ignore\n if (!form.current[\"country_code\"]) {\n const pendingBookingCountryCode: string =\n pendingBookingStore.countryCode ??\n getLanguageSwitcherService().countryCodeForLocale(\n moduleSettings.restaurantCountryCode\n );\n const defaultCountry = Countries.find((country: any) => {\n return (\n country.code.toLowerCase() === pendingBookingCountryCode.toLowerCase()\n );\n });\n\n if (defaultCountry) {\n form.current = {\n ...form.current,\n country_code: defaultCountry,\n };\n }\n }\n }, [i18n.language]);\n\n useEffect(() => {\n getTagManagerService()?.pushTags(\"contact_info\", {\n guests: selectionStore.guests,\n });\n ReactPixel.pageView();\n }, []);\n\n const handleFormChange = (event: {\n target: { name: any; value: any; checked: any; valueAsDate: any };\n }) => {\n // Get the name of the field that caused this change event\n // Get the new value of this field\n const { name, value, checked, valueAsDate } = event.target;\n let defaultValue = value || undefined;\n switch (name) {\n case \"gender\":\n setGender(Number(value));\n break;\n case \"birthday\":\n if (typeof valueAsDate.toISOString === \"function\") {\n defaultValue = valueAsDate.toISOString();\n }\n break;\n case \"mobile_phone\":\n setShowAcceptSms(defaultValue && defaultValue.length);\n break;\n case \"email\":\n setShowAcceptEmail(defaultValue && defaultValue.length);\n break;\n default:\n break;\n }\n\n // Update state\n // Assign new value to the appropriate form field\n form.current = {\n ...form.current,\n [name]: checked ? checked : defaultValue,\n };\n\n if ((defaultValue && defaultValue.length) || checked) {\n const array = [...fieldsInErrors];\n const index = array.indexOf(name);\n if (index !== -1) {\n array.splice(index, 1);\n setFieldsInErrors(Array.from(new Set(array)));\n }\n }\n };\n\n const requiredFieldsFilled = () => {\n let requiredFieldsInError: string[] = [];\n requiredFields.forEach((field) => {\n if (!fieldFilled(field)) {\n requiredFieldsInError.push(field);\n }\n });\n return requiredFieldsInError;\n };\n\n const fieldFilled = (field: string) => {\n let value = form.current[field];\n if (field === \"terms\") {\n return requestParamsImpl.overwrittenHideGeneralTerms() || value;\n }\n if ([\"allergyTerms\"].includes(field)) {\n return value;\n }\n return typeof value !== \"undefined\" && value != null;\n };\n\n const requiredCustomFieldsFilled = () => {\n let requiredCustomFieldsInError: string[] = [];\n if (customFields.show_allergies_terms_on_module) {\n let field = \"allergyTerms\";\n if (!fieldFilled(field)) {\n requiredCustomFieldsInError.push(field);\n }\n }\n\n return requiredCustomFieldsInError;\n };\n const updatePendingContactInfo = () => {\n const {\n firstname,\n lastname,\n country_code,\n mobile_phone,\n email,\n message,\n allergies,\n birthday,\n company,\n terms,\n allergyTerms,\n country,\n address,\n extra_address,\n postcode,\n city,\n accept_email_spam,\n accept_sms_spam,\n } = form.current;\n const contact_info: PendingBookingContact = {\n firstname,\n lastname,\n mobile_phone,\n email: email ? email : \"\",\n message: message ? message : \"\",\n allergies: allergies ? allergies : \"\",\n birthday,\n country_code: \"\",\n address,\n extra_address,\n city,\n postcode,\n country,\n accept_sms_spam: accept_sms_spam ?? false,\n accept_email_spam: accept_email_spam ?? false,\n };\n\n if (!(mobile_phone && mobile_phone.length)) {\n contact_info.accept_sms_spam = false;\n }\n\n if (!(email && email.length)) {\n contact_info.accept_email_spam = false;\n }\n\n if (country_code !== null) {\n contact_info.country_code = country_code.code;\n }\n\n if (country !== null) {\n contact_info.country = country.label;\n }\n\n if (company && company.length) {\n contact_info.company = company;\n }\n\n if (gender && gender > 0) {\n contact_info.gender = gender;\n }\n\n pendingBookingStore.pendingBookingContact = contact_info;\n pendingBookingStore.acceptAllergiesTerms = allergyTerms;\n pendingBookingStore.acceptTerms = terms;\n setValidContactInfo(true);\n };\n const checkFormValidity = () => {\n let updatedFieldsInErrors = [\n ...fieldsInErrors,\n ...requiredFieldsFilled(),\n ...requiredCustomFieldsFilled(),\n ];\n setFieldsInErrors(Array.from(new Set(updatedFieldsInErrors)));\n if (updatedFieldsInErrors.length === 0) {\n updatePendingContactInfo();\n } else {\n setCheckContactInfoFormValidity(false);\n }\n };\n\n const value = {\n form: form.current,\n fieldsInErrors: fieldsInErrors,\n handleFormChange,\n requiredFields,\n };\n\n const genderOptions = contactInfoService.computeGenderOptions(gender);\n const addressSub = (\n <>\n <GolContactTextField\n name={\"postcode\"}\n label={t(\"instabook.contacts.postcode\")}\n onChange={handleFormChange}\n value={form.current[\"postcode\"]}\n clazz=\"contactField \"\n />\n <GolContactNameField\n onChange={handleFormChange}\n name={\"city\"}\n clazz=\"contactField \"\n value={form.current[\"city\"]}\n />\n </>\n );\n\n const countryPicker = (\n <GolCountryPicker\n id=\"country-picker\"\n claszName=\"contactField golFlexOne\"\n defaultValue={form.current[\"country\"]}\n name=\"country\"\n onChange={handleFormChange}\n label={t(\"instabook.contacts.country\")}\n getOptionLabel={(option: Country) => option.label}\n />\n );\n const addressMain = (\n <>\n <ContactLine\n data-test=\"address\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n <GolContactNameField name={\"address\"} clazz=\"contactField golFlexOne\" />\n <GolContactNameField\n name={\"extra_address\"}\n clazz=\"contactField golFlexOne\"\n />\n </ContactLine>\n </>\n );\n\n let labelSmsSpam;\n if (isPreCatelanRestaurant) {\n labelSmsSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_sms_spam_pre_catelan\"\n )}\n />\n );\n } else if (customLabelSmsSpamRestaurantGroup !== null) {\n labelSmsSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_sms_spam_group\",\n {\n restaurant: capitalize(customLabelSmsSpamRestaurantGroup),\n }\n )}\n />\n );\n } else {\n labelSmsSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_sms_spam\",\n {\n restaurant: isLeCastelletGroupRestaurant\n ? \"L'Hôtel du Castellet\"\n : capitalize(moduleSettings.getRestaurantName()),\n }\n )}\n />\n );\n }\n\n let labelEmailSpam;\n if (isPreCatelanRestaurant) {\n labelEmailSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_email_spam_pre_catelan\"\n )}\n />\n );\n } else if (customLabelSmsSpamRestaurantGroup !== null) {\n labelEmailSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_email_spam_group\",\n {\n restaurant: capitalize(customLabelSmsSpamRestaurantGroup),\n }\n )}\n />\n );\n } else {\n labelEmailSpam = (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_email_spam\",\n {\n restaurant: isLeCastelletGroupRestaurant\n ? \"L'Hôtel du Castellet\"\n : capitalize(moduleSettings.getRestaurantName()),\n }\n )}\n />\n );\n }\n\n return (\n <ConfirmationFormLayout>\n <Title text={t(\"instabook.contacts.formLabel\")} />\n <ConfirmationFormWrapper className={clazz}>\n {errorMsg && (\n <ErrorMessage error={errorMsg[\"error\"]} status={errorMsg[\"status\"]} />\n )}\n <GolContactFormContext.Provider value={value}>\n <ContactBloc>\n <GolContactGenderLine data-test=\"gender\">\n {customFields.show_gender && (\n <GolContactGenderSelection\n label={t(\"instabook.contacts.gender\")}\n name={\"gender\"}\n onChange={handleFormChange}\n options={genderOptions}\n />\n )}\n </GolContactGenderLine>\n <ContactLine\n data-test=\"firstname-lastname\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n <GolContactNameField\n name={\"firstname\"}\n clazz=\"contactField golFlexOne\"\n />\n <GolContactNameField\n name={\"lastname\"}\n clazz=\"contactField golFlexOne\"\n />\n </ContactLine>\n <ContactLine\n data-test=\"mobileAndEmail\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n <GolContactPhoneField clazz=\"golFlexOne\" name={\"mobile_phone\"} />\n <GolContactNameField\n clazz=\"contactField golFlexOne\"\n name={\"email\"}\n />\n </ContactLine>\n\n <ContactLine>\n {customFields.show_birthday && (\n <GolContactTextField\n inputLabelProps={{ shrink: true }}\n type=\"date\"\n onChange={handleFormChange}\n clazz=\"contactField golFlexOne\"\n name=\"birthday\"\n label={t(\"instabook.contacts.birthday\")}\n />\n )}\n {customFields.show_company && (\n <GolContactTextField\n onChange={handleFormChange}\n clazz=\"contactField golFlexOne\"\n name=\"company\"\n fullWidth={true}\n multiline={true}\n label={t(\"instabook.contacts.company\")}\n rows={4}\n />\n )}\n </ContactLine>\n {isPreCatelanRestaurant && (\n <Legend data-test=\"mandatory-fields-legend\">{legend}</Legend>\n )}\n </ContactBloc>\n {(customFields.show_address || customFields.show_country) && (\n <ContactBloc>\n {customFields.show_address ? (\n customFields.show_country ? (\n <>\n {addressMain}\n <ContactLine\n data-test=\"cityPostcodeCountry\"\n className=\"golFlewDirectionResponsiveMode cityPostcodeCountry\"\n >\n {addressSub}\n {countryPicker}\n </ContactLine>\n </>\n ) : (\n <>\n {addressMain}\n <ContactLine\n data-test=\"cityPostcode\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n {addressSub}\n </ContactLine>\n </>\n )\n ) : undefined}\n\n {!customFields.show_address && customFields.show_country && (\n <ContactLine\n className=\"golFlexOne\"\n data-test=\"countryAddressPicker\"\n >\n {countryPicker}\n </ContactLine>\n )}\n </ContactBloc>\n )}\n <ContactBloc>\n <ContactLine data-test=\"restaurant-message\">\n {isPreCatelanRestaurant ? (\n <GolContactTextField\n onChange={handleFormChange}\n textSize=\"medium\"\n clazz=\"contactField\"\n name=\"message\"\n fullWidth={true}\n multiline={true}\n rowsMax={4}\n label={t(\"instabook.contacts.message\")}\n placeholder={t(\"instabook.contacts.message_pre_catelan\")}\n inputLabelProps={{ shrink: true }}\n />\n ) : (\n <GolContactTextField\n onChange={handleFormChange}\n textSize=\"medium\"\n clazz=\"contactField\"\n name=\"message\"\n fullWidth={true}\n multiline={true}\n rowsMax={4}\n label={t(\"instabook.contacts.message\")}\n />\n )}\n </ContactLine>\n {displayAllergiesField && (\n <ContactLine>\n <GolContactTextField\n onChange={handleFormChange}\n textSize=\"medium\"\n clazz=\"contactField\"\n name=\"allergies\"\n fullWidth={true}\n multiline={true}\n rowsMax={4}\n label={t(\"instabook.contacts.allergies\")}\n value={form.current[\"allergies\"]}\n />\n </ContactLine>\n )}\n\n {customFields.show_allergies_terms_on_module && (\n <GolCheckField\n name=\"allergyTerms\"\n label={\n <span>{t(\"instabook.contacts.accept_allergies_terms\")}</span>\n }\n controlName=\"allergyTerms\"\n controlId={\"allergies-terms\"}\n />\n )}\n\n {!requestParamsImpl.overwrittenHideGeneralTerms() && (\n <GolCheckField\n name=\"terms\"\n label={\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_terms\",\n {\n terms,\n }\n )}\n />\n }\n controlName=\"terms\"\n controlId={\"terms\"}\n />\n )}\n\n {showAcceptSms && (\n <GolCheckField\n clazz=\"contactField\"\n name=\"accept_sms_spam\"\n label={labelSmsSpam}\n controlName=\"accept_sms_spam\"\n controlId={\"accept_sms_spam\"}\n />\n )}\n {showAcceptEmail && (\n <GolCheckField\n clazz=\"contactField\"\n name=\"accept_email_spam\"\n label={labelEmailSpam}\n controlName=\"accept_email_spam\"\n controlId={\"accept_email_spam\"}\n />\n )}\n\n {customFields.accept_partner_spam && !isPreCatelanRestaurant && (\n <GolCheckField\n clazz=\"contactField\"\n name=\"accept_partner_spam\"\n label={\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_spam\",\n {\n partner: capitalize(moduleSettings.partnerName),\n }\n )}\n />\n }\n controlName=\"accept_partner_spam\"\n controlId={\"accept_partner_spam\"}\n />\n )}\n {customFields.show_tol_spam && !isPreCatelanRestaurant && (\n <GolCheckField\n clazz=\"contactField\"\n name=\"show_tol_spam\"\n label={\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.accept_tol_spam\"\n )}\n />\n }\n controlName=\"show_tol_spam\"\n controlId={\"show_tol_spam\"}\n />\n )}\n {(showAcceptEmail ||\n showAcceptSms ||\n customFields.accept_partner_spam) &&\n !isPreCatelanRestaurant ? (\n <NewsletterLine\n className=\"newsletter\"\n data-test=\"unsubcribe-newsletter\"\n >\n {newsLetterLine}\n </NewsletterLine>\n ) : (\n <></>\n )}\n\n <PersonalDataLine data-test=\"personal-data-line\">\n {isPreCatelanRestaurant ? (\n showAcceptEmail || showAcceptSms ? (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.privacy_info_pre_catelan\"\n )}\n />\n ) : (\n <></>\n )\n ) : (\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.contacts.privacy_info\",\n { policy: policy }\n )}\n />\n )}\n </PersonalDataLine>\n </ContactBloc>\n </GolContactFormContext.Provider>\n </ConfirmationFormWrapper>\n </ConfirmationFormLayout>\n );\n};\nexport const ConfirmationContactForm = memo(ContactForm);\n","import React, { memo, useEffect, useState, useContext } from \"react\";\nimport {\n CardCvcElement,\n CardExpiryElement,\n CardNumberElement,\n useElements,\n useStripe,\n} from \"@stripe/react-stripe-js\";\nimport styled from \"styled-components\";\nimport { Checkbox } from \"@material-ui/core\";\nimport { setDangerouslyInnerHtml } from \"../../../helpers/set-inner-html\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { useTranslation } from \"react-i18next\";\nimport { useLocation } from \"react-router-dom\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { GolStripeCallbackResponse } from \"../../../types\";\nimport { ErrorMessage } from \"../../errors/message-error-view\";\nimport { GolContactInfoFormContext } from \"../confirmation-contact-form/gol-contact-form-interfaces\";\nimport {\n ConfirmationFormLayout,\n FormLine,\n} from \"../confirmation-contact-form/confirmation-contact-form\";\nimport {\n FormControlStyledLabel,\n RadioWrapper,\n} from \"../confirmation-contact-form/gol-contact-css\";\nimport { Title } from \"../../title/title\";\nimport * as Sentry from \"@sentry/react\";\n\nconst CheckoutFormWrapper = styled.form`\n display: flex;\n flex-flow: column wrap;\n width: 610px;\n\n /* white */\n background-color: ${(props) => props.theme.backgroundColor};\n\n /* gray light */\n border: 1px solid #f8f8f8;\n box-sizing: border-box;\n box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25);\n border-radius: ${(props) =>\n props.theme.isBackground ? \"0 8px 8px 8px\" : \"8px\"};\n padding: 8px;\n\n &.disabled {\n pointer-events: none;\n }\n @media screen and (max-width: 980px) {\n align-items: center;\n width: auto;\n }\n`;\n\nconst CheckoutLine = styled(FormLine)`\n .acceptTerms {\n padding: 0 10px;\n }\n @media screen and (max-width: 980px) {\n flex-flow: column;\n }\n`;\n\nconst BottomInfo = styled.div`\n margin-left: 10px;\n color: ${(props) => props.theme.disabledColor};\n font-size: 14px;\n line-height: 22px;\n display: flex;\n`;\n\nconst CardNumber = styled(CardNumberElement)`\n border: 1px solid ${(props) => props.theme.legendBorderGray};\n padding: 9px;\n border-radius: 4px;\n flex: 1 2 0%;\n margin 10px;\n`;\n\nconst CardExpiry = styled(CardExpiryElement)`\n border: 1px solid ${(props) => props.theme.legendBorderGray};\n padding: 9px;\n border-radius: 4px;\n margin 10px;\n flex: 0 2 15%;\n`;\n\nconst CardCvc = styled(CardCvcElement)`\n border: 1px solid ${(props) => props.theme.legendBorderGray};\n padding: 9px;\n border-radius: 4px;\n flex: 0 2 15%;\n margin 10px;\n`;\n\nconst CheckoutFormLayout = styled(ConfirmationFormLayout)``;\n\nconst Checkout = ({ clazz }) => {\n const { t } = useTranslation();\n const [error, setError] = useState(useLocation().state);\n const [stripeError, setStripeError] = useState({});\n const [clientSecret, setClientSecret] = useState(\"\");\n const stripe = useStripe();\n const elements = useElements();\n const terms = moduleSettings.disclaimerUrl;\n const policy = moduleSettings.privacyPolicyUrl;\n const [termsChecked, setTermsChecked] = useState(false);\n const [termsError, setTermsError] = useState(false);\n const [prepaymentType, setPrepaymentType] = useState(\"\");\n const [stripeToken, setStripeToken] = useState<string | null>(null);\n const [allElementsAreEmpty, setAllElementsAreEmpty] = useState(true);\n const [inValidMode, setInValidMode] = useState(false);\n const product_name = moduleSettings.productName;\n const onTermsCheckedChange = (ev: any, checked: boolean) => {\n setTermsChecked(checked);\n if (checked) {\n setTermsError(false);\n }\n };\n const formContext = useContext(GolContactInfoFormContext);\n const {\n checkContactPptInfoFormValidity,\n setCheckContactInfoFormValidity,\n setValidPptInfo,\n } = formContext;\n\n useEffect(() => {\n const prepayment = pendingBookingStore.prepayment;\n setClientSecret(prepayment.client_secret);\n setPrepaymentType(prepayment.payment_kind);\n }, []);\n\n useEffect(() => {\n if (stripeToken && termsChecked) {\n ///!\\ disable since webhook is being trigger\n //pendingBookingStore.stripeToken = stripeToken;\n setValidPptInfo(true);\n }\n }, [stripeToken, termsChecked]);\n\n useEffect(() => {\n if (checkContactPptInfoFormValidity) {\n setInValidMode(true);\n validatePayment();\n }\n }, [checkContactPptInfoFormValidity]);\n\n useEffect(() => {\n if (error || Object.keys(stripeError).length > 0 || termsError) {\n setCheckContactInfoFormValidity(false);\n }\n }, [error, stripeError, termsError]);\n\n const handleChange = async (event: any) => {\n // Listen for changes in the CardElement\n // and display any errors as the customer types their card details\n setAllElementsAreEmpty(allElementsAreEmpty && event.empty);\n if (event.error) {\n let updatedErrors = {\n ...stripeError,\n [event.elementType]: event.error.message,\n };\n setStripeError(updatedErrors);\n } else {\n let updatedErrors = { ...stripeError };\n delete updatedErrors[event.elementType];\n setStripeError(updatedErrors);\n }\n };\n\n const validatePayment = () => {\n if (!termsChecked) {\n setTermsError(true);\n return;\n }\n\n handleSubmit();\n };\n\n const handleDeposit = async (): Promise<GolStripeCallbackResponse> => {\n const { error, setupIntent } = await stripe!.confirmCardSetup(\n clientSecret,\n {\n payment_method: {\n card: elements!.getElement(CardNumberElement)!,\n },\n }\n );\n\n return {\n stripeError: error,\n stripeToken: setupIntent ? setupIntent.id : undefined,\n };\n };\n\n const handleDownPayment = async (): Promise<GolStripeCallbackResponse> => {\n const { error, paymentIntent } = await stripe!.confirmCardPayment(\n clientSecret,\n {\n payment_method: {\n card: elements!.getElement(CardNumberElement)!,\n },\n }\n );\n return {\n stripeToken: paymentIntent ? paymentIntent.id : undefined,\n stripeError: error,\n };\n };\n\n const handleSubmit = async () => {\n if (!stripe || !elements) {\n setError({ error: \"stripe or element not set\" });\n setStripeError({ stripe_submit_failed: \"stripe or element not set\" });\n return;\n }\n\n localStorage.setItem(\n \"pendingBookingId\",\n pendingBookingStore.pendingBooking.id\n );\n localStorage.setItem(\"referralKey\", moduleSettings.getReferralKey());\n\n const { stripeError, stripeToken } =\n \"guarantee\" === prepaymentType\n ? await handleDeposit()\n : await handleDownPayment();\n setStripeToken(stripeToken ? stripeToken : null);\n\n localStorage.removeItem(\"pendingBookingId\");\n localStorage.removeItem(\"referralKey\");\n\n if (stripeError) {\n setError({ error: stripeError!.message });\n setStripeError({ stripe_submit_failed: stripeError!.message });\n Sentry.withScope(function (scope) {\n scope.setTag(\"StripeError\", prepaymentType);\n Sentry.captureException(new Error(stripeError!.message));\n });\n } else {\n setStripeError({});\n setError(null);\n }\n };\n return (\n <CheckoutFormLayout data-test=\"checkoutForm\">\n {allElementsAreEmpty && inValidMode && (\n <ErrorMessage\n error={t(`instabook.prepayment.payment_top`)}\n status={\"error\"}\n />\n )}\n {Object.keys(stripeError).length > 0 && (\n <ErrorMessage\n error={Object.values(stripeError).join(\"<br/>\")}\n status={\"error\"}\n />\n )}\n {termsError && (\n <ErrorMessage\n error={t(`instabook.prepayment.accept_terms_unchecked`)}\n status={\"error\"}\n />\n )}\n <Title text={t(\"instabook.prepayment.formLabel\")} />\n <CheckoutFormWrapper className={clazz}>\n <CheckoutLine>\n <CardNumber onChange={handleChange} />\n <CardExpiry onChange={handleChange} />\n <CardCvc onChange={handleChange} />\n </CheckoutLine>\n <BottomInfo>\n {t(\"instabook.prepayment.payment_bottom\", { product_name })}\n </BottomInfo>\n {/* Show any error that happens when processing the payment */}\n\n <CheckoutLine className=\"acceptTerms\">\n <RadioWrapper>\n <FormControlStyledLabel\n onChange={onTermsCheckedChange}\n className={termsError ? \"error\" : \"\"}\n control={<Checkbox name=\"termsPpt\" />}\n label={\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.prepayment.terms_and_conditions\",\n {\n terms,\n policy,\n }\n )}\n />\n }\n />\n </RadioWrapper>\n </CheckoutLine>\n </CheckoutFormWrapper>\n </CheckoutFormLayout>\n );\n};\nexport const CheckoutForm = memo(Checkout);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { Elements } from \"@stripe/react-stripe-js\";\nimport { CheckoutForm } from \"./checkout-form\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { useTranslation } from \"react-i18next\";\nimport { StripeElementLocale, StripeElementsOptions } from \"@stripe/stripe-js\";\n\nconst Payment = ({ clazz }) => {\n const [stripe] = useState(pendingBookingStore.stripePromise);\n const { i18n } = useTranslation();\n useEffect(() => {\n //navigationStore.currentRoute = buildRouteWithParams(config.routes.confirmation);\n }, []);\n const stripeOption: StripeElementsOptions = {\n locale: i18n.language as StripeElementLocale,\n };\n /*/!\\ changing locale while already rendering, leads to re-render component, hence lost card info\"*/\n return (\n <>\n {stripe && (\n <Elements key={i18n.language} options={stripeOption} stripe={stripe}>\n <CheckoutForm clazz={clazz} />\n </Elements>\n )}\n </>\n );\n};\n\nexport const ConfirmationPayment = memo(Payment);\n","import React, { memo, useEffect } from \"react\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport { useHistory } from \"react-router-dom\";\nimport { config } from \"../../config\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\nimport { commitPendingBooking } from \"../../requests/pending-booking.requests\";\nimport { bookingStore } from \"../../stores/booking.store\";\nimport { Booking } from \"../../types\";\nimport { Loader } from \"../loader/loader\";\n\nconst ConfirmationCommitPendingBooking = memo(() => {\n const throwError = useErrorHandler();\n const history = useHistory();\n useEffect(() => {\n const subscription = commitPendingBooking({}).subscribe((resp: Booking) => {\n bookingStore.booking = resp;\n history.push(buildRouteWithParams(config.routes.confirmationEnd));\n return () => {\n subscription.unsubscribe();\n };\n }, throwError);\n });\n return <Loader position={\"fixed\"} />;\n});\n\nexport { ConfirmationCommitPendingBooking };\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\n\ninterface ICommercialsSummaryItem {\n commercialId: string;\n name: string;\n quantity?: number | 0;\n unitPrice?: number | 0;\n currency?: string;\n image?: string;\n}\n\ninterface IStyle {\n grid: string;\n}\n\nconst CommercialItemWrapper = styled.div<IStyle>`\n display: grid;\n grid-template-columns: ${(props) => props.grid};\n column-gap: 10px;\n font-size: 12px;\n line-height: 12px;\n align-items: center;\n padding: 5px 0;\n`;\n\nconst Commercial = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst CommercialTitle = styled.span`\n display: inline-block;\n max-width: 165px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n align-items: center;\n`;\n\nconst CommercialQuantity = styled.span`\n white-space: nowrap;\n`;\n\nconst CommercialPrice = styled.div`\n font-weight: bold;\n text-align: right;\n white-space: nowrap;\n`;\n\nconst Item = (props: ICommercialsSummaryItem) => {\n const quantity = `${props.quantity} x `;\n const price = props.unitPrice ? (props.unitPrice / 100).toFixed(2) : 0;\n\n let grid;\n props.quantity! > 0 ? (grid = \"30px auto\") : (grid = \"auto\");\n price! > 0 ? (grid += \" 60px\") : (grid += \"\");\n\n return (\n <CommercialItemWrapper\n data-test={`commercial-item-wrapper-${props.commercialId}`}\n grid={grid}\n >\n {props.quantity! > 0 && (\n <CommercialQuantity>{quantity}</CommercialQuantity>\n )}\n <Commercial>\n {props.image && <img src={props.image} alt={props.name} />}\n <CommercialTitle>{props.name}</CommercialTitle>\n </Commercial>\n {price! > 0 && (\n <CommercialPrice>\n {price} {props.currency}\n </CommercialPrice>\n )}\n </CommercialItemWrapper>\n );\n};\n\nexport const SummaryCommercialItem = memo(Item);\n","import React, { memo, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { Tooltip, tooltipClasses } from \"@mui/material\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\n\ninterface ITooltip {\n title: string;\n text: string;\n}\n\ninterface IStyled {\n fontFamily?: string;\n}\n\nconst TooltipLayout = styled.div<IStyled>`\n font-family: ${(props) => props.fontFamily};\n`;\n\nconst TooltipPreview = styled.div`\n line-height: 1;\n cursor: pointer;\n`;\n\nconst TooltipTitle = styled.div`\n font-size: 14px;\n line-height: 27px;\n font-weight: bold;\n`;\n\nconst TooltipText = styled.div`\n font-size: 12px;\n line-height: 17px;\n white-space: pre-line;\n max-height: 300px;\n overflow-y: auto;\n`;\n\nconst ShowMoreIcon = styled(VisibilityIcon)`\n color: ${(props) => props.theme.disabledColor};\n`;\n\nconst CustomTooltip = styled(({ className, ...props }) => (\n <Tooltip disableTouchListener {...props} classes={{ popper: className }} />\n))(() => ({\n [`& .${tooltipClasses.tooltip}`]: {\n backgroundColor: `white`,\n color: \"#333\",\n boxShadow: `0px 2px 4px 0px rgba(0,0,0,0.25)`,\n marginTop: `7px !important`,\n },\n}));\n\nconst TooltipWrapper = (props: ITooltip) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const mappedText = props.text.split(\"\\r\\n\").join(\"</br>\");\n const fontFamily = moduleSettings.fontFamily;\n\n const tooltipContent = (\n <TooltipLayout fontFamily={fontFamily}>\n <TooltipTitle>{props.title}</TooltipTitle>\n <TooltipText>\n <span dangerouslySetInnerHTML={{ __html: mappedText }}></span>\n </TooltipText>\n </TooltipLayout>\n );\n\n return (\n <CustomTooltip\n data-test=\"golTooltip\"\n title={tooltipContent}\n open={showTooltip}\n onOpen={() => setShowTooltip(true)}\n onClose={() => setShowTooltip(false)}\n >\n <TooltipPreview>\n <ShowMoreIcon onClick={() => setShowTooltip(!showTooltip)} />\n </TooltipPreview>\n </CustomTooltip>\n );\n};\n\nexport const GolTooltip = memo(TooltipWrapper);\n","import React, { memo } from \"react\";\nimport { Voucher } from \"../../types\";\nimport styled from \"styled-components\";\nimport CloseIcon from \"@material-ui/icons/Close\";\nimport { GolTooltip } from \"../tooltip/tooltip\";\n\ninterface ICommercialsSummaryItem {\n voucher: Voucher;\n onRemoveVoucher?: (value: string) => void;\n isRemovable?: Boolean;\n}\n\nconst VoucherWrapper = styled.div`\n display: inline-flex;\n width: fit-content;\n align-items: center;\n border-radius: 4px;\n background-color: ${(props) => props.theme.voucherBackgroundColor};\n color: ${(props) => props.theme.voucherTextColor};\n padding: 4px 8px 4px 12px;\n margin: 4px 0 4px;\n`;\n\nconst VoucherName = styled.div`\n font-size: 14px;\n`;\n\nconst CustomGolTooltip = styled.div`\n margin-left: 24px;\n`;\n\nconst VoucherRemove = styled(CloseIcon)`\n color: ${(props) => props.theme.voucherTextColor};\n font-size: 24px !important;\n margin-left: 12px;\n cursor: pointer;\n`;\n\nconst Item = (props: ICommercialsSummaryItem) => {\n const voucher = props.voucher;\n\n const onRemoveVoucher = () => {\n props.onRemoveVoucher!(voucher.code);\n };\n\n return (\n <VoucherWrapper data-test=\"voucher-item-wrapper\">\n <VoucherName>{voucher.code}</VoucherName>\n <CustomGolTooltip>\n <GolTooltip title={voucher.name} text={voucher.description} />\n </CustomGolTooltip>\n {props.isRemovable && <VoucherRemove data-test=\"voucher-remove\" onClick={onRemoveVoucher} />}\n </VoucherWrapper>\n );\n};\n\nexport const VoucherItem = memo(Item);\n","import React, { memo } from \"react\";\nimport { Commercial, SelectedMenu, Voucher } from \"../../../types\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { SummaryCommercialItem } from \"./summary-commercial-item\";\nimport { VoucherItem } from \"../../voucher/voucher-item\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { commercialsStore } from \"../../../stores/commercials.store\";\n\nconst SummaryWrapper = styled.div`\n padding: 10px;\n margin: 0 auto;\n width: 300px;\n border-radius: 10px;\n border: 1px solid ${(props) => props.theme.disabledColor};\n background-color: ${(props) => props.theme.backgroundColor};\n margin-bottom: 24px;\n`;\n\nconst Subtitle = styled.div`\n color: ${(props) => props.theme.disabledColor};\n font-size: 12px;\n`;\n\nconst Separator = styled.hr`\n color: ${(props) => props.theme.disabledColor};\n opacity: 0.4;\n width: 100%;\n padding: 0 4px;\n margin: 0;\n`;\n\nconst CommercialsTotal = styled.div`\n width: 100%;\n text-align: right;\n font-size: 14px;\n font-weight: bold;\n`;\n\nconst CommercialsSummary = () => {\n const { t } = useTranslation();\n const {\n persons,\n event,\n offer,\n selected_menus: menus,\n prepayment,\n vouchers,\n } = pendingBookingStore.pendingBooking;\n const _event =\n event &&\n commercialsStore.events?.filter(\n (commercial) => commercial.id === event.commercial_id\n )[0];\n const _offer =\n offer &&\n commercialsStore.offers?.filter(\n (commercial) => commercial.id === offer.commercial_id\n )[0];\n\n const hasVoucher = !!vouchers?.length;\n const hasEvent = !!event;\n const hasOffer = !!offer;\n const hasMenus = !!menus?.length;\n\n const quantity = (commercial: any) => {\n if (prepayment?.origin === commercial.object && commercial.has_prepayment) {\n if (prepayment.kind === \"seats\") {\n return persons;\n }\n }\n return 0;\n };\n\n const unitPrice = (commercial: any) => {\n if (prepayment?.origin === commercial.object && commercial.has_prepayment) {\n return commercial.prepayment.price * 100;\n }\n return 0;\n };\n\n const currency = (commercial: any) => {\n if (prepayment?.origin === commercial.object && commercial.has_prepayment) {\n return commercial.prepayment.currency;\n }\n return 0;\n };\n\n const displaySelector = (commercialKind: string) => {\n return (\n <>\n <Subtitle data-test=\"subtitle-selector\">{commercialKind}</Subtitle>\n <Separator />\n </>\n );\n };\n\n const selectedEvent = hasEvent ? (\n <SummaryCommercialItem\n key={_event.id}\n commercialId={_event.id.toString()}\n name={_event.name}\n quantity={quantity(_event)}\n unitPrice={unitPrice(_event)}\n currency={currency(_event)}\n image={_event.image}\n />\n ) : (\n <></>\n );\n\n const selectedOffer = hasOffer ? (\n <SummaryCommercialItem\n key={_offer.id}\n commercialId={_offer.id}\n name={_offer.name}\n quantity={quantity(_offer)}\n unitPrice={unitPrice(_offer)}\n currency={currency(_offer)}\n image={_offer.image}\n />\n ) : (\n <></>\n );\n\n const selectedMenus = hasMenus\n ? menus.map((menu: SelectedMenu) => (\n <SummaryCommercialItem\n key={menu.commercial_id}\n commercialId={menu.commercial_id}\n name={menu.name}\n quantity={menu.quantity}\n unitPrice={menu.unit_price}\n currency={menu.currency}\n image={menu.image}\n />\n ))\n : [];\n\n const addedVouchers = hasVoucher\n ? vouchers.map((voucher: Voucher) => (\n <VoucherItem voucher={voucher} key={voucher.code} />\n ))\n : [];\n\n const needToShowSummary = hasVoucher || hasEvent || hasOffer || hasMenus;\n\n return needToShowSummary ? (\n <SummaryWrapper data-test=\"summary\">\n {hasVoucher && displaySelector(t(\"instabook.common.voucher\"))}\n {hasVoucher && addedVouchers}\n\n {hasEvent && displaySelector(t(\"instabook.common.event\"))}\n {hasEvent ? <>{selectedEvent}</> : \"\"}\n\n {hasOffer && displaySelector(t(\"instabook.common.offer\"))}\n {hasOffer ? <>{selectedOffer}</> : \"\"}\n\n {hasMenus && displaySelector(t(\"instabook.common.menus\"))}\n {hasMenus ? <>{selectedMenus}</> : \"\"}\n\n {prepayment && displaySelector(t(\"instabook.prepayment.total\"))}\n {prepayment && (\n <CommercialsTotal data-test=\"commercials-total\">\n <span>\n {pendingBookingStore.getPrepaymentPriceWithPrecision()?.toFixed(2)}{\" \"}\n {prepayment.currency}\n </span>\n </CommercialsTotal>\n )}\n </SummaryWrapper>\n ) : (\n <></>\n );\n};\n\nexport const Summary = memo(CommercialsSummary);\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class ReCaptchaEndpoint extends Endpoint {\n constructor() {\n super(\"verify_recaptcha\");\n }\n}\n","import { getHttpService } from \"../services/http.service\";\nimport { ReCaptchaEndpoint } from \"../endpoints/ReCaptchaEndpoint\";\n\nconst httpService = getHttpService();\n\nexport const verifyReCaptcha = (captchaValue: string) => {\n const endpoint = new ReCaptchaEndpoint();\n return httpService.post(endpoint, { token: captchaValue });\n};\n","import React, { memo, useEffect, useState } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport styled from \"styled-components\";\nimport { BookingState, PendingBooking } from \"../../types\";\nimport { updatePendingBookingRequest } from \"../../requests/pending-booking.requests\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport { SummaryCriteria } from \"../summary-criteria/summary-criteria\";\nimport { ConfirmationContactForm } from \"./confirmation-contact-form/confirmation-contact-form\";\nimport { ConfirmationPayment } from \"./confirmation-payment/confirmation-payments\";\nimport {\n GolContactInfoFormContext,\n GolContactInfoInterface,\n} from \"./confirmation-contact-form/gol-contact-form-interfaces\";\nimport { ContinueButton } from \"../continue-button/continue-button\";\nimport { ConfirmationCommitPendingBooking } from \"./confirmation-commit-pending-booking\";\nimport { Summary } from \"./summary/summary\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { useTranslation } from \"react-i18next\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { verifyReCaptcha } from \"../../requests/recaptcha.requests\";\n\nconst PrepaymentInfoWrapper = styled.div`\n width: 100%;\n margin-top: 32px;\n`;\n\nexport const ConfirmationLayoutWrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst Anchor = styled.div`\n width: 1px;\n height: 1px;\n`;\n\nconst ReCaptcha = styled(ReCAPTCHA)`\n margin-top: 24px;\n`;\n\nconst Confirmation = () => {\n const { t } = useTranslation();\n const [bookingState] = useState(pendingBookingStore.getBookingState());\n const [errorMsg] = useState(useLocation().state as { [key: string]: string });\n const [prepaymentInfo, setPrepaymentInfo] = useState(\n pendingBookingStore.prepaymentInfo\n );\n\n const [showPptForm, setShowPptForm] = useState(\n !moduleSettings.hasSkippingGroupPpt\n );\n const [submitText, setSubmitButtonText] = useState(\"\");\n const [validContactInfo, setValidContactInfo] = useState(false);\n const [validPptInfo, setValidPptInfo] = useState(false);\n const [checkContactInfoFormValidity, setCheckContactInfoFormValidity] =\n useState(false);\n const [checkContactPptInfoFormValidity, setCheckContactPptInfoFormValidity] =\n useState(false);\n const [canCommit, setCanCommit] = useState(false);\n const isRecaptchaEnabled = moduleSettings.isRecaptchaEnabled;\n const [captchaValue, setCaptchaValue] = useState(null);\n const throwError = useErrorHandler();\n\n const { i18n } = useTranslation();\n useEffect(() => {\n setPrepaymentInfo(pendingBookingStore.prepaymentInfo);\n }, [i18n.language]);\n\n useEffect(() => {\n let buttonText_ = \"button.reserve\";\n if (prepaymentInfo || bookingState === BookingState.initialized) {\n buttonText_ = \"button.ask_for_reservation\";\n }\n if (bookingState === BookingState.waiting) {\n buttonText_ = \"button.ask_for_waiting_list\";\n }\n if (showPptForm && moduleSettings.hasSkippingGroupPpt) {\n buttonText_ = \"button.confirm_payment\";\n }\n\n setSubmitButtonText(buttonText_);\n }, [\n bookingState,\n prepaymentInfo,\n showPptForm,\n moduleSettings.hasSkippingGroupPpt,\n ]);\n\n const isInViewport = (element) => {\n const rect = element.getBoundingClientRect();\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n };\n\n useEffect(() => {\n if (moduleSettings.hasSkippingGroupPpt && prepaymentInfo && showPptForm) {\n const anchor = document.querySelector(\"#anchor-stripe-info\");\n if (anchor && !isInViewport(anchor)) {\n anchor?.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n }\n });\n\n useEffect(() => {\n if (!checkContactInfoFormValidity) setValidContactInfo(false);\n setCheckContactPptInfoFormValidity(false);\n }, [checkContactInfoFormValidity]);\n\n useEffect(() => {\n if (validPptInfo) {\n //!\\disabled push stripeToken update\n //since stripeWebHook is being used\n /* const subscription = updatePendingBookingRequest({\n stripe_token: pendingBookingStore.stripeToken,\n }).subscribe((resp) => {\n pendingBookingStore.pendingBooking = {\n ...pendingBookingStore.pendingBooking,\n ...resp,\n };\n setCanCommit(true);\n }, throwError);\n return () => {\n subscription.unsubscribe();\n };*/\n verifyCanCommit();\n }\n }, [validPptInfo, throwError]);\n\n useEffect(() => {\n if (validContactInfo) {\n const subscription = updatePendingBookingRequest({\n contact_info: pendingBookingStore.pendingBookingContact,\n }).subscribe((resp: PendingBooking) => {\n pendingBookingStore.pendingBooking = {\n ...pendingBookingStore.pendingBooking,\n ...resp,\n };\n if (resp.prepayment) {\n if (pendingBookingStore.skip_prepayment_for_contact) {\n verifyCanCommit();\n } else {\n if (moduleSettings.hasSkippingGroupPpt) {\n if (!showPptForm) {\n setShowPptForm(true);\n setCheckContactInfoFormValidity(false);\n } else {\n setCheckContactPptInfoFormValidity(true);\n }\n } else {\n setCheckContactPptInfoFormValidity(true);\n }\n }\n } else {\n verifyCanCommit();\n }\n }, throwError);\n return () => {\n subscription.unsubscribe();\n };\n } else {\n setCheckContactInfoFormValidity(false);\n }\n }, [validContactInfo, throwError]);\n\n const checkFormValidity = () => {\n setCheckContactInfoFormValidity(true);\n };\n\n const verifyCanCommit = () => {\n if (isRecaptchaEnabled) {\n const subscription = verifyReCaptcha(captchaValue!).subscribe((resp) => {\n if (resp === 200) {\n pendingBookingStore.recaptchaValue = captchaValue!;\n setCanCommit(true);\n }\n }, throwError);\n return () => {\n subscription.unsubscribe();\n };\n } else {\n setCanCommit(true);\n }\n };\n\n const onChange = (value: React.SetStateAction<null>) => {\n setCaptchaValue(value);\n };\n\n const value: GolContactInfoInterface = {\n setValidContactInfo,\n setValidPptInfo,\n checkContactInfoFormValidity,\n checkContactPptInfoFormValidity,\n setCheckContactInfoFormValidity,\n setCheckContactPptInfoFormValidity,\n errorMsg,\n };\n\n const content = (\n <>\n <ConfirmationLayoutWrapper>\n <SummaryCriteria data-test=\"selection-criteria\" />\n <Summary />\n\n <GolContactInfoFormContext.Provider value={value}>\n <ConfirmationContactForm\n clazz={checkContactInfoFormValidity ? \"disabled\" : \"\"}\n />\n {prepaymentInfo && showPptForm && (\n <PrepaymentInfoWrapper data-test=\"ppt-info-wrapper\">\n <InformationText text={prepaymentInfo} />\n <InformationText\n text={t(\"instabook.prepayment.3d_secure_info\")}\n status={\"info\"}\n />\n </PrepaymentInfoWrapper>\n )}\n {prepaymentInfo && showPptForm && (\n <ConfirmationPayment\n data-test=\"confirmation-payment\"\n clazz={checkContactInfoFormValidity ? \"disabled\" : \"\"}\n />\n )}\n {isRecaptchaEnabled && (\n <ReCaptcha\n sitekey={process.env.REACT_APP_RECAPTCHA_SITEKEY}\n onChange={onChange}\n hl={i18n.language}\n />\n )}\n <ContinueButton\n buttonTextKey={submitText}\n onClick={checkFormValidity}\n loader={checkContactInfoFormValidity}\n disabled={\n checkContactInfoFormValidity ||\n (isRecaptchaEnabled && !captchaValue)\n }\n />\n <Anchor id=\"anchor-stripe-info\" />\n </GolContactInfoFormContext.Provider>\n </ConfirmationLayoutWrapper>\n </>\n );\n return <>{canCommit ? <ConfirmationCommitPendingBooking /> : content}</>;\n};\n\nexport const ConfirmationLayout = memo(Confirmation);\n","import React, { memo, useEffect } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useHistory } from \"react-router-dom\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport styled from \"styled-components\";\nimport { Booking } from \"../../../types\";\nimport { config } from \"../../../config\";\nimport { bookingStore } from \"../../../stores/booking.store\";\nimport {\n cancelPendingBookingRequest,\n commitPendingBooking,\n} from \"../../../requests/pending-booking.requests\";\nimport { buildRouteWithParams } from \"../../../helpers/build-route-with-params\";\nimport { InformationText } from \"../../information-text/information-text\";\nimport { Loader } from \"../../loader/loader\";\nimport { ApiErrorCode } from \"../../../services/api-errors\";\nimport { SetupIntentApiErrorImpl } from \"../../../services/api-errors/api-errors-impl\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\n\nconst RefreshOnPaymentWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst _RefreshOnPayment = () => {\n const { t } = useTranslation();\n const history = useHistory();\n const _pendingBookingId = localStorage.getItem(\"pendingBookingId\") || \"\";\n const _referralKey = localStorage.getItem(\"referralKey\" || \"\");\n const throwError = useErrorHandler();\n\n const clearLocaleStorage = () => {\n localStorage.removeItem(\"pendingBookingId\");\n localStorage.removeItem(\"referralKey\");\n };\n\n useEffect(() => {\n // if (window.performance && performance.navigation.type == 1) {\n if (_pendingBookingId && _referralKey === moduleSettings.getReferralKey()) {\n const subscription = commitPendingBooking({\n pending_booking_id: _pendingBookingId,\n }).subscribe({\n next: (resp: Booking) => {\n clearLocaleStorage();\n bookingStore.booking = resp;\n history.push(buildRouteWithParams(config.routes.confirmationEnd));\n },\n error: (error) => {\n clearLocaleStorage();\n let err = {};\n if (\n error.code === ApiErrorCode.setup_intent_invalid ||\n error.code === ApiErrorCode.payment_intent_failed\n ) {\n cancelPendingBookingRequest(_pendingBookingId);\n err = new SetupIntentApiErrorImpl(error);\n }\n throwError(err);\n },\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n // }\n }, [window.performance]);\n\n return (\n <RefreshOnPaymentWrapper>\n <InformationText\n key={\"no_online_booking_enabled_msg\"}\n text={t(\"instabook.errors.error_during_payment\")}\n status={\"info\"}\n />\n <Loader />\n </RefreshOnPaymentWrapper>\n );\n};\n\nexport const RefreshOnPayment = memo(_RefreshOnPayment);\n","import React, { memo } from \"react\";\nimport { config } from \"../../../config\";\nimport { buildRouteWithParams } from \"../../../helpers/build-route-with-params\";\nimport { Route, Switch } from \"react-router-dom\";\nimport { ConfirmationValidation } from \"../confirmation-validation/confirmation-validation\";\nimport { ConfirmationLayout } from \"../confirmation-layout\";\nimport { RefreshOnPayment } from \"../refresh-on-payment/refresh-on-payment\";\n\nconst Confirmation = () => {\n return (\n <>\n <Switch>\n <Route\n exact={true}\n path={`${buildRouteWithParams(config.routes.confirmation, false)}`}\n >\n <ConfirmationLayout />\n </Route>\n <Route\n exact={true}\n path={buildRouteWithParams(\n config.routes.confirmationOnRefresh,\n false\n )}\n >\n <RefreshOnPayment />\n </Route>\n <Route\n exact={true}\n path={buildRouteWithParams(config.routes.confirmationEnd, false)}\n >\n <ConfirmationValidation />\n </Route>\n </Switch>\n </>\n );\n};\nexport const ConfirmationRouter = memo(Confirmation);\n","import { createContext, useContext } from \"react\";\nimport { CommericalAction } from \"../types\";\n\n\n\n//MenuItem\ninterface CommercialMenuItemCtxInterface {\n updateStatisfyMenusMandatory: (satisfied: boolean) => void;\n}\nexport const CommercialMenuItemCtx = createContext<CommercialMenuItemCtxInterface>(\n {} as CommercialMenuItemCtxInterface\n);\nexport const useCommercialMenuItemContext = () => useContext(CommercialMenuItemCtx);\n\n//Menus\ninterface CommercialMenusCtxInterface {\n resetMenusAvailabilities: () => void;\n selectedMenusIds: Array<number>;\n performAction: (action: CommericalAction, details: { [menuId: number]: number | undefined }) => void\n menusAvailabilities: { [key: number]: boolean };\n}\nexport const CommercialMenusCtx = createContext<CommercialMenusCtxInterface>(\n {} as CommercialMenusCtxInterface\n);\nexport const useCommercialMenusContext = () => useContext(CommercialMenusCtx);\n\n//Menu\ninterface CommercialMenuCtxInterface {\n updateUnavailable: (unavailable: boolean) => void;\n}\nexport const CommercialMenuCtx = createContext<CommercialMenuCtxInterface>(\n {} as CommercialMenuCtxInterface\n);\nexport const useCommercialMenuContext = () => useContext(CommercialMenuCtx);\n\n\n//voucher\ninterface DetailsVoucherCtxInterface {\n updateDisabledBtnFromVoucher: (disabled: boolean) => void;\n updateValidVoucherCode: (loading: boolean) => void;\n}\nexport const DetailsVoucherCtx = createContext<DetailsVoucherCtxInterface>(\n {} as DetailsVoucherCtxInterface\n);\nexport const useDetailsVoucherContext = () => useContext(DetailsVoucherCtx);\n","import React, { memo } from \"react\";\nimport { CheckCircle } from \"@material-ui/icons\";\nimport styled from \"styled-components\";\n\ninterface IProps {\n disabled?: boolean;\n onClick?: any;\n}\n\nconst BackgroundCircleButtonStyle = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background-color: ${(props) => props.theme.backgroundColor};\n margin: 0 8px 0 12px;\n`;\n\nconst CheckCircleButton = styled.div<IProps>`\n opacity: ${(props) => (props.disabled ? 0.4 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n cursor: ${(props) => (props.disabled ? \"default\" : \"pointer\")};\n svg {\n fill: ${(props) => props.theme.primaryColor};\n }\n`;\n\nconst BackgroundCircleButtonWrapper = (props: IProps) => {\n return (\n <BackgroundCircleButtonStyle>\n <CheckCircleButton\n data-test=\"button-valid-input\"\n onClick={props.onClick}\n disabled={props.disabled}\n >\n <CheckCircle />\n </CheckCircleButton>\n </BackgroundCircleButtonStyle>\n );\n};\n\nexport const BackgroundCircleButton = memo(BackgroundCircleButtonWrapper);\n","import React, { memo, useContext, useEffect, useState } from \"react\";\nimport RedeemIcon from \"@material-ui/icons/Redeem\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { InputWithIcon } from \"../input-with-icon/input-with-icon\";\nimport { VoucherInputCtx } from \"../details/details-vouchers/details-vouchers\";\nimport { useDetailsVoucherContext } from \"../../contexts/commercial-context\";\nimport { checkVoucherCode } from \"../../requests/pending-booking.requests\";\nimport { PendingBooking } from \"../../types\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport { Loader } from \"../loader/loader\";\nimport { ValidationErrorApiErrorImpl } from \"../../services/api-errors/api-errors-impl\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport { BackgroundCircleButton } from \"../background-circle-button/background-circle-button\";\n\nconst InputWrapper = styled.div`\n display: flex;\n align-items: center;\n color: ${(props) => props.theme.primaryColor};\n\n &.disabled {\n pointer-events: none;\n opacity: 0.4;\n }\n\n .input-with-icon {\n width: inherit;\n\n @media screen and (max-width: 368px) {\n width: 250px;\n }\n }\n`;\n\nconst GolVoucherInput = () => {\n const { t } = useTranslation();\n const [code, setCode] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [validateCode, setValidateCode] = useState(false);\n const voucherCtx = useContext(VoucherInputCtx);\n const { updateMessageError, messageError, updateVouchers, voucherAllowed } =\n voucherCtx;\n const { updateDisabledBtnFromVoucher, updateValidVoucherCode } =\n useDetailsVoucherContext();\n\n const voucherCodeChanged = (ev: any) => {\n updateMessageError(\"\");\n const { value } = ev.target;\n setCode(value);\n };\n\n const onCheckVoucherCodeClick = () => {\n const selectedVouchers = pendingBookingStore.selectedVouchers;\n if (\n selectedVouchers.filter((voucher) => voucher.code === code).length > 0\n ) {\n updateMessageError(t(`instabook.gift_code.already_added`));\n return setValidateCode(false);\n }\n if (voucherAllowed) {\n setValidateCode(true);\n }\n };\n\n const hasError = messageError ? messageError.length !== 0 : false;\n const throwError = useErrorHandler();\n useEffect(() => {\n updateDisabledBtnFromVoucher(code.length !== 0);\n }, [code]);\n\n useEffect(() => {\n setIsLoading(validateCode);\n if (validateCode) {\n const subscription = checkVoucherCode(code).subscribe({\n next: (resp: PendingBooking) => {\n pendingBookingStore.pendingBooking = resp;\n setCode(\"\");\n updateVouchers(resp.vouchers);\n setIsLoading(false);\n setValidateCode(false);\n updateValidVoucherCode(true);\n },\n error: (error) => {\n setValidateCode(false);\n if (error instanceof ValidationErrorApiErrorImpl) {\n const _getVoucherDetailsError = error.getVoucherDetailsError();\n if (_getVoucherDetailsError !== undefined) {\n updateMessageError(\n error.response.data[\"error\"][\n _getVoucherDetailsError!.toString()\n ][0]\n );\n }\n } else {\n throwError(error);\n }\n },\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n }, [validateCode]);\n\n return (\n <>\n {isLoading && <Loader />}\n <InputWrapper\n data-test=\"voucher-input-wrapper\"\n className={isLoading ? \"disabled\" : \"\"}\n >\n <InputWithIcon\n error={hasError}\n name={\"voucher\"}\n readOnly={false}\n value={code}\n placeholderKey={\"instabook.gift_card.placeholder\"}\n variant={\"outlined\"}\n onChange={voucherCodeChanged}\n icon={<RedeemIcon />}\n />\n <BackgroundCircleButton\n onClick={onCheckVoucherCodeClick}\n disabled={hasError ? true : code.length === 0}\n />\n </InputWrapper>\n </>\n );\n};\n\nexport const VoucherInput = memo(GolVoucherInput);\n","import React, { createContext, memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { Title } from \"../../title/title\";\nimport { VoucherInput } from \"../../voucher/voucher-input\";\nimport { PendingBooking, Voucher } from \"../../../types\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { VoucherItem } from \"../../voucher/voucher-item\";\nimport { removeVoucherCodeToPendingBooking } from \"../../../requests/pending-booking.requests\";\nimport { useDetailsVoucherContext } from \"../../../contexts/commercial-context\";\nimport { ValidationErrorApiErrorImpl } from \"../../../services/api-errors/api-errors-impl\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport { ApiErrorCode } from \"../../../services/api-errors\";\n\ninterface IStyle {\n voucherAllowed: boolean;\n}\n\nconst DiscountWrapper = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 32px;\n`;\n\nconst VouchersWrapper = styled.div`\n width: fit-content;\n background-color: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 0 8px 8px 8px;\n padding: 4px 4px 0 4px;\n`;\n\nconst VoucherInputWrapper = styled.div<IStyle>`\n opacity: ${(props) => (props.voucherAllowed ? 1 : 0.4)};\n pointer-events: ${(props) => (props.voucherAllowed ? \"auto\" : \"none\")};\n`;\n\nconst VoucherItems = styled.div`\n display: flex;\n flex-wrap: wrap;\n`;\n\nconst MessageInfo = styled.div`\n font-size: 0.8rem;\n margin-bottom: 8px;\n padding: 4px;\n width: 300px;\n`;\n\nconst MessageError = styled(MessageInfo)`\n color: #e74c3c;\n`;\n\ninterface VoucherInputInterface {\n updateMessageError: (errorMsg?: string) => void;\n updateVouchers: (vouchers: Array<Voucher>) => void;\n voucherAllowed: boolean;\n messageError?: string;\n}\nexport const VoucherInputCtx = createContext<VoucherInputInterface>(\n {} as VoucherInputInterface\n);\nconst Vouchers = () => {\n const { t } = useTranslation();\n\n const handleCanDisplayInput = (vouchers: Array<Voucher>) => {\n return multiVouchersEnabled ? true : vouchers && vouchers.length < 1;\n };\n\n const multiVouchersEnabled = moduleSettings.multiVouchersEnabled;\n const [voucherAllowed, setVoucherAllowed] = useState(\n pendingBookingStore.getIsVoucherAllowed()\n );\n const [vouchers, setVouchers] = useState<Array<Voucher>>(\n pendingBookingStore.selectedVouchers\n );\n const [voucherToRemove, setVoucherToRemove] = useState(\"\");\n const [messageError, setMessageError] = useState<string | undefined>(\n undefined\n );\n const messageInfo = t(\"instabook.gift_code.voucher_not_allowed\");\n const [canDisplayInput, setCanDisplayInput] = useState(\n handleCanDisplayInput(vouchers)\n );\n const { updateValidVoucherCode } = useDetailsVoucherContext();\n\n const handleRemoveVoucher = (value: string): void => {\n setVoucherToRemove(value);\n };\n\n const handleAddVoucher = (updatedVouchers: Array<Voucher>) => {\n setVouchers(updatedVouchers);\n setCanDisplayInput(handleCanDisplayInput(updatedVouchers));\n };\n const throwError = useErrorHandler();\n\n useEffect(() => {\n if (voucherToRemove) {\n const subscription = removeVoucherCodeToPendingBooking(\n voucherToRemove\n ).subscribe({\n next: (resp: PendingBooking) => {\n pendingBookingStore.pendingBooking = resp;\n setVouchers(resp.vouchers);\n setVoucherToRemove(\"\");\n setCanDisplayInput(handleCanDisplayInput(resp.vouchers));\n setVoucherAllowed(pendingBookingStore.getIsVoucherAllowed());\n updateValidVoucherCode(resp.vouchers.length > 0);\n },\n error: (error) => {\n if (error instanceof ValidationErrorApiErrorImpl) {\n const _getVoucherDetailsError = error.getVoucherDetailsError();\n if (_getVoucherDetailsError !== undefined) {\n setMessageError(\n error.response.data[\"error\"][\n _getVoucherDetailsError!.toString()\n ][0]\n );\n }\n } else {\n throwError(error);\n }\n },\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n }, [voucherToRemove]);\n\n const renderVouchers = vouchers?.map((voucher: Voucher) => {\n return (\n <VoucherItem\n key={voucher.code}\n voucher={voucher}\n onRemoveVoucher={handleRemoveVoucher}\n isRemovable={true}\n />\n );\n });\n\n return (\n <DiscountWrapper data-test=\"voucher-detail\">\n <Title\n text={t(\"instabook.gift_code.enter_your_discount_code\")}\n type=\"tab\"\n />\n <VouchersWrapper>\n <VoucherInputCtx.Provider\n value={{\n updateMessageError: (errorMsg?: string) =>\n setMessageError(errorMsg),\n updateVouchers: (updatedVouchers: Array<Voucher>) =>\n handleAddVoucher(updatedVouchers),\n voucherAllowed,\n messageError,\n }}\n >\n <VoucherInputWrapper\n data-test=\"voucher-wrapper\"\n voucherAllowed={voucherAllowed}\n >\n {canDisplayInput && <VoucherInput />}\n </VoucherInputWrapper>{\" \"}\n </VoucherInputCtx.Provider>\n {messageError && (\n <MessageError data-test=\"message-error\">{messageError}</MessageError>\n )}\n {!voucherAllowed && (\n <MessageInfo data-test=\"message-info\">{messageInfo}</MessageInfo>\n )}\n <VoucherItems>{renderVouchers}</VoucherItems>\n </VouchersWrapper>\n </DiscountWrapper>\n );\n};\n\nexport const DetailsVouchers = memo(Vouchers);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\n\ninterface ICommercialTitleProps {\n title: string;\n icon?: any;\n}\n\nconst TitleDisplay = styled.div`\n display: flex;\n margin-bottom: 10px;\n align-items: center;\n font-size: 14px;\n font-weight: bold;\n color: ${(props) => props.theme.textColorDarken};\n\n &.has-icon {\n padding-left: 20px;\n\n &:before {\n content: \" \";\n }\n }\n`;\n\nconst Title = (props: ICommercialTitleProps) => {\n return (\n <TitleDisplay>\n {props.icon ? props.icon : \"\"}\n {props.title}\n </TitleDisplay>\n );\n};\n\nexport const CommercialTitle = memo(Title);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\n\ninterface ICommercialTextProps {\n text: string;\n}\n\nexport const TextDisplay = styled.div`\n color: ${(props) => props.theme.textColorDarken};\n font-size: 12px;\n white-space: break-spaces;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n`;\n\nconst Text = (props: ICommercialTextProps) => {\n const mappedText = props.text.split(\"\\r\\n\").join(\"</br>\");\n return (\n <TextDisplay>\n <span dangerouslySetInnerHTML={{ __html: mappedText }} />\n </TextDisplay>\n );\n};\n\nexport const CommercialText = memo(Text);\n","import i18n from \"../i18n\";\nimport { numberFormat } from \"src/utils\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { Commercial, CommercialTranslation, PrepaymentInfos } from \"../types\";\nimport { getLanguageSwitcherService } from \"./language-switcher.service\";\n\nexport class CommercialService {\n private _commercial: Commercial;\n private _translationInCurrentLocale: CommercialTranslation | undefined;\n private _translationInRestaurantLocale: CommercialTranslation | undefined;\n\n constructor(commercial: Commercial, public locale: string) {\n this._commercial = commercial;\n this.locale = getLanguageSwitcherService().golLocaleFromSwitcher(locale);\n this._translationInCurrentLocale =\n this.loadCommercialTranslationForLocale();\n this._translationInRestaurantLocale =\n this.loadCommercialTranslationForLocale(\n moduleSettings.getDefaultLocale()\n );\n }\n get image(): string | undefined {\n return this._commercial.image;\n }\n\n get description(): string {\n return (\n this.loadInCurrentLocale(\"description\", this) ||\n this.loadInRestaurantLocale(\"description\", this) ||\n this.loadDefault(\"description\", this)\n );\n }\n\n get id(): number {\n return this._commercial.id;\n }\n\n get name(): string {\n return (\n this.loadInCurrentLocale(\"name\", this) ||\n this.loadInRestaurantLocale(\"name\", this) ||\n this.loadDefault(\"name\", this)\n );\n }\n\n get title(): string {\n return this._commercial.name;\n }\n\n get hasPrepayment(): boolean {\n return this._commercial.has_prepayment || false;\n }\n\n get prepaymentInfos(): string | undefined {\n if (!this.hasPrepayment) {\n return;\n }\n const _prepayment = this._commercial.prepayment;\n let _commercialKind;\n\n if (_prepayment && _prepayment.price) {\n const priceAndCurrency = numberFormat(\n i18n.language,\n _prepayment.price,\n _prepayment.currency\n );\n\n switch (this._commercial.object) {\n case \"menu\":\n _commercialKind = \"menus\";\n break;\n case \"offer\":\n _commercialKind = \"offers\";\n break;\n case \"event\":\n _commercialKind = \"events\";\n break;\n }\n\n const _prepaymentInfos = i18n.t(\n `instabook.${_commercialKind}.prepayment_infos.${_prepayment.payment_kind}`,\n {\n price_and_currency: priceAndCurrency,\n }\n );\n return _prepaymentInfos;\n }\n }\n\n loadCommercialTranslationForLocale(\n forLocale: string = this.locale\n ): CommercialTranslation | undefined {\n return this._commercial.translations\n ? this._commercial.translations.find(\n (com: CommercialTranslation) => com.locale === forLocale\n )\n : undefined;\n }\n\n loadInCurrentLocale(property: string, _this: this): string | undefined {\n type ObjectKey = keyof typeof _this._translationInCurrentLocale;\n const keyPpty = property as ObjectKey;\n return this._translationInCurrentLocale\n ? this._translationInCurrentLocale[keyPpty]\n : undefined;\n }\n\n loadInRestaurantLocale(property: string, _this: this): string | undefined {\n type ObjectKey = keyof typeof _this._translationInRestaurantLocale;\n const keyPpty = property as ObjectKey;\n return this._translationInRestaurantLocale\n ? this._translationInRestaurantLocale[keyPpty]\n : undefined;\n }\n\n loadDefault(property: string, _this: this) {\n type ObjectKey = keyof typeof _this._commercial;\n const keyPpty = property as ObjectKey;\n return this._commercial[keyPpty] ?? \"\";\n }\n}\n","import React, { memo } from \"react\";\nimport { CommercialTitle } from \"../commercial-title\";\nimport { CommercialText } from \"../commercial-text\";\nimport { Commercial } from \"../../../types\";\nimport FlashOnIcon from \"@material-ui/icons/FlashOn\";\nimport styled from \"styled-components\";\nimport { CommercialService } from \"../../../services/commercial-service\";\nimport { useTranslation } from \"react-i18next\";\nimport { GolTooltip } from \"../../tooltip/tooltip\";\ninterface ICommercialsEventItemProps {\n commercial: Commercial;\n}\nconst MoreAction = styled.div`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n margin-top: 10px;\n`;\n\nconst CommercialEvent = styled.div`\n background-color: ${(props) => props.theme.informationTextBackgroundColor};\n border-radius: 0 5px 5px 5px;\n padding: 12px 14px;\n margin-bottom: 32px;\n`;\n\nconst Legend = styled.div`\n width: 100%;\n text-align: left;\n font-size: 12px;\n color: ${(props) => props.theme.disabledColor};\n margin-top: -8px;\n margin-bottom: 8px;\n`;\n\nconst Item = (props: ICommercialsEventItemProps) => {\n const { i18n } = useTranslation();\n const commercialService = new CommercialService(\n props.commercial,\n i18n.language\n );\n return (\n <CommercialEvent data-test=\"commercial-event\">\n <CommercialTitle title={commercialService.name} icon={<FlashOnIcon />} />\n {commercialService.hasPrepayment && (\n <Legend data-test=\"offer-menu-prepayment-infos\">\n {commercialService.prepaymentInfos}\n </Legend>\n )}\n <CommercialText\n data-test=\"event-description\"\n text={commercialService.description}\n />\n <MoreAction data-test=\"event-more-action\">\n <GolTooltip\n title={commercialService.name}\n text={commercialService.description}\n />\n </MoreAction>\n </CommercialEvent>\n );\n};\n\nexport const CommercialsEventItem = memo(Item);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { CommercialTitle } from \"./commercial-title\";\nimport { CommercialText } from \"./commercial-text\";\nimport { CommercialService } from \"../../services/commercial-service\";\nimport { IDisabled } from \"../../types\";\n\ninterface IMenuOfferCommonProps {\n commercialService: CommercialService;\n children: JSX.Element;\n disabled?: boolean;\n}\n\nconst CommercialWrapper = styled.div<IDisabled>`\n position: relative;\n width: 298px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);\n border-radius: 4px;\n padding: 12px 14px;\n margin: 2px;\n background-color: ${(props) => props.theme.backgroundColor};\n opacity: ${(props) => (props.disabled ? 0.4 : 1)};\n`;\n\nconst Legend = styled.div`\n width: 100%;\n text-align: left;\n font-size: 12px;\n color: ${(props) => props.theme.disabledColor};\n margin-top: -8px;\n margin-bottom: 8px;\n`;\n\nconst CommercialImage = styled.div`\n width: 100%;\n`;\n\nconst Common = (props: IMenuOfferCommonProps) => {\n return (\n <CommercialWrapper\n className={props.disabled ?? false ? \"disabled\" : undefined}\n disabled={props.disabled ?? false}\n data-test={`offer-menu-wrapper-${props.commercialService.id}`}\n >\n {props.commercialService.image && <CommercialImage />}\n <CommercialTitle\n data-test=\"offer-menu-title\"\n title={props.commercialService.name}\n />\n {props.commercialService.hasPrepayment && (\n <Legend data-test=\"offer-menu-prepayment-infos\">\n {props.commercialService.prepaymentInfos}\n </Legend>\n )}\n <CommercialText\n data-test=\"offer-menu-description\"\n text={props.commercialService.description}\n />\n {props.children}\n </CommercialWrapper>\n );\n};\n\nexport const MenuOfferCommon = memo(Common);\n","import React, { memo, useEffect, useState } from \"react\";\nimport {\n CommericalAction,\n PendingBooking,\n SelectedOffer,\n} from \"../../../types\";\nimport styled from \"styled-components\";\nimport { MenuOfferCommon } from \"../commercial-menu-offer-common\";\nimport { Checkbox } from \"@mui/material\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport {\n addOfferToPendingBooking,\n removeOfferToPendingBooking,\n} from \"../../../requests/pending-booking.requests\";\nimport { Observable, Subscription } from \"rxjs\";\nimport { ApiErrorImpl } from \"../../../services/api-errors/api-errors-impl\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { GolTooltip } from \"../../tooltip/tooltip\";\nimport { useTranslation } from \"react-i18next\";\nimport { CommercialService } from \"../../../services/commercial-service\";\ninterface ICommercialsOfferItemProps {\n offer: SelectedOffer;\n setChildLoading: (state: boolean) => void;\n setErrorMessage: (errorMessage: string) => void;\n}\n\nconst OfferSelection = styled.div`\n display: flex;\n justify-content: end;\n justify-content: space-between;\n align-items: center;\n margin-right: -12px;\n margin-bottom: -6px;\n`;\n\nconst Item = (props: ICommercialsOfferItemProps) => {\n const [isSelected, setIsSelected] = useState(\n selectionStore.selectedOffer?.id === props.offer.id\n );\n const [action, setAction] = useState<CommericalAction | null>(null);\n const { i18n } = useTranslation();\n\n const commercialService = new CommercialService(props.offer, i18n.language);\n useEffect(() => {\n const subscription = selectionStore.selectedOfferChanged.subscribe(\n (selectedOffer) => {\n setIsSelected(selectedOffer?.id === props.offer.id);\n }\n );\n return () => {\n subscription.unsubscribe();\n };\n });\n\n useEffect(() => {\n let subscription: Subscription;\n let observable: Observable<any>;\n switch (action) {\n case \"add\":\n observable = addOfferToPendingBooking(props.offer.id);\n break;\n case \"remove\":\n observable = removeOfferToPendingBooking(props.offer.id);\n break;\n }\n observable?.subscribe({\n next: (resp: PendingBooking) => {\n action === CommericalAction.add\n ? selectionStore.addOffer(props.offer)\n : selectionStore.removeOffer();\n setAction(null);\n pendingBookingStore.pendingBooking = resp;\n props.setChildLoading(false);\n },\n error: (error: ApiErrorImpl) => {\n setAction(null);\n props.setErrorMessage(error.getMessage());\n props.setChildLoading(false);\n },\n });\n return () => {\n if (subscription) subscription.unsubscribe();\n };\n }, [action]);\n const checkboxStateChanged = (ev: any) => {\n props.setChildLoading(true);\n props.setErrorMessage(null);\n ev.target.checked\n ? setAction(CommericalAction.add)\n : setAction(CommericalAction.remove);\n };\n\n return (\n <MenuOfferCommon commercialService={commercialService}>\n <OfferSelection>\n <GolTooltip\n title={commercialService.name}\n text={commercialService.description}\n />\n <Checkbox\n data-test={`offer-check-${props.offer.id}`}\n checked={isSelected}\n onChange={checkboxStateChanged}\n size=\"small\"\n />\n </OfferSelection>\n </MenuOfferCommon>\n );\n};\n\nexport const CommercialsOfferItem = memo(Item);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\n\ninterface IMenuOfferWrapperProps {\n children: Array<JSX.Element>;\n}\n\nexport const SectionWrapper = styled.div`\n margin: 0;\n display: flex;\n flex-wrap: wrap;\n width: fit-content;\n padding: 2px;\n margin-bottom: 32px;\n background-color: ${(props) => props.theme.backgroundTransparentWhite};\n border-radius: 0 8px 8px 8px;\n\n &:after {\n content: \"\";\n flex: auto;\n }\n\n @media screen and (max-width: 480px) {\n width: 100%;\n flex-direction: column;\n align-items: center;\n }\n`;\n\nconst Wrapper = (props: IMenuOfferWrapperProps) => {\n return <SectionWrapper>{props.children}</SectionWrapper>;\n};\n\nexport const MenuOfferWrapper = memo(Wrapper);\n","import React, { memo } from \"react\";\nimport { MenuOfferCommon } from \"../commercial-menu-offer-common\";\nimport { CommercialService } from \"../../../services/commercial-service\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { Menu } from \"../../../types\";\nimport { GolTooltip } from \"../../tooltip/tooltip\";\ninterface IMenuItem {\n menu: Menu;\n rightFooter?: JSX.Element;\n unavailable?: boolean;\n canInteract?: boolean;\n unavailableReasonKey?: string;\n}\n\nconst Legend = styled.div`\n width: 100%;\n text-align: right;\n font-size: 12px;\n color: ${(props) => props.theme.disabledColor};\n margin-top: 2px;\n margin-bottom: -6px;\n`;\n\nconst CommercialMenuActions = styled.div`\n display: flex;\n justify-content: space-between;\n flex-wrap: wrap;\n margin-top: 10px;\n .MuiCheckbox-root {\n padding: 0px 2px;\n }\n`;\n\nconst MenuItem = (props: IMenuItem) => {\n const { t, i18n } = useTranslation();\n const unavailableReasonKey = props.unavailableReasonKey ?? \"instabook.menus.errors.unavailable\";\n const commercialService = new CommercialService(props.menu, i18n.language);\n return (\n <MenuOfferCommon\n disabled={!(props.canInteract ?? true)}\n commercialService={commercialService}\n >\n <CommercialMenuActions>\n <GolTooltip\n title={commercialService.name}\n text={commercialService.description}\n />\n {props.rightFooter}\n {props.unavailable && (\n <Legend>{t(`${unavailableReasonKey}`)}</Legend>\n )}\n </CommercialMenuActions>\n </MenuOfferCommon>\n );\n};\n\nexport const CommercialMenu = memo(MenuItem);\n","import React, { memo, useEffect, useState } from \"react\";\nimport {\n CommericalAction,\n ICommercialsMenuItemProps,\n IDisabled,\n Menu,\n} from \"../../../types\";\nimport styled from \"styled-components\";\nimport { selectionStore } from \"../../../stores/selection.store\";\n\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { useCommercialMenusContext } from \"../../../contexts/commercial-context\";\nimport { CommercialMenu } from \"./commercial-menu\";\n\nconst CommercialMenuCounter = styled.div`\n color: ${(props) => props.theme.textColor};\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.25);\n border-radius: 10px;\n font-size: 14px;\n font-weight: bold;\n line-height: 1;\n height: 24px;\n flex: auto 0 0;\n user-select: none;\n\n .hidden {\n display: none;\n }\n\n * {\n padding: 0 5px;\n }\n`;\n\nexport const ChangedMenuCount = styled.div<IDisabled>`\n cursor: ${(props) => (props.disabled ? \"default\" : \"pointer\")};\n opacity: ${(props) => (props.disabled ? 0.4 : 1)};\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"inherit\")};\n`;\n\nconst Item = (props: ICommercialsMenuItemProps) => {\n const minimumDishes = 0;\n const [menusNumber, setMenusNumber] = useState(\n pendingBookingStore.selectedMenus.find(\n (menuItem) => menuItem.commercial_id === props.menu.id.toString()\n )?.quantity || 0\n );\n const [canLowerMenuCount, setCanLowerMenuCount] = useState(menusNumber > 0);\n const [canRaiseMenuCount, setCanRaiseMenuCount] = useState(true);\n const { menusAvailabilities, performAction } = useCommercialMenusContext();\n const [action, setAction] = useState<CommericalAction | null>(null);\n\n const setStepperButtons = (availableMenus: Array<Menu>, menuId: number) => {\n setCanLowerMenuCount(menusNumber > 0);\n setCanRaiseMenuCount(\n pendingBookingStore.statisfySameMenusPaxCounterMandatoryForRaiseBtn &&\n availableMenus?.filter((menuItem) => menuItem.id === menuId).length > 0 ||\n false\n );\n };\n\n useEffect(() => {\n setAction(null);\n setStepperButtons(\n pendingBookingStore.pendingBooking.available_menus,\n props.menu.id\n );\n }, [pendingBookingStore.pendingBooking.available_menus, selectionStore.menusCount]);\n\n useEffect(() => {\n if (action) {\n performAction(action, { [props.menu.id]: menusNumber });\n }\n }, [action]);\n\n const lowerMenusNumber = () => {\n if (menusNumber > minimumDishes) {\n const newMenuCount = menusNumber - 1;\n props.setChildLoading(true);\n\n setAction(newMenuCount === 0 ? CommericalAction.remove : CommericalAction.add);\n setMenusNumber(newMenuCount);\n selectionStore.updateSelectedMenus(props.menu.id, newMenuCount);\n }\n };\n const raiseMenusNumber = () => {\n const newMenuCount = menusNumber + 1;\n props.setChildLoading(true);\n setAction(CommericalAction.add);\n setMenusNumber(newMenuCount);\n selectionStore.updateSelectedMenus(props.menu.id, newMenuCount);\n };\n return (\n <CommercialMenu\n data-test={`commercial-menu-${props.menu.id}`}\n unavailable={!canRaiseMenuCount}\n unavailableReasonKey={pendingBookingStore.sameNumberMenu ? \"instabook.menus.quantity_menu_match_pax_reached\" : undefined}\n canInteract={menusAvailabilities[props.menu.id]}\n menu={props.menu}\n rightFooter={\n <CommercialMenuCounter data-test=\"menu-stepper\">\n <ChangedMenuCount\n disabled={!canLowerMenuCount}\n onClick={lowerMenusNumber}\n data-test={`menus-lower-${props.menu.id}`}\n >\n -\n </ChangedMenuCount>\n <div data-test={`menus-number-${props.menu.id}`}>{menusNumber}</div>\n <ChangedMenuCount\n disabled={!canRaiseMenuCount}\n onClick={raiseMenusNumber}\n data-test={`menus-raise-${props.menu.id}`}\n >\n +\n </ChangedMenuCount>\n </CommercialMenuCounter>\n }\n />\n );\n};\n\nexport const CommercialsMenuItem = memo(Item);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { ICommercialsMenuItemProps, CommericalAction } from \"../../../types\";\nimport { useCommercialMenusContext } from \"../../../contexts/commercial-context\";\nimport { CommercialMenu } from \"./commercial-menu\";\nimport { Checkbox } from \"@mui/material\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\n\nconst RightFooterWrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst CheckboxLabel = styled.div`\n width: 100%;\n text-align: right;\n color: ${(props) => props.theme.textColor};\n font-size: 11px;\n line-height: 12px;\n padding-right: 4px;\n`;\n\nconst ForAllGuestsMenuItem = (props: ICommercialsMenuItemProps) => {\n const { t } = useTranslation();\n const [action, setAction] = useState<CommericalAction | null>(null);\n const { menusAvailabilities, performAction, selectedMenusIds } =\n useCommercialMenusContext();\n\n const onCheck = (ev: any, checked: boolean) => {\n props.setChildLoading(true);\n setAction(checked ? CommericalAction.add : CommericalAction.remove);\n };\n const [isSelected, setIsSelected] = useState<boolean>(false);\n useEffect(() => {\n setIsSelected(selectedMenusIds.includes(props.menu.id));\n }, [selectedMenusIds]);\n\n useEffect(() => {\n if (action) {\n performAction(action, { [props.menu.id]: undefined });\n }\n }, [action]);\n const canIteract = menusAvailabilities[props.menu.id];\n return (\n <CommercialMenu\n menu={props.menu}\n canInteract={canIteract}\n rightFooter={\n <RightFooterWrapper>\n <CheckboxLabel>{t(\"instabook.menus.for_all_guests\")}</CheckboxLabel>\n <Checkbox\n disabled={!canIteract}\n data-test={`menu-check-${props.menu.id}`}\n checked={isSelected}\n onChange={onCheck}\n size=\"small\"\n />\n </RightFooterWrapper>\n }\n />\n );\n};\n\nexport const CommercialsForAllGuestsMenuItem = memo(ForAllGuestsMenuItem);\n","import React, { memo, useEffect, useRef, useState } from \"react\";\n\nimport CommercialsService from \"../../services/commercials.service\";\nimport { IProps, Title } from \"../title/title\";\nimport { CommercialsMenuItem } from \"./menu/commercials-menu-item\";\nimport { CommercialsForAllGuestsMenuItem } from \"./menu/commercials-for-all-guests-menu-item\";\nimport { SectionWrapper, } from \"./menu-offer-wrapper\";\nimport { CommericalAction, Menu, PendingBooking } from \"../../types\";\nimport { CommercialMenusCtx, useCommercialMenuItemContext } from \"../../contexts/commercial-context\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport { Observable, Subscription } from \"rxjs\";\nimport { addMenuToPendingBooking, removeMenuFromPendingBooking, } from \"../../requests/pending-booking.requests\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport styled from \"styled-components\";\nconst MenusBloc = styled(SectionWrapper)`\n display: inline-block;\n flex-wrap: wrap;\n`;\n\nconst MenusSubBloc = styled.div`\n display: flex;\n flex-wrap: wrap;\n\n@media screen and (max-width: 480px) {\n width: 100%;\n flex-direction: column;\n align-items: center;\n }\n`;\n\n\ninterface ICommercialMenusProps {\n title: IProps;\n setChildLoading: (state: boolean) => void,\n}\nconst MenusCom = (props: ICommercialMenusProps) => {\n const commercialsService = CommercialsService;\n const [menusAvailabilities, setMenusAvailabilities] = useState<{ [key: number]: boolean }>({});\n const [action, setAction] = useState<CommericalAction | null>(null);\n const actionDetails = useRef<{ [menuId: number]: number | undefined } | undefined>(undefined);\n const { updateStatisfyMenusMandatory, } = useCommercialMenuItemContext();\n const [selectedMenusIds, setSelectedMenusIds] = useState(pendingBookingStore.selectedMenusIds)\n const throwError = useErrorHandler();\n useEffect(() => {\n setMenusAvailabilities(pendingBookingStore.menusAvailabilities);\n }, [])\n\n useEffect(() => {\n let subscription: Subscription | undefined = undefined;\n let observable: Observable<any> | undefined = undefined;\n if (action) {\n if (actionDetails.current !== undefined) {\n let actionDetailsValue: { [menuId: number]: number | undefined } = actionDetails.current!;\n let menuId: number = Number(Object.keys(actionDetailsValue)[0])\n let quantity: number | undefined = actionDetailsValue[menuId]\n switch (action) {\n case \"add\":\n observable = addMenuToPendingBooking(\n menuId,\n quantity\n )\n break;\n case \"remove\":\n observable = removeMenuFromPendingBooking(menuId);\n break;\n }\n if (observable) {\n subscription = observable.subscribe(\n (resp: PendingBooking) => {\n pendingBookingStore.pendingBooking = resp;\n updateStatisfyMenusMandatory(\n pendingBookingStore.statisfyMenusMandatory\n );\n setAction(null)\n resetMenusAvailabilities();\n setSelectedMenusIds(pendingBookingStore.selectedMenusIds);\n props.setChildLoading(false);\n },\n\n throwError,\n () => {\n updateStatisfyMenusMandatory(\n pendingBookingStore.statisfyMenusMandatory\n );\n props.setChildLoading(false);\n }\n );\n }\n\n }\n\n }\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [action])\n\n const performAction = (action: CommericalAction, details: { [menuId: number]: number | undefined }) => {\n actionDetails.current = details;\n setAction(action);\n }\n const resetMenusAvailabilities = () => {\n setMenusAvailabilities(pendingBookingStore.menusAvailabilities)\n }\n const individualMenus = commercialsService.individualMenus.map((menu: Menu) => {\n return (\n <CommercialsMenuItem\n key={menu.id}\n menu={menu}\n setChildLoading={props.setChildLoading}\n />\n );\n });\n\n const forAllGuestsMenus =\n commercialsService.forAllGuestsMenus.map((menu: Menu) => {\n return (\n <CommercialsForAllGuestsMenuItem\n key={menu.id}\n menu={menu}\n setChildLoading={props.setChildLoading}\n />\n );\n });\n return (\n <CommercialMenusCtx.Provider\n value={{\n resetMenusAvailabilities,\n performAction,\n selectedMenusIds,\n menusAvailabilities\n }}\n >\n <div data-test=\"commercials-menus\">\n <Title {...props.title} />\n <MenusBloc>\n <MenusSubBloc>\n {individualMenus}\n </MenusSubBloc>\n <MenusSubBloc>\n {forAllGuestsMenus}\n </MenusSubBloc>\n\n </MenusBloc>\n\n </div>\n </CommercialMenusCtx.Provider>\n );\n};\n\nexport const CommercialMenus = memo(MenusCom);","import React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Commercial } from \"../../../types\";\nimport { getTagManagerService } from \"../../../services/tag-manager.service\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { CommercialsEventItem } from \"../event/commercials-event-item\";\nimport { CommercialsOfferItem } from \"../offer/commercials-offer-item\";\nimport { Title } from \"../../title/title\";\nimport { MenuOfferWrapper } from \"../menu-offer-wrapper\";\nimport CommercialsService from \"../../../services/commercials.service\";\nimport ReactPixel from \"react-facebook-pixel\";\nimport { ErrorMessage } from \"../../errors/message-error-view\";\nimport { ErrorType } from \"../../../services/api-errors/error-types\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { CommercialMenus } from \"../commercial-menus\";\ninterface IDisplay {\n setChildLoading: (state: boolean) => void;\n}\n\nconst Display = (props: IDisplay) => {\n const { t } = useTranslation();\n const commercialsService = CommercialsService;\n const { hasEvents, hasMenus, hasOffers } =\n commercialsService.availableCommercials();\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const setErrorMessageFromChild = (message: string) => setErrorMsg(message);\n const menuSelectionRequested = pendingBookingStore.menuSelectionRequested;\n\n const events = hasEvents\n ? commercialsService.events.map((ev: Commercial) => {\n return <CommercialsEventItem key={ev.id} commercial={ev} />;\n })\n : [];\n\n const offers = hasOffers\n ? commercialsService.offers.map((offer: Commercial) => {\n const selectedOffer = { ...offer, isSelected: false };\n return (\n <CommercialsOfferItem\n key={selectedOffer.id}\n offer={selectedOffer}\n setChildLoading={props.setChildLoading}\n setErrorMessage={setErrorMessageFromChild}\n />\n );\n })\n : [];\n\n useEffect(() => {\n const restaurantId = moduleSettings.getRestaurantId();\n getTagManagerService(restaurantId).pushTags(\"commercials\");\n ReactPixel.pageView();\n }, []);\n\n const titleProps = menuSelectionRequested\n ? {\n mandatory: menuSelectionRequested,\n extraText: t(\"instabook.menus.selection_requested\"),\n text: t(\"instabook.menus.title\"),\n type: \"tab\",\n }\n : {\n text: t(\"instabook.menus.title\"),\n mandatory: menuSelectionRequested,\n type: \"tab\",\n };\n\n const restaurantId = moduleSettings.getRestaurantId();\n getTagManagerService(restaurantId).pushTags(\"commercials\");\n return (\n <div data-test=\"commercials-display\">\n {errorMsg && <ErrorMessage error={errorMsg} status={ErrorType.error} />}\n {hasEvents && (\n <div data-test=\"commercials-events\">\n <Title text={t(\"instabook.events.title\")} />\n {events}\n </div>\n )}\n {hasMenus && (\n <CommercialMenus\n title={titleProps}\n setChildLoading={props.setChildLoading}\n />\n )}\n {hasOffers && (\n <div data-test=\"commercials-offers\">\n <Title text={t(\"instabook.offers.title\")} />\n <MenuOfferWrapper>{offers}</MenuOfferWrapper>\n </div>\n )}\n </div>\n );\n};\nexport const CommercialsDisplay = memo(Display);\n","import React, { memo, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { Redirect, useLocation } from \"react-router-dom\";\nimport { Loader } from \"../loader/loader\";\nimport { pendingBookingStore } from \"../../stores/pending-booking.store\";\nimport { DetailsVouchers } from \"../details/details-vouchers/details-vouchers\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\nimport { config } from \"../../config\";\nimport { CommercialsDisplay } from \"./commercials-display/commercials-display\";\nimport CommercialsService from \"../../services/commercials.service\";\nimport {\n AcceptedPositions,\n ContinueButton,\n} from \"../continue-button/continue-button\";\nimport { SummaryCriteria } from \"../summary-criteria/summary-criteria\";\nimport {\n DetailsVoucherCtx,\n CommercialMenuItemCtx,\n} from \"../../contexts/commercial-context\";\nimport { ErrorMessage } from \"../errors/message-error-view\";\n\nconst CommercialsWrapper = styled.div`\n position: relative;\n`;\n\nconst CommericalContentWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst Router = () => {\n const commercialsService = CommercialsService;\n const hasCommercials = commercialsService.hasCommercials();\n const [error, setError] = useState<any>(useLocation().state);\n const [isLoading, setIsLoading] = useState(true);\n const [isDisabled, setIsDisabled] = useState(false);\n const isVoucherEnabled = pendingBookingStore.getIsVoucherEnabled();\n const [redirect] = useState(!hasCommercials && !isVoucherEnabled);\n const [validVoucherCode, setValidVoucherCode] = useState(false);\n const [statisfyMenusMandatory, setStatisfyMenusMandatory] = useState(\n pendingBookingStore.menuSelectionRequested\n ? pendingBookingStore.selectedMenus.length > 0\n : true\n );\n const [disabledBtnReqFromVoucher, setDisabledBtnReqFromVoucher] =\n useState(false);\n\n useEffect(() => {\n setIsLoading(false);\n }, [commercialsService]);\n\n useEffect(() => {\n setIsDisabled(disabledBtnReqFromVoucher || !statisfyMenusMandatory);\n }, [statisfyMenusMandatory, disabledBtnReqFromVoucher]);\n\n const setChildLoading = (state: boolean) => {\n setIsLoading(state);\n setError(\"\");\n };\n\n let buttonText = \"button.skip\";\n\n if (\n commercialsService.hasEvents() ||\n pendingBookingStore.menuSelectionRequested ||\n pendingBookingStore.selectedMenus.length > 0 ||\n pendingBookingStore.selectedOffer ||\n validVoucherCode\n ) {\n buttonText = \"button.continue\";\n }\n\n const content = (\n <CommericalContentWrapper>\n {error && error[\"errorDetails\"] && (\n <ErrorMessage\n error={error[\"error\"]}\n status={\"Error\"}\n data-test=\"error-message\"\n />\n )}\n <SummaryCriteria />\n <DetailsVoucherCtx.Provider\n value={{\n updateDisabledBtnFromVoucher: (disabled) =>\n setDisabledBtnReqFromVoucher(disabled),\n updateValidVoucherCode: (loading) => setValidVoucherCode(loading),\n }}\n >\n {isVoucherEnabled && <DetailsVouchers />}\n </DetailsVoucherCtx.Provider>\n <CommercialMenuItemCtx.Provider\n value={{\n updateStatisfyMenusMandatory: (satisfied) =>\n setStatisfyMenusMandatory(satisfied),\n }}\n >\n {hasCommercials && (\n <CommercialsDisplay setChildLoading={setChildLoading} />\n )}\n </CommercialMenuItemCtx.Provider>\n <ContinueButton\n position={AcceptedPositions.center}\n route={buildRouteWithParams(config.routes.confirmation)}\n buttonTextKey={buttonText}\n disabled={isDisabled}\n />\n {redirect && (\n <Redirect to={buildRouteWithParams(config.routes.confirmation)} />\n )}\n </CommericalContentWrapper>\n );\n\n return (\n <CommercialsWrapper>\n {content}\n {isLoading ? <Loader /> : \"\"}\n </CommercialsWrapper>\n );\n};\n\nexport const Commercials = memo(Router);\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { useLocation } from \"react-router-dom\";\n\nconst Message = () => {\n const { i18n } = useTranslation();\n const location = useLocation();\n\n const generalInfoMessage = moduleSettings.headerMessage(\n i18n.language,\n location.pathname\n );\n return (\n <div>\n {generalInfoMessage ? (\n <InformationText text={generalInfoMessage} collapsable={true} />\n ) : (\n \"\"\n )}\n </div>\n );\n};\nexport const GeneralMessage = memo(Message);\n","import * as React from \"react\";\n\nconst ChildrenGroup = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M12.8 9.2C12.8 10.9675 11.3675 12.4 9.6 12.4C7.8325 12.4 6.4 10.9675 6.4 9.2C6.4 7.4325 7.8325 6 9.6 6C11.3675 6 12.8 7.4325 12.8 9.2ZM4 18.0575C4 15.595 5.995 13.6 8.4575 13.6H10.7425C13.205 13.6 15.2 15.595 15.2 18.0575C15.2 18.4675 14.8675 18.8 14.4575 18.8H4.7425C4.3325 18.8 4 18.4675 4 18.0575ZM19.2325 18.8H15.785C15.92 18.565 16 18.2925 16 18V17.8C16 16.2825 15.3225 14.92 14.255 14.005C14.315 14.0025 14.3725 14 14.4325 14H15.9675C18.195 14 20 15.805 20 18.0325C20 18.4575 19.655 18.8 19.2325 18.8ZM14.8 12.4C14.025 12.4 13.325 12.085 12.8175 11.5775C13.31 10.9125 13.6 10.09 13.6 9.2C13.6 8.53 13.435 7.8975 13.1425 7.3425C13.6075 7.0025 14.18 6.8 14.8 6.8C16.3475 6.8 17.6 8.0525 17.6 9.6C17.6 11.1475 16.3475 12.4 14.8 12.4Z\" />\n <path d=\"M11.0987 11.5903L11.4902 11.1835C11.4902 11.1835 12.5174 11.5641 12.8331 12.1089C13.1965 12.736 13.145 13.7738 13.145 13.7738C13.145 13.7738 12.1835 13.5329 11.7303 13.0889C11.2715 12.6393 11.0987 11.5903 11.0987 11.5903Z\" />\n <path d=\"M7.95479 11.5903L7.56325 11.1835C7.56325 11.1835 6.53609 11.5641 6.2204 12.1089C5.85703 12.736 5.90844 13.7738 5.90844 13.7738C5.90844 13.7738 6.86995 13.5329 7.32316 13.0889C7.78199 12.6393 7.95479 11.5903 7.95479 11.5903Z\" />\n <path d=\"M15.3444 6.00001C14.0872 6.51764 14.1592 7.04425 14.1592 7.04425L15.5186 7.01685C15.5186 7.01685 14.1893 7.00787 15.3444 6.00001Z\" />\n </svg>\n);\n\nexport default ChildrenGroup;\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { ISlotIcons } from \"../../../types\";\nimport { RoundedIcon } from \"../../rounded-icon/rounded-icon\";\n\nconst SlotIconsGroup = styled.div`\n display: flex;\n position: absolute;\n height: 14px;\n top: -6px;\n right: 0;\n`;\n\nconst SlotIconsWrapper = (props: { icons: ISlotIcons }) => {\n return (\n <SlotIconsGroup>\n {props.icons.hasWaitingList ? (\n <RoundedIcon icon=\"waiting\" position=\"tag\" />\n ) : (\n \"\"\n )}\n {props.icons.hasOffer ? (\n <RoundedIcon icon=\"flash-on-icon\" position=\"tag\" />\n ) : (\n \"\"\n )}\n {props.icons.hasPrepayment ? (\n <RoundedIcon icon=\"payment-icon\" position=\"tag\" />\n ) : (\n \"\"\n )}\n </SlotIconsGroup>\n );\n};\nexport const SlotIcons = memo(SlotIconsWrapper);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { ISlot } from \"../../../types\";\nimport { SlotIcons } from \"../slot-icons/slot-icons\";\n\nconst SlotStyle = styled.div`\n position: relative;\n display: inline-block;\n text-align: center;\n color: ${(props) => props.theme.textColor};\n text-decoration: none;\n padding: 6px 0;\n margin: 6px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n border-radius: 5px;\n cursor: pointer;\n height: 30px;\n width: 60px;\n\n &:hover,\n &.isSelected {\n background-color: ${(props) => props.theme.primaryColor};\n color: ${(props) => props.theme.invertFontColor};\n }\n`;\n\nconst Slot = (props: ISlot) => {\n const handleClick = (event: any) => {\n props.onClick(props.value);\n };\n\n return (\n <SlotStyle\n onClick={handleClick}\n className={props.isSelected ? \"slot-item isSelected\" : \"slot-item\"}\n >\n {props.icons ? <SlotIcons icons={props.icons} /> : \"\"}\n <span>{props.value}</span>\n </SlotStyle>\n );\n};\nexport const SlotItem = memo(Slot);\n","import { GolReducer } from \"../types\";\n\nexport default class GolEventHandler {\n private _componentName: string;\n private _reducers: Array<GolReducer>;\n\n constructor(\n component: string,\n observeProps: Array<string>,\n reducer: () => void\n ) {\n this._componentName = component;\n this._reducers = [\n {\n observeProps: observeProps,\n reducer: reducer,\n },\n ];\n }\n\n addReducer(observeProps: Array<string>, reducer: () => void) {\n this._reducers.push({ observeProps: observeProps, reducer: reducer });\n }\n\n set reducers(newReducers: Array<GolReducer>) {\n this._reducers = newReducers;\n }\n\n get reducers(): Array<GolReducer> {\n return this._reducers;\n }\n\n get componentName(): string {\n return this._componentName;\n }\n\n public dispatch = (observeProp: string) => {\n return this.reducersForObserver(observeProp).forEach((golReducer) => {\n golReducer.reducer();\n });\n };\n\n public reducersForObserver(observeProp: string): Array<GolReducer> {\n return this.reducers.filter((reducer) =>\n reducer.observeProps.includes(observeProp)\n );\n }\n}\n","import GolEventHandler from \"./gol-event-handler\";\nclass SelectionStoreChangesService {\n public subscribers: Array<GolEventHandler> = [];\n static service: SelectionStoreChangesService | undefined;\n static get(): SelectionStoreChangesService {\n if (!this.service) {\n this.service = new SelectionStoreChangesService();\n }\n return this.service;\n }\n public registerListener = (\n componentName: string,\n observableStoreProps: Array<string>,\n useCallbackOnChanged: () => void\n ) => {\n this.subscribers.push(\n new GolEventHandler(\n componentName,\n observableStoreProps,\n useCallbackOnChanged\n )\n );\n };\n\n public unregisterListener = (component: string) => {\n this.subscribers = this.subscribers.filter(\n (subscriber) => subscriber.componentName !== component\n );\n };\n\n public dispatch = (observeProps: string) => {\n this.subscribers.forEach((subscriber) => subscriber.dispatch(observeProps));\n };\n}\n\nexport const selectionStoreChangesService = SelectionStoreChangesService.get();\n","import { DailyLightInfoResponse, DayStatus, EngineMode } from \"../types\";\nimport { Moment } from \"moment\";\nimport { selectionStore } from \"../stores/selection.store\";\n\nclass CalendarService {\n private static service: CalendarService | undefined;\n private _dailyAvailabilities: { [key: string]: DayStatus } | undefined;\n private _dailyEngine: { [key: string]: EngineMode } | undefined;\n readonly DATE_NOW: Date = (() => {\n let date = new Date();\n date.setHours(0, 0, 0, 0);\n return date;\n })();\n\n readonly FORMAT: string = \"YYYY-MM-DD\";\n\n static get(): CalendarService {\n if (!this.service) {\n this.service = new CalendarService();\n }\n return this.service!;\n }\n\n set dailyAvailabilities(\n dailyAvailabilitiesData: { [key: string]: DayStatus } | undefined\n ) {\n this._dailyAvailabilities = dailyAvailabilitiesData;\n }\n\n get dailyAvailabilities() {\n return this._dailyAvailabilities;\n }\n\n set dailyEngine(dailyEngineData: { [key: string]: EngineMode } | undefined) {\n this._dailyEngine = dailyEngineData;\n }\n\n get dailyEngine() {\n return this._dailyEngine;\n }\n\n setupServiceData(dailyLightInfoResponseData: DailyLightInfoResponse) {\n this.computeDailyAvailabilities(dailyLightInfoResponseData);\n this.computeDailyEngine(dailyLightInfoResponseData);\n this.controlSelectedDate();\n }\n\n getEngineMode(date: Moment): EngineMode {\n return this.dailyEngine\n ? this.dailyEngine[this.formattedDate(date)]\n : EngineMode.capacity;\n }\n\n isDayInThePast(day: Moment): boolean {\n return day.diff(this.DATE_NOW) < 0;\n }\n\n isDayBlocked(day: Moment): boolean {\n if (this.isDayInThePast(day)) return true;\n const status = this.getStatus(day);\n if (status === null) return true;\n return [DayStatus.full, DayStatus.closed].includes(status);\n }\n\n getStatus(date: Moment): DayStatus | null {\n return this.dailyAvailabilities\n ? this.dailyAvailabilities![this.formattedDate(date)]\n : null;\n }\n\n private formattedDate(date: Moment): string {\n return date.format(this.FORMAT);\n }\n\n private computeDailyAvailabilities(\n dailyLightInfoResponseData: DailyLightInfoResponse\n ) {\n this.dailyAvailabilities = Object.assign(\n {},\n ...dailyLightInfoResponseData.daily_availabilities.map((daily_avail) => ({\n [daily_avail.date]: daily_avail.status,\n }))\n );\n }\n\n private computeDailyEngine(\n dailyLightInfoResponseData: DailyLightInfoResponse\n ) {\n this.dailyEngine = Object.assign(\n {},\n ...dailyLightInfoResponseData.daily_availabilities.map((daily_avail) => ({\n [daily_avail.date]: daily_avail.engine_mode,\n }))\n );\n }\n\n private controlSelectedDate() {\n if (!selectionStore.date) return;\n let selectedDate = selectionStore.date;\n let status = this.getStatus(selectedDate);\n if (status === null || status === \"unavailable\")\n return selectionStore.resetDate();\n }\n}\n\nexport default CalendarService.get();\n","import styled from \"styled-components\";\nimport { DayStatus } from \"../../../types\";\nimport { RoundedIcon } from \"../../rounded-icon/rounded-icon\";\nimport React from \"react\";\nimport calendarService from \"../../../services/calendar-service\";\nimport {\n setBackgroundColorIcon,\n setTextColorIcon,\n} from \"../../../helpers/set-color\";\n\ninterface DayProps {\n status: string;\n isSelected: boolean;\n day: moment.Moment;\n lastBookingDate: moment.Moment;\n}\n\ninterface IStyle {\n today: boolean;\n}\n\nconst CustomDay = styled.div<IStyle>`\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: ${(props) => props.theme.primaryColor}30;\n text-decoration: ${(props) => (props.today ? \"underline\" : \"none\")};\n text-decoration-color: ${(props) => props.theme.primaryColor};\n border-radius: 50%;\n &:hover,\n &.isSelected {\n color: ${(props) => props.theme.invertFontColor};\n background-color: ${(props) => props.theme.primaryColor};\n text-decoration-color: ${(props) => props.theme.invertFontColor};\n }\n`;\n\nconst DayOutOfDate = styled(CustomDay)`\n opacity: 0.4;\n background-color: transparent;\n pointer-events: none;\n &,\n &:hover {\n color: ${(props) => props.theme.legendBorderGray};\n }\n`;\n\nconst DayFullStyle = styled(DayOutOfDate)<IStyle>`\n border: 1px dashed ${(props) => props.theme.legendBorderGray};\n`;\n\nconst DayClosedStyle = styled(DayOutOfDate)<IStyle>`\n border: 1px solid ${(props) => props.theme.legendBorderGray};\n`;\n\nconst DayUnavailable = styled(CustomDay)`\n background-color: ${(props) => props.theme.primaryColor}10;\n`;\n\nconst Day = ({ status, isSelected, day, lastBookingDate }: DayProps) => {\n const today = calendarService.DATE_NOW;\n const isToday = day.isSame(today, \"day\");\n const isInThePast = day.diff(today) < 0;\n\n if (isInThePast) {\n return <DayOutOfDate today={false}>{day.format(\"D\")}</DayOutOfDate>;\n } else {\n switch (status) {\n case DayStatus.waiting:\n return (\n <CustomDay\n data-test=\"day-available\"\n today={isToday}\n className={isSelected ? \"isSelected\" : \"\"}\n >\n {day.format(\"D\")}\n <RoundedIcon icon=\"waiting\" position=\"right\" />\n </CustomDay>\n );\n\n case DayStatus.full:\n return <DayFullStyle today={isToday}>{day.format(\"D\")}</DayFullStyle>;\n\n case DayStatus.closed:\n return (\n <DayClosedStyle today={isToday}>{day.format(\"D\")}</DayClosedStyle>\n );\n\n case DayStatus.available:\n return (\n <CustomDay\n today={isToday}\n className={isSelected ? \"isSelected\" : \"\"}\n data-test=\"day-available\"\n >\n {day.format(\"D\")}\n </CustomDay>\n );\n\n default:\n return (\n <DayUnavailable today={isToday} data-test=\"day-unavailable\">\n {day.format(\"D\")}\n </DayUnavailable>\n );\n }\n }\n};\nexport default Day;\n","import React, { memo, ReactNode, useEffect, useState } from \"react\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { Moment } from \"moment\";\n\nimport { DayPickerSingleDateController } from \"react-dates\";\nimport { capitalize } from \"../../../utils\";\nimport { useTranslation } from \"react-i18next\";\nimport ArrowBackIosIcon from \"@material-ui/icons/ArrowBackIos\";\nimport ArrowForwardIosIcon from \"@material-ui/icons/ArrowForwardIos\";\nimport styled from \"styled-components\";\nimport moment from \"moment\";\nimport Day from \"../day/day\";\nimport { DayStatus } from \"../../../types\";\nimport \"react-dates/initialize\";\n\nimport \"react-dates/initialize\";\nimport calendarService from \"../../../services/calendar-service\";\nimport { getLanguageSwitcherService } from \"../../../services/language-switcher.service\";\n\ninterface GolDayPickerSingleDateProps {\n onDateChange: (momentDate: any) => void;\n calendarDate: Moment;\n numberOfMonths: number;\n onPrevMonth: () => void;\n onNextMonth: () => void;\n hasPrevMonth: boolean;\n hasNextMonth: boolean;\n lastBookingDate: Moment;\n selectedDate: Moment;\n}\n\nconst ArrowLeft = styled(ArrowBackIosIcon)`\n position: absolute;\n top: 22px;\n left: 10px;\n`;\n\nconst ArrowRight = styled(ArrowForwardIosIcon)`\n position: absolute;\n top: 22px;\n right: 10px;\n`;\n\nconst GolDayPickerSingleDateController = (\n props: GolDayPickerSingleDateProps\n) => {\n const { t, i18n } = useTranslation();\n const [localeForMoment, setLocaleForMoment] = useState(null);\n useEffect(() => {\n setLocaleForMoment(getLanguageSwitcherService().localeForMoment());\n }, [i18n.language]);\n\n const renderMonthElement = ({ month }: { month: Moment }) => {\n return capitalize(\n moment(month).locale(localeForMoment).format(\"MMMM YYYY\")\n );\n };\n\n const getIsDayBlocked = (day: Moment): boolean => {\n return calendarService.isDayBlocked(day);\n };\n\n const renderDayContents = (currentDate: Moment): ReactNode => {\n return (\n <Day\n day={currentDate}\n status={calendarService.getStatus(currentDate) || DayStatus.unavailable}\n isSelected={\n props.selectedDate && currentDate.isSame(props.selectedDate, \"day\")\n }\n lastBookingDate={props.lastBookingDate}\n />\n );\n };\n\n return (\n <DayPickerSingleDateController\n onDateChange={props.onDateChange}\n focused={true}\n onFocusChange={(focused) => focused}\n date={props.calendarDate}\n numberOfMonths={props.numberOfMonths}\n navNext={<ArrowRight data-test=\"next-month-arrow\" />}\n navPrev={<ArrowLeft data-test=\"prev-month-arrow\" />}\n firstDayOfWeek={1}\n initialVisibleMonth={() => selectionStore.calendarDate}\n renderDayContents={renderDayContents}\n isDayBlocked={getIsDayBlocked}\n renderMonthElement={renderMonthElement}\n renderWeekHeaderElement={(day) => capitalize(t(day.toLowerCase()))}\n onPrevMonthClick={props.onPrevMonth}\n onNextMonthClick={props.onNextMonth}\n noNavPrevButton={!props.hasPrevMonth}\n noNavNextButton={!props.hasNextMonth}\n hideKeyboardShortcutsPanel\n daySize={36}\n />\n );\n};\n\nexport default memo(GolDayPickerSingleDateController);\n","import React, { memo, useEffect, useRef, useState } from \"react\";\nimport moment from \"moment\";\nimport { EngineMode } from \"../../../types\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport calendarService from \"../../../services/calendar-service\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../calendar\";\nimport GolDayPickerSingleDateController from \"./gol-day-picker-single-date-controller\";\n\nconst GolCalendar = () => {\n const lastBookingDate =\n moduleSettings.last_booking_date === \"-1\" ||\n moduleSettings.last_booking_date === null\n ? moment().add(2, \"years\")\n : moment(moduleSettings.last_booking_date);\n const [numberOfMonthToAdd, setNumberOfMonthToAdd] = useState(0);\n const [, setSelectedDate] = useState(selectionStore.date);\n const selectedEngineMode = useRef<EngineMode>(EngineMode.capacity);\n\n useEffect(() => {\n if (0 === numberOfMonthToAdd) return;\n selectionStore.updateCalendateDate(numberOfMonthToAdd);\n selectionStoreChangesService.dispatch(GolEventListener.CalendarMonth);\n return () => {};\n }, [numberOfMonthToAdd]);\n\n const onNextMonth = () => {\n setNumberOfMonthToAdd(1);\n };\n\n const onPrevMonth = () => {\n setNumberOfMonthToAdd(-1);\n };\n\n const onDateChange = (momentDate: any) => {\n selectionStore.updateDate(momentDate);\n setSelectedDate(selectionStore.date);\n selectionStoreChangesService.dispatch(GolEventListener.CalendarDate);\n selectedEngineMode.current = calendarService.getEngineMode(momentDate);\n // selectionStore.resetSelectedArea(selectedEngineMode.current);\n };\n\n const hasPrevMonth = (): boolean => {\n return (\n selectionStore.calendarDate.clone().diff(calendarService.DATE_NOW) > 0\n );\n };\n\n const hasNextMonth = (): boolean => {\n return (\n selectionStore.calendarDate\n .clone()\n .endOf(\"month\")\n .diff(lastBookingDate) <= 0\n );\n };\n\n return (\n <div data-test=\"gol-day-picker-single-date-controller\">\n <GolDayPickerSingleDateController\n onDateChange={onDateChange}\n hasNextMonth={hasNextMonth()}\n hasPrevMonth={hasPrevMonth()}\n numberOfMonths={1}\n onNextMonth={onNextMonth}\n onPrevMonth={onPrevMonth}\n selectedDate={selectionStore.date!}\n lastBookingDate={lastBookingDate}\n calendarDate={selectionStore.calendarDate}\n />\n </div>\n );\n};\n\nexport default memo(GolCalendar);\n","import { Endpoint } from \"./BaseEndpoint\";\nimport { config } from \"../config\";\nimport { QueryParam } from \"../types\";\nimport { requestParamsImpl } from \"../services/request-params.service\";\n\nconst apiBase = config.baseApiUrl;\nexport class WithRestaurantIdEndpoint extends Endpoint {\n constructor(\n endPoint: string,\n base: string = apiBase,\n queryParams?: Array<QueryParam>\n ) {\n super(endPoint, base, queryParams);\n }\n\n public addQueryParams(queryParams: Array<QueryParam>) {\n const requestParamsService = requestParamsImpl.requestParamsService();\n const { restaurantId } = requestParamsService.getParams();\n if (restaurantId) {\n let queryParamName = queryParams.map(\n (queryParams) => queryParams.queryParamName\n );\n if (!queryParamName.includes(\"restaurant_id\")) {\n queryParams.push({\n queryParamName: \"restaurant_id\",\n queryParamValue: restaurantId,\n });\n }\n }\n this.setQueryParams(queryParams);\n }\n}\n","import { WithRestaurantIdEndpoint } from \"./WithRestaurantIdEndpoint\";\n\nexport class DailyAvailabilitiesEndpoint extends WithRestaurantIdEndpoint {\n constructor() {\n super(\"daily_availabilities\");\n }\n}\n","import React, { memo, useEffect } from \"react\";\nimport { getDailyAvailabilities } from \"../../requests/daily_availabilities.requests\";\nimport { DailyLightInfoResponse } from \"../../types\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport calendarService from \"../../services/calendar-service\";\nimport styled from \"styled-components\";\nimport { Loader } from \"../loader/loader\";\nimport { selectionStoreChangesService } from \"../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"./calendar\";\n\nconst LoaderWrapper = styled.div`\n position: relative;\n min-width: 100px;\n min-height: 100px;\n`;\n\nconst DailyAvailabilitiesFetcher = () => {\n const throwError = useErrorHandler();\n useEffect(() => {\n const subscription = getDailyAvailabilities().subscribe(\n (dailyLightInfoResponseData: DailyLightInfoResponse) => {\n calendarService.setupServiceData(dailyLightInfoResponseData);\n selectionStoreChangesService.dispatch(GolEventListener.OnComplete);\n },\n throwError\n );\n\n return () => {\n subscription.unsubscribe();\n };\n }, [throwError]);\n\n return (\n <LoaderWrapper>\n <Loader />\n </LoaderWrapper>\n );\n};\n\nexport default memo(DailyAvailabilitiesFetcher);\n","import { getHttpService } from \"../services/http.service\";\nimport { DailyAvailabilitiesEndpoint } from \"../endpoints/DailyAvailabilitiesEndpoint\";\nimport { DailyLightInfoResponse } from \"../types\";\nimport { Observable } from \"rxjs\";\nimport { selectionStore } from \"../stores/selection.store\";\n\n//startDate in format \"yyyy-M-D\"\n//const httpService = getHttpService();\nexport const getDailyAvailabilities =\n (): Observable<DailyLightInfoResponse> => {\n const endpoint = new DailyAvailabilitiesEndpoint();\n const startDate = selectionStore.calendarDate.clone().startOf(\"month\").format(\"YYYY-MM-DD\");\n const persons = (selectionStore.guests + selectionStore.children).toString();\n const selectedPeriod = selectionStore.period;\n const selectedArea = selectionStore.area;\n\n const queryParams = [\n {\n queryParamName: \"start_date\",\n queryParamValue: startDate,\n },\n {\n queryParamName: \"persons\",\n queryParamValue: persons,\n },\n ];\n\n if (selectedPeriod && selectedPeriod !== \"all\") {\n queryParams.push({\n queryParamName: \"period\",\n queryParamValue: selectedPeriod,\n });\n }\n\n if (selectedArea && selectedArea !== \"all\") {\n queryParams.push({\n queryParamName: \"area_id\",\n queryParamValue: selectedArea,\n });\n }\n\n endpoint.addQueryParams(queryParams);\n return getHttpService().get(endpoint);\n };\n","import React, { memo, useEffect, useRef, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { selectionStoreChangesService } from \"../../services/selection-store-changes.service\";\nimport GolCalendar from \"../calendar/gol-calendar/gol-calendar\";\nimport { useLocation } from \"react-router-dom\";\nimport DailyAvailabilitiesFetcher from \"./daily-availabilities-fetcher\";\nimport { selectionStore } from \"../../stores/selection.store\";\n\ninterface IStyled {\n disabled?: boolean;\n}\n\nconst CalendarWrapper = styled.div<IStyled>`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n margin-top: 2px;\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n opacity: ${(props) => (props.disabled ? 0.8 : 1)};\n}\n`;\nexport enum GolEventListener {\n Guests = \"guests\",\n CalendarDate = \"calendar-date\",\n CalendarMonth = \"calendar-month\",\n Period = \"period\",\n Area = \"area\",\n OnComplete = \"onComplete\",\n Time = \"time\",\n}\n\ninterface CalendarProps {\n fetchData?: boolean;\n}\n\nconst Calendar = (props: CalendarProps) => {\n const [selectedGuests, setSelectedGuests] = useState(selectionStore.guests);\n const [fetchData, setFetchData] = useState(props.fetchData ?? true);\n const error = useRef<{ [key: string]: string } | null>(\n useLocation().state as { [key: string]: string } | null\n );\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"calendar\",\n [\n GolEventListener.CalendarMonth,\n GolEventListener.Period,\n GolEventListener.Area,\n GolEventListener.Guests,\n ],\n () => {\n error.current = null;\n setSelectedGuests(selectionStore.guests);\n if (selectionStore.guests > 0) {\n setFetchData(true);\n }\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"calendar\");\n };\n }, []);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"calendar-on-complete\",\n [GolEventListener.OnComplete],\n () => {\n setFetchData(false);\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"calendar-on-complete\");\n };\n }, []);\n\n const renderCalendar = () => {\n return (\n <CalendarWrapper\n data-test=\"calendar-wrapper\"\n disabled={selectedGuests === 0}\n >\n <GolCalendar data-test=\"gol-calendar\" />\n </CalendarWrapper>\n );\n };\n\n return (\n <CalendarWrapper\n data-test=\"calendar-layout\"\n disabled={selectedGuests === 0}\n >\n {fetchData ? (\n <DailyAvailabilitiesFetcher data-test=\"daily-availabilities-fetcher\" />\n ) : (\n renderCalendar()\n )}\n </CalendarWrapper>\n );\n};\nexport const CalendarLayout = memo(Calendar);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport UserGroup from \"../../../assets/images/user-group\";\nimport ChildrenGroup from \"../../../assets/images/children-group\";\nimport Add from \"@material-ui/icons/Add\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { getTagManagerService } from \"../../../services/tag-manager.service\";\nimport selectionStoreService from \"../../../services/selection-guests-service\";\nimport selectionGuestsService from \"../../../services/selection-guests-service\";\nimport { SlotItem } from \"../slot-item/slot-item\";\nimport { DropdownOption } from \"../../../types\";\nimport { InputWithIcon } from \"../../input-with-icon/input-with-icon\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../../calendar/calendar\";\nimport ReactPixel from \"react-facebook-pixel\";\nimport TextField from \"@material-ui/core/TextField\";\nimport { BackgroundCircleButton } from \"../../background-circle-button/background-circle-button\";\n\ninterface IStyle {\n isChildren: boolean;\n}\nexport interface ISelectionGuest {\n isFirstStep?: boolean;\n type: string;\n}\n\nconst SelectionGuestsWrapper = styled.div<IStyle>`\n margin: 0 6px 4px;\n margin-top: ${(props) => (props.isChildren ? \"6px\" : \"\")};\n`;\n\nconst GuestSlots = styled.div``;\n\nconst GuestInput = styled.div`\n display: flex;\n justify-content: start;\n align-items: center;\n width: 100%;\n padding: 6px;\n\n svg {\n cursor: pointer;\n }\n\n #guest-input {\n width: 36px;\n padding: 6px 12px;\n }\n\n input::-webkit-outer-spin-button,\n input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n\n svg {\n margin-left: 8px;\n }\n\n svg#check-icon {\n fill: ${(props) => props.theme.primaryColor} !important;\n }\n`;\n\nconst GuestSlotsWrapper = styled.div`\n width: 300px;\n background-color: ${(props) => props.theme.backgroundColor};\n padding: ${(props) => props.theme.globalPadding} 6px;\n margin-bottom: 4px;\n align-items: center;\n box-shadow: 0 2px 6px rgb(0 0 0 / 5%), 0 0 0 1px rgb(0 0 0 / 7%);\n border-radius: 4px;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-evenly;\n`;\n\nconst TextButton = styled.a`\n font-size: 12px;\n margin: 8px 0;\n cursor: pointer;\n`;\n\nconst Guests = (props: ISelectionGuest) => {\n const { t } = useTranslation();\n const isFirstStep =\n props.isFirstStep === undefined ? true : props.isFirstStep;\n const isChildren = props.type == \"children\";\n const [options] = useState(selectionStoreService.guestsDropdownOption());\n const [showInput, setShowInput] = useState(false);\n const [restaurantId] = useState(moduleSettings.getRestaurantId());\n const [isSlotsDisplayed, setIsSlotsDisplayed] = useState(false);\n const [inputGuests, setInputGuests] = useState(0);\n const [selectedGuests, setSelectedGuests] = useState(\n isChildren ? selectionStore.children : selectionStore.guests\n );\n\n getTagManagerService(restaurantId).pushTags(\"pax\", {\n first_step: isFirstStep,\n });\n ReactPixel.pageView();\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-guests\",\n [GolEventListener.Guests],\n () => {\n isChildren\n ? setSelectedGuests(selectionStore.children)\n : setSelectedGuests(selectionStore.guests);\n }\n );\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-guests\");\n };\n }, []);\n\n useEffect(() => {\n if (inputGuests > 0) {\n const debounceTimer = setTimeout(() => {\n storeSelectedGuests(inputGuests);\n }, 500);\n return () => clearTimeout(debounceTimer);\n }\n }, [inputGuests]);\n\n const storeSelectedGuests = (value: any): void => {\n setSelectedGuests(Number(value));\n if (isChildren) {\n selectionStore.children = Number(value);\n selectionGuestsService.setDefaultSelectedGuestWhenChildren();\n } else {\n selectionStore.guests = Number(value);\n }\n selectionStoreChangesService.dispatch(GolEventListener.Guests);\n };\n\n const selectedGuestsClicked = (): void => {\n setIsSlotsDisplayed(!isSlotsDisplayed);\n setShowInput(false);\n };\n\n const renderOption = (option: DropdownOption) => {\n return (\n <SlotItem\n key={option.value}\n value={option.value}\n isSelected={Number(option.value) === selectedGuests}\n onClick={handleClickSlot}\n />\n );\n };\n\n const handleClickSlot = (value: any): void => {\n storeSelectedGuests(value);\n setIsSlotsDisplayed(false);\n };\n\n const handleClick = () => {\n if (showInput && inputGuests > 0) {\n storeSelectedGuests(inputGuests);\n setIsSlotsDisplayed(false);\n } else {\n setInputGuests(0);\n storeSelectedGuests(0);\n }\n setShowInput((showInput) => !showInput);\n };\n\n const buttonShowHideInput = showInput ? (\n <BackgroundCircleButton\n onClick={handleClick}\n disabled={!(inputGuests > 0)}\n />\n ) : (\n <Add onClick={handleClick} data-test=\"button-show-input\" />\n );\n\n const handleResetChildren = () => {\n setSelectedGuests(0);\n selectionStore.children = 0;\n selectionStoreChangesService.dispatch(GolEventListener.Guests);\n setIsSlotsDisplayed(!isSlotsDisplayed);\n };\n\n const changeInputGuests = (e: any) => {\n setInputGuests(Number(e.target.value));\n };\n\n const handleKeyDown = (e: any) => {\n if (e.key === \"Enter\") {\n handleClick();\n }\n };\n\n const resetChildrenButton = (\n <TextButton onClick={handleResetChildren} data-test=\"reset-button\">\n {t(\"button.none\")}\n </TextButton>\n );\n\n return (\n <SelectionGuestsWrapper\n data-test={`selection-${props.type}`}\n isChildren={isChildren}\n >\n <InputWithIcon\n error={false}\n value={selectionGuestsService.setSelectedGuestsToString(\n selectedGuests,\n props.type\n )}\n placeholderKey={selectionGuestsService.setTypeOfGuestToPlaceholder(\n props.type\n )}\n helperText={\"\"}\n variant={\"outlined\"}\n onChange={storeSelectedGuests}\n onClick={selectedGuestsClicked}\n icon={isChildren ? <ChildrenGroup /> : <UserGroup />}\n />\n <>\n {isSlotsDisplayed && (\n <GuestSlotsWrapper data-test=\"guest-slots-wrapper\">\n {isChildren && selectedGuests > 0 && resetChildrenButton}\n <GuestSlots data-test=\"guest-slots\">\n {options\n .slice(0, 8)\n .map((option: DropdownOption) => renderOption(option))}\n </GuestSlots>\n <GuestInput>\n {showInput && (\n <TextField\n autoFocus\n type=\"number\"\n id=\"guest-input\"\n data-test=\"guest-input\"\n variant=\"outlined\"\n onChange={changeInputGuests}\n onKeyDown={handleKeyDown}\n />\n )}\n {buttonShowHideInput}\n </GuestInput>\n </GuestSlotsWrapper>\n )}\n </>\n </SelectionGuestsWrapper>\n );\n};\nexport const SelectionGuests = memo(Guests);\n","import React, { memo, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { SelectionGuests } from \"./selection-guests\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../../calendar/calendar\";\n\nconst SelectionPaxWrapper = styled.div``;\n\nconst Pax = () => {\n const [, setSelectedGuests] = useState(selectionStore.guests);\n const childrenManagementEnabled = moduleSettings.childrenManagementEnabled;\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"pax\",\n [GolEventListener.Guests],\n () => {\n setSelectedGuests(selectionStore.guests);\n }\n );\n return () => {\n selectionStoreChangesService.unregisterListener(\"pax\");\n };\n }, []);\n\n return (\n <SelectionPaxWrapper data-test=\"selection-pax\" id=\"selection-pax\">\n <SelectionGuests\n type={childrenManagementEnabled ? \"adults\" : \"persons\"}\n />\n {childrenManagementEnabled && <SelectionGuests type=\"children\" />}\n </SelectionPaxWrapper>\n );\n};\n\nexport const SelectionPax = memo(Pax);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { RoundedIcon } from \"../../rounded-icon/rounded-icon\";\n\nexport enum borderStyles {\n dashed = \"dashed\",\n solid = \"solid\",\n}\n\nexport enum status {\n disabled = \"disabled\",\n unavalable = \"unavalable\",\n}\n\ninterface IProps {\n explanation: string;\n borderStyle?: borderStyles;\n status?: string;\n icon?: string;\n position?: string;\n}\n\nconst LegendWrapper = styled.div`\n display: flex;\n margin: 5px;\n`;\n\nconst LegendItem = styled.div`\n padding: 0 10px;\n display: flex;\n align-items: center;\n`;\n\nconst LegendTitle = styled.div`\n text-align: center;\n font-size: 10px;\n color: ${(props) => props.theme.textColorGray};\n padding-left: 8px;\n`;\n\nconst LegendCircle = styled.div`\n position: relative;\n display: flex;\n min-width: 30px;\n height: 30px;\n border-radius: 50%;\n justify-content: center;\n align-items: center;\n font-size: 12px;\n color: ${(props) => props.theme.legendBorderGray};\n background-color: ${(props) => props.theme.primaryColor}40;\n\n &.dashed {\n border: 1px dashed ${(props) => props.theme.legendBorderGray};\n }\n\n &.solid {\n border: 1px solid ${(props) => props.theme.legendBorderGray};\n }\n\n &.disabled {\n opacity: 0.4;\n background-color: transparent;\n }\n\n &.unaivalable {\n background-color: ${(props) => props.theme.primaryColor}10;\n }\n`;\n\nconst Item = (props: IProps) => {\n return (\n <LegendWrapper>\n <LegendItem>\n <LegendCircle\n className={`${props.borderStyle} ${props.status}\n }`}\n >\n {props.icon && (\n <RoundedIcon icon={props.icon} position={props.position} />\n )}\n </LegendCircle>\n <LegendTitle>{props.explanation}</LegendTitle>\n </LegendItem>\n </LegendWrapper>\n );\n};\nexport const CalendarLegendItem = memo(Item);\n","import React, { memo } from \"react\";\nimport {\n borderStyles,\n CalendarLegendItem,\n} from \"../calendar-legend-item/calendar-legend-item\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\n\nconst LegendStyle = styled.div`\n display: flex;\n width: 300px;\n justify-content: center;\n align-items: center;\n padding: 8px 0;\n margin: 6px auto 0;\n max-width: fit-content;\n background-color: ${(props) => props.theme.backgroundColor};\n border: 1px solid ${(props) => props.theme.informationTextBackgroundColor};\n border-radius: 4px;\n`;\n\nconst LegendItemsStyle = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n`;\n\nconst Legend = () => {\n const { t } = useTranslation();\n return (\n <LegendStyle>\n <LegendItemsStyle data-test=\"legendItems\">\n <CalendarLegendItem\n explanation={t(\"instabook.legend.legend_available\")}\n />\n <CalendarLegendItem\n icon={\"waiting\"}\n position={\"right\"}\n explanation={t(\"instabook.legend.legend_waiting\")}\n />\n <CalendarLegendItem\n explanation={t(\"instabook.legend.legend_message\")}\n status={\"unaivalable\"}\n />\n <CalendarLegendItem\n borderStyle={borderStyles.dashed}\n explanation={t(\"instabook.legend.legend_full\")}\n status={\"disabled\"}\n />\n <CalendarLegendItem\n borderStyle={borderStyles.solid}\n explanation={t(\"instabook.legend.legend_closed\")}\n status={\"disabled\"}\n />\n </LegendItemsStyle>\n </LegendStyle>\n );\n};\nexport const CalendarLegend = memo(Legend);\n","import React, { memo, useState, useEffect } from \"react\";\nimport DateRangeIcon from \"@material-ui/icons/DateRange\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport moment from \"moment\";\nimport { capitalize } from \"../../../utils\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { CalendarLayout, GolEventListener } from \"../../calendar/calendar\";\nimport { CalendarLegend } from \"../../calendar/calendar-legend/calendar-legend\";\nimport { InputWithIcon } from \"../../input-with-icon/input-with-icon\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { getLanguageSwitcherService } from \"../../../services/language-switcher.service\";\nimport { DayStatus } from \"../../../types\";\nimport calendarService from \"../../../services/calendar-service\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\n\nconst CalendarWrapper = styled.div`\n width: 300px;\n`;\n\nconst Calendar = () => {\n const { i18n } = useTranslation();\n const [selectedDate, setSelectedDate] = useState(selectionStore.date);\n const [localeForMoment, setLocaleForMoment] = useState(null);\n const isPreCatelanRestaurant = moduleSettings.isPreCatelanRestaurant;\n const shouldHideLegend =\n moduleSettings.shouldHideLegend || isPreCatelanRestaurant;\n\n useEffect(() => {\n setLocaleForMoment(getLanguageSwitcherService().localeForMoment());\n }, [i18n.language]);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-calendar\",\n [GolEventListener.CalendarDate],\n () => {\n const status =\n calendarService.getStatus(selectionStore.date) ||\n DayStatus.unavailable;\n if (status === DayStatus.available || status === DayStatus.waiting) {\n setSelectedDate(selectionStore.date);\n } else {\n setSelectedDate(null);\n selectionStore.time = \"\";\n selectionStoreChangesService.dispatch(GolEventListener.Time);\n }\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-calendar\");\n };\n }, []);\n\n return (\n <CalendarWrapper data-test=\"selection-date\" id=\"selection-date\">\n <InputWithIcon\n error={false}\n value={\n Number(selectedDate) > 0\n ? capitalize(\n moment(selectedDate).locale(localeForMoment).format(\"dddd LL\")\n )\n : \"\"\n }\n placeholderKey={\"instabook.bookings.date\"}\n helperText={\"\"}\n variant={\"outlined\"}\n icon={<DateRangeIcon />}\n isSummary={true}\n />\n <CalendarLayout />\n {!shouldHideLegend && <CalendarLegend />}\n </CalendarWrapper>\n );\n};\nexport const SelectionCalendar = memo(Calendar);\n","import React, { memo, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { SlotItem } from \"../slot-item/slot-item\";\nimport { ISlot } from \"../../../types\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../../calendar/calendar\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\n\ninterface IProps {\n sectionTitleKey: string;\n sectionTimeSlots: Array<ISlot>;\n}\n\nexport const TimeSectionStyle = styled.div`\n width: 300px;\n font-size: 14px;\n`;\n\nexport const TimeSectionTitle = styled.div`\n margin-left: 8px;\n margin-top: 12px;\n font-weight: bold;\n`;\n\nconst Time = (props: IProps) => {\n const { t } = useTranslation();\n const [selectedTime, setSelectedTime] = useState(selectionStore.time);\n\n const storeSelectedTime = (value: any): void => {\n setSelectedTime(value);\n selectionStore.time = value;\n selectionStoreChangesService.dispatch(GolEventListener.Time);\n };\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-time\",\n [GolEventListener.Time],\n () => {\n setSelectedTime(selectionStore.time);\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-time\");\n };\n }, []);\n\n const timeSlots = props.sectionTimeSlots.map((timeSlot: ISlot) => {\n return (\n <SlotItem\n icons={{\n hasWaitingList: timeSlot.icons?.hasWaitingList,\n hasOffer: timeSlot.icons?.hasOffer,\n hasPrepayment: timeSlot.icons?.hasPrepayment,\n }}\n value={timeSlot.value}\n key={timeSlot.value}\n isSelected={timeSlot.value === selectedTime}\n onClick={storeSelectedTime}\n />\n );\n });\n return (\n <TimeSectionStyle data-test=\"time-section\">\n <TimeSectionTitle>\n {moduleSettings.renamingPeriod(props.sectionTitleKey)}\n </TimeSectionTitle>\n <div className=\"timeSlots\">{timeSlots}</div>\n </TimeSectionStyle>\n );\n};\nexport const TimeSection = memo(Time);\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { NonBookableEvent } from \"../../../types\";\nimport { GolTooltip } from \"../../tooltip/tooltip\";\nimport {\n TimeSectionStyle,\n TimeSectionTitle,\n} from \"../time-section/time-section\";\n\ninterface IProps {\n sectionTitleKey: string;\n noHourReason: string;\n nonBookableEvent?: NonBookableEvent;\n}\n\nexport const NoHourReasonStyle = styled.div`\n display: inline-block;\n text-align: left;\n color: \"#f57c00\";\n position: relative;\n text-decoration: none;\n padding: 6px 8px;\n margin-bottom: 12px;\n width: 288px;\n height: 100%;\n`;\n\nexport const NonBookableEventTooltip = styled.div`\n display: flex;\n justify-content: flex-start;\n margin-top: -18px;\n margin-left: 8px;\n`;\n\nconst NoTime = (props: IProps) => {\n const { t } = useTranslation();\n\n return (\n <TimeSectionStyle data-test=\"no-time-section\">\n {props.sectionTitleKey && (\n <TimeSectionTitle>\n {moduleSettings.renamingPeriod(props.sectionTitleKey)}\n </TimeSectionTitle>\n )}\n <NoHourReasonStyle\n dangerouslySetInnerHTML={{ __html: props.noHourReason }}\n />\n {props.nonBookableEvent && (\n <NonBookableEventTooltip>\n <GolTooltip\n title={props.nonBookableEvent.event_name}\n text={props.nonBookableEvent.event_description}\n />\n </NonBookableEventTooltip>\n )}\n </TimeSectionStyle>\n );\n};\nexport const NoTimeSection = memo(NoTime);\n","import React, { useEffect, useState } from \"react\";\nimport { IDisplayPeriod } from \"../../../types\";\nimport { TimeSection } from \"../time-section/time-section\";\nimport { NoTimeSection } from \"../no-time-section/no-time-section\";\nimport styled from \"styled-components\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../../calendar/calendar\";\n\ninterface IStyled {\n disabled?: boolean;\n}\n\nconst TimeSectionWrapper = styled.div<IStyled>`\n width: 300px;\n background-color: ${(props) => props.theme.backgroundColor};\n padding: 4px 6px 12px;\n margin-top: 2px;\n box-shadow: 0 2px 6px rgb(0 0 0 / 5%), 0 0 0 1px rgb(0 0 0 / 7%);\n border-radius: 4px;\n pointer-events: ${(props) => (props.disabled ? \"none\" : \"auto\")};\n opacity: ${(props) => (props.disabled ? 0.6 : 1)};\n`;\n\ntype PeriodsProps = {\n displayPeriods: Array<IDisplayPeriod>;\n};\n\nexport const PeriodsView = (props: PeriodsProps) => {\n const [selectedGuests, setSelectedGuests] = useState(selectionStore.guests);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"guests\",\n [GolEventListener.Guests],\n () => {\n setSelectedGuests(selectionStore.guests);\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"guests\");\n };\n }, []);\n\n const renderPeriods = () => {\n return props.displayPeriods.map((displayPeriod: IDisplayPeriod) => {\n if (displayPeriod.hours) {\n return (\n <TimeSection\n key={displayPeriod.titleKey}\n sectionTitleKey={displayPeriod.titleKey}\n sectionTimeSlots={displayPeriod.hours}\n />\n );\n } else {\n return (\n <NoTimeSection\n key={displayPeriod.titleKey}\n sectionTitleKey={displayPeriod.titleKey}\n noHourReason={displayPeriod.noHourReason!}\n nonBookableEvent={displayPeriod.nonBookableEvent}\n />\n );\n }\n });\n };\n return (\n <TimeSectionWrapper\n data-test=\"periods-view\"\n disabled={selectedGuests === 0}\n >\n {renderPeriods()}\n </TimeSectionWrapper>\n );\n};\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { RoundedIcon } from \"../../rounded-icon/rounded-icon\";\n\nconst LegendStyle = styled.div`\n margin: 6px 0 12px;\n font-size: 10px;\n width: 300px;\n`;\n\nconst LegendItemsStyle = styled.div`\n display: flex;\n width: 300px;\n justify-content: center;\n background-color: ${(props) => props.theme.backgroundColor};\n border: 1px solid ${(props) => props.theme.informationTextBackgroundColor};\n border-radius: 4px;\n padding: 4px 0;\n margin: 6px auto;\n`;\n\nconst LegendItem = styled.div`\n position: relative;\n display: flex;\n margin: 8px;\n justify-content: center;\n align-items: center;\n`;\n\nconst LegendText = styled.div`\n margin-left: 8px;\n`;\n\nconst Legend = () => {\n const { t } = useTranslation();\n return (\n <LegendStyle>\n <LegendItemsStyle className={\"legend-items\"}>\n <LegendItem data-test=\"waiting-icon\">\n <RoundedIcon icon=\"waiting\" size=\"legend\" position=\"legend\" />\n <LegendText>{t(\"instabook.legend.legend_waiting\")}</LegendText>\n </LegendItem>\n <LegendItem data-test=\"flash-on-icon\">\n <RoundedIcon icon=\"flash-on-icon\" size=\"legend\" position=\"legend\" />\n <LegendText>{t(\"instabook.legend.legend_event\")}</LegendText>\n </LegendItem>\n <LegendItem data-test=\"payment-icon\">\n <RoundedIcon icon=\"payment-icon\" size=\"legend\" position=\"legend\" />\n <LegendText>{t(\"instabook.legend.legend_prepay\")}</LegendText>\n </LegendItem>\n </LegendItemsStyle>\n </LegendStyle>\n );\n};\nexport const TimeSlotLegend = memo(Legend);\n","import { WithRestaurantIdEndpoint } from \"./WithRestaurantIdEndpoint\";\nexport class PeriodsEndpoint extends WithRestaurantIdEndpoint {\n constructor() {\n super(\"periods\");\n }\n}\n","import i18n from \"../i18n\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { Area, AreaTranslation } from \"../types\";\nimport { getLanguageSwitcherService } from \"./language-switcher.service\";\n\nexport class AreaService {\n area: Area;\n constructor(area: Area) {\n this.area = area;\n }\n getTranslation(): AreaTranslation | undefined {\n let displayedLanguageArea = undefined;\n\n if (this.area.translations) {\n displayedLanguageArea = this.getNameFromI18nLanguage();\n\n if (\n !displayedLanguageArea ||\n (displayedLanguageArea && !displayedLanguageArea.name)\n ) {\n displayedLanguageArea = this.getNameFromDefaultRestaurantLocale();\n }\n\n if (\n !displayedLanguageArea ||\n (displayedLanguageArea && !displayedLanguageArea.name)\n ) {\n displayedLanguageArea = this.loadFirstTranslation();\n }\n }\n\n return displayedLanguageArea;\n }\n\n private loadFirstTranslation(): AreaTranslation | undefined {\n return this.area.translations[0];\n }\n\n private getNameFromI18nLanguage(): AreaTranslation | undefined {\n return this.area.translations.find(\n (translation: AreaTranslation) =>\n translation.locale ===\n getLanguageSwitcherService().golLocaleFromSwitcher(i18n.language)\n );\n }\n\n private getNameFromDefaultRestaurantLocale(): AreaTranslation | undefined {\n return this.area.translations.find(\n (translation: AreaTranslation) =>\n translation.locale === moduleSettings.getDefaultLocale()\n );\n }\n}\n","import {\n Area,\n AreaTranslation,\n DropdownOption,\n EngineMode,\n Period,\n Periods,\n} from \"../types\";\nimport { AreaService } from \"./area-service\";\n\nclass FiltersService {\n static service: FiltersService | undefined;\n\n static get(): FiltersService {\n if (!this.service) {\n this.service = new FiltersService();\n }\n return this.service!;\n }\n\n public areaDropdownOptions(\n areas: Array<Area>,\n selectedArea: string | null\n ): Array<DropdownOption> | null {\n const areasTranslations: Array<{\n id: number;\n translation: AreaTranslation;\n }> = this.loadAreaTranslations(areas);\n const options = this.loadAreaDropdownOption(\n areasTranslations,\n selectedArea\n );\n if (!options.length) {\n return null;\n }\n return options;\n }\n\n private loadAreaDropdownOption(\n areasTranslations: Array<{ id: number; translation: AreaTranslation }>,\n selectedArea: string | null\n ): Array<DropdownOption> {\n return areasTranslations.map(\n (translation: { id: number; translation: AreaTranslation }) => {\n const displayText = translation.translation.name;\n const value = translation.id;\n return {\n value: value.toString(),\n displayText,\n isSelected: value.toString() === selectedArea?.toString(),\n };\n }\n );\n }\n\n private loadAreaTranslations(\n areas: Array<Area>\n ): Array<{ id: number; translation: AreaTranslation }> {\n const areasTranslations: Array<{\n id: number;\n translation: AreaTranslation;\n }> = [];\n areas.forEach((area: Area) => {\n let displayedLanguageArea = new AreaService(area).getTranslation();\n if (displayedLanguageArea) {\n areasTranslations.push({\n id: area.id,\n translation: displayedLanguageArea,\n });\n }\n });\n return areasTranslations;\n }\n\n public getFiltersFromPeriods(\n moduleSettingAreas: Area[],\n timePeriods: Array<Period>,\n engineMode?: string\n ) {\n var areas: Array<any> = [];\n const periods: Array<Periods> = [];\n const canBuildArea = engineMode && engineMode === EngineMode.table;\n timePeriods\n .filter((x) => x != null)\n .forEach((timePeriod: Period) => {\n if (canBuildArea) {\n const areaId = timePeriod.area_id;\n if (areaId && !areas.map((area: Area) => area.id).includes(areaId)) {\n const area = moduleSettingAreas.find(\n (area: Area) => area.id === areaId\n );\n if (area) {\n areas.push(area);\n }\n }\n }\n const period = timePeriod.period;\n if (!periods.includes(period)) {\n periods.push(period);\n }\n });\n if (areas.length === 0 && canBuildArea) {\n areas = moduleSettingAreas;\n }\n return {\n areas,\n periods,\n };\n }\n}\n\nexport default FiltersService.get();\n","import { selectionStore } from \"../stores/selection.store\";\nimport {\n BookingState,\n Hour,\n IDisplayAvailablePeriods,\n IDisplayPeriod,\n ISlot,\n Period,\n PeriodsResponse,\n} from \"../types\";\nimport { Observable } from \"rxjs\";\nimport { getAvailablePeriods } from \"../requests/periods.requests\";\nimport filterService from \"../services/filters.service\";\nimport { moduleSettings } from \"../stores/module-settings.store\";\nimport { map } from \"rxjs/operators\";\n\nclass IDisplayPeriodsBuilderService {\n static service: IDisplayPeriodsBuilderService | undefined;\n\n static get(): IDisplayPeriodsBuilderService {\n if (!this.service) {\n this.service = new IDisplayPeriodsBuilderService();\n }\n return this.service!;\n }\n\n public getAvailableIDisplayPeriods(\n engineMode: any\n ): Observable<IDisplayAvailablePeriods> {\n return getAvailablePeriods().pipe(\n map((resp: PeriodsResponse) => {\n return {\n displayPeriods: this.buildIDisplayPeriods(resp.periods),\n filters: filterService.getFiltersFromPeriods(\n moduleSettings.areas,\n resp.periods,\n engineMode && engineMode[\"engineMode\"]\n ),\n message: resp.message,\n };\n })\n );\n }\n\n public buildIDisplayPeriods(periods: Period[]): Array<IDisplayPeriod> {\n let dispPeriod: Array<IDisplayPeriod> = [];\n\n let nonBookableEventIds: String[] = [];\n periods.forEach(period => {\n if (period.non_bookable_event) {\n return nonBookableEventIds.push(period.non_bookable_event.event_id);\n }\n });\n const isUniqEvent = (Array.from(new Set(nonBookableEventIds))).length === 1;\n\n if (periods.length === nonBookableEventIds.length && isUniqEvent) {\n dispPeriod.push({\n titleKey: '',\n noHourReason: periods[0].no_hour_reason,\n nonBookableEvent: periods[0].non_bookable_event\n });\n } else {\n dispPeriod = this.builsITimeSlots(periods);\n }\n return dispPeriod;\n }\n\n private builsITimeSlots(periods: Period[]) {\n const dispPeriod: Array<IDisplayPeriod> = [];\n const selectedTime = selectionStore.time;\n periods\n .filter((x) => x != null)\n .forEach((period: Period) => {\n if (!period || period.hours.length === 0) {\n dispPeriod.push({\n titleKey: period.period,\n noHourReason: period.no_hour_reason,\n nonBookableEvent: period.non_bookable_event,\n });\n } else {\n const hours: Array<ISlot> = this.buildITimeSlotsFromHours(\n period.hours,\n selectedTime\n );\n dispPeriod.push({ titleKey: period.period, hours: hours });\n }\n });\n return dispPeriod;\n }\n\n private buildITimeSlotsFromHours(\n hours: Hour[],\n selectedTime: string | null\n ): Array<ISlot> {\n const iTimeSlots: Array<ISlot> = [];\n hours.forEach((hour: Hour) =>\n iTimeSlots.push(\n this.buildITimeSlotDetails(\n hour,\n selectedTime ? selectedTime === hour.time : false\n )\n )\n );\n return iTimeSlots;\n }\n\n private buildITimeSlotDetails(hour: Hour, isSelected: boolean): ISlot {\n return {\n value: hour.time,\n icons: {\n hasOffer: hour.event || (hour.offers && hour.offers.length > 0),\n hasWaitingList: hour.booking_state === BookingState.waiting,\n hasPrepayment: hour.has_prepayment,\n },\n isSelected: isSelected,\n };\n }\n}\nexport default IDisplayPeriodsBuilderService.get();\n","import { getHttpService } from \"../services/http.service\";\nimport { PeriodsEndpoint } from \"../endpoints/PeriodsEndpoint\";\nimport { Observable } from \"rxjs\";\nimport { periodsArray, PeriodsResponse } from \"../types\";\nimport { selectionStore } from \"../stores/selection.store\";\nimport i18n from \"../i18n\";\nimport { getLanguageSwitcherService } from \"../services/language-switcher.service\";\n\nexport const getAvailablePeriods = (): Observable<PeriodsResponse> => {\n const guests = (selectionStore.guests + selectionStore.children).toString();\n const date = selectionStore.date!.format(\"yyyy-M-D\").toString();\n const endpoint = new PeriodsEndpoint();\n const queryParams = [\n {\n queryParamName: \"date\",\n queryParamValue: date,\n },\n {\n queryParamName: \"persons\",\n queryParamValue: guests,\n },\n ];\n if (selectionStore.period && periodsArray.includes(selectionStore.period)) {\n queryParams.push({\n queryParamName: \"period\",\n queryParamValue: selectionStore.period,\n });\n }\n if (selectionStore.area && !isNaN(+selectionStore.area)) {\n queryParams.push({\n queryParamName: \"area_id\",\n queryParamValue: selectionStore.area,\n });\n }\n\n queryParams.push({\n queryParamName: \"show_empty_periods\",\n queryParamValue: \"true\",\n });\n\n queryParams.push({\n queryParamName: \"locale\",\n queryParamValue: getLanguageSwitcherService().localeForCountryCode(\n i18n.language\n ),\n });\n\n queryParams.push({\n queryParamName: \"expands[]\",\n queryParamValue: \"prepayment_hours_info\",\n });\n\n endpoint.addQueryParams(queryParams);\n return getHttpService().get(endpoint);\n};\n","import React, { memo, useEffect, useRef, useState } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useTranslation } from \"react-i18next\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport styled from \"styled-components\";\nimport AccessTimeIcon from \"@material-ui/icons/AccessTime\";\nimport { IDisplayAvailablePeriods, IDisplayPeriod } from \"../../../types\";\nimport { Loader } from \"../../loader/loader\";\nimport { PeriodsView } from \"./periods-view\";\nimport { TimeSlotLegend } from \"../time-slot-legend/time-slot-legend\";\nimport { GolEventListener } from \"../../calendar/calendar\";\nimport { InputWithIcon } from \"../../input-with-icon/input-with-icon\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { getTagManagerService } from \"../../../services/tag-manager.service\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport iDisplayPeriodsService from \"../../../../src/services/i-display-periods-builder.service\";\nimport ReactPixel from \"react-facebook-pixel\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\n\nconst SelectionTimeWrapper = styled.div`\n position: relative;\n margin: 0 6px;\n display: flex;\n width: 300px;\n flex-direction: column;\n align-items: center;\n`;\n\nconst MessageInfo = styled.div`\n font-size: 14px;\n background-color: ${(props) => props.theme.backgroundColor};\n border-radius: 4px;\n padding: 12px;\n`;\n\nconst Anchor = styled.div`\n width: 1px;\n height: 1px;\n`;\n\nconst Time = () => {\n const { t, i18n } = useTranslation();\n const displayPeriods = useRef<Array<IDisplayPeriod>>([]);\n const filters = useRef<any>({});\n const hasPeriods = useRef(false);\n const engineMode = useRef(useLocation().state as { [key: string]: string });\n const [message, setMessage] = useState(\"\");\n const [requestingData, setRequestingData] = useState(false);\n const [selectedDate, setSelectedDate] = useState(selectionStore.date);\n const [selectedTime, setSelectedTime] = useState(selectionStore.time);\n const [initialDate, setInitialDate] = useState(selectedDate);\n const shouldHideLegend = moduleSettings.shouldHideLegend;\n\n const throwError = useErrorHandler();\n\n const checkPeriodAndTime = (periods: IDisplayPeriod[]): void => {\n if (!selectedTime) return;\n let hours: any = [];\n periods.forEach((period) => {\n if (period.hours) {\n hours.push(period.hours.map((hour) => hour.value));\n }\n });\n if (!hours.flat().includes(selectedTime)) {\n setSelectedTime(\"\");\n selectionStore.time = \"\";\n selectionStoreChangesService.dispatch(GolEventListener.Time);\n }\n };\n\n const isInViewport = (element) => {\n const rect = element.getBoundingClientRect();\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n };\n\n const scrollToAnchor = () => {\n const anchor = document.querySelector(\"#anchor-selection-time\");\n if (!isInViewport(anchor)) {\n anchor?.scrollIntoView({ block: \"end\", inline: \"nearest\" });\n }\n };\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-on-complete\",\n [GolEventListener.CalendarDate, GolEventListener.OnComplete],\n () => {\n setSelectedDate(selectionStore.date);\n if (selectionStore.date && selectionStore.date.isValid()) {\n setRequestingData(true);\n }\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-on-complete\");\n };\n }, []);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-time\",\n [GolEventListener.Time, GolEventListener.OnComplete],\n () => {\n setSelectedTime(selectionStore.time);\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-time\");\n };\n }, [selectedDate]);\n\n useEffect(() => {\n if (!selectedDate) return;\n if (!requestingData) return;\n displayPeriods.current = [];\n hasPeriods.current = false;\n const subscription = iDisplayPeriodsService\n .getAvailableIDisplayPeriods(engineMode.current)\n .subscribe({\n next: (resp: IDisplayAvailablePeriods) => {\n const periods = resp.displayPeriods;\n displayPeriods.current = resp.displayPeriods;\n filters.current = resp.filters;\n hasPeriods.current = periods.length !== 0;\n setMessage(resp.message);\n checkPeriodAndTime(periods);\n getTagManagerService().pushTags(\"hours\");\n ReactPixel.pageView();\n setRequestingData(false);\n if (initialDate !== selectedDate) {\n scrollToAnchor();\n setInitialDate(selectedDate);\n }\n },\n error: (error) => {\n setMessage(error.data.message);\n setRequestingData(false);\n },\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [requestingData, i18n.language, throwError]);\n\n const messageInfo = message\n ? message\n : t(\"instabook.messages.booking_not_available_for_people_table_engine\");\n\n const content = selectedDate && selectedDate.isValid() && (\n <div>\n {!hasPeriods.current && <MessageInfo>{messageInfo}</MessageInfo>}\n {hasPeriods.current && (\n <PeriodsView displayPeriods={displayPeriods.current} />\n )}\n {hasPeriods.current && !shouldHideLegend && <TimeSlotLegend />}\n </div>\n );\n\n return (\n <SelectionTimeWrapper data-test=\"selection-time\" id=\"selection-time\">\n <InputWithIcon\n error={false}\n value={selectedTime}\n placeholderKey={\"instabook.bookings.hour\"}\n helperText={\"\"}\n variant={\"outlined\"}\n icon={<AccessTimeIcon />}\n isSummary={true}\n />\n {requestingData ? <Loader /> : content}\n <Anchor id=\"anchor-selection-time\" />\n </SelectionTimeWrapper>\n );\n};\nexport const SelectionTime = memo(Time);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { selectionStoreChangesService } from \"../../services/selection-store-changes.service\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { selectionStore } from \"../../stores/selection.store\";\nimport { GolEventListener } from \"../calendar/calendar\";\nimport { Dropdown } from \"../dropdown/dropdown\";\nimport {\n stringArrayToDropdown,\n stringToDropdown,\n} from \"../dropdown/dropdown-transform\";\nimport filterService from \"../../services/filters.service\";\n\ninterface IStyle {\n forceAreaSelection: Boolean;\n}\n\ninterface IFilters {\n alignPosition: FiltersPosition;\n shouldForceAreaSelection?: Boolean | false;\n}\n\nexport enum FiltersPosition {\n start = \"start\",\n center = \"center\",\n}\n\nconst FilterStyle = styled.div<IStyle>`\n display: flex;\n flex-direction: ${(props) =>\n props.forceAreaSelection ? \"row-reverse\" : \"row\"};\n width: 100%;\n justify-content: ${(props) => props.theme.alignPosition};\n align-items: start;\n text-align: center;\n margin-bottom: 30px;\n\n & > div {\n margin-left: 4px;\n margin-right: 4px;\n }\n\n #mui-component-select-outline {\n width: 254px;\n text-align: left;\n }\n\n .MuiOutlinedInput-input {\n padding-left: 16px;\n }\n\n @media screen and (max-width: 662px) {\n {\n flex-direction: ${(props) =>\n props.forceAreaSelection ? \"column-reverse\" : \"column\"};\n align-items: center;\n align-content: center;\n }\n\n & > div {\n margin-left: 0;\n margin-right: 0;\n }\n\n > * {\n &:first-child {\n margin-bottom: 8px;\n }\n }\n }\n\n @media screen and (max-width: 480px) {\n > * {\n flex: 0 0 100%;\n margin-bottom: 10px;\n margin-left: 0;\n margin-right: 0;\n }\n }\n`;\n\nconst FiltersWrapper = (props: IFilters) => {\n const { t } = useTranslation();\n\n const periodChanged = (value: any) => {\n if (selectionStore.period !== value) {\n selectionStore.period = value;\n selectionStoreChangesService.dispatch(GolEventListener.Period);\n }\n };\n\n const areaChanged = (value: any) => {\n if (selectionStore.area !== value) {\n selectionStore.area = value;\n selectionStoreChangesService.dispatch(GolEventListener.Area);\n }\n };\n\n const periodsOptions = stringArrayToDropdown(\n moduleSettings.periods,\n selectionStore.period,\n \"periods.\"\n );\n const areasOptions = filterService.areaDropdownOptions(\n moduleSettings.areas,\n selectionStore.area\n );\n const forceAreaSelection = moduleSettings.forceAreaSelection;\n const areaPlaceholder = forceAreaSelection ? \"placeholder\" : \"all\";\n const hideServiceSelection = moduleSettings.hideServiceSelection;\n\n return (\n <FilterStyle\n data-test=\"filters\"\n theme={props}\n forceAreaSelection={forceAreaSelection}\n >\n {!hideServiceSelection &&\n periodsOptions.length > 1 &&\n !props.shouldForceAreaSelection && (\n <Dropdown\n dataTest=\"dropdownPeriods\"\n options={periodsOptions}\n placeholderOption={stringToDropdown(\"all\", null, \"periods.\")}\n placeholderSelectable={true}\n onItemClick={periodChanged}\n />\n )}\n {areasOptions ? (\n <Dropdown\n requiredWithPlaceholder={forceAreaSelection}\n dataTest=\"dropdownAreas\"\n options={areasOptions}\n placeholderOption={stringToDropdown(areaPlaceholder, null, \"rooms.\")}\n placeholderSelectable={!forceAreaSelection}\n onItemClick={areaChanged}\n />\n ) : (\n \"\"\n )}\n </FilterStyle>\n );\n};\n\nexport const Filters = memo(FiltersWrapper);\n","import { DropdownOption } from \"../../types\";\nimport i18n from \"../../i18n\";\nimport { moduleSettings } from \"src/stores/module-settings.store\";\n\nexport const stringArrayToDropdown = (\n valueArr: Array<string>,\n selectedValue?: string | null,\n prefix?: string | null\n): Array<DropdownOption> => {\n return valueArr.map((value: string) =>\n stringToDropdown(value, selectedValue, prefix)\n );\n};\n\nexport const stringToDropdown = (\n value: string,\n selectedValue?: string | null,\n prefix?: string | null\n): DropdownOption => {\n return {\n value,\n displayText:\n prefix === \"periods.\"\n ? moduleSettings.renamingPeriod(value)\n : i18n.t(`instabook.${prefix ? prefix : \"\"}${value}`),\n isSelected: selectedValue === value,\n };\n};\n","import React, { memo, useCallback, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { Redirect, useLocation } from \"react-router-dom\";\nimport { SelectionPax } from \"../selection-guests/selection-pax\";\nimport { SelectionCalendar } from \"../selection-calendar/selection-calendar\";\nimport { SelectionTime } from \"../selection-time/selection-time\";\nimport { Filters, FiltersPosition } from \"../../filters/filters\";\nimport { selectionStore } from \"../../../stores/selection.store\";\nimport { ErrorMessage } from \"../../errors/message-error-view\";\nimport { ApiErrorCode } from \"../../../services/api-errors\";\nimport { selectionStoreChangesService } from \"../../../services/selection-store-changes.service\";\nimport { GolEventListener } from \"../../calendar/calendar\";\nimport { ContinueButton } from \"../../continue-button/continue-button\";\nimport { buildRouteWithParams } from \"../../../helpers/build-route-with-params\";\nimport { config } from \"../../../config\";\nimport { useErrorHandler } from \"react-error-boundary\";\nimport {\n cancelPendingBookingRequest,\n createInitialPendingBookingRequest,\n} from \"../../../requests/pending-booking.requests\";\nimport { CommercialKeys, Menu, PendingBooking } from \"../../../types\";\nimport { moduleSettings } from \"../../../stores/module-settings.store\";\nimport { pendingBookingStore } from \"../../../stores/pending-booking.store\";\nimport { commercialsStore } from \"../../../stores/commercials.store\";\nimport { Loader } from \"../../loader/loader\";\nimport { requestParamsImpl } from \"../../../services/request-params.service\";\n\nconst SelectionCriteriaWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-bottom: 32px;\n`;\n\nconst SelectionCriteriaLayout = styled.div`\n display: flex;\n justify-content: center;\n width: 100%;\n\n @media screen and (max-width: 1010px) {\n flex-direction: column;\n align-items: center;\n #selection-pax,\n #selection-date {\n margin-top: 8px;\n }\n #selection-time {\n margin-top: 12px;\n }\n }\n`;\n\nconst SelectionCriteriaDetails = () => {\n const { t } = useTranslation();\n const [error, setError] = useState<any>(useLocation().state);\n const [, setSelectedGuests] = useState(selectionStore.guests);\n const [, setSelectedChildren] = useState(selectionStore.children);\n const [, setSelectedTime] = useState(selectionStore.time);\n const childrenManagementEnabled = moduleSettings.childrenManagementEnabled;\n const isSelectOnlyPaxFirst = moduleSettings.selectOnlyPaxFirst;\n const isUpdateFromBooking = moduleSettings.isUpdateFromBooking;\n const [selectedOnlyPaxDone, setSelectedOnlyPaxDone] = useState(\n !isSelectOnlyPaxFirst || !!selectionStore.guests\n );\n const [selectedPaxDone, setSelectedPaxDone] = useState(\n !!selectionStore.guests\n );\n const [canContinue, setCanContinue] = useState(\n !isUpdateFromBooking &&\n selectedOnlyPaxDone &&\n selectionStore.guests &&\n selectionStore.date &&\n selectionStore.date.isValid() &&\n selectionStore.time\n );\n const throwError = useErrorHandler();\n const [redirect, setRedirect] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [shouldForceAreaSelection, setShouldForceAreaSelection] = useState(\n moduleSettings.forceAreaSelection && !selectionStore.area\n );\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-criteria-all\",\n [\n GolEventListener.Guests,\n GolEventListener.CalendarDate,\n GolEventListener.Time,\n ],\n () => {\n setError(\"\");\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"selection-criteria-all\");\n };\n }, []);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-criteria-guests\",\n [GolEventListener.Guests],\n () => {\n setSelectedGuests(selectionStore.guests);\n setSelectedChildren(selectionStore.children);\n selectionStore.guests > 0 || selectionStore.children > 0\n ? setSelectedPaxDone(true)\n : setSelectedPaxDone(false);\n if (!childrenManagementEnabled && !selectedOnlyPaxDone) {\n setSelectedOnlyPaxDone(true);\n }\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\n \"selection-criteria-guests\"\n );\n };\n }, []);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"selection-criteria-time\",\n [GolEventListener.Time],\n () => {\n setSelectedTime(selectionStore.time);\n setCanContinue(\n selectedOnlyPaxDone &&\n selectionStore.guests &&\n selectionStore.date &&\n selectionStore.date.isValid() &&\n selectionStore.time\n );\n if (selectionStore.time) {\n initPendingBooking();\n }\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\n \"selection-criteria-time\"\n );\n };\n }, []);\n\n useEffect(() => {\n selectionStoreChangesService.registerListener(\n \"filter\",\n [GolEventListener.Area],\n () => {\n setShouldForceAreaSelection(selectionStore.area === \"\");\n }\n );\n\n return () => {\n selectionStoreChangesService.unregisterListener(\"filter\");\n };\n }, []);\n\n const commitPendingBooking = useCallback(() => {\n const subscription = createInitialPendingBookingRequest().subscribe(\n (resp: PendingBooking) => {\n moduleSettings.initialBookingCreated = true;\n pendingBookingStore.pendingBooking = resp;\n if (resp.available_commercials) {\n selectionStore.selectedOffer = null;\n commercialsStore.offers = resp.available_commercials.filter(\n (commercial) => commercial.object === CommercialKeys.offers\n );\n commercialsStore.events = resp.available_commercials.filter(\n (commercial) => commercial.object === CommercialKeys.events\n );\n } else {\n commercialsStore.offers = [];\n commercialsStore.events = [];\n }\n if (resp.available_menus) {\n commercialsStore.menus = resp.available_menus;\n selectionStore.selectedMenus = resp.available_menus.map(\n (availableMenu: Menu) => {\n return { menuId: availableMenu.id, count: 0 };\n }\n );\n } else {\n commercialsStore.menus = [];\n }\n setIsLoading(false);\n setRedirect(true);\n },\n throwError\n );\n\n return () => {\n subscription.unsubscribe();\n };\n }, [throwError]);\n\n const handleSelectedPaxDone = () => {\n setSelectedOnlyPaxDone(true);\n setSelectedPaxDone(true);\n };\n\n const initPendingBooking = () => {\n setIsLoading(true);\n if (moduleSettings.initialBookingCreated) {\n moduleSettings.initialBookingCreated = false;\n pendingBookingStore.resetBookingState();\n cancelPendingBookingRequest();\n }\n commitPendingBooking();\n };\n\n useEffect(() => {\n if (\n requestParamsImpl.overwrittenPax() &&\n requestParamsImpl.overwrittenDate() &&\n requestParamsImpl.overwrittenTime() &&\n !selectionStore.backButtonClicked\n ) {\n initPendingBooking();\n }\n });\n\n return (\n <SelectionCriteriaWrapper data-test=\"selection-criteria\">\n {error && error[\"errorDetails\"] && (\n <ErrorMessage\n error={error[\"error\"]}\n status={\n error[\"errorDetails\"][\"code\"] ===\n ApiErrorCode.pending_booking_unfound\n ? \"warning\"\n : \"Error\"\n }\n data-test=\"error-message\"\n />\n )}\n <Filters\n alignPosition={FiltersPosition.center}\n shouldForceAreaSelection={shouldForceAreaSelection}\n />\n {!shouldForceAreaSelection && (\n <SelectionCriteriaLayout>\n <SelectionPax />\n {(isUpdateFromBooking || selectedOnlyPaxDone) && (\n <SelectionCalendar />\n )}\n {(isUpdateFromBooking || selectedOnlyPaxDone) && <SelectionTime />}\n </SelectionCriteriaLayout>\n )}\n {(canContinue ||\n isUpdateFromBooking ||\n (childrenManagementEnabled &&\n isSelectOnlyPaxFirst &&\n !selectedOnlyPaxDone)) && (\n <ContinueButton\n disabled={childrenManagementEnabled && !selectedPaxDone}\n buttonTextKey={t(\"button.valid\")}\n onClick={\n isUpdateFromBooking || (selectedPaxDone && canContinue)\n ? initPendingBooking\n : handleSelectedPaxDone\n }\n />\n )}\n {isLoading && <Loader position={\"fixed\"} />}\n {redirect && (\n <Redirect to={buildRouteWithParams(config.routes.commercials)} />\n )}\n </SelectionCriteriaWrapper>\n );\n};\nexport const Selection = memo(SelectionCriteriaDetails);\n","import React, { memo, useEffect } from \"react\";\nimport { useLocation } from \"react-router\";\n\nconst ScrollToTopWrapper = (props) => {\n const location = useLocation();\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [location]);\n\n return <>{props.children}</>;\n};\n\nexport const ScrollToTop = memo(ScrollToTopWrapper);\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { useLocation } from \"react-router-dom\";\n\nconst Message = () => {\n const { i18n } = useTranslation();\n useLocation();\n const waitingInfoMessage = moduleSettings.waitingMessage(i18n.language);\n\n return (\n <>\n {waitingInfoMessage && (\n <InformationText text={waitingInfoMessage} status=\"waiting\" />\n )}\n </>\n );\n};\nexport const WaitingMessage = memo(Message);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport {\n BrowserRouter as Router,\n Redirect,\n Route,\n Switch,\n} from \"react-router-dom\";\nimport { config } from \"../../config\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { ConfirmationRouter } from \"../confirmation/confirmation-router/confirmation-router\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\nimport { ApiErrorCode } from \"../../services/api-errors\";\nimport { selectionStore } from \"../../stores/selection.store\";\nimport { useTranslation } from \"react-i18next\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { Commercials } from \"../commercials/commercials\";\nimport { GeneralMessage } from \"../general-message/general-message\";\nimport { Selection } from \"../selection/selection-criteria/selection\";\nimport { ScrollToTop } from \"../selection/scroll-to-top/scroll-to-top\";\nimport { WaitingMessage } from \"../waiting-message/waiting-message\";\nimport * as Sentry from \"@sentry/react\";\nimport { ErrorType } from \"../../services/api-errors/error-types\";\nimport { requestParamsImpl } from \"../../services/request-params.service\";\n\nexport interface IStyle {\n isUpdateFromBooking?: boolean | false;\n}\n\nexport const MainContentFlex = styled.div<IStyle>`\n display: flex;\n flex-direction: column;\n min-height: ${(props) =>\n props.isUpdateFromBooking\n ? `calc(\n 100vh -\n ${\n parseInt(props.theme.headerHeight, 0) +\n parseInt(props.theme.footerHeight, 0)\n }px - 62px)}`\n : `calc(\n 100vh -\n ${\n parseInt(props.theme.headerHeight, 0) +\n parseInt(props.theme.footerHeight, 0)\n }px - 32px)}`};\n max-width: 910px;\n color: ${(props) => props.theme.textColor};\n margin: 10px auto 0;\n padding-bottom: 48px;\n\n @media screen and (max-width: 930px) {\n max-width: 100%;\n padding-bottom: 0;\n }\n\n @media screen and (max-width: 780px) {\n margin-bottom: 0;\n }\n`;\n\nconst MainContentWrapper = styled.div`\n display: flex;\n flex: 1 1 100%;\n`;\n\nconst MainContentLayout = styled.div`\n width: 100%;\n\n @media screen and (max-width: 980px) {\n padding: 0 12px;\n }\n\n @media screen and (max-width: 768px) {\n width: 100%;\n }\n`;\n\nconst MainContentDef = () => {\n const { t } = useTranslation();\n const onlineBookingEnabled = moduleSettings.onlineBookingEnabled;\n const isUpdateFromBooking = moduleSettings.isUpdateFromBooking;\n const hasServices = moduleSettings.periods.length > 0;\n\n const areaNoMoreAvailaible =\n moduleSettings.updateFromBooking.area_id &&\n !moduleSettings.areaIds.includes(\n Number(moduleSettings.updateFromBooking.area_id)\n );\n\n const isRefreshOnPayment =\n localStorage.getItem(\"pendingBookingId\") &&\n localStorage.getItem(\"referralKey\") === moduleSettings.getReferralKey();\n\n const ErrorFallback = ({\n error,\n resetError,\n }: {\n error: any;\n resetError: any;\n }) => {\n if (error.code === ApiErrorCode.pending_booking_unfound) {\n selectionStore.resetStore();\n }\n\n resetError();\n\n return (\n <Redirect\n to={{\n pathname:\n typeof error.getRedirectPath === \"function\"\n ? error.getRedirectPath()\n : buildRouteWithParams(\"selection\", false),\n search: requestParamsImpl.computeSearchQueryForOverwrittenParams(),\n state: {\n error:\n typeof error.getMessage === \"function\"\n ? error.getMessage()\n : t(\"instabook.errors.error\"),\n errorType:\n typeof error.getErrorType === \"function\"\n ? error.getErrorType()\n : ErrorType.error,\n errorDetails: error.data,\n },\n }}\n />\n );\n };\n\n const mainContent =\n !onlineBookingEnabled || !hasServices ? (\n <InformationText\n key={\"no_online_booking_enabled_msg\"}\n text={t(\"instabook.errors.no_access\")}\n status={\"warning\"}\n />\n ) : (\n <>\n {areaNoMoreAvailaible && (\n <InformationText\n key={\"area_no_more_availaible\"}\n text={t(\"instabook.errors.area_no_more_availaible\")}\n status={\"warning\"}\n />\n )}\n <Switch>\n <ScrollToTop>\n <Sentry.ErrorBoundary fallback={ErrorFallback}>\n <GeneralMessage />\n <WaitingMessage />\n <Route\n path={buildRouteWithParams(config.routes.selection, false)}\n >\n <Selection />\n </Route>\n <Route\n path={buildRouteWithParams(config.routes.commercials, false)}\n >\n <Commercials />\n </Route>\n <Route\n path={buildRouteWithParams(config.routes.confirmation, false)}\n >\n <ConfirmationRouter />\n </Route>\n </Sentry.ErrorBoundary>\n </ScrollToTop>\n </Switch>\n </>\n );\n\n return (\n <MainContentFlex isUpdateFromBooking={isUpdateFromBooking}>\n <Router>\n <MainContentWrapper>\n <MainContentLayout>{mainContent}</MainContentLayout>\n <Redirect\n to={buildRouteWithParams(\n isRefreshOnPayment\n ? config.routes.confirmationOnRefresh\n : config.routes.selection\n )}\n />\n </MainContentWrapper>\n </Router>\n </MainContentFlex>\n );\n};\n\nexport const MainContent = memo(MainContentDef);\n","import React, { memo, useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { ApiError } from \"../../services/api-errors\";\nimport { useTranslation } from \"react-i18next\";\nimport * as Sentry from \"@sentry/react\";\nimport { getLocalStorageService } from \"../../services/local-storage.service\";\nimport i18n from \"../../i18n\";\n\ninterface IApiErrorViewProps {\n error: ApiError;\n isLayout?: boolean | false;\n}\n\ninterface IStyled {\n isLayout?: boolean | false;\n}\n\nconst ErrorStyle = styled.div<IStyled>`\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 5px;\n height: ${(props) =>\n props.isLayout ? `calc(100vh - 142px)` : `calc(100vh - 60px)`};\n margin-top: ${(props) => (props.isLayout ? \"-30px\" : 0)};\n @media screen and (max-width: 768px) {\n height: ${(props) =>\n props.isLayout ? `calc(100vh - 154px)` : `calc(100vh - 60px)`};\n }\n`;\n\nconst ErrorDescriptionStyle = styled.div`\n background-color: #e74c3c;\n color: #ffffff;\n display: flex;\n align-items: center;\n flex-direction: column;\n width: 50%;\n padding: 15px 22px;\n margin: 20px 0;\n\n @media screen and (max-width: 780px) {\n width: 90%;\n font-size: 16px;\n line-height: 19px;\n }\n`;\n\nconst Error_ = (props: IApiErrorViewProps) => {\n const { t } = useTranslation();\n\n useEffect(() => {\n i18n.changeLanguage(\n getLocalStorageService().initLocalLanguage(\n `${process.env.REACT_APP_DEFAULT_LOCALE}`\n )!\n );\n }, []);\n\n let errorMessage = t(\"instabook.errors.error\");\n if (typeof props.error.getMessage === \"function\") {\n errorMessage = props.error.getMessage();\n } else {\n Sentry.captureException(\n new Error(`getMessage is Not a function ${props.error}`),\n (scope) => {\n scope.setTag(\"getMessage\", \"notAFunction\");\n scope.setContext(\"props.error: \", { ...props.error });\n return scope;\n }\n );\n }\n return (\n <ErrorStyle isLayout={props.isLayout}>\n <ErrorDescriptionStyle data-test=\"error-message\">\n {errorMessage}\n </ErrorDescriptionStyle>\n </ErrorStyle>\n );\n};\n\nexport const ApiErrorView = memo(Error_);\n","import React, { memo } from \"react\";\nimport styled, { keyframes } from \"styled-components\";\n\nconst LoaderContainer = styled.div`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst LoaderDotsWrapper = styled.div`\n display: flex;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n`;\n\nconst scaleDot = keyframes`\n 0% {\n transform: scale(0.5);\n }\n 25% {\n transform: scale(1);\n }\n 75% {\n transform: scale(0.5);\n }\n 100% {\n transform: scale(0.5);\n }\n`;\n\nconst LoaderDot = styled.div`\n margin: 2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: gray;\n transform: scale(0.5);\n animation: ${scaleDot} 1.2s ease-out infinite;\n &:nth-of-type(2) {\n animation-delay: 0.2s;\n }\n &:nth-of-type(3) {\n animation-delay: 0.3s;\n }\n &:nth-of-type(4) {\n animation-delay: 0.4s;\n }\n &:nth-of-type(5) {\n animation-delay: 0.5s;\n }\n`;\n\nconst LoaderDotsDef = () => {\n return (\n <LoaderContainer data-test=\"loader-dots\">\n <LoaderDotsWrapper>\n <LoaderDot />\n <LoaderDot />\n <LoaderDot />\n </LoaderDotsWrapper>\n </LoaderContainer>\n );\n};\n\nexport const LoaderDots = memo(LoaderDotsDef);\n","import React, { memo } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport styled from \"styled-components\";\nimport { config } from \"../../config\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\n\nconst GolLogo = styled.div`\n a {\n display: flex;\n align-items: center;\n font-size: 0.8rem;\n margin-left: 24px;\n text-decoration: none;\n\n @media screen and (max-width: 780px) {\n font-size: 0.7rem;\n }\n }\n a:link,\n a:link,\n a:visited,\n a:active {\n color: #333333 !important;\n }\n`;\n\nconst Img = styled.img`\n width: 50px;\n margin-left: 8px;\n`;\n\nconst AppLogo = () => {\n const { i18n } = useTranslation();\n const poweredByLogo = moduleSettings.poweredByLogo;\n const poweredByText = moduleSettings.getPoweredByText(i18n.language);\n const poweredByUrl = moduleSettings.poweredByUrl;\n\n return (\n <GolLogo data-test=\"logo-gol\">\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={poweredByUrl.toString()}\n >\n <span>{poweredByText}</span>\n <Img src={config.baseImageUrl + poweredByLogo} alt=\"\" />\n </a>\n </GolLogo>\n );\n};\nexport const Logo = memo(AppLogo);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { Logo } from \"./Logo\";\nimport { LogoRR } from \"./LogoRR\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\n\ninterface IWrapperStyled {\n fontFamily: string;\n}\n\ninterface IStyled {\n RREnabled: boolean;\n}\n\nconst FooterWrapper = styled.div<IWrapperStyled>`\n font-family: ${(props) => props.fontFamily};\n position: fixed;\n bottom: 0;\n right: 0;\n width: 100%;\n height: 60px;\n display: flex;\n align-items: center;\n padding: 4px 20px;\n background-color: rgba(255, 255, 255, 0.8);\n\n @media screen and (max-width: 780px) {\n position: inherit;\n } ;\n`;\n\nconst PowerBy = styled.div<IStyled>`\n display: flex;\n align-items: center;\n width: 100%;\n justify-content: end;\n color: #333333;\n\n span {\n margin-bottom: 4px;\n }\n\n @media screen and (max-width: 780px) {\n justify-content: ${(props) => (props.RREnabled ? \"space-between\" : \"end\")};\n } ;\n`;\n\nconst FooterDef = () => {\n const RREnabled = moduleSettings.reservationResponsableEnabled;\n const fontFamily = moduleSettings.fontFamily;\n const poweredBy = (\n <PowerBy RREnabled={RREnabled}>\n {RREnabled && <LogoRR />}\n <Logo />\n </PowerBy>\n );\n\n return (\n <FooterWrapper data-test=\"footer\" fontFamily={fontFamily}>\n {moduleSettings.settings.show_powered_by ? poweredBy : \"\"}\n </FooterWrapper>\n );\n};\nexport const Footer = memo(FooterDef);\n","import React, { memo, useEffect, useState } from \"react\";\nimport { Header } from \"../header/header\";\nimport { MainContent } from \"../main-content/main-content\";\nimport styled, { ThemeContext } from \"styled-components\";\nimport { useParams, useLocation } from \"react-router-dom\";\nimport { requestParamsImpl } from \"../../services/request-params.service\";\n\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { ApiErrorView } from \"../errors/api-error-view\";\nimport { LoaderDots } from \"../loader/loader-dots\";\nimport { Footer } from \"../footer/footer\";\nimport { ApiError } from \"../../services/api-errors\";\nimport { UrlParams } from \"../../types\";\nimport { useTranslation } from \"react-i18next\";\nimport { ThemeManager } from \"../../theme-manager/theme-manager\";\nimport { config } from \"../../config\";\nimport facebookPixelService from \"../../services/facebook-pixel.service\";\nimport WebFont from \"webfontloader\";\n// @ts-ignore\nimport { CookieBanner } from \"@palmabit/react-cookie-law\";\nimport App from \"../../App\";\nimport { createMuiTheme, MuiThemeProvider } from \"@material-ui/core\";\nimport { UpdateFromBookingErrorImpl } from \"../../services/api-errors/api-errors-impl\";\nimport i18n from \"../../i18n\";\nimport { buildRouteWithParams } from \"../../helpers/build-route-with-params\";\n\ninterface IStyled {\n bodyBackgrounColor?: string;\n backgroundImage?: string;\n fontFamily?: string;\n}\n\nexport const MainLayoutWrapper = styled.div<IStyled>`\n position: relative;\n width: 100%;\n min-height: calc(100% - 60px);\n background: ${(props) =>\n props.backgroundImage\n ? `url(${props.backgroundImage}) no-repeat center center fixed`\n : props.bodyBackgrounColor};\n background-size: cover;\n font-family: ${(props) => props.fontFamily};\n`;\n\nconst MainLayoutDef = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const params: any = useParams();\n const searchParams = new URLSearchParams(location.search);\n const hashParams = new URLSearchParams(location.hash.replace(\"#\", \"?\"));\n const [moduleInitialized, setModuleInitialized] = useState(false);\n //const [moduleIsRefreshing, setModuleIsRefreshing] = useState(false);\n const [apiError, setApiError] = useState<ApiError>();\n const urlParams = useParams<UrlParams>();\n const backgroundImageUrl = moduleSettings.backgroundImageUrl;\n const overwrittenBackgroundColor =\n requestParamsImpl.overwrittenBackgroundColor();\n let bodyBackgroundColor = moduleSettings.bodyBackgroundColor;\n if (overwrittenBackgroundColor) {\n bodyBackgroundColor = overwrittenBackgroundColor;\n } else if (backgroundImageUrl) {\n bodyBackgroundColor = \"transparent\";\n }\n\n const [redirectToHome, setRedirectToHome] = useState(false);\n\n if (location.pathname.includes(\"update_from_email\")) {\n config.routes.base = `/instabook/bookings/${params.bookingId}/update_from_email`;\n }\n\n const fontFamily = moduleSettings.fontFamily;\n\n const muiTheme = createMuiTheme({\n typography: {\n fontFamily: fontFamily,\n },\n palette: {\n secondary: {\n main: \"#808080\",\n },\n },\n overrides: {\n MuiInputLabel: {\n root: {\n fontSize: 12,\n },\n },\n MuiFormControlLabel: {\n label: {\n fontSize: 12,\n },\n },\n },\n });\n\n useEffect(() => {\n WebFont.load({\n google: {\n families: [fontFamily],\n },\n });\n }, [moduleInitialized]);\n\n requestParamsImpl.set(urlParams, searchParams, hashParams);\n\n useEffect(() => {\n moduleSettings.initModuleSettings().subscribe(\n () => {\n setModuleInitialized(true);\n moduleSettings.moduleInitialized = true;\n if (location.pathname.includes(\"update_from_email\")) {\n if (moduleSettings.isUpdateFromBookingError) {\n const e: UpdateFromBookingErrorImpl =\n new UpdateFromBookingErrorImpl(\n moduleSettings.computeUpdateFromBookingErrorMessage(\n i18n.language\n )!\n );\n setApiError(e);\n }\n }\n document.title =\n moduleSettings.getRestaurantName() + \" - \" + t(\"instabook.booking\");\n },\n (e: ApiError) => {\n setApiError(e);\n }\n );\n }, []);\n\n if (redirectToHome) {\n return <App />;\n }\n\n if (!moduleInitialized && !apiError) {\n return <LoaderDots />;\n }\n\n const content = apiError ? (\n <ApiErrorView error={apiError} isLayout={moduleInitialized} />\n ) : (\n <MainContent />\n );\n const onHeaderClick = () => {\n if (location.pathname.includes(\"update_from_email\")) {\n config.routes.base = \"/instabook/bookings\";\n window.location.href = buildRouteWithParams(\n config.routes.selection,\n false\n );\n }\n setRedirectToHome(true);\n };\n return (\n <MuiThemeProvider theme={muiTheme}>\n <MainLayoutWrapper\n data-test=\"main-content\"\n bodyBackgrounColor={bodyBackgroundColor}\n backgroundImage={backgroundImageUrl}\n fontFamily={fontFamily}\n id=\"main-content\"\n >\n <ThemeContext.Provider value={ThemeManager.getTheme()}>\n {moduleInitialized && <Header onHeaderClick={onHeaderClick} />}\n {content}\n </ThemeContext.Provider>\n </MainLayoutWrapper>\n <Footer />\n {moduleInitialized && moduleSettings.hasFacebookPixel() && (\n <CookieBanner\n message={\n <span\n dangerouslySetInnerHTML={{\n __html: t(\"instabook.cookie_banner.text\"),\n }}\n />\n }\n wholeDomain={true}\n privacyPolicyLinkText={t(\"instabook.cookie_banner.policy_text\")}\n necessaryOptionText={t(\n \"instabook.cookie_banner.necessary_option_text\"\n )}\n preferencesOptionText={t(\n \"instabook.cookie_banner.preferences_option_text\"\n )}\n statisticsOptionText={t(\n \"instabook.cookie_banner.statistics_option_text\"\n )}\n marketingOptionText={t(\n \"instabook.cookie_banner.marketing_option_text\"\n )}\n acceptButtonText={t(\"instabook.cookie_banner.accept_button_text\")}\n declineButtonText={t(\"instabook.cookie_banner.decline_button_text\")}\n managePreferencesButtonText={t(\n \"instabook.cookie_banner.manage_preferences_button_text\"\n )}\n savePreferencesButtonText={t(\n \"instabook.cookie_banner.save_preferences_button_text\"\n )}\n preferencesDefaultChecked={false}\n statisticsDefaultChecked={false}\n marketingDefaultChecked={false}\n onAcceptStatistics={() => {\n facebookPixelService.grantConsent();\n }}\n onDeclineStatistics={() => {\n facebookPixelService.revokeConsent();\n }}\n styles={{\n dialog: {\n position: \"fixed\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n backgroundColor: \"white\",\n zIndex: 10000,\n padding: \"10px\",\n },\n }}\n />\n )}\n </MuiThemeProvider>\n );\n};\n\nexport const MainLayout = memo(MainLayoutDef);\n","import React, { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { config } from \"../../config\";\n\ninterface IPropertyProps {\n name: string;\n value: string;\n}\n\nconst AppPropertiesWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding-top: 50px;\n width: 100%;\n`;\n\nconst AppPropertiesStyle = styled.div`\n background-color: lightGrey;\n color: #000;\n border-radius: 5px;\n padding: 15px 22px;\n width: 50%;\n\n @media screen and (max-width: 768px) {\n width: 100%;\n }\n`;\n\nconst PropertyStyle = styled.div`\n padding-top: 5px;\n padding-bottom: 5px;\n`;\n\nconst PropertyName = styled.span`\n padding: 10px;\n font-weight: bold;\n`;\n\nconst Property = ({ name, value }: IPropertyProps) => {\n return (\n <PropertyStyle>\n <PropertyName>{`${name}: `}</PropertyName>\n <span data-test={`property-value-${name}`}>{value}</span>\n </PropertyStyle>\n );\n};\n\nconst AppPropertiesDef = () => {\n return (\n <AppPropertiesWrapper data-test=\"app-properties\">\n <AppPropertiesStyle>\n <Property name=\"VERSION\" value={`${process.env.REACT_APP_VERSION}`} />\n <Property\n name=\"IB\"\n value={`${process.env.REACT_APP_IB_API_BASE_URL}`}\n />\n <Property name=\"API\" value={config.apiVersion} />\n <Property name=\"Backend\" value={config.minBackendVersion} />\n <Property\n name=\"Locale\"\n value={`${process.env.REACT_APP_DEFAULT_LOCALE}`}\n />\n </AppPropertiesStyle>\n </AppPropertiesWrapper>\n );\n};\n\nexport const AppProperties = memo(AppPropertiesDef);\n","import React, { memo } from \"react\";\n\nconst Error = () => {\n return <div>Restaurant not found</div>;\n};\n\nexport const RestaurantError = memo(Error);\n","import React, { memo, useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useTranslation } from \"react-i18next\";\nimport { useLocation, useParams } from \"react-router-dom\";\nimport { requestParamsImpl } from \"../../services/request-params.service\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { UrlParams } from \"../../types\";\n\ninterface IStyle {\n background: string;\n}\n\nconst LinkButton = styled.a<IStyle>`\n position: absolute;\n line-height: 1;\n background: ${(props) => props.background};\n color: #fff;\n font-size: 16px;\n width: 180px;\n text-align: center;\n display: inline-block;\n padding: 10px;\n text-decoration: none;\n font-weight: bold;\n -moz-border-radius: 4px;\n -webkit-border-radius: 4px;\n border-radius: 4px;\n z-index: 9999;\n cursor: pointer;\n`;\n\nconst Floating = () => {\n const { t, i18n } = useTranslation();\n const urlParams = useParams<UrlParams>();\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const language = searchParams.get(\"language\") || \"fr\";\n const [moduleInitialized, setModuleInitialized] = useState(false);\n const [buttonBackground, setButtonBackground] = useState(\"#20B8CF\");\n const origin = window.location.origin;\n const link = `${origin}/instabook/bookings/v3/${urlParams.referralKey}/?cta=true`;\n\n requestParamsImpl.set(urlParams);\n useEffect(() => {\n moduleSettings.initModuleSettings().subscribe(() => {\n setModuleInitialized(true);\n setButtonBackground(moduleSettings.primaryColor);\n });\n }, []);\n\n useEffect(() => {\n i18n.changeLanguage(language);\n }, []);\n\n return (\n <>\n {moduleInitialized && (\n <LinkButton\n href={link}\n background={buttonBackground}\n className=\"open-module-button\"\n >\n {t(\"floating_button.text\")}\n </LinkButton>\n )}\n </>\n );\n};\n\nexport const FloatingButton = memo(Floating);\n","import { Endpoint } from \"./BaseEndpoint\";\n\nexport class ContactsEndpoint extends Endpoint {\n constructor() {\n super(\"contacts\");\n }\n}\n\nexport class SubscribeToNewsletterEndpoint extends ContactsEndpoint {\n constructor() {\n super();\n this.endPoint += \"/subscribe_to_newsletter\";\n }\n}","import { Contact } from \"../types\";\n\nclass ContactStore {\n private _contact: Contact = {} as Contact;\n\n set contact(contact_: Contact) {\n this._contact = contact_;\n }\n\n get contact(): Contact {\n return this._contact;\n }\n}\n\nexport const contactStore = new ContactStore();","import { Observable } from \"rxjs\";\nimport { SubscribeToNewsletterEndpoint } from \"src/endpoints/ContactsEndpoint\";\nimport { contactStore } from \"src/stores/contact.store\";\nimport { getHttpService } from \"../services/http.service\";\nconst httpService = getHttpService();\nexport const subscribeToNewsletter = (): Observable<any> => {\n const contactDetails = contactStore.contact;\n const endpoint = new SubscribeToNewsletterEndpoint();\n return httpService.post(endpoint, { contact: { ...contactDetails } });\n};\n","import React, { memo, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n ConfirmationFormLayout,\n ConfirmationFormWrapper,\n ContactLine,\n} from \"../confirmation/confirmation-contact-form/confirmation-contact-form\";\nimport { ConfirmationLayoutWrapper } from \"../confirmation/confirmation-layout\";\nimport { GolContactNameField } from \"../confirmation/confirmation-contact-form/gol-contact-name-field\";\nimport { GolContactFormContext } from \"../confirmation/confirmation-contact-form/gol-contact-form-interfaces\";\nimport { ContinueButton } from \"../continue-button/continue-button\";\nimport { subscribeToNewsletter } from \"../../requests/subscribe-to-newsletter\";\nimport { contactStore } from \"../../stores/contact.store\";\nimport { Contact } from \"../../types\";\nimport { Loader } from \"../loader/loader\";\nimport { ErrorMessage } from \"../errors/message-error-view\";\nimport { GolCheckField } from \"../confirmation/confirmation-contact-form/gol-check-field\";\nimport { Title } from \"../title/title\";\nimport styled from \"styled-components\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { setDangerouslyInnerHtml } from \"../../helpers/set-inner-html\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { getLanguageSwitcherService } from \"../../services/language-switcher.service\";\nimport { last } from \"cypress/types/lodash\";\n\nconst SuccessWrapper = styled.div`\n display: flex;\n justify-content: center;\n margin: auto;\n`;\n\nconst NewsletterFormWrapper = styled(ConfirmationFormWrapper)`\nbackground-color: ${(props) => props.theme.backgroundColor};\nborder: 1px solid #F8F8F8;\nbox-sizing: border-box;\nborder-radius: ${(props) =>\n props.theme.isBackground ? \"0 8px 8px 8px\" : \"8px\"};\nbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);\n`;\n\nconst _NewsletterForm = () => {\n const [submitSubscription, setSubmitSubscription] = useState(false);\n const [messageError, setMessageError] = useState(\"\");\n const [subscriptionSucceed, setSubscriptionSucceed] = useState(false);\n const [subscriptionFailed, setSubscriptionFailed] = useState(false);\n const [loading, setLoading] = useState(false);\n const [fieldsInErrors, setFieldsInErrors] = useState<string[]>([]);\n const [policy, setPolicy] = useState(\"\");\n const { t, i18n } = useTranslation();\n const form = useRef({\n firstname: undefined,\n lastname: undefined,\n email: undefined,\n restaurant_id: parseInt(moduleSettings.getRestaurantId()),\n });\n useEffect(() => {\n const localeUrl = getLanguageSwitcherService().golLocaleFromSwitcher(\n i18n.language\n );\n setPolicy(`${moduleSettings.privacyPolicyUrl}&locale=${localeUrl}`);\n }, [i18n.language]);\n\n useEffect(() => {\n if (submitSubscription) {\n setLoading(true);\n const {\n firstname,\n lastname,\n email,\n restaurant_id,\n } = form.current;\n contactStore.contact = { firstname: firstname ?? \"\", lastname: lastname ?? \"\", email: email ?? \"\", restaurant_id } as Contact\n const subscription = subscribeToNewsletter().subscribe({\n next: (resp: Contact) => {\n contactStore.contact = resp;\n setSubscriptionSucceed(true);\n setSubscriptionFailed(false);\n setLoading(false);\n },\n error: (error) => {\n setSubscriptionSucceed(false);\n setLoading(false);\n setSubscriptionFailed(true);\n setMessageError(error.response.data[\"error\"]);\n },\n });\n return () => {\n subscription.unsubscribe();\n };\n }\n }, [submitSubscription]);\n const requiredFields = [\"lastname\", \"firstname\", \"email\", \"terms\"];\n\n const handleFormChange = (event: {\n target: { name: any; value: any; checked: any; valueAsDate: any };\n }) => {\n const { name, value, checked } = event.target;\n let defaultValue = value || undefined;\n // Update state\n // Assign new value to the appropriate form field\n form.current = {\n ...form.current,\n [name]: checked ? checked : defaultValue,\n };\n\n if ((defaultValue && defaultValue.length) || checked) {\n const array = [...fieldsInErrors];\n const index = array.indexOf(name);\n if (index !== -1) {\n array.splice(index, 1);\n setFieldsInErrors(Array.from(new Set(array)));\n }\n }\n };\n\n const fieldFilled = (field: string) => {\n let value = form.current[field];\n if (\"terms\" === field) {\n return value;\n }\n return typeof value !== \"undefined\" && value != null;\n };\n\n const checkFormValidity = () => {\n let updatedFieldsInErrors = [...fieldsInErrors, ...requiredFieldsFilled()];\n setFieldsInErrors(Array.from(new Set(updatedFieldsInErrors)));\n if (updatedFieldsInErrors.length === 0) {\n setSubmitSubscription(true);\n } else {\n setSubmitSubscription(false);\n }\n };\n\n const rightEmailFormat = (value: string) => {\n return /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(value);\n };\n\n const requiredFieldsFilled = () => {\n let requiredFieldsInError: string[] = [];\n requiredFields.forEach((field) => {\n if (!fieldFilled(field)) {\n requiredFieldsInError.push(field);\n } else if (field === \"email\") {\n if (!rightEmailFormat(form.current[field]!)) {\n requiredFieldsInError.push(field);\n }\n }\n });\n return requiredFieldsInError;\n };\n\n const value = {\n form: form.current,\n handleFormChange,\n fieldsInErrors,\n requiredFields,\n };\n if (loading) {\n return <Loader position={\"fixed\"} />;\n }\n\n if (subscriptionSucceed) {\n return (\n <SuccessWrapper>\n <InformationText\n text={t(\"instabook.newsletter.success\")}\n status=\"success\"\n />\n </SuccessWrapper>\n );\n }\n\n return (\n <>\n <ConfirmationLayoutWrapper>\n <ConfirmationFormLayout>\n <Title\n text={t(\"instabook.newsletter.title\")}\n extraText={t(\"instabook.newsletter.summary\")}\n />\n {subscriptionFailed && (\n <ErrorMessage\n error={\n messageError\n ? t(\"instabook.newsletter.error\", messageError)\n : t(\"instabook.errors.error\")\n }\n status={\"error\"}\n />\n )}\n <NewsletterFormWrapper minHeight={\"130px\"}>\n <GolContactFormContext.Provider value={value}>\n <ContactLine\n data-test=\"firstname-lastname\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n <GolContactNameField\n name={\"firstname\"}\n clazz=\"contactField golFlexOne\"\n />\n <GolContactNameField\n name={\"lastname\"}\n clazz=\"contactField golFlexOne\"\n />\n </ContactLine>\n <ContactLine\n data-test=\"email\"\n className=\"golFlewDirectionResponsiveMode\"\n >\n <GolContactNameField\n clazz=\"contactField golFlexOne\"\n name={\"email\"}\n />\n </ContactLine>\n <GolCheckField\n name=\"terms\"\n label={\n <span\n dangerouslySetInnerHTML={setDangerouslyInnerHtml(\n t,\n \"instabook.newsletter.terms\",\n {\n policy,\n }\n )}\n />\n }\n controlName=\"terms\"\n controlId={\"terms\"}\n />\n </GolContactFormContext.Provider>\n </NewsletterFormWrapper>\n <ContinueButton\n buttonTextKey={t(\"instabook.newsletter.validate\")}\n onClick={checkFormValidity}\n />\n </ConfirmationFormLayout>\n </ConfirmationLayoutWrapper>\n </>\n );\n};\n\nexport const NewsletterForm = memo(_NewsletterForm);\n","import React, { memo } from \"react\"\nimport { NewsletterForm } from \"./newsletter-form\";\nimport { MainContentFlex } from \"../main-content/main-content\";\nimport { InformationText } from \"../information-text/information-text\";\nimport { useTranslation } from \"react-i18next\";\nconst _NewsletterMainContent = () => {\n const { t } = useTranslation();\n return (\n <>\n <MainContentFlex>\n <NewsletterForm />\n </MainContentFlex>\n </>\n );\n\n}\n\nexport const NewsletterMainContent = memo(_NewsletterMainContent);","import React, { memo } from \"react\"\nimport { ThemeManager } from \"../../theme-manager/theme-manager\";\nimport { NewsletterMainContent } from \"./newsletter-main-content\";\nimport { ThemeContext } from \"styled-components\";\nimport { Header } from \"../header/header\";\nimport { Footer } from \"../footer/footer\";\nimport { MainLayoutWrapper } from \"../main-layout/main-layout\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nconst _NewsletterMainLayout = () => {\n const backgroundImageUrl = moduleSettings.backgroundImageUrl;\n const bodyBackgroundColor = backgroundImageUrl\n ? \"transparent\"\n : moduleSettings.bodyBackgroundColor;\n return (\n <MainLayoutWrapper\n data-test=\"newsletter-main-layout\"\n bodyBackgrounColor={bodyBackgroundColor}\n backgroundImage={backgroundImageUrl}\n id=\"newsletter-main-layout\"\n >\n < ThemeContext.Provider value={ThemeManager.getTheme()} >\n <Header />\n <NewsletterMainContent />\n <Footer />\n\n </ThemeContext.Provider >\n\n </MainLayoutWrapper>\n\n )\n};\n\nexport const NewsletterMainLayout = memo(_NewsletterMainLayout);","import React, { memo, useEffect, useState } from \"react\"\nimport { useTranslation } from \"react-i18next\";\nimport { ApiError } from \"../../services/api-errors\";\nimport { moduleSettings } from \"../../stores/module-settings.store\";\nimport { LoaderDots } from \"../loader/loader-dots\";\nimport { requestParamsImpl } from \"../../services/request-params.service\";\nimport { useLocation, useParams } from \"react-router-dom\";\nimport { UrlParams } from \"../../types\";\nimport { ApiErrorView } from \"../errors/api-error-view\";\n\nimport { NewsletterMainLayout } from \"./newsletter-main-layout\";\n\nconst NewsletterLayout = () => {\n const { t } = useTranslation();\n const location = useLocation();\n let searchParams = new URLSearchParams(location.search);\n const [apiError, setApiError] = useState<ApiError>();\n const [moduleInitialized, setModuleInitialized] = useState(false);\n const urlParams = useParams<UrlParams>();\n requestParamsImpl.set(urlParams, searchParams);\n useEffect(() => {\n moduleSettings.initModuleSettings().subscribe(\n () => {\n setModuleInitialized(true);\n document.title =\n moduleSettings.getRestaurantName() + \" - \" + t(\"instabook.newsletter\");\n },\n (e: ApiError) => {\n setApiError(e);\n }\n );\n }, []);\n if (!moduleInitialized && !apiError) {\n return <LoaderDots />;\n }\n const content = apiError ? (\n <ApiErrorView error={apiError} />\n ) : (<NewsletterMainLayout />\n );\n return <>{content}</>\n};\n\nexport const Newsletter = memo(NewsletterLayout)","/// <reference path='./global.d.ts'/>\nimport MetaTags from \"react-meta-tags\";\n\nimport React from \"react\";\nimport { MainLayout } from \"./components/main-layout/main-layout\";\nimport { AppProperties } from \"./components/app-properties/app-properties\";\nimport \"./i18n\";\nimport \"./App.scss\";\nimport styled from \"styled-components\";\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\nimport { config } from \"./config\";\nimport { RestaurantError } from \"./components/errors/restaurant-error/restaurant-error\";\nimport { createMuiTheme, MuiThemeProvider } from \"@material-ui/core\";\nimport { FloatingButton } from \"./components/floating-button/floating-button\";\nimport * as Sentry from \"@sentry/react\";\nimport { BrowserTracing } from \"@sentry/tracing\";\nimport { ApiErrorImpl } from \"./services/api-errors/api-errors-impl\";\nimport { moduleSettings } from \"./stores/module-settings.store\";\nimport { pendingBookingStore } from \"./stores/pending-booking.store\";\nimport { Newsletter } from \"./components/newsletter/newsletter\";\n\nconst AppStyle = styled.div`\n color: gray;\n`;\n\nconst muiTheme = createMuiTheme({\n palette: {\n secondary: {\n main: \"#808080\",\n },\n },\n overrides: {\n MuiFormLabel: {\n root: {\n fontSize: 12,\n },\n },\n MuiInputLabel: {\n root: {\n fontSize: 12,\n },\n },\n MuiFormControlLabel: {\n label: {\n fontSize: 12,\n },\n },\n },\n});\n\nif (process.env.REACT_APP_ENABLED_SENTRY == \"true\") {\n Sentry.init({\n dsn: process.env.REACT_APP_DSN,\n environment: process.env.REACT_APP_PLATFORM,\n debug: process.env.REACT_APP_ENABLED_SENTRY_DEBUG\n ? process.env.REACT_APP_ENABLED_SENTRY_DEBUG == \"true\"\n : false,\n release: process.env.REACT_APP_VERSION,\n integrations: [new BrowserTracing()],\n\n // Set tracesSampleRate to 1.0 to capture 100%\n // of transactions for performance monitoring.\n // We recommend adjusting this value in production\n tracesSampleRate: 0.5,\n beforeSend(event, hint) {\n event.user = { id: moduleSettings.monitoringUserId };\n let prepayment = pendingBookingStore.pendingBooking.prepayment;\n let ppt = {};\n if (prepayment) {\n ppt = {\n acc: prepayment.stripe_account,\n key: prepayment.stripe_key,\n id: prepayment.intent_id,\n kind: prepayment.kind,\n ppt: prepayment.payment_kind,\n };\n }\n const withoutSentitiveInfo = {\n ...pendingBookingStore.pendingBooking,\n contact_info: {},\n prepayment: {},\n ppt,\n };\n\n event.contexts = {\n store: { pendingBooking: JSON.stringify(withoutSentitiveInfo) },\n };\n if (\n hint.originalException &&\n hint.originalException instanceof ApiErrorImpl\n )\n if (\n event.exception &&\n event.exception.values &&\n event.exception.values.length == 1 &&\n event.exception.values[0].value\n )\n event.exception.values[0].value = (\n hint.originalException as ApiErrorImpl\n ).code;\n return event;\n },\n });\n}\n\nfunction App() {\n return (\n <MuiThemeProvider theme={muiTheme}>\n <MetaTags>\n <meta name=\"robots\" content=\"noindex\" />\n </MetaTags>\n <AppStyle>\n <Router>\n <Switch>\n <Route path=\"/__version__\">\n <AppProperties />\n </Route>\n <Route path={config.routes.floatingButton}>\n <FloatingButton></FloatingButton>\n </Route>\n <Route path={config.routes.newsletter}>\n <Newsletter />\n </Route>\n <Route path={config.routes.url}>\n <MainLayout />\n </Route>\n <Route>\n <RestaurantError />\n </Route>\n </Switch>\n </Router>\n </AppStyle>\n </MuiThemeProvider>\n );\n}\n\nexport default Sentry.withProfiler(App);\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ninterface Config {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n}\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n // This web app is being served cache-first by a service\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n // console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n // No internet connection found. App is running in offline mode.\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n // console.error(error.message);\n });\n }\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport \"./react-dates.css\";\nimport \"./icomoon-style.css\";\nimport App from \"./App\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport \"./i18n\";\n\nReactDOM.render(<App />, document.getElementById(\"root\"));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}