@dv4resi/dvss-backend-module-offering-im 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app.service.ts","../src/app.controller.ts","../../../packages/dvss-integration-trybe/src/load-env.ts","../../../packages/dvss-integration-trybe/src/app.service.ts","../../../packages/dvss-integration-trybe/src/app.controller.ts","../../../packages/dvss-integration-libs/src/app.service.ts","../../../packages/dvss-integration-libs/src/app.controller.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/constants/http.constant.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/logging/request-logger.service.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/rate-limiter/rate-limiter.service.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/gateway/traffic-gateway.service.ts","../../../packages/dvss-integration-libs/src/load-env.ts","../../../packages/dvss-integration-libs/src/app.module.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/constants/traffic-router.constant.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/auth/auth.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/credit-management.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/capability-integration.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/wellness-management.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/wellness/wellness-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/credit-management/credit-booking.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/customer-management/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/package-management/package-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/contact-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/credit-note-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/customer-payment-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/invoice-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/loa-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/tax-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/payment.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/payment-method-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/user-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/membership/subcapabilities/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/membership/subcapabilities/membership-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/integration-configuration/integration-configuration.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/integration-resource-management/integration-resource-management.base.ts","../../../node_modules/src/entity.ts","../../../node_modules/src/column.ts","../../../node_modules/src/column-builder.ts","../../../node_modules/src/table.ts","../../../node_modules/src/pg-core/table.ts","../../../node_modules/src/pg-core/foreign-keys.ts","../../../node_modules/src/tracing-utils.ts","../../../node_modules/src/pg-core/unique-constraint.ts","../../../node_modules/src/pg-core/utils/array.ts","../../../node_modules/src/pg-core/columns/common.ts","../../../node_modules/src/pg-core/columns/enum.ts","../../../node_modules/src/subquery.ts","../../../node_modules/src/tracing.ts","../../../node_modules/src/view-common.ts","../../../node_modules/src/sql/sql.ts","../../../node_modules/src/sql/expressions/conditions.ts","../../../node_modules/src/sql/expressions/select.ts","../../../node_modules/src/utils.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-configuration.dao.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-user-management.dao.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-resource-management.dao.ts","../../../packages/dvss-integration-trybe/src/capabilities/customer-management/customer-management.service.ts","../../../packages/dvss-integration-trybe/src/utils/url.utils.ts","../../../packages/dvss-integration-trybe/src/capabilities/auth/auth.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/credit-management/credit-booking.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/credit-management/credit-booking.service.ts","../../../packages/dvss-integration-trybe/src/utils/date.util.ts","../../../packages/dvss-integration-trybe/src/utils/pagination.util.ts","../../../packages/dvss-integration-trybe/src/models/wellness-management.model.ts","../../../packages/dvss-integration-trybe/src/models/integration-resource-management.model.ts","../../../packages/dvss-integration-trybe/src/capabilities/wellness/wellness-management.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/wellness/wellness-management.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-configuration/integration-configuration.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-configuration/integration-configuration.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-resource-management/integration-resource-management.service.ts","../../../packages/dvss-integration-trybe/src/app.module.ts","../src/app.module.ts"],"names":["AppService","getHello","AppController","appService","rootEnvPath","resolve","__dirname","config","path","console","log","name","HTTP_METHOD","IntegrationRequestLoggerService","className","logger","logRequest","logData","loggedInUserId","method","url","headers","requestBody","info","SYSTEM_USER_ID","integrationId","timestamp","Date","logResponse","statusCode","duration","responseBody","logError","error","logIntegrationRequest","undefined","RateLimiterService","validateAndEnforceRateLimit","TrafficGatewayService","httpService","requestLogger","rateLimiter","executeIntegrationRequest","request","integration","_context","startTime","now","prepareHeaders","requestConfig","prepareRequestConfig","fullUrl","constructFullUrl","baseUrl","id","apiMethod","body","apiResponse","executeHttpRequest","responseData","data","status","errorDetails","extractErrorDetails","platformConfig","apiMessage","err","message","headerType","POST","PUT","PATCH","responseType","requestUrl","normalizedBaseUrl","endsWith","slice","normalizedRequestUrl","startsWith","GET","firstValueFrom","get","post","put","patch","DELETE","delete","Error","String","errorObject","response","firstString","keys","k","v","trim","AppModule","imports","ConfigModule","forRoot","envFilePath","isGlobal","HttpModule","LoggerModule","controllers","providers","exports","TRAFFIC_ROUTER_CONFIGURATION_STORE_KEY","BaseAuth","CREDIT_TYPE_ENUM","CREDIT_STATUS_ENUM","CREDIT_FILTER_BY_ENUM","INTEGRATION_PROVIDER_ENUM","BOOKABLE_ITEM_TYPE_ENUM","BOOKABLE_ITEM_STATUS_ENUM","BaseWellnessManagement","BaseCreditBooking","BaseCustomerManagement","BasePackageManagement","BaseAccountingContactManagement","BaseAccountingCreditNoteManagement","BaseAccountingCustomerManagement","BaseAccountingCustomerPaymentManagement","BaseAccountingInvoiceManagement","BaseAccountingLOAManagement","BaseAccountingTaxManagement","BasePayment","BasePaymentMethodManagement","BasePaymentUserManagement","BaseMembershipCustomerManagement","BaseMembershipManagement","BaseIntegrationConfiguration","fileName","integrationConfigurationDao","commonValidationDatabaseService","validateAddCapabilityIntegrationInput","input","context","getProject","projectId","propertyId","getProperty","parentId","parentIntegration","getCapabilityIntegration","capabilityIntegrationId","capability","capabilityProvider","Promise","all","getCapability","capabilityId","getCapabilityProvider","capabilityProviderId","providerId","type","category","addCapabilityIntegration","addCapabilityIntegrationInput","createdBy","availableFor","configuredFor","result","updateCapabilityIntegration","validateIconAndNickName","updateData","configToUpdate","existingConfig","existingIntegrationConfig","integrationConfig","existingPlatformConfig","updateDataForDao","nickname","icon","updatedBy","meta","iconName","getCapabilityIntegrations","getCapabilityIntegrationById","fetchBy","getCapabilityIntegrationByProvider","configuredForType","configuredForId","BigInt","BaseIntegrationResourceManagement","integrationResourceManagementDao","addResourceToIntegration","offeringId","toString","addResult","addCapabilityIntegrationMapping","CONFIGURED_FOR_TYPE_ENUM","OFFERING","ids","idsCount","length","removeResourceFromIntegration","removeCapabilityIntegrationMapping","updateOfferingIntegrationResourceConfiguration","updateCapabilityIntegrationConfiguration","Column","ColumnBuilder","Table","schema","PgTable","ForeignKeyBuilder","ForeignKey","UniqueConstraintBuilder","UniqueOnConstraintBuilder","UniqueConstraint","value","startFrom","PgColumnBuilder","ref","actions","PgColumn","ExtraConfigColumn","IndexedColumn","PgArrayBuilder","PgArray","PgEnumColumnBuilder","PgEnumColumn","Subquery","sql","WithSubquery","FakePrimitiveParam","StringChunk","SQL","Name","Param","param","placeholder","Aliased","Placeholder","View","IntegrationConfigurationDao","conn","transaction","tx","integrationResult","insert","capabilityIntegration","values","$returningId","rollback","insertData","CAPABILITY_INTEGRATION_STATUS_ENUM","ACTIVE","createdAt","capIntegResourceMapping","query","findFirst","where","and","eq","isNull","deletedAt","update","set","affectedRows","conditions","CAPABILITY_TYPE_ENUM","INTEGRATION","push","select","getTableColumns","resourceMappingId","resourceMappingConfig","provider","providerIntegrationType","from","innerJoin","leftJoin","count","options","MAX_RECORDS_LENGTH","offset","page","sorting","sortBy","by","updatedAt","sortOrder","order","SORTING_ORDER_ENUM","ASC","asc","desc","searchTerm","search","shouldJoinCapability","Boolean","filters","some","filter","whereConditions","applyFilters","searchPattern","isNotNull","countWhereConditions","countQueryBuilder","as","countQueryWithJoins","countQueryWithPropertyJoin","PROPERTY","countQuery","baseQuery","finalQuery","totalCount","records","execute","then","limit","orderBy","Number","filterValues","valuePlaceholders","map","joinedValues","join","parentConditions","upperValue","toUpperCase","orCondition","or","DB_CONNECTION","IntegrationUserManagementDao","IntegrationResourceManagementDao","insertResult","raw","insertedId","insertId","isInserted","checkMappingExists","deleteResult","deletedBy","isSuccess","getCapabilityIntegrationResourceMappingById","rows","updateResult","TrybeCustomerManagement","trafficGatewayService","createCustomer","searchCustomer","email","customerId","updateCustomer","deleteCustomer","isValidHttpUrl","urlString","URL","protocol","TrybeAuthService","trybeCustomerManagement","validateConfig","Object","apiKey","siteId","organisationId","Authorization","testIntegration","validatedIntegration","fetchAccessToken","mapStatus","t","redeemed_at","REDEEMED","revoked_at","REVOKED","expires_at","EXPIRED","mapTrybeCreditsToSystem","res","groups","Map","key","coupon_name","split","list","index","items","first","couponCodes","i","coupon_code","description","coupon_description","COUPON","externalId","expiresAt","expiresDate","startsAt","issued_at","startDate","quantity","integrationDetails","customer_id","membershipId","membership_id","multiUse","multi_use","redeemedAt","revokedAt","TrybeCreditBooking","trybeAuthService","fetchCustomerCredits","URLSearchParams","opts","statusFilterValues","STATUS","includes","queryString","formatDateForTrybe","date","isStartOfDay","year","getFullYear","month","getMonth","padStart","day","getDate","hours","minutes","seconds","extractTimeFromIsoString","isoString","timeMatch","match","snakeToCamel","str","replaceAll","_","letter","convertKeysToCamelCase","object","Array","isArray","item","converted","entries","fetchAllPages","firstPageResponse","shouldFetchAll","fetchPage","lastPage","last_page","pageResponse","TRYBE_OFFERING_TYPE_ENUM","TRYBE_OFFERING_TYPE_API","APPOINTMENT","SESSION","COURSE","TRYBE_SUPPORTED_JOURNEYS_ENUM","TRYBE_CATALOGING_BY_ENUM","TRYBE_WEEKDAYS_MAPPING","monday","DAY_OF_WEEK","MON","tuesday","TUE","wednesday","WED","thursday","THU","friday","FRI","saturday","SAT","sunday","SUN","mapTrybeImageToMedia","image","originalUrl","original_url","file_name","mimeType","mime_type","mapTrybeWeekdays","weekdays","toLowerCase","mapTrybePriceRuleToPriceMeta","priceRule","currency","normalizedCurrency","price","configuredForDays","mapTrybePriceRulesToPrices","priceRules","externalResourceId","label","pricesMeta","mapTrybeAppointmentToBookableItem","appointment","linkedItems","primaryAsset","prices","price_rules","linkedBookableItems","updated_at","productCode","product_code","siteIds","site_ids","roomIds","room_ids","equipmentIds","equipment_ids","practitionerIds","practitioner_ids","durations","endBuffer","end_buffer","startTimeInterval","start_time_interval","maxAdvanceBookingsInterval","max_advance_bookings_interval","minAdvanceBookingsInterval","min_advance_bookings_interval","tagIds","tag_ids","tags","categoryIds","category_ids","offeredOnline","offered_online","private","visibility","customersOnly","customers_only","membersOnly","members_only","membershipBookingWindowsEnabled","membership_booking_windows_enabled","membershipBookingWindows","membership_booking_windows","trybeMeta","upsellOfferings","upsell_offerings","crossSellOfferings","cross_sell_offerings","relatedRetailOfferings","related_retail_offerings","customerCancellationPermitted","customer_cancellation_permitted","customerCancellationMinDuration","customer_cancellation_min_duration","minGuests","min_guests","maxGuests","max_guests","allocateMultiCapacityRooms","allocate_multi_capacity_rooms","enquiriesEnabled","enquiries_enabled","revenueCentre","revenue_centre","includePricingOnCalendar","include_pricing_on_calendar","maxPerBasket","max_per_basket","maxPerGuest","max_per_guest","shopPractitionerSelectionEnabled","shop_practitioner_selection_enabled","deleted_at","mapTrybeSessionToBookableItem","session","site_id","maxBookingsPerMember","max_bookings_per_member","waitlistEnabled","waitlist_enabled","maxBasketsPerSession","max_baskets_per_session","recurrenceGroups","recurrence_groups","mapTrybeCourseToBookableItem","course","couponId","coupon_id","offerings","offering","offeringType","offering_type","offering_id","offeringName","offering_name","creditsValidityInterval","credits_validity_interval","availabilityRules","availability_rules","mapTrybeCategoryToBookableItemCategory","voucherApplicable","voucher_applicable","mapTrybePractitionerToOfferingResource","practitioner","media","avatar","OFFERING_RESOURCE_TYPE","PEOPLE","organisation_id","appointmentRestrictions","appointment_restrictions","zones","canOfferTags","can_offer_tags","created_at","mapTrybeAppointmentsToSystemResponse","appointments","courseLookup","apt","linkedCourses","courseIndex","mapTrybeSessionsToSystemResponse","sessions","mapTrybeCoursesToSystemResponse","courses","mapTrybeCategoriesToSystemResponse","categories","mapTrybePractitionersToSystemResponse","practitioners","mapTrybeOfferingTypeToBookableItemType","mapTrybeCouponCodeOfferingToBookableItem","mapTrybeCouponCodeOfferingsToSystemResponse","groupByDate","getDateKey","mapTrybeSessionAvailabilityToSystemResponse","filtered","s","remaining_capacity","grouped","dateMatch","start_time","dates","sessionList","time","fromTime","toTime","end_time","endTime","camelCaseMeta","sort","a","b","getTime","mapTrybeAppointmentAvailabilityToSystemResponse","slots","quantity_available","slotList","slot","TrybeWellnessManagement","fetchWellnessAppointmentSession","checkWellnessAppointmentSessionAvailability","createWellnessAppointmentSessionOrder","addWellnessAppointmentSessionOrderItems","confirmWellnessAppointmentSessionOrder","createOrder","orderId","validated","addCustomerToOrder","getOrder","bookableItem","bookableItems","orderItemResponse","addItemToOrder","guestIds","guests","g","offeringResources","r","durationMinutes","durationInMinutes","timeIso","bookingStartTime","toISOString","sessionId","totalPrice","netTotal","currencyMultiplier","customerCreditId","addCustomerCreditsToOrder","submitOrder","externalBookingId","orderReference","cancelOrder","source","guestCount","order_ref","booking_items","mapOfferingTypeToTrybeApi","guest_ids","item_configuration","skip_availability_checks","session_id","booking_summary","type_name","net_total","updateOrder","itemId","updateResponse","updateOrderItem","success","bookingStartTimeLabel","bookingStartDateLabel","convertDateOnlyToTimestamp","timezone","addPaymentToOrder","amount","paymentTypeId","processor","processor_data","notes","payment_type_id","fetchAppointments","shouldFetchAllAppointments","apiUrl","totalRecords","total","fetchSessions","shouldFetchAllSessions","fetchCourses","shouldFetchAllCourses","fetchPractitioners","shouldFetchAllPractitioners","fetchCategories","shouldFetchAllCategories","fetchBookableItemsFromCredit","couponCodeId","fetchSessionAvailabilityForOffering","formattedDateTimeFrom","dateTimeFrom","formattedDateTimeTo","dateTimeTo","externalOfferingBookableItemId","encodeURIComponent","fetchAppointmentAvailabilityForOffering","mapTrybeSiteResponseToSystem","customPaymentTypes","custom_payment_types","paymentType","kind","TrybeIntegrationConfigurationService","validateCapabilityIntegrationConfiguredForInput","getOffering","getSiteDetailedInformation","OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS","VALID_JOURNEY_VALUES","Set","TrybeIntegrationResourceManagementService","validateResourceMappingConfig","supportedJourneys","CustomException","ERROR_NAMES","BAD_REQUEST","catalogingBy","PEOPLE_RESOURCE","journey","has","isMappingExists","resourceMapping","IntegrationLibsModule","DatastoreModule","CommonValidationDatabaseService","IntegrationTrybeModule"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAMA,aAAN,MAAMA;AAAAA,EAAAA;;;EACX,WAAA,GAAc;AAEd,EAAA;EAEAC,QAAAA,GAAmB;AACjB,IAAA,OAAO,cAAA;AACT,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;ACPO,IAAMC,gBAAN,MAAMA;AAAAA,EAAAA;;;;AACX,EAAA,WAAA,CAA6BC,UAAAA,EAAwB;SAAxBA,UAAAA,GAAAA,UAAAA;AAAyB,EAAA;EAGtDF,QAAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAKE,WAAWF,QAAAA,EAAQ;AACjC,EAAA;AACF,CAAA;;;;;;;;;;;;;;ACAA,IAAMG,WAAAA,GAAcC,YAAAA,CAAQC,SAAAA,EAAW,eAAA,CAAA;AACvCC,aAAAA,CAAO;EAAEC,IAAAA,EAAMJ;AAAY,CAAA,CAAA;;;;;;;;;;;;ACTpB,IAAMJ,cAAN,MAAMA;AAAAA,EAAAA;;;;;;EAIX,WAAA,GAAc;AAEd,EAAA;EAEAC,QAAAA,GAAmB;AACjBQ,IAAAA,OAAAA,CAAQC,GAAAA,CAAI,CAAA,EAAG,IAAA,CAAK,WAAA,CAAYC,IAAI,CAAA,UAAA,CAAY,CAAA;AAChD,IAAA,OAAO,cAAA;AACT,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;ACXO,IAAMT,iBAAN,MAAMA;AAAAA,EAAAA;;;;AACX,EAAA,WAAA,CAA6BC,UAAAA,EAAwB;SAAxBA,UAAAA,GAAAA,UAAAA;AAAyB,EAAA;EAGtDF,QAAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAKE,WAAWF,QAAAA,EAAQ;AACjC,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;;;ACRO,IAAMD,cAAN,MAAMA;AAAAA,EAAAA;;;EACXC,QAAAA,GAAmB;AACjB,IAAA,OAAO,cAAA;AACT,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;;ACHO,IAAMC,iBAAN,MAAMA;AAAAA,EAAAA;;;;AACX,EAAA,WAAA,CAA6BC,UAAAA,EAAwB;SAAxBA,UAAAA,GAAAA,UAAAA;AAAyB,EAAA;EAGtDF,QAAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAKE,WAAWF,QAAAA,EAAQ;AACjC,EAAA;AACF,CAAA;;;;;;;;;;;;;;;;ACRO,IAAKW,WAAAA,6BAAAA,YAAAA,EAAAA;;;;;;AAAAA,EAAAA,OAAAA,YAAAA;;;;;;;;;;;;;ACyBCC,uCAAAA,GAAN,MAAMA,gCAAAA,CAAAA;AAAAA,EAAAA;;;;AACMC,EAAAA,SAAAA,GAAYD,gCAAAA,CAAgCF,IAAAA;AAE7D,EAAA,WAAA,CAA6BI,MAAAA,EAAuB;SAAvBA,MAAAA,GAAAA,MAAAA;AAAwB,EAAA;;;;;;AAOrDC,EAAAA,UAAAA,CAAWC,OAAAA,EAAuC;AAChD,IAAA,MAAM,EAAEC,cAAAA,EAAgBC,MAAAA,EAAQC,GAAAA,EAAKC,OAAAA,EAASC,aAAW,GAAKL,OAAAA;AAE9D,IAAA,IAAA,CAAKF,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,IAAkBM,uCAAAA,EAClB,IAAA,CAAKR,UAAAA,CAAWL,IAAAA,EAChB,IAAA,CAAKG,SAAAA,EACL,CAAA,yBAAA,EAA4BK,MAAAA,CAAAA,CAAAA,EAAUC,GAAAA,CAAAA,CAAAA,EACtC;AACEK,MAAAA,aAAAA,EAAeR,OAAAA,CAAQQ,aAAAA;AACvBN,MAAAA,MAAAA;AACAC,MAAAA,GAAAA;AACAC,MAAAA,OAAAA;AACAC,MAAAA,WAAAA;MACAI,SAAAA,EAAWT,OAAAA,CAAQS,SAAAA,oBAAa,IAAIC,IAAAA;KACtC,CAAA;AAEJ,EAAA;;;;;;AAOAC,EAAAA,WAAAA,CAAYX,OAAAA,EAAuC;AACjD,IAAA,MAAM,EAAEC,cAAAA,EAAgBC,MAAAA,EAAQC,KAAKS,UAAAA,EAAYC,QAAAA,EAAUC,cAAY,GACrEd,OAAAA;AAEF,IAAA,IAAA,CAAKF,OAAOQ,IAAAA,CACVL,cAAAA,IAAkBM,uCAAAA,EAClB,IAAA,CAAKI,YAAYjB,IAAAA,EACjB,IAAA,CAAKG,SAAAA,EACL,CAAA,0BAAA,EAA6BK,MAAAA,CAAAA,CAAAA,EAAUC,GAAAA,MAASS,UAAAA,CAAAA,EAAAA,EAAeC,QAAAA,CAAAA,GAAAA,CAAAA,EAC/D;AACEL,MAAAA,aAAAA,EAAeR,OAAAA,CAAQQ,aAAAA;AACvBN,MAAAA,MAAAA;AACAC,MAAAA,GAAAA;AACAS,MAAAA,UAAAA;AACAC,MAAAA,QAAAA;AACAC,MAAAA,YAAAA;MACAL,SAAAA,EAAWT,OAAAA,CAAQS,SAAAA,oBAAa,IAAIC,IAAAA;KACtC,CAAA;AAEJ,EAAA;;;;;;AAOAK,EAAAA,QAAAA,CAASf,OAAAA,EAAuC;AAC9C,IAAA,MAAM,EACJC,gBACAC,MAAAA,EACAC,GAAAA,EACAS,YACAC,QAAAA,EACAG,KAAAA,EACAF,cAAY,GACVd,OAAAA;AAEJ,IAAA,IAAA,CAAKF,OAAOkB,KAAAA,CACVf,cAAAA,IAAkBM,yCAClB,IAAA,CAAKQ,QAAAA,CAASrB,MACd,IAAA,CAAKG,SAAAA,EACL,0BAA0BK,MAAAA,CAAAA,CAAAA,EAAUC,GAAAA,CAAAA,GAAAA,EAASS,UAAAA,IAAc,KAAA,CAAA,EAAA,EAAUC,QAAAA,IAAY,CAAA,CAAA,GAAA,CAAA,EACjF;AACEL,MAAAA,aAAAA,EAAeR,OAAAA,CAAQQ,aAAAA;AACvBN,MAAAA,MAAAA;AACAC,MAAAA,GAAAA;AACAS,MAAAA,UAAAA;AACAC,MAAAA,QAAAA;AACAG,MAAAA,KAAAA;AACAF,MAAAA,YAAAA;MACAL,SAAAA,EAAWT,OAAAA,CAAQS,SAAAA,oBAAa,IAAIC,IAAAA;KACtC,CAAA;AAEJ,EAAA;;;;;;;AAQAO,EAAAA,qBAAAA,CAAsBjB,OAAAA,EAAuC;AAC3D,IAAA,IAAIA,QAAQgB,KAAAA,EAAO;AACjB,MAAA,IAAA,CAAKD,SAASf,OAAAA,CAAAA;AAChB,IAAA,CAAA,MAAA,IAAWA,OAAAA,CAAQY,UAAAA,IAAcZ,OAAAA,CAAQc,YAAAA,KAAiBI,MAAAA,EAAW;AACnE,MAAA,IAAA,CAAKP,YAAYX,OAAAA,CAAAA;IACnB,CAAA,MAAO;AACL,MAAA,IAAA,CAAKD,WAAWC,OAAAA,CAAAA;AAClB,IAAA;AACF,EAAA;AACF;;;;;;;;;;;;;;;AC9HamB,6BAAN,wBAAA,CAAMA;AAAAA,EAAAA;;;;;;;;AAMX,EAAA,MAAMC,2BAAAA,GAA6C;AAMnD,EAAA;AACF;;;;;;;;;;;;;;;;;ACoBaC,gCAAN,2BAAA,CAAMA;AAAAA,EAAAA;;;;;;EACX,WAAA,CACmBC,WAAAA,EACAC,eACAC,WAAAA,EACjB;SAHiBF,WAAAA,GAAAA,WAAAA;SACAC,aAAAA,GAAAA,aAAAA;SACAC,WAAAA,GAAAA,WAAAA;AAChB,EAAA;;;;;;;;;;;;;AAcH,EAAA,MAAMC,yBAAAA,CACJC,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EAEA2B,QAAAA,EACoB;AACpB,IAAA,MAAMC,SAAAA,GAAYnB,KAAKoB,GAAAA,EAAG;AAE1B,IAAA,IAAI;AAEF,MAAA,MAAM1B,OAAAA,GAAU,IAAA,CAAK2B,cAAAA,CAAeL,OAAAA,CAAAA;AAGpC,MAAA,MAAMM,aAAAA,GAAgB,IAAA,CAAKC,oBAAAA,CAAqBP,OAAAA,EAAStB,OAAAA,CAAAA;AAGzD,MAAA,MAAM,IAAA,CAAKoB,YAAYJ,2BAAAA,EAA2B;AAGlD,MAAA,MAAMc,UAAU,IAAA,CAAKC,gBAAAA,CAAiBT,OAAAA,CAAQU,OAAAA,EAASV,QAAQvB,GAAG,CAAA;AAGlE,MAAA,MAAMH,OAAAA,GAAkC;AACtCQ,QAAAA,aAAAA,EAAemB,WAAAA,CAAYU,EAAAA;AAC3BnC,QAAAA,MAAAA,EAAQwB,OAAAA,CAAQY,SAAAA;QAChBnC,GAAAA,EAAK+B,OAAAA;AACL9B,QAAAA,OAAAA;AACAC,QAAAA,WAAAA,EAAaqB,OAAAA,CAAQa,IAAAA;AACrBtC,QAAAA,cAAAA;AACAQ,QAAAA,SAAAA,sBAAeC,IAAAA;AACjB,OAAA;AAGA,MAAA,IAAA,CAAKa,aAAAA,CAAcxB,WAAWC,OAAAA,CAAAA;AAG9B,MAAA,MAAMwC,cAAc,MAAM,IAAA,CAAKC,kBAAAA,CAC7Bf,OAAAA,EACAQ,SACAF,aAAAA,CAAAA;AAGF,MAAA,MAAMnB,QAAAA,GAAWH,IAAAA,CAAKoB,GAAAA,EAAG,GAAKD,SAAAA;AAC9B,MAAA,MAAMa,eAAeF,WAAAA,CAAYG,IAAAA;AAGjC,MAAA,IAAA,CAAKpB,cAAcZ,WAAAA,CAAY;QAC7B,GAAGX,OAAAA;QACHc,YAAAA,EAAc4B,YAAAA;AACd9B,QAAAA,UAAAA,EAAY4B,WAAAA,CAAYI,MAAAA;AACxB/B,QAAAA;OACF,CAAA;AAEA,MAAA,OAAO6B,YAAAA;AACT,IAAA,CAAA,CAAA,OAAS1B,KAAAA,EAAO;AACd,MAAA,MAAMH,QAAAA,GAAWH,IAAAA,CAAKoB,GAAAA,EAAG,GAAKD,SAAAA;AAC9B,MAAA,MAAMgB,YAAAA,GAAe,IAAA,CAAKC,mBAAAA,CAAoB9B,KAAAA,CAAAA;AAG9C,MAAA,MAAMoB,OAAAA,GAAUT,WAAAA,CAAYrC,MAAAA,CAAOyD,cAAAA,CAAeX,OAAAA;AAClD,MAAA,MAAMF,OAAAA,GAAU,IAAA,CAAKC,gBAAAA,CAAiBC,OAAAA,EAASV,QAAQvB,GAAG,CAAA;AAG1D,MAAA,IAAA,CAAKoB,cAAcR,QAAAA,CAAS;AAC1BP,QAAAA,aAAAA,EAAemB,WAAAA,CAAYU,EAAAA;AAC3BnC,QAAAA,MAAAA,EAAQwB,OAAAA,CAAQY,SAAAA;QAChBnC,GAAAA,EAAK+B,OAAAA;AACL9B,QAAAA,OAAAA,EAASsB,OAAAA,CAAQtB,OAAAA;AACjBC,QAAAA,WAAAA,EAAaqB,OAAAA,CAAQa,IAAAA;AACrBtC,QAAAA,cAAAA;AACAQ,QAAAA,SAAAA,sBAAeC,IAAAA,EAAAA;AACfM,QAAAA,KAAAA,EAAO6B,YAAAA,CAAaG,UAAAA;AACpBpC,QAAAA,UAAAA,EAAYiC,YAAAA,CAAajC,UAAAA;AACzBC,QAAAA,QAAAA;AACAC,QAAAA,YAAAA,EAAc+B,YAAAA,CAAa/B;OAC7B,CAAA;AAGA,MAAA,MAAMmC,GAAAA,GAAMjC,KAAAA;AACZiC,MAAAA,GAAAA,CAAID,aAAaH,YAAAA,CAAaK,OAAAA;AAC9BD,MAAAA,GAAAA,CAAIrC,aAAaiC,YAAAA,CAAajC,UAAAA;AAC9BqC,MAAAA,GAAAA,CAAIC,UAAUL,YAAAA,CAAaG,UAAAA;AAE3B,MAAA,MAAMhC,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;AAUQe,EAAAA,cAAAA,CAAeL,OAAAA,EAAkD;AACvEA,IAAAA,OAAAA,CAAQyB,UAAAA,GAAazB,QAAQyB,UAAAA,IAAc,MAAA;AAE3C,IAAA,MAAM/C,OAAAA,GAAkC;MACtC,GAAIsB,OAAAA,CAAQtB,WAAW;AACzB,KAAA;AAGA,IAAA,IACE,CAACA,OAAAA,CAAQ,cAAA,KACTsB,OAAAA,CAAQyB,UAAAA,KAAe,WACtBzB,OAAAA,CAAQY,SAAAA,KAAc3C,WAAAA,CAAYyD,IAAAA,IACjC1B,QAAQY,SAAAA,KAAc3C,WAAAA,CAAY0D,OAClC3B,OAAAA,CAAQY,SAAAA,KAAc3C,YAAY2D,KAAAA,CAAAA,EACpC;AACAlD,MAAAA,OAAAA,CAAQ,cAAA,CAAA,GAAkB,kBAAA;AAC5B,IAAA;AAGA,IAAA,IAAI,CAACA,OAAAA,CAAQ,QAAA,CAAA,IAAasB,OAAAA,CAAQyB,eAAe,MAAA,EAAQ;AACvD/C,MAAAA,OAAAA,CAAQ,QAAA,CAAA,GAAY,kBAAA;AACtB,IAAA;AAEA,IAAA,OAAOA,OAAAA;AACT,EAAA;;;;;;;;;AAUQ6B,EAAAA,oBAAAA,CACNP,SACAtB,OAAAA,EACyB;AACzB,IAAA,MAAM4B,aAAAA,GAAyC;AAC7C5B,MAAAA;AACF,KAAA;AAEA,IAAA,IAAIsB,QAAQ6B,YAAAA,EAAc;AACxBvB,MAAAA,aAAAA,CAAcuB,eAAe7B,OAAAA,CAAQ6B,YAAAA;AACvC,IAAA;AAEA,IAAA,OAAOvB,aAAAA;AACT,EAAA;;;;;;;;;;AAWQG,EAAAA,gBAAAA,CAAiBC,SAAiBoB,UAAAA,EAA4B;AACpE,IAAA,MAAMC,iBAAAA,GAAoBrB,QAAQsB,QAAAA,CAAS,GAAA,IACvCtB,OAAAA,CAAQuB,KAAAA,CAAM,CAAA,EAAG,EAAC,CAAA,GAClBvB,OAAAA;AACJ,IAAA,MAAMwB,uBAAuBJ,UAAAA,CAAWK,UAAAA,CAAW,GAAA,CAAA,GAC/CL,UAAAA,GACA,IAAIA,UAAAA,CAAAA,CAAAA;AAER,IAAA,OAAO,CAAA,EAAGC,iBAAAA,CAAAA,EAAoBG,oBAAAA,CAAAA,CAAAA;AAChC,EAAA;;;;;;;;;;;;EAaA,MAAcnB,kBAAAA,CACZf,OAAAA,EACAQ,OAAAA,EACAF,aAAAA,EACA;AACA,IAAA,QAAQN,QAAQY,SAAAA;AACd,MAAA,KAAK3C,YAAYmE,GAAAA,EAAK;AACpB,QAAA,OAAO,MAAMC,mBAAAA,CACX,IAAA,CAAKzC,YAAY0C,GAAAA,CAAe9B,OAAAA,EAASF,aAAAA,CAAAA,CAAAA;AAE7C,MAAA;AACA,MAAA,KAAKrC,YAAYyD,IAAAA,EAAM;AACrB,QAAA,OAAO,MAAMW,oBACX,IAAA,CAAKzC,WAAAA,CAAY2C,KACf/B,OAAAA,EACAR,OAAAA,CAAQa,IAAAA,EACRP,aAAAA,CAAAA,CAAAA;AAGN,MAAA;AACA,MAAA,KAAKrC,YAAY0D,GAAAA,EAAK;AACpB,QAAA,OAAO,MAAMU,oBACX,IAAA,CAAKzC,WAAAA,CAAY4C,IAAehC,OAAAA,EAASR,OAAAA,CAAQa,IAAAA,EAAMP,aAAAA,CAAAA,CAAAA;AAE3D,MAAA;AACA,MAAA,KAAKrC,YAAY2D,KAAAA,EAAO;AACtB,QAAA,OAAO,MAAMS,oBACX,IAAA,CAAKzC,WAAAA,CAAY6C,MACfjC,OAAAA,EACAR,OAAAA,CAAQa,IAAAA,EACRP,aAAAA,CAAAA,CAAAA;AAGN,MAAA;AACA,MAAA,KAAKrC,YAAYyE,MAAAA,EAAQ;AACvB,QAAA,OAAO,MAAML,mBAAAA,CACX,IAAA,CAAKzC,YAAY+C,MAAAA,CAAkBnC,OAAAA,EAASF,aAAAA,CAAAA,CAAAA;AAEhD,MAAA;MACA,SAAS;AACP,QAAA,MAAM,IAAIsC,KAAAA,CACR,CAAA,yBAAA,EAA4BC,OAAO7C,OAAAA,CAAQY,SAAS,CAAA,CAAA,CAAG,CAAA;AAE3D,MAAA;AACF;AACF,EAAA;;;;;;;;;;;;;;AAeQQ,EAAAA,mBAAAA,CAAoB9B,KAAAA,EAK1B;AACA,IAAA,MAAMwD,WAAAA,GAAcxD,KAAAA;AAMpB,IAAA,MAAM0B,YAAAA,GAAe8B,YAAYC,QAAAA,EAAU9B,IAAAA;AAC3C,IAAA,MAAMA,OACJ,OAAOD,YAAAA,KAAiB,QAAA,IAAYA,YAAAA,KAAiB,OAChDA,YAAAA,GACDxB,MAAAA;AAEN,IAAA,MAAMwD,WAAAA,8BAAkBC,IAAAA,KAAAA;AACtB,MAAA,KAAA,MAAWC,KAAKD,IAAAA,EAAM;AACpB,QAAA,MAAME,CAAAA,GAAIlC,OAAOiC,CAAAA,CAAAA;AACjB,QAAA,IAAI,OAAOC,CAAAA,KAAM,QAAA,IAAYA,CAAAA,CAAEC,IAAAA,IAAQ,OAAOD,CAAAA;AAChD,MAAA;AACA,MAAA,OAAO3D,MAAAA;IACT,CAAA,EANoB,aAAA,CAAA;AAQpB,IAAA,MAAM8B,UAAAA,GACJ0B,YAAY,SAAA,EAAW,mBAAA,EAAqB,SAAS,QAAA,EAAU,KAAA,CAAA,IAC/DF,WAAAA,CAAYtB,OAAAA,IACZ,WAAA;AAEF,IAAA,OAAO;AACLA,MAAAA,OAAAA,EAASsB,WAAAA,CAAYtB,OAAAA;MACrBtC,UAAAA,EAAY4D,WAAAA,CAAY5B,MAAAA,IAAU4B,WAAAA,CAAYC,QAAAA,EAAU7B,MAAAA;AACxD9B,MAAAA,YAAAA,EAAc0D,YAAYC,QAAAA,EAAU9B,IAAAA;AACpCK,MAAAA;AACF,KAAA;AACF,EAAA;AACF;;;;;;;;;;ACjUA,IAAM7D,YAAAA,GAAcC,YAAAA,CAAQC,SAAAA,EAAW,eAAA,CAAA;AACvCC,aAAAA,CAAO;EAAEC,IAAAA,EAAMJ;AAAY,CAAA,CAAA;;;;;;;;;;ACyBd4F,gCAAN,eAAA,CAAMA;AAAAA,EAAAA;;;AAAW;;;IAvBtBC,OAAAA,EAAS;;AAEPC,MAAAA,mBAAAA,CAAaC,OAAAA,CAAQ;QACnBC,WAAAA,EAAa/F,YAAAA,CAAQC,WAAW,eAAA,CAAA;QAChC+F,QAAAA,EAAU;OAEZ,CAAA;AACAC,MAAAA,gBAAAA;AACAC,MAAAA;;IAEFC,WAAAA,EAAa;AAACtG,MAAAA;;IACduG,SAAAA,EAAW;AACTzG,MAAAA,WAAAA;AACAsC,MAAAA,6BAAAA;AACAzB,MAAAA,uCAAAA;AACAuB,MAAAA;;IAEFsE,OAAAA,EAAS;AACPpE,MAAAA,6BAAAA;AACAzB,MAAAA,uCAAAA;AACAuB,MAAAA;;;;;;AClCG,IAAMuE,sCAAAA,GACX;;;ACYK,IAAeC,WAAf,MAAeA;EARtB;;;AA+CA;;;AC7CO,IAAKC,gBAAAA,6BAAAA,iBAAAA,EAAAA;;;AAAAA,EAAAA,OAAAA,iBAAAA;;AAML,IAAKC,kBAAAA,6BAAAA,mBAAAA,EAAAA;;;;;AAAAA,EAAAA,OAAAA,mBAAAA;;AAOL,IAAKC,qBAAAA,6BAAAA,sBAAAA,EAAAA;;;AAAAA,EAAAA,OAAAA,sBAAAA;;;;ACpBL,IAAKC,yBAAAA,6BAAAA,0BAAAA,EAAAA;;AAAAA,EAAAA,OAAAA,0BAAAA;;;;ACML,IAAKC,uBAAAA,6BAAAA,wBAAAA,EAAAA;;;;AAAAA,EAAAA,OAAAA,wBAAAA;;AAML,IAAKC,yBAAAA,6BAAAA,0BAAAA,EAAAA;;;AAAAA,EAAAA,OAAAA,0BAAAA;;;;ACiBL,IAAeC,yBAAf,MAAeA;EARtB;;;AA8HA;;;ACrIO,IAAeC,oBAAf,MAAeA;EAPtB;;;AAsBA;;;ACXO,IAAeC,yBAAf,MAAeA;EARtB;;;AA0DA;;;AC5DO,IAAeC,wBAAf,MAAeA;EARtB;;;AAgBA;;;ACRO,IAAeC,kCAAf,MAAeA;EARtB;;;AAgCA;;;ACxBO,IAAeC,qCAAf,MAAeA;EARtB;;;AAgCA;;;ACxBO,IAAeC,mCAAf,MAAeA;EARtB;;;AAgDA;;;ACxCO,IAAeC,0CAAf,MAAeA;EARtB;;;AAgBA;;;ACRO,IAAeC,kCAAf,MAAeA;EARtB;;;AAwCA;;;AChCO,IAAeC,8BAAf,MAAeA;EARtB;;;AAgBA;;;ACRO,IAAeC,8BAAf,MAAeA;EARtB;;;AAgBA;;;ACRO,IAAeC,cAAf,MAAeA;EARtB;;;AAwCA;;;AChCO,IAAeC,8BAAf,MAAeA;EARtB;;;AAwCA;;;AChCO,IAAeC,4BAAf,MAAeA;EARtB;;;AAgDA;;;ACxCO,IAAeC,mCAAf,MAAeA;EARtB;;;AAwCA;;;AChCO,IAAeC,2BAAf,MAAeA;EARtB;;;AAwBA;;;;;;;;;;;;ACIaC,uCAAN,kCAAA,CAAMA;AAAAA,EAAAA;;;;;;EACQC,QAAAA,GAAW,mCAAA;EAE9B,WAAA,CACqBC,2BAAAA,EACAC,iCACAvH,MAAAA,EACnB;SAHmBsH,2BAAAA,GAAAA,2BAAAA;SACAC,+BAAAA,GAAAA,+BAAAA;SACAvH,MAAAA,GAAAA,MAAAA;AAClB,EAAA;;;;;EAMH,MAAcwH,qCAAAA,CACZC,OACAC,OAAAA,EASC;AACD,IAAA,MAAM,IAAA,CAAKH,gCAAgCI,UAAAA,CAAW;AACpDC,MAAAA,SAAAA,EAAWH,KAAAA,CAAMG;KACnB,CAAA;AAEA,IAAA,IAAIH,KAAAA,CAAMI,cAAc,IAAA,EAAM;AAC5B,MAAA,MAAM,IAAA,CAAKN,gCAAgCO,WAAAA,CAAY;AACrDD,QAAAA,UAAAA,EAAYJ,KAAAA,CAAMI,UAAAA;AAClBD,QAAAA,SAAAA,EAAWH,KAAAA,CAAMG;OACnB,CAAA;AACF,IAAA;AAEA,IAAA,IAAIH,KAAAA,CAAMM,YAAY,IAAA,EAAM;AAC1B,MAAA,MAAMC,iBAAAA,GACJ,MAAM,IAAA,CAAKV,2BAAAA,CAA4BW,wBAAAA,CACrC;AAAEC,QAAAA,uBAAAA,EAAyBT,KAAAA,CAAMM;AAAS,OAAA,EAC1CL,QAAQvH,cAAc,CAAA;AAE1B,MAAA,IAAI,CAAC6H,iBAAAA,EAAmB;AACtB,QAAA,MAAM,IAAIxD,MAAM,yCAAA,CAAA;AAClB,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,CAAC2D,UAAAA,EAAYC,kBAAAA,CAAAA,GAAsB,MAAMC,QAAQC,GAAAA,CAAI;AACzD,MAAA,IAAA,CAAKhB,4BAA4BiB,aAAAA,CAC/B;AAAEC,QAAAA,YAAAA,EAAcf,KAAAA,CAAMe;AAAa,OAAA,EACnCd,QAAQvH,cAAc,CAAA;AAExB,MAAA,IAAA,CAAKmH,4BAA4BmB,qBAAAA,CAC/B;AAAEC,QAAAA,oBAAAA,EAAsBjB,KAAAA,CAAMiB;AAAqB,OAAA,EACnDhB,QAAQvH,cAAc;AAEzB,KAAA,CAAA;AAED,IAAA,IAAI,CAACgI,UAAAA,EAAY;AACf,MAAA,MAAM,IAAI3D,MAAM,sBAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAI,CAAC4D,kBAAAA,EAAoB;AACvB,MAAA,MAAM,IAAI5D,MAAM,+BAAA,CAAA;AAClB,IAAA;AAEA,IAAA,IAAI2D,UAAAA,CAAWQ,UAAAA,KAAeP,kBAAAA,CAAmB7F,EAAAA,EAAI;AACnD,MAAA,MAAM,IAAIiC,MACR,CAAA,2CAAA,EAA8C2D,UAAAA,CAAW5F,EAAE,CAAA,uBAAA,EAA0B4F,UAAAA,CAAWQ,UAAU,CAAA,CAAE,CAAA;AAEhH,IAAA;AAEA,IAAA,OAAO;MACLR,UAAAA,EAAY;AACV5F,QAAAA,EAAAA,EAAI4F,UAAAA,CAAW5F,EAAAA;AACfqG,QAAAA,IAAAA,EAAMT,UAAAA,CAAWS,IAAAA;AACjBC,QAAAA,QAAAA,EAAUV,UAAAA,CAAWU,QAAAA;AACrBF,QAAAA,UAAAA,EAAYR,UAAAA,CAAWQ;AACzB,OAAA;MACAP,kBAAAA,EAAoB;AAAE7F,QAAAA,EAAAA,EAAI6F,kBAAAA,CAAmB7F;AAAG;AAClD,KAAA;AACF,EAAA;;;;;EAMA,MAAMuG,wBAAAA,CACJrB,OACAC,OAAAA,EACyB;AACzB,IAAA,MAAM,EAAES,YAAYC,kBAAAA,EAAkB,GACpC,MAAM,IAAA,CAAKZ,qCAAAA,CAAsCC,OAAOC,OAAAA,CAAAA;AAE1D,IAAA,MAAMqB,6BAAAA,GAA2D;MAC/D,GAAGtB,KAAAA;AACHkB,MAAAA,UAAAA,EAAYP,kBAAAA,CAAmB7F,EAAAA;AAC/ByG,MAAAA,SAAAA,EAAWtB,OAAAA,CAAQvH,cAAAA;AACnByI,MAAAA,IAAAA,EAAMT,UAAAA,CAAWS,IAAAA;AACjBC,MAAAA,QAAAA,EAAUV,UAAAA,CAAWU,QAAAA;AACrBI,MAAAA,YAAAA,EAAcxB,KAAAA,CAAMwB,YAAAA;AACpBC,MAAAA,aAAAA,EAAezB,KAAAA,CAAMyB;AACvB,KAAA;AAGA,IAAA,MAAMC,SACJ,MAAM,IAAA,CAAK7B,4BAA4BwB,wBAAAA,CACrCC,6BAAAA,EACArB,QAAQvH,cAAc,CAAA;AAI1B,IAAA,IAAI,CAACgJ,MAAAA,IAAU,CAACA,MAAAA,CAAO5G,EAAAA,EAAI;AACzB,MAAA,MAAM,IAAIiC,MAAM,sCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,OAAO2E,MAAAA;AACT,EAAA;;;;;;;;;;EAWA,MAAMC,2BAAAA,CACJxH,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EAC+C;AAC/C,IAAA,IAAI,CAACA,cAAAA,EAAgB;AACnB,MAAA,MAAM,IAAIqE,MAAM,4BAAA,CAAA;AAClB,IAAA;AAGA,IAAA,IAAA,CAAK6E,uBAAAA,CAAwBzH,OAAAA,CAAQ0H,UAAAA,EAAYnJ,cAAAA,CAAAA;AAEjD,IAAA,IAAIoJ,cAAAA;AACJ,IAAA,MAAMD,aAAa1H,OAAAA,CAAQ0H,UAAAA;AAG3B,IAAA,IAAIA,UAAAA,CAAW9J,MAAAA,IAAUqC,WAAAA,EAAarC,MAAAA,EAAQ;AAC5C,MAAA,MAAMgK,iBAAiB3H,WAAAA,CAAYrC,MAAAA;AAEnC+J,MAAAA,cAAAA,GAAiB;QACf,GAAGC;AACL,OAAA;AAGA,MAAA,MAAMC,yBAAAA,GACHD,cAAAA,CAAeE,iBAAAA,IAEE,EAAC;AACrBH,MAAAA,cAAAA,CAAeG,iBAAAA,GAAoB;QACjC,GAAGD,yBAAAA;AACH,QAAA,GAAGH,WAAW9J,MAAAA,CAAOkK;AACvB,OAAA;AAGA,MAAA,MAAMC,sBAAAA,GACHH,cAAAA,CAAevG,cAAAA,IAEE,EAAC;AACrBsG,MAAAA,cAAAA,CAAetG,cAAAA,GAAiB;QAC9B,GAAG0G,sBAAAA;AACH,QAAA,GAAGL,WAAW9J,MAAAA,CAAOyD;AACvB,OAAA;AACF,IAAA,CAAA,MAAA,IAAWqG,WAAW9J,MAAAA,EAAQ;AAE5B+J,MAAAA,cAAAA,GAAiBD,UAAAA,CAAW9J,MAAAA;AAC9B,IAAA;AAGA,IAAA,MAAMoK,gBAAAA,GAAiD;AACrDC,MAAAA,QAAAA,EAAUP,UAAAA,CAAWO,QAAAA;AACrBC,MAAAA,IAAAA,EAAMR,UAAAA,CAAWQ,IAAAA;MACjBtK,MAAAA,EAAQ+J,cAAAA;AACRxB,MAAAA,QAAAA,EAAUuB,UAAAA,CAAWvB,QAAAA;MACrBgC,SAAAA,EAAW5J;AACb,KAAA;AAEA,IAAA,OAAO,MAAM,IAAA,CAAKmH,2BAAAA,CAA4B8B,2BAAAA,CAC5C;AAAE7G,MAAAA,EAAAA,EAAIX,OAAAA,CAAQW,EAAAA;MAAI+G,UAAAA,EAAYM;AAAiB,KAAA,EAC/CzJ,cAAAA,CAAAA;AAEJ,EAAA;;;;AAKUkJ,EAAAA,uBAAAA,CACRC,YACAnJ,cAAAA,EACM;AAEN,IAAA,IACEmJ,UAAAA,CAAWO,QAAAA,KAAazI,MAAAA,KACvBkI,UAAAA,CAAWO,QAAAA,KAAa,MAAMP,UAAAA,CAAWO,QAAAA,CAAS7E,IAAAA,EAAI,KAAO,EAAA,CAAA,EAC9D;AACA,MAAA,IAAA,CAAKhF,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKkJ,wBAAwBzJ,IAAAA,EAC7B,IAAA,CAAKyH,UACL,qDAAA,CAAA;AAEF,MAAA,MAAM,IAAI7C,MAAM,0BAAA,CAAA;AAClB,IAAA;AAGA,IAAA,IACE8E,UAAAA,CAAWQ,QACXR,UAAAA,CAAWQ,IAAAA,CAAKE,QAChB,OAAOV,UAAAA,CAAWQ,IAAAA,CAAKE,IAAAA,KAAS,QAAA,EAChC;AACA,MAAA,MAAMA,IAAAA,GAAOV,WAAWQ,IAAAA,CAAKE,IAAAA;AAE7B,MAAA,IACEA,KAAKC,QAAAA,KAAa7I,MAAAA,KACjB4I,IAAAA,CAAKC,QAAAA,KAAa,QACjBD,IAAAA,CAAKC,QAAAA,KAAa,EAAA,IACjB,OAAOD,KAAKC,QAAAA,KAAa,QAAA,IAAYD,KAAKC,QAAAA,CAASjF,IAAAA,OAAW,EAAA,CAAA,EACjE;AACA,QAAA,IAAA,CAAKhF,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKkJ,wBAAwBzJ,IAAAA,EAC7B,IAAA,CAAKyH,UACL,6CAAA,CAAA;AAEF,QAAA,MAAM,IAAI7C,MAAM,2BAAA,CAAA;AAClB,MAAA;AACF,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAM0F,yBAAAA,CACJtI,SACAzB,cAAAA,EAC6C;AAC7C,IAAA,OAAO,MAAM,IAAA,CAAKmH,2BAAAA,CAA4B4C,yBAAAA,CAC5CtI,SACAzB,cAAAA,CAAAA;AAEJ,EAAA;;;;;EAMA,MAAM8H,wBAAAA,CACJR,OACAC,OAAAA,EAC0C;AAC1C,IAAA,IAAI,CAACD,MAAMG,SAAAA,EAAW;AACpB,MAAA,MAAM,IAAIpD,MAAM,wBAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM,IAAA,CAAK+C,gCAAgCI,UAAAA,CAAW;AACpDC,MAAAA,SAAAA,EAAWH,KAAAA,CAAMG;KACnB,CAAA;AAEA,IAAA,IAAI/F,WAAAA;AAEJ,IAAA,IAAI4F,MAAMlF,EAAAA,EAAI;AACZV,MAAAA,WAAAA,GACE,MAAM,IAAA,CAAKyF,2BAAAA,CAA4B6C,4BAAAA,CACrC;AACE5H,QAAAA,EAAAA,EAAIkF,KAAAA,CAAMlF,EAAAA;AACVqF,QAAAA,SAAAA,EAAWH,KAAAA,CAAMG,SAAAA;AACjBiB,QAAAA,QAAAA,EAAUpB,KAAAA,CAAMoB;AAClB,OAAA,EACAnB,QAAQvH,cAAc,CAAA;AAE5B,IAAA,CAAA,MAAA,IAAWsH,MAAM2C,OAAAA,EAAS;AACxBvI,MAAAA,WAAAA,GACE,MAAM,IAAA,CAAKyF,2BAAAA,CAA4B+C,kCAAAA,CACrC;AACEzC,QAAAA,SAAAA,EAAWH,KAAAA,CAAMG,SAAAA;QACjBiB,QAAAA,EAAUpB,KAAAA,CAAM2C,OAAAA,CAAQvB,QAAAA,IAAYpB,KAAAA,CAAMoB,QAAAA;AAC1CyB,QAAAA,iBAAAA,EAAmB7C,MAAM2C,OAAAA,CAAQE,iBAAAA;QACjCC,eAAAA,EAAiBC,MAAAA,CAAO/C,KAAAA,CAAM2C,OAAAA,CAAQG,eAAe;AACvD,OAAA,EACA7C,QAAQvH,cAAc,CAAA;AAE5B,IAAA;AAEA,IAAA,IAAI,CAAC0B,WAAAA,EAAa;AAChB,MAAA,MAAM,IAAI2C,MAAM,kCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,OAAO3C,WAAAA;AACT,EAAA;AACF;;;;;;;;;;ACpTO,IAAe4I,oCAAf,MAAeA;EARtB;;;;;EASmBpD,QAAAA,GAAW,sCAAA;AAE5B,EAAA,WAAA,CACqBqD,kCACA1K,MAAAA,EACnB;SAFmB0K,gCAAAA,GAAAA,gCAAAA;SACA1K,MAAAA,GAAAA,MAAAA;AAClB,EAAA;;;;;;;;;;;EAYH,MAAM2K,wBAAAA,CACJlD,OACAC,OAAAA,EAC4C;AAC5C,IAAA,IAAA,CAAK1H,MAAAA,CAAOQ,KACVkH,OAAAA,CAAQvH,cAAAA,EACR,KAAKwK,wBAAAA,CAAyB/K,IAAAA,EAC9B,IAAA,CAAKyH,QAAAA,EACL,iCAAA,EACA;MACEuD,UAAAA,EAAYnD,KAAAA,CAAMmD,WAAWC,QAAAA,EAAQ;MACrC3C,uBAAAA,EAAyBT,KAAAA,CAAMS,wBAAwB2C,QAAAA;KACzD,CAAA;AAGF,IAAA,MAAMC,SAAAA,GACJ,MAAM,IAAA,CAAKJ,gCAAAA,CAAiCK,+BAAAA,CAC1C;AACEnD,MAAAA,SAAAA,EAAWH,KAAAA,CAAMG,SAAAA;AACjBM,MAAAA,uBAAAA,EAAyBT,KAAAA,CAAMS,uBAAAA;AAC/BqC,MAAAA,eAAAA,EAAiB9C,KAAAA,CAAMmD,UAAAA;AACvBN,MAAAA,iBAAAA,EAAmBU,+BAAAA,CAAyBC,QAAAA;AAC5CzL,MAAAA,MAAAA,EAAQiI,KAAAA,CAAMjI;AAChB,KAAA,EACAkI,OAAAA,CAAAA;AAGJ,IAAA,MAAMyB,MAAAA,GAA4C;AAChDrG,MAAAA,MAAAA,EAAQgI,SAAAA,CAAUhI,MAAAA;AAClBoI,MAAAA,GAAAA,EAAKJ,SAAAA,CAAUI;AACjB,KAAA;AAEA,IAAA,IAAA,CAAKlL,MAAAA,CAAOQ,KACVkH,OAAAA,CAAQvH,cAAAA,EACR,KAAKwK,wBAAAA,CAAyB/K,IAAAA,EAC9B,IAAA,CAAKyH,QAAAA,EACL,oCAAA,EACA;AAAEvE,MAAAA,MAAAA,EAAQqG,MAAAA,CAAOrG,MAAAA;AAAQqI,MAAAA,QAAAA,EAAUhC,OAAO+B,GAAAA,CAAIE;KAAO,CAAA;AAGvD,IAAA,OAAOjC,MAAAA;AACT,EAAA;;;;;EAMA,MAAMkC,6BAAAA,CACJzJ,SACA8F,OAAAA,EACiD;AACjD,IAAA,MAAMyB,MAAAA,GACJ,MAAM,IAAA,CAAKuB,gCAAAA,CAAiCY,kCAAAA,CAC1C;AACEpD,MAAAA,uBAAAA,EAAyBtG,OAAAA,CAAQsG,uBAAAA;AACjCqC,MAAAA,eAAAA,EAAiB3I,OAAAA,CAAQgJ,UAAAA;AACzBN,MAAAA,iBAAAA,EAAmBU,+BAAAA,CAAyBC;AAC9C,KAAA,EACAvD,OAAAA,CAAAA;AAGJ,IAAA,OAAO;AAAE5E,MAAAA,MAAAA,EAAQqG,MAAAA,CAAOrG;AAAO,KAAA;AACjC,EAAA;;;;;;;;;;;EAYA,MAAMyI,8CAAAA,CACJ9D,OACAC,OAAAA,EACkE;AAClE,IAAA,IAAA,CAAK1H,MAAAA,CAAOQ,KACVkH,OAAAA,CAAQvH,cAAAA,EACR,KAAKoL,8CAAAA,CAA+C3L,IAAAA,EACpD,IAAA,CAAKyH,QAAAA,EACL,uDAAA,EACA;MAAE9E,EAAAA,EAAIkF,KAAAA,CAAMlF,GAAGsI,QAAAA;KAAW,CAAA;AAG5B,IAAA,MAAM1B,MAAAA,GACJ,MAAM,IAAA,CAAKuB,gCAAAA,CAAiCc,wCAAAA,CAC1C;AACEjJ,MAAAA,EAAAA,EAAIkF,KAAAA,CAAMlF,EAAAA;AACV/C,MAAAA,MAAAA,EAAQiI,KAAAA,CAAMjI;AAChB,KAAA,EACAkI,OAAAA,CAAAA;AAGJ,IAAA,IAAA,CAAK1H,MAAAA,CAAOQ,KACVkH,OAAAA,CAAQvH,cAAAA,EACR,KAAKoL,8CAAAA,CAA+C3L,IAAAA,EACpD,IAAA,CAAKyH,QAAAA,EACL,0DAAA,EACA;AAAEvE,MAAAA,MAAAA,EAAQqG,MAAAA,CAAOrG;KAAO,CAAA;AAG1B,IAAA,OAAO;AAAEA,MAAAA,MAAAA,EAAQqG,MAAAA,CAAOrG;AAAO,KAAA;AACjC,EAAA;AACF;;;AChJO,IAAM,UAAA,mBAAa,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA;AAWlD,SAAS,EAAA,CAAsC,OAAY,IAAA,EAAmC;AACpG,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACxC,IAAA,OAAO,KAAA;AACR,EAAA;AAEA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AAC1B,IAAA,OAAO,IAAA;AACR,EAAA;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA,EAAG;AAC5D,IAAA,MAAM,IAAI,KAAA,CACT,CAAA,OAAA,EACC,IAAA,CAAK,IAAA,IAAQ,WACd,CAAA,6HAAA,CAAA,CAAA;AAEF,EAAA;AAEA,EAAA,IAAI,MAAM,KAAA,CAAM,WAAA;AAChB,EAAA,IAAI,GAAA,EAAK;AAER,IAAA,OAAO,GAAA,EAAK;AACX,MAAA,IAAI,cAAc,GAAA,IAAO,GAAA,CAAI,UAAU,CAAA,KAAM,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9D,QAAA,OAAO,IAAA;AACR,MAAA;AAEA,MAAA,GAAA,GAAM,MAAA,CAAO,eAAe,GAAG,CAAA;AAChC,IAAA;AACD,EAAA;AAEA,EAAA,OAAO,KAAA;AACR;AA9BgB,MAAA,CAAA,EAAA,EAAA,IAAA,CAAA;;;ACkDT,IAAA,MAAA,GAAA,MAAe2I,OAAAA,CAIkD;EA1DxE;;;AAiFC,EAAA,WAAA,CACU,OACTjM,OAAAA,EACC;AAFQ,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGT,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA;AACd,IAAA,IAAA,CAAK,OAAOA,OAAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,UAAUA,OAAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,UAAUA,OAAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,YAAYA,OAAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,aAAaA,OAAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,aAAaA,OAAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,UAAUA,OAAAA,CAAO,UAAA;AACtB,IAAA,IAAA,CAAK,WAAWA,OAAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,aAAaA,OAAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,aAAaA,OAAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,WAAWA,OAAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,aAAaA,OAAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,YAAYA,OAAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,oBAAoBA,OAAAA,CAAO,iBAAA;AACjC,EAAA;AAzCA,EAAA,QAAiB,UAAU,IAAY,QAAA;AAI9B,EAAA,IAAA;AACA,EAAA,OAAA;AACA,EAAA,OAAA;AACA,EAAA,OAAA;AACA,EAAA,SAAA;AACA,EAAA,UAAA;AACA,EAAA,UAAA;AACA,EAAA,QAAA;AACA,EAAA,UAAA;AACA,EAAA,UAAA;AACA,EAAA,QAAA;AACA,EAAA,UAAA;EACA,UAAA,GAA8B,MAAA;EAC9B,SAAA,GAA0D,MAAA;EAC1D,iBAAA,GAAyD,MAAA;AAExD,EAAA,MAAA;AAyBV,EAAA,kBAAA,CAAmB,KAAA,EAAyB;AAC3C,IAAA,OAAO,KAAA;AACR,EAAA;AAEA,EAAA,gBAAA,CAAiB,KAAA,EAAyB;AACzC,IAAA,OAAO,KAAA;AACR,EAAA;;EAGA,mBAAA,GAA+B;AAC9B,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,KAAc,UAAa,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,KAAS,WAAA;AAC9E,EAAA;AACD,CAAA;;;ACiDO,IAAA,aAAA,GAAA,MAAekM,cAAAA,CAKyB;EAjL/C;;;AAkLC,EAAA,QAAiB,UAAU,IAAY,eAAA;AAI7B,EAAA,MAAA;EAEV,WAAA,CAAY,IAAA,EAAiB,UAAyB,UAAA,EAA6B;AAClF,IAAA,IAAA,CAAK,MAAA,GAAS;AACb,MAAA,IAAA;MACA,OAAA,EAAS,KAAA;MACT,OAAA,EAAS,MAAA;MACT,UAAA,EAAY,KAAA;MACZ,UAAA,EAAY,KAAA;MACZ,QAAA,EAAU,KAAA;MACV,UAAA,EAAY,MAAA;MACZ,UAAA,EAAY,MAAA;AACZ,MAAA,QAAA;AACA,MAAA,UAAA;MACA,SAAA,EAAW;AACZ,KAAA;AACD,EAAA;;;;;;;;;;;;EAaA,KAAA,GAAmC;AAClC,IAAA,OAAO,IAAA;AACR,EAAA;;;;;;EAOA,OAAA,GAAyB;AACxB,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,IAAA,OAAO,IAAA;AACR,EAAA;;;;;;;;AASA,EAAA,OAAA,CAAQ,KAAA,EAA+F;AACtG,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AACtB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;;;;;;;AAQA,EAAA,UAAA,CACC,EAAA,EACsC;AACtC,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AACxB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;;;;AAKA,EAAA,QAAA,GAAW,IAAA,CAAK,UAAA;;;;;;;;AAShB,EAAA,WAAA,CACC,EAAA,EACmB;AACnB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,EAAA;AACzB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;;;;AAKA,EAAA,SAAA,GAAY,IAAA,CAAK,WAAA;;;;;;EAOjB,UAAA,GAEA;AACC,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AACzB,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,IAAA,OAAO,IAAA;AAER,EAAA;AAMD,CAAA;;;ACpRO,IAAM,SAAA,mBAAY,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AAG3C,IAAM,MAAA,mBAAS,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA;AAG1C,IAAM,OAAA,mBAAU,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA;AAG5C,IAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA;AAGlE,IAAM,YAAA,mBAAe,MAAA,CAAO,GAAA,CAAI,sBAAsB,CAAA;AAGtD,IAAM,QAAA,mBAAW,MAAA,CAAO,GAAA,CAAI,kBAAkB,CAAA;AAG9C,IAAM,OAAA,mBAAU,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA;AAG5C,IAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA;AAEzE,IAAM,cAAA,mBAAiB,MAAA,CAAO,GAAA,CAAI,wBAAwB,CAAA;AASnD,IAAA,KAAA,GAAA,MAAMC,MAAAA,CAAiE;EAlD9E;;;AAmDC,EAAA,QAAiB,UAAU,IAAY,OAAA;;AAgBvC,EAAA,OAAgB,MAAA,GAAS;IACxB,IAAA,EAAM,SAAA;AACN,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,OAAA;AACA,IAAA,kBAAA;AACA,IAAA,QAAA;AACA,IAAA,OAAA;AACA,IAAA;AACD,GAAA;;;;;AAMA,EAAA,CAAC,SAAS;;;;;AAMV,EAAA,CAAC,YAAY;;AAGb,EAAA,CAAC,MAAM;;AAGP,EAAA,CAAC,OAAO;;AAGR,EAAA,CAAC,kBAAkB;;;;;AAMnB,EAAA,CAAC,QAAQ;;AAGT,EAAA,CAAC,OAAO,IAAI,KAAA;;AAGZ,EAAA,CAAC,cAAc,IAAI,IAAA;;AAGnB,EAAA,CAAC,kBAAkB,IAA0D,MAAA;EAE7E,WAAA,CAAY,IAAA,EAAcC,SAA4B,QAAA,EAAkB;AACvE,IAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AACvC,IAAA,IAAA,CAAK,MAAM,CAAA,GAAIA,OAAAA;AACf,IAAA,IAAA,CAAK,QAAQ,CAAA,GAAI,QAAA;AAClB,EAAA;AACD,CAAA;;;AClGO,IAAM,iBAAA,mBAAoB,MAAA,CAAO,GAAA,CAAI,6BAA6B,CAAA;AAElE,IAAA,OAAA,GAAA,MAAMC,iBAAqD,KAAA,CAAS;EAvB3E;;;AAwBC,EAAA,QAAiB,UAAU,IAAY,SAAA;;AAGvC,EAAA,OAAyB,SAAS,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,MAAM,MAAA,EAAQ;AACjE,IAAA;GACA,CAAA;;EAGD,CAAC,iBAAiB,IAAkB,EAAC;;EAGrC,CAAU,KAAA,CAAM,MAAA,CAAO,kBAAkB,IACxC,MAAA;AACF,CAAA;;;ACzBO,IAAA,iBAAA,GAAA,MAAMC,kBAAAA,CAAkB;EAb/B;;;AAcC,EAAA,QAAiB,UAAU,IAAY,qBAAA;;AAGvC,EAAA,SAAA;;EAGA,SAAA,GAA4C,WAAA;;EAG5C,SAAA,GAA4C,WAAA;AAE5C,EAAA,WAAA,CACCtM,SAKA,OAAA,EAIC;AACD,IAAA,IAAA,CAAK,YAAY,MAAA;AAChB,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,cAAA,KAAmBA,OAAAA,EAAO;AACjD,MAAA,OAAO;AAAE,QAAA,IAAA;AAAM,QAAA,OAAA;QAAS,YAAA,EAAc,cAAA,CAAe,CAAC,CAAA,CAAG,KAAA;AAAkB,QAAA;AAAe,OAAA;AAC3F,IAAA,CAAA;AACA,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,QAAA;AACzB,MAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,QAAA;AAC1B,IAAA;AACD,EAAA;AAEA,EAAA,QAAA,CAAS,MAAA,EAAkC;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,KAAW,MAAA,GAAY,WAAA,GAAc,MAAA;AACtD,IAAA,OAAO,IAAA;AACR,EAAA;AAEA,EAAA,QAAA,CAAS,MAAA,EAAkC;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,KAAW,MAAA,GAAY,WAAA,GAAc,MAAA;AACtD,IAAA,OAAO,IAAA;AACR,EAAA;;AAGA,EAAA,KAAA,CAAM,KAAA,EAA4B;AACjC,IAAA,OAAO,IAAI,UAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAClC,EAAA;AACD,CAAA;AAIO,IAAA,UAAA,GAAA,MAAMuM,WAAAA,CAAW;EAhExB;;;AAuEC,EAAA,WAAA,CAAqB,OAAgB,OAAA,EAA4B;AAA5C,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACpB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,SAAA;AACxB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,SAAA;AACzB,EAAA;AAVA,EAAA,QAAiB,UAAU,IAAY,cAAA;AAE9B,EAAA,SAAA;AACA,EAAA,QAAA;AACA,EAAA,QAAA;EAQT,OAAA,GAAkB;AACjB,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,cAAA,EAAe,GAAI,KAAK,SAAA,EAAU;AACzD,IAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,IAAI,CAAA;AACvD,IAAA,MAAM,qBAAqB,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,IAAI,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS;MACd,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC3B,MAAA,GAAA,WAAA;AACH,MAAA,cAAA,CAAe,CAAC,CAAA,CAAG,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAI,CAAA;AACzC,MAAA,GAAA;;AAEJ,IAAA,OAAO,IAAA,IAAQ,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,GAAA,CAAA;AACnC,EAAA;AACD,CAAA;;;ACzFO,SAAS,IAAA,CAA6B,OAA0B,IAAA,EAAY;AAClF,EAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAClB;AAFgB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;;;ACQT,SAAS,aAAA,CAAc,OAAgB,OAAA,EAAmB;AAChE,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,OAAA,CAAA;AAC1D;AAFgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAIT,IAAA,uBAAA,GAAA,MAAMC,wBAAAA,CAAwB;EAZrC;;;AAoBC,EAAA,WAAA,CACC,SACQ,IAAA,EACP;AADO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAER,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAChB,EAAA;AAZA,EAAA,QAAiB,UAAU,IAAY,2BAAA;;AAGvC,EAAA,OAAA;;EAEA,sBAAA,GAAyB,KAAA;EASzB,gBAAA,GAAmB;AAClB,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,OAAO,IAAA;AACR,EAAA;;AAGA,EAAA,KAAA,CAAM,KAAA,EAAkC;AACvC,IAAA,OAAO,IAAI,iBAAiB,KAAA,EAAO,IAAA,CAAK,SAAS,IAAA,CAAK,sBAAA,EAAwB,KAAK,IAAI,CAAA;AACxF,EAAA;AACD,CAAA;CAEO,MAAMC,0BAAAA,CAA0B;EAtCvC;;;AAuCC,EAAA,QAAiB,UAAU,IAAY,6BAAA;;AAGvC,EAAA,IAAA;AAEA,EAAA,WAAA,CACC,IAAA,EACC;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACb,EAAA;AAEA,EAAA,EAAA,CAAA,GAAM,OAAA,EAAoC;AACzC,IAAA,OAAO,IAAI,uBAAA,CAAwB,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AACtD,EAAA;AACD;AAEO,IAAA,gBAAA,GAAA,MAAMC,iBAAAA,CAAiB;EAvD9B;;;EA8DC,WAAA,CAAqB,KAAA,EAAgB,OAAA,EAAqB,gBAAA,EAA2B,IAAA,EAAe;AAA/E,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,IAAQ,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,IAAI,CAAC,CAAA;AACvF,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACzB,EAAA;AAVA,EAAA,QAAiB,UAAU,IAAY,oBAAA;AAE9B,EAAA,OAAA;AACA,EAAA,IAAA;EACA,gBAAA,GAA4B,KAAA;EAQrC,OAAA,GAAU;AACT,IAAA,OAAO,IAAA,CAAK,IAAA;AACb,EAAA;AACD,CAAA;;;ACvEA,SAAS,iBAAA,CAAkB,WAAA,EAAqB,SAAA,EAAmB,QAAA,EAAqC;AACvG,EAAA,KAAA,IAAS,CAAA,GAAI,SAAA,EAAW,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AACpD,IAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAE1B,IAAA,IAAI,SAAS,IAAA,EAAM;AAClB,MAAA,CAAA,EAAA;AACA,MAAA;AACD,IAAA;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,OAAO;AAAC,QAAA,WAAA,CAAY,MAAM,SAAA,EAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;QAAG,CAAA,GAAI;;AACjE,IAAA;AAEA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA;AACD,IAAA;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AACjC,MAAA,OAAO;AAAC,QAAA,WAAA,CAAY,MAAM,SAAA,EAAW,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAG,QAAA;;AAC7D,IAAA;AACD,EAAA;AAEA,EAAA,OAAO;AAAC,IAAA,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;IAAG,WAAA,CAAY;;AACtE;AAvBS,MAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAyBF,SAAS,kBAAA,CAAmB,WAAA,EAAqB,SAAA,GAAY,CAAA,EAAoB;AACvF,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,IAAI,CAAA,GAAI,SAAA;AACR,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,OAAO,CAAA,GAAI,YAAY,MAAA,EAAQ;AAC9B,IAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAE1B,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,IAAI,eAAA,IAAmB,MAAM,SAAA,EAAW;AACvC,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACf,MAAA;AACA,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,CAAA,EAAA;AACA,MAAA;AACD,IAAA;AAEA,IAAA,eAAA,GAAkB,KAAA;AAElB,IAAA,IAAI,SAAS,IAAA,EAAM;AAClB,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AACD,IAAA;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,MAAM,CAACC,QAAOC,UAAS,CAAA,GAAI,kBAAkB,WAAA,EAAa,CAAA,GAAI,GAAG,IAAI,CAAA;AACrE,MAAA,MAAA,CAAO,KAAKD,MAAK,CAAA;AACjB,MAAA,CAAA,GAAIC,UAAAA;AACJ,MAAA;AACD,IAAA;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,OAAO;AAAC,QAAA,MAAA;QAAQ,CAAA,GAAI;;AACrB,IAAA;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,MAAM,CAACD,MAAAA,EAAOC,UAAS,IAAI,kBAAA,CAAmB,WAAA,EAAa,IAAI,CAAC,CAAA;AAChE,MAAA,MAAA,CAAO,KAAKD,MAAK,CAAA;AACjB,MAAA,CAAA,GAAIC,UAAAA;AACJ,MAAA;AACD,IAAA;AAEA,IAAA,MAAM,CAAC,KAAA,EAAO,YAAY,IAAI,iBAAA,CAAkB,WAAA,EAAa,GAAG,KAAK,CAAA;AACrE,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,CAAA,GAAI,YAAA;AACL,EAAA;AAEA,EAAA,OAAO;AAAC,IAAA,MAAA;AAAQ,IAAA;;AACjB;AAhDgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAkDT,SAAS,aAAa,WAAA,EAA4B;AACxD,EAAA,MAAM,CAAC,MAAM,CAAA,GAAI,kBAAA,CAAmB,aAAa,CAAC,CAAA;AAClD,EAAA,OAAO,MAAA;AACR;AAHgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAKT,SAAS,YAAY,KAAA,EAAsB;AACjD,EAAA,OAAO,CAAA,CAAA,EACN,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAA;AACV,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,MAAA,OAAO,YAAY,IAAI,CAAA;AACxB,IAAA;AAEA,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC7B,MAAA,OAAO,CAAA,CAAA,EAAI,KAAK,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA;AAC5D,IAAA;AAEA,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA;EACf,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CACZ,CAAA,CAAA,CAAA;AACD;AAdgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;;;AC1CT,IAAA,eAAA,GAAA,MAAeC,yBAKZ,aAAA,CAEV;EAnCA;;;AAoCS,EAAA,iBAAA,GAAuC,EAAC;AAEhD,EAAA,QAAiB,UAAU,IAAY,iBAAA;AAEvC,EAAA,KAAA,CAAM,IAAA,EAaJ;AACD,IAAA,OAAO,IAAI,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,MAAmC,IAAI,CAAA;AACpF,EAAA;EAEA,UAAA,CACC,GAAA,EACA,OAAA,GAAsC,EAAC,EAChC;AACP,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK;AAAE,MAAA,GAAA;AAAK,MAAA;KAAS,CAAA;AAC5C,IAAA,OAAO,IAAA;AACR,EAAA;AAEA,EAAA,MAAA,CACC,MACA7M,OAAAA,EACO;AACP,IAAA,IAAA,CAAK,OAAO,QAAA,GAAW,IAAA;AACvB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,IAAA;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,aAAaA,OAAAA,EAAQ,KAAA;AACjC,IAAA,OAAO,IAAA;AACR,EAAA;AAEA,EAAA,iBAAA,CAAkB,EAAA,EAAuD;AACxE,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY;AACvB,MAAA,EAAA;MACA,IAAA,EAAM,QAAA;MACN,IAAA,EAAM;AACP,KAAA;AACA,IAAA,OAAO,IAAA;AACR,EAAA;;AAGA,EAAA,gBAAA,CAAiB,QAAkB,KAAA,EAA8B;AAChE,IAAA,OAAO,KAAK,iBAAA,CAAkB,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,SAAQ,KAAA;AACjD,MAAA,OAAO,IAAA,CACN,CAAC8M,IAAAA,EAAKC,QAAAA,KAAAA;AACL,QAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,CAAkB,MAAA;AACrC,UAAA,MAAM,gBAAgBD,IAAAA,EAAI;AAC1B,UAAA,OAAO;YAAE,OAAA,EAAS;AAAC,cAAA;;YAAS,cAAA,EAAgB;AAAC,cAAA;;AAAe,WAAA;QAC7D,CAAC,CAAA;AACD,QAAA,IAAIC,SAAQ,QAAA,EAAU;AACrB,UAAA,OAAA,CAAQ,QAAA,CAASA,SAAQ,QAAQ,CAAA;AAClC,QAAA;AACA,QAAA,IAAIA,SAAQ,QAAA,EAAU;AACrB,UAAA,OAAA,CAAQ,QAAA,CAASA,SAAQ,QAAQ,CAAA;AAClC,QAAA;AACA,QAAA,OAAO,OAAA,CAAQ,MAAM,KAAK,CAAA;AAC3B,MAAA,CAAA,EACA,KACA,OAAA,CAAA;IAEF,CAAC,CAAA;AACF,EAAA;;AAQA,EAAA,sBAAA,CACC,KAAA,EACoB;AACpB,IAAA,OAAO,IAAI,iBAAA,CAAkB,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAChD,EAAA;AACD,CAAA;IAGsB,QAAA,GAAf,MAAAC,kBAIG,MAAA,CAA2D;EA7HrE;;;AAgIC,EAAA,WAAA,CACmB,OAClBhN,OAAAA,EACC;AACD,IAAA,IAAI,CAACA,QAAO,UAAA,EAAY;AACvB,MAAAA,OAAAA,CAAO,UAAA,GAAa,aAAA,CAAc,KAAA,EAAO;QAACA,OAAAA,CAAO;AAAK,OAAA,CAAA;AACvD,IAAA;AACA,IAAA,KAAA,CAAM,OAAOA,OAAM,CAAA;AAND,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAOnB,EAAA;AAVA,EAAA,QAAiB,UAAU,IAAY,UAAA;AAWxC,CAAA;AAIO,IAAM,iBAAA,GAAA,MAAAiN,kBAAAA,SAEH,QAAA,CAAoC;EA/I9C;;;AAgJC,EAAA,QAAiB,UAAU,IAAY,mBAAA;EAE9B,UAAA,GAAqB;AAC7B,IAAA,OAAO,KAAK,UAAA,EAAW;AACxB,EAAA;EAEA,WAAA,GAAsC;IACrC,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,IAAS,KAAA;IAC5B,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,IAAS,MAAA;AAC5B,IAAA,OAAA,EAAS,KAAK,MAAA,CAAO;AACtB,GAAA;EACA,aAAA,GAAwC;IACvC,KAAA,EAAO,KAAA;IACP,KAAA,EAAO,MAAA;IACP,OAAA,EAAS;AACV,GAAA;EAEA,GAAA,GAAkC;AACjC,IAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,KAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;EAEA,IAAA,GAAmC;AAClC,IAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,MAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;EAEA,UAAA,GAAqD;AACpD,IAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,OAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;EAEA,SAAA,GAAoD;AACnD,IAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,MAAA;AACzB,IAAA,OAAO,IAAA;AACR,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,EAAA,EAAA,CAAG,OAAA,EAA2C;AAC7C,IAAA,IAAA,CAAK,YAAY,OAAA,GAAU,OAAA;AAC3B,IAAA,OAAO,IAAA;AACR,EAAA;AACD,CAAA;CAEO,MAAMC,cAAAA,CAAc;EAxN3B;;;AAyNC,EAAA,QAAiB,UAAU,IAAY,eAAA;EACvC,WAAA,CACC,IAAA,EACA,MACA,WAAA,EACC;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACpB,EAAA;AAEA,EAAA,IAAA;AACA,EAAA,IAAA;AACA,EAAA,WAAA;AACD;AAMO,IAAA,cAAA,GAAA,MAAMC,eAAAA,SAGH,eAAA,CASR;EAzPF;;;AA0PC,EAAA,QAA0B,UAAU,IAAI,gBAAA;EAExC,WAAA,CACC,IAAA,EACA,aACA,IAAA,EACC;AACD,IAAA,KAAA,CAAM,IAAA,EAAM,SAAS,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,WAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA;AACpB,EAAA;;AAGS,EAAA,KAAA,CACR,KAAA,EACkD;AAClD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,MAAM,KAAK,CAAA;AACtD,IAAA,OAAO,IAAI,OAAA,CACV,KAAA,EACA,IAAA,CAAK,QACL,UAAA,CAAA;AAEF,EAAA;AACD,CAAA;AAEO,IAAA,OAAA,GAAA,MAAMC,iBAGH,QAAA,CAAY;EAtRtB;;;EA2RC,WAAA,CACC,KAAA,EACApN,OAAAA,EACS,UAAA,EACA,KAAA,EACR;AACD,IAAA,KAAA,CAAM,OAAOA,OAAM,CAAA;AAHV,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGT,IAAA,IAAA,CAAK,OAAOA,OAAAA,CAAO,IAAA;AACpB,EAAA;AAZS,EAAA,IAAA;AAET,EAAA,QAAiB,UAAU,IAAY,SAAA;EAYvC,UAAA,GAAqB;AACpB,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,UAAA,EAAY,CAAA,CAAA,EAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,GAAO,EAAE,CAAA,CAAA,CAAA;AACzF,EAAA;AAES,EAAA,kBAAA,CAAmB,KAAA,EAAsC;AACjE,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE9B,MAAA,KAAA,GAAQ,aAAa,KAAK,CAAA;AAC3B,IAAA;AACA,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,KAAK,UAAA,CAAW,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAC9D,EAAA;EAES,gBAAA,CAAiB,KAAA,EAAkB,gBAAgB,KAAA,EAA2B;AACtF,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,CAAC,MACpB,CAAA,KAAM,IAAA,GACH,IAAA,GACA,EAAA,CAAG,IAAA,CAAK,UAAA,EAAYoN,QAAO,CAAA,GAC3B,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,CAAA,EAAgB,IAAI,IACrD,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,CAAC,CAAA,CAAA;AAEtC,IAAA,IAAI,eAAe,OAAO,CAAA;AAC1B,IAAA,OAAO,YAAY,CAAC,CAAA;AACrB,EAAA;AACD,CAAA;;;ACpTA,IAAM,WAAA,mBAAc,MAAA,CAAO,GAAA,CAAI,kBAAkB,CAAA;AAW1C,SAAS,SAAS,GAAA,EAAoD;AAC5E,EAAA,OAAO,CAAC,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,cAAc,WAAA,IAAe,GAAA,IAAO,GAAA,CAAI,WAAW,CAAA,KAAM,IAAA;AACzF;AAFgB,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;CAIT,MAAMC,6BAEH,eAAA,CAAsD;EAjChE;;;AAkCC,EAAA,QAAiB,UAAU,IAAY,qBAAA;AAEvC,EAAA,WAAA,CAAY,MAAc,YAAA,EAAuC;AAChE,IAAA,KAAA,CAAM,IAAA,EAAM,UAAU,cAAc,CAAA;AACpC,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,YAAA;AACpB,EAAA;;AAGS,EAAA,KAAA,CACR,KAAA,EACgD;AAChD,IAAA,OAAO,IAAI,YAAA,CACV,KAAA,EACA,IAAA,CAAK,MAAA,CAAA;AAEP,EAAA;AACD;IAEO,YAAA,GAAA,MAAMC,sBACJ,QAAA,CACT;EAtDA;;;AAuDC,EAAA,QAAiB,UAAU,IAAY,cAAA;AAE9B,EAAA,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA;EACV,UAAA,GAAa,IAAA,CAAK,OAAO,IAAA,CAAK,UAAA;AAEhD,EAAA,WAAA,CACC,OACAtN,OAAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAOA,OAAM,CAAA;AACnB,IAAA,IAAA,CAAK,OAAOA,OAAAA,CAAO,IAAA;AACpB,EAAA;EAEA,UAAA,GAAqB;AACpB,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAClB,EAAA;AACD,CAAA;;;AC9DO,IAAA,QAAA,GAAA,MAAMuN,SAAAA,CAGW;EAdxB;;;AAeC,EAAA,QAAiB,UAAU,IAAY,UAAA;AAUvC,EAAA,WAAA,CAAYC,IAAAA,EAAU,SAAA,EAAoC,KAAA,EAAe,MAAA,GAAS,KAAA,EAAO;AACxF,IAAA,IAAA,CAAK,CAAA,GAAI;MACR,KAAA,EAAO,UAAA;MACP,GAAA,EAAAA,IAAAA;MACA,cAAA,EAAgB,SAAA;AAChB,MAAA,KAAA;AACA,MAAA;AACD,KAAA;AACD,EAAA;AAKD,CAAA;CAEO,MAAMC,aAAAA,SAGH,QAAA,CAA6B;EA3CvC;;;AA4CC,EAAA,QAAiB,UAAU,IAAY,cAAA;AACxC;ACtBO,IAAM,MAAA,GAAS;AACrB,EAAA,eAAA,CAAoD,MAAgB,EAAA,EAAsB;AACzF,IAAW;AACV,MAAA,OAAO,EAAA,EAAG;AACX,IAAA;AA2BD,EAAA;AACD,CAAA;;;ACvDO,IAAM,cAAA,mBAAiB,MAAA,CAAO,GAAA,CAAI,wBAAwB,CAAA;;;CCe1D,MAAAC,mBAAAA,CAAA;EAfP;;;AAgBC,EAAA,QAAiB,UAAU,IAAY,oBAAA;AACxC;AAiDO,SAAS,aAAa,KAAA,EAAqC;AACjE,EAAA,OAAO,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,OAAQ,MAAc,MAAA,KAAW,UAAA;AAClF;AAFgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAIhB,SAAS,aAAa,OAAA,EAA+C;AACpE,EAAA,MAAM,MAAA,GAA2B;IAAE,GAAA,EAAK,EAAA;AAAI,IAAA,MAAA,EAAQ;AAAG,GAAA;AACvD,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,OAAO,KAAA,CAAM,GAAA;AACpB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,QAAA,MAAA,CAAO,UAAU,EAAC;AACnB,MAAA;AACA,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,KAAA,CAAM,OAAO,CAAA;AACrC,IAAA;AACD,EAAA;AACA,EAAA,OAAO,MAAA;AACR;AAbS,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAeF,IAAA,WAAA,GAAA,MAAMC,YAAAA,CAAkC;EArF/C;;;AAsFC,EAAA,QAAiB,UAAU,IAAY,aAAA;AAE9B,EAAA,KAAA;AAET,EAAA,WAAA,CAAY,KAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,GAAQ;AAAC,MAAA;;AAC9C,EAAA;EAEA,MAAA,GAAuB;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA;AAAK,KAAA,CAAA;AACtB,EAAA;AACD,CAAA;AAEO,IAAA,GAAA,GAAA,MAAMC,IAAAA,CAAuC;EAnGpD;;;AA+GC,EAAA,WAAA,CAAqB,WAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAA0B,EAAA;AAX/C,EAAA,QAAiB,UAAU,IAAY,KAAA;;EAQvC,OAAA,GAAsC,WAAA;EAC9B,kBAAA,GAAqB,KAAA;AAI7B,EAAA,MAAA,CAAO,KAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,GAAG,KAAA,CAAM,WAAW,CAAA;AAC1C,IAAA,OAAO,IAAA;AACR,EAAA;AAEA,EAAA,OAAA,CAAQ5N,OAAAA,EAA4C;AACnD,IAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,kBAAA,EAAoB,CAAC,IAAA,KAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,0BAAA,CAA2B,IAAA,CAAK,aAAaA,OAAM,CAAA;AACtE,MAAA,IAAA,EAAM,aAAA,CAAc;AACnB,QAAA,oBAAA,EAAsB,KAAA,CAAM,GAAA;QAC5B,sBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,MAAM;OACnD,CAAA;AACD,MAAA,OAAO,KAAA;IACR,CAAC,CAAA;AACF,EAAA;AAEA,EAAA,0BAAA,CAA2B,QAAoB,OAAA,EAAkC;AAChF,IAAA,MAAMA,OAAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,OAAA,EAAS;MACzC,YAAA,EAAc,OAAA,CAAQ,gBAAgB,IAAA,CAAK,kBAAA;AAC3C,MAAA,eAAA,EAAiB,QAAQ,eAAA,IAAmB;QAAE,KAAA,EAAO;AAAE;KACvD,CAAA;AAED,IAAA,MAAM,EACL,UAAA,EACA,WAAA,EACA,aAAA,EACA,YAAA,EACA,iBAAA,GACGA,OAAAA;AAEJ,IAAA,OAAO,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAA;AAC/B,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA,EAAG;AAC3B,QAAA,OAAO;UAAE,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AAChD,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,IAAI,CAAA,EAAG;AACpB,QAAA,OAAO;UAAE,GAAA,EAAK,UAAA,CAAW,MAAM,KAAK,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AACnD,MAAA;AAEA,MAAA,IAAI,UAAU,MAAA,EAAW;AACxB,QAAA,OAAO;UAAE,GAAA,EAAK,EAAA;AAAI,UAAA,MAAA,EAAQ;AAAG,SAAA;AAC9B,MAAA;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,QAAA,MAAM,MAAA,GAAqB;AAAC,UAAA,IAAI,YAAY,GAAG;;AAC/C,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACrC,UAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,UAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,WAAA,CAAY,IAAI,CAAC,CAAA;AAClC,UAAA;AACD,QAAA;AACA,QAAA,MAAA,CAAO,IAAA,CAAK,IAAI,WAAA,CAAY,GAAG,CAAC,CAAA;AAChC,QAAA,OAAO,IAAA,CAAK,0BAAA,CAA2B,MAAA,EAAQA,OAAM,CAAA;AACtD,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO4N,IAAG,CAAA,EAAG;AACnB,QAAA,OAAO,IAAA,CAAK,0BAAA,CAA2B,KAAA,CAAM,WAAA,EAAa;UACzD,GAAG5N,OAAAA;AACH,UAAA,YAAA,EAAc,gBAAgB,KAAA,CAAM;SACpC,CAAA;AACF,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,EAAG;AACrB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAC5C,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA,OAAO;UACN,GAAA,EAAK,UAAA,KAAe,MAAA,GACjB,UAAA,CAAW,SAAS,CAAA,GACpB,WAAW,UAAU,CAAA,GAAI,GAAA,GAAM,UAAA,CAAW,SAAS,CAAA;AACtD,UAAA,MAAA,EAAQ;AACT,SAAA;AACD,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA,EAAG;AACtB,QAAA,IAAI,OAAA,CAAQ,iBAAiB,SAAA,EAAW;AACvC,UAAA,OAAO;YAAE,GAAA,EAAK,UAAA,CAAW,MAAM,IAAI,CAAA;AAAG,YAAA,MAAA,EAAQ;AAAG,WAAA;AAClD,QAAA;AACA,QAAA,OAAO;UAAE,GAAA,EAAK,UAAA,CAAW,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AACrG,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,IAAI,CAAA,EAAG;AACpB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,cAAc,CAAA,CAAE,MAAA;AACzC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,cAAc,CAAA,CAAE,IAAA;AACvC,QAAA,OAAO;UACN,GAAA,EAAK,UAAA,KAAe,MAAA,GACjB,UAAA,CAAW,QAAQ,CAAA,GACnB,WAAW,UAAU,CAAA,GAAI,GAAA,GAAM,UAAA,CAAW,QAAQ,CAAA;AACrD,UAAA,MAAA,EAAQ;AACT,SAAA;AACD,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,EAAG;AACrB,QAAA,IAAI,EAAA,CAAG,KAAA,CAAM,KAAA,EAAO,WAAW,CAAA,EAAG;AACjC,UAAA,OAAO;YAAE,GAAA,EAAK,WAAA,CAAY,eAAA,CAAgB,KAAA,EAAA,EAAS,KAAK,CAAA;YAAG,MAAA,EAAQ;AAAC,cAAA;;YAAQ,OAAA,EAAS;AAAC,cAAA;;AAAQ,WAAA;AAC/F,QAAA;AAEA,QAAA,MAAM,WAAA,GAAc,MAAM,KAAA,KAAU,IAAA,GAAO,OAAO,KAAA,CAAM,OAAA,CAAQ,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AAE5F,QAAA,IAAI,EAAA,CAAG,WAAA,EAAa4N,IAAG,CAAA,EAAG;AACzB,UAAA,OAAO,KAAK,0BAAA,CAA2B;AAAC,YAAA;aAAc5N,OAAM,CAAA;AAC7D,QAAA;AAEA,QAAA,IAAI,YAAA,EAAc;AACjB,UAAA,OAAO;YAAE,GAAA,EAAK,IAAA,CAAK,cAAA,CAAe,WAAA,EAAaA,OAAM,CAAA;AAAG,YAAA,MAAA,EAAQ;AAAG,WAAA;AACpE,QAAA;AAEA,QAAA,IAAI,OAAA,GAA+B;AAAC,UAAA;;AACpC,QAAA,IAAI,aAAA,EAAe;AAClB,UAAA,OAAA,GAAU;AAAC,YAAA,aAAA,CAAc,MAAM,OAAO;;AACvC,QAAA;AAEA,QAAA,OAAO;UAAE,GAAA,EAAK,WAAA,CAAY,eAAA,CAAgB,KAAA,EAAA,EAAS,WAAW,CAAA;UAAG,MAAA,EAAQ;AAAC,YAAA;;AAAc,UAAA;AAAQ,SAAA;AACjG,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA,EAAG;AAC3B,QAAA,OAAO;UAAE,GAAA,EAAK,WAAA,CAAY,eAAA,CAAgB,KAAA,EAAA,EAAS,KAAK,CAAA;UAAG,MAAA,EAAQ;AAAC,YAAA;;UAAQ,OAAA,EAAS;AAAC,YAAA;;AAAQ,SAAA;AAC/F,MAAA;AAEA,MAAA,IAAI,GAAG,KAAA,EAAO4N,IAAAA,CAAI,OAAO,CAAA,IAAK,KAAA,CAAM,eAAe,MAAA,EAAW;AAC7D,QAAA,OAAO;UAAE,GAAA,EAAK,UAAA,CAAW,MAAM,UAAU,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AACxD,MAAA;AAEA,MAAA,IAAI,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA,EAAG;AACxB,QAAA,IAAI,KAAA,CAAM,EAAE,MAAA,EAAQ;AACnB,UAAA,OAAO;YAAE,GAAA,EAAK,UAAA,CAAW,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAG,YAAA,MAAA,EAAQ;AAAG,WAAA;AACrD,QAAA;AACA,QAAA,OAAO,KAAK,0BAAA,CAA2B;AACtC,UAAA,IAAI,YAAY,GAAG,CAAA;AACnB,UAAA,KAAA,CAAM,CAAA,CAAE,GAAA;AACR,UAAA,IAAI,YAAY,IAAI,CAAA;UACpB,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK;WACpB5N,OAAM,CAAA;AACV,MAAA;AAEA,MAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACpB,QAAA,IAAI,MAAM,MAAA,EAAQ;AACjB,UAAA,OAAO;AAAE,YAAA,GAAA,EAAK,WAAW,KAAA,CAAM,MAAM,IAAI,GAAA,GAAM,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAG,YAAA,MAAA,EAAQ;AAAG,WAAA;AACvF,QAAA;AACA,QAAA,OAAO;UAAE,GAAA,EAAK,UAAA,CAAW,MAAM,QAAQ,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AACtD,MAAA;AAEA,MAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACxB,QAAA,IAAI,KAAA,CAAM,uBAAsB,EAAG;AAClC,UAAA,OAAO,KAAK,0BAAA,CAA2B;AAAC,YAAA,KAAA,CAAM,MAAA;aAAWA,OAAM,CAAA;AAChE,QAAA;AACA,QAAA,OAAO,KAAK,0BAAA,CAA2B;AACtC,UAAA,IAAI,YAAY,GAAG,CAAA;AACnB,UAAA,KAAA,CAAM,MAAA,EAAO;AACb,UAAA,IAAI,YAAY,GAAG;WACjBA,OAAM,CAAA;AACV,MAAA;AAEA,MAAA,IAAI,YAAA,EAAc;AACjB,QAAA,OAAO;UAAE,GAAA,EAAK,IAAA,CAAK,cAAA,CAAe,KAAA,EAAOA,OAAM,CAAA;AAAG,UAAA,MAAA,EAAQ;AAAG,SAAA;AAC9D,MAAA;AAEA,MAAA,OAAO;QAAE,GAAA,EAAK,WAAA,CAAY,eAAA,CAAgB,KAAA,EAAA,EAAS,KAAK,CAAA;QAAG,MAAA,EAAQ;AAAC,UAAA;;QAAQ,OAAA,EAAS;AAAC,UAAA;;AAAQ,OAAA;AAC/F,IAAA,CAAC,CAAC,CAAA;AACH,EAAA;EAEQ,cAAA,CACP,KAAA,EACA,EAAE,YAAA,EAAa,EACN;AACT,IAAA,IAAI,UAAU,IAAA,EAAM;AACnB,MAAA,OAAO,MAAA;AACR,IAAA;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC5D,MAAA,OAAO,MAAM,QAAA,EAAS;AACvB,IAAA;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,OAAO,aAAa,KAAK,CAAA;AAC1B,IAAA;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC9B,MAAA,MAAM,mBAAA,GAAsB,MAAM,QAAA,EAAS;AAC3C,MAAA,IAAI,wBAAwB,iBAAA,EAAmB;AAC9C,QAAA,OAAO,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC1C,MAAA;AACA,MAAA,OAAO,aAAa,mBAAmB,CAAA;AACxC,IAAA;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,0BAAA,GAA6B,KAAK,CAAA;AACnD,EAAA;EAEA,MAAA,GAAc;AACb,IAAA,OAAO,IAAA;AACR,EAAA;AAaA,EAAA,EAAA,CAAG,KAAA,EAAyC;AAE3C,IAAA,IAAI,UAAU,MAAA,EAAW;AACxB,MAAA,OAAO,IAAA;AACR,IAAA;AAEA,IAAA,OAAO,IAAI4N,IAAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AACnC,EAAA;AAEA,EAAA,OAAA,CAIE,OAAA,EAAoD;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,KAAY,UAAA,GAAa;MAAE,kBAAA,EAAoB;KAAQ,GAAI,OAAA;AACjF,IAAA,OAAO,IAAA;AACR,EAAA;EAEA,YAAA,GAAqB;AACpB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,OAAO,IAAA;AACR,EAAA;;;;;;;AAQA,EAAA,EAAA,CAAG,SAAA,EAA8C;AAChD,IAAA,OAAO,YAAY,IAAA,GAAO,MAAA;AAC3B,EAAA;AACD,CAAA;AAUO,IAAA,IAAA,GAAA,MAAMC,KAAAA,CAA2B;EAjWxC;;;AAsWC,EAAA,WAAA,CAAqB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAgB,EAAA;AAJrC,EAAA,QAAiB,UAAU,IAAY,MAAA;AAE7B,EAAA,KAAA;EAIV,MAAA,GAAuB;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA;AAAK,KAAA,CAAA;AACtB,EAAA;AACD,CAAA;AAkBO,SAAS,qBAAqB,KAAA,EAAuD;AAC3F,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,kBAAA,IAAsB,KAAA,IACxE,OAAQ,KAAA,CAAc,gBAAA,KAAqB,UAAA;AAChD;AAHgB,MAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAKT,IAAM,WAAA,GAA4C;EACxD,kBAAA,kBAAoB,MAAA,CAAA,CAAC,UAAU,KAAA,EAAX,oBAAA;AACrB,CAAA;AAEO,IAAM,WAAA,GAA4C;EACxD,gBAAA,kBAAkB,MAAA,CAAA,CAAC,UAAU,KAAA,EAAX,kBAAA;AACnB,CAAA;CAMuD;EACtD,GAAG,WAAA;EACH,GAAG;AACJ;AAGa,IAAA,KAAA,GAA+E,MAAAC,MAAAA,CAAA;EApZ5F;;;;;;;EA6ZC,WAAA,CACU,KAAA,EACA,UAA2D,WAAA,EACnE;AAFQ,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACP,EAAA;AAXH,EAAA,QAAiB,UAAU,IAAY,OAAA;AAE7B,EAAA,KAAA;EAWV,MAAA,GAAuB;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA;AAAK,KAAA,CAAA;AACtB,EAAA;AACD,CAAA;AAmCO,SAAS,GAAA,CAAI,YAAkC,MAAA,EAAyB;AAC9E,EAAA,MAAM,cAA0B,EAAC;AACjC,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,IAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAA,EAAK;AACnE,IAAA,WAAA,CAAY,KAAK,IAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAC9C,EAAA;AACA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAYC,MAAK,CAAA,IAAK,MAAA,CAAO,SAAQ,EAAG;AACnD,IAAA,WAAA,CAAY,IAAA,CAAKA,QAAO,IAAI,WAAA,CAAY,QAAQ,UAAA,GAAa,CAAC,CAAE,CAAC,CAAA;AAClE,EAAA;AAEA,EAAA,OAAO,IAAI,IAAI,WAAW,CAAA;AAC3B;AAVgB,MAAA,CAAA,GAAA,EAAA,KAAA,CAAA;AAYT,CAAA,CAAUP,IAAAA,KAAAA;AACT,EAAA,SAAS,KAAA,GAAa;AAC5B,IAAA,OAAO,IAAI,GAAA,CAAI,EAAE,CAAA;AAClB,EAAA;AAFgB,EAAA,MAAA,CAAA,KAAA,EAAA,OAAA,CAAA;AAATA,EAAAA,IAAAA,CAAS,KAAA,GAAA,KAAA;AAKT,EAAA,SAAS,SAAS,IAAA,EAAuB;AAC/C,IAAA,OAAO,IAAI,IAAI,IAAI,CAAA;AACpB,EAAA;AAFgB,EAAA,MAAA,CAAA,QAAA,EAAA,UAAA,CAAA;AAATA,EAAAA,IAAAA,CAAS,QAAA,GAAA,QAAA;AAQT,EAAA,SAAS,IAAI,GAAA,EAAkB;AACrC,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA,IAAI,YAAY,GAAG;AAAE,KAAA,CAAA;AACtC,EAAA;AAFgB,EAAA,MAAA,CAAA,GAAA,EAAA,KAAA,CAAA;AAATA,EAAAA,IAAAA,CAAS,GAAA,GAAA,GAAA;AAiBT,EAAA,SAAS,IAAA,CAAK,QAAoB,SAAA,EAA2B;AACnE,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,KAAK,CAAA,IAAK,MAAA,CAAO,SAAQ,EAAG;AAC1C,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,SAAA,KAAc,MAAA,EAAW;AACrC,QAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACtB,MAAA;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAClB,IAAA;AACA,IAAA,OAAO,IAAI,IAAI,MAAM,CAAA;AACtB,EAAA;AATgB,EAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAATA,EAAAA,IAAAA,CAAS,IAAA,GAAA,IAAA;AAuBT,EAAA,SAAS,WAAW,KAAA,EAAqB;AAC/C,IAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AACtB,EAAA;AAFgB,EAAA,MAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAATA,EAAAA,IAAAA,CAAS,UAAA,GAAA,UAAA;AAIT,EAAA,SAASQ,aAAkC5N,KAAAA,EAAiC;AAClF,IAAA,OAAO,IAAI,YAAYA,KAAI,CAAA;AAC5B,EAAA;AAFgB4N,EAAAA,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAATR,EAAAA,IAAAA,CAAS,WAAA,GAAAQ,YAAAA;AAIT,EAAA,SAASD,MAAAA,CACf,OACA,OAAA,EACwB;AACxB,IAAA,OAAO,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AAChC,EAAA;AALgBA,EAAAA,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAATP,EAAAA,IAAAA,CAAS,KAAA,GAAAO,MAAAA;AAAA,CAAA,EA9DA,GAAA,KAAA,GAAA,GAAA,EAAA,CAAA,CAAA;AAsEV,CAAA,CAAUH,KAAAA,KAAAA;AACT,EAAA,IAAA,OAAA,GAAA,MAAMK,QAAAA,CAA2C;IA3hBzD;;;AAsiBE,IAAA,WAAA,CACUT,MACA,UAAA,EACR;AAFQ,MAAA,IAAA,CAAA,GAAA,GAAAA,IAAAA;AACA,MAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACP,IAAA;AAbH,IAAA,QAAiB,UAAU,IAAY,aAAA;;IAQvC,gBAAA,GAAmB,KAAA;IAOnB,MAAA,GAAc;AACb,MAAA,OAAO,IAAA,CAAK,GAAA;AACb,IAAA;;IAGA,KAAA,GAAQ;AACP,MAAA,OAAO,IAAIS,QAAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,UAAU,CAAA;AAC7C,IAAA;AACD,GAAA;AAxBOL,EAAAA,MAAM,OAAA,GAAA,OAAA;GADG,GAAA,KAAA,GAAA,GAAA,EAAA,CAAA,CAAA;AA4BV,IAAA,WAAA,GAAA,MAAMM,YAAAA,CAA+E;EAtjB5F;;;AA2jBC,EAAA,WAAA,CAAqB9N,KAAAA,EAAa;AAAb,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAAc,EAAA;AAJnC,EAAA,QAAiB,UAAU,IAAY,aAAA;EAMvC,MAAA,GAAc;AACb,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA;AAAK,KAAA,CAAA;AACtB,EAAA;AACD,CAAA;AA+BO,IAAA,IAAA,GAAA,MAAe+N,KAAAA,CAIE;EAnmBxB;;;AAomBC,EAAA,QAAiB,UAAU,IAAY,MAAA;;AAWvC,EAAA,CAAC,cAAc;AAUf,EAAA,WAAA,CACC,EAAE,IAAA,EAAA/N,KAAAA,EAAM,QAAAgM,OAAAA,EAAQ,cAAA,EAAgB,OAAM,EAMrC;AACD,IAAA,IAAA,CAAK,cAAc,CAAA,GAAI;MACtB,IAAA,EAAAhM,KAAAA;MACA,YAAA,EAAcA,KAAAA;MACd,MAAA,EAAAgM,OAAAA;AACA,MAAA,cAAA;AACA,MAAA,KAAA;AACA,MAAA,UAAA,EAAY,CAAC,KAAA;MACb,OAAA,EAAS;AACV,KAAA;AACD,EAAA;EAEA,MAAA,GAAuB;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI;AAAC,MAAA;AAAK,KAAA,CAAA;AACtB,EAAA;AACD,CAAA;AAGA,MAAA,CAAO,SAAA,CAAU,SAAS,WAAW;AACpC,EAAA,OAAO,IAAI,GAAA,CAAI;AAAC,IAAA;AAAK,GAAA,CAAA;AACtB,CAAA;AAGA,KAAA,CAAM,SAAA,CAAU,SAAS,WAAW;AACnC,EAAA,OAAO,IAAI,GAAA,CAAI;AAAC,IAAA;AAAK,GAAA,CAAA;AACtB,CAAA;AAGA,QAAA,CAAS,SAAA,CAAU,SAAS,WAAW;AACtC,EAAA,OAAO,IAAI,GAAA,CAAI;AAAC,IAAA;AAAK,GAAA,CAAA;AACtB,CAAA;;;AC9oBO,SAAS,WAAA,CAAY,OAAgB,MAAA,EAA8B;AACzE,EAAA,IACC,oBAAA,CAAqB,MAAM,CAAA,IACxB,CAAC,YAAA,CAAa,KAAK,CAAA,IACnB,CAAC,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,IAChB,CAAC,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA,IACtB,CAAC,EAAA,CAAG,KAAA,EAAO,MAAM,KACjB,CAAC,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA,IAChB,CAAC,EAAA,CAAG,KAAA,EAAO,IAAI,CAAA,EACjB;AACD,IAAA,OAAO,IAAI,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AAC/B,EAAA;AACA,EAAA,OAAO,KAAA;AACR;AAbgB,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA6CT,IAAM,EAAA,mBAAqB,MAAA,CAAA,CAAC,IAAA,EAAkB,KAAA,KAAA;AACpD,EAAA,OAAO,MAAM,IAAI,CAAA,GAAA,EAAM,WAAA,CAAY,KAAA,EAAO,IAAI,CAAC,CAAA,CAAA;AAChD,CAAA,EAFkC,IAAA,CAAA;AA2C3B,SAAS,OACZ,oBAAA,EACe;AAClB,EAAA,MAAM,aAAa,oBAAA,CAAqB,MAAA,CACvC,CAAC,CAAA,KAAyC,MAAM,MAAA,CAAA;AAGjD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,MAAA;AACR,EAAA;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,IAAI,UAAU,CAAA;AAC1B,EAAA;AAEA,EAAA,OAAO,IAAI,GAAA,CAAI;AACd,IAAA,IAAI,YAAY,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,IAAI,WAAA,CAAY,OAAO,CAAC,CAAA;AAC7C,IAAA,IAAI,YAAY,GAAG;AACnB,GAAA,CAAA;AACF;AApBgB,MAAA,CAAA,GAAA,EAAA,KAAA,CAAA;AAuCT,SAAS,MACZ,oBAAA,EACe;AAClB,EAAA,MAAM,aAAa,oBAAA,CAAqB,MAAA,CACvC,CAAC,CAAA,KAAyC,MAAM,MAAA,CAAA;AAGjD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,MAAA;AACR,EAAA;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAI,IAAI,UAAU,CAAA;AAC1B,EAAA;AAEA,EAAA,OAAO,IAAI,GAAA,CAAI;AACd,IAAA,IAAI,YAAY,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,IAAI,WAAA,CAAY,MAAM,CAAC,CAAA;AAC5C,IAAA,IAAI,YAAY,GAAG;AACnB,GAAA,CAAA;AACF;AApBgB,MAAA,CAAA,EAAA,EAAA,IAAA,CAAA;AAgNT,SAAS,OAAO,KAAA,EAAwB;AAC9C,EAAA,OAAO,MAAM,KAAK,CAAA,QAAA,CAAA;AACnB;AAFgB,MAAA,CAAA,MAAA,EAAA,QAAA,CAAA;AAoBT,SAAS,UAAU,KAAA,EAAwB;AACjD,EAAA,OAAO,MAAM,KAAK,CAAA,YAAA,CAAA;AACnB;AAFgB,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA;;;AC7VT,SAAS,IAAI,MAAA,EAAqC;AACxD,EAAA,OAAO,MAAM,MAAM,CAAA,IAAA,CAAA;AACpB;AAFgB,MAAA,CAAA,GAAA,EAAA,KAAA,CAAA;AAoBT,SAAS,KAAK,MAAA,EAAqC;AACzD,EAAA,OAAO,MAAM,MAAM,CAAA,KAAA,CAAA;AACpB;AAFgB,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;;;ACgJT,SAAS,gBAAiC,KAAA,EAA6B;AAC7E,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAClC;AAFgB,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;;;;;;;;;;;;;;;;;;AC3IHgC,sCAAN,kCAAA,CAAMA;AAAAA,EAAAA;;;;;EACMvG,QAAAA,GAAW,+BAAA;AAE5B,EAAA,WAAA,CAEmBwG,MACA7N,MAAAA,EACjB;SAFiB6N,IAAAA,GAAAA,IAAAA;SACA7N,MAAAA,GAAAA,MAAAA;AAChB,EAAA;EAEH,MAAM8I,wBAAAA,CACJrB,OACAtH,cAAAA,EACqC;AAErC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK2I,yBAAyBlJ,IAAAA,EAC9B,IAAA,CAAKyH,UACL,CAAA,uDAAA,CAAyD,CAAA;AAG3D,IAAA,IAAI;AAEF,MAAA,OAAO,IAAA,CAAKwG,IAAAA,CAAKC,WAAAA,CAAY,OAAOC,EAAAA,KAAAA;AAElC,QAAA,MAAM,CAACC,iBAAAA,CAAAA,GAAqB,MAAMD,EAAAA,CAC/BE,MAAAA,CAAOrC,iCAAAA,CAAOsC,qBAAqB,CAAA,CACnCC,MAAAA,CAAO1G,KAAAA,CAAAA,CACP2G,YAAAA,EAAY;AAEf,QAAA,IAAI,CAACJ,kBAAkBzL,EAAAA,EAAI;AAEzBwL,UAAAA,EAAAA,CAAGM,QAAAA,EAAQ;AACX,UAAA;AACF,QAAA;AAGA,QAAA,IAAI5G,MAAMyB,aAAAA,EAAe;AACvB,UAAA,MAAMoF,UAAAA,GAA0C;AAC9CpG,YAAAA,uBAAAA,EAAyB8F,iBAAAA,CAAkBzL,EAAAA;AAC3CgI,YAAAA,eAAAA,EAAiB9C,MAAMyB,aAAAA,CAAcqB,eAAAA;AACrCD,YAAAA,iBAAAA,EAAmB7C,MAAMyB,aAAAA,CAAcoB,iBAAAA;AACvCxH,YAAAA,MAAAA,EAAQyL,8DAAAA,CAAmCC,MAAAA;AAC3C5G,YAAAA,SAAAA,EAAWH,KAAAA,CAAMG,SAAAA;AACjB6G,YAAAA,SAAAA,sBAAe7N,IAAAA,EAAAA;YACfoI,SAAAA,EAAW7I;AACb,WAAA;AAEA,UAAA,MAAM4N,GAAGE,MAAAA,CAAOrC,iCAAAA,CAAO8C,uBAAuB,CAAA,CAAEP,OAAOG,UAAAA,CAAAA;AACzD,QAAA;AAEA,QAAA,OAAO;AAAE/L,UAAAA,EAAAA,EAAIyL,iBAAAA,CAAkBzL;AAAG,SAAA;MACpC,CAAA,CAAA;AACF,IAAA,CAAA,CAAA,OAASrB,KAAAA,EAAO;AAEd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAK2I,wBAAAA,CAAyBlJ,MAC9B,IAAA,CAAKyH,QAAAA,EACL,mCAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAMqH,aAAAA,CACJ3G,SACAzB,cAAAA,EACkC;AAClC,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKoI,cAAc3I,IAAAA,EACnB,IAAA,CAAKyH,UACL,sBAAA,EACA;AAAEzF,QAAAA;OAAQ,CAAA;AAGZ,MAAA,OAAO,MAAM,IAAA,CAAKiM,IAAAA,CAAKc,KAAAA,CAAMxG,WAAWyG,SAAAA,CAAU;AAChDC,QAAAA,KAAAA,EAAOC,GAAAA,CACLC,EAAAA,CAAGnD,iCAAAA,CAAOzD,UAAAA,CAAW5F,EAAAA,EAAIX,OAAAA,CAAQ4G,YAAY,CAAA,EAC7CwG,MAAAA,CAAOpD,iCAAAA,CAAOzD,UAAAA,CAAW8G,SAAS,CAAA;OAEtC,CAAA;AACF,IAAA,CAAA,CAAA,OAAS/N,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKoI,cAAc3I,IAAAA,EACnB,IAAA,CAAKyH,QAAAA,EACL,wBAAA,EACAnG,KAAAA,EACA;AAAEU,QAAAA;OAAQ,CAAA;AAGZ,MAAA,MAAMV,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAMuH,qBAAAA,CACJ7G,SACAzB,cAAAA,EACoE;AACpE,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKsI,sBAAsB7I,IAAAA,EAC3B,IAAA,CAAKyH,UACL,8BAAA,EACA;AAAEzF,QAAAA;OAAQ,CAAA;AAGZ,MAAA,OAAO,MAAM,IAAA,CAAKiM,IAAAA,CAAKc,KAAAA,CAAMvG,mBAAmBwG,SAAAA,CAAU;AACxDC,QAAAA,KAAAA,EAAOC,GAAAA,CACLC,EAAAA,CAAGnD,iCAAAA,CAAOxD,kBAAAA,CAAmB7F,EAAAA,EAAIX,OAAAA,CAAQ8G,oBAAoB,CAAA,EAC7DsG,MAAAA,CAAOpD,iCAAAA,CAAOxD,kBAAAA,CAAmB6G,SAAS,CAAA;OAE9C,CAAA;AACF,IAAA,CAAA,CAAA,OAAS/N,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKsI,sBAAsB7I,IAAAA,EAC3B,IAAA,CAAKyH,QAAAA,EACL,gCAAA,EACAnG,KAAAA,EACA;AAAEU,QAAAA;OAAQ,CAAA;AAGZ,MAAA,MAAMV,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAMkI,2BAAAA,CACJ3B,OAIAtH,cAAAA,EAC8B;AAC9B,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKiJ,4BAA4BxJ,IAAAA,EACjC,IAAA,CAAKyH,UACL,iCAAA,CAAA;AAGF,MAAA,MAAM1C,QAAAA,GAAW,MAAM,IAAA,CAAKkJ,IAAAA,CACzBqB,OAAOtD,iCAAAA,CAAOsC,qBAAqB,EACnCiB,GAAAA,CAAI;AACH,QAAA,GAAG1H,KAAAA,CAAM6B;OACX,CAAA,CACCuF,MAAME,EAAAA,CAAGnD,iCAAAA,CAAOsC,sBAAsB3L,EAAAA,EAAIkF,KAAAA,CAAMlF,EAAE,CAAA,CAAA;AAErD,MAAA,OAAO;QACLO,MAAAA,EAAQ6B,QAAAA,CAAS,CAAA,CAAA,CAAGyK,YAAAA,GAAe;AACrC,OAAA;AACF,IAAA,CAAA,CAAA,OAASlO,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKiJ,4BAA4BxJ,IAAAA,EACjC,IAAA,CAAKyH,QAAAA,EACL,uCAAA,EACAnG,KAAAA,CAAAA;AAGF,MAAA,MAAMA,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAM+G,wBAAAA,CACJR,OACAtH,cAAAA,EACuE;AACvE,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK8H,yBAAyBrI,IAAAA,EAC9B,IAAA,CAAKyH,QAAAA,EACL,iCAAA,EACAI,KAAAA,CAAAA;AAGF,MAAA,OAAO,MAAM,IAAA,CAAKoG,IAAAA,CAAKc,KAAAA,CAAMT,sBAAsBU,SAAAA,CAAU;AAC3DC,QAAAA,KAAAA,EAAOC,GAAAA,CACLE,MAAAA,CAAOpD,iCAAAA,CAAOsC,qBAAAA,CAAsBe,SAAS,CAAA,EAC7CF,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsB3L,EAAAA,EAAIkF,KAAAA,CAAMS,uBAAuB,CAAA;OAErE,CAAA;AACF,IAAA,CAAA,CAAA,OAAShH,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAK8H,wBAAAA,CAAyBrI,MAC9B,IAAA,CAAKyH,QAAAA,EACL,mCAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAMiJ,4BAAAA,CACJvI,SAKAzB,cAAAA,EACsD;AACtD,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKgK,6BAA6BvK,IAAAA,EAClC,IAAA,CAAKyH,QAAAA,EACL,qCAAA,EACAzF,OAAAA,CAAAA;AAGF,MAAA,MAAMyN,UAAAA,GAAa;AACjBN,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsB3L,EAAAA,EAAIX,OAAAA,CAAQW,EAAE,CAAA;AAC9CwM,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtG,SAAAA,EAAWhG,OAAAA,CAAQgG,SAAS,CAAA;AAC5DmH,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtF,IAAAA,EAAM0G,qCAAAA,CAAqBC,WAAW,CAAA;AACtER,QAAAA,EAAAA,CACEnD,iCAAAA,CAAOsC,qBAAAA,CAAsBpL,MAAAA,EAC7ByL,8DAAAA,CAAmCC,MAAM,CAAA;QAE3CQ,MAAAA,CAAOpD,iCAAAA,CAAOsC,sBAAsBe,SAAS,CAAA;QAC7CD,MAAAA,CAAOpD,iCAAAA,CAAOzD,WAAW8G,SAAS;;AAGpC,MAAA,IAAIrN,QAAQiH,QAAAA,EAAU;AACpBwG,QAAAA,UAAAA,CAAWG,KACTT,EAAAA,CAAGnD,iCAAAA,CAAOsC,sBAAsBrF,QAAAA,EAAUjH,OAAAA,CAAQiH,QAAQ,CAAA,CAAA;AAE9D,MAAA;AAEA,MAAA,MAAMlE,QAAAA,GAAW,MAAM,IAAA,CAAKkJ,IAAAA,CACzB4B,MAAAA,CAAO;QACN,GAAGC,eAAAA,CAAgB9D,kCAAOsC,qBAAqB,CAAA;AAC/CyB,QAAAA,iBAAAA,EAAmB/D,kCAAO8C,uBAAAA,CAAwBnM,EAAAA;AAClDgI,QAAAA,eAAAA,EAAiBqB,kCAAO8C,uBAAAA,CAAwBnE,eAAAA;AAChDD,QAAAA,iBAAAA,EAAmBsB,kCAAO8C,uBAAAA,CAAwBpE,iBAAAA;AAClDsF,QAAAA,qBAAAA,EAAuBhE,kCAAO8C,uBAAAA,CAAwBlP,MAAAA;AACtDqQ,QAAAA,QAAAA,EAAUjE,kCAAOzD,UAAAA,CAAW2H;OAC9B,CAAA,CACCC,KAAKnE,iCAAAA,CAAOsC,qBAAqB,EACjC8B,SAAAA,CACCpE,iCAAAA,CAAOzD,YACP4G,EAAAA,CAAGnD,iCAAAA,CAAOzD,WAAW5F,EAAAA,EAAIqJ,iCAAAA,CAAOsC,sBAAsB1F,YAAY,CAAA,EAEnEyH,QAAAA,CACCrE,iCAAAA,CAAO8C,uBAAAA,EACPI,GAAAA,CACEC,EAAAA,CACEnD,iCAAAA,CAAO8C,wBAAwBxG,uBAAAA,EAC/B0D,iCAAAA,CAAOsC,sBAAsB3L,EAAE,CAAA,EAEjCwM,GAAGnD,iCAAAA,CAAO8C,uBAAAA,CAAwB9G,SAAAA,EAAWhG,OAAAA,CAAQgG,SAAS,CAAA,EAC9DoH,OAAOpD,iCAAAA,CAAO8C,uBAAAA,CAAwBO,SAAS,CAAA,CAAA,EAGlDJ,KAAAA,CAAMC,GAAAA,CAAAA,GAAOO,UAAAA,CAAAA,CAAAA;AAEhB,MAAA,OAAO1K,SAAS,CAAA,CAAA;AAGlB,IAAA,CAAA,CAAA,OAASzD,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAKgK,4BAAAA,CAA6BvK,MAClC,IAAA,CAAKyH,QAAAA,EACL,uCAAA,EACAnG,KAAAA,EACAU,OAAAA,CAAAA;AAGF,MAAA,MAAMV,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAMmJ,kCAAAA,CACJzI,SAMAzB,cAAAA,EACsD;AACtD,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKkK,mCAAmCzK,IAAAA,EACxC,IAAA,CAAKyH,QAAAA,EACL,2CAAA,EACAzF,OAAAA,CAAAA;AAGF,MAAA,MAAMyN,UAAAA,GAAa;QACjBL,MAAAA,CAAOpD,iCAAAA,CAAOzD,WAAW8G,SAAS,CAAA;AAClCF,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtG,SAAAA,EAAWhG,OAAAA,CAAQgG,SAAS,CAAA;AAC5DmH,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtF,IAAAA,EAAM0G,qCAAAA,CAAqBC,WAAW,CAAA;AACtER,QAAAA,EAAAA,CACEnD,iCAAAA,CAAOsC,qBAAAA,CAAsBpL,MAAAA,EAC7ByL,8DAAAA,CAAmCC,MAAM,CAAA;QAE3CQ,MAAAA,CAAOpD,iCAAAA,CAAOsC,sBAAsBe,SAAS,CAAA;AAC7CF,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAO8C,uBAAAA,CAAwB9G,SAAAA,EAAWhG,OAAAA,CAAQgG,SAAS,CAAA;AAC9DmH,QAAAA,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBpE,iBAAAA,EAC/B1I,OAAAA,CAAQ0I,iBAAiB,CAAA;AAE3ByE,QAAAA,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBnE,eAAAA,EAC/B3I,OAAAA,CAAQ2I,eAAe,CAAA;QAEzByE,MAAAA,CAAOpD,iCAAAA,CAAO8C,wBAAwBO,SAAS;;AAGjD,MAAA,IAAIrN,QAAQiH,QAAAA,EAAU;AACpBwG,QAAAA,UAAAA,CAAWG,KACTT,EAAAA,CAAGnD,iCAAAA,CAAOsC,sBAAsBrF,QAAAA,EAAUjH,OAAAA,CAAQiH,QAAQ,CAAA,CAAA;AAE9D,MAAA;AAEA,MAAA,MAAMlE,QAAAA,GAAW,MAAM,IAAA,CAAKkJ,IAAAA,CACzB4B,MAAAA,CAAO;QACN,GAAGC,eAAAA,CAAgB9D,kCAAOsC,qBAAqB,CAAA;AAC/CyB,QAAAA,iBAAAA,EAAmB/D,kCAAO8C,uBAAAA,CAAwBnM,EAAAA;AAClDgI,QAAAA,eAAAA,EAAiBqB,kCAAO8C,uBAAAA,CAAwBnE,eAAAA;AAChDD,QAAAA,iBAAAA,EAAmBsB,kCAAO8C,uBAAAA,CAAwBpE,iBAAAA;AAClDsF,QAAAA,qBAAAA,EAAuBhE,kCAAO8C,uBAAAA,CAAwBlP,MAAAA;AACtDqQ,QAAAA,QAAAA,EAAUjE,kCAAOzD,UAAAA,CAAW2H;AAC9B,OAAA,CAAA,CACCC,IAAAA,CAAKnE,iCAAAA,CAAOsC,qBAAqB,EACjC8B,SAAAA,CACCpE,iCAAAA,CAAOzD,UAAAA,EACP4G,EAAAA,CAAGnD,iCAAAA,CAAOzD,UAAAA,CAAW5F,EAAAA,EAAIqJ,iCAAAA,CAAOsC,sBAAsB1F,YAAY,CAAA,CAAA,CAEnEwH,SAAAA,CACCpE,iCAAAA,CAAO8C,uBAAAA,EACPK,EAAAA,CACEnD,iCAAAA,CAAO8C,wBAAwBxG,uBAAAA,EAC/B0D,iCAAAA,CAAOsC,qBAAAA,CAAsB3L,EAAE,CAAA,CAAA,CAGlCsM,KAAAA,CAAMC,GAAAA,CAAAA,GAAOO,UAAAA,CAAAA,CAAAA;AAEhB,MAAA,OAAO1K,SAAS,CAAA,CAAA;AAGlB,IAAA,CAAA,CAAA,OAASzD,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAKkK,kCAAAA,CAAmCzK,MACxC,IAAA,CAAKyH,QAAAA,EACL,6CAAA,EACAnG,KAAAA,EACAU,OAAAA,CAAAA;AAGF,MAAA,MAAMV,KAAAA;AACR,IAAA;AACF,EAAA;;;;;EAMA,MAAMgJ,yBAAAA,CACJzC,OACAtH,cAAAA,EAC6C;AAC7C,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK+J,0BAA0BtK,IAAAA,EAC/B,IAAA,CAAKyH,QAAAA,EACL,kCAAA,EACAI,KAAAA,CAAAA;AAGF,MAAA,MAAMyI,KAAAA,GAAQzI,KAAAA,CAAM0I,OAAAA,EAASD,KAAAA,IAASE,6CAAAA;AACtC,MAAA,MAAMC,MAAAA,GAAAA,CAAAA,CAAW5I,KAAAA,CAAM0I,OAAAA,EAASG,IAAAA,IAAQ,KAAK,CAAA,IAAKJ,KAAAA;AAElD,MAAA,MAAMK,OAAAA,GAAU9I,MAAM0I,OAAAA,EAASI,OAAAA;AAC/B,MAAA,IAAIC,MAAAA,GAAsB5E,kCAAOsC,qBAAAA,CAAsB3L,EAAAA;AAEvD,MAAA,IAAIgO,OAAAA,EAASE,OAAO,YAAA,EAAc;AAChCD,QAAAA,MAAAA,GAAS5E,kCAAOsC,qBAAAA,CAAsBO,SAAAA;MACxC,CAAA,MAAA,IAAW8B,OAAAA,EAASE,OAAO,YAAA,EAAc;AACvCD,QAAAA,MAAAA,GAAS5E,kCAAOsC,qBAAAA,CAAsBwC,SAAAA;AACxC,MAAA;AAEA,MAAA,MAAMC,SAAAA,GACJJ,SAASK,KAAAA,KAAUC,8BAAAA,CAAmBC,MAAMC,GAAAA,CAAIP,MAAAA,CAAAA,GAAUQ,IAAAA,CAAKR,MAAAA,CAAAA;AACjE,MAAA,MAAMS,UAAAA,GAAaxJ,MAAM0I,OAAAA,EAASe,MAAAA;AAGlC,MAAA,MAAMC,oBAAAA,GACJC,OAAAA,CAAQH,UAAAA,CAAAA,IACRG,QACE3J,KAAAA,CAAM0I,OAAAA,EAASkB,OAAAA,EAASC,IAAAA,CACtB,CAACC,MAAAA,KAAWA,MAAAA,CAAOd,EAAAA,KAAO,2BAAA,CAAA,CAAA;AAKhC,MAAA,MAAMe,eAAAA,GAAyB;AAC7BzC,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtG,SAAAA,EAAWH,KAAAA,CAAMG,SAAS,CAAA;QAC1DoH,MAAAA,CAAOpD,iCAAAA,CAAOsC,sBAAsBe,SAAS;;AAG/C,MAAA,IAAIxH,MAAMoB,QAAAA,EAAU;AAClB2I,QAAAA,eAAAA,CAAgBhC,KACdT,EAAAA,CACEnD,iCAAAA,CAAOsC,sBAAsBrF,QAAAA,EAC7BpB,KAAAA,CAAMoB,QAAQ,CAAA,CAAA;AAGpB,MAAA;AAGA,MAAA,IAAIpB,MAAM0I,OAAAA,EAASkB,OAAAA,IAAW5J,MAAM0I,OAAAA,CAAQkB,OAAAA,CAAQjG,SAAS,CAAA,EAAG;AAC9D,QAAA,IAAA,CAAKqG,YAAAA,CAAaD,eAAAA,EAAiB/J,KAAAA,CAAM0I,OAAO,CAAA;AAClD,MAAA;AAEA,MAAA,IAAIc,UAAAA,EAAY;AACd,QAAA,MAAMS,aAAAA,GAAgB,IAAIT,UAAAA,CAAAA,CAAAA,CAAAA;AAC1BO,QAAAA,eAAAA,CAAgBhC,IAAAA,CACdxC,GAAAA,CAAAA,CAAAA,EAAOpB,iCAAAA,CAAOsC,qBAAAA,CAAsBrE,QAAQ,CAAA,MAAA,EAAS6H,aAAAA,CAAAA,IAAAA,EAAoB9F,iCAAAA,CAAOzD,UAAAA,CAAWvI,IAAI,CAAA,MAAA,EAAS8R,aAAAA,CAAAA,CAAAA,CAAgB,CAAA;AAE5H,MAAA;AAGA,MAAA,IAAIP,oBAAAA,EAAsB;AACxBK,QAAAA,eAAAA,CAAgBhC,IAAAA,CAAKR,MAAAA,CAAOpD,iCAAAA,CAAOzD,UAAAA,CAAW8G,SAAS,CAAA,CAAA;AACzD,MAAA;AAGA,MAAA,IAAIxH,MAAMI,UAAAA,EAAY;AACpB2J,QAAAA,eAAAA,CAAgBhC,IAAAA,CAAKmC,SAAAA,CAAU/F,iCAAAA,CAAO8C,uBAAAA,CAAwBnM,EAAE,CAAA,CAAA;AAClE,MAAA;AAGA,MAAA,MAAMqP,oBAAAA,GAA8B;AAClC7C,QAAAA,EAAAA,CAAGnD,iCAAAA,CAAOsC,qBAAAA,CAAsBtG,SAAAA,EAAWH,KAAAA,CAAMG,SAAS,CAAA;QAC1DoH,MAAAA,CAAOpD,iCAAAA,CAAOsC,sBAAsBe,SAAS;;AAG/C,MAAA,IAAIxH,MAAMoB,QAAAA,EAAU;AAClB+I,QAAAA,oBAAAA,CAAqBpC,KACnBT,EAAAA,CACEnD,iCAAAA,CAAOsC,sBAAsBrF,QAAAA,EAC7BpB,KAAAA,CAAMoB,QAAQ,CAAA,CAAA;AAGpB,MAAA;AAEA,MAAA,IAAIpB,MAAM0I,OAAAA,EAASkB,OAAAA,IAAW5J,MAAM0I,OAAAA,CAAQkB,OAAAA,CAAQjG,SAAS,CAAA,EAAG;AAC9D,QAAA,IAAA,CAAKqG,YAAAA,CAAaG,oBAAAA,EAAsBnK,KAAAA,CAAM0I,OAAO,CAAA;AACvD,MAAA;AAEA,MAAA,IAAIc,UAAAA,EAAY;AACd,QAAA,MAAMS,aAAAA,GAAgB,IAAIT,UAAAA,CAAAA,CAAAA,CAAAA;AAC1BW,QAAAA,oBAAAA,CAAqBpC,IAAAA,CACnBxC,GAAAA,CAAAA,CAAAA,EAAOpB,iCAAAA,CAAOsC,qBAAAA,CAAsBrE,QAAQ,CAAA,MAAA,EAAS6H,aAAAA,CAAAA,IAAAA,EAAoB9F,iCAAAA,CAAOzD,UAAAA,CAAWvI,IAAI,CAAA,MAAA,EAAS8R,aAAAA,CAAAA,CAAAA,CAAgB,CAAA;AAE5H,MAAA;AAEA,MAAA,MAAMG,iBAAAA,GAAoB,IAAA,CAAKhE,IAAAA,CAC5B4B,MAAAA,CAAO;AACNS,QAAAA,KAAAA,EAAOlD,qBAAqBpB,iCAAAA,CAAOsC,qBAAAA,CAAsB3L,EAAE,CAAA,CAAA,CAAA,CAAIuP,GAC7D,OAAA;OAEJ,CAAA,CACC/B,IAAAA,CAAKnE,iCAAAA,CAAOsC,qBAAqB,CAAA;AAEpC,MAAA,MAAM6D,mBAAAA,GAAsBZ,oBAAAA,GACxBU,iBAAAA,CAAkB5B,QAAAA,CAChBrE,kCAAOzD,UAAAA,EACP4G,EAAAA,CAAGnD,iCAAAA,CAAOzD,UAAAA,CAAW5F,EAAAA,EAAIqJ,iCAAAA,CAAOsC,qBAAAA,CAAsB1F,YAAY,CAAA,CAAA,GAEpEqJ,iBAAAA;AAEJ,MAAA,IAAIV,oBAAAA,EAAsB;AACxBS,QAAAA,oBAAAA,CAAqBpC,IAAAA,CAAKR,MAAAA,CAAOpD,iCAAAA,CAAOzD,UAAAA,CAAW8G,SAAS,CAAA,CAAA;AAC9D,MAAA;AAEA,MAAA,MAAM+C,6BAA6BvK,KAAAA,CAAMI,UAAAA,GACrCkK,mBAAAA,CAAoB9B,QAAAA,CAClBrE,kCAAO8C,uBAAAA,EACPI,GAAAA,CACEC,EAAAA,CACEnD,iCAAAA,CAAO8C,wBAAwBxG,uBAAAA,EAC/B0D,iCAAAA,CAAOsC,sBAAsB3L,EAAE,CAAA,EAEjCwM,GACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBpE,iBAAAA,EAC/BU,+BAAAA,CAAyBiH,QAAQ,CAAA,EAEnClD,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBnE,iBAC/BC,MAAAA,CAAO/C,KAAAA,CAAMI,UAAU,CAAA,GAEzBmH,MAAAA,CAAOpD,iCAAAA,CAAO8C,wBAAwBO,SAAS,CAAA,CAAA,CAAA,GAGnD8C,mBAAAA;AAEJ,MAAA,IAAItK,MAAMI,UAAAA,EAAY;AACpB+J,QAAAA,oBAAAA,CAAqBpC,IAAAA,CAAKmC,SAAAA,CAAU/F,iCAAAA,CAAO8C,uBAAAA,CAAwBnM,EAAE,CAAA,CAAA;AACvE,MAAA;AAEA,MAAA,MAAM2P,aAAaF,0BAAAA,CAA2BnD,KAAAA,CAC5CC,GAAAA,CAAAA,GAAO8C,oBAAAA,CAAAA,CAAAA;AAIT,MAAA,MAAMO,SAAAA,GAAY,IAAA,CAAKtE,IAAAA,CACpB4B,MAAAA,CAAO;QACN,GAAGC,eAAAA,CAAgB9D,kCAAOsC,qBAAqB,CAAA;AAC/C2B,QAAAA,QAAAA,EAAUjE,kCAAOzD,UAAAA,CAAW2H;AAC9B,OAAA,CAAA,CACCC,IAAAA,CAAKnE,iCAAAA,CAAOsC,qBAAqB,EACjC+B,QAAAA,CACCrE,iCAAAA,CAAOzD,UAAAA,EACP4G,EAAAA,CAAGnD,kCAAOzD,UAAAA,CAAW5F,EAAAA,EAAIqJ,iCAAAA,CAAOsC,qBAAAA,CAAsB1F,YAAY,CAAA,CAAA;AAGtE,MAAA,MAAM4J,UAAAA,GAAa3K,MAAMI,UAAAA,GACrBsK,SAAAA,CACGlC,SACCrE,iCAAAA,CAAO8C,uBAAAA,EACPI,GAAAA,CACEC,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBxG,yBAC/B0D,iCAAAA,CAAOsC,qBAAAA,CAAsB3L,EAAE,CAAA,EAEjCwM,EAAAA,CACEnD,iCAAAA,CAAO8C,wBAAwBpE,iBAAAA,EAC/BU,+BAAAA,CAAyBiH,QAAQ,CAAA,EAEnClD,EAAAA,CACEnD,iCAAAA,CAAO8C,wBAAwBnE,eAAAA,EAC/BC,MAAAA,CAAO/C,MAAMI,UAAU,CAAA,GAEzBmH,MAAAA,CAAOpD,iCAAAA,CAAO8C,uBAAAA,CAAwBO,SAAS,CAAA,CAAA,EAGlDJ,KAAAA,CAAMC,GAAAA,CAAAA,GAAO0C,eAAAA,CAAAA,CAAAA,GAChBW,UAAUtD,KAAAA,CAAMC,GAAAA,CAAAA,GAAO0C,eAAAA,CAAAA,CAAAA;AAG3B,MAAA,MAAM,CAAC,EAAEtB,KAAAA,EAAOmC,UAAAA,IAAcC,OAAAA,CAAAA,GAAW,MAAMjK,OAAAA,CAAQC,GAAAA,CAAI;AACzD4J,QAAAA,UAAAA,CAAWK,SAAO,CAAGC,IAAAA,CAAK,CAACrJ,MAAAA,KAAWA,MAAAA,CAAO,CAAA,CAAE,CAAA;QAC/CiJ,UAAAA,CAAWK,KAAAA,CAAMvC,KAAAA,CAAAA,CAAOG,MAAAA,CAAOA,MAAAA,CAAAA,CAAQqC,OAAAA,CAAQ/B,SAAAA,CAAAA,CAAW4B,OAAAA;AAC3D,OAAA,CAAA;AAED,MAAA,OAAO;QACLF,UAAAA,EAAYM,MAAAA,CAAON,UAAAA,CAAAA,IAAe,CAAA;AAClCC,QAAAA;AACF,OAAA;AACF,IAAA,CAAA,CAAA,OAASpR,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAK+J,yBAAAA,CAA0BtK,MAC/B,IAAA,CAAKyH,QAAAA,EACL,oCAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;AAKQuQ,EAAAA,YAAAA,CACND,iBACAH,OAAAA,EACM;AACN,IAAA,IAAI,CAACA,OAAAA,IAAW,CAACA,OAAAA,CAAQA,OAAAA,EAAS;AAChC,MAAA;AACF,IAAA;AAEA,IAAA,KAAA,MAAWE,MAAAA,IAAUF,QAAQA,OAAAA,EAAS;AACpC,MAAA,MAAMuB,eAAerB,MAAAA,CAAOpD,MAAAA;AAE5B,MAAA,IAAI,CAACyE,YAAAA,IAAgBA,YAAAA,CAAaxH,MAAAA,KAAW,CAAA,EAAG;AAC9C,QAAA;AACF,MAAA;AAEA,MAAA,QAAQmG,OAAOd,EAAAA;AACb,QAAA,KAAK,2BAAA,EAA6B;AAChC,UAAA,MAAMoC,iBAAAA,GAAoBD,aAAaE,GAAAA,CACrC,CAAC3G,UAAUa,GAAAA,CAAAA,EAAMvI,MAAAA,CAAO0H,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAElC,UAAA,MAAM4G,YAAAA,GAAe/F,GAAAA,CAAIgG,IAAAA,CAAKH,iBAAAA,EAAmB7F,GAAAA,CAAAA,EAAAA,CAAO,CAAA;AACxDwE,UAAAA,eAAAA,CAAgBhC,KACdxC,GAAAA,CAAAA,EAAMpB,iCAAAA,CAAOzD,WAAW2H,uBAAuB,CAAA,KAAA,EAAQiD,YAAAA,CAAAA,CAAAA,CAAe,CAAA;AAExE,UAAA;AACF,QAAA;AAEA,QAAA,KAAK,6BAAA,EAA+B;AAClC,UAAA,MAAME,mBAA0B,EAAA;AAEhC,UAAA,KAAA,MAAW9G,SAASyG,YAAAA,EAAc;AAChC,YAAA,MAAMM,UAAAA,GAAazO,MAAAA,CAAO0H,KAAAA,CAAAA,CAAOgH,WAAAA,EAAW;AAE5C,YAAA,IAAID,eAAe,QAAA,EAAU;AAC3BD,cAAAA,gBAAAA,CAAiBzD,IAAAA,CACfR,MAAAA,CAAOpD,iCAAAA,CAAOsC,qBAAAA,CAAsBnG,QAAQ,CAAA,CAAA;AAEhD,YAAA,CAAA,MAAA,IAAWmL,eAAe,OAAA,EAAS;AACjCD,cAAAA,gBAAAA,CAAiBzD,IAAAA,CACfmC,SAAAA,CAAU/F,iCAAAA,CAAOsC,qBAAAA,CAAsBnG,QAAQ,CAAA,CAAA;AAEnD,YAAA;AACF,UAAA;AAEA,UAAA,IAAIkL,gBAAAA,CAAiB7H,WAAW,CAAA,EAAG;AACjCoG,YAAAA,eAAAA,CAAgBhC,IAAAA,CAAKyD,gBAAAA,CAAiB,CAAA,CAAE,CAAA;UAC1C,CAAA,MAAA,IAAWA,gBAAAA,CAAiB7H,SAAS,CAAA,EAAG;AACtC,YAAA,MAAMgI,WAAAA,GAAcC,EAAAA,CAAAA,GAAMJ,gBAAAA,CAAAA;AAE1B,YAAA,IAAIG,WAAAA,EAAa;AACf5B,cAAAA,eAAAA,CAAgBhC,KAAK4D,WAAAA,CAAAA;AACvB,YAAA;AACF,UAAA;AACA,UAAA;AACF,QAAA;AACF;AACF,IAAA;AACF,EAAA;AACF;;;AA1pByBE,EAAAA,SAAAA,CAAAA,CAAAA,EAAAA,aAAAA,CAAAA,uCAAAA,CAAAA,aAAAA,CAAAA,CAAAA;;;;;;;;;;;;;;;;;;;;;;;;AC1CZC,uCAAN,kCAAA,CAAMA;AAAAA,EAAAA;;;;AACX,EAAA,WAAA,CAEqB1F,IAAAA,EACnB;SADmBA,IAAAA,GAAAA,IAAAA;AAClB,EAAA;AACL;;;AAHyByF,EAAAA,UAAAA,CAAAA,CAAAA,EAAAA,aAAAA,CAAAA,uCAAAA,CAAAA,aAAAA,CAAAA,CAAAA;;;;;;;;;;;;;;;;;;;;;;;ACYZE,2CAAN,sCAAA,CAAMA;AAAAA,EAAAA;;;;;EACMnM,QAAAA,GAAW,qCAAA;AAE5B,EAAA,WAAA,CAEmBwG,MACA7N,MAAAA,EACjB;SAFiB6N,IAAAA,GAAAA,IAAAA;SACA7N,MAAAA,GAAAA,MAAAA;AAChB,EAAA;;;;;;;;;EAUH,MAAM+K,+BAAAA,CACJtD,OAOAC,OAAAA,EACmD;AACnD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK1H,MAAAA,CAAOQ,IAAAA,CACVkH,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAK4K,gCAAgCnL,IAAAA,EACrC,IAAA,CAAKyH,QAAAA,EACL,uCAAA,EACAI,KAAAA,CAAAA;AAGF,MAAA,MAAMgM,YAAAA,GAAe,MAAM,IAAA,CAAK5F,IAAAA,CAC7BI,OAAOrC,iCAAAA,CAAO8C,uBAAuB,EACrCP,MAAAA,CAAO;AACNvG,QAAAA,SAAAA,EAAWH,KAAAA,CAAMG,SAAAA;AACjB9E,QAAAA,MAAAA,EAAQyL,8DAAAA,CAAmCC,MAAAA;AAC3CtG,QAAAA,uBAAAA,EAAyBT,KAAAA,CAAMS,uBAAAA;AAC/BqC,QAAAA,eAAAA,EAAiB9C,KAAAA,CAAM8C,eAAAA;AACvBD,QAAAA,iBAAAA,EAAmB7C,KAAAA,CAAM6C,iBAAAA;AACzB9K,QAAAA,MAAAA,EAAQiI,MAAMjI,MAAAA,IAAU,IAAA;AACxBwJ,QAAAA,SAAAA,EAAWtB,OAAAA,CAAQvH;OACrB,CAAA;AAEF,MAAA,MAAMuT,GAAAA,GAAMD,YAAAA;AACZ,MAAA,MAAME,UAAAA,GAAaD,GAAAA,CAAI,CAAA,CAAA,EAAIE,QAAAA,IAAY,IAAA,GAAOjB,MAAAA,CAAOe,GAAAA,CAAI,CAAA,CAAA,CAAGE,QAAQ,CAAA,GAAI,CAAA;AACxE,MAAA,MAAMC,aAAaF,UAAAA,GAAa,CAAA;AAChC,MAAA,MAAMzI,MAAM2I,UAAAA,GAAa;AAACrJ,QAAAA,MAAAA,CAAOmJ,UAAAA;UAAe,EAAA;AAEhD,MAAA,IAAA,CAAK3T,MAAAA,CAAOQ,IAAAA,CACVkH,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAK4K,+BAAAA,CAAgCnL,IAAAA,EACrC,IAAA,CAAKyH,QAAAA,EACL,CAAA,YAAA,EAAewM,UAAAA,GAAa,YAAA,GAAe,QAAA,CAAA,CAAA,EAC3C;AAAEF,QAAAA,UAAAA;QAAY7Q,MAAAA,EAAQ+Q;OAAW,CAAA;AAGnC,MAAA,OAAO;QAAE/Q,MAAAA,EAAQ+Q,UAAAA;AAAY3I,QAAAA;AAAI,OAAA;AACnC,IAAA,CAAA,CAAA,OAAShK,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVwG,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAK4K,+BAAAA,CAAgCnL,IAAAA,EACrC,IAAA,CAAKyH,QAAAA,EACL,6CAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAEF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAM4S,kBAAAA,CACJrM,OAKAtH,cAAAA,EACkB;AAClB,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAK2T,kBAAAA,CAAmBlU,IAAAA,EACxB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG,IAAA,CAAKyM,kBAAAA,CAAmBlU,IAAI,WAC/B6H,KAAAA,CAAAA;AAGF,MAAA,MAAM9C,QAAAA,GAAW,MAAM,IAAA,CAAKkJ,IAAAA,CACzB4B,MAAAA,CAAO;AAAElN,QAAAA,EAAAA,EAAIqJ,kCAAO8C,uBAAAA,CAAwBnM;AAAG,OAAA,EAC/CwN,IAAAA,CAAKnE,iCAAAA,CAAO8C,uBAAuB,CAAA,CACnCG,MACCC,GAAAA,CACEC,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBxG,yBAC/BT,KAAAA,CAAMS,uBAAuB,CAAA,EAE/B6G,EAAAA,CACEnD,kCAAO8C,uBAAAA,CAAwBnE,eAAAA,EAC/B9C,KAAAA,CAAM8C,eAAe,GAEvBwE,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBpE,iBAAAA,EAC/B7C,MAAM6C,iBAAiB,CAAA,EAEzB0E,MAAAA,CAAOpD,iCAAAA,CAAO8C,wBAAwBO,SAAS,CAAA,CAAA,CAAA,CAGlDwD,MAAM,CAAA,CAAA;AAET,MAAA,OAAO9N,SAASyG,MAAAA,GAAS,CAAA;AAC3B,IAAA,CAAA,CAAA,OAASlK,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVf,cAAAA,EACA,IAAA,CAAK2T,kBAAAA,CAAmBlU,MACxB,IAAA,CAAKyH,QAAAA,EACL,6BAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;;EAWA,MAAMoK,kCAAAA,CACJ7D,OAKAC,OAAAA,EAC6B;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK1H,MAAAA,CAAOQ,IAAAA,CACVkH,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAKmL,mCAAmC1L,IAAAA,EACxC,IAAA,CAAKyH,QAAAA,EACL,yCAAA,EACAI,KAAAA,CAAAA;AAIF,MAAA,MAAM+J,eAAAA,GAAkB;QACtBxC,MAAAA,CAAOpD,iCAAAA,CAAO8C,wBAAwBO,SAAS,CAAA;AAC/CF,QAAAA,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBxG,uBAAAA,EAC/BT,KAAAA,CAAMS,uBAAuB,CAAA;AAE/B6G,QAAAA,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBnE,eAAAA,EAC/B9C,KAAAA,CAAM8C,eAAe,CAAA;AAEvBwE,QAAAA,EAAAA,CACEnD,iCAAAA,CAAO8C,uBAAAA,CAAwBpE,iBAAAA,EAC/B7C,KAAAA,CAAM6C,iBAAiB;;AAK3B,MAAA,MAAMyJ,YAAAA,GAAe,MAAM,IAAA,CAAKlG,IAAAA,CAC7BqB,OAAOtD,iCAAAA,CAAO8C,uBAAuB,EACrCS,GAAAA,CAAI;AACHF,QAAAA,SAAAA,sBAAerO,IAAAA,EAAAA;AACfoT,QAAAA,SAAAA,EAAWtM,OAAAA,CAAQvH;AACrB,OAAA,CAAA,CACC0O,KAAAA,CAAMC,GAAAA,CAAAA,GAAO0C,eAAAA,CAAAA,CAAAA;AAEhB,MAAA,MAAMyC,SAAAA,GAAYF,YAAAA,CAAa,CAAA,CAAA,CAAG3E,YAAAA,GAAe,CAAA;AAEjD,MAAA,IAAA,CAAKpP,MAAAA,CAAOQ,IAAAA,CACVkH,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAKmL,kCAAAA,CAAmC1L,IAAAA,EACxC,IAAA,CAAKyH,QAAAA,EACL,CAAA,gBAAA,EAAmB4M,SAAAA,GAAY,YAAA,GAAe,8BAAA,CAAA,CAAA,EAC9C;QAAE7E,YAAAA,EAAc2E,YAAAA,CAAa,CAAA,CAAA,CAAG3E;OAAa,CAAA;AAG/C,MAAA,OAAO;QAAEtM,MAAAA,EAAQmR;AAAU,OAAA;AAC7B,IAAA,CAAA,CAAA,OAAS/S,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVwG,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAKmL,kCAAAA,CAAmC1L,IAAAA,EACxC,IAAA,CAAKyH,QAAAA,EACL,+CAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAMgT,2CAAAA,CACJ3R,IACApC,cAAAA,EAC+D;AAC/D,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAK+T,2CAAAA,CAA4CtU,IAAAA,EACjD,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG,IAAA,CAAK6M,2CAAAA,CAA4CtU,IAAI,CAAA,OAAA,CAAA,EACxD;AAAE2C,QAAAA,EAAAA,EAAIA,GAAGsI,QAAAA;OAAW,CAAA;AAGtB,MAAA,MAAMsJ,IAAAA,GAAO,MAAM,IAAA,CAAKtG,IAAAA,CACrB4B,MAAAA,CAAO;AACNlN,QAAAA,EAAAA,EAAIqJ,kCAAO8C,uBAAAA,CAAwBnM,EAAAA;AACnC2F,QAAAA,uBAAAA,EACE0D,kCAAO8C,uBAAAA,CAAwBxG,uBAAAA;AACjCqC,QAAAA,eAAAA,EAAiBqB,kCAAO8C,uBAAAA,CAAwBnE,eAAAA;AAChDD,QAAAA,iBAAAA,EAAmBsB,kCAAO8C,uBAAAA,CAAwBpE;OACpD,CAAA,CACCyF,KAAKnE,iCAAAA,CAAO8C,uBAAuB,EACnCG,KAAAA,CACCC,GAAAA,CACEC,GAAGnD,iCAAAA,CAAO8C,uBAAAA,CAAwBnM,IAAIA,EAAAA,CAAAA,EACtCyM,OAAOpD,iCAAAA,CAAO8C,uBAAAA,CAAwBO,SAAS,CAAA,CAAA,CAAA,CAGlDwD,KAAAA,CAAM,CAAA,CAAA;AAET,MAAA,OAAO0B,KAAK,CAAA,CAAA;AACd,IAAA,CAAA,CAAA,OAASjT,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAK+T,4CAA4CtU,IAAAA,EACjD,IAAA,CAAKyH,QAAAA,EACL,sDAAA,EACAnG,KAAAA,EACA;AAAEqB,QAAAA,EAAAA,EAAIA,GAAGsI,QAAAA;OAAW,CAAA;AAEtB,MAAA,MAAM3J,KAAAA;AACR,IAAA;AACF,EAAA;;;;;;;;;EAUA,MAAMsK,wCAAAA,CACJ/D,OAIAC,OAAAA,EAC6B;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK1H,MAAAA,CAAOQ,KACVkH,OAAAA,CAAQvH,cAAAA,EACR,KAAKqL,wCAAAA,CAAyC5L,IAAAA,EAC9C,IAAA,CAAKyH,QAAAA,EACL,yDAAA,EACA;QAAE9E,EAAAA,EAAIkF,KAAAA,CAAMlF,GAAGsI,QAAAA;OAAW,CAAA;AAG5B,MAAA,MAAMuJ,YAAAA,GAAe,MAAM,IAAA,CAAKvG,IAAAA,CAC7BqB,OAAOtD,iCAAAA,CAAO8C,uBAAuB,EACrCS,GAAAA,CAAI;AACH3P,QAAAA,MAAAA,EAAQiI,KAAAA,CAAMjI,MAAAA;AACduK,QAAAA,SAAAA,EAAWrC,OAAAA,CAAQvH;AACrB,OAAA,CAAA,CACC0O,KAAAA,CACCC,GAAAA,CACEC,EAAAA,CAAGnD,kCAAO8C,uBAAAA,CAAwBnM,EAAAA,EAAIkF,KAAAA,CAAMlF,EAAE,GAC9CyM,MAAAA,CAAOpD,iCAAAA,CAAO8C,uBAAAA,CAAwBO,SAAS,CAAA,CAAA,CAAA;AAIrD,MAAA,MAAMgF,SAAAA,GAAYG,YAAAA,CAAa,CAAA,CAAA,CAAGhF,YAAAA,GAAe,CAAA;AAEjD,MAAA,IAAA,CAAKpP,MAAAA,CAAOQ,IAAAA,CACVkH,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAKqL,wCAAAA,CAAyC5L,IAAAA,EAC9C,IAAA,CAAKyH,QAAAA,EACL,CAAA,sBAAA,EAAyB4M,SAAAA,GAAY,YAAA,GAAe,8BAAA,CAAA,CAAA,EACpD;QAAE7E,YAAAA,EAAcgF,YAAAA,CAAa,CAAA,CAAA,CAAGhF;OAAa,CAAA;AAG/C,MAAA,OAAO;QAAEtM,MAAAA,EAAQmR;AAAU,OAAA;AAC7B,IAAA,CAAA,CAAA,OAAS/S,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,KAAAA,CACVwG,OAAAA,CAAQvH,cAAAA,EACR,IAAA,CAAKqL,wCAAAA,CAAyC5L,IAAAA,EAC9C,IAAA,CAAKyH,QAAAA,EACL,+DAAA,EACAnG,KAAAA,EACAuG,KAAAA,CAAAA;AAGF,MAAA,MAAMvG,KAAAA;AACR,IAAA;AACF,EAAA;AACF;;;AAnUyBoS,EAAAA,UAAAA,CAAAA,CAAAA,EAAAA,aAAAA,CAAAA,uCAAAA,CAAAA,aAAAA,CAAAA,CAAAA;;;;;;;;;;;;;;;;;;ACCZe,+BAAAA,GAAN,MAAMA,wBAAAA,CAAAA;AAAAA,EAAAA;;;;;EACMhN,QAAAA,GAAW,6BAAA;;;;AAK5B,EAAA,WAAA,CACmBrH,QACAsU,qBAAAA,EACjB;SAFiBtU,MAAAA,GAAAA,MAAAA;SACAsU,qBAAAA,GAAAA,qBAAAA;AAChB,EAAA;;;;;;EAOH,MAAMC,cAAAA,CACJ3S,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyB;AACzB,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKoU,eAAe3U,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGgN,yBAAwBzU,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK2U,cAAAA,CAAe3U,IAAI,CAAA,OAAA,CAAA,EAC9D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,MAAM+C,QAAAA,GAAW,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAIhD;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;MACvBjD,GAAAA,EAAK,sBAAA;MACLiC,OAAAA,EAAST,WAAAA,CAAYrC,OAAOyD,cAAAA,CAAeX,OAAAA;AAC3ChC,MAAAA,OAAAA,EAASuB,WAAAA,CAAYvB,OAAAA;MACrBmC,IAAAA,EAAMb;AACR,KAAA,EACAC,aACA1B,cAAAA,CAAAA;AAGF,IAAA,OAAOwE,QAAAA,CAAS9B,IAAAA;AAClB,EAAA;;;;;;;EAQA,MAAM2R,cAAAA,CACJ5S,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACqC;AACrC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKqU,eAAe5U,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGgN,yBAAwBzU,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK4U,cAAAA,CAAe5U,IAAI,CAAA,OAAA,CAAA,EAC9D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI,CAACA,OAAAA,CAAQ6S,KAAAA,IAAS,CAAC7S,QAAQ8S,UAAAA,EAAY;AACzC,MAAA,MAAM,IAAIlQ,MACR,qEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IAAI5C,QAAQ8S,UAAAA,EAAY;AACtB,MAAA,MAAM/P,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,qBAAA,EAAwBuB,QAAQ8S,UAAU,CAAA,CAAA;QAC/CpS,OAAAA,EAAST,WAAAA,CAAYrC,OAAOyD,cAAAA,CAAeX,OAAAA;AAC3ChC,QAAAA,OAAAA,EAASuB,WAAAA,CAAYvB;AACvB,OAAA,EACAuB,aACA1B,cAAAA,CAAAA;AAGJ,MAAA,IAAI,CAACwE,SAAS9B,IAAAA,EAAM;AAClB,QAAA,OAAOzB,MAAAA;AACT,MAAA;AAEA,MAAA,OAAOuD,QAAAA,CAAS9B,IAAAA;AAClB,IAAA;AAEA,IAAA,IAAIjB,QAAQ6S,KAAAA,EAAO;AACjB,MAAA,MAAM9P,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,4BAAA,EAA+BuB,QAAQ6S,KAAK,CAAA,CAAA;QACjDnS,OAAAA,EAAST,WAAAA,CAAYrC,OAAOyD,cAAAA,CAAeX,OAAAA;AAC3ChC,QAAAA,OAAAA,EAASuB,WAAAA,CAAYvB;AACvB,OAAA,EACAuB,aACA1B,cAAAA,CAAAA;AAGJ,MAAA,IAAI,CAACwE,QAAAA,CAAS9B,IAAAA,IAAQ8B,QAAAA,CAAS9B,IAAAA,CAAKuI,WAAW,CAAA,EAAG;AAChD,QAAA,OAAOhK,MAAAA;AACT,MAAA;AAEA,MAAA,OAAOuD,QAAAA,CAAS9B,KAAK,CAAA,CAAA;AACvB,IAAA;AACF,EAAA;;;;;;AAOA,EAAA,MAAM8R,cAAAA,CACJD,UAAAA,EACA9S,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyC;AACzC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKwU,eAAe/U,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGgN,yBAAwBzU,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK+U,cAAAA,CAAe/U,IAAI,CAAA,OAAA,CAAA,EAC9D;AAAE8U,MAAAA,UAAAA;AAAY9S,MAAAA;KAAQ,CAAA;AAGxB,IAAA,MAAM+C,QAAAA,GAAW,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAIhD;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAY0D,GAAAA;AACvBlD,MAAAA,GAAAA,EAAK,wBAAwBqU,UAAAA,CAAAA,CAAAA;MAC7BpS,OAAAA,EAAST,WAAAA,CAAYrC,OAAOyD,cAAAA,CAAeX,OAAAA;AAC3ChC,MAAAA,OAAAA,EAASuB,WAAAA,CAAYvB,OAAAA;MACrBmC,IAAAA,EAAMb;AACR,KAAA,EACAC,aACA1B,cAAAA,CAAAA;AAGF,IAAA,OAAOwE,QAAAA,CAAS9B,IAAAA;AAClB,EAAA;;;;EAKA,MAAM+R,cAAAA,CACJF,UAAAA,EACA7S,WAAAA,EACA1B,cAAAA,EAC6B;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKyU,eAAehV,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGgN,yBAAwBzU,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKgV,cAAAA,CAAehV,IAAI,CAAA,OAAA,CAAA,EAC9D;AAAE8U,QAAAA;OAAW,CAAA;AAGf,MAAA,MAAM,IAAA,CAAKJ,sBAAsB3S,yBAAAA,CAC/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYyE,MAAAA;AACvBjE,QAAAA,GAAAA,EAAK,wBAAwBqU,UAAAA,CAAAA,CAAAA;QAC7BpS,OAAAA,EAAST,WAAAA,CAAYrC,OAAOyD,cAAAA,CAAeX,OAAAA;AAC3ChC,QAAAA,OAAAA,EAASuB,WAAAA,CAAYvB;AACvB,OAAA,EACAuB,aACA1B,cAAAA,CAAAA;AAGF,MAAA,OAAO;QAAE2C,MAAAA,EAAQ;AAAK,OAAA;AACxB,IAAA,CAAA,CAAA,OAAS5B,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKlB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKyU,eAAehV,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,qCAAA,EACAnG,KAAAA,CAAAA;AAGF,MAAA,MAAMA,KAAAA;AACR,IAAA;AACF,EAAA;AACF;;;;;;;;;;;ACjOO,SAAS2T,eAAeC,SAAAA,EAAiB;AAC9C,EAAA,IAAI;AACF,IAAA,MAAMzU,GAAAA,GAAM,IAAI0U,GAAAA,CAAID,SAAAA,CAAAA;AACpB,IAAA,OAAOzU,GAAAA,CAAI2U,QAAAA,KAAa,OAAA,IAAW3U,GAAAA,CAAI2U,QAAAA,KAAa,QAAA;EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AACT,EAAA;AACF;AAPgBH,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;;;;;;;;;;;;;;ACWHI,wBAAAA,GAAN,MAAMA,iBAAAA,CAAAA;AAAAA,EAAAA;;;;;EACM5N,QAAAA,GAAW,cAAA;;;;AAK5B,EAAA,WAAA,CACmB6N,yBACAlV,MAAAA,EACjB;SAFiBkV,uBAAAA,GAAAA,uBAAAA;SACAlV,MAAAA,GAAAA,MAAAA;AAChB,EAAA;;;;;;;;;;AAWHmV,EAAAA,cAAAA,CACEtT,aACA1B,cAAAA,EACiC;AACjC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKgV,eAAevV,IAAAA,EACpB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG4N,kBAAiBrV,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKuV,cAAAA,CAAevV,IAAI,CAAA,OAAA,CAAA,EACvD;AAAEiC,MAAAA;KAAY,CAAA;AAGhB,IAAA,IAAI,CAACA,YAAYrC,MAAAA,EAAQ;AACvB,MAAA,MAAM,IAAIgF,MAAM,sCAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM,EAAEhF,MAAAA,EAAAA,OAAAA,EAAM,GAAKqC,WAAAA;AAEnB,IAAA,MAAM6H,iBAAAA,GAAoBlK,OAAAA,CAAOkK,iBAAAA,IAAqB,EAAC;AACvD,IAAA,MAAMzG,cAAAA,GAAiBzD,OAAAA,CAAOyD,cAAAA,IAAkB,EAAC;AAEjD,IAAA,IAAImS,MAAAA,CAAOvQ,IAAAA,CAAK6E,iBAAAA,CAAAA,CAAmB0B,SAAS,CAAA,EAAG;AAC7C,MAAA,IAAI,CAAC1B,kBAAkB2L,MAAAA,EAAQ;AAC7B,QAAA,MAAM,IAAI7Q,MACR,yDAAA,CAAA;MAEJ,CAAA,MAAA,IAAW,CAACkF,kBAAkB4L,MAAAA,EAAQ;AACpC,QAAA,MAAM,IAAI9Q,MACR,yDAAA,CAAA;MAEJ,CAAA,MAAA,IAAW,CAACkF,kBAAkB6L,cAAAA,EAAgB;AAC5C,QAAA,MAAM,IAAI/Q,MACR,iEAAA,CAAA;AAEJ,MAAA;IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAIA,MACR,mEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IAAI4Q,MAAAA,CAAOvQ,IAAAA,CAAK5B,cAAAA,CAAAA,CAAgBmI,SAAS,CAAA,EAAG;AAC1C,MAAA,IAAI,CAACnI,eAAeX,OAAAA,EAAS;AAC3B,QAAA,MAAM,IAAIkC,MACR,uDAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,IAAI,CAACqQ,cAAAA,CAAe5R,cAAAA,CAAeX,OAAO,CAAA,EAAG;AAC3C,QAAA,MAAM,IAAIkC,MACR,gEAAA,CAAA;AAEJ,MAAA;IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAIA,MACR,6DAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,MAAMlE,OAAAA,GAAkC;;MAEtCkV,aAAAA,EAAe,CAAA,OAAA,EAAU9L,kBAAkB2L,MAAM,CAAA;AACnD,KAAA;AAEA,IAAA,OAAO;MACL,GAAGxT,WAAAA;AACHvB,MAAAA;AACF,KAAA;AACF,EAAA;;;;;;;;;;EAWA,MAAMmV,eAAAA,CACJ5T,aACA1B,cAAAA,EACkB;AAClB,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKsV,gBAAgB7V,IAAAA,EACrB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG4N,kBAAiBrV,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK6V,eAAAA,CAAgB7V,IAAI,CAAA,OAAA,CAAA,EACxD;AAAEiC,MAAAA;KAAY,CAAA;AAIhB,IAAA,MAAM6T,oBAAAA,GAAuB,IAAA,CAAKP,cAAAA,CAChCtT,WAAAA,EACA1B,cAAAA,CAAAA;AAIF,IAAA,MAAM,IAAA,CAAK+U,wBAAwBV,cAAAA,CACjC;MACEC,KAAAA,EAAO;AACT,KAAA,EACAiB,sBACAvV,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKsV,gBAAgB7V,IAAAA,EACrB,IAAA,CAAKyH,UACL,+DAAA,CAAA;AAGF,IAAA,OAAO,IAAA;AACT,EAAA;;;;;;;;AASAsO,EAAAA,gBAAAA,CACE9T,aACA1B,cAAAA,EACiB;AACjB,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKwV,iBAAiB/V,IAAAA,EACtB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG4N,kBAAiBrV,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK+V,gBAAAA,CAAiB/V,IAAI,CAAA,OAAA,CAAA,EACzD;AAAEiC,MAAAA;KAAY,CAAA;AAGhB,IAAA,MAAM,IAAI2C,MAAM,yBAAA,CAAA;AAClB,EAAA;AACF;;;;;;;;;;;AC5JA,SAASoR,UAAUC,CAAAA,EAAe;AAChC,EAAA,IAAIA,CAAAA,CAAEC,WAAAA,EAAa,OAAO/P,kBAAAA,CAAmBgQ,QAAAA;AAC7C,EAAA,IAAIF,CAAAA,CAAEG,UAAAA,EAAY,OAAOjQ,kBAAAA,CAAmBkQ,OAAAA;AAC5C,EAAA,IAAIJ,CAAAA,CAAEK,UAAAA,IAAc,IAAItV,IAAAA,CAAKiV,CAAAA,CAAEK,UAAU,CAAA,mBAAI,IAAItV,IAAAA,EAAAA,EAC/C,OAAOmF,kBAAAA,CAAmBoQ,OAAAA;AAC5B,EAAA,OAAOpQ,kBAAAA,CAAmByI,MAAAA;AAC5B;AANSoH,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAaF,SAASQ,uBAAAA,CACdC,KACAxU,WAAAA,EAA4C;AAE5C,EAAA,MAAMyU,MAAAA,uBAAaC,GAAAA,EAAAA;AACnB,EAAA,KAAA,MAAWV,CAAAA,IAAKQ,IAAIxT,IAAAA,EAAM;AACxB,IAAA,MAAM2T,GAAAA,GAAM,CAAA,EAAGX,CAAAA,CAAEY,WAAW,CAAA,CAAA,EAAIZ,CAAAA,CAAEK,UAAAA,EAAYQ,KAAAA,CAAM,GAAA,CAAA,CAAK,CAAA,CAAE,CAAA,CAAA;AAC3D,IAAA,MAAMC,IAAAA,GAAOL,MAAAA,CAAOpS,GAAAA,CAAIsS,GAAAA,KAAQ,EAAA;AAChCG,IAAAA,IAAAA,CAAKnH,KAAKqG,CAAAA,CAAAA;AACVS,IAAAA,MAAAA,CAAOnH,GAAAA,CAAIqH,KAAKG,IAAAA,CAAAA;AAClB,EAAA;AAEA,EAAA,MAAMrE,UAAqB,EAAA;AAC3B,EAAA,IAAIsE,KAAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,GAAGC,KAAAA,CAAAA,IAAUP,MAAAA,EAAQ;AAC9B,IAAA,MAAMQ,KAAAA,GAAQD,MAAM,CAAA,CAAA;AACpB,IAAA,MAAME,cAAcF,KAAAA,CAAM/D,GAAAA,CAAI,CAACkE,CAAAA,KAAMA,EAAEC,WAAW,CAAA;AAClD3E,IAAAA,OAAAA,CAAQ9C,IAAAA,CAAK;MACXjN,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnB1O,MAAAA,uBAAAA,EAAyBrG,WAAAA,CAAYU,EAAAA;AACrCqF,MAAAA,SAAAA,EAAW/F,WAAAA,CAAY+F,SAAAA;AACvBhI,MAAAA,IAAAA,EAAMkX,KAAAA,CAAML,WAAAA;AACZS,MAAAA,WAAAA,EAAaJ,MAAMK,kBAAAA,IAAsB/V,MAAAA;AACzCwH,MAAAA,IAAAA,EAAM9C,gBAAAA,CAAiBsR,MAAAA;AACvBtU,MAAAA,MAAAA,EAAQ8S,UAAUkB,KAAAA,CAAAA;AAClBO,MAAAA,UAAAA,EAAYP,KAAAA,CAAMvU,EAAAA;AAClB+U,MAAAA,SAAAA,EAAWR,MAAMZ,UAAAA,GAAa,IAAItV,IAAAA,CAAKkW,KAAAA,CAAMZ,UAAU,CAAA,GAAI9U,MAAAA;AAC3DmW,MAAAA,WAAAA,EAAaT,KAAAA,CAAMZ,UAAAA,EAAYQ,KAAAA,CAAM,GAAA,EAAK,CAAA,CAAA;MAC1Cc,QAAAA,EAAU,IAAI5W,IAAAA,CAAKkW,KAAAA,CAAMW,SAAS,CAAA;AAClCC,MAAAA,SAAAA,EAAWZ,KAAAA,CAAMW,SAAAA,CAAUf,KAAAA,CAAM,GAAA,EAAK,CAAA,CAAA;AACtCvK,MAAAA,KAAAA,EAAO2K,KAAAA,CAAMG,WAAAA;AACbU,MAAAA,QAAAA,EAAUZ,WAAAA,CAAY3L,MAAAA;MACtBpB,IAAAA,EAAM;QACJ4N,kBAAAA,EAAoB;AAClBlD,UAAAA,UAAAA,EAAYoC,KAAAA,CAAMe,WAAAA;AAClBC,UAAAA,YAAAA,EAAchB,KAAAA,CAAMiB,aAAAA;AACpBC,UAAAA,QAAAA,EAAUlB,MAAMmB,SAAAA,KAAc,CAAA;AAC9BlB,UAAAA,WAAAA;AACAmB,UAAAA,UAAAA,EAAYpB,KAAAA,CAAMhB,WAAAA;AAClBqC,UAAAA,SAAAA,EAAWrB,KAAAA,CAAMd;AACnB;AACF;KACF,CAAA;AACAY,IAAAA,KAAAA,EAAAA;AACF,EAAA;AAEA,EAAA,OAAO;AACLvE,IAAAA,UAAAA,EAAYC,OAAAA,CAAQlH,MAAAA;AACpBkH,IAAAA;AACF,GAAA;AACF;AAlDgB8D,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;;;;;;;;;;;;ACCHgC,0BAAAA,GAAN,MAAMA,mBAAAA,CAAAA;AAAAA,EAAAA;;;;;;EACM/Q,QAAAA,GAAW,wBAAA;;;;EAK5B,WAAA,CACmBrH,MAAAA,EACAsU,uBACA+D,gBAAAA,EACjB;SAHiBrY,MAAAA,GAAAA,MAAAA;SACAsU,qBAAAA,GAAAA,qBAAAA;SACA+D,gBAAAA,GAAAA,gBAAAA;AAChB,EAAA;;;;;;EAOH,MAAMC,oBAAAA,CACJ1W,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACmC;AACnC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKmY,qBAAqB1Y,IAAAA,EAC1B,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAG+Q,oBAAmBxY,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK0Y,oBAAAA,CAAqB1Y,IAAI,CAAA,OAAA,CAAA,EAC/D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAGF,IAAA,MAAMwO,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,IAAA,MAAMC,OAAO5W,OAAAA,CAAQuO,OAAAA;AAErB,IAAA,IAAIqI,IAAAA,EAAMlI,QAAQ,IAAA,EAAM3B,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO+T,IAAAA,CAAKlI,IAAI,CAAA,CAAA;AAC1D,IAAA,IAAIkI,IAAAA,EAAMtI,SAAS,IAAA,EAAMvB,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO+T,IAAAA,CAAKtI,KAAK,CAAA,CAAA;AAEhE,IAAA,MAAMuI,kBAAAA,GACJD,IAAAA,EAAMnH,OAAAA,GAAU,CAAA,CAAA,EAAIZ,EAAAA,KAAOzK,qBAAAA,CAAsB0S,MAAAA,GAC7CF,IAAAA,CAAKnH,OAAAA,CAAQ,CAAA,CAAA,CAAGlD,SAChB,EAAA;AAEN,IAAA,IAAIsK,kBAAAA,CAAmBE,QAAAA,CAAS5S,kBAAAA,CAAmBoQ,OAAO,CAAA,EAAG;AAC3DxH,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,WAAW,MAAA,CAAA;IACvB,CAAA,MAAO;AACLR,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,WAAW,OAAA,CAAA;AACvB,IAAA;AAEA,IAAA,IAAIsJ,kBAAAA,CAAmBE,QAAAA,CAAS5S,kBAAAA,CAAmBgQ,QAAQ,CAAA,EAAG;AAC5DpH,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,YAAY,MAAA,CAAA;IACxB,CAAA,MAAO;AACLR,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,YAAY,OAAA,CAAA;AACxB,IAAA;AAEA,IAAA,IAAIsJ,kBAAAA,CAAmBE,QAAAA,CAAS5S,kBAAAA,CAAmBkQ,OAAO,CAAA,EAAG;AAC3DtH,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,WAAW,MAAA,CAAA;IACvB,CAAA,MAAO;AACLR,MAAAA,KAAAA,CAAMQ,GAAAA,CAAI,WAAW,OAAA,CAAA;AACvB,IAAA;AAEA,IAAA,MAAMyJ,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,IAAA,MAAMxK,GAAAA,GACJ,wBAAwBuB,OAAAA,CAAQ8S,UAAU,cACzCkE,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,IAAA,MAAMlF,GAAAA,GACJ,MAAM,IAAA,CAAKY,qBAAAA,CAAsB3S,yBAAAA,CAC/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;AACvB3D,MAAAA,GAAAA;MACAiC,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,MAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,KAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,IAAA,OAAOiW,uBAAAA,CAAwB1C,KAAKgC,oBAAAA,CAAAA;AACtC,EAAA;AACF;;;;;;;;;;;;AC1GO,SAASmD,kBAAAA,CAAmBC,MAAYC,YAAAA,EAAqB;AAClE,EAAA,MAAMC,IAAAA,GAAOF,KAAKG,WAAAA,EAAW;AAC7B,EAAA,MAAMC,KAAAA,GAAQzU,OAAOqU,IAAAA,CAAKK,QAAAA,KAAa,CAAA,CAAA,CAAGC,QAAAA,CAAS,CAAA,EAAG,GAAA,CAAA;AACtD,EAAA,MAAMC,GAAAA,GAAM5U,OAAOqU,IAAAA,CAAKQ,OAAAA,EAAO,CAAA,CAAIF,QAAAA,CAAS,GAAG,GAAA,CAAA;AAC/C,EAAA,MAAMG,KAAAA,GAAQR,eAAe,IAAA,GAAO,IAAA;AACpC,EAAA,MAAMS,OAAAA,GAAUT,eAAe,IAAA,GAAO,IAAA;AACtC,EAAA,MAAMU,OAAAA,GAAUV,eAAe,IAAA,GAAO,IAAA;AAGtC,EAAA,OAAO,CAAA,EAAGC,IAAAA,CAAAA,CAAAA,EAAQE,KAAAA,CAAAA,CAAAA,EAASG,GAAAA,CAAAA,CAAAA,EAAOE,KAAAA,CAAAA,CAAAA,EAASC,OAAAA,CAAAA,CAAAA,EAAWC,OAAAA,CAAAA,MAAAA,CAAAA;AACxD;AAVgBZ,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAeT,SAASa,yBAAyBC,SAAAA,EAAiB;AACxD,EAAA,MAAMC,SAAAA,GAAYD,SAAAA,CAAUE,KAAAA,CAAM,gBAAA,CAAA;AAClC,EAAA,OAAOD,SAAAA,GAAYA,SAAAA,CAAU,CAAA,CAAA,GAAK,EAAA;AACpC;AAHgBF,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAKhB,SAASI,aAAaC,GAAAA,EAAW;AAC/B,EAAA,OAAOA,GAAAA,CAAIC,WAAW,WAAA,EAAa,CAACC,GAAGC,MAAAA,KACrCA,MAAAA,CAAO/G,aAAW,CAAA;AAEtB;AAJS2G,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AASF,SAASK,uBAAuBC,MAAAA,EAAe;AACpD,EAAA,IAAIA,MAAAA,KAAW,IAAA,IAAQA,MAAAA,KAAWhZ,MAAAA,EAAW;AAC3C,IAAA,OAAOgZ,MAAAA;AACT,EAAA;AACA,EAAA,IAAIC,KAAAA,CAAMC,OAAAA,CAAQF,MAAAA,CAAAA,EAAS;AACzB,IAAA,OAAOA,OAAOtH,GAAAA,CAAI,CAACyH,IAAAA,KAASJ,sBAAAA,CAAuBI,IAAAA,CAAAA,CAAAA;AACrD,EAAA;AACA,EAAA,IAAI,OAAOH,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAMI,YAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAChE,GAAAA,EAAKrK,KAAAA,KAAUiJ,MAAAA,CAAOqF,OAAAA,CAAQL,MAAAA,CAAAA,EAAS;AACjDI,MAAAA,SAAAA,CAAUV,YAAAA,CAAatD,GAAAA,CAAAA,CAAAA,GAAQ2D,uBAAuBhO,KAAAA,CAAAA;AACxD,IAAA;AACA,IAAA,OAAOqO,SAAAA;AACT,EAAA;AACA,EAAA,OAAOJ,MAAAA;AACT;AAfgBD,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;AChCT,IAAMO,aAAAA,mBAAgB,MAAA,CAAA,OAI3BC,iBAAAA,EACAC,cAAAA,EACAC,SAAAA,KAAAA;AAEA,EAAA,MAAMhE,QAAa,EAAA;AACnBA,EAAAA,KAAAA,CAAMrH,IAAAA,CAAI,GAAImL,iBAAAA,CAAkB9X,IAAI,CAAA;AAEpC,EAAA,IAAI,CAAC+X,cAAAA,EAAgB;AACnB,IAAA,OAAO/D,KAAAA;AACT,EAAA;AAEA,EAAA,MAAMiE,QAAAA,GAAWH,kBAAkB3Q,IAAAA,CAAK+Q,SAAAA;AAExC,EAAA,KAAA,IAASzK,IAAAA,GAAO,CAAA,EAAGA,IAAAA,IAAQwK,QAAAA,EAAUxK,QAAQ,CAAA,EAAG;AAC9C,IAAA,MAAM0K,YAAAA,GAAe,MAAMH,SAAAA,CAAUvK,IAAAA,CAAAA;AACrCuG,IAAAA,KAAAA,CAAMrH,IAAAA,CAAI,GAAIwL,YAAAA,CAAanY,IAAI,CAAA;AACjC,EAAA;AAEA,EAAA,OAAOgU,KAAAA;AACT,CAAA,EAvB6B,eAAA;;;ACwNtB,IAAKoE,wBAAAA,6BAAAA,yBAAAA,EAAAA;;;;AAAAA,EAAAA,OAAAA,yBAAAA;;AA+EL,IAAMC,uBAAAA,GAA0B;EACrCC,WAAAA,EAAa,aAAA;EACbC,OAAAA,EAAS,SAAA;EACTC,MAAAA,EAAQ;AACV;;;ACvSO,IAAKC,6BAAAA,6BAAAA,8BAAAA,EAAAA;;;;AAAAA,EAAAA,OAAAA,8BAAAA;;AAML,IAAKC,wBAAAA,6BAAAA,yBAAAA,EAAAA;;AAAAA,EAAAA,OAAAA,yBAAAA;;AC0BZ,IAAMC,sBAAAA,GAAsD;AAC1DC,EAAAA,MAAAA,EAAQC,kBAAAA,CAAYC,GAAAA;AACpBC,EAAAA,OAAAA,EAASF,kBAAAA,CAAYG,GAAAA;AACrBC,EAAAA,SAAAA,EAAWJ,kBAAAA,CAAYK,GAAAA;AACvBC,EAAAA,QAAAA,EAAUN,kBAAAA,CAAYO,GAAAA;AACtBC,EAAAA,MAAAA,EAAQR,kBAAAA,CAAYS,GAAAA;AACpBC,EAAAA,QAAAA,EAAUV,kBAAAA,CAAYW,GAAAA;AACtBC,EAAAA,MAAAA,EAAQZ,kBAAAA,CAAYa;AACtB,CAAA;AAIO,SAASC,qBACdC,KAAAA,EAAmB;AAEnB,EAAA,IAAI,CAACA,OAAO,OAAOrb,MAAAA;AACnB,EAAA,OAAO;AACLmB,IAAAA,EAAAA,EAAIka,KAAAA,CAAMla,EAAAA;AACVlC,IAAAA,GAAAA,EAAKoc,KAAAA,CAAMpc,GAAAA;AACXqc,IAAAA,WAAAA,EAAaD,KAAAA,CAAME,YAAAA;AACnBtV,IAAAA,QAAAA,EAAUoV,KAAAA,CAAMG,SAAAA;AAChBC,IAAAA,QAAAA,EAAUJ,KAAAA,CAAMK;AAClB,GAAA;AACF;AAXgBN,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAahB,SAASO,iBAAiBC,QAAAA,EAAkB;AAC1C,EAAA,OAAOA,QAAAA,CAASlK,IAAI,CAACuG,GAAAA,KAAQmC,uBAAuBnC,GAAAA,CAAI4D,WAAAA,EAAW,CAAG,CAAA;AACxE;AAFSF,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAQT,SAASG,4BAAAA,CACPC,SAAAA,EACAC,QAAAA,EACAxG,KAAAA,EAAa;AAEb,EAAA,MAAMyG,kBAAAA,GAAqBD,QAAAA,GAAWA,QAAAA,CAASjK,WAAAA,EAAW,GAAK,KAAA;AAE/D,EAAA,IAAI,CAACgK,SAAAA,CAAUH,QAAAA,IAAYG,SAAAA,CAAUH,QAAAA,CAAS5R,WAAW,CAAA,EAAG;AAC1D,IAAA,OAAO;AACL,MAAA;AACE7I,QAAAA,EAAAA,EAAIiI,OAAOoM,KAAAA,CAAAA;AACXS,QAAAA,UAAAA,EAAY8F,SAAAA,CAAU5a,EAAAA;AACtBO,QAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI,MAAAA;AAClC8O,QAAAA,KAAAA,EAAOH,SAAAA,CAAUG,KAAAA;QACjBF,QAAAA,EAAUC,kBAAAA;QACV7d,MAAAA,EAAQ2d;AACV;;AAEJ,EAAA;AAEA,EAAA,OAAO;AACL,IAAA;AACE5a,MAAAA,EAAAA,EAAIiI,OAAOoM,KAAAA,CAAAA;AACXS,MAAAA,UAAAA,EAAY8F,SAAAA,CAAU5a,EAAAA;AACtBO,MAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI,MAAAA;AAClC8O,MAAAA,KAAAA,EAAOH,SAAAA,CAAUG,KAAAA;MACjBF,QAAAA,EAAUC,kBAAAA;MACVE,iBAAAA,EAAmBR,gBAAAA,CAAiBI,UAAUH,QAAQ;AACxD;;AAEJ;AA9BSE,MAAAA,CAAAA,4BAAAA,EAAAA,8BAAAA,CAAAA;AAoCF,SAASM,0BAAAA,CACdC,UAAAA,EACAL,QAAAA,EACAM,kBAAAA,EAA0B;AAE1B,EAAA,MAAML,kBAAAA,GAAqBD,QAAAA,GAAWA,QAAAA,CAASjK,WAAAA,EAAW,GAAK,KAAA;AAE/D,EAAA,OAAOsK,UAAAA,CAAW3K,GAAAA,CAAI,CAACqK,SAAAA,EAAWvG,KAAAA,MAAW;IAC3CrU,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;IACnB+G,KAAAA,EAAOvc,MAAAA;IACPgc,QAAAA,EAAUC,kBAAAA;AACVC,IAAAA,KAAAA,EAAOH,SAAAA,CAAUG,KAAAA;AACjBI,IAAAA,kBAAAA;AACAH,IAAAA,iBAAAA,EAAmBJ,SAAAA,CAAUH,QAAAA,GACzBD,gBAAAA,CAAiBI,SAAAA,CAAUH,QAAQ,CAAA,GACnC5b,MAAAA;AACJwc,IAAAA,UAAAA,EAAYV,4BAAAA,CAA6BC,SAAAA,EAAWC,QAAAA,EAAUxG,KAAAA,GAAQ,CAAA,CAAA;IACtEpX,MAAAA,EAAQ2d;GACV,CAAA,CAAA;AACF;AAnBgBK,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;AAuBT,SAASK,iCAAAA,CACdC,WAAAA,EACAlH,KAAAA,EACAmH,WAAAA,EAA6B;AAE7B,EAAA,OAAO;IACLxb,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAYyG,WAAAA,CAAYvb,EAAAA;AACxB3C,IAAAA,IAAAA,EAAMke,WAAAA,CAAYle,IAAAA;AAClBsX,IAAAA,WAAAA,EAAa4G,WAAAA,CAAY5G,WAAAA;AACzBtO,IAAAA,IAAAA,EAAM1C,uBAAAA,CAAwBiV,WAAAA;AAC9BrY,IAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI,MAAAA;IAClC1E,IAAAA,EAAM0S,oBAAAA,CAAqBsB,YAAYrB,KAAK,CAAA;IAC5CuB,YAAAA,EAAcxB,oBAAAA,CAAqBsB,YAAYrB,KAAK,CAAA;AACpDwB,IAAAA,MAAAA,EAAQT,2BACNM,WAAAA,CAAYI,WAAAA,EACZJ,WAAAA,CAAYV,QAAAA,EACZU,YAAYvb,EAAE,CAAA;IAEhB4b,mBAAAA,EAAqBJ,WAAAA;AACrBrN,IAAAA,SAAAA,EAAWoN,YAAYM,UAAAA,GACnB,IAAIxd,IAAAA,CAAKkd,WAAAA,CAAYM,UAAU,CAAA,GAC/Bhd,MAAAA;IACJ4I,IAAAA,EAAM;;AAEJqN,MAAAA,UAAAA,EAAYyG,WAAAA,CAAYvb,EAAAA;AACxB8b,MAAAA,WAAAA,EAAaP,WAAAA,CAAYQ,YAAAA;AACzBC,MAAAA,OAAAA,EAAST,WAAAA,CAAYU,QAAAA;AACrBC,MAAAA,OAAAA,EAASX,WAAAA,CAAYY,QAAAA;AACrBC,MAAAA,YAAAA,EAAcb,WAAAA,CAAYc,aAAAA;AAC1BC,MAAAA,eAAAA,EAAiBf,WAAAA,CAAYgB,gBAAAA;AAC7BC,MAAAA,SAAAA,EAAWjB,WAAAA,CAAYiB,SAAAA;AACvBC,MAAAA,SAAAA,EAAWlB,WAAAA,CAAYmB,UAAAA;AACvBC,MAAAA,iBAAAA,EAAmBpB,WAAAA,CAAYqB,mBAAAA;AAC/BC,MAAAA,0BAAAA,EAA4BtB,WAAAA,CAAYuB,6BAAAA;AACxCC,MAAAA,0BAAAA,EAA4BxB,WAAAA,CAAYyB,6BAAAA;AACxCC,MAAAA,MAAAA,EAAQ1B,WAAAA,CAAY2B,OAAAA;AACpBC,MAAAA,IAAAA,EAAM5B,WAAAA,CAAY4B,IAAAA;AAClBC,MAAAA,WAAAA,EAAa7B,WAAAA,CAAY8B,YAAAA;AACzBC,MAAAA,aAAAA,EAAe/B,WAAAA,CAAYgC,cAAAA;AAC3BC,MAAAA,OAAAA,EAASjC,WAAAA,CAAYiC,OAAAA;AACrBC,MAAAA,UAAAA,EAAYlC,WAAAA,CAAYkC,UAAAA;AACxBC,MAAAA,aAAAA,EAAenC,WAAAA,CAAYoC,cAAAA;AAC3BC,MAAAA,WAAAA,EAAarC,WAAAA,CAAYsC,YAAAA;AACzBC,MAAAA,+BAAAA,EACEvC,WAAAA,CAAYwC,kCAAAA;AACdC,MAAAA,wBAAAA,EAA0BzC,WAAAA,CAAY0C,0BAAAA;AACtCC,MAAAA,SAAAA,EAAW3C,WAAAA,CAAY9T,IAAAA;AACvB0W,MAAAA,eAAAA,EAAiB5C,WAAAA,CAAY6C,gBAAAA;AAC7BC,MAAAA,kBAAAA,EAAoB9C,WAAAA,CAAY+C,oBAAAA;AAChCC,MAAAA,sBAAAA,EAAwBhD,WAAAA,CAAYiD,wBAAAA;AACpCC,MAAAA,6BAAAA,EACElD,WAAAA,CAAYmD,+BAAAA;AACdC,MAAAA,+BAAAA,EACEpD,WAAAA,CAAYqD,kCAAAA;AACdC,MAAAA,SAAAA,EAAWtD,WAAAA,CAAYuD,UAAAA;AACvBC,MAAAA,SAAAA,EAAWxD,WAAAA,CAAYyD,UAAAA;AACvBC,MAAAA,0BAAAA,EAA4B1D,WAAAA,CAAY2D,6BAAAA;AACxCC,MAAAA,gBAAAA,EAAkB5D,WAAAA,CAAY6D,iBAAAA;AAC9BC,MAAAA,aAAAA,EAAe9D,WAAAA,CAAY+D,cAAAA;AAC3BC,MAAAA,wBAAAA,EAA0BhE,WAAAA,CAAYiE,2BAAAA;AACtCC,MAAAA,YAAAA,EAAclE,WAAAA,CAAYmE,cAAAA;AAC1BC,MAAAA,WAAAA,EAAapE,WAAAA,CAAYqE,aAAAA;AACzBC,MAAAA,gCAAAA,EACEtE,WAAAA,CAAYuE,mCAAAA;AACdpT,MAAAA,SAAAA,EAAW6O,WAAAA,CAAYwE;AACzB;AACF,GAAA;AACF;AApEgBzE,MAAAA,CAAAA,iCAAAA,EAAAA,mCAAAA,CAAAA;AAsET,SAAS0E,6BAAAA,CACdC,OAAAA,EACA5L,KAAAA,EACAmH,WAAAA,EAA6B;AAE7B,EAAA,OAAO;IACLxb,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAYmL,OAAAA,CAAQjgB,EAAAA;AACpB3C,IAAAA,IAAAA,EAAM4iB,OAAAA,CAAQ5iB,IAAAA;AACdsX,IAAAA,WAAAA,EAAasL,OAAAA,CAAQtL,WAAAA;AACrBtO,IAAAA,IAAAA,EAAM1C,uBAAAA,CAAwBkV,OAAAA;AAC9BtY,IAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI,MAAAA;IAClC1E,IAAAA,EAAM0S,oBAAAA,CAAqBgG,QAAQ/F,KAAK,CAAA;IACxCuB,YAAAA,EAAcxB,oBAAAA,CAAqBgG,QAAQ/F,KAAK,CAAA;AAChDwB,IAAAA,MAAAA,EAAQT,2BACNgF,OAAAA,CAAQtE,WAAAA,EACRsE,OAAAA,CAAQpF,QAAAA,EACRoF,QAAQjgB,EAAE,CAAA;IAEZ4b,mBAAAA,EAAqBJ,WAAAA;AACrBrN,IAAAA,SAAAA,EAAW8R,QAAQpE,UAAAA,GAAa,IAAIxd,IAAAA,CAAK4hB,OAAAA,CAAQpE,UAAU,CAAA,GAAIhd,MAAAA;IAC/D4I,IAAAA,EAAM;;AAEJqN,MAAAA,UAAAA,EAAYmL,OAAAA,CAAQjgB,EAAAA;AACpB8b,MAAAA,WAAAA,EAAamE,OAAAA,CAAQlE,YAAAA;AACrBhJ,MAAAA,MAAAA,EAAQkN,OAAAA,CAAQC,OAAAA;AAChB1hB,MAAAA,QAAAA,EAAUyhB,OAAAA,CAAQzhB,QAAAA;AAClB4e,MAAAA,WAAAA,EAAa6C,OAAAA,CAAQ5C,YAAAA;AACrBC,MAAAA,aAAAA,EAAe2C,OAAAA,CAAQ1C,cAAAA;AACvBC,MAAAA,OAAAA,EAASyC,OAAAA,CAAQzC,OAAAA;AACjBC,MAAAA,UAAAA,EAAYwC,OAAAA,CAAQxC,UAAAA;AACpBC,MAAAA,aAAAA,EAAeuC,OAAAA,CAAQtC,cAAAA;AACvBC,MAAAA,WAAAA,EAAaqC,OAAAA,CAAQpC,YAAAA;AACrBC,MAAAA,+BAAAA,EACEmC,OAAAA,CAAQlC,kCAAAA;AACVC,MAAAA,wBAAAA,EAA0BiC,OAAAA,CAAQhC,0BAAAA;AAClCkC,MAAAA,oBAAAA,EAAsBF,OAAAA,CAAQG,uBAAAA;AAC9BlC,MAAAA,SAAAA,EAAW+B,OAAAA,CAAQxY,IAAAA;AACnB0W,MAAAA,eAAAA,EAAiB8B,OAAAA,CAAQ7B,gBAAAA;AACzBC,MAAAA,kBAAAA,EAAoB4B,OAAAA,CAAQ3B,oBAAAA;AAC5BC,MAAAA,sBAAAA,EAAwB0B,OAAAA,CAAQzB,wBAAAA;AAChCC,MAAAA,6BAAAA,EAA+BwB,OAAAA,CAAQvB,+BAAAA;AACvCC,MAAAA,+BAAAA,EACEsB,OAAAA,CAAQrB,kCAAAA;AACVyB,MAAAA,eAAAA,EAAiBJ,OAAAA,CAAQK,gBAAAA;AACzBzD,MAAAA,0BAAAA,EAA4BoD,OAAAA,CAAQnD,6BAAAA;AACpCC,MAAAA,0BAAAA,EAA4BkD,OAAAA,CAAQjD,6BAAAA;AACpC6B,MAAAA,SAAAA,EAAWoB,OAAAA,CAAQnB,UAAAA;AACnBC,MAAAA,SAAAA,EAAWkB,OAAAA,CAAQjB,UAAAA;AACnBuB,MAAAA,oBAAAA,EAAsBN,OAAAA,CAAQO,uBAAAA;AAC9BC,MAAAA,gBAAAA,EAAkBR,OAAAA,CAAQS,iBAAAA;AAC1BrB,MAAAA,aAAAA,EAAeY,OAAAA,CAAQX,cAAAA;AACvBC,MAAAA,wBAAAA,EAA0BU,OAAAA,CAAQT,2BAAAA;AAClCC,MAAAA,YAAAA,EAAcQ,OAAAA,CAAQP,cAAAA;AACtBC,MAAAA,WAAAA,EAAaM,OAAAA,CAAQL,aAAAA;AACrBlT,MAAAA,SAAAA,EAAWuT,OAAAA,CAAQF;AACrB;AACF,GAAA;AACF;AA1DgBC,MAAAA,CAAAA,6BAAAA,EAAAA,+BAAAA,CAAAA;AA4DT,SAASW,4BAAAA,CACdC,QACAvM,KAAAA,EAAa;AAEb,EAAA,OAAO;IACLrU,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAY8L,MAAAA,CAAO5gB,EAAAA;AACnB3C,IAAAA,IAAAA,EAAMujB,MAAAA,CAAOvjB,IAAAA;AACbsX,IAAAA,WAAAA,EAAaiM,MAAAA,CAAOjM,WAAAA;AACpBtO,IAAAA,IAAAA,EAAM1C,uBAAAA,CAAwBmV,MAAAA;AAC9BvY,IAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI,MAAAA;IAClC1E,IAAAA,EAAM0S,oBAAAA,CAAqB2G,OAAO1G,KAAK,CAAA;IACvCuB,YAAAA,EAAcxB,oBAAAA,CAAqB2G,OAAO1G,KAAK,CAAA;AAC/CwB,IAAAA,MAAAA,EAAQT,2BACN2F,MAAAA,CAAOjF,WAAAA,EACPiF,MAAAA,CAAO/F,QAAAA,EACP+F,OAAO5gB,EAAE,CAAA;AAEXmO,IAAAA,SAAAA,EAAWyS,OAAO/E,UAAAA,GAAa,IAAIxd,IAAAA,CAAKuiB,MAAAA,CAAO/E,UAAU,CAAA,GAAIhd,MAAAA;IAC7D4I,IAAAA,EAAM;;AAEJqN,MAAAA,UAAAA,EAAY8L,MAAAA,CAAO5gB,EAAAA;AACnB8b,MAAAA,WAAAA,EAAa8E,MAAAA,CAAO7E,YAAAA;AACpB8E,MAAAA,QAAAA,EAAUD,MAAAA,CAAOE,SAAAA;AACjBC,MAAAA,SAAAA,EAAWH,MAAAA,CAAOG,SAAAA,CAAUxQ,GAAAA,CAAI,CAACyQ,QAAAA,MAAc;AAC7CC,QAAAA,YAAAA,EAAcD,QAAAA,CAASE,aAAAA;AACvB7Y,QAAAA,UAAAA,EAAY2Y,QAAAA,CAASG,WAAAA;AACrBC,QAAAA,YAAAA,EAAcJ,QAAAA,CAASK;OACzB,CAAA,CAAA;AACAJ,MAAAA,YAAAA,EAAcL,MAAAA,CAAOM,aAAAA;AACrB7Y,MAAAA,UAAAA,EAAYuY,MAAAA,CAAOO,WAAAA;AACnB/L,MAAAA,QAAAA,EAAUwL,MAAAA,CAAOxL,QAAAA;AACjBkM,MAAAA,uBAAAA,EAAyBV,MAAAA,CAAOW,yBAAAA;AAChCxO,MAAAA,MAAAA,EAAQ6N,MAAAA,CAAOV,OAAAA;AACf9C,MAAAA,WAAAA,EAAawD,MAAAA,CAAOvD,YAAAA;AACpBC,MAAAA,aAAAA,EAAesD,MAAAA,CAAOrD,cAAAA;AACtBC,MAAAA,OAAAA,EAASoD,MAAAA,CAAOpD,OAAAA;AAChBC,MAAAA,UAAAA,EAAYmD,MAAAA,CAAOnD,UAAAA;AACnBC,MAAAA,aAAAA,EAAekD,MAAAA,CAAOjD,cAAAA;AACtBC,MAAAA,WAAAA,EAAagD,MAAAA,CAAO/C,YAAAA;AACpBK,MAAAA,SAAAA,EAAW0C,MAAAA,CAAOnZ,IAAAA;AAClB0W,MAAAA,eAAAA,EAAiByC,MAAAA,CAAOxC,gBAAAA;AACxBC,MAAAA,kBAAAA,EAAoBuC,MAAAA,CAAOtC,oBAAAA;AAC3BC,MAAAA,sBAAAA,EAAwBqC,MAAAA,CAAOpC,wBAAAA;AAC/BgD,MAAAA,iBAAAA,EAAmBZ,MAAAA,CAAOa,kBAAAA;AAC1BpC,MAAAA,aAAAA,EAAeuB,MAAAA,CAAOtB,cAAAA;AACtB5S,MAAAA,SAAAA,EAAWkU,MAAAA,CAAOb;AACpB;AACF,GAAA;AACF;AAjDgBY,MAAAA,CAAAA,4BAAAA,EAAAA,8BAAAA,CAAAA;AAmDT,SAASe,sCAAAA,CACdpb,UACA+N,KAAAA,EAAa;AAEb,EAAA,OAAO;IACLrU,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAYxO,QAAAA,CAAStG,EAAAA;AACrB3C,IAAAA,IAAAA,EAAMiJ,QAAAA,CAASjJ,IAAAA;IACfoK,IAAAA,EAAM;AACJka,MAAAA,iBAAAA,EAAmBrb,QAAAA,CAASsb;AAC9B;AACF,GAAA;AACF;AAZgBF,MAAAA,CAAAA,sCAAAA,EAAAA,wCAAAA,CAAAA;AAmBT,SAASG,sCAAAA,CACdC,cACAzN,KAAAA,EAAa;AAEb,EAAA,MAAM0N,QACJD,YAAAA,CAAaE,MAAAA,IAAU,QAAQ,OAAOF,YAAAA,CAAaE,WAAW,QAAA,GAC1D;AAAEva,IAAAA,IAAAA,EAAMqa,YAAAA,CAAaE;GAAkC,GACvDnjB,MAAAA;AAEN,EAAA,OAAO;IACLmB,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAYgN,YAAAA,CAAa9hB,EAAAA;AACzB3C,IAAAA,IAAAA,EAAMykB,YAAAA,CAAazkB,IAAAA;AACnBgJ,IAAAA,IAAAA,EAAM4b,6BAAAA,CAAuBC,MAAAA;AAC7B3hB,IAAAA,MAAAA,EAAQ4V,aAAAA,CAAOlK,MAAAA;AACf8V,IAAAA,KAAAA;AACA5T,IAAAA,SAAAA,EAAW2T,aAAajG,UAAAA,GACpB,IAAIxd,IAAAA,CAAKyjB,YAAAA,CAAajG,UAAU,CAAA,GAChChd,MAAAA;IACJ4I,IAAAA,EAAM;AACJuL,MAAAA,cAAAA,EAAgB8O,YAAAA,CAAaK,eAAAA;AAC7BnG,MAAAA,OAAAA,EAAS8F,YAAAA,CAAa7F,QAAAA;AACtBmG,MAAAA,uBAAAA,EAAyBN,YAAAA,CAAaO,wBAAAA;AACtCpF,MAAAA,MAAAA,EAAQ6E,YAAAA,CAAa5E,OAAAA;AACrBC,MAAAA,IAAAA,EAAM2E,YAAAA,CAAa3E,IAAAA;AACnBmF,MAAAA,KAAAA,EAAOR,YAAAA,CAAaQ,KAAAA;AACpBC,MAAAA,YAAAA,EAAcT,YAAAA,CAAaU,cAAAA;AAC3BtW,MAAAA,SAAAA,EAAW4V,YAAAA,CAAaW,UAAAA;AACxBtU,MAAAA,SAAAA,EAAW2T,YAAAA,CAAajG;AAC1B;AACF,GAAA;AACF;AA/BgBgG,MAAAA,CAAAA,sCAAAA,EAAAA,wCAAAA,CAAAA;AAmCT,SAASa,oCAAAA,CACdC,YAAAA,EACA7S,UAAAA,EACA8S,YAAAA,EAA0C;AAE1C,EAAA,MAAM7S,OAAAA,GAAU4S,YAAAA,CAAapS,GAAAA,CAAI,CAACsS,KAAKxO,KAAAA,KAAAA;AACrC,IAAA,MAAMyO,gBAAgBF,YAAAA,EAAcjhB,GAAAA,CAAIkhB,GAAAA,CAAI7iB,EAAE,KAAK,EAAA;AACnD,IAAA,MAAMwb,WAAAA,GAAcsH,cAAcvS,GAAAA,CAAI,CAACqQ,QAAQmC,WAAAA,KAC7CpC,4BAAAA,CAA6BC,MAAAA,EAAQmC,WAAAA,CAAAA,CAAAA;AAEvC,IAAA,OAAOzH,kCACLuH,GAAAA,EACAxO,KAAAA,EACAmH,YAAY3S,MAAAA,GAAS,CAAA,GAAI2S,cAAc3c,MAAAA,CAAAA;EAE3C,CAAA,CAAA;AAEA,EAAA,OAAO;AACLiR,IAAAA,UAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AArBgB2S,MAAAA,CAAAA,oCAAAA,EAAAA,sCAAAA,CAAAA;AAuBT,SAASM,gCAAAA,CACdC,QAAAA,EACAnT,UAAAA,EACA8S,YAAAA,EAA0C;AAE1C,EAAA,MAAM7S,OAAAA,GAAUkT,QAAAA,CAAS1S,GAAAA,CAAI,CAAC0P,SAAS5L,KAAAA,KAAAA;AACrC,IAAA,MAAMyO,gBAAgBF,YAAAA,EAAcjhB,GAAAA,CAAIse,OAAAA,CAAQjgB,EAAE,KAAK,EAAA;AACvD,IAAA,MAAMwb,WAAAA,GAAcsH,cAAcvS,GAAAA,CAAI,CAACqQ,QAAQmC,WAAAA,KAC7CpC,4BAAAA,CAA6BC,MAAAA,EAAQmC,WAAAA,CAAAA,CAAAA;AAEvC,IAAA,OAAO/C,8BACLC,OAAAA,EACA5L,KAAAA,EACAmH,YAAY3S,MAAAA,GAAS,CAAA,GAAI2S,cAAc3c,MAAAA,CAAAA;EAE3C,CAAA,CAAA;AAEA,EAAA,OAAO;AACLiR,IAAAA,UAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AArBgBiT,MAAAA,CAAAA,gCAAAA,EAAAA,kCAAAA,CAAAA;AAuBT,SAASE,+BAAAA,CACdC,SACArT,UAAAA,EAAkB;AAElB,EAAA,MAAMC,OAAAA,GAAUoT,QAAQ5S,GAAAA,CAAI,CAACqQ,QAAQvM,KAAAA,KACnCsM,4BAAAA,CAA6BC,MAAAA,EAAQvM,KAAAA,CAAAA,CAAAA;AAGvC,EAAA,OAAO;AACLvE,IAAAA,UAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AAZgBmT,MAAAA,CAAAA,+BAAAA,EAAAA,iCAAAA,CAAAA;AAcT,SAASE,kCAAAA,CACdC,YACAvT,UAAAA,EAAkB;AAElB,EAAA,MAAMC,OAAAA,GAAUsT,WAAW9S,GAAAA,CAAI,CAACjK,UAAU+N,KAAAA,KACxCqN,sCAAAA,CAAuCpb,QAAAA,EAAU+N,KAAAA,CAAAA,CAAAA;AAGnD,EAAA,OAAO;AACLvE,IAAAA,UAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AAZgBqT,MAAAA,CAAAA,kCAAAA,EAAAA,oCAAAA,CAAAA;AAcT,SAASE,qCAAAA,CACdC,eACAzT,UAAAA,EAAkB;AAElB,EAAA,MAAMC,OAAAA,GAAUwT,cAAchT,GAAAA,CAAI,CAACuR,cAAczN,KAAAA,KAC/CwN,sCAAAA,CAAuCC,YAAAA,EAAczN,KAAAA,CAAAA,CAAAA;AAGvD,EAAA,OAAO;AACLvE,IAAAA,UAAAA;AACAC,IAAAA;AACF,GAAA;AACF;AAZgBuT,MAAAA,CAAAA,qCAAAA,EAAAA,uCAAAA,CAAAA;AAchB,SAASE,uCACPvC,YAAAA,EAAsC;AAEtC,EAAA,QAAQA,YAAAA;AACN,IAAA,KAAKvI,wBAAAA,CAAyBE,WAAAA;AAC5B,MAAA,OAAOjV,uBAAAA,CAAwBiV,WAAAA;AACjC,IAAA,KAAKF,wBAAAA,CAAyBG,OAAAA;AAC5B,MAAA,OAAOlV,uBAAAA,CAAwBkV,OAAAA;AACjC,IAAA,KAAKH,wBAAAA,CAAyBI,MAAAA;AAC5B,MAAA,OAAOnV,uBAAAA,CAAwBmV,MAAAA;AACjC,IAAA;AACE,MAAA,OAAOnV,uBAAAA,CAAwBiV,WAAAA;AACnC;AACF;AAbS4K,MAAAA,CAAAA,sCAAAA,EAAAA,wCAAAA,CAAAA;AAeF,SAASC,wCAAAA,CACdzC,UACA3M,KAAAA,EAAa;AAEb,EAAA,OAAO;IACLrU,EAAAA,EAAIiI,MAAAA,CAAOoM,QAAQ,CAAA,CAAA;AACnBS,IAAAA,UAAAA,EAAYkM,QAAAA,CAASG,WAAAA;AACrB9jB,IAAAA,IAAAA,EAAM2jB,QAAAA,CAASK,aAAAA;IACfhb,IAAAA,EAAMmd,sCAAAA,CAAuCxC,SAASE,aAAa,CAAA;AACnE3gB,IAAAA,MAAAA,EAAQqD,yBAAAA,CAA0BqI;AACpC,GAAA;AACF;AAXgBwX,MAAAA,CAAAA,wCAAAA,EAAAA,0CAAAA,CAAAA;AAaT,SAASC,4CACd3C,SAAAA,EAAqC;AAErC,EAAA,MAAMhR,OAAAA,GAAUgR,UAAUxQ,GAAAA,CAAI,CAACyQ,UAAU3M,KAAAA,KACvCoP,wCAAAA,CAAyCzC,QAAAA,EAAU3M,KAAAA,CAAAA,CAAAA;AAGrD,EAAA,OAAO;AACLvE,IAAAA,UAAAA,EAAYC,OAAAA,CAAQlH,MAAAA;AACpBkH,IAAAA;AACF,GAAA;AACF;AAXgB2T,MAAAA,CAAAA,2CAAAA,EAAAA,6CAAAA,CAAAA;AAehB,SAASC,WAAAA,CACPrP,OACAsP,UAAAA,EAA+B;AAE/B,EAAA,MAAMhd,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAWoR,QAAQ1D,KAAAA,EAAO;AACxB,IAAA,MAAML,GAAAA,GAAM2P,WAAW5L,IAAAA,CAAAA;AAEvB,IAAA,IAAI,CAACpR,MAAAA,CAAOqN,GAAAA,GAAMrN,MAAAA,CAAOqN,GAAAA,IAAO,EAAA;AAChCrN,IAAAA,MAAAA,CAAOqN,GAAAA,CAAAA,CAAKhH,IAAAA,CAAK+K,IAAAA,CAAAA;AACnB,EAAA;AACA,EAAA,OAAOpR,MAAAA;AACT;AAZS+c,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAcF,SAASE,4CACdZ,QAAAA,EAAqC;AAErC,EAAA,MAAMa,WAAWb,QAAAA,CAASjU,MAAAA,CAAO,CAAC+U,CAAAA,KAAMA,CAAAA,CAAEC,qBAAqB,CAAA,CAAA;AAC/D,EAAA,MAAMC,OAAAA,GAAUN,WAAAA,CAAYG,QAAAA,EAAU,CAACC,CAAAA,KAAAA;AACrC,IAAA,MAAMG,SAAAA,GAAYH,CAAAA,CAAEI,UAAAA,CAAW7M,KAAAA,CAAM,sBAAA,CAAA;AACrC,IAAA,OAAO4M,SAAAA,GAAYA,SAAAA,CAAU,CAAA,CAAA,GAAK,EAAA;EACpC,CAAA,CAAA;AAEA,EAAA,MAAME,QAAmCvR,MAAAA,CAAOqF,OAAAA,CAAQ+L,OAAAA,CAAAA,CACrDjV,MAAAA,CAAO,CAAC,CAACuH,IAAAA,CAAAA,KAAUA,IAAAA,KAAS,EAAA,CAAA,CAC5BhG,GAAAA,CAAI,CAAC,CAACgG,IAAAA,EAAM8N,WAAAA,CAAAA,KAAY;AACvB,IAAA,MAAMC,IAAAA,GAA6BD,WAAAA,CAAY9T,GAAAA,CAAI,CAAC0P,OAAAA,KAAAA;AAClD,MAAA,MAAMsE,QAAAA,GAAWpN,wBAAAA,CAAyB8I,OAAAA,CAAQkE,UAAU,CAAA;AAC5D,MAAA,MAAMK,MAAAA,GAASrN,wBAAAA,CAAyB8I,OAAAA,CAAQwE,QAAQ,CAAA;AAExD,MAAA,MAAM,EAAEN,UAAAA,EAAY3kB,SAAAA,EAAWilB,UAAUC,OAAAA,EAAS,GAAGjd,MAAAA,GAASwY,OAAAA;AAC9D,MAAA,MAAM0E,aAAAA,GAAgB/M,uBAAuBnQ,IAAAA,CAAAA;AAI7C,MAAA,OAAO;AAAE8c,QAAAA,QAAAA;AAAUC,QAAAA,MAAAA;QAAQ/c,IAAAA,EAAMkd;AAAc,OAAA;IACjD,CAAA,CAAA;AACA,IAAA,OAAO;MACLpO,IAAAA,EAAM,IAAIlY,KAAKkY,IAAAA,CAAAA;AACf9O,MAAAA,IAAAA,EAAM,EAAC;AACP6c,MAAAA;AACF,KAAA;AACF,EAAA,CAAA,CAAA,CACCM,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,CAAAA,CAAEtO,IAAAA,CAAKwO,OAAAA,EAAO,GAAKD,CAAAA,CAAEvO,IAAAA,CAAKwO,OAAAA,EAAO,CAAA;AAEnD,EAAA,OAAO;AAAEX,IAAAA;AAAM,GAAA;AACjB;AAhCgBP,MAAAA,CAAAA,2CAAAA,EAAAA,6CAAAA,CAAAA;AAkCT,SAASmB,gDACdC,KAAAA,EAA8B;AAE9B,EAAA,MAAMnB,WAAWmB,KAAAA,CAAMjW,MAAAA,CAAO,CAAC+U,CAAAA,KAAMA,CAAAA,CAAEmB,qBAAqB,CAAA,CAAA;AAC5D,EAAA,MAAMjB,OAAAA,GAAUN,WAAAA,CAAYG,QAAAA,EAAU,CAACC,CAAAA,KAAAA;AACrC,IAAA,MAAMG,SAAAA,GAAYH,CAAAA,CAAEI,UAAAA,CAAW7M,KAAAA,CAAM,sBAAA,CAAA;AACrC,IAAA,OAAO4M,SAAAA,GAAYA,SAAAA,CAAU,CAAA,CAAA,GAAK,EAAA;EACpC,CAAA,CAAA;AAEA,EAAA,MAAME,QAAmCvR,MAAAA,CAAOqF,OAAAA,CAAQ+L,OAAAA,CAAAA,CACrDjV,MAAAA,CAAO,CAAC,CAACuH,IAAAA,CAAAA,KAAUA,IAAAA,KAAS,EAAA,CAAA,CAC5BhG,GAAAA,CAAI,CAAC,CAACgG,IAAAA,EAAM4O,QAAAA,CAAAA,KAAS;AACpB,IAAA,MAAMb,IAAAA,GAA6Ba,QAAAA,CAAS5U,GAAAA,CAAI,CAAC6U,IAAAA,KAAAA;AAC/C,MAAA,MAAMb,QAAAA,GAAWpN,wBAAAA,CAAyBiO,IAAAA,CAAKjB,UAAU,CAAA;AACzD,MAAA,MAAMK,MAAAA,GAASrN,wBAAAA,CAAyBiO,IAAAA,CAAKX,QAAQ,CAAA;AAErD,MAAA,MAAM,EAAEN,UAAAA,EAAY3kB,SAAAA,EAAWilB,UAAUC,OAAAA,EAAS,GAAGjd,MAAAA,GAAS2d,IAAAA;AAC9D,MAAA,MAAMT,aAAAA,GAAgB/M,uBAAuBnQ,IAAAA,CAAAA;AAI7C,MAAA,OAAO;AAAE8c,QAAAA,QAAAA;AAAUC,QAAAA,MAAAA;QAAQ/c,IAAAA,EAAMkd;AAAc,OAAA;IACjD,CAAA,CAAA;AACA,IAAA,OAAO;MACLpO,IAAAA,EAAM,IAAIlY,KAAKkY,IAAAA,CAAAA;AACf9O,MAAAA,IAAAA,EAAM,EAAC;AACP6c,MAAAA;AACF,KAAA;AACF,EAAA,CAAA,CAAA,CACCM,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAMD,CAAAA,CAAEtO,IAAAA,CAAKwO,OAAAA,EAAO,GAAKD,CAAAA,CAAEvO,IAAAA,CAAKwO,OAAAA,EAAO,CAAA;AAEnD,EAAA,OAAO;AAAEX,IAAAA;AAAM,GAAA;AACjB;AAhCgBY,MAAAA,CAAAA,+CAAAA,EAAAA,iDAAAA,CAAAA;;;;;;;;;;;;;;ACndHK,+BAAAA,GAAN,MAAMA,wBAAAA,CAAAA;AAAAA,EAAAA;;;;;;EACMvgB,QAAAA,GAAW,6BAAA;EAE5B,WAAA,CACmBrH,MAAAA,EACAsU,uBACA+D,gBAAAA,EACjB;SAHiBrY,MAAAA,GAAAA,MAAAA;SACAsU,qBAAAA,GAAAA,qBAAAA;SACA+D,gBAAAA,GAAAA,gBAAAA;AAChB,EAAA;EAEHwP,+BAAAA,GAAiD;AAC/C,IAAA,MAAM,IAAIrjB,MAAM,yBAAA,CAAA;AAClB,EAAA;EACAsjB,2CAAAA,GAA6D;AAC3D,IAAA,MAAM,IAAItjB,MAAM,yBAAA,CAAA;AAClB,EAAA;EACAujB,qCAAAA,GAAuD;AACrD,IAAA,MAAM,IAAIvjB,MAAM,yBAAA,CAAA;AAClB,EAAA;EACAwjB,uCAAAA,GAAyD;AACvD,IAAA,MAAM,IAAIxjB,MAAM,yBAAA,CAAA;AAClB,EAAA;EACAyjB,sCAAAA,GAAwD;AACtD,IAAA,MAAM,IAAIzjB,MAAM,yBAAA,CAAA;AAClB,EAAA;EAEA,MAAM0jB,WAAAA,CACJtmB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACoC;AACpC,IAAA,IAAIgoB,OAAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAMC,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMmV,MAAAA,GAAS8S,SAAAA,CAAU5oB,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAElD,MAAA,MAAMe,GAAAA,GAAM,MAAM,IAAA,CAAK/B,qBAAAA,CAAsB3S,yBAAAA,CAI3C;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;QACvBjD,GAAAA,EAAK,cAAA;QACLiC,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,QAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;QACnBmC,IAAAA,EAAM;UAAEggB,OAAAA,EAASnN,MAAAA;UAAQxS,MAAAA,EAAQ;AAAM;AACzC,OAAA,EACAslB,WACAjoB,cAAAA,CAAAA;AAGFgoB,MAAAA,OAAAA,GAAU9R,IAAIxT,IAAAA,CAAKN,EAAAA;AAEnB,MAAA,MAAMsU,QAAqD,EAAA;AAG3D,MAAA,MAAM,KAAKwR,kBAAAA,CACTF,OAAAA,EACAvmB,OAAAA,CAAQ8S,UAAAA,EACR7S,aACA1B,cAAAA,CAAAA;AAIF,MAAA,MAAMyQ,QAAQ,MAAM,IAAA,CAAK0X,QAAAA,CAASH,OAAAA,EAAStmB,aAAa1B,cAAAA,CAAAA;AAGxD,MAAA,KAAA,MAAWooB,YAAAA,IAAgB3mB,QAAQ4mB,aAAAA,EAAe;AAChD,QAAA,MAAMC,iBAAAA,GAAoB,MAAM,IAAA,CAAKC,cAAAA,CACnC;AACEP,UAAAA,OAAAA;UACA5N,IAAAA,EAAM;AACJ3P,YAAAA,UAAAA,EAAY2d,YAAAA,CAAalR,UAAAA;AACzBmM,YAAAA,YAAAA,EAAc+E,YAAAA,CAAa3f,IAAAA;AAC3B+f,YAAAA,QAAAA,EAAU/X,MAAMgY,MAAAA,CAAO9V,GAAAA,CAAI,CAAC+V,CAAAA,KAAMA,EAAEtmB,EAAE,CAAA;AACtCsc,YAAAA,eAAAA,EAAiBjd,QAAQknB,iBAAAA,CAAkBhW,GAAAA,CACzC,CAACiW,CAAAA,KAAMA,EAAE1R,UAAU,CAAA;AAErB2R,YAAAA,eAAAA,EAAiBpnB,OAAAA,CAAQqnB,iBAAAA;YACzBC,OAAAA,EAAStnB,OAAAA,CAAQunB,iBAAiBC,WAAAA,EAAW;AAC7CC,YAAAA,SAAAA,EAAYznB,QAAQoI,IAAAA,EAChBqf;AACN;AACF,SAAA,EACAxnB,aACA1B,cAAAA,CAAAA;AAGF0W,QAAAA,KAAAA,CAAMrH,IAAAA,CAAK;AACT6H,UAAAA,UAAAA,EAAYkR,YAAAA,CAAalR,UAAAA;AACzBzX,UAAAA,IAAAA,EAAM6oB,iBAAAA,CAAkB7oB,IAAAA;AACxBgJ,UAAAA,IAAAA,EAAM2f,YAAAA,CAAa3f,IAAAA;UACnB0gB,UAAAA,EAAAA,CACGb,iBAAAA,CAAkBc,QAAAA,IAAY,CAAA,IAAK3nB,OAAAA,CAAQ4nB;SAChD,CAAA;AACF,MAAA;AAGA,MAAA,IAAI5nB,QAAQ6nB,gBAAAA,EAAkB;AAC5B,QAAA,MAAM,KAAKC,yBAAAA,CACTvB,OAAAA,EACAvmB,OAAAA,CAAQ6nB,gBAAAA,EACR5nB,aACA1B,cAAAA,CAAAA;AAEJ,MAAA;AAGA,MAAA,MAAM,IAAA,CAAKwpB,WAAAA,CAAYxB,OAAAA,EAAStmB,WAAAA,EAAa1B,cAAAA,CAAAA;AAE7C,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK+nB,YAAYtoB,IAAAA,EACjB,IAAA,CAAKyH,UACL,0CAAA,EACA;AAAE8gB,QAAAA;OAAQ,CAAA;AAGZ,MAAA,OAAO;QACLyB,iBAAAA,EAAmBzB,OAAAA;AACnBtR,QAAAA,KAAAA;QACA7M,IAAAA,EAAM;AACJ6f,UAAAA,cAAAA,EAAgBjZ,MAAM5G,IAAAA,CAAK6f;AAC7B;AACF,OAAA;AACF,IAAA,CAAA,CAAA,OAAS1mB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAK+nB,YAAYtoB,IAAAA,EACjB,IAAA,CAAKyH,QAAAA,EACL,iDAAA,EACAlE,GAAAA,CAAAA;AAGF,MAAA,IAAIglB,OAAAA,EAAS;AACX,QAAA,MAAM,IAAA,CAAK2B,WAAAA,CAAY3B,OAAAA,EAAStmB,WAAAA,EAAa1B,cAAAA,CAAAA;AAC/C,MAAA;AAEA,MAAA,MAAMgD,GAAAA;AACR,IAAA;AACF,EAAA;AAEA,EAAA,MAAMklB,kBAAAA,CACJF,OAAAA,EACAzT,UAAAA,EACA7S,WAAAA,EACA1B,cAAAA,EACe;AACf,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKkoB,mBAAmBzoB,IAAAA,EACxB,IAAA,CAAKyH,UACL,gCAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASzT,MAAAA;KAAW,CAAA;AAGxB,IAAA,MAAM0T,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,IAAA,CAAKmU,sBAAsB3S,yBAAAA,CAI/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;AACvBjD,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,SAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;MACnBmC,IAAAA,EAAM;QAAEF,EAAAA,EAAImS,UAAAA;QAAYqV,MAAAA,EAAQ;AAAQ;AAC1C,KAAA,EACA3B,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKkoB,mBAAmBzoB,IAAAA,EACxB,IAAA,CAAKyH,UACL,4CAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASzT,MAAAA;KAAW,CAAA;AAE1B,EAAA;EAEA,MAAM4T,QAAAA,CACJH,OAAAA,EACAtmB,WAAAA,EACA1B,cAAAA,EACiC;AACjC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKmoB,SAAS1oB,IAAAA,EACd,IAAA,CAAKyH,UACL,8BAAA,EACA;AAAE8gB,MAAAA;KAAQ,CAAA;AAGZ,IAAA,MAAMC,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAMkW,GAAAA,GAAM,MAAM,IAAA,CAAK/B,qBAAAA,CAAsB3S,yBAAAA,CAI3C;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;AACvB3D,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB;AACrB,KAAA,EACA8nB,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKmoB,SAAS1oB,IAAAA,EACd,IAAA,CAAKyH,UACL,0CAAA,EACA;AAAE8gB,MAAAA,OAAAA;MAAS6B,UAAAA,EAAY3T,GAAAA,CAAIxT,KAAK+lB,MAAAA,CAAOxd;KAAO,CAAA;AAGhD,IAAA,OAAO;AACL+c,MAAAA,OAAAA,EAAS9R,IAAIxT,IAAAA,CAAKN,EAAAA;AAClBqmB,MAAAA,MAAAA,EAAQvS,GAAAA,CAAIxT,IAAAA,CAAK+lB,MAAAA,CAAO9V,GAAAA,CAAI,CAAC+V,CAAAA,MAAO;AAAEtmB,QAAAA,EAAAA,EAAIsmB,CAAAA,CAAEtmB,EAAAA;AAAI3C,QAAAA,IAAAA,EAAMipB,CAAAA,CAAEjpB;OAAK,CAAA,CAAA;MAC7DoK,IAAAA,EAAM;AACJ6f,QAAAA,cAAAA,EAAgBxT,IAAIxT,IAAAA,CAAKonB;AAC3B,OAAA;MACApT,KAAAA,EAAOR,GAAAA,CAAIxT,IAAAA,CAAKqnB,aAAAA,IAAiB;AACnC,KAAA;AACF,EAAA;AAEQC,EAAAA,yBAAAA,CACNvhB,IAAAA,EACsB;AACtB,IAAA,QAAQA,IAAAA;AACN,MAAA,KAAK1C,uBAAAA,CAAwBiV,WAAAA;AAC3B,QAAA,OAAOD,uBAAAA,CAAwBC,WAAAA;AACjC,MAAA,KAAKjV,uBAAAA,CAAwBkV,OAAAA;AAC3B,QAAA,OAAOF,uBAAAA,CAAwBE,OAAAA;AACjC,MAAA,KAAKlV,uBAAAA,CAAwBmV,MAAAA;AAC3B,QAAA,OAAOH,uBAAAA,CAAwBG,MAAAA;AACjC,MAAA;AACE,QAAA,MAAM,IAAI7W,KAAAA,CAAM,CAAA,2BAAA,EAA8BoE,IAAAA,CAAAA,CAAgB,CAAA;AAClE;AACF,EAAA;EAEA,MAAM8f,cAAAA,CACJ9mB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACkC;AAClC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKuoB,eAAe9oB,IAAAA,EACpB,IAAA,CAAKyH,UACL,4BAAA,EACA;AACE8gB,MAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB,OAAAA;AACjBvd,MAAAA,UAAAA,EAAYhJ,QAAQ2Y,IAAAA,CAAK3P,UAAAA;AACzB4Y,MAAAA,YAAAA,EAAc5hB,QAAQ2Y,IAAAA,CAAKiJ;KAC7B,CAAA;AAGF,IAAA,MAAM4E,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,EAAEgoB,OAAAA,EAAS5N,IAAAA,EAAI,GAAK3Y,OAAAA;AAC1B,IAAA,MAAM4hB,YAAAA,GAAe,IAAA,CAAK2G,yBAAAA,CAA0B5P,IAAAA,CAAKiJ,YAAY,CAAA;AAErE,IAAA,IAAI/gB,IAAAA;AACJ,IAAA,IAAI+gB,YAAAA,KAAiBtI,wBAAwBC,WAAAA,EAAa;AACxD,MAAA,IAAIZ,IAAAA,CAAKyO,eAAAA,IAAmB,IAAA,IAAQ,CAACzO,KAAK2O,OAAAA,EAAS;AACjD,QAAA,MAAM,IAAI1kB,MAAM,sDAAA,CAAA;AAClB,MAAA;AACA/B,MAAAA,IAAAA,GAAO;QACLghB,aAAAA,EAAeD,YAAAA;AACfE,QAAAA,WAAAA,EAAanJ,IAAAA,CAAK3P,UAAAA;AAClBwf,QAAAA,SAAAA,EAAW7P,IAAAA,CAAKoO,QAAAA;QAChB0B,kBAAAA,EAAoB;AAClBtpB,UAAAA,QAAAA,EAAUwZ,IAAAA,CAAKyO,eAAAA;UACfsB,wBAAAA,EAA0B,KAAA;AAC1BzD,UAAAA,IAAAA,EAAMtM,IAAAA,CAAK2O;AACb,SAAA;QACAoB,wBAAAA,EAA0B;AAC5B,OAAA;IACF,CAAA,MAAA,IAAW9G,YAAAA,KAAiBtI,wBAAwBE,OAAAA,EAAS;AAC3D,MAAA,IAAI,CAACb,KAAK8O,SAAAA,EAAW;AACnB,QAAA,MAAM,IAAI7kB,MAAM,gCAAA,CAAA;AAClB,MAAA;AACA/B,MAAAA,IAAAA,GAAO;QACLghB,aAAAA,EAAeD,YAAAA;AACfE,QAAAA,WAAAA,EAAanJ,IAAAA,CAAK3P,UAAAA;AAClBwf,QAAAA,SAAAA,EAAW7P,IAAAA,CAAKoO,QAAAA;QAChB0B,kBAAAA,EAAoB;AAClBE,UAAAA,UAAAA,EAAYhQ,IAAAA,CAAK8O,SAAAA;UACjBiB,wBAAAA,EAA0B;AAC5B,SAAA;QACAA,wBAAAA,EAA0B;AAC5B,OAAA;IACF,CAAA,MAAO;AACL7nB,MAAAA,IAAAA,GAAO;QACLghB,aAAAA,EAAeD,YAAAA;AACfE,QAAAA,WAAAA,EAAanJ,IAAAA,CAAK3P,UAAAA;AAClBwf,QAAAA,SAAAA,EAAW7P,IAAAA,CAAKoO;AAClB,OAAA;AACF,IAAA;AAEA,IAAA,MAAMtS,GAAAA,GAAM,MAAM,IAAA,CAAK/B,qBAAAA,CAAsB3S,yBAAAA,CAI3C;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;AACvBjD,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,MAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;AACnBmC,MAAAA;AACF,KAAA,EACA2lB,WACAjoB,cAAAA,CAAAA;AAEF,IAAA,MAAM0C,OAAOwT,GAAAA,CAAIxT,IAAAA;AACjB,IAAA,MAAMsG,MAAAA,GAAS;AACbvJ,MAAAA,IAAAA,EAAMiD,IAAAA,CAAK2nB,eAAAA,EAAiBjH,QAAAA,EAAU3jB,IAAAA,IAAQiD,KAAK4nB,SAAAA,IAAarpB,MAAAA;AAChEmoB,MAAAA,QAAAA,EAAU1mB,IAAAA,CAAK6nB;AACjB,KAAA;AAEA,IAAA,IAAA,CAAK1qB,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKuoB,eAAe9oB,IAAAA,EACpB,IAAA,CAAKyH,UACL,wCAAA,EACA;AACE8gB,MAAAA,OAAAA;AACAvd,MAAAA,UAAAA,EAAY2P,IAAAA,CAAK3P,UAAAA;AACjBhL,MAAAA,IAAAA,EAAMuJ,MAAAA,CAAOvJ,IAAAA;AACb2pB,MAAAA,QAAAA,EAAUpgB,MAAAA,CAAOogB;KACnB,CAAA;AAGF,IAAA,OAAOpgB,MAAAA;AACT,EAAA;AAEA,EAAA,MAAMugB,yBAAAA,CACJvB,OAAAA,EACAsB,gBAAAA,EACA5nB,WAAAA,EACA1B,cAAAA,EACe;AACf,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKupB,0BAA0B9pB,IAAAA,EAC/B,IAAA,CAAKyH,UACL,wCAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASsB,MAAAA;KAAiB,CAAA;AAG9B,IAAA,MAAMrB,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,IAAA,CAAKmU,sBAAsB3S,yBAAAA,CAI/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;AACvBjD,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,iBAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;MACnBmC,IAAAA,EAAM;QAAEF,EAAAA,EAAIknB;AAAiB;AAC/B,KAAA,EACArB,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKupB,0BAA0B9pB,IAAAA,EAC/B,IAAA,CAAKyH,UACL,oDAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASsB,MAAAA;KAAiB,CAAA;AAEhC,EAAA;EAEA,MAAME,WAAAA,CACJxB,OAAAA,EACAtmB,WAAAA,EACA1B,cAAAA,EACe;AACf,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKwpB,YAAY/pB,IAAAA,EACjB,IAAA,CAAKyH,UACL,wBAAA,EACA;AAAE8gB,MAAAA;KAAQ,CAAA;AAGZ,IAAA,MAAMC,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,IAAA,CAAKmU,sBAAsB3S,yBAAAA,CAI/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;AACvBjD,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,OAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB;AACrB,KAAA,EACA8nB,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKwpB,YAAY/pB,IAAAA,EACjB,IAAA,CAAKyH,UACL,oCAAA,EACA;AAAE8gB,MAAAA;KAAQ,CAAA;AAEd,EAAA;EAEA,MAAM2B,WAAAA,CACJ3B,OAAAA,EACAtmB,WAAAA,EACA1B,cAAAA,EACe;AACf,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK2pB,YAAYlqB,IAAAA,EACjB,IAAA,CAAKyH,UACL,wBAAA,EACA;AAAE8gB,MAAAA;KAAQ,CAAA;AAGZ,IAAA,MAAMC,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,IAAA,CAAKmU,sBAAsB3S,yBAAAA,CAI/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;AACvBjD,MAAAA,GAAAA,EAAK,gBAAgB8nB,OAAAA,CAAAA,OAAAA,CAAAA;MACrB7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB;AACrB,KAAA,EACA8nB,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK2pB,YAAYlqB,IAAAA,EACjB,IAAA,CAAKyH,UACL,oCAAA,EACA;AAAE8gB,MAAAA;KAAQ,CAAA;AAEd,EAAA;EAEA,MAAMwC,WAAAA,CACJ/oB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EAC+B;AAC/B,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKwqB,YAAY/qB,IAAAA,EACjB,IAAA,CAAKyH,UACL,sBAAA,EACA;AAAE8gB,MAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB,OAAAA;AAAS3E,MAAAA,YAAAA,EAAc5hB,QAAQ2Y,IAAAA,CAAK3R;KAAK,CAAA;AAG9D,IAAA,MAAMgI,QAAQ,MAAM,IAAA,CAAK0X,SACvB1mB,OAAAA,CAAQumB,OAAAA,EACRtmB,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAMyqB,MAAAA,GAASha,KAAAA,CAAMiG,KAAAA,CAAM,CAAA,CAAA,EAAItU,EAAAA;AAC/B,IAAA,IAAI,CAACqoB,MAAAA,EAAQ;AACX,MAAA,IAAA,CAAK5qB,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKwqB,YAAY/qB,IAAAA,EACjB,IAAA,CAAKyH,UACL,uCAAA,EACA;AAAE8gB,QAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB;OAAQ,CAAA;AAE7B,MAAA,MAAM,IAAI3jB,MAAM,yBAAA,CAAA;AAClB,IAAA;AACA,IAAA,MAAMqmB,cAAAA,GAAiB,MAAM,IAAA,CAAKC,eAAAA,CAChClpB,QAAQumB,OAAAA,EACRyC,MAAAA,EACAhpB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKwqB,YAAY/qB,IAAAA,EACjB,IAAA,CAAKyH,UACL,kCAAA,EACA;AAAE8gB,MAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB,OAAAA;AAASyC,MAAAA;KAAO,CAAA;AAGrC,IAAA,OAAO;MACLG,OAAAA,EAAS3Z,OAAAA,CAAQyZ,cAAAA,CAAehoB,IAAAA,CAAKN,EAAE,CAAA;AACvCM,MAAAA,IAAAA,EAAMgoB,cAAAA,CAAehoB;AACvB,KAAA;AACF,EAAA;AAEA,EAAA,MAAMioB,eAAAA,CACJ3C,OAAAA,EACAyC,MAAAA,EACAhpB,OAAAA,EACAC,aACA1B,cAAAA,EACwC;AACxC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK2qB,gBAAgBlrB,IAAAA,EACrB,IAAA,CAAKyH,UACL,2BAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASyC,MAAAA,MAAAA;AAAQpH,MAAAA,YAAAA,EAAc5hB,QAAQ2Y,IAAAA,CAAK3R;KAAK,CAAA;AAGrD,IAAA,MAAMwf,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAMqjB,YAAAA,GAAe,IAAA,CAAK2G,yBAAAA,CAA0BvoB,OAAAA,CAAQ2Y,KAAK3R,IAAI,CAAA;AACrE,IAAA,IAAInG,IAAAA;AAEJ,IAAA,IAAI+gB,YAAAA,KAAiBtI,wBAAwBC,WAAAA,EAAa;AACxD,MAAA,IACEvZ,OAAAA,CAAQopB,yBAAyB,IAAA,IACjCppB,OAAAA,CAAQqnB,qBAAqB,IAAA,IAC7BrnB,OAAAA,CAAQqpB,yBAAyB,IAAA,EACjC;AACA,QAAA,MAAM,IAAIzmB,MACR,6FAAA,CAAA;AAEJ,MAAA;AACA,MAAA,MAAM0kB,OAAAA,GAAUgC,oDACdtpB,OAAAA,CAAQupB,QAAAA,EACRvpB,QAAQqpB,qBAAAA,EACRrpB,OAAAA,CAAQopB,qBAAqB,CAAA,CAC7B5B,WAAAA,EAAW;AACb3mB,MAAAA,IAAAA,GAAO;AACLihB,QAAAA,WAAAA,EAAa9hB,QAAQ2Y,IAAAA,CAAKlD,UAAAA;QAC1BgT,kBAAAA,EAAoB;UAClBxD,IAAAA,EAAMqC,OAAAA;AACNnoB,UAAAA,QAAAA,EAAUa,OAAAA,CAAQqnB,iBAAAA;UAClBqB,wBAAAA,EAA0B;AAC5B,SAAA;QACAA,wBAAAA,EAA0B;AAC5B,OAAA;IACF,CAAA,MAAA,IAAW9G,YAAAA,KAAiBtI,wBAAwBE,OAAAA,EAAS;AAC3D,MAAA,IAAI,CAACxZ,QAAQynB,SAAAA,EAAW;AACtB,QAAA,MAAM,IAAI7kB,MAAM,gCAAA,CAAA;AAClB,MAAA;AACA/B,MAAAA,IAAAA,GAAO;QACL4nB,kBAAAA,EAAoB;AAClBE,UAAAA,UAAAA,EAAY3oB,OAAAA,CAAQynB,SAAAA;UACpBiB,wBAAAA,EAA0B;AAC5B;AACF,OAAA;IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI9lB,MAAM,yBAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMG,QAAAA,GAAW,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAIhD;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAY0D,GAAAA;MACvBlD,GAAAA,EAAK,CAAA,aAAA,EAAgB8nB,OAAAA,CAAAA,OAAAA,EAAiByC,MAAAA,CAAAA,CAAAA;MACtCtoB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;AACnBmC,MAAAA;AACF,KAAA,EACA2lB,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK2qB,gBAAgBlrB,IAAAA,EACrB,IAAA,CAAKyH,UACL,uCAAA,EACA;AAAE8gB,MAAAA,OAAAA;AAASyC,MAAAA;KAAO,CAAA;AAGpB,IAAA,OAAOjmB,QAAAA;AACT,EAAA;EAEA,MAAMymB,iBAAAA,CACJxpB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACe;AACf,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKirB,kBAAkBxrB,IAAAA,EACvB,IAAA,CAAKyH,UACL,+BAAA,EACA;AACE8gB,MAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB,OAAAA;AACjBkD,MAAAA,MAAAA,EAAQzpB,OAAAA,CAAQypB,MAAAA;AAChBC,MAAAA,aAAAA,EAAe1pB,OAAAA,CAAQ0pB;KACzB,CAAA;AAGF,IAAA,MAAMlD,SAAAA,GAAY,IAAA,CAAK/P,gBAAAA,CAAiBlD,cAAAA,CACtCtT,aACA1B,cAAAA,CAAAA;AAEF,IAAA,MAAM,IAAA,CAAKmU,sBAAsB3S,yBAAAA,CAI/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYyD,IAAAA;MACvBjD,GAAAA,EAAK,CAAA,aAAA,EAAgBuB,QAAQumB,OAAO,CAAA,SAAA,CAAA;MACpC7lB,OAAAA,EAAS8lB,SAAAA,CAAU5oB,OAAOyD,cAAAA,CAAeX,OAAAA;AACzChC,MAAAA,OAAAA,EAAS8nB,SAAAA,CAAU9nB,OAAAA;MACnBmC,IAAAA,EAAM;AACJ4oB,QAAAA,MAAAA,EAAQzpB,OAAAA,CAAQypB,MAAAA;QAChBE,SAAAA,EAAW,QAAA;QACXzoB,MAAAA,EAAQ,MAAA;QACR0oB,cAAAA,EAAgB;UACdC,KAAAA,EAAO,EAAA;AACPC,UAAAA,eAAAA,EAAiB9pB,OAAAA,CAAQ0pB;AAC3B;AACF;AACF,KAAA,EACAlD,WACAjoB,cAAAA,CAAAA;AAGF,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKirB,kBAAkBxrB,IAAAA,EACvB,IAAA,CAAKyH,UACL,2CAAA,EACA;AAAE8gB,MAAAA,OAAAA,EAASvmB,OAAAA,CAAQumB,OAAAA;AAASkD,MAAAA,MAAAA,EAAQzpB,OAAAA,CAAQypB;KAAO,CAAA;AAEvD,EAAA;EAEA,MAAMM,iBAAAA,CACJ/pB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyC;AACzC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKwrB,kBAAkB/rB,IAAAA,EACvB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK+rB,iBAAAA,CAAkB/rB,IAAI,CAAA,OAAA,CAAA,EACjE;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAE7D,MAAA,IACE1T,OAAAA,CAAQgqB,0BAAAA,IACRhqB,OAAAA,CAAQuO,OAAAA,EAASG,SAASlP,KAAAA,CAAAA,EAC1B;AACA,QAAA,MAAM,IAAIoD,MACR,sEAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAMmK,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,MAAA,IAAI3W,OAAAA,CAAQuO,OAAAA,EAASG,IAAAA,IAAQ,IAAA,EAAM;AACjC3B,QAAAA,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQG,IAAI,CAAA,CAAA;AAC/C,MAAA;AACA,MAAA,IAAI1O,OAAAA,CAAQuO,OAAAA,EAASD,KAAAA,IAAS,IAAA,EAAM;AAClCvB,QAAAA,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQD,KAAK,CAAA,CAAA;AACpD,MAAA;AAEA,MAAA,MAAM0I,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,MAAA,MAAMghB,MAAAA,GACJ,mCAAmCvW,MAAAA,CAAAA,CAAAA,IAClC1T,QAAQid,eAAAA,IAAmBjd,OAAAA,CAAQid,gBAAgBzT,MAAAA,GAAS,CAAA,GACzD,oBAAoBxJ,OAAAA,CAAQid,eAAAA,CAAgB7L,KAAK,GAAA,CAAA,KACjD,EAAA,CAAA,IACH4F,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,MAAA,MAAM+B,iBAAAA,GACJ,MAAM,IAAA,CAAKrG,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,MAAMmS,OAAAA,GAAU,MAAMoI,aAAAA,CAGpBC,iBAAAA,EAAmB/Y,OAAAA,CAAQgqB,4BAA4B,CAACtb,IAAAA,KACxD,IAAA,CAAKgE,qBAAAA,CAAsB3S,yBAAAA,CAIzB;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,EAAGwrB,MAAAA,CAAAA,MAAAA,EAAevb,IAAAA,CAAAA,CAAAA;QACvBhO,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;OAChC,EACAoV,oBAAAA,EACAvV,cAAAA,CAAAA,CAAAA;AAIJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKwrB,kBAAkB/rB,IAAAA,EACvB,IAAA,CAAKyH,UACL,yCAAA,EACA;AAAEykB,QAAAA,YAAAA,EAAcnR,kBAAkB3Q,IAAAA,CAAK+hB;OAAM,CAAA;AAG/C,MAAA,OAAO9G,oCAAAA,CACL3S,OAAAA,EACAqI,iBAAAA,CAAkB3Q,IAAAA,CAAK+hB,KAAK,CAAA;AAEhC,IAAA,CAAA,CAAA,OAAS5oB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKwrB,kBAAkB/rB,IAAAA,EACvB,IAAA,CAAKyH,QAAAA,EACL,mCAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAM6oB,aAAAA,CACJpqB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyC;AACzC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAK6rB,cAAcpsB,IAAAA,EACnB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKosB,aAAAA,CAAcpsB,IAAI,CAAA,OAAA,CAAA,EAC7D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAE7D,MAAA,IACE1T,OAAAA,CAAQqqB,sBAAAA,IACRrqB,OAAAA,CAAQuO,OAAAA,EAASG,SAASlP,KAAAA,CAAAA,EAC1B;AACA,QAAA,MAAM,IAAIoD,MACR,kEAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAMmK,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,MAAA,IAAI3W,OAAAA,CAAQuO,OAAAA,EAASG,IAAAA,IAAQ,IAAA,EAAM;AACjC3B,QAAAA,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQG,IAAI,CAAA,CAAA;AAC/C,MAAA;AACA,MAAA,IAAI1O,OAAAA,CAAQuO,OAAAA,EAASD,KAAAA,IAAS,IAAA,EAAM;AAClCvB,QAAAA,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQD,KAAK,CAAA,CAAA;AACpD,MAAA;AAEA,MAAA,MAAM0I,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,MAAA,MAAMghB,MAAAA,GACJ,+BAA+BvW,MAAAA,CAAAA,CAAAA,IAC9B1T,QAAQid,eAAAA,IAAmBjd,OAAAA,CAAQid,gBAAgBzT,MAAAA,GAAS,CAAA,GACzD,oBAAoBxJ,OAAAA,CAAQid,eAAAA,CAAgB7L,KAAK,GAAA,CAAA,KACjD,EAAA,CAAA,IACH4F,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,MAAA,MAAM+B,iBAAAA,GACJ,MAAM,IAAA,CAAKrG,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,MAAMmS,OAAAA,GAAU,MAAMoI,aAAAA,CAGpBC,iBAAAA,EAAmB/Y,OAAAA,CAAQqqB,wBAAwB,CAAC3b,IAAAA,KACpD,IAAA,CAAKgE,qBAAAA,CAAsB3S,yBAAAA,CAIzB;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,EAAGwrB,MAAAA,CAAAA,MAAAA,EAAevb,IAAAA,CAAAA,CAAAA;QACvBhO,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;OAChC,EACAoV,oBAAAA,EACAvV,cAAAA,CAAAA,CAAAA;AAIJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK6rB,cAAcpsB,IAAAA,EACnB,IAAA,CAAKyH,UACL,qCAAA,EACA;AAAEykB,QAAAA,YAAAA,EAAcnR,kBAAkB3Q,IAAAA,CAAK+hB;OAAM,CAAA;AAG/C,MAAA,OAAOxG,gCAAAA,CACLjT,OAAAA,EACAqI,iBAAAA,CAAkB3Q,IAAAA,CAAK+hB,KAAK,CAAA;AAEhC,IAAA,CAAA,CAAA,OAAS5oB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAK6rB,cAAcpsB,IAAAA,EACnB,IAAA,CAAKyH,QAAAA,EACL,+BAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAM+oB,YAAAA,CACJtqB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyC;AACzC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAK+rB,aAAatsB,IAAAA,EAClB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKssB,YAAAA,CAAatsB,IAAI,CAAA,OAAA,CAAA,EAC5D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMoV,cAAAA,GACJG,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB6L,cAAAA;AAEhD,MAAA,IACE3T,OAAAA,CAAQuqB,qBAAAA,IACRvqB,OAAAA,CAAQuO,OAAAA,EAASG,SAASlP,KAAAA,CAAAA,EAC1B;AACA,QAAA,MAAM,IAAIoD,MACR,iEAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAMmK,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,MAAA,IAAI3W,OAAAA,CAAQuO,OAAAA,EAASG,IAAAA,IAAQ,IAAA,EAAM;AACjC3B,QAAAA,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQG,IAAI,CAAA,CAAA;AAC/C,MAAA;AACA,MAAA,IAAI1O,OAAAA,CAAQuO,OAAAA,EAASD,KAAAA,IAAS,IAAA,EAAM;AAClCvB,QAAAA,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQD,KAAK,CAAA,CAAA;AACpD,MAAA;AAEA,MAAA,MAAM0I,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,MAAA,MAAMghB,SACJ,CAAA,mCAAA,EAAsCtW,cAAAA,MACrCqD,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,MAAA,MAAM+B,iBAAAA,GACJ,MAAM,IAAA,CAAKrG,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,MAAMmS,OAAAA,GAAU,MAAMoI,aAAAA,CAGpBC,iBAAAA,EAAmB/Y,OAAAA,CAAQuqB,uBAAuB,CAAC7b,IAAAA,KACnD,IAAA,CAAKgE,qBAAAA,CAAsB3S,yBAAAA,CAIzB;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,EAAGwrB,MAAAA,CAAAA,MAAAA,EAAevb,IAAAA,CAAAA,CAAAA;QACvBhO,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;OAChC,EACAoV,oBAAAA,EACAvV,cAAAA,CAAAA,CAAAA;AAIJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK+rB,aAAatsB,IAAAA,EAClB,IAAA,CAAKyH,UACL,oCAAA,EACA;AAAEykB,QAAAA,YAAAA,EAAcnR,kBAAkB3Q,IAAAA,CAAK+hB;OAAM,CAAA;AAG/C,MAAA,OAAOtG,+BAAAA,CACLnT,OAAAA,EACAqI,iBAAAA,CAAkB3Q,IAAAA,CAAK+hB,KAAK,CAAA;AAEhC,IAAA,CAAA,CAAA,OAAS5oB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAK+rB,aAAatsB,IAAAA,EAClB,IAAA,CAAKyH,QAAAA,EACL,8BAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAMipB,kBAAAA,CACJxqB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EAC6C;AAC7C,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKisB,mBAAmBxsB,IAAAA,EACxB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKwsB,kBAAAA,CAAmBxsB,IAAI,CAAA,OAAA,CAAA,EAClE;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAGF,MAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAC7D,MAAA,MAAMuW,MAAAA,GAAS,gCAAgCvW,MAAAA,CAAAA,CAAAA;AAE/C,MAAA,MAAMqF,iBAAAA,GACJ,MAAM,IAAA,CAAKrG,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,MAAMmS,OAAAA,GAAU,MAAMoI,aAAAA,CAGpBC,iBAAAA,EAAmB/Y,OAAAA,CAAQyqB,6BAA6B,CAAC/b,IAAAA,KACzD,IAAA,CAAKgE,qBAAAA,CAAsB3S,yBAAAA,CAIzB;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,EAAGwrB,MAAAA,CAAAA,MAAAA,EAAevb,IAAAA,CAAAA,CAAAA;QACvBhO,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;OAChC,EACAoV,oBAAAA,EACAvV,cAAAA,CAAAA,CAAAA;AAIJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKisB,mBAAmBxsB,IAAAA,EACxB,IAAA,CAAKyH,UACL,0CAAA,EACA;AAAEykB,QAAAA,YAAAA,EAAcnR,kBAAkB3Q,IAAAA,CAAK+hB;OAAM,CAAA;AAG/C,MAAA,OAAOlG,qCAAAA,CACLvT,OAAAA,EACAqI,iBAAAA,CAAkB3Q,IAAAA,CAAK+hB,KAAK,CAAA;AAEhC,IAAA,CAAA,CAAA,OAAS5oB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKisB,mBAAmBxsB,IAAAA,EACxB,IAAA,CAAKyH,QAAAA,EACL,oCAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAMmpB,eAAAA,CACJ1qB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACiD;AACjD,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKmsB,gBAAgB1sB,IAAAA,EACrB,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK0sB,eAAAA,CAAgB1sB,IAAI,CAAA,OAAA,CAAA,EAC/D;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMoV,cAAAA,GACJG,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB6L,cAAAA;AAEhD,MAAA,IACE3T,OAAAA,CAAQ2qB,wBAAAA,IACR3qB,OAAAA,CAAQuO,OAAAA,EAASG,SAASlP,KAAAA,CAAAA,EAC1B;AACA,QAAA,MAAM,IAAIoD,MACR,oEAAA,CAAA;AAEJ,MAAA;AAEA,MAAA,MAAMmK,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,MAAA,IAAI3W,OAAAA,CAAQuO,OAAAA,EAASG,IAAAA,IAAQ,IAAA,EAAM;AACjC3B,QAAAA,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQG,IAAI,CAAA,CAAA;AAC/C,MAAA;AACA,MAAA,IAAI1O,OAAAA,CAAQuO,OAAAA,EAASD,KAAAA,IAAS,IAAA,EAAM;AAClCvB,QAAAA,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQD,KAAK,CAAA,CAAA;AACpD,MAAA;AAEA,MAAA,MAAM0I,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,MAAA,MAAMghB,SACJ,CAAA,oBAAA,EAAuBtW,cAAAA,iBACtBqD,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,MAAA,MAAM+B,iBAAAA,GACJ,MAAM,IAAA,CAAKrG,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,MAAMmS,OAAAA,GAAU,MAAMoI,aAAAA,CAGpBC,iBAAAA,EAAmB/Y,OAAAA,CAAQ2qB,0BAA0B,CAACjc,IAAAA,KACtD,IAAA,CAAKgE,qBAAAA,CAAsB3S,yBAAAA,CAIzB;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAK,CAAA,EAAGwrB,MAAAA,CAAAA,EAASA,MAAAA,CAAOlT,QAAAA,CAAS,GAAA,CAAA,GAAO,GAAA,GAAM,GAAA,CAAA,KAAA,EAAWrI,IAAAA,CAAAA,CAAAA;QACzDhO,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;OAChC,EACAoV,oBAAAA,EACAvV,cAAAA,CAAAA,CAAAA;AAIJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKmsB,gBAAgB1sB,IAAAA,EACrB,IAAA,CAAKyH,UACL,uCAAA,EACA;AAAEykB,QAAAA,YAAAA,EAAcnR,kBAAkB3Q,IAAAA,CAAK+hB;OAAM,CAAA;AAG/C,MAAA,OAAOpG,kCAAAA,CACLrT,OAAAA,EACAqI,iBAAAA,CAAkB3Q,IAAAA,CAAK+hB,KAAK,CAAA;AAEhC,IAAA,CAAA,CAAA,OAAS5oB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKmsB,gBAAgB1sB,IAAAA,EACrB,IAAA,CAAKyH,QAAAA,EACL,iCAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAMqpB,4BAAAA,CACJ5qB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACyC;AACzC,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKqsB,6BAA6B5sB,IAAAA,EAClC,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK4sB,4BAAAA,CAA6B5sB,IAAI,CAAA,OAAA,CAAA,EAC5E;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAGF,MAAA,MAAMwO,KAAAA,GAAQ,IAAI4J,eAAAA,EAAAA;AAClB,MAAA,IAAI3W,OAAAA,CAAQuO,OAAAA,EAASG,IAAAA,IAAQ,IAAA,EAAM;AACjC3B,QAAAA,KAAAA,CAAMQ,IAAI,MAAA,EAAQ1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQG,IAAI,CAAA,CAAA;AAC/C,MAAA;AACA,MAAA,IAAI1O,OAAAA,CAAQuO,OAAAA,EAASD,KAAAA,IAAS,IAAA,EAAM;AAClCvB,QAAAA,KAAAA,CAAMQ,IAAI,UAAA,EAAY1K,MAAAA,CAAO7C,OAAAA,CAAQuO,OAAAA,CAAQD,KAAK,CAAA,CAAA;AACpD,MAAA;AAEA,MAAA,MAAM0I,WAAAA,GAAcjK,MAAM9D,QAAAA,EAAQ;AAClC,MAAA,MAAMghB,MAAAA,GACJ,sBAAsBjqB,OAAAA,CAAQ6qB,YAAY,yBACzC7T,WAAAA,GAAc,CAAA,CAAA,EAAIA,WAAAA,CAAAA,CAAAA,GAAgB,EAAA,CAAA;AAErC,MAAA,MAAMjU,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKqsB,6BAA6B5sB,IAAAA,EAClC,IAAA,CAAKyH,UACL,iDAAA,EACA;AAAEolB,QAAAA,YAAAA,EAAc7qB,OAAAA,CAAQ6qB;OAAa,CAAA;AAGvC,MAAA,OAAOxG,2CAAAA,CACLthB,QAAAA,CAAS9B,IAAAA,CAAKygB,SAAS,CAAA;AAE3B,IAAA,CAAA,CAAA,OAASngB,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKqsB,6BAA6B5sB,IAAAA,EAClC,IAAA,CAAKyH,QAAAA,EACL,2CAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAMupB,mCAAAA,CACJ9qB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACiD;AACjD,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAKusB,oCAAoC9sB,IAAAA,EACzC,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK8sB,mCAAAA,CAAoC9sB,IAAI,CAAA,OAAA,CAAA,EACnF;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAE7D,MAAA,MAAMqX,qBAAAA,GAAwB9T,kBAAAA,CAC5BjX,OAAAA,CAAQgrB,YAAAA,EACR,IAAA,CAAA;AAEF,MAAA,MAAMC,mBAAAA,GAAsBhU,kBAAAA,CAAmBjX,OAAAA,CAAQkrB,UAAAA,EAAY,KAAA,CAAA;AAEnE,MAAA,MAAMjB,SACJ,CAAA,iCAAA,EAAoCvW,MAAAA,CAAAA,CAAAA,EAAU1T,OAAAA,CAAQmrB,8BAA8B,CAAA,gBAAA,EACjEC,kBAAAA,CAAmBL,qBAAAA,CAAAA,iBACrBK,kBAAAA,CAAmBH,mBAAAA,CAAAA,CAAAA,YAAAA,EACrBjrB,QAAQmrB,8BAA8B,CAAA,CAAA;AAEvD,MAAA,MAAMpoB,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAKusB,oCAAoC9sB,IAAAA,EACzC,IAAA,CAAKyH,UACL,wDAAA,EACA;AACE0lB,QAAAA,8BAAAA,EACEnrB,OAAAA,CAAQmrB;OACZ,CAAA;AAGF,MAAA,OAAO3G,2CAAAA,CAA4CzhB,SAAS9B,IAAI,CAAA;AAClE,IAAA,CAAA,CAAA,OAASM,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAKusB,oCAAoC9sB,IAAAA,EACzC,IAAA,CAAKyH,QAAAA,EACL,kDAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;EAEA,MAAM8pB,uCAAAA,CACJrrB,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EACiD;AACjD,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,IAAAA,CACVL,cAAAA,EACA,IAAA,CAAK8sB,wCAAwCrtB,IAAAA,EAC7C,IAAA,CAAKyH,QAAAA,EACL,CAAA,EAAGugB,yBAAwBhoB,IAAI,CAAA,IAAA,EAAO,IAAA,CAAKqtB,uCAAAA,CAAwCrtB,IAAI,CAAA,OAAA,CAAA,EACvF;AAAEgC,MAAAA;KAAQ,CAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM8T,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAEF,MAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAE7D,MAAA,MAAMqX,qBAAAA,GAAwB9T,kBAAAA,CAC5BjX,OAAAA,CAAQgrB,YAAAA,EACR,IAAA,CAAA;AAEF,MAAA,MAAMC,mBAAAA,GAAsBhU,kBAAAA,CAAmBjX,OAAAA,CAAQkrB,UAAAA,EAAY,KAAA,CAAA;AAEnE,MAAA,MAAMjB,SACJ,CAAA,0CAAA,EAA6CvW,MAAAA,CAAAA,CAAAA,EAAU1T,OAAAA,CAAQmrB,8BAA8B,CAAA,gBAAA,EAC1EC,kBAAAA,CAAmBL,qBAAAA,CAAAA,iBACrBK,kBAAAA,CAAmBH,mBAAAA,CAAAA,CAAAA,YAAAA,EACrBjrB,QAAQmrB,8BAA8B,CAAA,CAAA;AAEvD,MAAA,MAAMpoB,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAI/B;AACEa,QAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;QACvB3D,GAAAA,EAAKwrB,MAAAA;QACLvpB,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,QAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,OAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,MAAA,IAAA,CAAKH,MAAAA,CAAOQ,KACVL,cAAAA,EACA,IAAA,CAAK8sB,wCAAwCrtB,IAAAA,EAC7C,IAAA,CAAKyH,UACL,4DAAA,EACA;AACE0lB,QAAAA,8BAAAA,EACEnrB,OAAAA,CAAQmrB;OACZ,CAAA;AAGF,MAAA,OAAOxF,+CAAAA,CAAgD5iB,SAAS9B,IAAI,CAAA;AACtE,IAAA,CAAA,CAAA,OAASM,GAAAA,EAAK;AACZ,MAAA,IAAA,CAAKnD,MAAAA,CAAOkB,MACVf,cAAAA,EACA,IAAA,CAAK8sB,wCAAwCrtB,IAAAA,EAC7C,IAAA,CAAKyH,QAAAA,EACL,sDAAA,EACAlE,GAAAA,CAAAA;AAEF,MAAA,MAAMA,GAAAA;AACR,IAAA;AACF,EAAA;AACF;;;;;;;;;;;;ACn5CO,SAAS+pB,6BACdvoB,QAAAA,EAA4B;AAE5B,EAAA,OAAO;AACLwoB,IAAAA,kBAAAA,EAAoBxoB,QAAAA,CAAS9B,IAAAA,EAAMuqB,oBAAAA,EAAsBta,GAAAA,CACvD,CAACua,WAAAA,MAAiB;AAChB9qB,MAAAA,EAAAA,EAAI8qB,WAAAA,CAAY9qB,EAAAA;AAChB3C,MAAAA,IAAAA,EAAMytB,WAAAA,CAAYztB,IAAAA;AAClB0tB,MAAAA,IAAAA,EAAMD,WAAAA,CAAYC;KACpB,CAAA;AAEJ,GAAA;AACF;AAZgBJ,MAAAA,CAAAA,4BAAAA,EAAAA,8BAAAA,CAAAA;;;;;;;;;;;;;;ACwBHK,4CAAAA,GAAN,mDAAmDnmB,oCAAAA,CAAAA;AAAAA,EAAAA;;;;;AACxD,EAAA,WAAA,CACEE,2BAAAA,EACAC,+BAAAA,EACAvH,MAAAA,EACiBqY,gBAAAA,EACA/D,qBAAAA,EACjB;AACA,IAAA,KAAA,CAAMhN,2BAAAA,EAA6BC,iCAAiCvH,MAAAA,CAAAA,EAAAA,KAHnDqY,gBAAAA,GAAAA,gBAAAA,EAAAA,KACA/D,qBAAAA,GAAAA,qBAAAA;AAGnB,EAAA;;;;EAKA,MAAexL,wBAAAA,CACbrB,OACAC,OAAAA,EACyB;AACzB,IAAA,IAAA,CAAK2Q,iBAAiBlD,cAAAA,CACpB;AAAE3V,MAAAA,MAAAA,EAAQiI,KAAAA,CAAMjI;AAAO,KAAA,EACvBkI,QAAQvH,cAAc,CAAA;AAGxB,IAAA,IAAIsH,KAAAA,CAAMyB,iBAAiB,IAAA,EAAM;AAC/B,MAAA,MAAM,IAAA,CAAKskB,+CAAAA,CACT/lB,KAAAA,CAAMyB,aAAAA,EACNzB,MAAMG,SAAS,CAAA;AAEnB,IAAA;AAEA,IAAA,OAAO,KAAA,CAAMkB,wBAAAA,CAAyBrB,KAAAA,EAAOC,OAAAA,CAAAA;AAC/C,EAAA;;;;EAKA,MAAe0B,2BAAAA,CACbxH,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,EAC+C;AAC/C,IAAA,IAAIyB,OAAAA,CAAQ0H,WAAW9J,MAAAA,EAAQ;AAC7B,MAAA,IAAA,CAAK6Y,iBAAiBlD,cAAAA,CACpB;AACE3V,QAAAA,MAAAA,EAAQoC,QAAQ0H,UAAAA,CAAW9J;AAC7B,OAAA,EACAW,cAAAA,CAAAA;AAEJ,IAAA;AAEA,IAAA,OAAO,KAAA,CAAMiJ,2BAAAA,CACXxH,OAAAA,EACAC,WAAAA,EACA1B,cAAAA,CAAAA;AAEJ,EAAA;;;;EAKA,MAAcqtB,+CAAAA,CACZtkB,eACAtB,SAAAA,EACe;AACf,IAAA,IAAIsB,aAAAA,CAAcoB,iBAAAA,KAAsBU,+BAAAA,CAAyBC,QAAAA,EAAU;AACzE,MAAA,MAAM,IAAIzG,KAAAA,CACR,CAAA,iCAAA,EAAoC0E,aAAAA,CAAcoB,iBAAiB,CAAA,CAAE,CAAA;AAEzE,IAAA;AAEA,IAAA,MAAM,IAAA,CAAK/C,gCAAgCkmB,WAAAA,CAAY;AACrD7iB,MAAAA,UAAAA,EAAY1B,aAAAA,CAAcqB,eAAAA;AAC1B3C,MAAAA;KACF,CAAA;AACF,EAAA;;;;EAKA,MAAM8lB,0BAAAA,CACJ7rB,aACA1B,cAAAA,EAC0C;AAC1C,IAAA,MAAMuV,oBAAAA,GAAuB,IAAA,CAAK2C,gBAAAA,CAAiBlD,cAAAA,CACjDtT,aACA1B,cAAAA,CAAAA;AAGF,IAAA,MAAMmV,MAAAA,GAASI,oBAAAA,CAAqBlW,MAAAA,CAAOkK,iBAAAA,CAAkB4L,MAAAA;AAC7D,IAAA,MAAMjV,GAAAA,GAAM,eAAeiV,MAAAA,CAAAA,CAAAA;AAC3B,IAAA,MAAM3Q,QAAAA,GACJ,MAAM,IAAA,CAAK2P,qBAAAA,CAAsB3S,yBAAAA,CAC/B;AACEa,MAAAA,SAAAA,EAAW3C,WAAAA,CAAYmE,GAAAA;AACvB3D,MAAAA,GAAAA;MACAiC,OAAAA,EAASoT,oBAAAA,CAAqBlW,OAAOyD,cAAAA,CAAeX,OAAAA;AACpDhC,MAAAA,OAAAA,EAASoV,oBAAAA,CAAqBpV;AAChC,KAAA,EACAoV,sBACAvV,cAAAA,CAAAA;AAGJ,IAAA,OAAO+sB,6BAA6BvoB,QAAAA,CAAAA;AACtC,EAAA;AACF;;;;;;;;;;;;;;;;;;;;;;;ACzGO,IAAMgpB,2CAAAA,GACX;AAEF,IAAMC,oBAAAA,uBAA2BC,GAAAA,CAAY;AAC3C,EAAA,SAAA;AACA,EAAA,QAAA;AACA,EAAA;AACD,CAAA,CAAA;AAGYC,iDAAAA,GAAN,wDAAwDrjB,iCAAAA,CAAAA;AAAAA,EAAAA;;;AAC7D,EAAA,WAAA,CACEzK,QACA0K,gCAAAA,EACA;AACA,IAAA,KAAA,CAAMA,kCAAkC1K,MAAAA,CAAAA;AAC1C,EAAA;;;;;AAMA+tB,EAAAA,6BAAAA,CAA8BvuB,OAAAA,EAAuC;AACnE,IAAA,MAAMoQ,qBAAAA,GAAwBpQ,OAAAA;AAE9B,IAAA,IACE,CAACoQ,qBAAAA,CAAsBoe,iBAAAA,IACvBpe,qBAAAA,CAAsBoe,iBAAAA,CAAkB5iB,WAAW,CAAA,EACnD;AACA,MAAA,MAAM,IAAI6iB,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,yFAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IACE,CAACve,qBAAAA,CAAsBwe,YAAAA;IAEvBxe,qBAAAA,CAAsBwe,YAAAA,KACpB7S,yBAAyB8S,eAAAA,EAC3B;AACA,MAAA,MAAM,IAAIJ,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,6EAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IACE,CAACve,qBAAAA,CAAsBoe,iBAAAA,CAAkB1c,IAAAA,CAAK,CAACgd,YAC7CV,oBAAAA,CAAqBW,GAAAA,CAAID,OAAAA,CAAAA,CAAAA,EAE3B;AACA,MAAA,MAAM,IAAIL,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,oHAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IACEve,qBAAAA,CAAsBoe,iBAAAA,CAAkB1c,IAAAA,CACtC,CAACgd,OAAAA,KAAY,CAACV,oBAAAA,CAAqBW,GAAAA,CAAID,OAAAA,CAAAA,CAAAA,EAEzC;AACA,MAAA,MAAM,IAAIL,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,wGAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IACE,CAACve,qBAAAA,CAAsByd,WAAAA,IACvB,OAAOzd,qBAAAA,CAAsByd,gBAAgB,QAAA,EAC7C;AACA,MAAA,MAAM,IAAIY,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,kFAAA,CAAA;AAEJ,IAAA;AACF,EAAA;EAEA,MAAexjB,wBAAAA,CACblD,OACAC,OAAAA,EAC4C;AAC5C,IAAA,IAAID,MAAMjI,MAAAA,IAAU,IAAA,IAAQ,OAAOiI,KAAAA,CAAMjI,WAAW,QAAA,EAAU;AAC5D,MAAA,IAAA,CAAKuuB,6BAAAA,CAA8BtmB,MAAMjI,MAAM,CAAA;AACjD,IAAA;AAEA,IAAA,MAAMgvB,eAAAA,GACJ,MAAM,IAAA,CAAK9jB,gCAAAA,CAAiCoJ,kBAAAA,CAC1C;AACE5L,MAAAA,uBAAAA,EAAyBT,KAAAA,CAAMS,uBAAAA;AAC/BqC,MAAAA,eAAAA,EAAiB9C,KAAAA,CAAMmD,UAAAA;AACvBN,MAAAA,iBAAAA,EAAmBU,+BAAAA,CAAyBC;AAC9C,KAAA,EACAvD,QAAQvH,cAAc,CAAA;AAG1B,IAAA,IAAIquB,eAAAA,EAAiB;AACnB,MAAA,MAAM,IAAIP,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZR,2CAAAA,CAAAA;AAEJ,IAAA;AAEA,IAAA,OAAO,KAAA,CAAMhjB,wBAAAA,CAAyBlD,KAAAA,EAAOC,OAAAA,CAAAA;AAC/C,EAAA;EAEA,MAAe2D,6BAAAA,CACbzJ,SACA8F,OAAAA,EACiD;AACjD,IAAA,MAAM8mB,eAAAA,GACJ,MAAM,IAAA,CAAK9jB,gCAAAA,CAAiCoJ,kBAAAA,CAC1C;AACE5L,MAAAA,uBAAAA,EAAyBtG,OAAAA,CAAQsG,uBAAAA;AACjCqC,MAAAA,eAAAA,EAAiB3I,OAAAA,CAAQgJ,UAAAA;AACzBN,MAAAA,iBAAAA,EAAmBU,+BAAAA,CAAyBC;AAC9C,KAAA,EACAvD,QAAQvH,cAAc,CAAA;AAG1B,IAAA,IAAI,CAACquB,eAAAA,EAAiB;AACpB,MAAA,MAAM,IAAIP,wCAAAA,CAAgBC,oCAAAA,CAAYC,WAAAA,EAAa,mBAAA,CAAA;AACrD,IAAA;AAEA,IAAA,OAAO,KAAA,CAAM9iB,6BAAAA,CAA8BzJ,OAAAA,EAAS8F,OAAAA,CAAAA;AACtD,EAAA;EAEA,MAAe6D,8CAAAA,CACb9D,OACAC,OAAAA,EACkE;AAClE,IAAA,MAAM+mB,eAAAA,GACJ,MAAM,IAAA,CAAK/jB,gCAAAA,CAAiCwJ,4CAC1CzM,KAAAA,CAAMlF,EAAAA,EACNmF,QAAQvH,cAAc,CAAA;AAG1B,IAAA,IAAI,CAACsuB,eAAAA,EAAiB;AACpB,MAAA,MAAM,IAAIR,wCAAAA,CACRC,oCAAAA,CAAYC,WAAAA,EACZ,4BAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,IAAA,CAAKJ,6BAAAA,CAA8BtmB,MAAMjI,MAAM,CAAA;AAC/C,IAAA,OAAO,MAAM,KAAA,CAAM+L,8CAAAA,CACjB9D,KAAAA,EACAC,OAAAA,CAAAA;AAEJ,EAAA;AACF;;;;;;;;;;;;;;;;;;ACnHazC,iCAAN,gBAAA,CAAMA;AAAAA,EAAAA;;;AAAW;;;IAvCtBC,OAAAA,EAAS;;AAEPC,MAAAA,mBAAAA,CAAaC,OAAAA,CAAQ;QACnBC,WAAAA,EAAa/F,YAAAA,CAAQC,WAAW,eAAA,CAAA;QAChC+F,QAAAA,EAAU;OAEZ,CAAA;AACAopB,MAAAA,6BAAAA;AACAnpB,MAAAA,gBAAAA;AACAC,MAAAA,qCAAAA;AACAmpB,MAAAA;;IAEFlpB,WAAAA,EAAa;AAACtG,MAAAA;;IACduG,SAAAA,EAAW;AACTzG,MAAAA,WAAAA;AACAgW,MAAAA,wBAAAA;AACAZ,MAAAA,+BAAAA;AACA+D,MAAAA,0BAAAA;AACAwP,MAAAA,+BAAAA;AACAha,MAAAA,mCAAAA;AACA4F,MAAAA,wCAAAA;AACA1T,MAAAA,uCAAAA;AACAuB,MAAAA,0BAAAA;AACAE,MAAAA,6BAAAA;AACA8S,MAAAA,+BAAAA;AACAY,MAAAA,wBAAAA;AACAsY,MAAAA,4CAAAA;AACAO,MAAAA,iDAAAA;AACAc,MAAAA;;IAEFjpB,OAAAA,EAAS;AACPsP,MAAAA,wBAAAA;AACAZ,MAAAA,+BAAAA;AACA+D,MAAAA,0BAAAA;AACAwP,MAAAA,+BAAAA;AACA2F,MAAAA,4CAAAA;AACAO,MAAAA;;;;;;;;;;;;;ACrDS7oB,qCAAN,gBAAA,CAAMA;AAAAA,EAAAA;;;AAAW;;;IALtBC,OAAAA,EAAS;AAAC2pB,MAAAA,8BAAAA;AAAwBH,MAAAA;;IAClCjpB,WAAAA,EAAa;AAACtG,MAAAA;;IACduG,SAAAA,EAAW;AAACzG,MAAAA,UAAAA;AAAY4vB,MAAAA,8BAAAA;AAAwBH,MAAAA;;IAChD/oB,OAAAA,EAAS;AAACkpB,MAAAA,8BAAAA;AAAwBH,MAAAA","file":"index.js","sourcesContent":["import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n constructor() {\n // Service initialization\n }\n\n getHello(): string {\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('offering-im')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","/**\n * Load environment variables from root .env file\n * This must be imported/required before any other modules that depend on environment variables\n * (e.g., @dv4resi/dvss-backend-module-utility checks env vars at module import time)\n */\nimport { config } from 'dotenv';\nimport { resolve } from 'path';\n\n// Resolve path to root .env file\n// From src/: ../../../\n// From dist/: ../../../\nconst rootEnvPath = resolve(__dirname, '../../../.env');\nconfig({ path: rootEnvPath });\n","import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n /**\n * Creates an instance of the app service\n */\n constructor() {\n // Service initialization\n }\n\n getHello(): string {\n console.log(`${this.constructor.name}::getHello`);\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('integration-trybe')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('integration-libs')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","/**\n * HTTP method constants\n */\nexport enum HTTP_METHOD {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n DELETE = 'DELETE',\n PATCH = 'PATCH',\n}\n","import {\n LoggerService,\n SYSTEM_USER_ID,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\n\n/**\n * Request logging data structure\n */\nexport interface IIntegrationRequestLog {\n integrationId?: bigint | string;\n method: string;\n url: string;\n headers?: Record<string, string>;\n requestBody?: unknown;\n responseBody?: unknown;\n statusCode?: number;\n duration?: number;\n loggedInUserId?: bigint;\n timestamp?: Date;\n error?: unknown;\n}\n\n/**\n * Service to expose the functionality to log integration requests\n * Uses LoggerService from @dv4resi/dvss-backend-module-utility\n */\n@Injectable()\nexport class IntegrationRequestLoggerService {\n private readonly className = IntegrationRequestLoggerService.name;\n\n constructor(private readonly logger: LoggerService) {}\n\n /**\n * Log integration request (before making the API call)\n *\n * @param logData - The request log data to be logged\n */\n logRequest(logData: IIntegrationRequestLog): void {\n const { loggedInUserId, method, url, headers, requestBody } = logData;\n\n this.logger.info(\n loggedInUserId || SYSTEM_USER_ID,\n this.logRequest.name,\n this.className,\n `Integration API Request: ${method} ${url}`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n headers,\n requestBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration response (after successful API call)\n *\n * @param logData - The response log data to be logged\n */\n logResponse(logData: IIntegrationRequestLog): void {\n const { loggedInUserId, method, url, statusCode, duration, responseBody } =\n logData;\n\n this.logger.info(\n loggedInUserId || SYSTEM_USER_ID,\n this.logResponse.name,\n this.className,\n `Integration API Response: ${method} ${url} - ${statusCode} (${duration}ms)`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n statusCode,\n duration,\n responseBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration error (after failed API call)\n *\n * @param logData - The error log data to be logged\n */\n logError(logData: IIntegrationRequestLog): void {\n const {\n loggedInUserId,\n method,\n url,\n statusCode,\n duration,\n error,\n responseBody,\n } = logData;\n\n this.logger.error(\n loggedInUserId || SYSTEM_USER_ID,\n this.logError.name,\n this.className,\n `Integration API Error: ${method} ${url} - ${statusCode || 'N/A'} (${duration || 0}ms)`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n statusCode,\n duration,\n error,\n responseBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration request (legacy method for backward compatibility)\n * This method determines whether to log as request, response, or error based on the logData\n *\n * @param logData - The request log data to be logged\n */\n logIntegrationRequest(logData: IIntegrationRequestLog): void {\n if (logData.error) {\n this.logError(logData);\n } else if (logData.statusCode && logData.responseBody !== undefined) {\n this.logResponse(logData);\n } else {\n this.logRequest(logData);\n }\n }\n}\n","import { Injectable } from '@nestjs/common';\n\n/**\n * Service to expose the functionality to validate and enforce rate limits\n */\n@Injectable()\nexport class RateLimiterService {\n /**\n * Validate and enforce rate limit\n *\n * @returns Promise resolving when the rate limit is validated and enforced\n */\n async validateAndEnforceRateLimit(): Promise<void> {\n // TODO Get the rate limit from the configuration store\n // TODO Validate the rate limit\n // TODO Enforce the rate limit\n // TODO If the rate limit is exceeded, throw an error\n // TODO If the rate limit is not exceeded, pass the request to the traffic gateway\n }\n}\n","import { HttpService } from '@nestjs/axios';\nimport { Injectable } from '@nestjs/common';\nimport { firstValueFrom } from 'rxjs';\nimport { HTTP_METHOD } from '../constants/http.constant';\nimport {\n IntegrationRequestLoggerService,\n type IIntegrationRequestLog,\n} from '../logging/request-logger.service';\nimport { RateLimiterService } from '../rate-limiter/rate-limiter.service';\nimport { IValidatedCapabilityIntegration } from '../../integration-common-utils';\n\n/**\n * Request configuration for API calls\n */\nexport interface IApiCallRequest<TBody = unknown> {\n apiMethod: HTTP_METHOD;\n url: string;\n baseUrl: string;\n headers?: Record<string, string>;\n body?: TBody;\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n headerType?: 'json' | 'xml';\n}\n\n/**\n * Request context for deriving rate limits and other settings\n */\nexport interface IIntegrationRequestContext {\n projectId?: bigint;\n propertyId?: bigint;\n capabilityId?: bigint;\n [key: string]: unknown;\n}\n\n/**\n * Service to expose the functionality to execute integration requests\n * This service provides a generic API call method that can be used for any third-party integration\n */\n@Injectable()\nexport class TrafficGatewayService {\n constructor(\n private readonly httpService: HttpService,\n private readonly requestLogger: IntegrationRequestLoggerService,\n private readonly rateLimiter: RateLimiterService,\n ) {}\n\n /**\n * Execute a generic API call to a third-party integration\n *\n * @template TResponse - The expected response type\n * @template TRequestBody - The request body type (optional)\n * @param request - The API call request configuration\n * @param integration - The integration configuration\n * @param loggedInUserId - Optional user ID for logging purposes\n * @param _context - Optional context for deriving rate limits and other settings (projectId, propertyId, etc.)\n * @returns Promise resolving to the API response data\n * @throws Error if the request fails or rate limit is exceeded\n */\n async executeIntegrationRequest<TResponse = unknown, TRequestBody = unknown>(\n request: IApiCallRequest<TRequestBody>,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId?: bigint,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _context?: IIntegrationRequestContext,\n ): Promise<TResponse> {\n const startTime = Date.now();\n\n try {\n // Prepare headers with authorization\n const headers = this.prepareHeaders(request);\n\n // Prepare request configuration\n const requestConfig = this.prepareRequestConfig(request, headers);\n\n // Rate limiting check with context for deriving rate limits\n await this.rateLimiter.validateAndEnforceRateLimit();\n\n // Construct full URL with proper handling of trailing slashes\n const fullUrl = this.constructFullUrl(request.baseUrl, request.url);\n\n // Prepare log data with full URL and headers for request logging\n const logData: IIntegrationRequestLog = {\n integrationId: integration.id,\n method: request.apiMethod,\n url: fullUrl,\n headers,\n requestBody: request.body,\n loggedInUserId,\n timestamp: new Date(),\n };\n\n // Log the request before making the API call\n this.requestLogger.logRequest(logData);\n\n // Execute the HTTP request based on method\n const apiResponse = await this.executeHttpRequest<TResponse>(\n request,\n fullUrl,\n requestConfig,\n );\n\n const duration = Date.now() - startTime;\n const responseData = apiResponse.data;\n\n // Log the successful response\n this.requestLogger.logResponse({\n ...logData,\n responseBody: responseData,\n statusCode: apiResponse.status,\n duration,\n });\n\n return responseData;\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorDetails = this.extractErrorDetails(error);\n\n // Get base URL safely for error logging\n const baseUrl = integration.config.platformConfig.baseUrl;\n const fullUrl = this.constructFullUrl(baseUrl, request.url);\n\n // Log the failed request with API reason (message/error_description) and response body\n this.requestLogger.logError({\n integrationId: integration.id,\n method: request.apiMethod,\n url: fullUrl,\n headers: request.headers,\n requestBody: request.body,\n loggedInUserId,\n timestamp: new Date(),\n error: errorDetails.apiMessage,\n statusCode: errorDetails.statusCode,\n duration,\n responseBody: errorDetails.responseBody,\n });\n\n // Attach apiMessage and statusCode so any integration (Trybe, etc.) can map to its own exceptions\n const err = error as Error & { apiMessage?: string; statusCode?: number };\n err.apiMessage = errorDetails.message;\n err.statusCode = errorDetails.statusCode;\n err.message = errorDetails.apiMessage;\n\n throw error;\n }\n }\n\n /**\n * Prepare headers for the API request\n *\n * @private\n * @param request - The API call request configuration\n * @param apiKey - The API key for authorization\n * @returns Prepared headers object\n */\n private prepareHeaders(request: IApiCallRequest): Record<string, string> {\n request.headerType = request.headerType || 'json';\n\n const headers: Record<string, string> = {\n ...(request.headers || {}),\n };\n\n // Set default content type if not provided for methods that send body\n if (\n !headers['Content-Type'] &&\n request.headerType === 'json' &&\n (request.apiMethod === HTTP_METHOD.POST ||\n request.apiMethod === HTTP_METHOD.PUT ||\n request.apiMethod === HTTP_METHOD.PATCH)\n ) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Set default accept header if not provided\n if (!headers['Accept'] && request.headerType === 'json') {\n headers['Accept'] = 'application/json';\n }\n\n return headers;\n }\n\n /**\n * Prepare request configuration object\n *\n * @private\n * @param request - The API call request configuration\n * @param headers - Prepared headers\n * @returns Request configuration object\n */\n private prepareRequestConfig(\n request: IApiCallRequest,\n headers: Record<string, string>,\n ): Record<string, unknown> {\n const requestConfig: Record<string, unknown> = {\n headers,\n };\n\n if (request.responseType) {\n requestConfig.responseType = request.responseType;\n }\n\n return requestConfig;\n }\n\n /**\n * Construct full URL from base URL and request URL\n * Handles trailing slashes properly\n *\n * @private\n * @param baseUrl - The base URL from platform config\n * @param requestUrl - The request URL path\n * @returns Constructed full URL\n */\n private constructFullUrl(baseUrl: string, requestUrl: string): string {\n const normalizedBaseUrl = baseUrl.endsWith('/')\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedRequestUrl = requestUrl.startsWith('/')\n ? requestUrl\n : `/${requestUrl}`;\n\n return `${normalizedBaseUrl}${normalizedRequestUrl}`;\n }\n\n /**\n * Execute HTTP request based on the method\n *\n * @private\n * @template TResponse - The expected response type\n * @param request - The API call request configuration\n * @param fullUrl - The full URL to make the request to\n * @param requestConfig - The request configuration\n * @returns Promise resolving to the HTTP response\n * @throws Error if the HTTP method is unsupported\n */\n private async executeHttpRequest<TResponse>(\n request: IApiCallRequest,\n fullUrl: string,\n requestConfig: Record<string, unknown>,\n ) {\n switch (request.apiMethod) {\n case HTTP_METHOD.GET: {\n return await firstValueFrom(\n this.httpService.get<TResponse>(fullUrl, requestConfig),\n );\n }\n case HTTP_METHOD.POST: {\n return await firstValueFrom(\n this.httpService.post<TResponse>(\n fullUrl,\n request.body,\n requestConfig,\n ),\n );\n }\n case HTTP_METHOD.PUT: {\n return await firstValueFrom(\n this.httpService.put<TResponse>(fullUrl, request.body, requestConfig),\n );\n }\n case HTTP_METHOD.PATCH: {\n return await firstValueFrom(\n this.httpService.patch<TResponse>(\n fullUrl,\n request.body,\n requestConfig,\n ),\n );\n }\n case HTTP_METHOD.DELETE: {\n return await firstValueFrom(\n this.httpService.delete<TResponse>(fullUrl, requestConfig),\n );\n }\n default: {\n throw new Error(\n `Unsupported HTTP method: ${String(request.apiMethod)}`,\n );\n }\n }\n }\n\n /**\n * Extract error details from an error object (e.g. Axios error).\n * Provider-agnostic: derives apiMessage from common response shapes so any integration\n * (Trybe, OAuth, REST, etc.) gets a readable reason. Callers can use statusCode and\n * responseBody to map to their own exceptions (e.g. 404 -> RESOURCE_NOT_FOUND).\n *\n * Supported response.data fields (first string wins): message, error_description,\n * error, detail, msg.\n *\n * @private\n * @param error - The error object\n * @returns Extracted error details including apiMessage for logging and callers\n */\n private extractErrorDetails(error: unknown): {\n message?: string;\n statusCode?: number;\n responseBody?: unknown;\n apiMessage: string;\n } {\n const errorObject = error as {\n status?: number;\n response?: { data?: unknown; status?: number };\n message?: string;\n };\n\n const responseData = errorObject.response?.data;\n const data =\n typeof responseData === 'object' && responseData !== null\n ? (responseData as Record<string, unknown>)\n : undefined;\n\n const firstString = (...keys: string[]): string | undefined => {\n for (const k of keys) {\n const v = data?.[k];\n if (typeof v === 'string' && v.trim()) return v;\n }\n return undefined;\n };\n\n const apiMessage =\n firstString('message', 'error_description', 'error', 'detail', 'msg') ||\n errorObject.message ||\n 'API error';\n\n return {\n message: errorObject.message,\n statusCode: errorObject.status || errorObject.response?.status,\n responseBody: errorObject.response?.data,\n apiMessage,\n };\n }\n}\n","/**\n * Load environment variables from root .env file\n * This must be imported/required before any other modules that depend on environment variables\n * (e.g., @dv4resi/dvss-backend-module-utility checks env vars at module import time)\n */\nimport { config } from 'dotenv';\nimport { resolve } from 'path';\n\n// Resolve path to root .env file\n// From src/: ../../../\n// From dist/: ../../../\nconst rootEnvPath = resolve(__dirname, '../../../.env');\nconfig({ path: rootEnvPath });\n","// Load environment variables BEFORE importing modules that check env vars at import time\nimport { LoggerModule } from '@dv4resi/dvss-backend-module-utility';\nimport { HttpModule } from '@nestjs/axios';\nimport { Module } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { resolve } from 'path';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { TrafficGatewayService } from './integration-traffic-router/gateway/traffic-gateway.service';\nimport { IntegrationRequestLoggerService } from './integration-traffic-router/logging/request-logger.service';\nimport { RateLimiterService } from './integration-traffic-router/rate-limiter/rate-limiter.service';\nimport './load-env';\n\n@Module({\n imports: [\n // Load environment variables from root .env file\n ConfigModule.forRoot({\n envFilePath: resolve(__dirname, '../../../.env'),\n isGlobal: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n HttpModule,\n LoggerModule,\n ],\n controllers: [AppController],\n providers: [\n AppService,\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n RateLimiterService,\n ],\n exports: [\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n RateLimiterService,\n ],\n})\nexport class AppModule {}\n","export const TRAFFIC_ROUTER_CONFIGURATION_STORE_KEY =\n 'traffic-router-configuration-store';\n","import {\n ICapabilityIntegration,\n IValidatedCapabilityIntegration,\n} from '../../../integration-common-utils';\n\n/**\n * Base abstract class for integration authentication operations\n * Provides a foundation for implementing authentication functionality\n * for different integration providers\n *\n * This class should be extended by concrete implementations that provide\n * specific authentication operations for different integration systems\n */\nexport abstract class BaseAuth {\n /**\n * Abstract method to validate integration configuration\n * Must be implemented by concrete classes\n *\n * @param config - Integration configuration object\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to validated configuration\n */\n abstract validateConfig(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): IValidatedCapabilityIntegration;\n\n /**\n * Abstract method to test integration connection\n * Must be implemented by concrete classes\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when test is completed\n */\n abstract testIntegration(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<boolean>;\n\n /**\n * Abstract method to fetch an access token from the integration provider.\n * Must be implemented by concrete classes.\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to the access token string\n */\n abstract fetchAccessToken(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<string>;\n}\n","/**\n * System-level credit and customer credits response types.\n * Aligned with payment MS GetUserCredits / Credit shape for consumption across the system.\n * Integrations map their provider-specific responses to these types.\n */\n\n/** Credit type values aligned with payment MS CREDIT_TYPE_ENUM */\nexport enum CREDIT_TYPE_ENUM {\n COUPON = 'COUPON',\n AMOUNT = 'AMOUNT',\n}\n\n/** Credit status values aligned with payment MS CREDIT_STATUS_ENUM */\nexport enum CREDIT_STATUS_ENUM {\n ACTIVE = 'ACTIVE',\n REDEEMED = 'REDEEMED',\n EXPIRED = 'EXPIRED',\n REVOKED = 'REVOKED',\n}\n\nexport enum CREDIT_FILTER_BY_ENUM {\n TYPE = 'TYPE',\n STATUS = 'STATUS',\n}\n\n/**\n * A single credit in the system format.\n * Matches the shape expected by payment MS Credit (plain interface, no GraphQL).\n * Fields not provided by an integration (e.g. id, projectId) are optional.\n */\nexport interface ICredit {\n id?: bigint;\n name: string;\n description?: string;\n type: CREDIT_TYPE_ENUM;\n status: CREDIT_STATUS_ENUM;\n projectId?: number;\n propertyId?: number;\n externalId?: string;\n expiresAt?: Date;\n expiresDate?: string;\n startsAt?: Date;\n startDate?: string;\n value?: string;\n capabilityIntegrationId?: bigint;\n quantity?: number;\n meta?: Record<string, unknown>;\n}\n\n/**\n * System response for customer credits.\n * Matches payment MS GetUserCredits: { totalCount, records }.\n */\nexport interface IGetCustomerCreditsRequestFilters {\n by: CREDIT_FILTER_BY_ENUM;\n values: string[];\n}\n\nexport interface IGetCustomerCreditsRequestOptions {\n filters?: IGetCustomerCreditsRequestFilters[];\n page?: number;\n count?: number;\n}\n\nexport interface IGetCustomerCreditsRequest {\n customerId: string;\n options?: IGetCustomerCreditsRequestOptions;\n}\n","export enum INTEGRATION_PROVIDER_ENUM {\n TRYBE = 'TRYBE',\n}\n\ninterface IPlatformConfig {\n baseUrl?: string;\n}\n\ninterface IIntegrationConfig {\n siteId?: string;\n apiKey?: string;\n organisationId?: string;\n}\n\nexport interface ICapabilityIntegrationConfig {\n platformConfig?: IPlatformConfig;\n integrationConfig?: IIntegrationConfig;\n}\n\nexport interface IValidatedCapabilityIntegrationConfig {\n platformConfig: Required<IPlatformConfig>;\n integrationConfig: Required<IIntegrationConfig>;\n}\n\nexport interface ICapabilityIntegration {\n id: bigint;\n provider?: INTEGRATION_PROVIDER_ENUM | null;\n providerId?: bigint;\n config?: ICapabilityIntegrationConfig;\n capabilityId?: bigint;\n projectId?: number;\n}\n\nexport interface IValidatedCapabilityIntegration {\n id: bigint;\n provider?: INTEGRATION_PROVIDER_ENUM | null;\n providerId?: bigint;\n config: IValidatedCapabilityIntegrationConfig;\n capabilityId?: bigint;\n headers?: Record<string, string>;\n projectId?: number;\n}\n","import {\n DAY_OF_WEEK,\n OFFERING_RESOURCE_TYPE,\n STATUS,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\nexport enum BOOKABLE_ITEM_TYPE_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport enum BOOKABLE_ITEM_STATUS_ENUM {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n}\n\nexport interface IBookableItemPriceMeta {\n id?: bigint;\n externalId?: string;\n status?: BOOKABLE_ITEM_STATUS_ENUM;\n price: number;\n currency: string;\n configuredForDays?: DAY_OF_WEEK[];\n config?: Record<string, unknown>;\n}\n\nexport interface IBookableItemPrice {\n id?: bigint;\n label?: string;\n currency: string;\n price: number;\n externalResourceId?: string;\n durationInMinute?: number;\n configuredForDays?: DAY_OF_WEEK[];\n pricesMeta?: IBookableItemPriceMeta[];\n config?: Record<string, unknown>;\n}\n\nexport interface IBookableItemMedia {\n id?: string;\n url?: string;\n originalUrl?: string;\n fileName?: string;\n mimeType?: string;\n thumbnailUrl?: string;\n}\n\nexport interface IBookableItem {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n type: BOOKABLE_ITEM_TYPE_ENUM;\n status?: BOOKABLE_ITEM_STATUS_ENUM;\n icon?: IBookableItemMedia;\n primaryAsset?: IBookableItemMedia;\n prices?: IBookableItemPrice[];\n linkedBookableItems?: IBookableItem[];\n updatedAt?: Date;\n createdAt?: Date;\n meta?: Record<string, unknown>;\n}\n\nexport interface IBookableItemCategory {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface IWellnessManagementRequestOptions {\n page?: number;\n count?: number;\n}\n\nexport interface IGetAppointmentsRequest {\n shouldFetchAllAppointments: boolean;\n practitionerIds?: string[];\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetSessionsRequest {\n shouldFetchAllSessions: boolean;\n practitionerIds?: string[];\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetCoursesRequest {\n shouldFetchAllCourses: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetCategoriesRequest {\n shouldFetchAllCategories: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetBookableItemsFromCreditRequest {\n couponCodeId: string;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IFetchOfferingAvailabilityRequest {\n externalOfferingBookableItemId: string;\n dateTimeFrom: Date;\n dateTimeTo: Date;\n}\n\nexport interface IAvailableTimeSlot {\n fromTime: string;\n toTime: string;\n meta?: unknown;\n}\n\nexport interface IAvailableDateWithSlots {\n date: Date;\n meta?: unknown;\n time: IAvailableTimeSlot[];\n}\n\nexport interface IGetAvailableDatesAndTimeSlotsResponse {\n dates: IAvailableDateWithSlots[];\n}\n\nexport interface IOrderGuest {\n id: string;\n name?: string;\n}\n\nexport interface IGetOrderResponse {\n orderId: string;\n guests: IOrderGuest[];\n}\n\nexport interface ICreateOrderRequest {\n bookingStartTime: Date;\n durationInMinutes?: number;\n meta?: Record<string, unknown>;\n bookableItems: Pick<IBookableItem, 'externalId' | 'type'>[];\n offeringResources: Pick<IOfferingResource, 'externalId'>[];\n currencyMultiplier: number;\n customerId: string;\n customerCreditId?: string;\n}\n\nexport interface ICreateOrderResponse {\n externalBookingId: string;\n items: (IBookableItem & { totalPrice?: number })[];\n}\n\nexport interface IAddItemToOrderItemConfig {\n offeringId: string;\n offeringType: BOOKABLE_ITEM_TYPE_ENUM;\n guestIds: string[];\n practitionerIds: string[];\n durationMinutes?: number;\n timeIso?: string;\n sessionId?: string;\n}\n\nexport interface IAddItemToOrderRequest {\n orderId: string;\n item: IAddItemToOrderItemConfig;\n}\n\nexport interface IAddItemToOrderResponse {\n name?: string;\n netTotal?: number;\n}\n\nexport interface IAddPaymentToOrderRequest {\n orderId: string;\n amount: number;\n paymentTypeId: string;\n}\n\nexport interface IOfferingResourceMedia {\n meta?: Record<string, unknown>;\n provider?: string;\n}\n\n/**\n * System response type for practitioners/resources aligned with GQL OfferingResource.\n * Union fields map from integration; integration-specific fields go in meta.\n */\nexport interface IOfferingResource {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n type: OFFERING_RESOURCE_TYPE;\n status: STATUS;\n media?: IOfferingResourceMedia;\n meta?: Record<string, unknown>;\n bookableItems?: unknown[];\n createdAt?: Date;\n createdBy?: bigint;\n deletedAt?: Date;\n deletedBy?: bigint;\n isCurrentlyUnavailable?: boolean;\n occurrences?: unknown[];\n offeringId?: bigint;\n priceSummary?: string;\n projectId?: number;\n quantity?: number;\n unavailability?: unknown[];\n updatedAt?: Date;\n updatedBy?: bigint;\n}\n\nexport interface IGetPractitionersRequest {\n shouldFetchAllPractitioners: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IUpdateOrderRequest {\n orderId: string;\n timezone: string;\n item: {\n externalId: string;\n type: BOOKABLE_ITEM_TYPE_ENUM;\n };\n sessionId?: string;\n durationInMinutes?: number;\n bookingStartDateLabel?: string;\n bookingStartTimeLabel?: string;\n}\n\nexport interface IUpdateOrderResponse {\n success: boolean;\n data?: { id: string };\n}\n","import {\n IUpdateOrderRequest,\n IUpdateOrderResponse,\n type IBookableItem,\n type IBookableItemCategory,\n type ICapabilityIntegration,\n type ICreateOrderRequest,\n type ICreateOrderResponse,\n type IFetchOfferingAvailabilityRequest,\n type IGetAppointmentsRequest,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IGetBookableItemsFromCreditRequest,\n type IGetCategoriesRequest,\n type IGetCoursesRequest,\n type IGetOrderResponse,\n type IGetPractitionersRequest,\n type IGetSessionsRequest,\n type IOfferingResource,\n} from '../../../integration-common-utils';\nimport { type ISystemResponse } from '../../models/common.model';\n\n/**\n * Base abstract class for wellness management operations\n * Provides a foundation for implementing wellness management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific wellness management operations for different systems\n */\nexport abstract class BaseWellnessManagement {\n abstract fetchAppointments(\n request: IGetAppointmentsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchSessions(\n request: IGetSessionsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchCourses(\n request: IGetCoursesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchCategories(\n request: IGetCategoriesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItemCategory>>;\n\n abstract fetchBookableItemsFromCredit(\n request: IGetBookableItemsFromCreditRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchSessionAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse>;\n\n abstract fetchAppointmentAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse>;\n\n abstract fetchPractitioners(\n request: IGetPractitionersRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IOfferingResource>>;\n\n /**\n * Creates an external order for an offering booking in the integration platform.\n * This is the only booking-order operation exposed by the skeleton; all\n * provider-specific HTTP orchestration (add customer, add items, credits,\n * submit, etc.) should be encapsulated inside the concrete implementation.\n */\n abstract createOrder(\n request: ICreateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICreateOrderResponse>;\n\n abstract getOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetOrderResponse>;\n\n abstract cancelOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void>;\n\n abstract updateOrder(\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IUpdateOrderResponse>;\n\n /**\n * Abstract method to fetch a wellness appointment session\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session is fetched\n */\n abstract fetchWellnessAppointmentSession(): Promise<void>;\n\n /**\n * Abstract method to check availability of a wellness appointment session\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the availability check is completed\n */\n abstract checkWellnessAppointmentSessionAvailability(): Promise<void>;\n\n /**\n * Abstract method to create a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session order is created\n */\n abstract createWellnessAppointmentSessionOrder(): Promise<void>;\n\n /**\n * Abstract method to add items to a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the order items are added\n */\n abstract addWellnessAppointmentSessionOrderItems(): Promise<void>;\n\n /**\n * Abstract method to confirm a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session order is confirmed\n */\n abstract confirmWellnessAppointmentSessionOrder(): Promise<void>;\n}\n","import {\n ICapabilityIntegration,\n ICredit,\n IGetCustomerCreditsRequest,\n} from '../../../integration-common-utils';\nimport { ISystemResponse } from '../../models/common.model';\n\n/**\n * Base abstract class for credit booking operations\n * Provides a foundation for implementing credit booking functionality\n *\n * This class should be extended by concrete implementations that provide\n * specific credit booking operations for different systems\n */\nexport abstract class BaseCreditBooking {\n /**\n * Abstract method to fetch customer credits\n * Must be implemented by concrete classes\n *\n * @param request - The request object containing the customer ID\n * @param integration - The integration object\n * @param loggedInUserId - The user ID of the logged in user\n * @returns Promise resolving to the system customer credits response (totalCount, records)\n */\n abstract fetchCustomerCredits(\n request: IGetCustomerCreditsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<ICredit>>;\n}\n","import {\n IAddCustomerRequest,\n IAddUpdateCustomerResponseData,\n ICustomer,\n IDeleteAPIResponse,\n IGetCustomerRequest,\n IUpdateCustomerRequest,\n IValidatedCapabilityIntegration,\n} from '../../../integration-common-utils';\n\n/**\n * Base abstract class for customer management operations\n * Provides a foundation for implementing customer management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different systems\n */\nexport abstract class BaseCustomerManagement {\n /**\n * Create a new customer.\n *\n * @returns Promise resolving to the created customer\n */\n abstract createCustomer(\n request: IAddCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICustomer>;\n\n /**\n * Abstract method to search for customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n abstract searchCustomer(\n request: IGetCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICustomer | undefined>;\n\n /**\n * Update an existing customer.\n *\n * @returns Promise resolving to the updated customer data (e.g. id and fields)\n */\n abstract updateCustomer(\n customerId: string,\n request: IUpdateCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddUpdateCustomerResponseData>;\n\n /**\n * Abstract method to delete a customer.\n * Must be implemented by concrete classes.\n *\n * @param customerId - The customer ID to delete\n * @param integration - Validated capability integration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when the customer is deleted\n */\n abstract deleteCustomer(\n customerId: string,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IDeleteAPIResponse>;\n}\n","/**\n * Base abstract class for package management operations\n * Provides a foundation for implementing package management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific package management operations for different systems\n */\nexport abstract class BasePackageManagement {\n /**\n * Abstract method to fetch course types\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the course types are fetched\n */\n abstract fetchCourseTypes(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting contact management operations\n * Provides a foundation for implementing contact management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific contact management operations for different accounting systems\n */\nexport abstract class BaseAccountingContactManagement {\n /**\n * Abstract method to create an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is created\n */\n abstract createAccountingContactPerson(): Promise<void>;\n\n /**\n * Abstract method to update an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is updated\n */\n abstract updateAccountingContactPerson(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is deleted\n */\n abstract deleteAccountingContactPerson(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting credit note management operations\n * Provides a foundation for implementing credit note management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific credit note management operations for different accounting systems\n */\nexport abstract class BaseAccountingCreditNoteManagement {\n /**\n * Abstract method to create an accounting credit note\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the credit note is created\n */\n abstract createAccountingCreditNote(): Promise<void>;\n\n /**\n * Abstract method to apply an accounting credit note\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the credit note is applied\n */\n abstract applyAccountingCreditNote(): Promise<void>;\n\n /**\n * Abstract method to refund accounting excess payment\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the excess payment is refunded\n */\n abstract refundAccountingExcessPayment(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting customer management operations\n * Provides a foundation for implementing customer management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different accounting systems\n */\nexport abstract class BaseAccountingCustomerManagement {\n /**\n * Abstract method to create an accounting customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createAccountingCustomer(): Promise<void>;\n\n /**\n * Abstract method to list accounting contacts\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contacts are listed\n */\n abstract listAccountingContacts(): Promise<void>;\n\n /**\n * Abstract method to update an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact is updated\n */\n abstract updateAccountingContact(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact is deleted\n */\n abstract deleteAccountingContact(): Promise<void>;\n\n /**\n * Abstract method to change the status of an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact status is changed\n */\n abstract changeAccountingContactStatus(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting customer payment management operations\n * Provides a foundation for implementing customer payment management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer payment management operations for different accounting systems\n */\nexport abstract class BaseAccountingCustomerPaymentManagement {\n /**\n * Abstract method to create an accounting customer payment\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer payment is created\n */\n abstract createAccountingCustomerPayment(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting invoice management operations\n * Provides a foundation for implementing invoice management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific invoice management operations for different accounting systems\n */\nexport abstract class BaseAccountingInvoiceManagement {\n /**\n * Abstract method to create an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is created\n */\n abstract createAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to update an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is updated\n */\n abstract updateAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is deleted\n */\n abstract deleteAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to download an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is downloaded\n */\n abstract downloadAccountingInvoice(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting chart of accounts (LOA) management operations\n * Provides a foundation for implementing chart of accounts management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific chart of accounts management operations for different accounting systems\n */\nexport abstract class BaseAccountingLOAManagement {\n /**\n * Abstract method to list accounting chart of accounts\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the chart of accounts is listed\n */\n abstract listAccountingChartOfAccounts(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting tax management operations\n * Provides a foundation for implementing tax management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific tax management operations for different accounting systems\n */\nexport abstract class BaseAccountingTaxManagement {\n /**\n * Abstract method to list accounting taxes\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the taxes are listed\n */\n abstract listAccountingTaxes(): Promise<void>;\n}\n","/**\n * Base abstract class for payment operations\n * Provides a foundation for implementing payment functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific payment operations for different payment systems\n */\nexport abstract class BasePayment {\n /**\n * Abstract method to create a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is created\n */\n abstract createPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to confirm a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is confirmed\n */\n abstract confirmPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to cancel a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is cancelled\n */\n abstract cancelPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to create a payment ephemeral key\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment ephemeral key is created\n */\n abstract createPaymentEphemeralKey(): Promise<void>;\n}\n","/**\n * Base abstract class for payment method management operations\n * Provides a foundation for implementing payment method management functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific payment method management operations for different payment systems\n */\nexport abstract class BasePaymentMethodManagement {\n /**\n * Abstract method to create a payment method\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is created\n */\n abstract createPaymentMethod(): Promise<void>;\n\n /**\n * Abstract method to attach a payment method to a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is attached\n */\n abstract attachPaymentMethodToCustomer(): Promise<void>;\n\n /**\n * Abstract method to list payment methods for a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment methods are listed\n */\n abstract listPaymentMethodForCustomer(): Promise<void>;\n\n /**\n * Abstract method to detach a payment method from a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is detached\n */\n abstract detachPaymentMethodFromCustomer(): Promise<void>;\n}\n","/**\n * Base abstract class for payment user management operations\n * Provides a foundation for implementing user management functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific user management operations for different payment systems\n */\nexport abstract class BasePaymentUserManagement {\n /**\n * Abstract method to list payment customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customers are listed\n */\n abstract listPaymentCustomers(): Promise<void>;\n\n /**\n * Abstract method to create a new payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createPaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to update an existing payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is updated\n */\n abstract updatePaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to delete a payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is deleted\n */\n abstract deletePaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to search for payment customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n abstract searchPaymentCustomers(): Promise<void>;\n}\n","/**\n * Base abstract class for membership customer management operations\n * Provides a foundation for implementing customer management functionality\n * within membership capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different membership systems\n */\nexport abstract class BaseMembershipCustomerManagement {\n /**\n * Abstract method to get all membership customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when all customers are retrieved\n */\n abstract getMembershipAllCustomers(): Promise<void>;\n\n /**\n * Abstract method to get a specific membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is retrieved\n */\n abstract getMembershipCustomer(): Promise<void>;\n\n /**\n * Abstract method to create a new membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createMembershipCustomer(): Promise<void>;\n\n /**\n * Abstract method to update an existing membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is updated\n */\n abstract updateMembershipCustomer(): Promise<void>;\n}\n","/**\n * Base abstract class for membership management operations\n * Provides a foundation for implementing membership management functionality\n * within membership capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific membership management operations for different membership systems\n */\nexport abstract class BaseMembershipManagement {\n /**\n * Abstract method to get membership types\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the membership types are retrieved\n */\n abstract getMembershipTypes(): Promise<void>;\n\n /**\n * Abstract method to get a membership\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the membership is retrieved\n */\n abstract getMembership(): Promise<void>;\n}\n","import type {\n CAPABILITY_CATEGORY_ENUM,\n CAPABILITY_TYPE_ENUM,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability.model';\nimport type { CommonValidationDatabaseService } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/util/common-validation.util';\nimport {\n AddAPIResponse,\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\nimport type {\n IAddCapabilityIntegration,\n IAddCapabilityIntegrationInput,\n IGetCapabilityIntegrationInput,\n IGetCapabilityIntegrationResult,\n IUpdateCapabilityIntegration,\n} from '../../../integration-common-utils';\nimport type { IntegrationConfigurationDao } from '../../../integration-common-utils/dao/integration-configuration.dao';\nimport type { ICapabilityIntegration } from '../../models/capability-integration.model';\nimport type {\n IGetCapabilityIntegrationsRequest,\n IGetCapabilityIntegrationsResponse,\n IUpdateCapabilityIntegrationRequest,\n IUpdateCapabilityIntegrationResponse,\n} from '../../models/integration-configuration.model';\n\n@Injectable()\nexport class BaseIntegrationConfiguration {\n protected readonly fileName = 'integration-configuration.base.ts';\n\n constructor(\n protected readonly integrationConfigurationDao: IntegrationConfigurationDao,\n protected readonly commonValidationDatabaseService: CommonValidationDatabaseService,\n protected readonly logger: LoggerService,\n ) {}\n\n /**\n * Validates add-capability-integration input (project, property, parent, capability, provider, configuredFor).\n * Logic copied from project-ms CapabilityIntegrationService.validateAddCapabilityIntegrationInput.\n */\n private async validateAddCapabilityIntegrationInput(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<{\n capability: {\n id: bigint;\n type: CAPABILITY_TYPE_ENUM;\n category: CAPABILITY_CATEGORY_ENUM;\n providerId: bigint;\n };\n capabilityProvider: { id: bigint };\n }> {\n await this.commonValidationDatabaseService.getProject({\n projectId: input.projectId,\n });\n\n if (input.propertyId != null) {\n await this.commonValidationDatabaseService.getProperty({\n propertyId: input.propertyId,\n projectId: input.projectId,\n });\n }\n\n if (input.parentId != null) {\n const parentIntegration =\n await this.integrationConfigurationDao.getCapabilityIntegration(\n { capabilityIntegrationId: input.parentId },\n context.loggedInUserId,\n );\n if (!parentIntegration) {\n throw new Error('Parent capability integration not found');\n }\n }\n\n const [capability, capabilityProvider] = await Promise.all([\n this.integrationConfigurationDao.getCapability(\n { capabilityId: input.capabilityId },\n context.loggedInUserId,\n ),\n this.integrationConfigurationDao.getCapabilityProvider(\n { capabilityProviderId: input.capabilityProviderId },\n context.loggedInUserId,\n ),\n ]);\n\n if (!capability) {\n throw new Error('Capability not found');\n }\n\n if (!capabilityProvider) {\n throw new Error('Capability provider not found');\n }\n\n if (capability.providerId !== capabilityProvider.id) {\n throw new Error(\n `Capability provider mismatch: capabilityId=${capability.id}, capabilityProviderId=${capability.providerId}`,\n );\n }\n\n return {\n capability: {\n id: capability.id,\n type: capability.type,\n category: capability.category,\n providerId: capability.providerId,\n },\n capabilityProvider: { id: capabilityProvider.id },\n };\n }\n\n /**\n * Add a capability integration (validate then persist via DAO).\n * Same name as project MS call: addCapabilityIntegration.\n */\n async addCapabilityIntegration(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<AddAPIResponse> {\n const { capability, capabilityProvider } =\n await this.validateAddCapabilityIntegrationInput(input, context);\n\n const addCapabilityIntegrationInput: IAddCapabilityIntegration = {\n ...input,\n providerId: capabilityProvider.id,\n createdBy: context.loggedInUserId,\n type: capability.type,\n category: capability.category,\n availableFor: input.availableFor,\n configuredFor: input.configuredFor,\n };\n\n // Create the capability integration\n const result =\n await this.integrationConfigurationDao.addCapabilityIntegration(\n addCapabilityIntegrationInput,\n context.loggedInUserId,\n );\n\n // Validate that the integration was created successfully\n if (!result || !result.id) {\n throw new Error('Failed to add capability integration');\n }\n\n return result;\n }\n\n /**\n * Update capability integration with config merging support.\n * Handles merging of integrationConfig and platformConfig from existing integration.\n *\n * @param request - Update request with id and updateData\n * @param integration - Optional existing integration for config merging\n * @param loggedInUserId - User ID for logging and audit\n * @returns Promise resolving to update status\n */\n async updateCapabilityIntegration(\n request: IUpdateCapabilityIntegrationRequest,\n integration?: ICapabilityIntegration,\n loggedInUserId?: bigint,\n ): Promise<IUpdateCapabilityIntegrationResponse> {\n if (!loggedInUserId) {\n throw new Error('loggedInUserId is required');\n }\n\n // Validate icon and nickname if needed (can be overridden in subclasses)\n this.validateIconAndNickName(request.updateData, loggedInUserId);\n\n let configToUpdate: Record<string, unknown> | undefined;\n const updateData = request.updateData;\n\n // Merge config if both updateData.config and integration.config exist\n if (updateData.config && integration?.config) {\n const existingConfig = integration.config as Record<string, unknown>;\n\n configToUpdate = {\n ...existingConfig,\n };\n\n // Merge integrationConfig - always merge existing with update data\n const existingIntegrationConfig =\n (existingConfig.integrationConfig as\n | Record<string, unknown>\n | undefined) || {};\n configToUpdate.integrationConfig = {\n ...existingIntegrationConfig,\n ...updateData.config.integrationConfig,\n };\n\n // Merge platformConfig - always merge existing with update data\n const existingPlatformConfig =\n (existingConfig.platformConfig as\n | Record<string, unknown>\n | undefined) || {};\n configToUpdate.platformConfig = {\n ...existingPlatformConfig,\n ...updateData.config.platformConfig,\n };\n } else if (updateData.config) {\n // No existing config, use updateData.config as-is\n configToUpdate = updateData.config as unknown as Record<string, unknown>;\n }\n\n // Prepare update data for DAO\n const updateDataForDao: IUpdateCapabilityIntegration = {\n nickname: updateData.nickname,\n icon: updateData.icon as unknown,\n config: configToUpdate as unknown,\n parentId: updateData.parentId,\n updatedBy: loggedInUserId,\n };\n\n return await this.integrationConfigurationDao.updateCapabilityIntegration(\n { id: request.id, updateData: updateDataForDao },\n loggedInUserId,\n );\n }\n\n /**\n * Validates icon and nickname. Can be overridden in subclasses for provider-specific validation.\n */\n protected validateIconAndNickName(\n updateData: IUpdateCapabilityIntegrationRequest['updateData'],\n loggedInUserId: bigint,\n ): void {\n // Validate nickname if present\n if (\n updateData.nickname !== undefined &&\n (updateData.nickname === '' || updateData.nickname.trim() === '')\n ) {\n this.logger.error(\n loggedInUserId,\n this.validateIconAndNickName.name,\n this.fileName,\n 'Validation failed: nickname cannot be empty or null',\n );\n throw new Error('Nickname cannot be empty');\n }\n\n // Validate iconName if icon is present\n if (\n updateData.icon &&\n updateData.icon.meta &&\n typeof updateData.icon.meta === 'object'\n ) {\n const meta = updateData.icon.meta as Record<string, unknown>;\n\n if (\n meta.iconName !== undefined &&\n (meta.iconName === null ||\n meta.iconName === '' ||\n (typeof meta.iconName === 'string' && meta.iconName.trim() === ''))\n ) {\n this.logger.error(\n loggedInUserId,\n this.validateIconAndNickName.name,\n this.fileName,\n 'Validation failed: iconName cannot be empty',\n );\n throw new Error('Icon name cannot be empty');\n }\n }\n }\n\n /**\n * Get capability integrations with pagination, filtering, sorting, and search.\n * Delegates to DAO for database operations.\n *\n * @param request - Request with projectId, category, and options\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to list of capability integrations with total count\n */\n async getCapabilityIntegrations(\n request: IGetCapabilityIntegrationsRequest,\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationsResponse> {\n return await this.integrationConfigurationDao.getCapabilityIntegrations(\n request,\n loggedInUserId,\n );\n }\n\n /**\n * Get capability integration by id or by fetchBy (configuredFor).\n * Same business logic as project-ms CapabilityIntegrationService.getCapabilityIntegration.\n */\n async getCapabilityIntegration(\n input: IGetCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<IGetCapabilityIntegrationResult> {\n if (!input.projectId) {\n throw new Error('Project ID is required');\n }\n\n await this.commonValidationDatabaseService.getProject({\n projectId: input.projectId,\n });\n\n let integration: IGetCapabilityIntegrationResult | undefined;\n\n if (input.id) {\n integration =\n await this.integrationConfigurationDao.getCapabilityIntegrationById(\n {\n id: input.id,\n projectId: input.projectId,\n category: input.category,\n },\n context.loggedInUserId,\n );\n } else if (input.fetchBy) {\n integration =\n await this.integrationConfigurationDao.getCapabilityIntegrationByProvider(\n {\n projectId: input.projectId,\n category: input.fetchBy.category ?? input.category,\n configuredForType: input.fetchBy.configuredForType,\n configuredForId: BigInt(input.fetchBy.configuredForId),\n },\n context.loggedInUserId,\n );\n }\n\n if (!integration) {\n throw new Error('Capability integration not found');\n }\n\n return integration;\n }\n}\n","import { IntegrationResourceManagementDao } from '../../../integration-common-utils/dao/integration-resource-management.dao';\nimport {\n IAddResourceToIntegrationInput,\n IAddResourceToIntegrationResponse,\n IRemoveResourceFromIntegrationRequest,\n IRemoveResourceFromIntegrationResponse,\n IUpdateOfferingIntegrationResourceConfigurationInput,\n IUpdateOfferingIntegrationResourceConfigurationResponse,\n} from '../../../integration-operation-skeletons/models/integration-resource-management.model';\nimport {\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\n/**\n * Base abstract class for integration resource management operations.\n * Holds only inter-service implementation (DAO calls). Validation (config, mapping exists)\n * lives in provider wrappers (e.g. TrybeIntegrationResourceManagementService).\n * MS is responsible for getOffering, getIntegration, updateOffering, runAfterAddIfNeeded.\n */\nexport abstract class BaseIntegrationResourceManagement {\n private readonly fileName = 'integration-resource-management.base';\n\n constructor(\n protected readonly integrationResourceManagementDao: IntegrationResourceManagementDao,\n protected readonly logger: LoggerService,\n ) {}\n\n /**\n * Adds a resource (capability integration) to an offering integration via UIF.\n * Inter-service implementation only: performs DAO insert. Wrapper must validate\n * config and mapping-exists before calling; caller (MS) does getOffering, getIntegration,\n * updateOffering and runAfterAddIfNeeded.\n *\n * @param input - projectId, offeringId, capabilityIntegrationId, optional config\n * @param context - GraphQL context\n * @returns Promise resolving to { status, ids }\n */\n async addResourceToIntegration(\n input: IAddResourceToIntegrationInput,\n context: GraphQLContext,\n ): Promise<IAddResourceToIntegrationResponse> {\n this.logger.info(\n context.loggedInUserId,\n this.addResourceToIntegration.name,\n this.fileName,\n 'addResourceToIntegration called',\n {\n offeringId: input.offeringId.toString(),\n capabilityIntegrationId: input.capabilityIntegrationId.toString(),\n },\n );\n\n const addResult =\n await this.integrationResourceManagementDao.addCapabilityIntegrationMapping(\n {\n projectId: input.projectId,\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n config: input.config,\n },\n context,\n );\n\n const result: IAddResourceToIntegrationResponse = {\n status: addResult.status,\n ids: addResult.ids,\n };\n\n this.logger.info(\n context.loggedInUserId,\n this.addResourceToIntegration.name,\n this.fileName,\n 'addResourceToIntegration completed',\n { status: result.status, idsCount: result.ids.length },\n );\n\n return result;\n }\n\n /**\n * Removes a resource from an offering integration.\n * Generic validation and DAO call; Trybe service adds mapping-exists check before calling.\n */\n async removeResourceFromIntegration(\n request: IRemoveResourceFromIntegrationRequest,\n context: GraphQLContext,\n ): Promise<IRemoveResourceFromIntegrationResponse> {\n const result =\n await this.integrationResourceManagementDao.removeCapabilityIntegrationMapping(\n {\n capabilityIntegrationId: request.capabilityIntegrationId,\n configuredForId: request.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context,\n );\n\n return { status: result.status };\n }\n\n /**\n * Updates offering integration resource configuration (cap_integ_resource_mapping.config by id).\n * Inter-service implementation only: performs DAO update. Wrapper must validate config before calling\n * (e.g. Trybe validates via validateResourceMappingConfig). Caller (MS) does getOffering,\n * getIntegration, and runAfterUpdateIfNeeded (e.g. handleTrybeIntegration).\n *\n * @param input - id (resource mapping row id), config\n * @param context - GraphQL context\n * @returns Promise resolving to { status }\n */\n async updateOfferingIntegrationResourceConfiguration(\n input: IUpdateOfferingIntegrationResourceConfigurationInput,\n context: GraphQLContext,\n ): Promise<IUpdateOfferingIntegrationResourceConfigurationResponse> {\n this.logger.info(\n context.loggedInUserId,\n this.updateOfferingIntegrationResourceConfiguration.name,\n this.fileName,\n 'updateOfferingIntegrationResourceConfiguration called',\n { id: input.id.toString() },\n );\n\n const result =\n await this.integrationResourceManagementDao.updateCapabilityIntegrationConfiguration(\n {\n id: input.id,\n config: input.config,\n },\n context,\n );\n\n this.logger.info(\n context.loggedInUserId,\n this.updateOfferingIntegrationResourceConfiguration.name,\n this.fileName,\n 'updateOfferingIntegrationResourceConfiguration completed',\n { status: result.status },\n );\n\n return { status: result.status };\n }\n}\n","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = value.constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'common';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: GeneratedColumnConfig<unknown> | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tgenerated: T['generated'] extends object ? T['generated'] : undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentityByDefault<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tgenerated: { as: any; type: TType };\n\t};\n};\n\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this>;\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'common' ? Column<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn : never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, TConfigMap[Key], TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n","import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport type { PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap,\n\textraConfig: ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig) | undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(columns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(columns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn table;\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[PgTable.Symbol.Name],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[PgTable.Symbol.Name],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[PgTable.Symbol.Name]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Update } from '~/utils.ts';\n\nimport type { SQL } from '~/index.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray(size?: number): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tgenerated: GeneratedColumnConfig<T['data']>;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport class PgArrayBuilder<\n\tT extends ColumnBuilderBaseConfig<'array', 'PgArray'>,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: PgColumnBuilder<TBase>;\n\t\tsize: number | undefined;\n\t},\n\t{\n\t\tbaseBuilder: PgColumnBuilder<TBase>;\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: number | undefined,\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName>, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName>, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'>,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T> {\n\treadonly size: number | undefined;\n\n\tstatic readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t\tgenerated: undefined;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: string, enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Gratitude to zod for the enum function types\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>> {\n\treturn pgEnumWithSchema(enumName, values, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t};\n\n\tconstructor(sql: SQL, selection: Record<string, unknown>, alias: string, isWith = false) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: selection as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic readonly [entityKind]: string = 'WithSubquery';\n}\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import { entityKind, is } from '~/entity.ts';\nimport type { SelectedFields } from '~/operations.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(chunk.name), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(chunk.name), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: SelectedFields<AnyColumn, Table>;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: SelectedFields<AnyColumn, Table>;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n","import {\n appConstants,\n MAX_RECORDS_LENGTH,\n schema,\n} from '@dv4resi/dvss-backend-module-datastore';\nimport { SORTING_ORDER_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/commons/common.enum';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport { CAPABILITY_INTEGRATION_STATUS_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability-integration.model';\nimport {\n type ICapability,\n CAPABILITY_TYPE_ENUM,\n type CAPABILITY_CATEGORY_ENUM,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability.model';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n and,\n asc,\n desc,\n eq,\n getTableColumns,\n isNotNull,\n isNull,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport type { MySqlColumn } from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\n\nimport type { ICapabilityIntegration } from '../../integration-operation-skeletons/models/capability-integration.model';\nimport type {\n IGetCapabilityIntegrationsRequest,\n IGetCapabilityIntegrationsResponse,\n} from '../../integration-operation-skeletons/models/integration-configuration.model';\nimport {\n IAddCapabilityIntegration,\n IAddCapIntegResourceMapping,\n IUpdateCapabilityIntegration,\n type IGetCapabilityIntegrationResult,\n} from './models';\n\n/**\n * DAO for integration-configuration persistence (offering get/update).\n * Performs actual DB calls using datastore schema; conn is injected by the host app.\n */\n@Injectable()\nexport class IntegrationConfigurationDao {\n private readonly fileName = 'integration-configuration.dao';\n\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n private readonly conn: MySql2Database<typeof schema>,\n private readonly logger: LoggerService,\n ) {}\n\n async addCapabilityIntegration(\n input: IAddCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<{ id: bigint } | undefined> {\n // Log the attempt to add a capability integration\n this.logger.info(\n loggedInUserId,\n this.addCapabilityIntegration.name,\n this.fileName,\n `CapabilityDaoService -> addCapabilityIntegration called`,\n );\n\n try {\n // Run operations in a transaction\n return this.conn.transaction(async (tx) => {\n // Insert the capability integration record and get its ID\n const [integrationResult] = await tx\n .insert(schema.capabilityIntegration)\n .values(input)\n .$returningId();\n\n if (!integrationResult.id) {\n // rollback if insertion failed\n tx.rollback();\n return;\n }\n\n // Add mapping if configuredFor is provided\n if (input.configuredFor) {\n const insertData: IAddCapIntegResourceMapping = {\n capabilityIntegrationId: integrationResult.id,\n configuredForId: input.configuredFor.configuredForId,\n configuredForType: input.configuredFor.configuredForType,\n status: CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n projectId: input.projectId,\n createdAt: new Date(),\n createdBy: loggedInUserId,\n };\n\n await tx.insert(schema.capIntegResourceMapping).values(insertData);\n }\n\n return { id: integrationResult.id };\n });\n } catch (error) {\n // Log and rethrow\n this.logger.error(\n loggedInUserId,\n this.addCapabilityIntegration.name,\n this.fileName,\n 'Error in addCapabilityIntegration',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability by id (for add-capability-integration validation).\n * Copied from project-ms CapabilityDaoService.getCapability.\n */\n async getCapability(\n request: { capabilityId: bigint },\n loggedInUserId: bigint,\n ): Promise<ICapability | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapability.name,\n this.fileName,\n 'getCapability called',\n { request },\n );\n\n return await this.conn.query.capability.findFirst({\n where: and(\n eq(schema.capability.id, request.capabilityId),\n isNull(schema.capability.deletedAt),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapability.name,\n this.fileName,\n 'Error on getCapability',\n error,\n { request },\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability provider by id (for add-capability-integration validation).\n * Copied from project-ms CapabilityProviderDao.getCapabilityProvider.\n */\n async getCapabilityProvider(\n request: { capabilityProviderId: bigint },\n loggedInUserId: bigint,\n ): Promise<typeof schema.capabilityProvider.$inferSelect | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityProvider.name,\n this.fileName,\n 'getCapabilityProvider called',\n { request },\n );\n\n return await this.conn.query.capabilityProvider.findFirst({\n where: and(\n eq(schema.capabilityProvider.id, request.capabilityProviderId),\n isNull(schema.capabilityProvider.deletedAt),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityProvider.name,\n this.fileName,\n 'Error on getCapabilityProvider',\n error,\n { request },\n );\n\n throw error;\n }\n }\n\n /**\n * Updates capability integration in the database.\n * Copied from project-ms CapabilityIntegrationDao.updateCapabilityIntegration.\n *\n * @param input - Object containing the integration ID and update data\n * @param loggedInUserId - User ID for logging\n * @returns Promise that resolves to the update operation status\n */\n async updateCapabilityIntegration(\n input: {\n id: bigint;\n updateData: IUpdateCapabilityIntegration;\n },\n loggedInUserId: bigint,\n ): Promise<{ status: boolean }> {\n try {\n this.logger.info(\n loggedInUserId,\n this.updateCapabilityIntegration.name,\n this.fileName,\n 'Updating capability integration',\n );\n\n const response = await this.conn\n .update(schema.capabilityIntegration)\n .set({\n ...input.updateData,\n })\n .where(eq(schema.capabilityIntegration.id, input.id));\n\n return {\n status: response[0].affectedRows > 0,\n };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.updateCapabilityIntegration.name,\n this.fileName,\n 'Error updating capability integration',\n error,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability integration by id (for parent validation when parentId is set).\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegration.\n */\n async getCapabilityIntegration(\n input: { capabilityIntegrationId: bigint },\n loggedInUserId: bigint,\n ): Promise<typeof schema.capabilityIntegration.$inferSelect | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegration.name,\n this.fileName,\n 'getCapabilityIntegration called',\n input,\n );\n\n return await this.conn.query.capabilityIntegration.findFirst({\n where: and(\n isNull(schema.capabilityIntegration.deletedAt),\n eq(schema.capabilityIntegration.id, input.capabilityIntegrationId),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegration.name,\n this.fileName,\n 'Error on getCapabilityIntegration',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Retrieves capability integration by ID with resource mapping details.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrationById.\n */\n async getCapabilityIntegrationById(\n request: {\n id: bigint;\n projectId: number;\n category?: CAPABILITY_CATEGORY_ENUM;\n },\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationResult | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationById.name,\n this.fileName,\n 'getCapabilityIntegrationById called',\n request,\n );\n\n const conditions = [\n eq(schema.capabilityIntegration.id, request.id),\n eq(schema.capabilityIntegration.projectId, request.projectId),\n eq(schema.capabilityIntegration.type, CAPABILITY_TYPE_ENUM.INTEGRATION),\n eq(\n schema.capabilityIntegration.status,\n CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n ),\n isNull(schema.capabilityIntegration.deletedAt),\n isNull(schema.capability.deletedAt),\n ];\n\n if (request.category) {\n conditions.push(\n eq(schema.capabilityIntegration.category, request.category),\n );\n }\n\n const response = await this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n resourceMappingId: schema.capIntegResourceMapping.id,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n resourceMappingConfig: schema.capIntegResourceMapping.config,\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .innerJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n .leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(schema.capIntegResourceMapping.projectId, request.projectId),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .where(and(...conditions));\n\n return response[0] as unknown as\n | IGetCapabilityIntegrationResult\n | undefined;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationById.name,\n this.fileName,\n 'Error on getCapabilityIntegrationById',\n error,\n request,\n );\n\n throw error;\n }\n }\n\n /**\n * Retrieves capability integration by provider type and resource mapping.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrationByProvider.\n */\n async getCapabilityIntegrationByProvider(\n request: {\n projectId: number;\n category?: CAPABILITY_CATEGORY_ENUM;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n configuredForId: bigint;\n },\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationResult | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationByProvider.name,\n this.fileName,\n 'getCapabilityIntegrationByProvider called',\n request,\n );\n\n const conditions = [\n isNull(schema.capability.deletedAt),\n eq(schema.capabilityIntegration.projectId, request.projectId),\n eq(schema.capabilityIntegration.type, CAPABILITY_TYPE_ENUM.INTEGRATION),\n eq(\n schema.capabilityIntegration.status,\n CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n ),\n isNull(schema.capabilityIntegration.deletedAt),\n eq(schema.capIntegResourceMapping.projectId, request.projectId),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n request.configuredForType,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n request.configuredForId,\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ];\n\n if (request.category) {\n conditions.push(\n eq(schema.capabilityIntegration.category, request.category),\n );\n }\n\n const response = await this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n resourceMappingId: schema.capIntegResourceMapping.id,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n resourceMappingConfig: schema.capIntegResourceMapping.config,\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .innerJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n .innerJoin(\n schema.capIntegResourceMapping,\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n )\n .where(and(...conditions));\n\n return response[0] as unknown as\n | IGetCapabilityIntegrationResult\n | undefined;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationByProvider.name,\n this.fileName,\n 'Error on getCapabilityIntegrationByProvider',\n error,\n request,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability integrations with pagination, filtering, sorting, and search.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrations.\n */\n async getCapabilityIntegrations(\n input: IGetCapabilityIntegrationsRequest,\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationsResponse> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrations.name,\n this.fileName,\n 'getCapabilityIntegrations called',\n input,\n );\n\n const count = input.options?.count ?? MAX_RECORDS_LENGTH;\n const offset = ((input.options?.page ?? 1) - 1) * count;\n\n const sorting = input.options?.sorting;\n let sortBy: MySqlColumn = schema.capabilityIntegration.id;\n\n if (sorting?.by === 'CREATED_AT') {\n sortBy = schema.capabilityIntegration.createdAt;\n } else if (sorting?.by === 'UPDATED_AT') {\n sortBy = schema.capabilityIntegration.updatedAt;\n }\n\n const sortOrder: SQL =\n sorting?.order === SORTING_ORDER_ENUM.ASC ? asc(sortBy) : desc(sortBy);\n const searchTerm = input.options?.search;\n\n // Determine if we need capability table join (for search, provider filter)\n const shouldJoinCapability =\n Boolean(searchTerm) ||\n Boolean(\n input.options?.filters?.some(\n (filter) => filter.by === 'PROVIDER_INTEGRATION_TYPE',\n ),\n );\n\n // Build where conditions for data query\n const whereConditions: SQL[] = [\n eq(schema.capabilityIntegration.projectId, input.projectId),\n isNull(schema.capabilityIntegration.deletedAt),\n ];\n\n if (input.category) {\n whereConditions.push(\n eq(\n schema.capabilityIntegration.category,\n input.category as CAPABILITY_CATEGORY_ENUM,\n ),\n );\n }\n\n // Apply filters\n if (input.options?.filters && input.options.filters.length > 0) {\n this.applyFilters(whereConditions, input.options);\n }\n\n if (searchTerm) {\n const searchPattern = `%${searchTerm}%`;\n whereConditions.push(\n sql`(${schema.capabilityIntegration.nickname} LIKE ${searchPattern} OR ${schema.capability.name} LIKE ${searchPattern})`,\n );\n }\n\n // Add capability deletedAt check if capability join is present\n if (shouldJoinCapability) {\n whereConditions.push(isNull(schema.capability.deletedAt));\n }\n\n // Filter out NULL mappings when propertyId is provided\n if (input.propertyId) {\n whereConditions.push(isNotNull(schema.capIntegResourceMapping.id));\n }\n\n // Build count query\n const countWhereConditions: SQL[] = [\n eq(schema.capabilityIntegration.projectId, input.projectId),\n isNull(schema.capabilityIntegration.deletedAt),\n ];\n\n if (input.category) {\n countWhereConditions.push(\n eq(\n schema.capabilityIntegration.category,\n input.category as CAPABILITY_CATEGORY_ENUM,\n ),\n );\n }\n\n if (input.options?.filters && input.options.filters.length > 0) {\n this.applyFilters(countWhereConditions, input.options);\n }\n\n if (searchTerm) {\n const searchPattern = `%${searchTerm}%`;\n countWhereConditions.push(\n sql`(${schema.capabilityIntegration.nickname} LIKE ${searchPattern} OR ${schema.capability.name} LIKE ${searchPattern})`,\n );\n }\n\n const countQueryBuilder = this.conn\n .select({\n count: sql`count(distinct ${schema.capabilityIntegration.id})`.as(\n 'count',\n ),\n })\n .from(schema.capabilityIntegration);\n\n const countQueryWithJoins = shouldJoinCapability\n ? countQueryBuilder.leftJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n : countQueryBuilder;\n\n if (shouldJoinCapability) {\n countWhereConditions.push(isNull(schema.capability.deletedAt));\n }\n\n const countQueryWithPropertyJoin = input.propertyId\n ? countQueryWithJoins.leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n CONFIGURED_FOR_TYPE_ENUM.PROPERTY,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n BigInt(input.propertyId),\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n : countQueryWithJoins;\n\n if (input.propertyId) {\n countWhereConditions.push(isNotNull(schema.capIntegResourceMapping.id));\n }\n\n const countQuery = countQueryWithPropertyJoin.where(\n and(...countWhereConditions),\n );\n\n // Build data query\n const baseQuery = this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .leftJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n );\n\n const finalQuery = input.propertyId\n ? baseQuery\n .leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n CONFIGURED_FOR_TYPE_ENUM.PROPERTY,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n BigInt(input.propertyId),\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .where(and(...whereConditions))\n : baseQuery.where(and(...whereConditions));\n\n // Execute queries in parallel\n const [{ count: totalCount }, records] = await Promise.all([\n countQuery.execute().then((result) => result[0]),\n finalQuery.limit(count).offset(offset).orderBy(sortOrder).execute(),\n ]);\n\n return {\n totalCount: Number(totalCount) || 0,\n records: records as unknown as ICapabilityIntegration[],\n };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrations.name,\n this.fileName,\n 'Error in getCapabilityIntegrations',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Applies filters to where conditions.\n */\n private applyFilters(\n whereConditions: SQL[],\n filters: IGetCapabilityIntegrationsRequest['options'] | undefined,\n ): void {\n if (!filters || !filters.filters) {\n return;\n }\n\n for (const filter of filters.filters) {\n const filterValues = filter.values;\n\n if (!filterValues || filterValues.length === 0) {\n continue;\n }\n\n switch (filter.by) {\n case 'PROVIDER_INTEGRATION_TYPE': {\n const valuePlaceholders = filterValues.map(\n (value) => sql`${String(value)}`,\n );\n const joinedValues = sql.join(valuePlaceholders, sql`, `);\n whereConditions.push(\n sql`${schema.capability.providerIntegrationType} IN (${joinedValues})`,\n );\n break;\n }\n\n case 'CAPABILITY_INTEGRATION_TYPE': {\n const parentConditions: SQL[] = [];\n\n for (const value of filterValues) {\n const upperValue = String(value).toUpperCase();\n\n if (upperValue === 'PARENT') {\n parentConditions.push(\n isNull(schema.capabilityIntegration.parentId),\n );\n } else if (upperValue === 'CHILD') {\n parentConditions.push(\n isNotNull(schema.capabilityIntegration.parentId),\n );\n }\n }\n\n if (parentConditions.length === 1) {\n whereConditions.push(parentConditions[0]);\n } else if (parentConditions.length > 1) {\n const orCondition = or(...parentConditions);\n\n if (orCondition) {\n whereConditions.push(orCondition);\n }\n }\n break;\n }\n }\n }\n }\n}\n","import { appConstants, schema } from '@dv4resi/dvss-backend-module-datastore';\nimport { Inject, Injectable } from '@nestjs/common';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\n\n/**\n * DAO for integration user-management persistence.\n * Performs actual DB calls using datastore schema; conn is injected by the host app.\n */\n@Injectable()\nexport class IntegrationUserManagementDao {\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n protected readonly conn: MySql2Database<typeof schema>,\n ) {}\n}\n","import { appConstants, schema } from '@dv4resi/dvss-backend-module-datastore';\nimport type { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport { CAPABILITY_INTEGRATION_STATUS_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability-integration.model';\nimport {\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { and, eq, isNull } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport {\n IAddCapabilityIntegrationMappingResponse,\n ICapabilityIntegrationResourceMappingRow,\n IDeleteAPIResponse,\n IUpdateAPIResponse,\n} from './models';\n\n/**\n * DAO for integration resource management (cap_integ_resource_mapping).\n * Provides checkMappingExists and removeCapabilityIntegrationMapping so UIF/callers\n * can validate and remove capability integration mappings without inter-service calls.\n */\n@Injectable()\nexport class IntegrationResourceManagementDao {\n private readonly fileName = 'integration-resource-management.dao';\n\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n private readonly conn: MySql2Database<typeof schema>,\n private readonly logger: LoggerService,\n ) {}\n\n /**\n * Adds a capability integration resource mapping (insert into cap_integ_resource_mapping).\n * Replaces inter-service gRPC call to project-onboarding-ms for add configurations.\n *\n * @param input - projectId, capabilityIntegrationId, configuredForId, configuredForType, optional config\n * @param context - GraphQL context for loggedInUserId\n * @returns Promise resolving to { status: true, ids: [insertedId] } or { status: false, ids: [] }\n */\n async addCapabilityIntegrationMapping(\n input: {\n projectId: number;\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n config?: Record<string, unknown>;\n },\n context: GraphQLContext,\n ): Promise<IAddCapabilityIntegrationMappingResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n 'Adding capability integration mapping',\n input,\n );\n\n const insertResult = await this.conn\n .insert(schema.capIntegResourceMapping)\n .values({\n projectId: input.projectId,\n status: CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.configuredForId,\n configuredForType: input.configuredForType,\n config: input.config ?? null,\n createdBy: context.loggedInUserId,\n });\n\n const raw = insertResult as unknown as { insertId?: number | string }[];\n const insertedId = raw[0]?.insertId != null ? Number(raw[0].insertId) : 0;\n const isInserted = insertedId > 0;\n const ids = isInserted ? [BigInt(insertedId)] : [];\n\n this.logger.info(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n `Mapping add ${isInserted ? 'successful' : 'failed'}`,\n { insertedId, status: isInserted },\n );\n\n return { status: isInserted, ids };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n 'Error adding capability integration mapping',\n error,\n input,\n );\n throw error;\n }\n }\n\n /**\n * Checks if a capability integration resource mapping exists.\n * Validates that the mapping exists for the given capability integration, configured for ID and type.\n *\n * @param input - Input containing capability integration ID, configured for ID and type\n * @param loggedInUserId - ID of the user performing the operation\n * @returns Promise that resolves to true if mapping exists, false otherwise\n */\n async checkMappingExists(\n input: {\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n },\n loggedInUserId: bigint,\n ): Promise<boolean> {\n try {\n this.logger.info(\n loggedInUserId,\n this.checkMappingExists.name,\n this.fileName,\n `${this.checkMappingExists.name} called`,\n input,\n );\n\n const response = await this.conn\n .select({ id: schema.capIntegResourceMapping.id })\n .from(schema.capIntegResourceMapping)\n .where(\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n input.capabilityIntegrationId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n input.configuredForId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n input.configuredForType,\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .limit(1);\n\n return response.length > 0;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.checkMappingExists.name,\n this.fileName,\n 'Error in checkMappingExists',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Removes capability integration resource mapping (soft delete).\n * Sets deletedAt and deletedBy on the matching cap_integ_resource_mapping row.\n * Use this from UIF/callers instead of inter-service call to project-onboarding-ms.\n *\n * @param input - Delete parameters including capability integration ID, configured for ID and type\n * @param loggedInUserId - ID of the user performing the operation\n * @returns Promise resolving to { status: true } if any row was updated, { status: false } otherwise\n */\n async removeCapabilityIntegrationMapping(\n input: {\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n },\n context: GraphQLContext,\n ): Promise<IDeleteAPIResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n 'Removing capability integration mapping',\n input,\n );\n\n // Build where conditions for the delete operation - match on capability_integration_id, configured_for_id, and configured_for_type\n const whereConditions = [\n isNull(schema.capIntegResourceMapping.deletedAt),\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n input.capabilityIntegrationId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n input.configuredForId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n input.configuredForType,\n ),\n ];\n\n // Perform soft delete\n const deleteResult = await this.conn\n .update(schema.capIntegResourceMapping)\n .set({\n deletedAt: new Date(),\n deletedBy: context.loggedInUserId,\n })\n .where(and(...whereConditions));\n\n const isSuccess = deleteResult[0].affectedRows > 0;\n\n this.logger.info(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n `Mapping removal ${isSuccess ? 'successful' : 'failed - no matching records'}`,\n { affectedRows: deleteResult[0].affectedRows },\n );\n\n return { status: isSuccess };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n 'Error removing capability integration mapping',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Gets a capability integration resource mapping by id (non-deleted only).\n * Use from UIF wrappers to validate mapping exists before update.\n *\n * @param id - cap_integ_resource_mapping.id\n * @param loggedInUserId - for logging\n * @returns The mapping row or undefined if not found\n */\n async getCapabilityIntegrationResourceMappingById(\n id: bigint,\n loggedInUserId: bigint,\n ): Promise<ICapabilityIntegrationResourceMappingRow | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationResourceMappingById.name,\n this.fileName,\n `${this.getCapabilityIntegrationResourceMappingById.name} called`,\n { id: id.toString() },\n );\n\n const rows = await this.conn\n .select({\n id: schema.capIntegResourceMapping.id,\n capabilityIntegrationId:\n schema.capIntegResourceMapping.capabilityIntegrationId,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n })\n .from(schema.capIntegResourceMapping)\n .where(\n and(\n eq(schema.capIntegResourceMapping.id, id),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .limit(1);\n\n return rows[0];\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationResourceMappingById.name,\n this.fileName,\n 'Error in getCapabilityIntegrationResourceMappingById',\n error,\n { id: id.toString() },\n );\n throw error;\n }\n }\n\n /**\n * Updates capability integration resource mapping config by id.\n * Replaces inter-service gRPC call to project-onboarding-ms for update capability integration configuration.\n *\n * @param input - id (mapping row id), config (new config JSON)\n * @param context - GraphQL context for loggedInUserId\n * @returns Promise resolving to { status: true } if row was updated, { status: false } otherwise\n */\n async updateCapabilityIntegrationConfiguration(\n input: {\n id: bigint;\n config: Record<string, unknown>;\n },\n context: GraphQLContext,\n ): Promise<IUpdateAPIResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n 'Updating capability integration resource mapping config',\n { id: input.id.toString() },\n );\n\n const updateResult = await this.conn\n .update(schema.capIntegResourceMapping)\n .set({\n config: input.config,\n updatedBy: context.loggedInUserId,\n })\n .where(\n and(\n eq(schema.capIntegResourceMapping.id, input.id),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n );\n\n const isSuccess = updateResult[0].affectedRows > 0;\n\n this.logger.info(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n `Mapping config update ${isSuccess ? 'successful' : 'failed - no matching records'}`,\n { affectedRows: updateResult[0].affectedRows },\n );\n\n return { status: isSuccess };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n 'Error updating capability integration resource mapping config',\n error,\n input,\n );\n\n throw error;\n }\n }\n}\n","/**\n * Trybe implementation for wellness customer management operations\n * Provides concrete implementation of customer management functionality\n * for Trybe wellness systems\n *\n * This class extends the base customer management operations with\n * Trybe-specific implementations\n */\nimport { Injectable } from '@nestjs/common';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseCustomerManagement,\n HTTP_METHOD,\n IAddCustomerRequest,\n IAddUpdateCustomerResponseData,\n IDeleteAPIResponse,\n IGetCustomerRequest,\n IUpdateCustomerRequest,\n IValidatedCapabilityIntegration,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport {\n ITrybeCustomer,\n ITrybeCustomerResponse,\n ITrybeGetCustomerByEmailResponse,\n} from '../../models';\n\n@Injectable()\nexport class TrybeCustomerManagement implements BaseCustomerManagement {\n private readonly fileName = 'customer-management.service';\n\n /**\n * Creates an instance of the service\n */\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n ) {}\n\n /**\n * Create a new customer on Trybe (POST /customers/customers).\n *\n * @returns Promise resolving to the created customer\n */\n async createCustomer(\n request: IAddCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCustomer> {\n this.logger.info(\n loggedInUserId,\n this.createCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.createCustomer.name} Called`,\n { request },\n );\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeCustomerResponse,\n IAddCustomerRequest\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: '/customers/customers',\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n body: request,\n },\n integration,\n loggedInUserId,\n );\n\n return response.data as ITrybeCustomer;\n }\n\n /**\n * Abstract method to search for wellness customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n async searchCustomer(\n request: IGetCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCustomer | undefined> {\n this.logger.info(\n loggedInUserId,\n this.searchCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.searchCustomer.name} Called`,\n { request },\n );\n\n if (!request.email && !request.customerId) {\n throw new Error(\n 'Either email or customerId is required to get a customer from Trybe',\n );\n }\n\n if (request.customerId) {\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeCustomerResponse,\n string\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/customers/customers/${request.customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n if (!response.data) {\n return undefined;\n }\n\n return response.data;\n }\n\n if (request.email) {\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCustomerByEmailResponse,\n string\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/customers/customers/?email=${request.email}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n if (!response.data || response.data.length === 0) {\n return undefined;\n }\n\n return response.data[0];\n }\n }\n\n /**\n * Update an existing customer on Trybe (PUT /customers/customers/:id), then fetch and return full customer.\n *\n * @returns Promise resolving to the updated customer\n */\n async updateCustomer(\n customerId: string,\n request: IUpdateCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddUpdateCustomerResponseData> {\n this.logger.info(\n loggedInUserId,\n this.updateCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.updateCustomer.name} Called`,\n { customerId, request },\n );\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n { data?: IAddUpdateCustomerResponseData },\n IUpdateCustomerRequest\n >(\n {\n apiMethod: HTTP_METHOD.PUT,\n url: `/customers/customers/${customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n body: request,\n },\n integration,\n loggedInUserId,\n );\n\n return response.data as IAddUpdateCustomerResponseData;\n }\n\n /**\n * Delete a customer on Trybe.\n */\n async deleteCustomer(\n customerId: string,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IDeleteAPIResponse> {\n try {\n this.logger.info(\n loggedInUserId,\n this.deleteCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.deleteCustomer.name} Called`,\n { customerId },\n );\n\n await this.trafficGatewayService.executeIntegrationRequest<void, string>(\n {\n apiMethod: HTTP_METHOD.DELETE,\n url: `/customers/customers/${customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n return { status: true };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.deleteCustomer.name,\n this.fileName,\n 'Error in deleting customer on Trybe',\n error,\n );\n\n throw error;\n }\n }\n}\n","export function isValidHttpUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n BaseAuth,\n ICapabilityIntegration,\n IValidatedCapabilityIntegration,\n} from '@dvss/dvss-integration-libs';\nimport { TrybeCustomerManagement } from '../customer-management/customer-management.service';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { isValidHttpUrl } from '../../utils/url.utils';\n\n@Injectable()\nexport class TrybeAuthService implements BaseAuth {\n private readonly fileName = 'auth.service';\n\n /**\n * Creates an instance of the Trybe authentication service\n */\n constructor(\n private readonly trybeCustomerManagement: TrybeCustomerManagement,\n private readonly logger: LoggerService,\n ) {}\n\n /**\n * Validates Trybe integration configuration\n * Checks for required fields: apiKey, siteId, organisationId, and baseUrl\n *\n * @param config - Integration configuration object\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to validated configuration\n * @throws Error if config is invalid\n */\n validateConfig(\n integration: Omit<ICapabilityIntegration, 'id'>,\n loggedInUserId: bigint,\n ): IValidatedCapabilityIntegration {\n this.logger.info(\n loggedInUserId,\n this.validateConfig.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.validateConfig.name} Called`,\n { integration },\n );\n\n if (!integration.config) {\n throw new Error('Integration configuration is missing');\n }\n\n const { config } = integration;\n\n const integrationConfig = config.integrationConfig || {};\n const platformConfig = config.platformConfig || {};\n\n if (Object.keys(integrationConfig).length > 0) {\n if (!integrationConfig.apiKey) {\n throw new Error(\n 'Integration configuration is invalid: API Key not found',\n );\n } else if (!integrationConfig.siteId) {\n throw new Error(\n 'Integration configuration is invalid: Site ID not found',\n );\n } else if (!integrationConfig.organisationId) {\n throw new Error(\n 'Integration configuration is invalid: Organisation ID not found',\n );\n }\n } else {\n throw new Error(\n 'Integration configuration is invalid: Integration config is empty',\n );\n }\n\n if (Object.keys(platformConfig).length > 0) {\n if (!platformConfig.baseUrl) {\n throw new Error(\n 'Platform configuration is invalid: Base URL not found',\n );\n }\n\n if (!isValidHttpUrl(platformConfig.baseUrl)) {\n throw new Error(\n 'Platform configuration is invalid: Base URL is not a valid URL',\n );\n }\n } else {\n throw new Error(\n 'Platform configuration is invalid: Platform config is empty',\n );\n }\n\n const headers: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Authorization: `Bearer ${integrationConfig.apiKey}`,\n };\n\n return {\n ...integration,\n headers,\n } as IValidatedCapabilityIntegration;\n }\n\n /**\n * Tests Trybe integration by making a test API call\n * Uses a test customer lookup to verify credentials are valid\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when test is completed\n * @throws Error if authentication fails or API call fails\n */\n async testIntegration(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<boolean> {\n this.logger.info(\n loggedInUserId,\n this.testIntegration.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.testIntegration.name} Called`,\n { integration },\n );\n\n // Validate config\n const validatedIntegration = this.validateConfig(\n integration,\n loggedInUserId,\n );\n\n // Perform test API call using traffic gateway\n await this.trybeCustomerManagement.searchCustomer(\n {\n email: 'test@integration.test',\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.testIntegration.name,\n this.fileName,\n 'Trybe integration test successful. The credentials are valid.',\n );\n\n return true;\n }\n\n /**\n * Fetches an access token from the Trybe integration provider.\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to the access token string\n */\n fetchAccessToken(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<string> {\n this.logger.info(\n loggedInUserId,\n this.fetchAccessToken.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.fetchAccessToken.name} Called`,\n { integration },\n );\n\n throw new Error('Method not implemented.');\n }\n}\n","import {\n type ICredit,\n CREDIT_STATUS_ENUM,\n CREDIT_TYPE_ENUM,\n IValidatedCapabilityIntegration,\n} from '@dvss/dvss-integration-libs';\nimport type {\n ITrybeCredit,\n ITrybeGetCustomerCreditsResponse,\n} from '../../models';\nimport { ISystemResponse } from '@dvss/dvss-integration-libs';\n\nfunction mapStatus(t: ITrybeCredit): CREDIT_STATUS_ENUM {\n if (t.redeemed_at) return CREDIT_STATUS_ENUM.REDEEMED;\n if (t.revoked_at) return CREDIT_STATUS_ENUM.REVOKED;\n if (t.expires_at && new Date(t.expires_at) < new Date())\n return CREDIT_STATUS_ENUM.EXPIRED;\n return CREDIT_STATUS_ENUM.ACTIVE;\n}\n\n/**\n * Groups Trybe credits by (coupon_name, issued_at), then maps each group to one ICredit.\n * Within a group, only coupon_code can differ; all codes are in meta.integrationDetails.couponCodes.\n * value is set to the first coupon code.\n */\nexport function mapTrybeCreditsToSystem(\n res: ITrybeGetCustomerCreditsResponse,\n integration: IValidatedCapabilityIntegration,\n): ISystemResponse<ICredit> {\n const groups = new Map<string, ITrybeCredit[]>();\n for (const t of res.data) {\n const key = `${t.coupon_name}|${t.expires_at?.split('T')[0]}`;\n const list = groups.get(key) ?? [];\n list.push(t);\n groups.set(key, list);\n }\n\n const records: ICredit[] = [];\n let index = 0;\n for (const [, items] of groups) {\n const first = items[0];\n const couponCodes = items.map((i) => i.coupon_code);\n records.push({\n id: BigInt(index + 1),\n capabilityIntegrationId: integration.id,\n projectId: integration.projectId,\n name: first.coupon_name,\n description: first.coupon_description ?? undefined,\n type: CREDIT_TYPE_ENUM.COUPON,\n status: mapStatus(first),\n externalId: first.id,\n expiresAt: first.expires_at ? new Date(first.expires_at) : undefined,\n expiresDate: first.expires_at?.split('T')[0],\n startsAt: new Date(first.issued_at),\n startDate: first.issued_at.split('T')[0],\n value: first.coupon_code,\n quantity: couponCodes.length,\n meta: {\n integrationDetails: {\n customerId: first.customer_id,\n membershipId: first.membership_id,\n multiUse: first.multi_use === 1,\n couponCodes,\n redeemedAt: first.redeemed_at,\n revokedAt: first.revoked_at,\n },\n },\n });\n index++;\n }\n\n return {\n totalCount: records.length,\n records,\n };\n}\n","/**\n * Trybe implementation for credit booking operations\n * Provides concrete implementation of credit booking functionality\n * for Trybe systems\n *\n * This class extends the base credit booking operations with\n * Trybe-specific implementations\n */\nimport {\n BaseCreditBooking,\n CREDIT_FILTER_BY_ENUM,\n CREDIT_STATUS_ENUM,\n HTTP_METHOD,\n ICapabilityIntegration,\n ICredit,\n IGetCustomerCreditsRequest,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\nimport type { ITrybeGetCustomerCreditsResponse } from '../../models';\nimport { mapTrybeCreditsToSystem } from './credit-booking.mapper';\nimport { TrybeAuthService } from '../auth/auth.service';\nimport { ISystemResponse } from '@dvss/dvss-integration-libs';\n\n@Injectable()\nexport class TrybeCreditBooking implements BaseCreditBooking {\n private readonly fileName = 'credit-booking.service';\n\n /**\n * Creates an instance of the service\n */\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n private readonly trybeAuthService: TrybeAuthService,\n ) {}\n\n /**\n * Fetches customer credits from Trybe and returns system-format response\n *\n * @returns Promise resolving to the system customer credits response\n */\n async fetchCustomerCredits(\n request: IGetCustomerCreditsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<ICredit>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCustomerCredits.name,\n this.fileName,\n `${TrybeCreditBooking.name} -> ${this.fetchCustomerCredits.name} Called`,\n { request },\n );\n\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const query = new URLSearchParams();\n const opts = request.options;\n\n if (opts?.page != null) query.set('page', String(opts.page));\n if (opts?.count != null) query.set('per_page', String(opts.count));\n\n const statusFilterValues =\n opts?.filters?.[0]?.by === CREDIT_FILTER_BY_ENUM.STATUS\n ? opts.filters[0].values\n : [];\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.EXPIRED)) {\n query.set('expired', 'true');\n } else {\n query.set('expired', 'false');\n }\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.REDEEMED)) {\n query.set('redeemed', 'true');\n } else {\n query.set('redeemed', 'false');\n }\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.REVOKED)) {\n query.set('revoked', 'true');\n } else {\n query.set('revoked', 'false');\n }\n\n const queryString = query.toString();\n const url =\n `/customers/customers/${request.customerId}/credits` +\n (queryString ? `?${queryString}` : '');\n\n const raw: ITrybeGetCustomerCreditsResponse =\n await this.trafficGatewayService.executeIntegrationRequest<ITrybeGetCustomerCreditsResponse>(\n {\n apiMethod: HTTP_METHOD.GET,\n url,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n return mapTrybeCreditsToSystem(raw, validatedIntegration);\n }\n}\n","/**\n * Format date for Trybe API (start or end of day with timezone)\n */\nexport function formatDateForTrybe(date: Date, isStartOfDay: boolean): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = isStartOfDay ? '00' : '23';\n const minutes = isStartOfDay ? '00' : '59';\n const seconds = isStartOfDay ? '00' : '59';\n\n // Fixed timezone offset: -05:00\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}-05:00`;\n}\n\n/**\n * Extract time from ISO string (e.g. '2026-09-23T08:30:00-04:00' -> '08:30')\n */\nexport function extractTimeFromIsoString(isoString: string): string {\n const timeMatch = isoString.match(/T(\\d{2}:\\d{2})/);\n return timeMatch ? timeMatch[1] : '';\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replaceAll(/_([a-z])/g, (_, letter: string) =>\n letter.toUpperCase(),\n );\n}\n\n/**\n * Recursively convert object keys from snake_case to camelCase\n */\nexport function convertKeysToCamelCase(object: unknown): unknown {\n if (object === null || object === undefined) {\n return object;\n }\n if (Array.isArray(object)) {\n return object.map((item) => convertKeysToCamelCase(item));\n }\n if (typeof object === 'object') {\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n converted[snakeToCamel(key)] = convertKeysToCamelCase(value);\n }\n return converted;\n }\n return object;\n}\n","export const fetchAllPages = async <\n T,\n TResponse extends { data: T[]; meta: { last_page: number } },\n>(\n firstPageResponse: TResponse,\n shouldFetchAll: boolean,\n fetchPage: (page: number) => Promise<TResponse>,\n): Promise<T[]> => {\n const items: T[] = [];\n items.push(...firstPageResponse.data);\n\n if (!shouldFetchAll) {\n return items;\n }\n\n const lastPage = firstPageResponse.meta.last_page;\n\n for (let page = 2; page <= lastPage; page += 1) {\n const pageResponse = await fetchPage(page);\n items.push(...pageResponse.data);\n }\n\n return items;\n};\n","import {\n ICreateOrderResponse,\n IGetOrderResponse,\n} from '@dvss/dvss-integration-libs';\nimport { type IGetTrybeResourcesCommonResponse } from './trybe-common.model';\n\nexport interface ITrybeImage {\n id: string;\n file_name: string;\n mime_type: string;\n size: number;\n url: string;\n original_url: string;\n}\n\nexport interface ITrybeMeta {\n title: string;\n description: string;\n}\n\nexport interface ITrybePriceRule {\n id: string;\n price: number;\n weekdays?: string[];\n date_from: string;\n date_to: string;\n time_from?: string;\n time_to?: string;\n}\n\nexport interface ITrybeCategory {\n id: string;\n name: string;\n voucher_applicable: unknown;\n}\n\nexport type ITrybeGetCategoriesResponse =\n IGetTrybeResourcesCommonResponse<ITrybeCategory>;\n\nexport interface ITrybeAppointmentPriceRule extends ITrybePriceRule {\n appointment_type_id: string;\n}\n\nexport interface ITrybeAppointment {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n image?: ITrybeImage;\n site_ids: string[];\n room_ids: string[];\n equipment_ids: unknown[];\n practitioner_ids: string[];\n category_ids: string[];\n durations: number[];\n end_buffer: number;\n start_time_interval: number;\n max_advance_bookings_interval?: string;\n min_advance_bookings_interval?: string;\n tag_ids: unknown[];\n tags: unknown[];\n categories: ITrybeCategory[];\n price_rules: ITrybeAppointmentPriceRule[];\n contraindications: unknown[];\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n membership_booking_windows_enabled: boolean;\n membership_booking_windows: unknown[];\n meta: ITrybeMeta;\n upsell_offerings: unknown[];\n cross_sell_offerings: unknown[];\n related_retail_offerings: unknown[];\n customer_cancellation_permitted?: string;\n customer_cancellation_min_duration?: string;\n min_guests: number;\n max_guests: number;\n allocate_multi_capacity_rooms: boolean;\n enquiries_enabled: boolean;\n revenue_centre: unknown;\n include_pricing_on_calendar: boolean;\n max_per_basket: unknown;\n max_per_guest: unknown;\n shop_practitioner_selection_enabled: boolean;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetAppointmentsResponse =\n IGetTrybeResourcesCommonResponse<ITrybeAppointment>;\n\nexport interface ITrybeSessionPriceRule extends ITrybePriceRule {\n session_type_id: string;\n}\n\nexport interface ITrybeSessionMeta {\n title: string;\n description: string;\n}\n\nexport interface ITrybeSessionRecurrenceGroup {\n id: string;\n name: string;\n practitioner: {\n id: string;\n name: string;\n };\n room: ITrybeSessionRoom;\n weekdays: string[];\n start_time: string;\n start_times: ITrybeSessionStartTime[];\n capacity: number;\n recurrence_start?: string;\n recurrence_end?: string;\n session_type_id: string;\n deleted_at: string;\n}\n\nexport interface ITrybeSessionRoom {\n id: string;\n name: string;\n capacity: number;\n}\n\nexport interface ITrybeSessionStartTime {\n value: string;\n id: string;\n}\n\nexport interface ITrybeSession {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n image?: ITrybeImage;\n site_id: string;\n category_ids: string[];\n price_rules: ITrybeSessionPriceRule[];\n duration?: number;\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n membership_booking_windows_enabled: boolean;\n membership_booking_windows: unknown[];\n max_bookings_per_member: number;\n meta: ITrybeSessionMeta;\n upsell_offerings: unknown[];\n cross_sell_offerings: unknown[];\n related_retail_offerings: unknown[];\n customer_cancellation_permitted?: string;\n customer_cancellation_min_duration?: string;\n waitlist_enabled: boolean;\n max_advance_bookings_interval?: string;\n min_advance_bookings_interval?: string;\n min_guests: number;\n max_guests: number;\n categories: ITrybeCategory[];\n max_baskets_per_session?: number;\n recurrence_groups: ITrybeSessionRecurrenceGroup[];\n revenue_centre: string;\n include_pricing_on_calendar: boolean;\n max_per_basket: string;\n max_per_guest: string;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetSessionsResponse =\n IGetTrybeResourcesCommonResponse<ITrybeSession>;\n\nexport interface ITrybeOffering {\n offering_type: string;\n offering_id: string;\n offering_name: string;\n}\n\nexport interface ITrybeCourse {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n coupon_id: string;\n offerings: ITrybeOffering[];\n offering_type: string;\n offering_id: string;\n image?: ITrybeImage;\n site_id: string;\n category_ids: string[];\n quantity: number;\n credits_validity_interval?: string;\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n meta: ITrybeMeta;\n upsell_offerings: ITrybeOffering[];\n cross_sell_offerings: ITrybeOffering[];\n related_retail_offerings: ITrybeOffering[];\n availability_rules: unknown[];\n price_rules: ITrybePriceRule[];\n revenue_centre: unknown;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetCoursesResponse =\n IGetTrybeResourcesCommonResponse<ITrybeCourse>;\n\nexport enum TRYBE_OFFERING_TYPE_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport interface ITrybeCouponCodeOffering {\n offering_type: TRYBE_OFFERING_TYPE_ENUM;\n offering_id: string;\n offering_name: string;\n}\n\nexport interface ITrybeCouponCodeOfferingsData {\n id: string;\n offerings: ITrybeCouponCodeOffering[];\n discount_type: string;\n fixed_amount: unknown;\n percentage: number;\n}\n\nexport interface ITrybeGetCouponCodeOfferingsResponse {\n data: ITrybeCouponCodeOfferingsData;\n}\n\nexport interface ITrybeAppointmentSlot {\n start_time: string;\n end_time: string;\n duration: number;\n end_buffer: number;\n practitioner_ids: string[];\n total_quantity: number;\n quantity_available: number;\n is_valid: boolean;\n currency: string;\n price: number;\n nonoptimal_practitioner_allocation: boolean;\n nonoptimal_practitioner_ids: string[];\n bookable_from: string;\n bookable_to: string | null;\n}\n\nexport interface ITrybeAppointmentAvailabilityResponse {\n data: ITrybeAppointmentSlot[];\n}\n\nexport interface ITrybeSessionPractitioner {\n id: string;\n name: string;\n}\n\nexport interface ITrybeSessionRoom {\n id: string;\n name: string;\n capacity: number;\n}\n\nexport interface ITrybeSessionAvailability {\n id: string;\n practitioner_id: string;\n practitioner: ITrybeSessionPractitioner;\n room_id: string;\n room: ITrybeSessionRoom;\n start_time: string;\n end_time: string;\n duration: number;\n capacity: number;\n remaining_capacity: number;\n waitlist_enabled: boolean;\n is_valid: boolean;\n price: number;\n currency: string;\n no_availability_reason?: string;\n no_availability_message?: string;\n}\n\nexport interface ITrybeSessionAvailabilityResponse {\n data: ITrybeSessionAvailability[];\n}\n\nexport const TRYBE_OFFERING_TYPE_API = {\n APPOINTMENT: 'appointment',\n SESSION: 'session',\n COURSE: 'course',\n} as const;\n\nexport type TrybeOfferingTypeApi =\n (typeof TRYBE_OFFERING_TYPE_API)[keyof typeof TRYBE_OFFERING_TYPE_API];\n\nexport interface ITrybeAddOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeOrderGuest {\n id: string;\n name: string;\n first_name: string;\n last_name: string;\n email: null;\n intake_form_complete: boolean;\n checked_in_at: null;\n checked_out_at: null;\n is_lead_booker: boolean;\n customer_id: string;\n}\n\nexport interface ITrybeOrder {\n id: string;\n organisation_id: string;\n order_ref: string;\n site_id: string;\n status: string;\n stage: string;\n customer_id: string;\n email: string;\n phone: null;\n first_name: string;\n last_name: string;\n guests: ITrybeOrderGuest[];\n booking_items?: Array<{ id: string }>;\n}\n\nexport interface ITrybeGetOrderResponseData {\n data: ITrybeOrder;\n}\n\nexport interface ITrybeAddCustomerToOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeAddOrderItemResponse {\n data: {\n id: string;\n status: string;\n booking_summary?: {\n id: string;\n offering?: { id?: string; type?: string; name?: string };\n };\n type_id?: string;\n type_name?: string;\n total_cost?: number;\n net_total?: number;\n };\n}\n\nexport interface ITrybeSubmitOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeCancelOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeAddPaymentToOrderResponse {\n order_id: string;\n status: string;\n}\n\nexport interface ITrybePractitioner {\n id: string;\n name: string;\n organisation_id: string;\n site_ids: string[];\n avatar: unknown;\n appointment_restrictions: unknown[];\n tag_ids: string[];\n tags: unknown[];\n zones: ITrybeZone[];\n can_offer_tags: unknown[];\n created_at: string;\n updated_at: string;\n}\n\nexport interface ITrybeZone {\n id: string;\n name: string;\n site_id: string;\n organisation_id: string;\n}\n\nexport interface ITrybeCreateOrderResponse extends ICreateOrderResponse {\n meta: {\n orderReference: string;\n };\n}\n\nexport interface ITrybeGetOrderResponse extends IGetOrderResponse {\n meta: {\n orderReference: string;\n };\n /** Order item ids from Trybe (for updateOrder flow) */\n items: Array<{ id: string }>;\n}\n\nexport interface ITrybeUpdateOrderItemResponse {\n data: { id: string };\n}\n","/**\n * Trybe resource mapping configuration (aligned with MS trybe.model.ts).\n */\n\nexport enum TRYBE_SUPPORTED_JOURNEYS_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport enum TRYBE_CATALOGING_BY_ENUM {\n PEOPLE_RESOURCE = 'PEOPLE_RESOURCE',\n}\n\nexport interface ITrybeResourceMappingConfiguration {\n supportedJourneys?: TRYBE_SUPPORTED_JOURNEYS_ENUM[];\n catalogingBy?: TRYBE_CATALOGING_BY_ENUM;\n paymentType?: string;\n}\n","import {\n type IAvailableDateWithSlots,\n type IAvailableTimeSlot,\n type IBookableItem,\n type IBookableItemCategory,\n type IBookableItemMedia,\n type IBookableItemPrice,\n type IBookableItemPriceMeta,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IOfferingResource,\n type ISystemResponse,\n BOOKABLE_ITEM_STATUS_ENUM,\n BOOKABLE_ITEM_TYPE_ENUM,\n} from '@dvss/dvss-integration-libs';\nimport type {\n ITrybeAppointment,\n ITrybeAppointmentSlot,\n ITrybeCategory,\n ITrybeCouponCodeOffering,\n ITrybeCourse,\n ITrybeImage,\n ITrybePractitioner,\n ITrybePriceRule,\n ITrybeSession,\n ITrybeSessionAvailability,\n} from '../../models';\nimport { TRYBE_OFFERING_TYPE_ENUM } from '../../models';\nimport { convertKeysToCamelCase, extractTimeFromIsoString } from '../../utils';\nimport {\n DAY_OF_WEEK,\n OFFERING_RESOURCE_TYPE,\n STATUS,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\n// ==================== CONSTANTS ====================\n\nconst TRYBE_WEEKDAYS_MAPPING: Record<string, DAY_OF_WEEK> = {\n monday: DAY_OF_WEEK.MON,\n tuesday: DAY_OF_WEEK.TUE,\n wednesday: DAY_OF_WEEK.WED,\n thursday: DAY_OF_WEEK.THU,\n friday: DAY_OF_WEEK.FRI,\n saturday: DAY_OF_WEEK.SAT,\n sunday: DAY_OF_WEEK.SUN,\n};\n\n// ==================== HELPER MAPPERS ====================\n\nexport function mapTrybeImageToMedia(\n image?: ITrybeImage,\n): IBookableItemMedia | undefined {\n if (!image) return undefined;\n return {\n id: image.id,\n url: image.url,\n originalUrl: image.original_url,\n fileName: image.file_name,\n mimeType: image.mime_type,\n };\n}\n\nfunction mapTrybeWeekdays(weekdays: string[]): DAY_OF_WEEK[] {\n return weekdays.map((day) => TRYBE_WEEKDAYS_MAPPING[day.toLowerCase()]);\n}\n\n/**\n * Maps Trybe price rule to price meta\n * Returns raw price from Trybe without any conversion\n */\nfunction mapTrybePriceRuleToPriceMeta(\n priceRule: ITrybePriceRule,\n currency: string,\n index: number,\n): IBookableItemPriceMeta[] {\n const normalizedCurrency = currency ? currency.toUpperCase() : 'USD';\n\n if (!priceRule.weekdays || priceRule.weekdays.length === 0) {\n return [\n {\n id: BigInt(index),\n externalId: priceRule.id,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n price: priceRule.price,\n currency: normalizedCurrency,\n config: priceRule as unknown as Record<string, unknown>,\n },\n ];\n }\n\n return [\n {\n id: BigInt(index),\n externalId: priceRule.id,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n price: priceRule.price,\n currency: normalizedCurrency,\n configuredForDays: mapTrybeWeekdays(priceRule.weekdays),\n },\n ];\n}\n\n/**\n * Maps Trybe price rules to prices\n * Returns raw prices from Trybe without any conversion\n */\nexport function mapTrybePriceRulesToPrices(\n priceRules: ITrybePriceRule[],\n currency: string,\n externalResourceId: string,\n): IBookableItemPrice[] {\n const normalizedCurrency = currency ? currency.toUpperCase() : 'USD';\n\n return priceRules.map((priceRule, index) => ({\n id: BigInt(index + 1),\n label: undefined,\n currency: normalizedCurrency,\n price: priceRule.price,\n externalResourceId,\n configuredForDays: priceRule.weekdays\n ? mapTrybeWeekdays(priceRule.weekdays)\n : undefined,\n pricesMeta: mapTrybePriceRuleToPriceMeta(priceRule, currency, index + 1),\n config: priceRule as unknown as Record<string, unknown>,\n }));\n}\n\n// ==================== MAIN MAPPERS ====================\n\nexport function mapTrybeAppointmentToBookableItem(\n appointment: ITrybeAppointment,\n index: number,\n linkedItems?: IBookableItem[],\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: appointment.id,\n name: appointment.name,\n description: appointment.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(appointment.image),\n primaryAsset: mapTrybeImageToMedia(appointment.image),\n prices: mapTrybePriceRulesToPrices(\n appointment.price_rules,\n appointment.currency,\n appointment.id,\n ),\n linkedBookableItems: linkedItems,\n updatedAt: appointment.updated_at\n ? new Date(appointment.updated_at)\n : undefined,\n meta: {\n // All Trybe-specific fields that don't map to system response\n externalId: appointment.id,\n productCode: appointment.product_code,\n siteIds: appointment.site_ids,\n roomIds: appointment.room_ids,\n equipmentIds: appointment.equipment_ids,\n practitionerIds: appointment.practitioner_ids,\n durations: appointment.durations,\n endBuffer: appointment.end_buffer,\n startTimeInterval: appointment.start_time_interval,\n maxAdvanceBookingsInterval: appointment.max_advance_bookings_interval,\n minAdvanceBookingsInterval: appointment.min_advance_bookings_interval,\n tagIds: appointment.tag_ids,\n tags: appointment.tags,\n categoryIds: appointment.category_ids,\n offeredOnline: appointment.offered_online,\n private: appointment.private,\n visibility: appointment.visibility,\n customersOnly: appointment.customers_only,\n membersOnly: appointment.members_only,\n membershipBookingWindowsEnabled:\n appointment.membership_booking_windows_enabled,\n membershipBookingWindows: appointment.membership_booking_windows,\n trybeMeta: appointment.meta,\n upsellOfferings: appointment.upsell_offerings,\n crossSellOfferings: appointment.cross_sell_offerings,\n relatedRetailOfferings: appointment.related_retail_offerings,\n customerCancellationPermitted:\n appointment.customer_cancellation_permitted,\n customerCancellationMinDuration:\n appointment.customer_cancellation_min_duration,\n minGuests: appointment.min_guests,\n maxGuests: appointment.max_guests,\n allocateMultiCapacityRooms: appointment.allocate_multi_capacity_rooms,\n enquiriesEnabled: appointment.enquiries_enabled,\n revenueCentre: appointment.revenue_centre,\n includePricingOnCalendar: appointment.include_pricing_on_calendar,\n maxPerBasket: appointment.max_per_basket,\n maxPerGuest: appointment.max_per_guest,\n shopPractitionerSelectionEnabled:\n appointment.shop_practitioner_selection_enabled,\n deletedAt: appointment.deleted_at,\n },\n };\n}\n\nexport function mapTrybeSessionToBookableItem(\n session: ITrybeSession,\n index: number,\n linkedItems?: IBookableItem[],\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: session.id,\n name: session.name,\n description: session.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.SESSION,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(session.image),\n primaryAsset: mapTrybeImageToMedia(session.image),\n prices: mapTrybePriceRulesToPrices(\n session.price_rules,\n session.currency,\n session.id,\n ),\n linkedBookableItems: linkedItems,\n updatedAt: session.updated_at ? new Date(session.updated_at) : undefined,\n meta: {\n // All Trybe-specific fields\n externalId: session.id,\n productCode: session.product_code,\n siteId: session.site_id,\n duration: session.duration,\n categoryIds: session.category_ids,\n offeredOnline: session.offered_online,\n private: session.private,\n visibility: session.visibility,\n customersOnly: session.customers_only,\n membersOnly: session.members_only,\n membershipBookingWindowsEnabled:\n session.membership_booking_windows_enabled,\n membershipBookingWindows: session.membership_booking_windows,\n maxBookingsPerMember: session.max_bookings_per_member,\n trybeMeta: session.meta,\n upsellOfferings: session.upsell_offerings,\n crossSellOfferings: session.cross_sell_offerings,\n relatedRetailOfferings: session.related_retail_offerings,\n customerCancellationPermitted: session.customer_cancellation_permitted,\n customerCancellationMinDuration:\n session.customer_cancellation_min_duration,\n waitlistEnabled: session.waitlist_enabled,\n maxAdvanceBookingsInterval: session.max_advance_bookings_interval,\n minAdvanceBookingsInterval: session.min_advance_bookings_interval,\n minGuests: session.min_guests,\n maxGuests: session.max_guests,\n maxBasketsPerSession: session.max_baskets_per_session,\n recurrenceGroups: session.recurrence_groups,\n revenueCentre: session.revenue_centre,\n includePricingOnCalendar: session.include_pricing_on_calendar,\n maxPerBasket: session.max_per_basket,\n maxPerGuest: session.max_per_guest,\n deletedAt: session.deleted_at,\n },\n };\n}\n\nexport function mapTrybeCourseToBookableItem(\n course: ITrybeCourse,\n index: number,\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: course.id,\n name: course.name,\n description: course.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.COURSE,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(course.image),\n primaryAsset: mapTrybeImageToMedia(course.image),\n prices: mapTrybePriceRulesToPrices(\n course.price_rules,\n course.currency,\n course.id,\n ),\n updatedAt: course.updated_at ? new Date(course.updated_at) : undefined,\n meta: {\n // All Trybe-specific fields\n externalId: course.id,\n productCode: course.product_code,\n couponId: course.coupon_id,\n offerings: course.offerings.map((offering) => ({\n offeringType: offering.offering_type,\n offeringId: offering.offering_id,\n offeringName: offering.offering_name,\n })),\n offeringType: course.offering_type,\n offeringId: course.offering_id,\n quantity: course.quantity,\n creditsValidityInterval: course.credits_validity_interval,\n siteId: course.site_id,\n categoryIds: course.category_ids,\n offeredOnline: course.offered_online,\n private: course.private,\n visibility: course.visibility,\n customersOnly: course.customers_only,\n membersOnly: course.members_only,\n trybeMeta: course.meta,\n upsellOfferings: course.upsell_offerings,\n crossSellOfferings: course.cross_sell_offerings,\n relatedRetailOfferings: course.related_retail_offerings,\n availabilityRules: course.availability_rules,\n revenueCentre: course.revenue_centre,\n deletedAt: course.deleted_at,\n },\n };\n}\n\nexport function mapTrybeCategoryToBookableItemCategory(\n category: ITrybeCategory,\n index: number,\n): IBookableItemCategory {\n return {\n id: BigInt(index + 1),\n externalId: category.id,\n name: category.name,\n meta: {\n voucherApplicable: category.voucher_applicable,\n },\n };\n}\n\n/**\n * Maps Trybe practitioner to system OfferingResource.\n * Union fields (externalId, name, type, status, media, updatedAt) are mapped;\n * Trybe-specific fields go into meta.\n */\nexport function mapTrybePractitionerToOfferingResource(\n practitioner: ITrybePractitioner,\n index: number,\n): IOfferingResource {\n const media =\n practitioner.avatar != null && typeof practitioner.avatar === 'object'\n ? { meta: practitioner.avatar as Record<string, unknown> }\n : undefined;\n\n return {\n id: BigInt(index + 1),\n externalId: practitioner.id,\n name: practitioner.name,\n type: OFFERING_RESOURCE_TYPE.PEOPLE,\n status: STATUS.ACTIVE,\n media,\n updatedAt: practitioner.updated_at\n ? new Date(practitioner.updated_at)\n : undefined,\n meta: {\n organisationId: practitioner.organisation_id,\n siteIds: practitioner.site_ids,\n appointmentRestrictions: practitioner.appointment_restrictions,\n tagIds: practitioner.tag_ids,\n tags: practitioner.tags,\n zones: practitioner.zones,\n canOfferTags: practitioner.can_offer_tags,\n createdAt: practitioner.created_at,\n updatedAt: practitioner.updated_at,\n },\n };\n}\n\n// ==================== RESPONSE MAPPERS ====================\n\nexport function mapTrybeAppointmentsToSystemResponse(\n appointments: ITrybeAppointment[],\n totalCount: number,\n courseLookup?: Map<string, ITrybeCourse[]>,\n): ISystemResponse<IBookableItem> {\n const records = appointments.map((apt, index) => {\n const linkedCourses = courseLookup?.get(apt.id) ?? [];\n const linkedItems = linkedCourses.map((course, courseIndex) =>\n mapTrybeCourseToBookableItem(course, courseIndex),\n );\n return mapTrybeAppointmentToBookableItem(\n apt,\n index,\n linkedItems.length > 0 ? linkedItems : undefined,\n );\n });\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeSessionsToSystemResponse(\n sessions: ITrybeSession[],\n totalCount: number,\n courseLookup?: Map<string, ITrybeCourse[]>,\n): ISystemResponse<IBookableItem> {\n const records = sessions.map((session, index) => {\n const linkedCourses = courseLookup?.get(session.id) ?? [];\n const linkedItems = linkedCourses.map((course, courseIndex) =>\n mapTrybeCourseToBookableItem(course, courseIndex),\n );\n return mapTrybeSessionToBookableItem(\n session,\n index,\n linkedItems.length > 0 ? linkedItems : undefined,\n );\n });\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeCoursesToSystemResponse(\n courses: ITrybeCourse[],\n totalCount: number,\n): ISystemResponse<IBookableItem> {\n const records = courses.map((course, index) =>\n mapTrybeCourseToBookableItem(course, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeCategoriesToSystemResponse(\n categories: ITrybeCategory[],\n totalCount: number,\n): ISystemResponse<IBookableItemCategory> {\n const records = categories.map((category, index) =>\n mapTrybeCategoryToBookableItemCategory(category, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybePractitionersToSystemResponse(\n practitioners: ITrybePractitioner[],\n totalCount: number,\n): ISystemResponse<IOfferingResource> {\n const records = practitioners.map((practitioner, index) =>\n mapTrybePractitionerToOfferingResource(practitioner, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nfunction mapTrybeOfferingTypeToBookableItemType(\n offeringType: TRYBE_OFFERING_TYPE_ENUM,\n): BOOKABLE_ITEM_TYPE_ENUM {\n switch (offeringType) {\n case TRYBE_OFFERING_TYPE_ENUM.APPOINTMENT:\n return BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT;\n case TRYBE_OFFERING_TYPE_ENUM.SESSION:\n return BOOKABLE_ITEM_TYPE_ENUM.SESSION;\n case TRYBE_OFFERING_TYPE_ENUM.COURSE:\n return BOOKABLE_ITEM_TYPE_ENUM.COURSE;\n default:\n return BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT;\n }\n}\n\nexport function mapTrybeCouponCodeOfferingToBookableItem(\n offering: ITrybeCouponCodeOffering,\n index: number,\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: offering.offering_id,\n name: offering.offering_name,\n type: mapTrybeOfferingTypeToBookableItemType(offering.offering_type),\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n };\n}\n\nexport function mapTrybeCouponCodeOfferingsToSystemResponse(\n offerings: ITrybeCouponCodeOffering[],\n): ISystemResponse<IBookableItem> {\n const records = offerings.map((offering, index) =>\n mapTrybeCouponCodeOfferingToBookableItem(offering, index),\n );\n\n return {\n totalCount: records.length,\n records,\n };\n}\n\n// ==================== AVAILABILITY MAPPERS ====================\n\nfunction groupByDate<T>(\n items: T[],\n getDateKey: (item: T) => string,\n): Record<string, T[]> {\n const result: Record<string, T[]> = {};\n for (const item of items) {\n const key = getDateKey(item);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!result[key]) result[key] = [];\n result[key].push(item);\n }\n return result;\n}\n\nexport function mapTrybeSessionAvailabilityToSystemResponse(\n sessions: ITrybeSessionAvailability[],\n): IGetAvailableDatesAndTimeSlotsResponse {\n const filtered = sessions.filter((s) => s.remaining_capacity > 0);\n const grouped = groupByDate(filtered, (s) => {\n const dateMatch = s.start_time.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n return dateMatch ? dateMatch[1] : '';\n });\n\n const dates: IAvailableDateWithSlots[] = Object.entries(grouped)\n .filter(([date]) => date !== '')\n .map(([date, sessionList]) => {\n const time: IAvailableTimeSlot[] = sessionList.map((session) => {\n const fromTime = extractTimeFromIsoString(session.start_time);\n const toTime = extractTimeFromIsoString(session.end_time);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { start_time: startTime, end_time: endTime, ...meta } = session;\n const camelCaseMeta = convertKeysToCamelCase(meta) as Record<\n string,\n unknown\n >;\n return { fromTime, toTime, meta: camelCaseMeta };\n });\n return {\n date: new Date(date),\n meta: {},\n time,\n };\n })\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n return { dates };\n}\n\nexport function mapTrybeAppointmentAvailabilityToSystemResponse(\n slots: ITrybeAppointmentSlot[],\n): IGetAvailableDatesAndTimeSlotsResponse {\n const filtered = slots.filter((s) => s.quantity_available > 0);\n const grouped = groupByDate(filtered, (s) => {\n const dateMatch = s.start_time.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n return dateMatch ? dateMatch[1] : '';\n });\n\n const dates: IAvailableDateWithSlots[] = Object.entries(grouped)\n .filter(([date]) => date !== '')\n .map(([date, slotList]) => {\n const time: IAvailableTimeSlot[] = slotList.map((slot) => {\n const fromTime = extractTimeFromIsoString(slot.start_time);\n const toTime = extractTimeFromIsoString(slot.end_time);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { start_time: startTime, end_time: endTime, ...meta } = slot;\n const camelCaseMeta = convertKeysToCamelCase(meta) as Record<\n string,\n unknown\n >;\n return { fromTime, toTime, meta: camelCaseMeta };\n });\n return {\n date: new Date(date),\n meta: {},\n time,\n };\n })\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n return { dates };\n}\n","/**\n * Trybe implementation for wellness management operations\n * Provides concrete implementation of wellness management functionality\n * for Trybe systems\n *\n * This class extends the base wellness management operations with\n * Trybe-specific implementations\n */\nimport { Injectable } from '@nestjs/common';\nimport {\n convertDateOnlyToTimestamp,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseWellnessManagement,\n BOOKABLE_ITEM_TYPE_ENUM,\n HTTP_METHOD,\n type IAddItemToOrderRequest,\n type IAddItemToOrderResponse,\n type IAddPaymentToOrderRequest,\n type IBookableItem,\n type IBookableItemCategory,\n type ICapabilityIntegration,\n type ICreateOrderRequest,\n type IFetchOfferingAvailabilityRequest,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IGetAppointmentsRequest,\n type IGetBookableItemsFromCreditRequest,\n type IGetCategoriesRequest,\n type IGetCoursesRequest,\n type IGetPractitionersRequest,\n type IGetSessionsRequest,\n type IOfferingResource,\n type ISystemResponse,\n TrafficGatewayService,\n type IUpdateOrderRequest,\n type IUpdateOrderResponse,\n} from '@dvss/dvss-integration-libs';\nimport { fetchAllPages, formatDateForTrybe } from '../../utils';\nimport {\n type IGetTrybeResourcesCommonResponse,\n type ITrybeAddOrderResponse,\n type ITrybeAddOrderItemResponse,\n type ITrybeGetOrderResponseData,\n type ITrybeAppointment,\n type ITrybeAppointmentAvailabilityResponse,\n type ITrybeCategory,\n type ITrybeCourse,\n type ITrybeGetAppointmentsResponse,\n type ITrybeGetCategoriesResponse,\n type ITrybeGetCoursesResponse,\n type ITrybeGetCouponCodeOfferingsResponse,\n type ITrybeGetSessionsResponse,\n type ITrybeSession,\n type ITrybeSessionAvailabilityResponse,\n type TrybeOfferingTypeApi,\n TRYBE_OFFERING_TYPE_API,\n ITrybePractitioner,\n ITrybeCreateOrderResponse,\n ITrybeGetOrderResponse,\n type ITrybeUpdateOrderItemResponse,\n} from '../../models';\nimport {\n mapTrybeAppointmentsToSystemResponse,\n mapTrybeAppointmentAvailabilityToSystemResponse,\n mapTrybeCategoriesToSystemResponse,\n mapTrybeCoursesToSystemResponse,\n mapTrybeCouponCodeOfferingsToSystemResponse,\n mapTrybePractitionersToSystemResponse,\n mapTrybeSessionAvailabilityToSystemResponse,\n mapTrybeSessionsToSystemResponse,\n} from './wellness-management.mapper';\nimport { TrybeAuthService } from '../auth/auth.service';\n\n@Injectable()\nexport class TrybeWellnessManagement implements BaseWellnessManagement {\n private readonly fileName = 'wellness-management.service';\n\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n private readonly trybeAuthService: TrybeAuthService,\n ) {}\n\n fetchWellnessAppointmentSession(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n checkWellnessAppointmentSessionAvailability(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n createWellnessAppointmentSessionOrder(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n addWellnessAppointmentSessionOrderItems(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n confirmWellnessAppointmentSessionOrder(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async createOrder(\n request: ICreateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCreateOrderResponse> {\n let orderId: string | undefined;\n\n try {\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validated.config.integrationConfig.siteId;\n\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAddOrderResponse,\n { site_id: string; status: string }\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: '/shop/orders',\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { site_id: siteId, status: 'new' },\n },\n validated,\n loggedInUserId,\n );\n\n orderId = res.data.id;\n\n const items: (IBookableItem & { totalPrice?: number })[] = [];\n\n // Attach customer to the order\n await this.addCustomerToOrder(\n orderId,\n request.customerId,\n integration,\n loggedInUserId,\n );\n\n // Fetch order details to get guest information\n const order = await this.getOrder(orderId, integration, loggedInUserId);\n\n // Add each bookable item to the order\n for (const bookableItem of request.bookableItems) {\n const orderItemResponse = await this.addItemToOrder(\n {\n orderId,\n item: {\n offeringId: bookableItem.externalId,\n offeringType: bookableItem.type,\n guestIds: order.guests.map((g) => g.id),\n practitionerIds: request.offeringResources.map(\n (r) => r.externalId,\n ),\n durationMinutes: request.durationInMinutes,\n timeIso: request.bookingStartTime.toISOString(),\n sessionId: (request.meta as { sessionId?: string } | undefined)\n ?.sessionId,\n },\n },\n integration,\n loggedInUserId,\n );\n\n items.push({\n externalId: bookableItem.externalId,\n name: orderItemResponse.name as string,\n type: bookableItem.type,\n totalPrice:\n (orderItemResponse.netTotal ?? 0) / request.currencyMultiplier,\n });\n }\n\n // Apply customer credits if available\n if (request.customerCreditId) {\n await this.addCustomerCreditsToOrder(\n orderId,\n request.customerCreditId,\n integration,\n loggedInUserId,\n );\n }\n\n // Submit the order to complete the booking process\n await this.submitOrder(orderId, integration, loggedInUserId);\n\n this.logger.info(\n loggedInUserId,\n this.createOrder.name,\n this.fileName,\n 'Created Trybe order for offering booking',\n { orderId },\n );\n\n return {\n externalBookingId: orderId,\n items,\n meta: {\n orderReference: order.meta.orderReference,\n },\n };\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.createOrder.name,\n this.fileName,\n 'Error creating Trybe order for offering booking',\n err,\n );\n\n if (orderId) {\n await this.cancelOrder(orderId, integration, loggedInUserId);\n }\n\n throw err;\n }\n }\n\n async addCustomerToOrder(\n orderId: string,\n customerId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addCustomerToOrder.name,\n this.fileName,\n 'Adding customer to Trybe order',\n { orderId, customerId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/customer`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { id: customerId, source: 'trybe' },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addCustomerToOrder.name,\n this.fileName,\n 'Successfully added customer to Trybe order',\n { orderId, customerId },\n );\n }\n\n async getOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeGetOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.getOrder.name,\n this.fileName,\n 'Fetching Trybe order details',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetOrderResponseData,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/shop/orders/${orderId}`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.getOrder.name,\n this.fileName,\n 'Successfully fetched Trybe order details',\n { orderId, guestCount: res.data.guests.length },\n );\n\n return {\n orderId: res.data.id,\n guests: res.data.guests.map((g) => ({ id: g.id, name: g.name })),\n meta: {\n orderReference: res.data.order_ref,\n },\n items: res.data.booking_items ?? [],\n };\n }\n\n private mapOfferingTypeToTrybeApi(\n type: BOOKABLE_ITEM_TYPE_ENUM,\n ): TrybeOfferingTypeApi {\n switch (type) {\n case BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT:\n return TRYBE_OFFERING_TYPE_API.APPOINTMENT;\n case BOOKABLE_ITEM_TYPE_ENUM.SESSION:\n return TRYBE_OFFERING_TYPE_API.SESSION;\n case BOOKABLE_ITEM_TYPE_ENUM.COURSE:\n return TRYBE_OFFERING_TYPE_API.COURSE;\n default:\n throw new Error(`Unsupported offering type: ${type as string}`);\n }\n }\n\n async addItemToOrder(\n request: IAddItemToOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddItemToOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.addItemToOrder.name,\n this.fileName,\n 'Adding item to Trybe order',\n {\n orderId: request.orderId,\n offeringId: request.item.offeringId,\n offeringType: request.item.offeringType,\n },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const { orderId, item } = request;\n const offeringType = this.mapOfferingTypeToTrybeApi(item.offeringType);\n\n let body: Record<string, unknown>;\n if (offeringType === TRYBE_OFFERING_TYPE_API.APPOINTMENT) {\n if (item.durationMinutes == null || !item.timeIso) {\n throw new Error('durationMinutes and timeIso required for appointment');\n }\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n item_configuration: {\n duration: item.durationMinutes,\n skip_availability_checks: false,\n time: item.timeIso,\n },\n skip_availability_checks: false,\n };\n } else if (offeringType === TRYBE_OFFERING_TYPE_API.SESSION) {\n if (!item.sessionId) {\n throw new Error('sessionId required for session');\n }\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n item_configuration: {\n session_id: item.sessionId,\n skip_availability_checks: false,\n },\n skip_availability_checks: false,\n };\n } else {\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n };\n }\n\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAddOrderItemResponse,\n Record<string, unknown>\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/items`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body,\n },\n validated,\n loggedInUserId,\n );\n const data = res.data;\n const result = {\n name: data.booking_summary?.offering?.name ?? data.type_name ?? undefined,\n netTotal: data.net_total,\n };\n\n this.logger.info(\n loggedInUserId,\n this.addItemToOrder.name,\n this.fileName,\n 'Successfully added item to Trybe order',\n {\n orderId,\n offeringId: item.offeringId,\n name: result.name,\n netTotal: result.netTotal,\n },\n );\n\n return result;\n }\n\n async addCustomerCreditsToOrder(\n orderId: string,\n customerCreditId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addCustomerCreditsToOrder.name,\n this.fileName,\n 'Adding customer credits to Trybe order',\n { orderId, customerCreditId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: unknown },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/customer-credits`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { id: customerCreditId },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addCustomerCreditsToOrder.name,\n this.fileName,\n 'Successfully added customer credits to Trybe order',\n { orderId, customerCreditId },\n );\n }\n\n async submitOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.submitOrder.name,\n this.fileName,\n 'Submitting Trybe order',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/submit`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.submitOrder.name,\n this.fileName,\n 'Successfully submitted Trybe order',\n { orderId },\n );\n }\n\n async cancelOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.cancelOrder.name,\n this.fileName,\n 'Cancelling Trybe order',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/cancel`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.cancelOrder.name,\n this.fileName,\n 'Successfully cancelled Trybe order',\n { orderId },\n );\n }\n\n async updateOrder(\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IUpdateOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Updating Trybe order',\n { orderId: request.orderId, offeringType: request.item.type },\n );\n\n const order = await this.getOrder(\n request.orderId,\n integration,\n loggedInUserId,\n );\n const itemId = order.items[0]?.id;\n if (!itemId) {\n this.logger.error(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Item not found in order during update',\n { orderId: request.orderId },\n );\n throw new Error('Item not found in order');\n }\n const updateResponse = await this.updateOrderItem(\n request.orderId,\n itemId,\n request,\n integration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Successfully updated Trybe order',\n { orderId: request.orderId, itemId },\n );\n\n return {\n success: Boolean(updateResponse.data.id),\n data: updateResponse.data,\n };\n }\n\n async updateOrderItem(\n orderId: string,\n itemId: string,\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeUpdateOrderItemResponse> {\n this.logger.info(\n loggedInUserId,\n this.updateOrderItem.name,\n this.fileName,\n 'Updating Trybe order item',\n { orderId, itemId, offeringType: request.item.type },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const offeringType = this.mapOfferingTypeToTrybeApi(request.item.type);\n let body: Record<string, unknown>;\n\n if (offeringType === TRYBE_OFFERING_TYPE_API.APPOINTMENT) {\n if (\n request.bookingStartTimeLabel == null ||\n request.durationInMinutes == null ||\n request.bookingStartDateLabel == null\n ) {\n throw new Error(\n 'durationInMinutes, bookingStartDateLabel and bookingStartTimeLabel required for appointment',\n );\n }\n const timeIso = convertDateOnlyToTimestamp(\n request.timezone,\n request.bookingStartDateLabel,\n request.bookingStartTimeLabel,\n ).toISOString();\n body = {\n offering_id: request.item.externalId,\n item_configuration: {\n time: timeIso,\n duration: request.durationInMinutes,\n skip_availability_checks: false,\n },\n skip_availability_checks: false,\n };\n } else if (offeringType === TRYBE_OFFERING_TYPE_API.SESSION) {\n if (!request.sessionId) {\n throw new Error('sessionId required for session');\n }\n body = {\n item_configuration: {\n session_id: request.sessionId,\n skip_availability_checks: false,\n },\n };\n } else {\n throw new Error('Course is not updatable');\n }\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeUpdateOrderItemResponse,\n Record<string, unknown>\n >(\n {\n apiMethod: HTTP_METHOD.PUT,\n url: `/shop/orders/${orderId}/items/${itemId}`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.updateOrderItem.name,\n this.fileName,\n 'Successfully updated Trybe order item',\n { orderId, itemId },\n );\n\n return response;\n }\n\n async addPaymentToOrder(\n request: IAddPaymentToOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addPaymentToOrder.name,\n this.fileName,\n 'Adding payment to Trybe order',\n {\n orderId: request.orderId,\n amount: request.amount,\n paymentTypeId: request.paymentTypeId,\n },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { order_id: string; status: string },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${request.orderId}/payments`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: {\n amount: request.amount,\n processor: 'manual',\n status: 'paid',\n processor_data: {\n notes: '',\n payment_type_id: request.paymentTypeId,\n },\n },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addPaymentToOrder.name,\n this.fileName,\n 'Successfully added payment to Trybe order',\n { orderId: request.orderId, amount: request.amount },\n );\n }\n\n async fetchAppointments(\n request: IGetAppointmentsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchAppointments.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n if (\n request.shouldFetchAllAppointments &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all appointments.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/appointment-types?site_id=${siteId}` +\n (request.practitionerIds && request.practitionerIds.length > 0\n ? `&practitioner_id=${request.practitionerIds.join(',')}`\n : '') +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetAppointmentsResponse,\n IGetAppointmentsRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeAppointment,\n ITrybeGetAppointmentsResponse\n >(firstPageResponse, request.shouldFetchAllAppointments, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeAppointment>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n 'Successfully fetched Trybe appointments',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeAppointmentsToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n 'Error fetching Trybe appointments',\n err,\n );\n throw err;\n }\n }\n\n async fetchSessions(\n request: IGetSessionsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchSessions.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n if (\n request.shouldFetchAllSessions &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all sessions.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/session-types?site_id=${siteId}` +\n (request.practitionerIds && request.practitionerIds.length > 0\n ? `&practitioner_id=${request.practitionerIds.join(',')}`\n : '') +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetSessionsResponse,\n IGetSessionsRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeSession,\n ITrybeGetSessionsResponse\n >(firstPageResponse, request.shouldFetchAllSessions, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeSession>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n 'Successfully fetched Trybe sessions',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeSessionsToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n 'Error fetching Trybe sessions',\n err,\n );\n throw err;\n }\n }\n\n async fetchCourses(\n request: IGetCoursesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchCourses.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const organisationId =\n validatedIntegration.config.integrationConfig.organisationId;\n\n if (\n request.shouldFetchAllCourses &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all courses.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/course-types?organisation_id=${organisationId}` +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCoursesResponse,\n IGetCoursesRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeCourse,\n ITrybeGetCoursesResponse\n >(firstPageResponse, request.shouldFetchAllCourses, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeCourse>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n 'Successfully fetched Trybe courses',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeCoursesToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n 'Error fetching Trybe courses',\n err,\n );\n throw err;\n }\n }\n\n async fetchPractitioners(\n request: IGetPractitionersRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IOfferingResource>> {\n this.logger.info(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchPractitioners.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n const apiUrl = `/shop/practitioners/?site_id=${siteId}`;\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>,\n IGetPractitionersRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybePractitioner,\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>\n >(firstPageResponse, request.shouldFetchAllPractitioners, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>,\n IGetPractitionersRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n 'Successfully fetched Trybe practitioners',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybePractitionersToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n 'Error fetching Trybe practitioners',\n err,\n );\n throw err;\n }\n }\n\n async fetchCategories(\n request: IGetCategoriesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItemCategory>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchCategories.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const organisationId =\n validatedIntegration.config.integrationConfig.organisationId;\n\n if (\n request.shouldFetchAllCategories &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all categories.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/organisations/${organisationId}/categories` +\n (queryString ? `?${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCategoriesResponse,\n IGetCategoriesRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeCategory,\n ITrybeGetCategoriesResponse\n >(firstPageResponse, request.shouldFetchAllCategories, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeCategory>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}${apiUrl.includes('?') ? '&' : '?'}page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n 'Successfully fetched Trybe categories',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeCategoriesToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n 'Error fetching Trybe categories',\n err,\n );\n throw err;\n }\n }\n\n async fetchBookableItemsFromCredit(\n request: IGetBookableItemsFromCreditRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchBookableItemsFromCredit.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/coupon-codes/${request.couponCodeId}/offering-discounts` +\n (queryString ? `?${queryString}` : '');\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCouponCodeOfferingsResponse,\n IGetBookableItemsFromCreditRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n 'Successfully fetched bookable items from credit',\n { couponCodeId: request.couponCodeId },\n );\n\n return mapTrybeCouponCodeOfferingsToSystemResponse(\n response.data.offerings,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n 'Error fetching bookable items from credit',\n err,\n );\n throw err;\n }\n }\n\n async fetchSessionAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse> {\n this.logger.info(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchSessionAvailabilityForOffering.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n const formattedDateTimeFrom = formatDateForTrybe(\n request.dateTimeFrom,\n true,\n );\n const formattedDateTimeTo = formatDateForTrybe(request.dateTimeTo, false);\n\n const apiUrl =\n `/shop/item-availability/sessions/${siteId}/${request.externalOfferingBookableItemId}` +\n `?date_time_from=${encodeURIComponent(formattedDateTimeFrom)}` +\n `&date_time_to=${encodeURIComponent(formattedDateTimeTo)}` +\n `&offeringId=${request.externalOfferingBookableItemId}`;\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeSessionAvailabilityResponse,\n IFetchOfferingAvailabilityRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n 'Successfully fetched session availability for offering',\n {\n externalOfferingBookableItemId:\n request.externalOfferingBookableItemId,\n },\n );\n\n return mapTrybeSessionAvailabilityToSystemResponse(response.data);\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n 'Error fetching session availability for offering',\n err,\n );\n throw err;\n }\n }\n\n async fetchAppointmentAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse> {\n this.logger.info(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchAppointmentAvailabilityForOffering.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n const formattedDateTimeFrom = formatDateForTrybe(\n request.dateTimeFrom,\n true,\n );\n const formattedDateTimeTo = formatDateForTrybe(request.dateTimeTo, false);\n\n const apiUrl =\n `/shop/item-availability/appointment-slots/${siteId}/${request.externalOfferingBookableItemId}` +\n `?date_time_from=${encodeURIComponent(formattedDateTimeFrom)}` +\n `&date_time_to=${encodeURIComponent(formattedDateTimeTo)}` +\n `&OfferingID=${request.externalOfferingBookableItemId}`;\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAppointmentAvailabilityResponse,\n IFetchOfferingAvailabilityRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n 'Successfully fetched appointment availability for offering',\n {\n externalOfferingBookableItemId:\n request.externalOfferingBookableItemId,\n },\n );\n\n return mapTrybeAppointmentAvailabilityToSystemResponse(response.data);\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n 'Error fetching appointment availability for offering',\n err,\n );\n throw err;\n }\n }\n}\n","import type {\n ISiteSystemResponse,\n ITrybeSiteResponse,\n} from '../../models/integration-configuration.model';\n\n/**\n * Maps Trybe site API response to the system site response (e.g. for getSiteDetailedInformation).\n */\nexport function mapTrybeSiteResponseToSystem(\n response: ITrybeSiteResponse,\n): ISiteSystemResponse {\n return {\n customPaymentTypes: response.data?.custom_payment_types?.map(\n (paymentType) => ({\n id: paymentType.id,\n name: paymentType.name,\n kind: paymentType.kind,\n }),\n ),\n };\n}\n","import { CommonValidationDatabaseService } from '@dv4resi/dvss-backend-module-datastore';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport type {\n AddAPIResponse,\n GraphQLContext,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseIntegrationConfiguration,\n HTTP_METHOD,\n type IAddCapabilityIntegrationConfiguredFor,\n type IAddCapabilityIntegrationInput,\n type ICapabilityIntegration,\n IntegrationConfigurationDao,\n type IUpdateCapabilityIntegrationRequest,\n type IUpdateCapabilityIntegrationResponse,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport { Injectable } from '@nestjs/common';\nimport type {\n ISiteSystemResponse,\n ITrybeSiteResponse,\n} from '../../models/integration-configuration.model';\nimport { TrybeAuthService } from '../auth/auth.service';\nimport { mapTrybeSiteResponseToSystem } from './integration-configuration.mapper';\n\n/**\n * Trybe implementation of integration configuration.\n * - Validates Trybe-specific config (apiKey, siteId, organisationId, platformConfig.baseUrl) when config is present.\n * - Validates configuredFor (offering exists and belongs to project) when configuredFor is present.\n */\n@Injectable()\nexport class TrybeIntegrationConfigurationService extends BaseIntegrationConfiguration {\n constructor(\n integrationConfigurationDao: IntegrationConfigurationDao,\n commonValidationDatabaseService: CommonValidationDatabaseService,\n logger: LoggerService,\n private readonly trybeAuthService: TrybeAuthService,\n private readonly trafficGatewayService: TrafficGatewayService,\n ) {\n super(integrationConfigurationDao, commonValidationDatabaseService, logger);\n }\n\n /**\n * Add capability integration: validate Trybe config, then configuredFor (offering), then delegate to base.\n */\n override async addCapabilityIntegration(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<AddAPIResponse> {\n this.trybeAuthService.validateConfig(\n { config: input.config } as ICapabilityIntegration,\n context.loggedInUserId,\n );\n\n if (input.configuredFor != null) {\n await this.validateCapabilityIntegrationConfiguredForInput(\n input.configuredFor,\n input.projectId,\n );\n }\n\n return super.addCapabilityIntegration(input, context);\n }\n\n /**\n * Update capability integration: convert to new signature and delegate to base.\n */\n override async updateCapabilityIntegration(\n request: IUpdateCapabilityIntegrationRequest,\n integration?: ICapabilityIntegration,\n loggedInUserId?: bigint,\n ): Promise<IUpdateCapabilityIntegrationResponse> {\n if (request.updateData.config) {\n this.trybeAuthService.validateConfig(\n {\n config: request.updateData.config,\n } as unknown as ICapabilityIntegration,\n loggedInUserId as bigint,\n );\n }\n\n return super.updateCapabilityIntegration(\n request,\n integration,\n loggedInUserId,\n );\n }\n\n /**\n * Validates configuredFor (offering exists and belongs to project). Same as project-ms validateCapabilityIntegrationConfiguredForInput.\n */\n private async validateCapabilityIntegrationConfiguredForInput(\n configuredFor: IAddCapabilityIntegrationConfiguredFor,\n projectId: number,\n ): Promise<void> {\n if (configuredFor.configuredForType !== CONFIGURED_FOR_TYPE_ENUM.OFFERING) {\n throw new Error(\n `configuredForType not supported: ${configuredFor.configuredForType}`,\n );\n }\n\n await this.commonValidationDatabaseService.getOffering({\n offeringId: configuredFor.configuredForId,\n projectId,\n });\n }\n\n /**\n * Trybe 3rd party: GET /shop/sites/{siteId} via executeIntegrationRequest.\n */\n async getSiteDetailedInformation(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISiteSystemResponse | undefined> {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n const url = `/shop/sites/${siteId}`;\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<ITrybeSiteResponse>(\n {\n apiMethod: HTTP_METHOD.GET,\n url,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n return mapTrybeSiteResponseToSystem(response);\n }\n}\n","/**\n * Trybe implementation for integration resource management (e.g. offering integration).\n * Implements addResourceToIntegration and removeResourceFromIntegration via UIF.\n * Validation (config + mapping exists) lives in this wrapper; base holds only inter-service implementation.\n */\n\nimport { Injectable } from '@nestjs/common';\nimport {\n BaseIntegrationResourceManagement,\n IntegrationResourceManagementDao,\n type IAddResourceToIntegrationInput,\n type IAddResourceToIntegrationResponse,\n type IRemoveResourceFromIntegrationRequest,\n type IRemoveResourceFromIntegrationResponse,\n type IUpdateOfferingIntegrationResourceConfigurationInput,\n type IUpdateOfferingIntegrationResourceConfigurationResponse,\n} from '@dvss/dvss-integration-libs';\nimport {\n CustomException,\n ERROR_NAMES,\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\nimport {\n type ITrybeResourceMappingConfiguration,\n TRYBE_CATALOGING_BY_ENUM,\n} from '../../models/integration-resource-management.model';\n\n/** Error message when add is called but mapping already exists (MS can catch by message if needed). */\nexport const OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS =\n 'OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS';\n\nconst VALID_JOURNEY_VALUES = new Set<string>([\n 'SESSION',\n 'COURSE',\n 'APPOINTMENT',\n]);\n\n@Injectable()\nexport class TrybeIntegrationResourceManagementService extends BaseIntegrationResourceManagement {\n constructor(\n logger: LoggerService,\n integrationResourceManagementDao: IntegrationResourceManagementDao,\n ) {\n super(integrationResourceManagementDao, logger);\n }\n\n /**\n * Validates Trybe resource mapping config (same rules as MS trybe-offering-integration-management.service).\n * @throws CustomException BAD_REQUEST if config is invalid\n */\n validateResourceMappingConfig(config: Record<string, unknown>): void {\n const resourceMappingConfig = config as ITrybeResourceMappingConfiguration;\n\n if (\n !resourceMappingConfig.supportedJourneys ||\n resourceMappingConfig.supportedJourneys.length === 0\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys required and must be non-empty',\n );\n }\n\n if (\n !resourceMappingConfig.catalogingBy ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n resourceMappingConfig.catalogingBy !==\n TRYBE_CATALOGING_BY_ENUM.PEOPLE_RESOURCE\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: catalogingBy must be PEOPLE_RESOURCE',\n );\n }\n\n if (\n !resourceMappingConfig.supportedJourneys.some((journey) =>\n VALID_JOURNEY_VALUES.has(journey),\n )\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys must contain at least one of SESSION, COURSE, APPOINTMENT',\n );\n }\n\n if (\n resourceMappingConfig.supportedJourneys.some(\n (journey) => !VALID_JOURNEY_VALUES.has(journey),\n )\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys may only contain SESSION, COURSE, APPOINTMENT',\n );\n }\n\n if (\n !resourceMappingConfig.paymentType ||\n typeof resourceMappingConfig.paymentType !== 'string'\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: paymentType required and must be a string',\n );\n }\n }\n\n override async addResourceToIntegration(\n input: IAddResourceToIntegrationInput,\n context: GraphQLContext,\n ): Promise<IAddResourceToIntegrationResponse> {\n if (input.config != null && typeof input.config === 'object') {\n this.validateResourceMappingConfig(input.config);\n }\n\n const isMappingExists =\n await this.integrationResourceManagementDao.checkMappingExists(\n {\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context.loggedInUserId,\n );\n\n if (isMappingExists) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS,\n );\n }\n\n return super.addResourceToIntegration(input, context);\n }\n\n override async removeResourceFromIntegration(\n request: IRemoveResourceFromIntegrationRequest,\n context: GraphQLContext,\n ): Promise<IRemoveResourceFromIntegrationResponse> {\n const isMappingExists =\n await this.integrationResourceManagementDao.checkMappingExists(\n {\n capabilityIntegrationId: request.capabilityIntegrationId,\n configuredForId: request.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context.loggedInUserId,\n );\n\n if (!isMappingExists) {\n throw new CustomException(ERROR_NAMES.BAD_REQUEST, 'Mapping not found');\n }\n\n return super.removeResourceFromIntegration(request, context);\n }\n\n override async updateOfferingIntegrationResourceConfiguration(\n input: IUpdateOfferingIntegrationResourceConfigurationInput,\n context: GraphQLContext,\n ): Promise<IUpdateOfferingIntegrationResourceConfigurationResponse> {\n const resourceMapping =\n await this.integrationResourceManagementDao.getCapabilityIntegrationResourceMappingById(\n input.id,\n context.loggedInUserId,\n );\n\n if (!resourceMapping) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Resource mapping not found',\n );\n }\n\n this.validateResourceMappingConfig(input.config);\n return await super.updateOfferingIntegrationResourceConfiguration(\n input,\n context,\n );\n }\n}\n","// Load environment variables BEFORE importing modules that check env vars at import time\nimport './load-env';\nimport { LoggerModule } from '@dv4resi/dvss-backend-module-utility';\nimport { HttpModule } from '@nestjs/axios';\nimport { ConfigModule } from '@nestjs/config';\nimport { Module } from '@nestjs/common';\nimport { resolve } from 'path';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport {\n IntegrationLibsModule,\n RateLimiterService,\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n IntegrationConfigurationDao,\n IntegrationResourceManagementDao,\n} from '@dvss/dvss-integration-libs';\nimport { TrybeAuthService } from './capabilities/auth/auth.service';\nimport { TrybeCustomerManagement } from './capabilities/customer-management/customer-management.service';\nimport { TrybeCreditBooking } from './capabilities/credit-management/credit-booking.service';\nimport { TrybeWellnessManagement } from './capabilities/wellness/wellness-management.service';\nimport {\n CommonValidationDatabaseService,\n DatastoreModule,\n} from '@dv4resi/dvss-backend-module-datastore';\nimport { TrybeIntegrationConfigurationService } from './capabilities/integration-configuration/integration-configuration.service';\nimport { TrybeIntegrationResourceManagementService } from './capabilities/integration-resource-management/integration-resource-management.service';\n\n@Module({\n imports: [\n // Load environment variables from root .env file\n ConfigModule.forRoot({\n envFilePath: resolve(__dirname, '../../../.env'),\n isGlobal: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n IntegrationLibsModule,\n HttpModule,\n LoggerModule,\n DatastoreModule,\n ],\n controllers: [AppController],\n providers: [\n AppService,\n TrybeAuthService,\n TrybeCustomerManagement,\n TrybeCreditBooking,\n TrybeWellnessManagement,\n IntegrationConfigurationDao,\n IntegrationResourceManagementDao,\n IntegrationRequestLoggerService,\n RateLimiterService,\n TrafficGatewayService,\n TrybeCustomerManagement,\n TrybeAuthService,\n TrybeIntegrationConfigurationService,\n TrybeIntegrationResourceManagementService,\n CommonValidationDatabaseService,\n ],\n exports: [\n TrybeAuthService,\n TrybeCustomerManagement,\n TrybeCreditBooking,\n TrybeWellnessManagement,\n TrybeIntegrationConfigurationService,\n TrybeIntegrationResourceManagementService,\n ],\n})\nexport class AppModule {}\n","import { Module } from '@nestjs/common';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { IntegrationTrybeModule } from '@dvss/dvss-integration-trybe';\nimport { IntegrationLibsModule } from '@dvss/dvss-integration-libs';\n\n@Module({\n imports: [IntegrationTrybeModule, IntegrationLibsModule],\n controllers: [AppController],\n providers: [AppService, IntegrationTrybeModule, IntegrationLibsModule],\n exports: [IntegrationTrybeModule, IntegrationLibsModule],\n})\nexport class AppModule {}\n"]}
1
+ {"version":3,"sources":["../src/app.service.ts","../src/app.controller.ts","../../../packages/dvss-integration-trybe/src/load-env.ts","../../../packages/dvss-integration-trybe/src/app.service.ts","../../../packages/dvss-integration-trybe/src/app.controller.ts","../../../packages/dvss-integration-libs/src/app.service.ts","../../../packages/dvss-integration-libs/src/app.controller.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/constants/http.constant.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/logging/request-logger.service.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/rate-limiter/rate-limiter.service.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/gateway/traffic-gateway.service.ts","../../../packages/dvss-integration-libs/src/load-env.ts","../../../packages/dvss-integration-libs/src/app.module.ts","../../../packages/dvss-integration-libs/src/integration-traffic-router/constants/traffic-router.constant.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/auth/auth.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/credit-management.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/capability-integration.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/models/wellness-management.model.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/wellness/wellness-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/credit-management/credit-booking.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/customer-management/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/package-management/package-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/contact-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/credit-note-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/customer-payment-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/invoice-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/loa-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/accounting/subcapabilities/tax-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/payment.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/payment-method-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/payment/subcapabilities/user-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/membership/subcapabilities/customer-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/membership/subcapabilities/membership-management.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/integration-configuration/integration-configuration.base.ts","../../../packages/dvss-integration-libs/src/integration-operation-skeletons/capabilities/integration-resource-management/integration-resource-management.base.ts","../../../node_modules/src/entity.ts","../../../node_modules/src/column.ts","../../../node_modules/src/column-builder.ts","../../../node_modules/src/table.ts","../../../node_modules/src/pg-core/table.ts","../../../node_modules/src/pg-core/foreign-keys.ts","../../../node_modules/src/tracing-utils.ts","../../../node_modules/src/pg-core/unique-constraint.ts","../../../node_modules/src/pg-core/utils/array.ts","../../../node_modules/src/pg-core/columns/common.ts","../../../node_modules/src/pg-core/columns/enum.ts","../../../node_modules/src/subquery.ts","../../../node_modules/src/tracing.ts","../../../node_modules/src/view-common.ts","../../../node_modules/src/sql/sql.ts","../../../node_modules/src/sql/expressions/conditions.ts","../../../node_modules/src/sql/expressions/select.ts","../../../node_modules/src/utils.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-configuration.dao.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-user-management.dao.ts","../../../packages/dvss-integration-libs/src/integration-common-utils/dao/integration-resource-management.dao.ts","../../../packages/dvss-integration-trybe/src/capabilities/customer-management/customer-management.service.ts","../../../packages/dvss-integration-trybe/src/utils/url.utils.ts","../../../packages/dvss-integration-trybe/src/capabilities/auth/auth.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/credit-management/credit-booking.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/credit-management/credit-booking.service.ts","../../../packages/dvss-integration-trybe/src/utils/date.util.ts","../../../packages/dvss-integration-trybe/src/utils/pagination.util.ts","../../../packages/dvss-integration-trybe/src/models/wellness-management.model.ts","../../../packages/dvss-integration-trybe/src/models/integration-resource-management.model.ts","../../../packages/dvss-integration-trybe/src/capabilities/wellness/wellness-management.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/wellness/wellness-management.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-configuration/integration-configuration.mapper.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-configuration/integration-configuration.service.ts","../../../packages/dvss-integration-trybe/src/capabilities/integration-resource-management/integration-resource-management.service.ts","../../../packages/dvss-integration-trybe/src/app.module.ts","../src/app.module.ts"],"names":["AppService","getHello","AppController","appService","rootEnvPath","resolve","__dirname","config","path","console","log","name","HTTP_METHOD","IntegrationRequestLoggerService","className","logger","logRequest","logData","loggedInUserId","method","url","headers","requestBody","info","SYSTEM_USER_ID","integrationId","timestamp","Date","logResponse","statusCode","duration","responseBody","logError","error","logIntegrationRequest","undefined","RateLimiterService","validateAndEnforceRateLimit","TrafficGatewayService","httpService","requestLogger","rateLimiter","executeIntegrationRequest","request","integration","_context","startTime","now","prepareHeaders","requestConfig","prepareRequestConfig","fullUrl","constructFullUrl","baseUrl","id","apiMethod","body","apiResponse","executeHttpRequest","responseData","data","status","errorDetails","extractErrorDetails","platformConfig","apiMessage","err","message","headerType","POST","PUT","PATCH","responseType","requestUrl","normalizedBaseUrl","endsWith","slice","normalizedRequestUrl","startsWith","GET","firstValueFrom","get","post","put","patch","DELETE","delete","Error","String","errorObject","response","firstString","keys","k","v","trim","AppModule","imports","ConfigModule","forRoot","envFilePath","isGlobal","HttpModule","LoggerModule","controllers","providers","exports","TRAFFIC_ROUTER_CONFIGURATION_STORE_KEY","BaseAuth","CREDIT_TYPE_ENUM","CREDIT_STATUS_ENUM","CREDIT_FILTER_BY_ENUM","INTEGRATION_PROVIDER_ENUM","BOOKABLE_ITEM_TYPE_ENUM","BOOKABLE_ITEM_STATUS_ENUM","BaseWellnessManagement","BaseCreditBooking","BaseCustomerManagement","BasePackageManagement","BaseAccountingContactManagement","BaseAccountingCreditNoteManagement","BaseAccountingCustomerManagement","BaseAccountingCustomerPaymentManagement","BaseAccountingInvoiceManagement","BaseAccountingLOAManagement","BaseAccountingTaxManagement","BasePayment","BasePaymentMethodManagement","BasePaymentUserManagement","BaseMembershipCustomerManagement","BaseMembershipManagement","BaseIntegrationConfiguration","fileName","integrationConfigurationDao","commonValidationDatabaseService","validateAddCapabilityIntegrationInput","input","context","getProject","projectId","propertyId","getProperty","parentId","parentIntegration","getCapabilityIntegration","capabilityIntegrationId","capability","capabilityProvider","Promise","all","getCapability","capabilityId","getCapabilityProvider","capabilityProviderId","providerId","type","category","addCapabilityIntegration","addCapabilityIntegrationInput","createdBy","availableFor","configuredFor","result","updateCapabilityIntegration","validateIconAndNickName","updateData","configToUpdate","existingConfig","existingIntegrationConfig","integrationConfig","existingPlatformConfig","updateDataForDao","nickname","icon","updatedBy","meta","iconName","getCapabilityIntegrations","getCapabilityIntegrationById","fetchBy","getCapabilityIntegrationByProvider","configuredForType","configuredForId","BigInt","BaseIntegrationResourceManagement","integrationResourceManagementDao","addResourceToIntegration","offeringId","toString","addResult","addCapabilityIntegrationMapping","CONFIGURED_FOR_TYPE_ENUM","OFFERING","ids","idsCount","length","removeResourceFromIntegration","removeCapabilityIntegrationMapping","updateOfferingIntegrationResourceConfiguration","updateCapabilityIntegrationConfiguration","Column","ColumnBuilder","Table","schema","PgTable","ForeignKeyBuilder","ForeignKey","UniqueConstraintBuilder","UniqueOnConstraintBuilder","UniqueConstraint","value","startFrom","PgColumnBuilder","ref","actions","PgColumn","ExtraConfigColumn","IndexedColumn","PgArrayBuilder","PgArray","PgEnumColumnBuilder","PgEnumColumn","Subquery","sql","WithSubquery","FakePrimitiveParam","StringChunk","SQL","Name","Param","param","placeholder","Aliased","Placeholder","View","IntegrationConfigurationDao","conn","transaction","tx","integrationResult","insert","capabilityIntegration","values","$returningId","rollback","insertData","CAPABILITY_INTEGRATION_STATUS_ENUM","ACTIVE","createdAt","capIntegResourceMapping","query","findFirst","where","and","eq","isNull","deletedAt","update","set","affectedRows","conditions","CAPABILITY_TYPE_ENUM","INTEGRATION","push","select","getTableColumns","resourceMappingId","resourceMappingConfig","provider","providerIntegrationType","from","innerJoin","leftJoin","count","options","MAX_RECORDS_LENGTH","offset","page","sorting","sortBy","by","updatedAt","sortOrder","order","SORTING_ORDER_ENUM","ASC","asc","desc","searchTerm","search","shouldJoinCapability","Boolean","filters","some","filter","whereConditions","applyFilters","searchPattern","isNotNull","countWhereConditions","countQueryBuilder","as","countQueryWithJoins","countQueryWithPropertyJoin","PROPERTY","countQuery","baseQuery","finalQuery","totalCount","records","execute","then","limit","orderBy","Number","filterValues","valuePlaceholders","map","joinedValues","join","parentConditions","upperValue","toUpperCase","orCondition","or","DB_CONNECTION","IntegrationUserManagementDao","IntegrationResourceManagementDao","insertResult","raw","insertedId","insertId","isInserted","checkMappingExists","deleteResult","deletedBy","isSuccess","getCapabilityIntegrationResourceMappingById","rows","updateResult","TrybeCustomerManagement","trafficGatewayService","createCustomer","searchCustomer","email","customerId","updateCustomer","deleteCustomer","isValidHttpUrl","urlString","URL","protocol","TrybeAuthService","trybeCustomerManagement","validateConfig","Object","apiKey","siteId","organisationId","Authorization","testIntegration","validatedIntegration","fetchAccessToken","mapStatus","t","redeemed_at","REDEEMED","revoked_at","REVOKED","expires_at","EXPIRED","mapTrybeCreditsToSystem","res","groups","Map","key","coupon_name","split","list","index","items","first","couponCodes","i","coupon_code","description","coupon_description","COUPON","externalId","expiresAt","expiresDate","startsAt","issued_at","startDate","quantity","integrationDetails","customer_id","membershipId","membership_id","multiUse","multi_use","redeemedAt","revokedAt","TrybeCreditBooking","trybeAuthService","fetchCustomerCredits","URLSearchParams","opts","statusFilterValues","STATUS","includes","queryString","formatDateForTrybe","date","isStartOfDay","year","getFullYear","month","getMonth","padStart","day","getDate","hours","minutes","seconds","extractTimeFromIsoString","isoString","timeMatch","match","snakeToCamel","str","replaceAll","_","letter","convertKeysToCamelCase","object","Array","isArray","item","converted","entries","fetchAllPages","firstPageResponse","shouldFetchAll","fetchPage","lastPage","last_page","pageResponse","TRYBE_OFFERING_TYPE_ENUM","TRYBE_OFFERING_TYPE_API","APPOINTMENT","SESSION","COURSE","TRYBE_SUPPORTED_JOURNEYS_ENUM","TRYBE_CATALOGING_BY_ENUM","TRYBE_WEEKDAYS_MAPPING","monday","DAY_OF_WEEK","MON","tuesday","TUE","wednesday","WED","thursday","THU","friday","FRI","saturday","SAT","sunday","SUN","mapTrybeImageToMedia","image","originalUrl","original_url","file_name","mimeType","mime_type","mapTrybeWeekdays","weekdays","toLowerCase","mapTrybePriceRuleToPriceMeta","priceRule","currency","normalizedCurrency","price","configuredForDays","mapTrybePriceRulesToPrices","priceRules","externalResourceId","label","pricesMeta","mapTrybeAppointmentToBookableItem","appointment","linkedItems","primaryAsset","prices","price_rules","linkedBookableItems","updated_at","productCode","product_code","siteIds","site_ids","roomIds","room_ids","equipmentIds","equipment_ids","practitionerIds","practitioner_ids","durations","endBuffer","end_buffer","startTimeInterval","start_time_interval","maxAdvanceBookingsInterval","max_advance_bookings_interval","minAdvanceBookingsInterval","min_advance_bookings_interval","tagIds","tag_ids","tags","categoryIds","category_ids","offeredOnline","offered_online","private","visibility","customersOnly","customers_only","membersOnly","members_only","membershipBookingWindowsEnabled","membership_booking_windows_enabled","membershipBookingWindows","membership_booking_windows","trybeMeta","upsellOfferings","upsell_offerings","crossSellOfferings","cross_sell_offerings","relatedRetailOfferings","related_retail_offerings","customerCancellationPermitted","customer_cancellation_permitted","customerCancellationMinDuration","customer_cancellation_min_duration","minGuests","min_guests","maxGuests","max_guests","allocateMultiCapacityRooms","allocate_multi_capacity_rooms","enquiriesEnabled","enquiries_enabled","revenueCentre","revenue_centre","includePricingOnCalendar","include_pricing_on_calendar","maxPerBasket","max_per_basket","maxPerGuest","max_per_guest","shopPractitionerSelectionEnabled","shop_practitioner_selection_enabled","deleted_at","mapTrybeSessionToBookableItem","session","site_id","maxBookingsPerMember","max_bookings_per_member","waitlistEnabled","waitlist_enabled","maxBasketsPerSession","max_baskets_per_session","recurrenceGroups","recurrence_groups","mapTrybeCourseToBookableItem","course","couponId","coupon_id","offerings","offering","offeringType","offering_type","offering_id","offeringName","offering_name","creditsValidityInterval","credits_validity_interval","availabilityRules","availability_rules","mapTrybeCategoryToBookableItemCategory","voucherApplicable","voucher_applicable","mapTrybePractitionerToOfferingResource","practitioner","media","avatar","OFFERING_RESOURCE_TYPE","PEOPLE","organisation_id","appointmentRestrictions","appointment_restrictions","zones","canOfferTags","can_offer_tags","created_at","mapTrybeAppointmentsToSystemResponse","appointments","courseLookup","apt","linkedCourses","courseIndex","mapTrybeSessionsToSystemResponse","sessions","mapTrybeCoursesToSystemResponse","courses","mapTrybeCategoriesToSystemResponse","categories","mapTrybePractitionersToSystemResponse","practitioners","mapTrybeOfferingTypeToBookableItemType","normalized","mapTrybeCouponCodeOfferingToBookableItem","mapTrybeCouponCodeOfferingsToSystemResponse","groupByDate","getDateKey","mapTrybeSessionAvailabilityToSystemResponse","filtered","s","remaining_capacity","grouped","dateMatch","start_time","dates","sessionList","time","fromTime","toTime","end_time","endTime","camelCaseMeta","sort","a","b","getTime","mapTrybeAppointmentAvailabilityToSystemResponse","slots","quantity_available","slotList","slot","TrybeWellnessManagement","fetchWellnessAppointmentSession","checkWellnessAppointmentSessionAvailability","createWellnessAppointmentSessionOrder","addWellnessAppointmentSessionOrderItems","confirmWellnessAppointmentSessionOrder","createOrder","orderId","validated","addCustomerToOrder","getOrder","bookableItem","bookableItems","orderItemResponse","addItemToOrder","guestIds","guests","g","offeringResources","r","durationMinutes","durationInMinutes","timeIso","bookingStartTime","toISOString","sessionId","totalPrice","netTotal","currencyMultiplier","customerCreditId","addCustomerCreditsToOrder","submitOrder","externalBookingId","orderReference","cancelOrder","source","guestCount","order_ref","booking_items","mapOfferingTypeToTrybeApi","guest_ids","item_configuration","skip_availability_checks","session_id","booking_summary","type_name","net_total","updateOrder","itemId","updateResponse","updateOrderItem","success","bookingStartTimeLabel","bookingStartDateLabel","convertDateOnlyToTimestamp","timezone","addPaymentToOrder","amount","paymentTypeId","processor","processor_data","notes","payment_type_id","fetchAppointments","shouldFetchAllAppointments","apiUrl","totalRecords","total","fetchSessions","shouldFetchAllSessions","fetchCourses","shouldFetchAllCourses","fetchPractitioners","shouldFetchAllPractitioners","fetchCategories","shouldFetchAllCategories","fetchBookableItemsFromCredit","couponCodeId","fetchSessionAvailabilityForOffering","formattedDateTimeFrom","dateTimeFrom","formattedDateTimeTo","dateTimeTo","externalOfferingBookableItemId","encodeURIComponent","fetchAppointmentAvailabilityForOffering","mapTrybeSiteResponseToSystem","customPaymentTypes","custom_payment_types","paymentType","kind","TrybeIntegrationConfigurationService","validateCapabilityIntegrationConfiguredForInput","getOffering","getSiteDetailedInformation","OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS","VALID_JOURNEY_VALUES","Set","TrybeIntegrationResourceManagementService","validateResourceMappingConfig","supportedJourneys","CustomException","ERROR_NAMES","BAD_REQUEST","catalogingBy","PEOPLE_RESOURCE","journey","has","isMappingExists","resourceMapping","IntegrationLibsModule","DatastoreModule","CommonValidationDatabaseService","IntegrationTrybeModule"],"mappings":"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","file":"index.js","sourcesContent":["import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n constructor() {\n // Service initialization\n }\n\n getHello(): string {\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('offering-im')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","/**\n * Load environment variables from root .env file\n * This must be imported/required before any other modules that depend on environment variables\n * (e.g., @dv4resi/dvss-backend-module-utility checks env vars at module import time)\n */\nimport { config } from 'dotenv';\nimport { resolve } from 'path';\n\n// Resolve path to root .env file\n// From src/: ../../../\n// From dist/: ../../../\nconst rootEnvPath = resolve(__dirname, '../../../.env');\nconfig({ path: rootEnvPath });\n","import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n /**\n * Creates an instance of the app service\n */\n constructor() {\n // Service initialization\n }\n\n getHello(): string {\n console.log(`${this.constructor.name}::getHello`);\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('integration-trybe')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n","import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('integration-libs')\n getHello(): string {\n return this.appService.getHello();\n }\n}\n","/**\n * HTTP method constants\n */\nexport enum HTTP_METHOD {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n DELETE = 'DELETE',\n PATCH = 'PATCH',\n}\n","import {\n LoggerService,\n SYSTEM_USER_ID,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\n\n/**\n * Request logging data structure\n */\nexport interface IIntegrationRequestLog {\n integrationId?: bigint | string;\n method: string;\n url: string;\n headers?: Record<string, string>;\n requestBody?: unknown;\n responseBody?: unknown;\n statusCode?: number;\n duration?: number;\n loggedInUserId?: bigint;\n timestamp?: Date;\n error?: unknown;\n}\n\n/**\n * Service to expose the functionality to log integration requests\n * Uses LoggerService from @dv4resi/dvss-backend-module-utility\n */\n@Injectable()\nexport class IntegrationRequestLoggerService {\n private readonly className = IntegrationRequestLoggerService.name;\n\n constructor(private readonly logger: LoggerService) {}\n\n /**\n * Log integration request (before making the API call)\n *\n * @param logData - The request log data to be logged\n */\n logRequest(logData: IIntegrationRequestLog): void {\n const { loggedInUserId, method, url, headers, requestBody } = logData;\n\n this.logger.info(\n loggedInUserId || SYSTEM_USER_ID,\n this.logRequest.name,\n this.className,\n `Integration API Request: ${method} ${url}`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n headers,\n requestBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration response (after successful API call)\n *\n * @param logData - The response log data to be logged\n */\n logResponse(logData: IIntegrationRequestLog): void {\n const { loggedInUserId, method, url, statusCode, duration, responseBody } =\n logData;\n\n this.logger.info(\n loggedInUserId || SYSTEM_USER_ID,\n this.logResponse.name,\n this.className,\n `Integration API Response: ${method} ${url} - ${statusCode} (${duration}ms)`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n statusCode,\n duration,\n responseBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration error (after failed API call)\n *\n * @param logData - The error log data to be logged\n */\n logError(logData: IIntegrationRequestLog): void {\n const {\n loggedInUserId,\n method,\n url,\n statusCode,\n duration,\n error,\n responseBody,\n } = logData;\n\n this.logger.error(\n loggedInUserId || SYSTEM_USER_ID,\n this.logError.name,\n this.className,\n `Integration API Error: ${method} ${url} - ${statusCode || 'N/A'} (${duration || 0}ms)`,\n {\n integrationId: logData.integrationId,\n method,\n url,\n statusCode,\n duration,\n error,\n responseBody,\n timestamp: logData.timestamp || new Date(),\n },\n );\n }\n\n /**\n * Log integration request (legacy method for backward compatibility)\n * This method determines whether to log as request, response, or error based on the logData\n *\n * @param logData - The request log data to be logged\n */\n logIntegrationRequest(logData: IIntegrationRequestLog): void {\n if (logData.error) {\n this.logError(logData);\n } else if (logData.statusCode && logData.responseBody !== undefined) {\n this.logResponse(logData);\n } else {\n this.logRequest(logData);\n }\n }\n}\n","import { Injectable } from '@nestjs/common';\n\n/**\n * Service to expose the functionality to validate and enforce rate limits\n */\n@Injectable()\nexport class RateLimiterService {\n /**\n * Validate and enforce rate limit\n *\n * @returns Promise resolving when the rate limit is validated and enforced\n */\n async validateAndEnforceRateLimit(): Promise<void> {\n // TODO Get the rate limit from the configuration store\n // TODO Validate the rate limit\n // TODO Enforce the rate limit\n // TODO If the rate limit is exceeded, throw an error\n // TODO If the rate limit is not exceeded, pass the request to the traffic gateway\n }\n}\n","import { HttpService } from '@nestjs/axios';\nimport { Injectable } from '@nestjs/common';\nimport { firstValueFrom } from 'rxjs';\nimport { HTTP_METHOD } from '../constants/http.constant';\nimport {\n IntegrationRequestLoggerService,\n type IIntegrationRequestLog,\n} from '../logging/request-logger.service';\nimport { RateLimiterService } from '../rate-limiter/rate-limiter.service';\nimport { IValidatedCapabilityIntegration } from '../../integration-common-utils';\n\n/**\n * Request configuration for API calls\n */\nexport interface IApiCallRequest<TBody = unknown> {\n apiMethod: HTTP_METHOD;\n url: string;\n baseUrl: string;\n headers?: Record<string, string>;\n body?: TBody;\n responseType?: 'json' | 'text' | 'blob' | 'arraybuffer';\n headerType?: 'json' | 'xml';\n}\n\n/**\n * Request context for deriving rate limits and other settings\n */\nexport interface IIntegrationRequestContext {\n projectId?: bigint;\n propertyId?: bigint;\n capabilityId?: bigint;\n [key: string]: unknown;\n}\n\n/**\n * Service to expose the functionality to execute integration requests\n * This service provides a generic API call method that can be used for any third-party integration\n */\n@Injectable()\nexport class TrafficGatewayService {\n constructor(\n private readonly httpService: HttpService,\n private readonly requestLogger: IntegrationRequestLoggerService,\n private readonly rateLimiter: RateLimiterService,\n ) {}\n\n /**\n * Execute a generic API call to a third-party integration\n *\n * @template TResponse - The expected response type\n * @template TRequestBody - The request body type (optional)\n * @param request - The API call request configuration\n * @param integration - The integration configuration\n * @param loggedInUserId - Optional user ID for logging purposes\n * @param _context - Optional context for deriving rate limits and other settings (projectId, propertyId, etc.)\n * @returns Promise resolving to the API response data\n * @throws Error if the request fails or rate limit is exceeded\n */\n async executeIntegrationRequest<TResponse = unknown, TRequestBody = unknown>(\n request: IApiCallRequest<TRequestBody>,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId?: bigint,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _context?: IIntegrationRequestContext,\n ): Promise<TResponse> {\n const startTime = Date.now();\n\n try {\n // Prepare headers with authorization\n const headers = this.prepareHeaders(request);\n\n // Prepare request configuration\n const requestConfig = this.prepareRequestConfig(request, headers);\n\n // Rate limiting check with context for deriving rate limits\n await this.rateLimiter.validateAndEnforceRateLimit();\n\n // Construct full URL with proper handling of trailing slashes\n const fullUrl = this.constructFullUrl(request.baseUrl, request.url);\n\n // Prepare log data with full URL and headers for request logging\n const logData: IIntegrationRequestLog = {\n integrationId: integration.id,\n method: request.apiMethod,\n url: fullUrl,\n headers,\n requestBody: request.body,\n loggedInUserId,\n timestamp: new Date(),\n };\n\n // Log the request before making the API call\n this.requestLogger.logRequest(logData);\n\n // Execute the HTTP request based on method\n const apiResponse = await this.executeHttpRequest<TResponse>(\n request,\n fullUrl,\n requestConfig,\n );\n\n const duration = Date.now() - startTime;\n const responseData = apiResponse.data;\n\n // Log the successful response\n this.requestLogger.logResponse({\n ...logData,\n responseBody: responseData,\n statusCode: apiResponse.status,\n duration,\n });\n\n return responseData;\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorDetails = this.extractErrorDetails(error);\n\n // Get base URL safely for error logging\n const baseUrl = integration.config.platformConfig.baseUrl;\n const fullUrl = this.constructFullUrl(baseUrl, request.url);\n\n // Log the failed request with API reason (message/error_description) and response body\n this.requestLogger.logError({\n integrationId: integration.id,\n method: request.apiMethod,\n url: fullUrl,\n headers: request.headers,\n requestBody: request.body,\n loggedInUserId,\n timestamp: new Date(),\n error: errorDetails.apiMessage,\n statusCode: errorDetails.statusCode,\n duration,\n responseBody: errorDetails.responseBody,\n });\n\n // Attach apiMessage and statusCode so any integration (Trybe, etc.) can map to its own exceptions\n const err = error as Error & { apiMessage?: string; statusCode?: number };\n err.apiMessage = errorDetails.message;\n err.statusCode = errorDetails.statusCode;\n err.message = errorDetails.apiMessage;\n\n throw error;\n }\n }\n\n /**\n * Prepare headers for the API request\n *\n * @private\n * @param request - The API call request configuration\n * @param apiKey - The API key for authorization\n * @returns Prepared headers object\n */\n private prepareHeaders(request: IApiCallRequest): Record<string, string> {\n request.headerType = request.headerType || 'json';\n\n const headers: Record<string, string> = {\n ...(request.headers || {}),\n };\n\n // Set default content type if not provided for methods that send body\n if (\n !headers['Content-Type'] &&\n request.headerType === 'json' &&\n (request.apiMethod === HTTP_METHOD.POST ||\n request.apiMethod === HTTP_METHOD.PUT ||\n request.apiMethod === HTTP_METHOD.PATCH)\n ) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Set default accept header if not provided\n if (!headers['Accept'] && request.headerType === 'json') {\n headers['Accept'] = 'application/json';\n }\n\n return headers;\n }\n\n /**\n * Prepare request configuration object\n *\n * @private\n * @param request - The API call request configuration\n * @param headers - Prepared headers\n * @returns Request configuration object\n */\n private prepareRequestConfig(\n request: IApiCallRequest,\n headers: Record<string, string>,\n ): Record<string, unknown> {\n const requestConfig: Record<string, unknown> = {\n headers,\n };\n\n if (request.responseType) {\n requestConfig.responseType = request.responseType;\n }\n\n return requestConfig;\n }\n\n /**\n * Construct full URL from base URL and request URL\n * Handles trailing slashes properly\n *\n * @private\n * @param baseUrl - The base URL from platform config\n * @param requestUrl - The request URL path\n * @returns Constructed full URL\n */\n private constructFullUrl(baseUrl: string, requestUrl: string): string {\n const normalizedBaseUrl = baseUrl.endsWith('/')\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedRequestUrl = requestUrl.startsWith('/')\n ? requestUrl\n : `/${requestUrl}`;\n\n return `${normalizedBaseUrl}${normalizedRequestUrl}`;\n }\n\n /**\n * Execute HTTP request based on the method\n *\n * @private\n * @template TResponse - The expected response type\n * @param request - The API call request configuration\n * @param fullUrl - The full URL to make the request to\n * @param requestConfig - The request configuration\n * @returns Promise resolving to the HTTP response\n * @throws Error if the HTTP method is unsupported\n */\n private async executeHttpRequest<TResponse>(\n request: IApiCallRequest,\n fullUrl: string,\n requestConfig: Record<string, unknown>,\n ) {\n switch (request.apiMethod) {\n case HTTP_METHOD.GET: {\n return await firstValueFrom(\n this.httpService.get<TResponse>(fullUrl, requestConfig),\n );\n }\n case HTTP_METHOD.POST: {\n return await firstValueFrom(\n this.httpService.post<TResponse>(\n fullUrl,\n request.body,\n requestConfig,\n ),\n );\n }\n case HTTP_METHOD.PUT: {\n return await firstValueFrom(\n this.httpService.put<TResponse>(fullUrl, request.body, requestConfig),\n );\n }\n case HTTP_METHOD.PATCH: {\n return await firstValueFrom(\n this.httpService.patch<TResponse>(\n fullUrl,\n request.body,\n requestConfig,\n ),\n );\n }\n case HTTP_METHOD.DELETE: {\n return await firstValueFrom(\n this.httpService.delete<TResponse>(fullUrl, requestConfig),\n );\n }\n default: {\n throw new Error(\n `Unsupported HTTP method: ${String(request.apiMethod)}`,\n );\n }\n }\n }\n\n /**\n * Extract error details from an error object (e.g. Axios error).\n * Provider-agnostic: derives apiMessage from common response shapes so any integration\n * (Trybe, OAuth, REST, etc.) gets a readable reason. Callers can use statusCode and\n * responseBody to map to their own exceptions (e.g. 404 -> RESOURCE_NOT_FOUND).\n *\n * Supported response.data fields (first string wins): message, error_description,\n * error, detail, msg.\n *\n * @private\n * @param error - The error object\n * @returns Extracted error details including apiMessage for logging and callers\n */\n private extractErrorDetails(error: unknown): {\n message?: string;\n statusCode?: number;\n responseBody?: unknown;\n apiMessage: string;\n } {\n const errorObject = error as {\n status?: number;\n response?: { data?: unknown; status?: number };\n message?: string;\n };\n\n const responseData = errorObject.response?.data;\n const data =\n typeof responseData === 'object' && responseData !== null\n ? (responseData as Record<string, unknown>)\n : undefined;\n\n const firstString = (...keys: string[]): string | undefined => {\n for (const k of keys) {\n const v = data?.[k];\n if (typeof v === 'string' && v.trim()) return v;\n }\n return undefined;\n };\n\n const apiMessage =\n firstString('message', 'error_description', 'error', 'detail', 'msg') ||\n errorObject.message ||\n 'API error';\n\n return {\n message: errorObject.message,\n statusCode: errorObject.status || errorObject.response?.status,\n responseBody: errorObject.response?.data,\n apiMessage,\n };\n }\n}\n","/**\n * Load environment variables from root .env file\n * This must be imported/required before any other modules that depend on environment variables\n * (e.g., @dv4resi/dvss-backend-module-utility checks env vars at module import time)\n */\nimport { config } from 'dotenv';\nimport { resolve } from 'path';\n\n// Resolve path to root .env file\n// From src/: ../../../\n// From dist/: ../../../\nconst rootEnvPath = resolve(__dirname, '../../../.env');\nconfig({ path: rootEnvPath });\n","// Load environment variables BEFORE importing modules that check env vars at import time\nimport { LoggerModule } from '@dv4resi/dvss-backend-module-utility';\nimport { HttpModule } from '@nestjs/axios';\nimport { Module } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { resolve } from 'path';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { TrafficGatewayService } from './integration-traffic-router/gateway/traffic-gateway.service';\nimport { IntegrationRequestLoggerService } from './integration-traffic-router/logging/request-logger.service';\nimport { RateLimiterService } from './integration-traffic-router/rate-limiter/rate-limiter.service';\nimport './load-env';\n\n@Module({\n imports: [\n // Load environment variables from root .env file\n ConfigModule.forRoot({\n envFilePath: resolve(__dirname, '../../../.env'),\n isGlobal: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n HttpModule,\n LoggerModule,\n ],\n controllers: [AppController],\n providers: [\n AppService,\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n RateLimiterService,\n ],\n exports: [\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n RateLimiterService,\n ],\n})\nexport class AppModule {}\n","export const TRAFFIC_ROUTER_CONFIGURATION_STORE_KEY =\n 'traffic-router-configuration-store';\n","import {\n ICapabilityIntegration,\n IValidatedCapabilityIntegration,\n} from '../../../integration-common-utils';\n\n/**\n * Base abstract class for integration authentication operations\n * Provides a foundation for implementing authentication functionality\n * for different integration providers\n *\n * This class should be extended by concrete implementations that provide\n * specific authentication operations for different integration systems\n */\nexport abstract class BaseAuth {\n /**\n * Abstract method to validate integration configuration\n * Must be implemented by concrete classes\n *\n * @param config - Integration configuration object\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to validated configuration\n */\n abstract validateConfig(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): IValidatedCapabilityIntegration;\n\n /**\n * Abstract method to test integration connection\n * Must be implemented by concrete classes\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when test is completed\n */\n abstract testIntegration(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<boolean>;\n\n /**\n * Abstract method to fetch an access token from the integration provider.\n * Must be implemented by concrete classes.\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to the access token string\n */\n abstract fetchAccessToken(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<string>;\n}\n","/**\n * System-level credit and customer credits response types.\n * Aligned with payment MS GetUserCredits / Credit shape for consumption across the system.\n * Integrations map their provider-specific responses to these types.\n */\n\n/** Credit type values aligned with payment MS CREDIT_TYPE_ENUM */\nexport enum CREDIT_TYPE_ENUM {\n COUPON = 'COUPON',\n AMOUNT = 'AMOUNT',\n}\n\n/** Credit status values aligned with payment MS CREDIT_STATUS_ENUM */\nexport enum CREDIT_STATUS_ENUM {\n ACTIVE = 'ACTIVE',\n REDEEMED = 'REDEEMED',\n EXPIRED = 'EXPIRED',\n REVOKED = 'REVOKED',\n}\n\nexport enum CREDIT_FILTER_BY_ENUM {\n TYPE = 'TYPE',\n STATUS = 'STATUS',\n}\n\n/**\n * A single credit in the system format.\n * Matches the shape expected by payment MS Credit (plain interface, no GraphQL).\n * Fields not provided by an integration (e.g. id, projectId) are optional.\n */\nexport interface ICredit {\n id?: bigint;\n name: string;\n description?: string;\n type: CREDIT_TYPE_ENUM;\n status: CREDIT_STATUS_ENUM;\n projectId?: number;\n propertyId?: number;\n externalId?: string;\n expiresAt?: Date;\n expiresDate?: string;\n startsAt?: Date;\n startDate?: string;\n value?: string;\n capabilityIntegrationId?: bigint;\n quantity?: number;\n meta?: Record<string, unknown>;\n}\n\n/**\n * System response for customer credits.\n * Matches payment MS GetUserCredits: { totalCount, records }.\n */\nexport interface IGetCustomerCreditsRequestFilters {\n by: CREDIT_FILTER_BY_ENUM;\n values: string[];\n}\n\nexport interface IGetCustomerCreditsRequestOptions {\n filters?: IGetCustomerCreditsRequestFilters[];\n page?: number;\n count?: number;\n}\n\nexport interface IGetCustomerCreditsRequest {\n customerId: string;\n options?: IGetCustomerCreditsRequestOptions;\n}\n","export enum INTEGRATION_PROVIDER_ENUM {\n TRYBE = 'TRYBE',\n}\n\ninterface IPlatformConfig {\n baseUrl?: string;\n}\n\ninterface IIntegrationConfig {\n siteId?: string;\n apiKey?: string;\n organisationId?: string;\n}\n\nexport interface ICapabilityIntegrationConfig {\n platformConfig?: IPlatformConfig;\n integrationConfig?: IIntegrationConfig;\n}\n\nexport interface IValidatedCapabilityIntegrationConfig {\n platformConfig: Required<IPlatformConfig>;\n integrationConfig: Required<IIntegrationConfig>;\n}\n\nexport interface ICapabilityIntegration {\n id: bigint;\n provider?: INTEGRATION_PROVIDER_ENUM | null;\n providerId?: bigint;\n config?: ICapabilityIntegrationConfig;\n capabilityId?: bigint;\n projectId?: number;\n}\n\nexport interface IValidatedCapabilityIntegration {\n id: bigint;\n provider?: INTEGRATION_PROVIDER_ENUM | null;\n providerId?: bigint;\n config: IValidatedCapabilityIntegrationConfig;\n capabilityId?: bigint;\n headers?: Record<string, string>;\n projectId?: number;\n}\n","import {\n DAY_OF_WEEK,\n OFFERING_RESOURCE_TYPE,\n STATUS,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\nexport enum BOOKABLE_ITEM_TYPE_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport enum BOOKABLE_ITEM_STATUS_ENUM {\n ACTIVE = 'ACTIVE',\n INACTIVE = 'INACTIVE',\n}\n\nexport interface IBookableItemPriceMeta {\n id?: bigint;\n externalId?: string;\n status?: BOOKABLE_ITEM_STATUS_ENUM;\n price: number;\n currency: string;\n configuredForDays?: DAY_OF_WEEK[];\n config?: Record<string, unknown>;\n}\n\nexport interface IBookableItemPrice {\n id?: bigint;\n label?: string;\n currency: string;\n price: number;\n externalResourceId?: string;\n durationInMinute?: number;\n configuredForDays?: DAY_OF_WEEK[];\n pricesMeta?: IBookableItemPriceMeta[];\n config?: Record<string, unknown>;\n}\n\nexport interface IBookableItemMedia {\n id?: string;\n url?: string;\n originalUrl?: string;\n fileName?: string;\n mimeType?: string;\n thumbnailUrl?: string;\n}\n\nexport interface IBookableItem {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n type: BOOKABLE_ITEM_TYPE_ENUM;\n status?: BOOKABLE_ITEM_STATUS_ENUM;\n icon?: IBookableItemMedia;\n primaryAsset?: IBookableItemMedia;\n prices?: IBookableItemPrice[];\n linkedBookableItems?: IBookableItem[];\n updatedAt?: Date;\n createdAt?: Date;\n meta?: Record<string, unknown>;\n}\n\nexport interface IBookableItemCategory {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface IWellnessManagementRequestOptions {\n page?: number;\n count?: number;\n}\n\nexport interface IGetAppointmentsRequest {\n shouldFetchAllAppointments: boolean;\n practitionerIds?: string[];\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetSessionsRequest {\n shouldFetchAllSessions: boolean;\n practitionerIds?: string[];\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetCoursesRequest {\n shouldFetchAllCourses: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetCategoriesRequest {\n shouldFetchAllCategories: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IGetBookableItemsFromCreditRequest {\n couponCodeId: string;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IFetchOfferingAvailabilityRequest {\n externalOfferingBookableItemId: string;\n dateTimeFrom: Date;\n dateTimeTo: Date;\n}\n\nexport interface IAvailableTimeSlot {\n fromTime: string;\n toTime: string;\n meta?: unknown;\n}\n\nexport interface IAvailableDateWithSlots {\n date: Date;\n meta?: unknown;\n time: IAvailableTimeSlot[];\n}\n\nexport interface IGetAvailableDatesAndTimeSlotsResponse {\n dates: IAvailableDateWithSlots[];\n}\n\nexport interface IOrderGuest {\n id: string;\n name?: string;\n}\n\nexport interface IGetOrderResponse {\n orderId: string;\n guests: IOrderGuest[];\n}\n\nexport interface ICreateOrderRequest {\n bookingStartTime: Date;\n durationInMinutes?: number;\n meta?: Record<string, unknown>;\n bookableItems: Pick<IBookableItem, 'externalId' | 'type'>[];\n offeringResources: Pick<IOfferingResource, 'externalId'>[];\n currencyMultiplier: number;\n customerId: string;\n customerCreditId?: string;\n}\n\nexport interface ICreateOrderResponse {\n externalBookingId: string;\n items: (IBookableItem & { totalPrice?: number })[];\n}\n\nexport interface IAddItemToOrderItemConfig {\n offeringId: string;\n offeringType: BOOKABLE_ITEM_TYPE_ENUM;\n guestIds: string[];\n practitionerIds: string[];\n durationMinutes?: number;\n timeIso?: string;\n sessionId?: string;\n}\n\nexport interface IAddItemToOrderRequest {\n orderId: string;\n item: IAddItemToOrderItemConfig;\n}\n\nexport interface IAddItemToOrderResponse {\n name?: string;\n netTotal?: number;\n}\n\nexport interface IAddPaymentToOrderRequest {\n orderId: string;\n amount: number;\n paymentTypeId: string;\n}\n\nexport interface IOfferingResourceMedia {\n meta?: Record<string, unknown>;\n provider?: string;\n}\n\n/**\n * System response type for practitioners/resources aligned with GQL OfferingResource.\n * Union fields map from integration; integration-specific fields go in meta.\n */\nexport interface IOfferingResource {\n id?: bigint;\n externalId: string;\n name: string;\n description?: string;\n type: OFFERING_RESOURCE_TYPE;\n status: STATUS;\n media?: IOfferingResourceMedia;\n meta?: Record<string, unknown>;\n bookableItems?: unknown[];\n createdAt?: Date;\n createdBy?: bigint;\n deletedAt?: Date;\n deletedBy?: bigint;\n isCurrentlyUnavailable?: boolean;\n occurrences?: unknown[];\n offeringId?: bigint;\n priceSummary?: string;\n projectId?: number;\n quantity?: number;\n unavailability?: unknown[];\n updatedAt?: Date;\n updatedBy?: bigint;\n}\n\nexport interface IGetPractitionersRequest {\n shouldFetchAllPractitioners: boolean;\n options?: IWellnessManagementRequestOptions;\n}\n\nexport interface IUpdateOrderRequest {\n orderId: string;\n timezone: string;\n item: {\n externalId: string;\n type: BOOKABLE_ITEM_TYPE_ENUM;\n };\n sessionId?: string;\n durationInMinutes?: number;\n bookingStartDateLabel?: string;\n bookingStartTimeLabel?: string;\n}\n\nexport interface IUpdateOrderResponse {\n success: boolean;\n data?: { id: string };\n}\n","import {\n IUpdateOrderRequest,\n IUpdateOrderResponse,\n type IBookableItem,\n type IBookableItemCategory,\n type ICapabilityIntegration,\n type ICreateOrderRequest,\n type ICreateOrderResponse,\n type IFetchOfferingAvailabilityRequest,\n type IGetAppointmentsRequest,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IGetBookableItemsFromCreditRequest,\n type IGetCategoriesRequest,\n type IGetCoursesRequest,\n type IGetOrderResponse,\n type IGetPractitionersRequest,\n type IGetSessionsRequest,\n type IOfferingResource,\n} from '../../../integration-common-utils';\nimport { type ISystemResponse } from '../../models/common.model';\n\n/**\n * Base abstract class for wellness management operations\n * Provides a foundation for implementing wellness management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific wellness management operations for different systems\n */\nexport abstract class BaseWellnessManagement {\n abstract fetchAppointments(\n request: IGetAppointmentsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchSessions(\n request: IGetSessionsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchCourses(\n request: IGetCoursesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchCategories(\n request: IGetCategoriesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItemCategory>>;\n\n abstract fetchBookableItemsFromCredit(\n request: IGetBookableItemsFromCreditRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>>;\n\n abstract fetchSessionAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse>;\n\n abstract fetchAppointmentAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse>;\n\n abstract fetchPractitioners(\n request: IGetPractitionersRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IOfferingResource>>;\n\n /**\n * Creates an external order for an offering booking in the integration platform.\n * This is the only booking-order operation exposed by the skeleton; all\n * provider-specific HTTP orchestration (add customer, add items, credits,\n * submit, etc.) should be encapsulated inside the concrete implementation.\n */\n abstract createOrder(\n request: ICreateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICreateOrderResponse>;\n\n abstract getOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetOrderResponse>;\n\n abstract cancelOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void>;\n\n abstract updateOrder(\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IUpdateOrderResponse>;\n\n /**\n * Abstract method to fetch a wellness appointment session\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session is fetched\n */\n abstract fetchWellnessAppointmentSession(): Promise<void>;\n\n /**\n * Abstract method to check availability of a wellness appointment session\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the availability check is completed\n */\n abstract checkWellnessAppointmentSessionAvailability(): Promise<void>;\n\n /**\n * Abstract method to create a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session order is created\n */\n abstract createWellnessAppointmentSessionOrder(): Promise<void>;\n\n /**\n * Abstract method to add items to a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the order items are added\n */\n abstract addWellnessAppointmentSessionOrderItems(): Promise<void>;\n\n /**\n * Abstract method to confirm a wellness appointment session order\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the appointment session order is confirmed\n */\n abstract confirmWellnessAppointmentSessionOrder(): Promise<void>;\n}\n","import {\n ICapabilityIntegration,\n ICredit,\n IGetCustomerCreditsRequest,\n} from '../../../integration-common-utils';\nimport { ISystemResponse } from '../../models/common.model';\n\n/**\n * Base abstract class for credit booking operations\n * Provides a foundation for implementing credit booking functionality\n *\n * This class should be extended by concrete implementations that provide\n * specific credit booking operations for different systems\n */\nexport abstract class BaseCreditBooking {\n /**\n * Abstract method to fetch customer credits\n * Must be implemented by concrete classes\n *\n * @param request - The request object containing the customer ID\n * @param integration - The integration object\n * @param loggedInUserId - The user ID of the logged in user\n * @returns Promise resolving to the system customer credits response (totalCount, records)\n */\n abstract fetchCustomerCredits(\n request: IGetCustomerCreditsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<ICredit>>;\n}\n","import {\n IAddCustomerRequest,\n IAddUpdateCustomerResponseData,\n ICustomer,\n IDeleteAPIResponse,\n IGetCustomerRequest,\n IUpdateCustomerRequest,\n IValidatedCapabilityIntegration,\n} from '../../../integration-common-utils';\n\n/**\n * Base abstract class for customer management operations\n * Provides a foundation for implementing customer management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different systems\n */\nexport abstract class BaseCustomerManagement {\n /**\n * Create a new customer.\n *\n * @returns Promise resolving to the created customer\n */\n abstract createCustomer(\n request: IAddCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICustomer>;\n\n /**\n * Abstract method to search for customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n abstract searchCustomer(\n request: IGetCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ICustomer | undefined>;\n\n /**\n * Update an existing customer.\n *\n * @returns Promise resolving to the updated customer data (e.g. id and fields)\n */\n abstract updateCustomer(\n customerId: string,\n request: IUpdateCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddUpdateCustomerResponseData>;\n\n /**\n * Abstract method to delete a customer.\n * Must be implemented by concrete classes.\n *\n * @param customerId - The customer ID to delete\n * @param integration - Validated capability integration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when the customer is deleted\n */\n abstract deleteCustomer(\n customerId: string,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IDeleteAPIResponse>;\n}\n","/**\n * Base abstract class for package management operations\n * Provides a foundation for implementing package management functionality\n * within capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific package management operations for different systems\n */\nexport abstract class BasePackageManagement {\n /**\n * Abstract method to fetch course types\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the course types are fetched\n */\n abstract fetchCourseTypes(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting contact management operations\n * Provides a foundation for implementing contact management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific contact management operations for different accounting systems\n */\nexport abstract class BaseAccountingContactManagement {\n /**\n * Abstract method to create an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is created\n */\n abstract createAccountingContactPerson(): Promise<void>;\n\n /**\n * Abstract method to update an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is updated\n */\n abstract updateAccountingContactPerson(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting contact person\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact person is deleted\n */\n abstract deleteAccountingContactPerson(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting credit note management operations\n * Provides a foundation for implementing credit note management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific credit note management operations for different accounting systems\n */\nexport abstract class BaseAccountingCreditNoteManagement {\n /**\n * Abstract method to create an accounting credit note\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the credit note is created\n */\n abstract createAccountingCreditNote(): Promise<void>;\n\n /**\n * Abstract method to apply an accounting credit note\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the credit note is applied\n */\n abstract applyAccountingCreditNote(): Promise<void>;\n\n /**\n * Abstract method to refund accounting excess payment\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the excess payment is refunded\n */\n abstract refundAccountingExcessPayment(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting customer management operations\n * Provides a foundation for implementing customer management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different accounting systems\n */\nexport abstract class BaseAccountingCustomerManagement {\n /**\n * Abstract method to create an accounting customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createAccountingCustomer(): Promise<void>;\n\n /**\n * Abstract method to list accounting contacts\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contacts are listed\n */\n abstract listAccountingContacts(): Promise<void>;\n\n /**\n * Abstract method to update an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact is updated\n */\n abstract updateAccountingContact(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact is deleted\n */\n abstract deleteAccountingContact(): Promise<void>;\n\n /**\n * Abstract method to change the status of an accounting contact\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the contact status is changed\n */\n abstract changeAccountingContactStatus(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting customer payment management operations\n * Provides a foundation for implementing customer payment management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer payment management operations for different accounting systems\n */\nexport abstract class BaseAccountingCustomerPaymentManagement {\n /**\n * Abstract method to create an accounting customer payment\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer payment is created\n */\n abstract createAccountingCustomerPayment(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting invoice management operations\n * Provides a foundation for implementing invoice management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific invoice management operations for different accounting systems\n */\nexport abstract class BaseAccountingInvoiceManagement {\n /**\n * Abstract method to create an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is created\n */\n abstract createAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to update an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is updated\n */\n abstract updateAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to delete an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is deleted\n */\n abstract deleteAccountingInvoice(): Promise<void>;\n\n /**\n * Abstract method to download an accounting invoice\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the invoice is downloaded\n */\n abstract downloadAccountingInvoice(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting chart of accounts (LOA) management operations\n * Provides a foundation for implementing chart of accounts management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific chart of accounts management operations for different accounting systems\n */\nexport abstract class BaseAccountingLOAManagement {\n /**\n * Abstract method to list accounting chart of accounts\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the chart of accounts is listed\n */\n abstract listAccountingChartOfAccounts(): Promise<void>;\n}\n","/**\n * Base abstract class for accounting tax management operations\n * Provides a foundation for implementing tax management functionality\n * within accounting capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific tax management operations for different accounting systems\n */\nexport abstract class BaseAccountingTaxManagement {\n /**\n * Abstract method to list accounting taxes\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the taxes are listed\n */\n abstract listAccountingTaxes(): Promise<void>;\n}\n","/**\n * Base abstract class for payment operations\n * Provides a foundation for implementing payment functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific payment operations for different payment systems\n */\nexport abstract class BasePayment {\n /**\n * Abstract method to create a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is created\n */\n abstract createPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to confirm a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is confirmed\n */\n abstract confirmPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to cancel a payment setup intent\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment setup intent is cancelled\n */\n abstract cancelPaymentSetupIntent(): Promise<void>;\n\n /**\n * Abstract method to create a payment ephemeral key\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment ephemeral key is created\n */\n abstract createPaymentEphemeralKey(): Promise<void>;\n}\n","/**\n * Base abstract class for payment method management operations\n * Provides a foundation for implementing payment method management functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific payment method management operations for different payment systems\n */\nexport abstract class BasePaymentMethodManagement {\n /**\n * Abstract method to create a payment method\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is created\n */\n abstract createPaymentMethod(): Promise<void>;\n\n /**\n * Abstract method to attach a payment method to a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is attached\n */\n abstract attachPaymentMethodToCustomer(): Promise<void>;\n\n /**\n * Abstract method to list payment methods for a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment methods are listed\n */\n abstract listPaymentMethodForCustomer(): Promise<void>;\n\n /**\n * Abstract method to detach a payment method from a customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the payment method is detached\n */\n abstract detachPaymentMethodFromCustomer(): Promise<void>;\n}\n","/**\n * Base abstract class for payment user management operations\n * Provides a foundation for implementing user management functionality\n * within payment capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific user management operations for different payment systems\n */\nexport abstract class BasePaymentUserManagement {\n /**\n * Abstract method to list payment customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customers are listed\n */\n abstract listPaymentCustomers(): Promise<void>;\n\n /**\n * Abstract method to create a new payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createPaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to update an existing payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is updated\n */\n abstract updatePaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to delete a payment customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is deleted\n */\n abstract deletePaymentCustomer(): Promise<void>;\n\n /**\n * Abstract method to search for payment customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n abstract searchPaymentCustomers(): Promise<void>;\n}\n","/**\n * Base abstract class for membership customer management operations\n * Provides a foundation for implementing customer management functionality\n * within membership capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific customer management operations for different membership systems\n */\nexport abstract class BaseMembershipCustomerManagement {\n /**\n * Abstract method to get all membership customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when all customers are retrieved\n */\n abstract getMembershipAllCustomers(): Promise<void>;\n\n /**\n * Abstract method to get a specific membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is retrieved\n */\n abstract getMembershipCustomer(): Promise<void>;\n\n /**\n * Abstract method to create a new membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is created\n */\n abstract createMembershipCustomer(): Promise<void>;\n\n /**\n * Abstract method to update an existing membership customer\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the customer is updated\n */\n abstract updateMembershipCustomer(): Promise<void>;\n}\n","/**\n * Base abstract class for membership management operations\n * Provides a foundation for implementing membership management functionality\n * within membership capabilities\n *\n * This class should be extended by concrete implementations that provide\n * specific membership management operations for different membership systems\n */\nexport abstract class BaseMembershipManagement {\n /**\n * Abstract method to get membership types\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the membership types are retrieved\n */\n abstract getMembershipTypes(): Promise<void>;\n\n /**\n * Abstract method to get a membership\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the membership is retrieved\n */\n abstract getMembership(): Promise<void>;\n}\n","import type {\n CAPABILITY_CATEGORY_ENUM,\n CAPABILITY_TYPE_ENUM,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability.model';\nimport type { CommonValidationDatabaseService } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/util/common-validation.util';\nimport {\n AddAPIResponse,\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\nimport type {\n IAddCapabilityIntegration,\n IAddCapabilityIntegrationInput,\n IGetCapabilityIntegrationInput,\n IGetCapabilityIntegrationResult,\n IUpdateCapabilityIntegration,\n} from '../../../integration-common-utils';\nimport type { IntegrationConfigurationDao } from '../../../integration-common-utils/dao/integration-configuration.dao';\nimport type { ICapabilityIntegration } from '../../models/capability-integration.model';\nimport type {\n IGetCapabilityIntegrationsRequest,\n IGetCapabilityIntegrationsResponse,\n IUpdateCapabilityIntegrationRequest,\n IUpdateCapabilityIntegrationResponse,\n} from '../../models/integration-configuration.model';\n\n@Injectable()\nexport class BaseIntegrationConfiguration {\n protected readonly fileName = 'integration-configuration.base.ts';\n\n constructor(\n protected readonly integrationConfigurationDao: IntegrationConfigurationDao,\n protected readonly commonValidationDatabaseService: CommonValidationDatabaseService,\n protected readonly logger: LoggerService,\n ) {}\n\n /**\n * Validates add-capability-integration input (project, property, parent, capability, provider, configuredFor).\n * Logic copied from project-ms CapabilityIntegrationService.validateAddCapabilityIntegrationInput.\n */\n private async validateAddCapabilityIntegrationInput(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<{\n capability: {\n id: bigint;\n type: CAPABILITY_TYPE_ENUM;\n category: CAPABILITY_CATEGORY_ENUM;\n providerId: bigint;\n };\n capabilityProvider: { id: bigint };\n }> {\n await this.commonValidationDatabaseService.getProject({\n projectId: input.projectId,\n });\n\n if (input.propertyId != null) {\n await this.commonValidationDatabaseService.getProperty({\n propertyId: input.propertyId,\n projectId: input.projectId,\n });\n }\n\n if (input.parentId != null) {\n const parentIntegration =\n await this.integrationConfigurationDao.getCapabilityIntegration(\n { capabilityIntegrationId: input.parentId },\n context.loggedInUserId,\n );\n if (!parentIntegration) {\n throw new Error('Parent capability integration not found');\n }\n }\n\n const [capability, capabilityProvider] = await Promise.all([\n this.integrationConfigurationDao.getCapability(\n { capabilityId: input.capabilityId },\n context.loggedInUserId,\n ),\n this.integrationConfigurationDao.getCapabilityProvider(\n { capabilityProviderId: input.capabilityProviderId },\n context.loggedInUserId,\n ),\n ]);\n\n if (!capability) {\n throw new Error('Capability not found');\n }\n\n if (!capabilityProvider) {\n throw new Error('Capability provider not found');\n }\n\n if (capability.providerId !== capabilityProvider.id) {\n throw new Error(\n `Capability provider mismatch: capabilityId=${capability.id}, capabilityProviderId=${capability.providerId}`,\n );\n }\n\n return {\n capability: {\n id: capability.id,\n type: capability.type,\n category: capability.category,\n providerId: capability.providerId,\n },\n capabilityProvider: { id: capabilityProvider.id },\n };\n }\n\n /**\n * Add a capability integration (validate then persist via DAO).\n * Same name as project MS call: addCapabilityIntegration.\n */\n async addCapabilityIntegration(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<AddAPIResponse> {\n const { capability, capabilityProvider } =\n await this.validateAddCapabilityIntegrationInput(input, context);\n\n const addCapabilityIntegrationInput: IAddCapabilityIntegration = {\n ...input,\n providerId: capabilityProvider.id,\n createdBy: context.loggedInUserId,\n type: capability.type,\n category: capability.category,\n availableFor: input.availableFor,\n configuredFor: input.configuredFor,\n };\n\n // Create the capability integration\n const result =\n await this.integrationConfigurationDao.addCapabilityIntegration(\n addCapabilityIntegrationInput,\n context.loggedInUserId,\n );\n\n // Validate that the integration was created successfully\n if (!result || !result.id) {\n throw new Error('Failed to add capability integration');\n }\n\n return result;\n }\n\n /**\n * Update capability integration with config merging support.\n * Handles merging of integrationConfig and platformConfig from existing integration.\n *\n * @param request - Update request with id and updateData\n * @param integration - Optional existing integration for config merging\n * @param loggedInUserId - User ID for logging and audit\n * @returns Promise resolving to update status\n */\n async updateCapabilityIntegration(\n request: IUpdateCapabilityIntegrationRequest,\n integration?: ICapabilityIntegration,\n loggedInUserId?: bigint,\n ): Promise<IUpdateCapabilityIntegrationResponse> {\n if (!loggedInUserId) {\n throw new Error('loggedInUserId is required');\n }\n\n // Validate icon and nickname if needed (can be overridden in subclasses)\n this.validateIconAndNickName(request.updateData, loggedInUserId);\n\n let configToUpdate: Record<string, unknown> | undefined;\n const updateData = request.updateData;\n\n // Merge config if both updateData.config and integration.config exist\n if (updateData.config && integration?.config) {\n const existingConfig = integration.config as Record<string, unknown>;\n\n configToUpdate = {\n ...existingConfig,\n };\n\n // Merge integrationConfig - always merge existing with update data\n const existingIntegrationConfig =\n (existingConfig.integrationConfig as\n | Record<string, unknown>\n | undefined) || {};\n configToUpdate.integrationConfig = {\n ...existingIntegrationConfig,\n ...updateData.config.integrationConfig,\n };\n\n // Merge platformConfig - always merge existing with update data\n const existingPlatformConfig =\n (existingConfig.platformConfig as\n | Record<string, unknown>\n | undefined) || {};\n configToUpdate.platformConfig = {\n ...existingPlatformConfig,\n ...updateData.config.platformConfig,\n };\n } else if (updateData.config) {\n // No existing config, use updateData.config as-is\n configToUpdate = updateData.config as unknown as Record<string, unknown>;\n }\n\n // Prepare update data for DAO\n const updateDataForDao: IUpdateCapabilityIntegration = {\n nickname: updateData.nickname,\n icon: updateData.icon as unknown,\n config: configToUpdate as unknown,\n parentId: updateData.parentId,\n updatedBy: loggedInUserId,\n };\n\n return await this.integrationConfigurationDao.updateCapabilityIntegration(\n { id: request.id, updateData: updateDataForDao },\n loggedInUserId,\n );\n }\n\n /**\n * Validates icon and nickname. Can be overridden in subclasses for provider-specific validation.\n */\n protected validateIconAndNickName(\n updateData: IUpdateCapabilityIntegrationRequest['updateData'],\n loggedInUserId: bigint,\n ): void {\n // Validate nickname if present\n if (\n updateData.nickname !== undefined &&\n (updateData.nickname === '' || updateData.nickname.trim() === '')\n ) {\n this.logger.error(\n loggedInUserId,\n this.validateIconAndNickName.name,\n this.fileName,\n 'Validation failed: nickname cannot be empty or null',\n );\n throw new Error('Nickname cannot be empty');\n }\n\n // Validate iconName if icon is present\n if (\n updateData.icon &&\n updateData.icon.meta &&\n typeof updateData.icon.meta === 'object'\n ) {\n const meta = updateData.icon.meta as Record<string, unknown>;\n\n if (\n meta.iconName !== undefined &&\n (meta.iconName === null ||\n meta.iconName === '' ||\n (typeof meta.iconName === 'string' && meta.iconName.trim() === ''))\n ) {\n this.logger.error(\n loggedInUserId,\n this.validateIconAndNickName.name,\n this.fileName,\n 'Validation failed: iconName cannot be empty',\n );\n throw new Error('Icon name cannot be empty');\n }\n }\n }\n\n /**\n * Get capability integrations with pagination, filtering, sorting, and search.\n * Delegates to DAO for database operations.\n *\n * @param request - Request with projectId, category, and options\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to list of capability integrations with total count\n */\n async getCapabilityIntegrations(\n request: IGetCapabilityIntegrationsRequest,\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationsResponse> {\n return await this.integrationConfigurationDao.getCapabilityIntegrations(\n request,\n loggedInUserId,\n );\n }\n\n /**\n * Get capability integration by id or by fetchBy (configuredFor).\n * Same business logic as project-ms CapabilityIntegrationService.getCapabilityIntegration.\n */\n async getCapabilityIntegration(\n input: IGetCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<IGetCapabilityIntegrationResult> {\n if (!input.projectId) {\n throw new Error('Project ID is required');\n }\n\n await this.commonValidationDatabaseService.getProject({\n projectId: input.projectId,\n });\n\n let integration: IGetCapabilityIntegrationResult | undefined;\n\n if (input.id) {\n integration =\n await this.integrationConfigurationDao.getCapabilityIntegrationById(\n {\n id: input.id,\n projectId: input.projectId,\n category: input.category,\n },\n context.loggedInUserId,\n );\n } else if (input.fetchBy) {\n integration =\n await this.integrationConfigurationDao.getCapabilityIntegrationByProvider(\n {\n projectId: input.projectId,\n category: input.fetchBy.category ?? input.category,\n configuredForType: input.fetchBy.configuredForType,\n configuredForId: BigInt(input.fetchBy.configuredForId),\n },\n context.loggedInUserId,\n );\n }\n\n if (!integration) {\n throw new Error('Capability integration not found');\n }\n\n return integration;\n }\n}\n","import { IntegrationResourceManagementDao } from '../../../integration-common-utils/dao/integration-resource-management.dao';\nimport {\n IAddResourceToIntegrationInput,\n IAddResourceToIntegrationResponse,\n IRemoveResourceFromIntegrationRequest,\n IRemoveResourceFromIntegrationResponse,\n IUpdateOfferingIntegrationResourceConfigurationInput,\n IUpdateOfferingIntegrationResourceConfigurationResponse,\n} from '../../../integration-operation-skeletons/models/integration-resource-management.model';\nimport {\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\n/**\n * Base abstract class for integration resource management operations.\n * Holds only inter-service implementation (DAO calls). Validation (config, mapping exists)\n * lives in provider wrappers (e.g. TrybeIntegrationResourceManagementService).\n * MS is responsible for getOffering, getIntegration, updateOffering, runAfterAddIfNeeded.\n */\nexport abstract class BaseIntegrationResourceManagement {\n private readonly fileName = 'integration-resource-management.base';\n\n constructor(\n protected readonly integrationResourceManagementDao: IntegrationResourceManagementDao,\n protected readonly logger: LoggerService,\n ) {}\n\n /**\n * Adds a resource (capability integration) to an offering integration via UIF.\n * Inter-service implementation only: performs DAO insert. Wrapper must validate\n * config and mapping-exists before calling; caller (MS) does getOffering, getIntegration,\n * updateOffering and runAfterAddIfNeeded.\n *\n * @param input - projectId, offeringId, capabilityIntegrationId, optional config\n * @param context - GraphQL context\n * @returns Promise resolving to { status, ids }\n */\n async addResourceToIntegration(\n input: IAddResourceToIntegrationInput,\n context: GraphQLContext,\n ): Promise<IAddResourceToIntegrationResponse> {\n this.logger.info(\n context.loggedInUserId,\n this.addResourceToIntegration.name,\n this.fileName,\n 'addResourceToIntegration called',\n {\n offeringId: input.offeringId.toString(),\n capabilityIntegrationId: input.capabilityIntegrationId.toString(),\n },\n );\n\n const addResult =\n await this.integrationResourceManagementDao.addCapabilityIntegrationMapping(\n {\n projectId: input.projectId,\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n config: input.config,\n },\n context,\n );\n\n const result: IAddResourceToIntegrationResponse = {\n status: addResult.status,\n ids: addResult.ids,\n };\n\n this.logger.info(\n context.loggedInUserId,\n this.addResourceToIntegration.name,\n this.fileName,\n 'addResourceToIntegration completed',\n { status: result.status, idsCount: result.ids.length },\n );\n\n return result;\n }\n\n /**\n * Removes a resource from an offering integration.\n * Generic validation and DAO call; Trybe service adds mapping-exists check before calling.\n */\n async removeResourceFromIntegration(\n request: IRemoveResourceFromIntegrationRequest,\n context: GraphQLContext,\n ): Promise<IRemoveResourceFromIntegrationResponse> {\n const result =\n await this.integrationResourceManagementDao.removeCapabilityIntegrationMapping(\n {\n capabilityIntegrationId: request.capabilityIntegrationId,\n configuredForId: request.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context,\n );\n\n return { status: result.status };\n }\n\n /**\n * Updates offering integration resource configuration (cap_integ_resource_mapping.config by id).\n * Inter-service implementation only: performs DAO update. Wrapper must validate config before calling\n * (e.g. Trybe validates via validateResourceMappingConfig). Caller (MS) does getOffering,\n * getIntegration, and runAfterUpdateIfNeeded (e.g. handleTrybeIntegration).\n *\n * @param input - id (resource mapping row id), config\n * @param context - GraphQL context\n * @returns Promise resolving to { status }\n */\n async updateOfferingIntegrationResourceConfiguration(\n input: IUpdateOfferingIntegrationResourceConfigurationInput,\n context: GraphQLContext,\n ): Promise<IUpdateOfferingIntegrationResourceConfigurationResponse> {\n this.logger.info(\n context.loggedInUserId,\n this.updateOfferingIntegrationResourceConfiguration.name,\n this.fileName,\n 'updateOfferingIntegrationResourceConfiguration called',\n { id: input.id.toString() },\n );\n\n const result =\n await this.integrationResourceManagementDao.updateCapabilityIntegrationConfiguration(\n {\n id: input.id,\n config: input.config,\n },\n context,\n );\n\n this.logger.info(\n context.loggedInUserId,\n this.updateOfferingIntegrationResourceConfiguration.name,\n this.fileName,\n 'updateOfferingIntegrationResourceConfiguration completed',\n { status: result.status },\n );\n\n return { status: result.status };\n }\n}\n","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = value.constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'common';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: GeneratedColumnConfig<unknown> | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tgenerated: T['generated'] extends object ? T['generated'] : undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentityByDefault<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tgenerated: { as: any; type: TType };\n\t};\n};\n\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this>;\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: TDialect extends 'common' ? Column<MakeColumnConfig<TBuilder['_'], TTableName>>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn : never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, TConfigMap[Key], TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n","import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown>) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport type { PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap,\n\textraConfig: ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig) | undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(columns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(columns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn table;\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[PgTable.Symbol.Name],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[PgTable.Symbol.Name],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[PgTable.Symbol.Name]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Update } from '~/utils.ts';\n\nimport type { SQL } from '~/index.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray(size?: number): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tgenerated: GeneratedColumnConfig<T['data']>;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport class PgArrayBuilder<\n\tT extends ColumnBuilderBaseConfig<'array', 'PgArray'>,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: PgColumnBuilder<TBase>;\n\t\tsize: number | undefined;\n\t},\n\t{\n\t\tbaseBuilder: PgColumnBuilder<TBase>;\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: number | undefined,\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName>, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName>, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'>,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T> {\n\treadonly size: number | undefined;\n\n\tstatic readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t\tgenerated: undefined;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: string, enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Gratitude to zod for the enum function types\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>> {\n\treturn pgEnumWithSchema(enumName, values, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t};\n\n\tconstructor(sql: SQL, selection: Record<string, unknown>, alias: string, isWith = false) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: selection as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic readonly [entityKind]: string = 'WithSubquery';\n}\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import { entityKind, is } from '~/entity.ts';\nimport type { SelectedFields } from '~/operations.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(chunk.name), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(chunk.name), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: SelectedFields<AnyColumn, Table>;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: SelectedFields<AnyColumn, Table>;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n","import {\n appConstants,\n MAX_RECORDS_LENGTH,\n schema,\n} from '@dv4resi/dvss-backend-module-datastore';\nimport { SORTING_ORDER_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/commons/common.enum';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport { CAPABILITY_INTEGRATION_STATUS_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability-integration.model';\nimport {\n type ICapability,\n CAPABILITY_TYPE_ENUM,\n type CAPABILITY_CATEGORY_ENUM,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability.model';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n and,\n asc,\n desc,\n eq,\n getTableColumns,\n isNotNull,\n isNull,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport type { MySqlColumn } from 'drizzle-orm/mysql-core';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\n\nimport type { ICapabilityIntegration } from '../../integration-operation-skeletons/models/capability-integration.model';\nimport type {\n IGetCapabilityIntegrationsRequest,\n IGetCapabilityIntegrationsResponse,\n} from '../../integration-operation-skeletons/models/integration-configuration.model';\nimport {\n IAddCapabilityIntegration,\n IAddCapIntegResourceMapping,\n IUpdateCapabilityIntegration,\n type IGetCapabilityIntegrationResult,\n} from './models';\n\n/**\n * DAO for integration-configuration persistence (offering get/update).\n * Performs actual DB calls using datastore schema; conn is injected by the host app.\n */\n@Injectable()\nexport class IntegrationConfigurationDao {\n private readonly fileName = 'integration-configuration.dao';\n\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n private readonly conn: MySql2Database<typeof schema>,\n private readonly logger: LoggerService,\n ) {}\n\n async addCapabilityIntegration(\n input: IAddCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<{ id: bigint } | undefined> {\n // Log the attempt to add a capability integration\n this.logger.info(\n loggedInUserId,\n this.addCapabilityIntegration.name,\n this.fileName,\n `CapabilityDaoService -> addCapabilityIntegration called`,\n );\n\n try {\n // Run operations in a transaction\n return this.conn.transaction(async (tx) => {\n // Insert the capability integration record and get its ID\n const [integrationResult] = await tx\n .insert(schema.capabilityIntegration)\n .values(input)\n .$returningId();\n\n if (!integrationResult.id) {\n // rollback if insertion failed\n tx.rollback();\n return;\n }\n\n // Add mapping if configuredFor is provided\n if (input.configuredFor) {\n const insertData: IAddCapIntegResourceMapping = {\n capabilityIntegrationId: integrationResult.id,\n configuredForId: input.configuredFor.configuredForId,\n configuredForType: input.configuredFor.configuredForType,\n status: CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n projectId: input.projectId,\n createdAt: new Date(),\n createdBy: loggedInUserId,\n };\n\n await tx.insert(schema.capIntegResourceMapping).values(insertData);\n }\n\n return { id: integrationResult.id };\n });\n } catch (error) {\n // Log and rethrow\n this.logger.error(\n loggedInUserId,\n this.addCapabilityIntegration.name,\n this.fileName,\n 'Error in addCapabilityIntegration',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability by id (for add-capability-integration validation).\n * Copied from project-ms CapabilityDaoService.getCapability.\n */\n async getCapability(\n request: { capabilityId: bigint },\n loggedInUserId: bigint,\n ): Promise<ICapability | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapability.name,\n this.fileName,\n 'getCapability called',\n { request },\n );\n\n return await this.conn.query.capability.findFirst({\n where: and(\n eq(schema.capability.id, request.capabilityId),\n isNull(schema.capability.deletedAt),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapability.name,\n this.fileName,\n 'Error on getCapability',\n error,\n { request },\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability provider by id (for add-capability-integration validation).\n * Copied from project-ms CapabilityProviderDao.getCapabilityProvider.\n */\n async getCapabilityProvider(\n request: { capabilityProviderId: bigint },\n loggedInUserId: bigint,\n ): Promise<typeof schema.capabilityProvider.$inferSelect | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityProvider.name,\n this.fileName,\n 'getCapabilityProvider called',\n { request },\n );\n\n return await this.conn.query.capabilityProvider.findFirst({\n where: and(\n eq(schema.capabilityProvider.id, request.capabilityProviderId),\n isNull(schema.capabilityProvider.deletedAt),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityProvider.name,\n this.fileName,\n 'Error on getCapabilityProvider',\n error,\n { request },\n );\n\n throw error;\n }\n }\n\n /**\n * Updates capability integration in the database.\n * Copied from project-ms CapabilityIntegrationDao.updateCapabilityIntegration.\n *\n * @param input - Object containing the integration ID and update data\n * @param loggedInUserId - User ID for logging\n * @returns Promise that resolves to the update operation status\n */\n async updateCapabilityIntegration(\n input: {\n id: bigint;\n updateData: IUpdateCapabilityIntegration;\n },\n loggedInUserId: bigint,\n ): Promise<{ status: boolean }> {\n try {\n this.logger.info(\n loggedInUserId,\n this.updateCapabilityIntegration.name,\n this.fileName,\n 'Updating capability integration',\n );\n\n const response = await this.conn\n .update(schema.capabilityIntegration)\n .set({\n ...input.updateData,\n })\n .where(eq(schema.capabilityIntegration.id, input.id));\n\n return {\n status: response[0].affectedRows > 0,\n };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.updateCapabilityIntegration.name,\n this.fileName,\n 'Error updating capability integration',\n error,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability integration by id (for parent validation when parentId is set).\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegration.\n */\n async getCapabilityIntegration(\n input: { capabilityIntegrationId: bigint },\n loggedInUserId: bigint,\n ): Promise<typeof schema.capabilityIntegration.$inferSelect | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegration.name,\n this.fileName,\n 'getCapabilityIntegration called',\n input,\n );\n\n return await this.conn.query.capabilityIntegration.findFirst({\n where: and(\n isNull(schema.capabilityIntegration.deletedAt),\n eq(schema.capabilityIntegration.id, input.capabilityIntegrationId),\n ),\n });\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegration.name,\n this.fileName,\n 'Error on getCapabilityIntegration',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Retrieves capability integration by ID with resource mapping details.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrationById.\n */\n async getCapabilityIntegrationById(\n request: {\n id: bigint;\n projectId: number;\n category?: CAPABILITY_CATEGORY_ENUM;\n },\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationResult | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationById.name,\n this.fileName,\n 'getCapabilityIntegrationById called',\n request,\n );\n\n const conditions = [\n eq(schema.capabilityIntegration.id, request.id),\n eq(schema.capabilityIntegration.projectId, request.projectId),\n eq(schema.capabilityIntegration.type, CAPABILITY_TYPE_ENUM.INTEGRATION),\n eq(\n schema.capabilityIntegration.status,\n CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n ),\n isNull(schema.capabilityIntegration.deletedAt),\n isNull(schema.capability.deletedAt),\n ];\n\n if (request.category) {\n conditions.push(\n eq(schema.capabilityIntegration.category, request.category),\n );\n }\n\n const response = await this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n resourceMappingId: schema.capIntegResourceMapping.id,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n resourceMappingConfig: schema.capIntegResourceMapping.config,\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .innerJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n .leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(schema.capIntegResourceMapping.projectId, request.projectId),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .where(and(...conditions));\n\n return response[0] as unknown as\n | IGetCapabilityIntegrationResult\n | undefined;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationById.name,\n this.fileName,\n 'Error on getCapabilityIntegrationById',\n error,\n request,\n );\n\n throw error;\n }\n }\n\n /**\n * Retrieves capability integration by provider type and resource mapping.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrationByProvider.\n */\n async getCapabilityIntegrationByProvider(\n request: {\n projectId: number;\n category?: CAPABILITY_CATEGORY_ENUM;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n configuredForId: bigint;\n },\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationResult | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationByProvider.name,\n this.fileName,\n 'getCapabilityIntegrationByProvider called',\n request,\n );\n\n const conditions = [\n isNull(schema.capability.deletedAt),\n eq(schema.capabilityIntegration.projectId, request.projectId),\n eq(schema.capabilityIntegration.type, CAPABILITY_TYPE_ENUM.INTEGRATION),\n eq(\n schema.capabilityIntegration.status,\n CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n ),\n isNull(schema.capabilityIntegration.deletedAt),\n eq(schema.capIntegResourceMapping.projectId, request.projectId),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n request.configuredForType,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n request.configuredForId,\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ];\n\n if (request.category) {\n conditions.push(\n eq(schema.capabilityIntegration.category, request.category),\n );\n }\n\n const response = await this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n resourceMappingId: schema.capIntegResourceMapping.id,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n resourceMappingConfig: schema.capIntegResourceMapping.config,\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .innerJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n .innerJoin(\n schema.capIntegResourceMapping,\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n )\n .where(and(...conditions));\n\n return response[0] as unknown as\n | IGetCapabilityIntegrationResult\n | undefined;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationByProvider.name,\n this.fileName,\n 'Error on getCapabilityIntegrationByProvider',\n error,\n request,\n );\n\n throw error;\n }\n }\n\n /**\n * Get capability integrations with pagination, filtering, sorting, and search.\n * Copied from project-ms CapabilityIntegrationDao.getCapabilityIntegrations.\n */\n async getCapabilityIntegrations(\n input: IGetCapabilityIntegrationsRequest,\n loggedInUserId: bigint,\n ): Promise<IGetCapabilityIntegrationsResponse> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrations.name,\n this.fileName,\n 'getCapabilityIntegrations called',\n input,\n );\n\n const count = input.options?.count ?? MAX_RECORDS_LENGTH;\n const offset = ((input.options?.page ?? 1) - 1) * count;\n\n const sorting = input.options?.sorting;\n let sortBy: MySqlColumn = schema.capabilityIntegration.id;\n\n if (sorting?.by === 'CREATED_AT') {\n sortBy = schema.capabilityIntegration.createdAt;\n } else if (sorting?.by === 'UPDATED_AT') {\n sortBy = schema.capabilityIntegration.updatedAt;\n }\n\n const sortOrder: SQL =\n sorting?.order === SORTING_ORDER_ENUM.ASC ? asc(sortBy) : desc(sortBy);\n const searchTerm = input.options?.search;\n\n // Determine if we need capability table join (for search, provider filter)\n const shouldJoinCapability =\n Boolean(searchTerm) ||\n Boolean(\n input.options?.filters?.some(\n (filter) => filter.by === 'PROVIDER_INTEGRATION_TYPE',\n ),\n );\n\n // Build where conditions for data query\n const whereConditions: SQL[] = [\n eq(schema.capabilityIntegration.projectId, input.projectId),\n isNull(schema.capabilityIntegration.deletedAt),\n ];\n\n if (input.category) {\n whereConditions.push(\n eq(\n schema.capabilityIntegration.category,\n input.category as CAPABILITY_CATEGORY_ENUM,\n ),\n );\n }\n\n // Apply filters\n if (input.options?.filters && input.options.filters.length > 0) {\n this.applyFilters(whereConditions, input.options);\n }\n\n if (searchTerm) {\n const searchPattern = `%${searchTerm}%`;\n whereConditions.push(\n sql`(${schema.capabilityIntegration.nickname} LIKE ${searchPattern} OR ${schema.capability.name} LIKE ${searchPattern})`,\n );\n }\n\n // Add capability deletedAt check if capability join is present\n if (shouldJoinCapability) {\n whereConditions.push(isNull(schema.capability.deletedAt));\n }\n\n // Filter out NULL mappings when propertyId is provided\n if (input.propertyId) {\n whereConditions.push(isNotNull(schema.capIntegResourceMapping.id));\n }\n\n // Build count query\n const countWhereConditions: SQL[] = [\n eq(schema.capabilityIntegration.projectId, input.projectId),\n isNull(schema.capabilityIntegration.deletedAt),\n ];\n\n if (input.category) {\n countWhereConditions.push(\n eq(\n schema.capabilityIntegration.category,\n input.category as CAPABILITY_CATEGORY_ENUM,\n ),\n );\n }\n\n if (input.options?.filters && input.options.filters.length > 0) {\n this.applyFilters(countWhereConditions, input.options);\n }\n\n if (searchTerm) {\n const searchPattern = `%${searchTerm}%`;\n countWhereConditions.push(\n sql`(${schema.capabilityIntegration.nickname} LIKE ${searchPattern} OR ${schema.capability.name} LIKE ${searchPattern})`,\n );\n }\n\n const countQueryBuilder = this.conn\n .select({\n count: sql`count(distinct ${schema.capabilityIntegration.id})`.as(\n 'count',\n ),\n })\n .from(schema.capabilityIntegration);\n\n const countQueryWithJoins = shouldJoinCapability\n ? countQueryBuilder.leftJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n )\n : countQueryBuilder;\n\n if (shouldJoinCapability) {\n countWhereConditions.push(isNull(schema.capability.deletedAt));\n }\n\n const countQueryWithPropertyJoin = input.propertyId\n ? countQueryWithJoins.leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n CONFIGURED_FOR_TYPE_ENUM.PROPERTY,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n BigInt(input.propertyId),\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n : countQueryWithJoins;\n\n if (input.propertyId) {\n countWhereConditions.push(isNotNull(schema.capIntegResourceMapping.id));\n }\n\n const countQuery = countQueryWithPropertyJoin.where(\n and(...countWhereConditions),\n );\n\n // Build data query\n const baseQuery = this.conn\n .select({\n ...getTableColumns(schema.capabilityIntegration),\n provider: schema.capability.providerIntegrationType,\n })\n .from(schema.capabilityIntegration)\n .leftJoin(\n schema.capability,\n eq(schema.capability.id, schema.capabilityIntegration.capabilityId),\n );\n\n const finalQuery = input.propertyId\n ? baseQuery\n .leftJoin(\n schema.capIntegResourceMapping,\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n schema.capabilityIntegration.id,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n CONFIGURED_FOR_TYPE_ENUM.PROPERTY,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n BigInt(input.propertyId),\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .where(and(...whereConditions))\n : baseQuery.where(and(...whereConditions));\n\n // Execute queries in parallel\n const [{ count: totalCount }, records] = await Promise.all([\n countQuery.execute().then((result) => result[0]),\n finalQuery.limit(count).offset(offset).orderBy(sortOrder).execute(),\n ]);\n\n return {\n totalCount: Number(totalCount) || 0,\n records: records as unknown as ICapabilityIntegration[],\n };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrations.name,\n this.fileName,\n 'Error in getCapabilityIntegrations',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Applies filters to where conditions.\n */\n private applyFilters(\n whereConditions: SQL[],\n filters: IGetCapabilityIntegrationsRequest['options'] | undefined,\n ): void {\n if (!filters || !filters.filters) {\n return;\n }\n\n for (const filter of filters.filters) {\n const filterValues = filter.values;\n\n if (!filterValues || filterValues.length === 0) {\n continue;\n }\n\n switch (filter.by) {\n case 'PROVIDER_INTEGRATION_TYPE': {\n const valuePlaceholders = filterValues.map(\n (value) => sql`${String(value)}`,\n );\n const joinedValues = sql.join(valuePlaceholders, sql`, `);\n whereConditions.push(\n sql`${schema.capability.providerIntegrationType} IN (${joinedValues})`,\n );\n break;\n }\n\n case 'CAPABILITY_INTEGRATION_TYPE': {\n const parentConditions: SQL[] = [];\n\n for (const value of filterValues) {\n const upperValue = String(value).toUpperCase();\n\n if (upperValue === 'PARENT') {\n parentConditions.push(\n isNull(schema.capabilityIntegration.parentId),\n );\n } else if (upperValue === 'CHILD') {\n parentConditions.push(\n isNotNull(schema.capabilityIntegration.parentId),\n );\n }\n }\n\n if (parentConditions.length === 1) {\n whereConditions.push(parentConditions[0]);\n } else if (parentConditions.length > 1) {\n const orCondition = or(...parentConditions);\n\n if (orCondition) {\n whereConditions.push(orCondition);\n }\n }\n break;\n }\n }\n }\n }\n}\n","import { appConstants, schema } from '@dv4resi/dvss-backend-module-datastore';\nimport { Inject, Injectable } from '@nestjs/common';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\n\n/**\n * DAO for integration user-management persistence.\n * Performs actual DB calls using datastore schema; conn is injected by the host app.\n */\n@Injectable()\nexport class IntegrationUserManagementDao {\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n protected readonly conn: MySql2Database<typeof schema>,\n ) {}\n}\n","import { appConstants, schema } from '@dv4resi/dvss-backend-module-datastore';\nimport type { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport { CAPABILITY_INTEGRATION_STATUS_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models/capability-integration.model';\nimport {\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { and, eq, isNull } from 'drizzle-orm';\nimport type { MySql2Database } from 'drizzle-orm/mysql2';\nimport {\n IAddCapabilityIntegrationMappingResponse,\n ICapabilityIntegrationResourceMappingRow,\n IDeleteAPIResponse,\n IUpdateAPIResponse,\n} from './models';\n\n/**\n * DAO for integration resource management (cap_integ_resource_mapping).\n * Provides checkMappingExists and removeCapabilityIntegrationMapping so UIF/callers\n * can validate and remove capability integration mappings without inter-service calls.\n */\n@Injectable()\nexport class IntegrationResourceManagementDao {\n private readonly fileName = 'integration-resource-management.dao';\n\n constructor(\n @Inject(appConstants.DB_CONNECTION)\n private readonly conn: MySql2Database<typeof schema>,\n private readonly logger: LoggerService,\n ) {}\n\n /**\n * Adds a capability integration resource mapping (insert into cap_integ_resource_mapping).\n * Replaces inter-service gRPC call to project-onboarding-ms for add configurations.\n *\n * @param input - projectId, capabilityIntegrationId, configuredForId, configuredForType, optional config\n * @param context - GraphQL context for loggedInUserId\n * @returns Promise resolving to { status: true, ids: [insertedId] } or { status: false, ids: [] }\n */\n async addCapabilityIntegrationMapping(\n input: {\n projectId: number;\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n config?: Record<string, unknown>;\n },\n context: GraphQLContext,\n ): Promise<IAddCapabilityIntegrationMappingResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n 'Adding capability integration mapping',\n input,\n );\n\n const insertResult = await this.conn\n .insert(schema.capIntegResourceMapping)\n .values({\n projectId: input.projectId,\n status: CAPABILITY_INTEGRATION_STATUS_ENUM.ACTIVE,\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.configuredForId,\n configuredForType: input.configuredForType,\n config: input.config ?? null,\n createdBy: context.loggedInUserId,\n });\n\n const raw = insertResult as unknown as { insertId?: number | string }[];\n const insertedId = raw[0]?.insertId != null ? Number(raw[0].insertId) : 0;\n const isInserted = insertedId > 0;\n const ids = isInserted ? [BigInt(insertedId)] : [];\n\n this.logger.info(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n `Mapping add ${isInserted ? 'successful' : 'failed'}`,\n { insertedId, status: isInserted },\n );\n\n return { status: isInserted, ids };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.addCapabilityIntegrationMapping.name,\n this.fileName,\n 'Error adding capability integration mapping',\n error,\n input,\n );\n throw error;\n }\n }\n\n /**\n * Checks if a capability integration resource mapping exists.\n * Validates that the mapping exists for the given capability integration, configured for ID and type.\n *\n * @param input - Input containing capability integration ID, configured for ID and type\n * @param loggedInUserId - ID of the user performing the operation\n * @returns Promise that resolves to true if mapping exists, false otherwise\n */\n async checkMappingExists(\n input: {\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n },\n loggedInUserId: bigint,\n ): Promise<boolean> {\n try {\n this.logger.info(\n loggedInUserId,\n this.checkMappingExists.name,\n this.fileName,\n `${this.checkMappingExists.name} called`,\n input,\n );\n\n const response = await this.conn\n .select({ id: schema.capIntegResourceMapping.id })\n .from(schema.capIntegResourceMapping)\n .where(\n and(\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n input.capabilityIntegrationId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n input.configuredForId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n input.configuredForType,\n ),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .limit(1);\n\n return response.length > 0;\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.checkMappingExists.name,\n this.fileName,\n 'Error in checkMappingExists',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Removes capability integration resource mapping (soft delete).\n * Sets deletedAt and deletedBy on the matching cap_integ_resource_mapping row.\n * Use this from UIF/callers instead of inter-service call to project-onboarding-ms.\n *\n * @param input - Delete parameters including capability integration ID, configured for ID and type\n * @param loggedInUserId - ID of the user performing the operation\n * @returns Promise resolving to { status: true } if any row was updated, { status: false } otherwise\n */\n async removeCapabilityIntegrationMapping(\n input: {\n capabilityIntegrationId: bigint;\n configuredForId: bigint;\n configuredForType: CONFIGURED_FOR_TYPE_ENUM;\n },\n context: GraphQLContext,\n ): Promise<IDeleteAPIResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n 'Removing capability integration mapping',\n input,\n );\n\n // Build where conditions for the delete operation - match on capability_integration_id, configured_for_id, and configured_for_type\n const whereConditions = [\n isNull(schema.capIntegResourceMapping.deletedAt),\n eq(\n schema.capIntegResourceMapping.capabilityIntegrationId,\n input.capabilityIntegrationId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForId,\n input.configuredForId,\n ),\n eq(\n schema.capIntegResourceMapping.configuredForType,\n input.configuredForType,\n ),\n ];\n\n // Perform soft delete\n const deleteResult = await this.conn\n .update(schema.capIntegResourceMapping)\n .set({\n deletedAt: new Date(),\n deletedBy: context.loggedInUserId,\n })\n .where(and(...whereConditions));\n\n const isSuccess = deleteResult[0].affectedRows > 0;\n\n this.logger.info(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n `Mapping removal ${isSuccess ? 'successful' : 'failed - no matching records'}`,\n { affectedRows: deleteResult[0].affectedRows },\n );\n\n return { status: isSuccess };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.removeCapabilityIntegrationMapping.name,\n this.fileName,\n 'Error removing capability integration mapping',\n error,\n input,\n );\n\n throw error;\n }\n }\n\n /**\n * Gets a capability integration resource mapping by id (non-deleted only).\n * Use from UIF wrappers to validate mapping exists before update.\n *\n * @param id - cap_integ_resource_mapping.id\n * @param loggedInUserId - for logging\n * @returns The mapping row or undefined if not found\n */\n async getCapabilityIntegrationResourceMappingById(\n id: bigint,\n loggedInUserId: bigint,\n ): Promise<ICapabilityIntegrationResourceMappingRow | undefined> {\n try {\n this.logger.info(\n loggedInUserId,\n this.getCapabilityIntegrationResourceMappingById.name,\n this.fileName,\n `${this.getCapabilityIntegrationResourceMappingById.name} called`,\n { id: id.toString() },\n );\n\n const rows = await this.conn\n .select({\n id: schema.capIntegResourceMapping.id,\n capabilityIntegrationId:\n schema.capIntegResourceMapping.capabilityIntegrationId,\n configuredForId: schema.capIntegResourceMapping.configuredForId,\n configuredForType: schema.capIntegResourceMapping.configuredForType,\n })\n .from(schema.capIntegResourceMapping)\n .where(\n and(\n eq(schema.capIntegResourceMapping.id, id),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n )\n .limit(1);\n\n return rows[0];\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.getCapabilityIntegrationResourceMappingById.name,\n this.fileName,\n 'Error in getCapabilityIntegrationResourceMappingById',\n error,\n { id: id.toString() },\n );\n throw error;\n }\n }\n\n /**\n * Updates capability integration resource mapping config by id.\n * Replaces inter-service gRPC call to project-onboarding-ms for update capability integration configuration.\n *\n * @param input - id (mapping row id), config (new config JSON)\n * @param context - GraphQL context for loggedInUserId\n * @returns Promise resolving to { status: true } if row was updated, { status: false } otherwise\n */\n async updateCapabilityIntegrationConfiguration(\n input: {\n id: bigint;\n config: Record<string, unknown>;\n },\n context: GraphQLContext,\n ): Promise<IUpdateAPIResponse> {\n try {\n this.logger.info(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n 'Updating capability integration resource mapping config',\n { id: input.id.toString() },\n );\n\n const updateResult = await this.conn\n .update(schema.capIntegResourceMapping)\n .set({\n config: input.config,\n updatedBy: context.loggedInUserId,\n })\n .where(\n and(\n eq(schema.capIntegResourceMapping.id, input.id),\n isNull(schema.capIntegResourceMapping.deletedAt),\n ),\n );\n\n const isSuccess = updateResult[0].affectedRows > 0;\n\n this.logger.info(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n `Mapping config update ${isSuccess ? 'successful' : 'failed - no matching records'}`,\n { affectedRows: updateResult[0].affectedRows },\n );\n\n return { status: isSuccess };\n } catch (error) {\n this.logger.error(\n context.loggedInUserId,\n this.updateCapabilityIntegrationConfiguration.name,\n this.fileName,\n 'Error updating capability integration resource mapping config',\n error,\n input,\n );\n\n throw error;\n }\n }\n}\n","/**\n * Trybe implementation for wellness customer management operations\n * Provides concrete implementation of customer management functionality\n * for Trybe wellness systems\n *\n * This class extends the base customer management operations with\n * Trybe-specific implementations\n */\nimport { Injectable } from '@nestjs/common';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseCustomerManagement,\n HTTP_METHOD,\n IAddCustomerRequest,\n IAddUpdateCustomerResponseData,\n IDeleteAPIResponse,\n IGetCustomerRequest,\n IUpdateCustomerRequest,\n IValidatedCapabilityIntegration,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport {\n ITrybeCustomer,\n ITrybeCustomerResponse,\n ITrybeGetCustomerByEmailResponse,\n} from '../../models';\n\n@Injectable()\nexport class TrybeCustomerManagement implements BaseCustomerManagement {\n private readonly fileName = 'customer-management.service';\n\n /**\n * Creates an instance of the service\n */\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n ) {}\n\n /**\n * Create a new customer on Trybe (POST /customers/customers).\n *\n * @returns Promise resolving to the created customer\n */\n async createCustomer(\n request: IAddCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCustomer> {\n this.logger.info(\n loggedInUserId,\n this.createCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.createCustomer.name} Called`,\n { request },\n );\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeCustomerResponse,\n IAddCustomerRequest\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: '/customers/customers',\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n body: request,\n },\n integration,\n loggedInUserId,\n );\n\n return response.data as ITrybeCustomer;\n }\n\n /**\n * Abstract method to search for wellness customers\n * Must be implemented by concrete classes\n *\n * @returns Promise resolving when the search is completed\n */\n async searchCustomer(\n request: IGetCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCustomer | undefined> {\n this.logger.info(\n loggedInUserId,\n this.searchCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.searchCustomer.name} Called`,\n { request },\n );\n\n if (!request.email && !request.customerId) {\n throw new Error(\n 'Either email or customerId is required to get a customer from Trybe',\n );\n }\n\n if (request.customerId) {\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeCustomerResponse,\n string\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/customers/customers/${request.customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n if (!response.data) {\n return undefined;\n }\n\n return response.data;\n }\n\n if (request.email) {\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCustomerByEmailResponse,\n string\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/customers/customers/?email=${request.email}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n if (!response.data || response.data.length === 0) {\n return undefined;\n }\n\n return response.data[0];\n }\n }\n\n /**\n * Update an existing customer on Trybe (PUT /customers/customers/:id), then fetch and return full customer.\n *\n * @returns Promise resolving to the updated customer\n */\n async updateCustomer(\n customerId: string,\n request: IUpdateCustomerRequest,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddUpdateCustomerResponseData> {\n this.logger.info(\n loggedInUserId,\n this.updateCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.updateCustomer.name} Called`,\n { customerId, request },\n );\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n { data?: IAddUpdateCustomerResponseData },\n IUpdateCustomerRequest\n >(\n {\n apiMethod: HTTP_METHOD.PUT,\n url: `/customers/customers/${customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n body: request,\n },\n integration,\n loggedInUserId,\n );\n\n return response.data as IAddUpdateCustomerResponseData;\n }\n\n /**\n * Delete a customer on Trybe.\n */\n async deleteCustomer(\n customerId: string,\n integration: IValidatedCapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IDeleteAPIResponse> {\n try {\n this.logger.info(\n loggedInUserId,\n this.deleteCustomer.name,\n this.fileName,\n `${TrybeCustomerManagement.name} -> ${this.deleteCustomer.name} Called`,\n { customerId },\n );\n\n await this.trafficGatewayService.executeIntegrationRequest<void, string>(\n {\n apiMethod: HTTP_METHOD.DELETE,\n url: `/customers/customers/${customerId}`,\n baseUrl: integration.config.platformConfig.baseUrl,\n headers: integration.headers,\n },\n integration,\n loggedInUserId,\n );\n\n return { status: true };\n } catch (error) {\n this.logger.error(\n loggedInUserId,\n this.deleteCustomer.name,\n this.fileName,\n 'Error in deleting customer on Trybe',\n error,\n );\n\n throw error;\n }\n }\n}\n","export function isValidHttpUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n BaseAuth,\n ICapabilityIntegration,\n IValidatedCapabilityIntegration,\n} from '@dvss/dvss-integration-libs';\nimport { TrybeCustomerManagement } from '../customer-management/customer-management.service';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { isValidHttpUrl } from '../../utils/url.utils';\n\n@Injectable()\nexport class TrybeAuthService implements BaseAuth {\n private readonly fileName = 'auth.service';\n\n /**\n * Creates an instance of the Trybe authentication service\n */\n constructor(\n private readonly trybeCustomerManagement: TrybeCustomerManagement,\n private readonly logger: LoggerService,\n ) {}\n\n /**\n * Validates Trybe integration configuration\n * Checks for required fields: apiKey, siteId, organisationId, and baseUrl\n *\n * @param config - Integration configuration object\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to validated configuration\n * @throws Error if config is invalid\n */\n validateConfig(\n integration: Omit<ICapabilityIntegration, 'id'>,\n loggedInUserId: bigint,\n ): IValidatedCapabilityIntegration {\n this.logger.info(\n loggedInUserId,\n this.validateConfig.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.validateConfig.name} Called`,\n { integration },\n );\n\n if (!integration.config) {\n throw new Error('Integration configuration is missing');\n }\n\n const { config } = integration;\n\n const integrationConfig = config.integrationConfig || {};\n const platformConfig = config.platformConfig || {};\n\n if (Object.keys(integrationConfig).length > 0) {\n if (!integrationConfig.apiKey) {\n throw new Error(\n 'Integration configuration is invalid: API Key not found',\n );\n } else if (!integrationConfig.siteId) {\n throw new Error(\n 'Integration configuration is invalid: Site ID not found',\n );\n } else if (!integrationConfig.organisationId) {\n throw new Error(\n 'Integration configuration is invalid: Organisation ID not found',\n );\n }\n } else {\n throw new Error(\n 'Integration configuration is invalid: Integration config is empty',\n );\n }\n\n if (Object.keys(platformConfig).length > 0) {\n if (!platformConfig.baseUrl) {\n throw new Error(\n 'Platform configuration is invalid: Base URL not found',\n );\n }\n\n if (!isValidHttpUrl(platformConfig.baseUrl)) {\n throw new Error(\n 'Platform configuration is invalid: Base URL is not a valid URL',\n );\n }\n } else {\n throw new Error(\n 'Platform configuration is invalid: Platform config is empty',\n );\n }\n\n const headers: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Authorization: `Bearer ${integrationConfig.apiKey}`,\n };\n\n return {\n ...integration,\n headers,\n } as IValidatedCapabilityIntegration;\n }\n\n /**\n * Tests Trybe integration by making a test API call\n * Uses a test customer lookup to verify credentials are valid\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving when test is completed\n * @throws Error if authentication fails or API call fails\n */\n async testIntegration(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<boolean> {\n this.logger.info(\n loggedInUserId,\n this.testIntegration.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.testIntegration.name} Called`,\n { integration },\n );\n\n // Validate config\n const validatedIntegration = this.validateConfig(\n integration,\n loggedInUserId,\n );\n\n // Perform test API call using traffic gateway\n await this.trybeCustomerManagement.searchCustomer(\n {\n email: 'test@integration.test',\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.testIntegration.name,\n this.fileName,\n 'Trybe integration test successful. The credentials are valid.',\n );\n\n return true;\n }\n\n /**\n * Fetches an access token from the Trybe integration provider.\n *\n * @param integration - Integration object with configuration\n * @param loggedInUserId - User ID for logging\n * @returns Promise resolving to the access token string\n */\n fetchAccessToken(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<string> {\n this.logger.info(\n loggedInUserId,\n this.fetchAccessToken.name,\n this.fileName,\n `${TrybeAuthService.name} -> ${this.fetchAccessToken.name} Called`,\n { integration },\n );\n\n throw new Error('Method not implemented.');\n }\n}\n","import {\n type ICredit,\n CREDIT_STATUS_ENUM,\n CREDIT_TYPE_ENUM,\n IValidatedCapabilityIntegration,\n} from '@dvss/dvss-integration-libs';\nimport type {\n ITrybeCredit,\n ITrybeGetCustomerCreditsResponse,\n} from '../../models';\nimport { ISystemResponse } from '@dvss/dvss-integration-libs';\n\nfunction mapStatus(t: ITrybeCredit): CREDIT_STATUS_ENUM {\n if (t.redeemed_at) return CREDIT_STATUS_ENUM.REDEEMED;\n if (t.revoked_at) return CREDIT_STATUS_ENUM.REVOKED;\n if (t.expires_at && new Date(t.expires_at) < new Date())\n return CREDIT_STATUS_ENUM.EXPIRED;\n return CREDIT_STATUS_ENUM.ACTIVE;\n}\n\n/**\n * Groups Trybe credits by (coupon_name, issued_at), then maps each group to one ICredit.\n * Within a group, only coupon_code can differ; all codes are in meta.integrationDetails.couponCodes.\n * value is set to the first coupon code.\n */\nexport function mapTrybeCreditsToSystem(\n res: ITrybeGetCustomerCreditsResponse,\n integration: IValidatedCapabilityIntegration,\n): ISystemResponse<ICredit> {\n const groups = new Map<string, ITrybeCredit[]>();\n for (const t of res.data) {\n const key = `${t.coupon_name}|${t.expires_at?.split('T')[0]}`;\n const list = groups.get(key) ?? [];\n list.push(t);\n groups.set(key, list);\n }\n\n const records: ICredit[] = [];\n let index = 0;\n for (const [, items] of groups) {\n const first = items[0];\n const couponCodes = items.map((i) => i.coupon_code);\n records.push({\n id: BigInt(index + 1),\n capabilityIntegrationId: integration.id,\n projectId: integration.projectId,\n name: first.coupon_name,\n description: first.coupon_description ?? undefined,\n type: CREDIT_TYPE_ENUM.COUPON,\n status: mapStatus(first),\n externalId: first.id,\n expiresAt: first.expires_at ? new Date(first.expires_at) : undefined,\n expiresDate: first.expires_at?.split('T')[0],\n startsAt: new Date(first.issued_at),\n startDate: first.issued_at.split('T')[0],\n value: first.coupon_code,\n quantity: couponCodes.length,\n meta: {\n integrationDetails: {\n customerId: first.customer_id,\n membershipId: first.membership_id,\n multiUse: first.multi_use === 1,\n couponCodes,\n redeemedAt: first.redeemed_at,\n revokedAt: first.revoked_at,\n },\n },\n });\n index++;\n }\n\n return {\n totalCount: records.length,\n records,\n };\n}\n","/**\n * Trybe implementation for credit booking operations\n * Provides concrete implementation of credit booking functionality\n * for Trybe systems\n *\n * This class extends the base credit booking operations with\n * Trybe-specific implementations\n */\nimport {\n BaseCreditBooking,\n CREDIT_FILTER_BY_ENUM,\n CREDIT_STATUS_ENUM,\n HTTP_METHOD,\n ICapabilityIntegration,\n ICredit,\n IGetCustomerCreditsRequest,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport { Injectable } from '@nestjs/common';\nimport type { ITrybeGetCustomerCreditsResponse } from '../../models';\nimport { mapTrybeCreditsToSystem } from './credit-booking.mapper';\nimport { TrybeAuthService } from '../auth/auth.service';\nimport { ISystemResponse } from '@dvss/dvss-integration-libs';\n\n@Injectable()\nexport class TrybeCreditBooking implements BaseCreditBooking {\n private readonly fileName = 'credit-booking.service';\n\n /**\n * Creates an instance of the service\n */\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n private readonly trybeAuthService: TrybeAuthService,\n ) {}\n\n /**\n * Fetches customer credits from Trybe and returns system-format response\n *\n * @returns Promise resolving to the system customer credits response\n */\n async fetchCustomerCredits(\n request: IGetCustomerCreditsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<ICredit>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCustomerCredits.name,\n this.fileName,\n `${TrybeCreditBooking.name} -> ${this.fetchCustomerCredits.name} Called`,\n { request },\n );\n\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const query = new URLSearchParams();\n const opts = request.options;\n\n if (opts?.page != null) query.set('page', String(opts.page));\n if (opts?.count != null) query.set('per_page', String(opts.count));\n\n const statusFilterValues =\n opts?.filters?.[0]?.by === CREDIT_FILTER_BY_ENUM.STATUS\n ? opts.filters[0].values\n : [];\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.EXPIRED)) {\n query.set('expired', 'true');\n } else {\n query.set('expired', 'false');\n }\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.REDEEMED)) {\n query.set('redeemed', 'true');\n } else {\n query.set('redeemed', 'false');\n }\n\n if (statusFilterValues.includes(CREDIT_STATUS_ENUM.REVOKED)) {\n query.set('revoked', 'true');\n } else {\n query.set('revoked', 'false');\n }\n\n const queryString = query.toString();\n const url =\n `/customers/customers/${request.customerId}/credits` +\n (queryString ? `?${queryString}` : '');\n\n const raw: ITrybeGetCustomerCreditsResponse =\n await this.trafficGatewayService.executeIntegrationRequest<ITrybeGetCustomerCreditsResponse>(\n {\n apiMethod: HTTP_METHOD.GET,\n url,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n return mapTrybeCreditsToSystem(raw, validatedIntegration);\n }\n}\n","/**\n * Format date for Trybe API (start or end of day with timezone)\n */\nexport function formatDateForTrybe(date: Date, isStartOfDay: boolean): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = isStartOfDay ? '00' : '23';\n const minutes = isStartOfDay ? '00' : '59';\n const seconds = isStartOfDay ? '00' : '59';\n\n // Fixed timezone offset: -05:00\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}-05:00`;\n}\n\n/**\n * Extract time from ISO string (e.g. '2026-09-23T08:30:00-04:00' -> '08:30')\n */\nexport function extractTimeFromIsoString(isoString: string): string {\n const timeMatch = isoString.match(/T(\\d{2}:\\d{2})/);\n return timeMatch ? timeMatch[1] : '';\n}\n\nfunction snakeToCamel(str: string): string {\n return str.replaceAll(/_([a-z])/g, (_, letter: string) =>\n letter.toUpperCase(),\n );\n}\n\n/**\n * Recursively convert object keys from snake_case to camelCase\n */\nexport function convertKeysToCamelCase(object: unknown): unknown {\n if (object === null || object === undefined) {\n return object;\n }\n if (Array.isArray(object)) {\n return object.map((item) => convertKeysToCamelCase(item));\n }\n if (typeof object === 'object') {\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n converted[snakeToCamel(key)] = convertKeysToCamelCase(value);\n }\n return converted;\n }\n return object;\n}\n","export const fetchAllPages = async <\n T,\n TResponse extends { data: T[]; meta: { last_page: number } },\n>(\n firstPageResponse: TResponse,\n shouldFetchAll: boolean,\n fetchPage: (page: number) => Promise<TResponse>,\n): Promise<T[]> => {\n const items: T[] = [];\n items.push(...firstPageResponse.data);\n\n if (!shouldFetchAll) {\n return items;\n }\n\n const lastPage = firstPageResponse.meta.last_page;\n\n for (let page = 2; page <= lastPage; page += 1) {\n const pageResponse = await fetchPage(page);\n items.push(...pageResponse.data);\n }\n\n return items;\n};\n","import {\n ICreateOrderResponse,\n IGetOrderResponse,\n} from '@dvss/dvss-integration-libs';\nimport { type IGetTrybeResourcesCommonResponse } from './trybe-common.model';\n\nexport interface ITrybeImage {\n id: string;\n file_name: string;\n mime_type: string;\n size: number;\n url: string;\n original_url: string;\n}\n\nexport interface ITrybeMeta {\n title: string;\n description: string;\n}\n\nexport interface ITrybePriceRule {\n id: string;\n price: number;\n weekdays?: string[];\n date_from: string;\n date_to: string;\n time_from?: string;\n time_to?: string;\n}\n\nexport interface ITrybeCategory {\n id: string;\n name: string;\n voucher_applicable: unknown;\n}\n\nexport type ITrybeGetCategoriesResponse =\n IGetTrybeResourcesCommonResponse<ITrybeCategory>;\n\nexport interface ITrybeAppointmentPriceRule extends ITrybePriceRule {\n appointment_type_id: string;\n}\n\nexport interface ITrybeAppointment {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n image?: ITrybeImage;\n site_ids: string[];\n room_ids: string[];\n equipment_ids: unknown[];\n practitioner_ids: string[];\n category_ids: string[];\n durations: number[];\n end_buffer: number;\n start_time_interval: number;\n max_advance_bookings_interval?: string;\n min_advance_bookings_interval?: string;\n tag_ids: unknown[];\n tags: unknown[];\n categories: ITrybeCategory[];\n price_rules: ITrybeAppointmentPriceRule[];\n contraindications: unknown[];\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n membership_booking_windows_enabled: boolean;\n membership_booking_windows: unknown[];\n meta: ITrybeMeta;\n upsell_offerings: unknown[];\n cross_sell_offerings: unknown[];\n related_retail_offerings: unknown[];\n customer_cancellation_permitted?: string;\n customer_cancellation_min_duration?: string;\n min_guests: number;\n max_guests: number;\n allocate_multi_capacity_rooms: boolean;\n enquiries_enabled: boolean;\n revenue_centre: unknown;\n include_pricing_on_calendar: boolean;\n max_per_basket: unknown;\n max_per_guest: unknown;\n shop_practitioner_selection_enabled: boolean;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetAppointmentsResponse =\n IGetTrybeResourcesCommonResponse<ITrybeAppointment>;\n\nexport interface ITrybeSessionPriceRule extends ITrybePriceRule {\n session_type_id: string;\n}\n\nexport interface ITrybeSessionMeta {\n title: string;\n description: string;\n}\n\nexport interface ITrybeSessionRecurrenceGroup {\n id: string;\n name: string;\n practitioner: {\n id: string;\n name: string;\n };\n room: ITrybeSessionRoom;\n weekdays: string[];\n start_time: string;\n start_times: ITrybeSessionStartTime[];\n capacity: number;\n recurrence_start?: string;\n recurrence_end?: string;\n session_type_id: string;\n deleted_at: string;\n}\n\nexport interface ITrybeSessionRoom {\n id: string;\n name: string;\n capacity: number;\n}\n\nexport interface ITrybeSessionStartTime {\n value: string;\n id: string;\n}\n\nexport interface ITrybeSession {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n image?: ITrybeImage;\n site_id: string;\n category_ids: string[];\n price_rules: ITrybeSessionPriceRule[];\n duration?: number;\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n membership_booking_windows_enabled: boolean;\n membership_booking_windows: unknown[];\n max_bookings_per_member: number;\n meta: ITrybeSessionMeta;\n upsell_offerings: unknown[];\n cross_sell_offerings: unknown[];\n related_retail_offerings: unknown[];\n customer_cancellation_permitted?: string;\n customer_cancellation_min_duration?: string;\n waitlist_enabled: boolean;\n max_advance_bookings_interval?: string;\n min_advance_bookings_interval?: string;\n min_guests: number;\n max_guests: number;\n categories: ITrybeCategory[];\n max_baskets_per_session?: number;\n recurrence_groups: ITrybeSessionRecurrenceGroup[];\n revenue_centre: string;\n include_pricing_on_calendar: boolean;\n max_per_basket: string;\n max_per_guest: string;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetSessionsResponse =\n IGetTrybeResourcesCommonResponse<ITrybeSession>;\n\nexport interface ITrybeOffering {\n offering_type: string;\n offering_id: string;\n offering_name: string;\n}\n\nexport interface ITrybeCourse {\n id: string;\n name: string;\n description?: string;\n currency: string;\n product_code: string;\n coupon_id: string;\n offerings: ITrybeOffering[];\n offering_type: string;\n offering_id: string;\n image?: ITrybeImage;\n site_id: string;\n category_ids: string[];\n quantity: number;\n credits_validity_interval?: string;\n offered_online: boolean;\n private: boolean;\n visibility: string;\n customers_only: boolean;\n members_only: boolean;\n meta: ITrybeMeta;\n upsell_offerings: ITrybeOffering[];\n cross_sell_offerings: ITrybeOffering[];\n related_retail_offerings: ITrybeOffering[];\n availability_rules: unknown[];\n price_rules: ITrybePriceRule[];\n revenue_centre: unknown;\n updated_at: string;\n deleted_at: string;\n}\n\nexport type ITrybeGetCoursesResponse =\n IGetTrybeResourcesCommonResponse<ITrybeCourse>;\n\nexport enum TRYBE_OFFERING_TYPE_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport interface ITrybeCouponCodeOffering {\n offering_type: TRYBE_OFFERING_TYPE_ENUM;\n offering_id: string;\n offering_name: string;\n}\n\nexport interface ITrybeCouponCodeOfferingsData {\n id: string;\n offerings: ITrybeCouponCodeOffering[];\n discount_type: string;\n fixed_amount: unknown;\n percentage: number;\n}\n\nexport interface ITrybeGetCouponCodeOfferingsResponse {\n data: ITrybeCouponCodeOfferingsData;\n}\n\nexport interface ITrybeAppointmentSlot {\n start_time: string;\n end_time: string;\n duration: number;\n end_buffer: number;\n practitioner_ids: string[];\n total_quantity: number;\n quantity_available: number;\n is_valid: boolean;\n currency: string;\n price: number;\n nonoptimal_practitioner_allocation: boolean;\n nonoptimal_practitioner_ids: string[];\n bookable_from: string;\n bookable_to: string | null;\n}\n\nexport interface ITrybeAppointmentAvailabilityResponse {\n data: ITrybeAppointmentSlot[];\n}\n\nexport interface ITrybeSessionPractitioner {\n id: string;\n name: string;\n}\n\nexport interface ITrybeSessionRoom {\n id: string;\n name: string;\n capacity: number;\n}\n\nexport interface ITrybeSessionAvailability {\n id: string;\n practitioner_id: string;\n practitioner: ITrybeSessionPractitioner;\n room_id: string;\n room: ITrybeSessionRoom;\n start_time: string;\n end_time: string;\n duration: number;\n capacity: number;\n remaining_capacity: number;\n waitlist_enabled: boolean;\n is_valid: boolean;\n price: number;\n currency: string;\n no_availability_reason?: string;\n no_availability_message?: string;\n}\n\nexport interface ITrybeSessionAvailabilityResponse {\n data: ITrybeSessionAvailability[];\n}\n\nexport const TRYBE_OFFERING_TYPE_API = {\n APPOINTMENT: 'appointment',\n SESSION: 'session',\n COURSE: 'course',\n} as const;\n\nexport type TrybeOfferingTypeApi =\n (typeof TRYBE_OFFERING_TYPE_API)[keyof typeof TRYBE_OFFERING_TYPE_API];\n\nexport interface ITrybeAddOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeOrderGuest {\n id: string;\n name: string;\n first_name: string;\n last_name: string;\n email: null;\n intake_form_complete: boolean;\n checked_in_at: null;\n checked_out_at: null;\n is_lead_booker: boolean;\n customer_id: string;\n}\n\nexport interface ITrybeOrder {\n id: string;\n organisation_id: string;\n order_ref: string;\n site_id: string;\n status: string;\n stage: string;\n customer_id: string;\n email: string;\n phone: null;\n first_name: string;\n last_name: string;\n guests: ITrybeOrderGuest[];\n booking_items?: Array<{ id: string }>;\n}\n\nexport interface ITrybeGetOrderResponseData {\n data: ITrybeOrder;\n}\n\nexport interface ITrybeAddCustomerToOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeAddOrderItemResponse {\n data: {\n id: string;\n status: string;\n booking_summary?: {\n id: string;\n offering?: { id?: string; type?: string; name?: string };\n };\n type_id?: string;\n type_name?: string;\n total_cost?: number;\n net_total?: number;\n };\n}\n\nexport interface ITrybeSubmitOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeCancelOrderResponse {\n data: { id: string };\n}\n\nexport interface ITrybeAddPaymentToOrderResponse {\n order_id: string;\n status: string;\n}\n\nexport interface ITrybePractitioner {\n id: string;\n name: string;\n organisation_id: string;\n site_ids: string[];\n avatar: unknown;\n appointment_restrictions: unknown[];\n tag_ids: string[];\n tags: unknown[];\n zones: ITrybeZone[];\n can_offer_tags: unknown[];\n created_at: string;\n updated_at: string;\n}\n\nexport interface ITrybeZone {\n id: string;\n name: string;\n site_id: string;\n organisation_id: string;\n}\n\nexport interface ITrybeCreateOrderResponse extends ICreateOrderResponse {\n meta: {\n orderReference: string;\n };\n}\n\nexport interface ITrybeGetOrderResponse extends IGetOrderResponse {\n meta: {\n orderReference: string;\n };\n /** Order item ids from Trybe (for updateOrder flow) */\n items: Array<{ id: string }>;\n}\n\nexport interface ITrybeUpdateOrderItemResponse {\n data: { id: string };\n}\n","/**\n * Trybe resource mapping configuration (aligned with MS trybe.model.ts).\n */\n\nexport enum TRYBE_SUPPORTED_JOURNEYS_ENUM {\n APPOINTMENT = 'APPOINTMENT',\n SESSION = 'SESSION',\n COURSE = 'COURSE',\n}\n\nexport enum TRYBE_CATALOGING_BY_ENUM {\n PEOPLE_RESOURCE = 'PEOPLE_RESOURCE',\n}\n\nexport interface ITrybeResourceMappingConfiguration {\n supportedJourneys?: TRYBE_SUPPORTED_JOURNEYS_ENUM[];\n catalogingBy?: TRYBE_CATALOGING_BY_ENUM;\n paymentType?: string;\n}\n","import {\n type IAvailableDateWithSlots,\n type IAvailableTimeSlot,\n type IBookableItem,\n type IBookableItemCategory,\n type IBookableItemMedia,\n type IBookableItemPrice,\n type IBookableItemPriceMeta,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IOfferingResource,\n type ISystemResponse,\n BOOKABLE_ITEM_STATUS_ENUM,\n BOOKABLE_ITEM_TYPE_ENUM,\n} from '@dvss/dvss-integration-libs';\nimport type {\n ITrybeAppointment,\n ITrybeAppointmentSlot,\n ITrybeCategory,\n ITrybeCouponCodeOffering,\n ITrybeCourse,\n ITrybeImage,\n ITrybePractitioner,\n ITrybePriceRule,\n ITrybeSession,\n ITrybeSessionAvailability,\n TRYBE_OFFERING_TYPE_ENUM,\n} from '../../models';\nimport { convertKeysToCamelCase, extractTimeFromIsoString } from '../../utils';\nimport {\n DAY_OF_WEEK,\n OFFERING_RESOURCE_TYPE,\n STATUS,\n} from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\n// ==================== CONSTANTS ====================\n\nconst TRYBE_WEEKDAYS_MAPPING: Record<string, DAY_OF_WEEK> = {\n monday: DAY_OF_WEEK.MON,\n tuesday: DAY_OF_WEEK.TUE,\n wednesday: DAY_OF_WEEK.WED,\n thursday: DAY_OF_WEEK.THU,\n friday: DAY_OF_WEEK.FRI,\n saturday: DAY_OF_WEEK.SAT,\n sunday: DAY_OF_WEEK.SUN,\n};\n\n// ==================== HELPER MAPPERS ====================\n\nexport function mapTrybeImageToMedia(\n image?: ITrybeImage,\n): IBookableItemMedia | undefined {\n if (!image) return undefined;\n return {\n id: image.id,\n url: image.url,\n originalUrl: image.original_url,\n fileName: image.file_name,\n mimeType: image.mime_type,\n };\n}\n\nfunction mapTrybeWeekdays(weekdays: string[]): DAY_OF_WEEK[] {\n return weekdays.map((day) => TRYBE_WEEKDAYS_MAPPING[day.toLowerCase()]);\n}\n\n/**\n * Maps Trybe price rule to price meta\n * Returns raw price from Trybe without any conversion\n */\nfunction mapTrybePriceRuleToPriceMeta(\n priceRule: ITrybePriceRule,\n currency: string,\n index: number,\n): IBookableItemPriceMeta[] {\n const normalizedCurrency = currency ? currency.toUpperCase() : 'USD';\n\n if (!priceRule.weekdays || priceRule.weekdays.length === 0) {\n return [\n {\n id: BigInt(index),\n externalId: priceRule.id,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n price: priceRule.price,\n currency: normalizedCurrency,\n config: priceRule as unknown as Record<string, unknown>,\n },\n ];\n }\n\n return [\n {\n id: BigInt(index),\n externalId: priceRule.id,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n price: priceRule.price,\n currency: normalizedCurrency,\n configuredForDays: mapTrybeWeekdays(priceRule.weekdays),\n },\n ];\n}\n\n/**\n * Maps Trybe price rules to prices\n * Returns raw prices from Trybe without any conversion\n */\nexport function mapTrybePriceRulesToPrices(\n priceRules: ITrybePriceRule[],\n currency: string,\n externalResourceId: string,\n): IBookableItemPrice[] {\n const normalizedCurrency = currency ? currency.toUpperCase() : 'USD';\n\n return priceRules.map((priceRule, index) => ({\n id: BigInt(index + 1),\n label: undefined,\n currency: normalizedCurrency,\n price: priceRule.price,\n externalResourceId,\n configuredForDays: priceRule.weekdays\n ? mapTrybeWeekdays(priceRule.weekdays)\n : undefined,\n pricesMeta: mapTrybePriceRuleToPriceMeta(priceRule, currency, index + 1),\n config: priceRule as unknown as Record<string, unknown>,\n }));\n}\n\n// ==================== MAIN MAPPERS ====================\n\nexport function mapTrybeAppointmentToBookableItem(\n appointment: ITrybeAppointment,\n index: number,\n linkedItems?: IBookableItem[],\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: appointment.id,\n name: appointment.name,\n description: appointment.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(appointment.image),\n primaryAsset: mapTrybeImageToMedia(appointment.image),\n prices: mapTrybePriceRulesToPrices(\n appointment.price_rules,\n appointment.currency,\n appointment.id,\n ),\n linkedBookableItems: linkedItems,\n updatedAt: appointment.updated_at\n ? new Date(appointment.updated_at)\n : undefined,\n meta: {\n // All Trybe-specific fields that don't map to system response\n externalId: appointment.id,\n productCode: appointment.product_code,\n siteIds: appointment.site_ids,\n roomIds: appointment.room_ids,\n equipmentIds: appointment.equipment_ids,\n practitionerIds: appointment.practitioner_ids,\n durations: appointment.durations,\n endBuffer: appointment.end_buffer,\n startTimeInterval: appointment.start_time_interval,\n maxAdvanceBookingsInterval: appointment.max_advance_bookings_interval,\n minAdvanceBookingsInterval: appointment.min_advance_bookings_interval,\n tagIds: appointment.tag_ids,\n tags: appointment.tags,\n categoryIds: appointment.category_ids,\n offeredOnline: appointment.offered_online,\n private: appointment.private,\n visibility: appointment.visibility,\n customersOnly: appointment.customers_only,\n membersOnly: appointment.members_only,\n membershipBookingWindowsEnabled:\n appointment.membership_booking_windows_enabled,\n membershipBookingWindows: appointment.membership_booking_windows,\n trybeMeta: appointment.meta,\n upsellOfferings: appointment.upsell_offerings,\n crossSellOfferings: appointment.cross_sell_offerings,\n relatedRetailOfferings: appointment.related_retail_offerings,\n customerCancellationPermitted:\n appointment.customer_cancellation_permitted,\n customerCancellationMinDuration:\n appointment.customer_cancellation_min_duration,\n minGuests: appointment.min_guests,\n maxGuests: appointment.max_guests,\n allocateMultiCapacityRooms: appointment.allocate_multi_capacity_rooms,\n enquiriesEnabled: appointment.enquiries_enabled,\n revenueCentre: appointment.revenue_centre,\n includePricingOnCalendar: appointment.include_pricing_on_calendar,\n maxPerBasket: appointment.max_per_basket,\n maxPerGuest: appointment.max_per_guest,\n shopPractitionerSelectionEnabled:\n appointment.shop_practitioner_selection_enabled,\n deletedAt: appointment.deleted_at,\n },\n };\n}\n\nexport function mapTrybeSessionToBookableItem(\n session: ITrybeSession,\n index: number,\n linkedItems?: IBookableItem[],\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: session.id,\n name: session.name,\n description: session.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.SESSION,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(session.image),\n primaryAsset: mapTrybeImageToMedia(session.image),\n prices: mapTrybePriceRulesToPrices(\n session.price_rules,\n session.currency,\n session.id,\n ),\n linkedBookableItems: linkedItems,\n updatedAt: session.updated_at ? new Date(session.updated_at) : undefined,\n meta: {\n // All Trybe-specific fields\n externalId: session.id,\n productCode: session.product_code,\n siteId: session.site_id,\n duration: session.duration,\n categoryIds: session.category_ids,\n offeredOnline: session.offered_online,\n private: session.private,\n visibility: session.visibility,\n customersOnly: session.customers_only,\n membersOnly: session.members_only,\n membershipBookingWindowsEnabled:\n session.membership_booking_windows_enabled,\n membershipBookingWindows: session.membership_booking_windows,\n maxBookingsPerMember: session.max_bookings_per_member,\n trybeMeta: session.meta,\n upsellOfferings: session.upsell_offerings,\n crossSellOfferings: session.cross_sell_offerings,\n relatedRetailOfferings: session.related_retail_offerings,\n customerCancellationPermitted: session.customer_cancellation_permitted,\n customerCancellationMinDuration:\n session.customer_cancellation_min_duration,\n waitlistEnabled: session.waitlist_enabled,\n maxAdvanceBookingsInterval: session.max_advance_bookings_interval,\n minAdvanceBookingsInterval: session.min_advance_bookings_interval,\n minGuests: session.min_guests,\n maxGuests: session.max_guests,\n maxBasketsPerSession: session.max_baskets_per_session,\n recurrenceGroups: session.recurrence_groups,\n revenueCentre: session.revenue_centre,\n includePricingOnCalendar: session.include_pricing_on_calendar,\n maxPerBasket: session.max_per_basket,\n maxPerGuest: session.max_per_guest,\n deletedAt: session.deleted_at,\n },\n };\n}\n\nexport function mapTrybeCourseToBookableItem(\n course: ITrybeCourse,\n index: number,\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: course.id,\n name: course.name,\n description: course.description,\n type: BOOKABLE_ITEM_TYPE_ENUM.COURSE,\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n icon: mapTrybeImageToMedia(course.image),\n primaryAsset: mapTrybeImageToMedia(course.image),\n prices: mapTrybePriceRulesToPrices(\n course.price_rules,\n course.currency,\n course.id,\n ),\n updatedAt: course.updated_at ? new Date(course.updated_at) : undefined,\n meta: {\n // All Trybe-specific fields\n externalId: course.id,\n productCode: course.product_code,\n couponId: course.coupon_id,\n offerings: course.offerings.map((offering) => ({\n offeringType: offering.offering_type,\n offeringId: offering.offering_id,\n offeringName: offering.offering_name,\n })),\n offeringType: course.offering_type,\n offeringId: course.offering_id,\n quantity: course.quantity,\n creditsValidityInterval: course.credits_validity_interval,\n siteId: course.site_id,\n categoryIds: course.category_ids,\n offeredOnline: course.offered_online,\n private: course.private,\n visibility: course.visibility,\n customersOnly: course.customers_only,\n membersOnly: course.members_only,\n trybeMeta: course.meta,\n upsellOfferings: course.upsell_offerings,\n crossSellOfferings: course.cross_sell_offerings,\n relatedRetailOfferings: course.related_retail_offerings,\n availabilityRules: course.availability_rules,\n revenueCentre: course.revenue_centre,\n deletedAt: course.deleted_at,\n },\n };\n}\n\nexport function mapTrybeCategoryToBookableItemCategory(\n category: ITrybeCategory,\n index: number,\n): IBookableItemCategory {\n return {\n id: BigInt(index + 1),\n externalId: category.id,\n name: category.name,\n meta: {\n voucherApplicable: category.voucher_applicable,\n },\n };\n}\n\n/**\n * Maps Trybe practitioner to system OfferingResource.\n * Union fields (externalId, name, type, status, media, updatedAt) are mapped;\n * Trybe-specific fields go into meta.\n */\nexport function mapTrybePractitionerToOfferingResource(\n practitioner: ITrybePractitioner,\n index: number,\n): IOfferingResource {\n const media =\n practitioner.avatar != null && typeof practitioner.avatar === 'object'\n ? { meta: practitioner.avatar as Record<string, unknown> }\n : undefined;\n\n return {\n id: BigInt(index + 1),\n externalId: practitioner.id,\n name: practitioner.name,\n type: OFFERING_RESOURCE_TYPE.PEOPLE,\n status: STATUS.ACTIVE,\n media,\n updatedAt: practitioner.updated_at\n ? new Date(practitioner.updated_at)\n : undefined,\n meta: {\n organisationId: practitioner.organisation_id,\n siteIds: practitioner.site_ids,\n appointmentRestrictions: practitioner.appointment_restrictions,\n tagIds: practitioner.tag_ids,\n tags: practitioner.tags,\n zones: practitioner.zones,\n canOfferTags: practitioner.can_offer_tags,\n createdAt: practitioner.created_at,\n updatedAt: practitioner.updated_at,\n },\n };\n}\n\n// ==================== RESPONSE MAPPERS ====================\n\nexport function mapTrybeAppointmentsToSystemResponse(\n appointments: ITrybeAppointment[],\n totalCount: number,\n courseLookup?: Map<string, ITrybeCourse[]>,\n): ISystemResponse<IBookableItem> {\n const records = appointments.map((apt, index) => {\n const linkedCourses = courseLookup?.get(apt.id) ?? [];\n const linkedItems = linkedCourses.map((course, courseIndex) =>\n mapTrybeCourseToBookableItem(course, courseIndex),\n );\n return mapTrybeAppointmentToBookableItem(\n apt,\n index,\n linkedItems.length > 0 ? linkedItems : undefined,\n );\n });\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeSessionsToSystemResponse(\n sessions: ITrybeSession[],\n totalCount: number,\n courseLookup?: Map<string, ITrybeCourse[]>,\n): ISystemResponse<IBookableItem> {\n const records = sessions.map((session, index) => {\n const linkedCourses = courseLookup?.get(session.id) ?? [];\n const linkedItems = linkedCourses.map((course, courseIndex) =>\n mapTrybeCourseToBookableItem(course, courseIndex),\n );\n return mapTrybeSessionToBookableItem(\n session,\n index,\n linkedItems.length > 0 ? linkedItems : undefined,\n );\n });\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeCoursesToSystemResponse(\n courses: ITrybeCourse[],\n totalCount: number,\n): ISystemResponse<IBookableItem> {\n const records = courses.map((course, index) =>\n mapTrybeCourseToBookableItem(course, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybeCategoriesToSystemResponse(\n categories: ITrybeCategory[],\n totalCount: number,\n): ISystemResponse<IBookableItemCategory> {\n const records = categories.map((category, index) =>\n mapTrybeCategoryToBookableItemCategory(category, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nexport function mapTrybePractitionersToSystemResponse(\n practitioners: ITrybePractitioner[],\n totalCount: number,\n): ISystemResponse<IOfferingResource> {\n const records = practitioners.map((practitioner, index) =>\n mapTrybePractitionerToOfferingResource(practitioner, index),\n );\n\n return {\n totalCount,\n records,\n };\n}\n\nfunction mapTrybeOfferingTypeToBookableItemType(\n offeringType: string,\n): BOOKABLE_ITEM_TYPE_ENUM {\n const normalized = offeringType.toUpperCase() as TRYBE_OFFERING_TYPE_ENUM;\n return BOOKABLE_ITEM_TYPE_ENUM[normalized];\n}\n\nexport function mapTrybeCouponCodeOfferingToBookableItem(\n offering: ITrybeCouponCodeOffering,\n index: number,\n): IBookableItem {\n return {\n id: BigInt(index + 1),\n externalId: offering.offering_id,\n name: offering.offering_name,\n type: mapTrybeOfferingTypeToBookableItemType(offering.offering_type),\n status: BOOKABLE_ITEM_STATUS_ENUM.ACTIVE,\n };\n}\n\nexport function mapTrybeCouponCodeOfferingsToSystemResponse(\n offerings: ITrybeCouponCodeOffering[],\n): ISystemResponse<IBookableItem> {\n const records = offerings.map((offering, index) =>\n mapTrybeCouponCodeOfferingToBookableItem(offering, index),\n );\n\n return {\n totalCount: records.length,\n records,\n };\n}\n\n// ==================== AVAILABILITY MAPPERS ====================\n\nfunction groupByDate<T>(\n items: T[],\n getDateKey: (item: T) => string,\n): Record<string, T[]> {\n const result: Record<string, T[]> = {};\n for (const item of items) {\n const key = getDateKey(item);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!result[key]) result[key] = [];\n result[key].push(item);\n }\n return result;\n}\n\nexport function mapTrybeSessionAvailabilityToSystemResponse(\n sessions: ITrybeSessionAvailability[],\n): IGetAvailableDatesAndTimeSlotsResponse {\n const filtered = sessions.filter((s) => s.remaining_capacity > 0);\n const grouped = groupByDate(filtered, (s) => {\n const dateMatch = s.start_time.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n return dateMatch ? dateMatch[1] : '';\n });\n\n const dates: IAvailableDateWithSlots[] = Object.entries(grouped)\n .filter(([date]) => date !== '')\n .map(([date, sessionList]) => {\n const time: IAvailableTimeSlot[] = sessionList.map((session) => {\n const fromTime = extractTimeFromIsoString(session.start_time);\n const toTime = extractTimeFromIsoString(session.end_time);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { start_time: startTime, end_time: endTime, ...meta } = session;\n const camelCaseMeta = convertKeysToCamelCase(meta) as Record<\n string,\n unknown\n >;\n return { fromTime, toTime, meta: camelCaseMeta };\n });\n return {\n date: new Date(date),\n meta: {},\n time,\n };\n })\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n return { dates };\n}\n\nexport function mapTrybeAppointmentAvailabilityToSystemResponse(\n slots: ITrybeAppointmentSlot[],\n): IGetAvailableDatesAndTimeSlotsResponse {\n const filtered = slots.filter((s) => s.quantity_available > 0);\n const grouped = groupByDate(filtered, (s) => {\n const dateMatch = s.start_time.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n return dateMatch ? dateMatch[1] : '';\n });\n\n const dates: IAvailableDateWithSlots[] = Object.entries(grouped)\n .filter(([date]) => date !== '')\n .map(([date, slotList]) => {\n const time: IAvailableTimeSlot[] = slotList.map((slot) => {\n const fromTime = extractTimeFromIsoString(slot.start_time);\n const toTime = extractTimeFromIsoString(slot.end_time);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { start_time: startTime, end_time: endTime, ...meta } = slot;\n const camelCaseMeta = convertKeysToCamelCase(meta) as Record<\n string,\n unknown\n >;\n return { fromTime, toTime, meta: camelCaseMeta };\n });\n return {\n date: new Date(date),\n meta: {},\n time,\n };\n })\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n\n return { dates };\n}\n","/**\n * Trybe implementation for wellness management operations\n * Provides concrete implementation of wellness management functionality\n * for Trybe systems\n *\n * This class extends the base wellness management operations with\n * Trybe-specific implementations\n */\nimport { Injectable } from '@nestjs/common';\nimport {\n convertDateOnlyToTimestamp,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseWellnessManagement,\n BOOKABLE_ITEM_TYPE_ENUM,\n HTTP_METHOD,\n type IAddItemToOrderRequest,\n type IAddItemToOrderResponse,\n type IAddPaymentToOrderRequest,\n type IBookableItem,\n type IBookableItemCategory,\n type ICapabilityIntegration,\n type ICreateOrderRequest,\n type IFetchOfferingAvailabilityRequest,\n type IGetAvailableDatesAndTimeSlotsResponse,\n type IGetAppointmentsRequest,\n type IGetBookableItemsFromCreditRequest,\n type IGetCategoriesRequest,\n type IGetCoursesRequest,\n type IGetPractitionersRequest,\n type IGetSessionsRequest,\n type IOfferingResource,\n type ISystemResponse,\n TrafficGatewayService,\n type IUpdateOrderRequest,\n type IUpdateOrderResponse,\n} from '@dvss/dvss-integration-libs';\nimport { fetchAllPages, formatDateForTrybe } from '../../utils';\nimport {\n type IGetTrybeResourcesCommonResponse,\n type ITrybeAddOrderResponse,\n type ITrybeAddOrderItemResponse,\n type ITrybeGetOrderResponseData,\n type ITrybeAppointment,\n type ITrybeAppointmentAvailabilityResponse,\n type ITrybeCategory,\n type ITrybeCourse,\n type ITrybeGetAppointmentsResponse,\n type ITrybeGetCategoriesResponse,\n type ITrybeGetCoursesResponse,\n type ITrybeGetCouponCodeOfferingsResponse,\n type ITrybeGetSessionsResponse,\n type ITrybeSession,\n type ITrybeSessionAvailabilityResponse,\n type TrybeOfferingTypeApi,\n TRYBE_OFFERING_TYPE_API,\n ITrybePractitioner,\n ITrybeCreateOrderResponse,\n ITrybeGetOrderResponse,\n type ITrybeUpdateOrderItemResponse,\n} from '../../models';\nimport {\n mapTrybeAppointmentsToSystemResponse,\n mapTrybeAppointmentAvailabilityToSystemResponse,\n mapTrybeCategoriesToSystemResponse,\n mapTrybeCoursesToSystemResponse,\n mapTrybeCouponCodeOfferingsToSystemResponse,\n mapTrybePractitionersToSystemResponse,\n mapTrybeSessionAvailabilityToSystemResponse,\n mapTrybeSessionsToSystemResponse,\n} from './wellness-management.mapper';\nimport { TrybeAuthService } from '../auth/auth.service';\n\n@Injectable()\nexport class TrybeWellnessManagement implements BaseWellnessManagement {\n private readonly fileName = 'wellness-management.service';\n\n constructor(\n private readonly logger: LoggerService,\n private readonly trafficGatewayService: TrafficGatewayService,\n private readonly trybeAuthService: TrybeAuthService,\n ) {}\n\n fetchWellnessAppointmentSession(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n checkWellnessAppointmentSessionAvailability(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n createWellnessAppointmentSessionOrder(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n addWellnessAppointmentSessionOrderItems(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n confirmWellnessAppointmentSessionOrder(): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n async createOrder(\n request: ICreateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeCreateOrderResponse> {\n let orderId: string | undefined;\n\n try {\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validated.config.integrationConfig.siteId;\n\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAddOrderResponse,\n { site_id: string; status: string }\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: '/shop/orders',\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { site_id: siteId, status: 'new' },\n },\n validated,\n loggedInUserId,\n );\n\n orderId = res.data.id;\n\n const items: (IBookableItem & { totalPrice?: number })[] = [];\n\n // Attach customer to the order\n await this.addCustomerToOrder(\n orderId,\n request.customerId,\n integration,\n loggedInUserId,\n );\n\n // Fetch order details to get guest information\n const order = await this.getOrder(orderId, integration, loggedInUserId);\n\n // Add each bookable item to the order\n for (const bookableItem of request.bookableItems) {\n const orderItemResponse = await this.addItemToOrder(\n {\n orderId,\n item: {\n offeringId: bookableItem.externalId,\n offeringType: bookableItem.type,\n guestIds: order.guests.map((g) => g.id),\n practitionerIds: request.offeringResources.map(\n (r) => r.externalId,\n ),\n durationMinutes: request.durationInMinutes,\n timeIso: request.bookingStartTime.toISOString(),\n sessionId: (request.meta as { sessionId?: string } | undefined)\n ?.sessionId,\n },\n },\n integration,\n loggedInUserId,\n );\n\n items.push({\n externalId: bookableItem.externalId,\n name: orderItemResponse.name as string,\n type: bookableItem.type,\n totalPrice:\n (orderItemResponse.netTotal ?? 0) / request.currencyMultiplier,\n });\n }\n\n // Apply customer credits if available\n if (request.customerCreditId) {\n await this.addCustomerCreditsToOrder(\n orderId,\n request.customerCreditId,\n integration,\n loggedInUserId,\n );\n }\n\n // Submit the order to complete the booking process\n await this.submitOrder(orderId, integration, loggedInUserId);\n\n this.logger.info(\n loggedInUserId,\n this.createOrder.name,\n this.fileName,\n 'Created Trybe order for offering booking',\n { orderId },\n );\n\n return {\n externalBookingId: orderId,\n items,\n meta: {\n orderReference: order.meta.orderReference,\n },\n };\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.createOrder.name,\n this.fileName,\n 'Error creating Trybe order for offering booking',\n err,\n );\n\n if (orderId) {\n await this.cancelOrder(orderId, integration, loggedInUserId);\n }\n\n throw err;\n }\n }\n\n async addCustomerToOrder(\n orderId: string,\n customerId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addCustomerToOrder.name,\n this.fileName,\n 'Adding customer to Trybe order',\n { orderId, customerId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/customer`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { id: customerId, source: 'trybe' },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addCustomerToOrder.name,\n this.fileName,\n 'Successfully added customer to Trybe order',\n { orderId, customerId },\n );\n }\n\n async getOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeGetOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.getOrder.name,\n this.fileName,\n 'Fetching Trybe order details',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetOrderResponseData,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `/shop/orders/${orderId}`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.getOrder.name,\n this.fileName,\n 'Successfully fetched Trybe order details',\n { orderId, guestCount: res.data.guests.length },\n );\n\n return {\n orderId: res.data.id,\n guests: res.data.guests.map((g) => ({ id: g.id, name: g.name })),\n meta: {\n orderReference: res.data.order_ref,\n },\n items: res.data.booking_items ?? [],\n };\n }\n\n private mapOfferingTypeToTrybeApi(\n type: BOOKABLE_ITEM_TYPE_ENUM,\n ): TrybeOfferingTypeApi {\n switch (type) {\n case BOOKABLE_ITEM_TYPE_ENUM.APPOINTMENT:\n return TRYBE_OFFERING_TYPE_API.APPOINTMENT;\n case BOOKABLE_ITEM_TYPE_ENUM.SESSION:\n return TRYBE_OFFERING_TYPE_API.SESSION;\n case BOOKABLE_ITEM_TYPE_ENUM.COURSE:\n return TRYBE_OFFERING_TYPE_API.COURSE;\n default:\n throw new Error(`Unsupported offering type: ${type as string}`);\n }\n }\n\n async addItemToOrder(\n request: IAddItemToOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IAddItemToOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.addItemToOrder.name,\n this.fileName,\n 'Adding item to Trybe order',\n {\n orderId: request.orderId,\n offeringId: request.item.offeringId,\n offeringType: request.item.offeringType,\n },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const { orderId, item } = request;\n const offeringType = this.mapOfferingTypeToTrybeApi(item.offeringType);\n\n let body: Record<string, unknown>;\n if (offeringType === TRYBE_OFFERING_TYPE_API.APPOINTMENT) {\n if (item.durationMinutes == null || !item.timeIso) {\n throw new Error('durationMinutes and timeIso required for appointment');\n }\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n item_configuration: {\n duration: item.durationMinutes,\n skip_availability_checks: false,\n time: item.timeIso,\n },\n skip_availability_checks: false,\n };\n } else if (offeringType === TRYBE_OFFERING_TYPE_API.SESSION) {\n if (!item.sessionId) {\n throw new Error('sessionId required for session');\n }\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n item_configuration: {\n session_id: item.sessionId,\n skip_availability_checks: false,\n },\n skip_availability_checks: false,\n };\n } else {\n body = {\n offering_type: offeringType,\n offering_id: item.offeringId,\n guest_ids: item.guestIds,\n };\n }\n\n const res = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAddOrderItemResponse,\n Record<string, unknown>\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/items`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body,\n },\n validated,\n loggedInUserId,\n );\n const data = res.data;\n const result = {\n name: data.booking_summary?.offering?.name ?? data.type_name ?? undefined,\n netTotal: data.net_total,\n };\n\n this.logger.info(\n loggedInUserId,\n this.addItemToOrder.name,\n this.fileName,\n 'Successfully added item to Trybe order',\n {\n orderId,\n offeringId: item.offeringId,\n name: result.name,\n netTotal: result.netTotal,\n },\n );\n\n return result;\n }\n\n async addCustomerCreditsToOrder(\n orderId: string,\n customerCreditId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addCustomerCreditsToOrder.name,\n this.fileName,\n 'Adding customer credits to Trybe order',\n { orderId, customerCreditId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: unknown },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/customer-credits`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: { id: customerCreditId },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addCustomerCreditsToOrder.name,\n this.fileName,\n 'Successfully added customer credits to Trybe order',\n { orderId, customerCreditId },\n );\n }\n\n async submitOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.submitOrder.name,\n this.fileName,\n 'Submitting Trybe order',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/submit`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.submitOrder.name,\n this.fileName,\n 'Successfully submitted Trybe order',\n { orderId },\n );\n }\n\n async cancelOrder(\n orderId: string,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.cancelOrder.name,\n this.fileName,\n 'Cancelling Trybe order',\n { orderId },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { data: { id: string } },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${orderId}/cancel`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.cancelOrder.name,\n this.fileName,\n 'Successfully cancelled Trybe order',\n { orderId },\n );\n }\n\n async updateOrder(\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IUpdateOrderResponse> {\n this.logger.info(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Updating Trybe order',\n { orderId: request.orderId, offeringType: request.item.type },\n );\n\n const order = await this.getOrder(\n request.orderId,\n integration,\n loggedInUserId,\n );\n const itemId = order.items[0]?.id;\n if (!itemId) {\n this.logger.error(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Item not found in order during update',\n { orderId: request.orderId },\n );\n throw new Error('Item not found in order');\n }\n const updateResponse = await this.updateOrderItem(\n request.orderId,\n itemId,\n request,\n integration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.updateOrder.name,\n this.fileName,\n 'Successfully updated Trybe order',\n { orderId: request.orderId, itemId },\n );\n\n return {\n success: Boolean(updateResponse.data.id),\n data: updateResponse.data,\n };\n }\n\n async updateOrderItem(\n orderId: string,\n itemId: string,\n request: IUpdateOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ITrybeUpdateOrderItemResponse> {\n this.logger.info(\n loggedInUserId,\n this.updateOrderItem.name,\n this.fileName,\n 'Updating Trybe order item',\n { orderId, itemId, offeringType: request.item.type },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const offeringType = this.mapOfferingTypeToTrybeApi(request.item.type);\n let body: Record<string, unknown>;\n\n if (offeringType === TRYBE_OFFERING_TYPE_API.APPOINTMENT) {\n if (\n request.bookingStartTimeLabel == null ||\n request.durationInMinutes == null ||\n request.bookingStartDateLabel == null\n ) {\n throw new Error(\n 'durationInMinutes, bookingStartDateLabel and bookingStartTimeLabel required for appointment',\n );\n }\n const timeIso = convertDateOnlyToTimestamp(\n request.timezone,\n request.bookingStartDateLabel,\n request.bookingStartTimeLabel,\n ).toISOString();\n body = {\n offering_id: request.item.externalId,\n item_configuration: {\n time: timeIso,\n duration: request.durationInMinutes,\n skip_availability_checks: false,\n },\n skip_availability_checks: false,\n };\n } else if (offeringType === TRYBE_OFFERING_TYPE_API.SESSION) {\n if (!request.sessionId) {\n throw new Error('sessionId required for session');\n }\n body = {\n item_configuration: {\n session_id: request.sessionId,\n skip_availability_checks: false,\n },\n };\n } else {\n throw new Error('Course is not updatable');\n }\n\n const response = await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeUpdateOrderItemResponse,\n Record<string, unknown>\n >(\n {\n apiMethod: HTTP_METHOD.PUT,\n url: `/shop/orders/${orderId}/items/${itemId}`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body,\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.updateOrderItem.name,\n this.fileName,\n 'Successfully updated Trybe order item',\n { orderId, itemId },\n );\n\n return response;\n }\n\n async addPaymentToOrder(\n request: IAddPaymentToOrderRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<void> {\n this.logger.info(\n loggedInUserId,\n this.addPaymentToOrder.name,\n this.fileName,\n 'Adding payment to Trybe order',\n {\n orderId: request.orderId,\n amount: request.amount,\n paymentTypeId: request.paymentTypeId,\n },\n );\n\n const validated = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n await this.trafficGatewayService.executeIntegrationRequest<\n { order_id: string; status: string },\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.POST,\n url: `/shop/orders/${request.orderId}/payments`,\n baseUrl: validated.config.platformConfig.baseUrl,\n headers: validated.headers,\n body: {\n amount: request.amount,\n processor: 'manual',\n status: 'paid',\n processor_data: {\n notes: '',\n payment_type_id: request.paymentTypeId,\n },\n },\n },\n validated,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.addPaymentToOrder.name,\n this.fileName,\n 'Successfully added payment to Trybe order',\n { orderId: request.orderId, amount: request.amount },\n );\n }\n\n async fetchAppointments(\n request: IGetAppointmentsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchAppointments.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n if (\n request.shouldFetchAllAppointments &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all appointments.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/appointment-types?site_id=${siteId}` +\n (request.practitionerIds && request.practitionerIds.length > 0\n ? `&practitioner_id=${request.practitionerIds.join(',')}`\n : '') +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetAppointmentsResponse,\n IGetAppointmentsRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeAppointment,\n ITrybeGetAppointmentsResponse\n >(firstPageResponse, request.shouldFetchAllAppointments, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeAppointment>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n 'Successfully fetched Trybe appointments',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeAppointmentsToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchAppointments.name,\n this.fileName,\n 'Error fetching Trybe appointments',\n err,\n );\n throw err;\n }\n }\n\n async fetchSessions(\n request: IGetSessionsRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchSessions.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n if (\n request.shouldFetchAllSessions &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all sessions.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/session-types?site_id=${siteId}` +\n (request.practitionerIds && request.practitionerIds.length > 0\n ? `&practitioner_id=${request.practitionerIds.join(',')}`\n : '') +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetSessionsResponse,\n IGetSessionsRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeSession,\n ITrybeGetSessionsResponse\n >(firstPageResponse, request.shouldFetchAllSessions, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeSession>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n 'Successfully fetched Trybe sessions',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeSessionsToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchSessions.name,\n this.fileName,\n 'Error fetching Trybe sessions',\n err,\n );\n throw err;\n }\n }\n\n async fetchCourses(\n request: IGetCoursesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchCourses.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const organisationId =\n validatedIntegration.config.integrationConfig.organisationId;\n\n if (\n request.shouldFetchAllCourses &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all courses.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/course-types?organisation_id=${organisationId}` +\n (queryString ? `&${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCoursesResponse,\n IGetCoursesRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeCourse,\n ITrybeGetCoursesResponse\n >(firstPageResponse, request.shouldFetchAllCourses, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeCourse>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n 'Successfully fetched Trybe courses',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeCoursesToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchCourses.name,\n this.fileName,\n 'Error fetching Trybe courses',\n err,\n );\n throw err;\n }\n }\n\n async fetchPractitioners(\n request: IGetPractitionersRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IOfferingResource>> {\n this.logger.info(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchPractitioners.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n const apiUrl = `/shop/practitioners/?site_id=${siteId}`;\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>,\n IGetPractitionersRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybePractitioner,\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>\n >(firstPageResponse, request.shouldFetchAllPractitioners, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybePractitioner>,\n IGetPractitionersRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}&page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n 'Successfully fetched Trybe practitioners',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybePractitionersToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchPractitioners.name,\n this.fileName,\n 'Error fetching Trybe practitioners',\n err,\n );\n throw err;\n }\n }\n\n async fetchCategories(\n request: IGetCategoriesRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItemCategory>> {\n this.logger.info(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchCategories.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const organisationId =\n validatedIntegration.config.integrationConfig.organisationId;\n\n if (\n request.shouldFetchAllCategories &&\n request.options?.page !== undefined\n ) {\n throw new Error(\n 'Pagination options are not supported when fetching all categories.',\n );\n }\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/organisations/${organisationId}/categories` +\n (queryString ? `?${queryString}` : '');\n\n const firstPageResponse =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCategoriesResponse,\n IGetCategoriesRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n const records = await fetchAllPages<\n ITrybeCategory,\n ITrybeGetCategoriesResponse\n >(firstPageResponse, request.shouldFetchAllCategories, (page) =>\n this.trafficGatewayService.executeIntegrationRequest<\n IGetTrybeResourcesCommonResponse<ITrybeCategory>,\n unknown\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: `${apiUrl}${apiUrl.includes('?') ? '&' : '?'}page=${page}`,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n ),\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n 'Successfully fetched Trybe categories',\n { totalRecords: firstPageResponse.meta.total },\n );\n\n return mapTrybeCategoriesToSystemResponse(\n records,\n firstPageResponse.meta.total,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchCategories.name,\n this.fileName,\n 'Error fetching Trybe categories',\n err,\n );\n throw err;\n }\n }\n\n async fetchBookableItemsFromCredit(\n request: IGetBookableItemsFromCreditRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISystemResponse<IBookableItem>> {\n this.logger.info(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchBookableItemsFromCredit.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const query = new URLSearchParams();\n if (request.options?.page != null) {\n query.set('page', String(request.options.page));\n }\n if (request.options?.count != null) {\n query.set('per_page', String(request.options.count));\n }\n\n const queryString = query.toString();\n const apiUrl =\n `/shop/coupon-codes/${request.couponCodeId}/offering-discounts` +\n (queryString ? `?${queryString}` : '');\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeGetCouponCodeOfferingsResponse,\n IGetBookableItemsFromCreditRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n 'Successfully fetched bookable items from credit',\n { couponCodeId: request.couponCodeId },\n );\n\n return mapTrybeCouponCodeOfferingsToSystemResponse(\n response.data.offerings,\n );\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchBookableItemsFromCredit.name,\n this.fileName,\n 'Error fetching bookable items from credit',\n err,\n );\n throw err;\n }\n }\n\n async fetchSessionAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse> {\n this.logger.info(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchSessionAvailabilityForOffering.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n const formattedDateTimeFrom = formatDateForTrybe(\n request.dateTimeFrom,\n true,\n );\n const formattedDateTimeTo = formatDateForTrybe(request.dateTimeTo, false);\n\n const apiUrl =\n `/shop/item-availability/sessions/${siteId}/${request.externalOfferingBookableItemId}` +\n `?date_time_from=${encodeURIComponent(formattedDateTimeFrom)}` +\n `&date_time_to=${encodeURIComponent(formattedDateTimeTo)}` +\n `&offeringId=${request.externalOfferingBookableItemId}`;\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeSessionAvailabilityResponse,\n IFetchOfferingAvailabilityRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n 'Successfully fetched session availability for offering',\n {\n externalOfferingBookableItemId:\n request.externalOfferingBookableItemId,\n },\n );\n\n return mapTrybeSessionAvailabilityToSystemResponse(response.data);\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchSessionAvailabilityForOffering.name,\n this.fileName,\n 'Error fetching session availability for offering',\n err,\n );\n throw err;\n }\n }\n\n async fetchAppointmentAvailabilityForOffering(\n request: IFetchOfferingAvailabilityRequest,\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<IGetAvailableDatesAndTimeSlotsResponse> {\n this.logger.info(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n `${TrybeWellnessManagement.name} -> ${this.fetchAppointmentAvailabilityForOffering.name} Called`,\n { request },\n );\n\n try {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n\n const formattedDateTimeFrom = formatDateForTrybe(\n request.dateTimeFrom,\n true,\n );\n const formattedDateTimeTo = formatDateForTrybe(request.dateTimeTo, false);\n\n const apiUrl =\n `/shop/item-availability/appointment-slots/${siteId}/${request.externalOfferingBookableItemId}` +\n `?date_time_from=${encodeURIComponent(formattedDateTimeFrom)}` +\n `&date_time_to=${encodeURIComponent(formattedDateTimeTo)}` +\n `&OfferingID=${request.externalOfferingBookableItemId}`;\n\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<\n ITrybeAppointmentAvailabilityResponse,\n IFetchOfferingAvailabilityRequest\n >(\n {\n apiMethod: HTTP_METHOD.GET,\n url: apiUrl,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n this.logger.info(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n 'Successfully fetched appointment availability for offering',\n {\n externalOfferingBookableItemId:\n request.externalOfferingBookableItemId,\n },\n );\n\n return mapTrybeAppointmentAvailabilityToSystemResponse(response.data);\n } catch (err) {\n this.logger.error(\n loggedInUserId,\n this.fetchAppointmentAvailabilityForOffering.name,\n this.fileName,\n 'Error fetching appointment availability for offering',\n err,\n );\n throw err;\n }\n }\n}\n","import type {\n ISiteSystemResponse,\n ITrybeSiteResponse,\n} from '../../models/integration-configuration.model';\n\n/**\n * Maps Trybe site API response to the system site response (e.g. for getSiteDetailedInformation).\n */\nexport function mapTrybeSiteResponseToSystem(\n response: ITrybeSiteResponse,\n): ISiteSystemResponse {\n return {\n customPaymentTypes: response.data?.custom_payment_types?.map(\n (paymentType) => ({\n id: paymentType.id,\n name: paymentType.name,\n kind: paymentType.kind,\n }),\n ),\n };\n}\n","import { CommonValidationDatabaseService } from '@dv4resi/dvss-backend-module-datastore';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\nimport type {\n AddAPIResponse,\n GraphQLContext,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { LoggerService } from '@dv4resi/dvss-backend-module-utility';\nimport {\n BaseIntegrationConfiguration,\n HTTP_METHOD,\n type IAddCapabilityIntegrationConfiguredFor,\n type IAddCapabilityIntegrationInput,\n type ICapabilityIntegration,\n IntegrationConfigurationDao,\n type IUpdateCapabilityIntegrationRequest,\n type IUpdateCapabilityIntegrationResponse,\n TrafficGatewayService,\n} from '@dvss/dvss-integration-libs';\nimport { Injectable } from '@nestjs/common';\nimport type {\n ISiteSystemResponse,\n ITrybeSiteResponse,\n} from '../../models/integration-configuration.model';\nimport { TrybeAuthService } from '../auth/auth.service';\nimport { mapTrybeSiteResponseToSystem } from './integration-configuration.mapper';\n\n/**\n * Trybe implementation of integration configuration.\n * - Validates Trybe-specific config (apiKey, siteId, organisationId, platformConfig.baseUrl) when config is present.\n * - Validates configuredFor (offering exists and belongs to project) when configuredFor is present.\n */\n@Injectable()\nexport class TrybeIntegrationConfigurationService extends BaseIntegrationConfiguration {\n constructor(\n integrationConfigurationDao: IntegrationConfigurationDao,\n commonValidationDatabaseService: CommonValidationDatabaseService,\n logger: LoggerService,\n private readonly trybeAuthService: TrybeAuthService,\n private readonly trafficGatewayService: TrafficGatewayService,\n ) {\n super(integrationConfigurationDao, commonValidationDatabaseService, logger);\n }\n\n /**\n * Add capability integration: validate Trybe config, then configuredFor (offering), then delegate to base.\n */\n override async addCapabilityIntegration(\n input: IAddCapabilityIntegrationInput,\n context: GraphQLContext,\n ): Promise<AddAPIResponse> {\n this.trybeAuthService.validateConfig(\n { config: input.config } as ICapabilityIntegration,\n context.loggedInUserId,\n );\n\n if (input.configuredFor != null) {\n await this.validateCapabilityIntegrationConfiguredForInput(\n input.configuredFor,\n input.projectId,\n );\n }\n\n return super.addCapabilityIntegration(input, context);\n }\n\n /**\n * Update capability integration: convert to new signature and delegate to base.\n */\n override async updateCapabilityIntegration(\n request: IUpdateCapabilityIntegrationRequest,\n integration?: ICapabilityIntegration,\n loggedInUserId?: bigint,\n ): Promise<IUpdateCapabilityIntegrationResponse> {\n if (request.updateData.config) {\n this.trybeAuthService.validateConfig(\n {\n config: request.updateData.config,\n } as unknown as ICapabilityIntegration,\n loggedInUserId as bigint,\n );\n }\n\n return super.updateCapabilityIntegration(\n request,\n integration,\n loggedInUserId,\n );\n }\n\n /**\n * Validates configuredFor (offering exists and belongs to project). Same as project-ms validateCapabilityIntegrationConfiguredForInput.\n */\n private async validateCapabilityIntegrationConfiguredForInput(\n configuredFor: IAddCapabilityIntegrationConfiguredFor,\n projectId: number,\n ): Promise<void> {\n if (configuredFor.configuredForType !== CONFIGURED_FOR_TYPE_ENUM.OFFERING) {\n throw new Error(\n `configuredForType not supported: ${configuredFor.configuredForType}`,\n );\n }\n\n await this.commonValidationDatabaseService.getOffering({\n offeringId: configuredFor.configuredForId,\n projectId,\n });\n }\n\n /**\n * Trybe 3rd party: GET /shop/sites/{siteId} via executeIntegrationRequest.\n */\n async getSiteDetailedInformation(\n integration: ICapabilityIntegration,\n loggedInUserId: bigint,\n ): Promise<ISiteSystemResponse | undefined> {\n const validatedIntegration = this.trybeAuthService.validateConfig(\n integration,\n loggedInUserId,\n );\n\n const siteId = validatedIntegration.config.integrationConfig.siteId;\n const url = `/shop/sites/${siteId}`;\n const response =\n await this.trafficGatewayService.executeIntegrationRequest<ITrybeSiteResponse>(\n {\n apiMethod: HTTP_METHOD.GET,\n url,\n baseUrl: validatedIntegration.config.platformConfig.baseUrl,\n headers: validatedIntegration.headers,\n },\n validatedIntegration,\n loggedInUserId,\n );\n\n return mapTrybeSiteResponseToSystem(response);\n }\n}\n","/**\n * Trybe implementation for integration resource management (e.g. offering integration).\n * Implements addResourceToIntegration and removeResourceFromIntegration via UIF.\n * Validation (config + mapping exists) lives in this wrapper; base holds only inter-service implementation.\n */\n\nimport { Injectable } from '@nestjs/common';\nimport {\n BaseIntegrationResourceManagement,\n IntegrationResourceManagementDao,\n type IAddResourceToIntegrationInput,\n type IAddResourceToIntegrationResponse,\n type IRemoveResourceFromIntegrationRequest,\n type IRemoveResourceFromIntegrationResponse,\n type IUpdateOfferingIntegrationResourceConfigurationInput,\n type IUpdateOfferingIntegrationResourceConfigurationResponse,\n} from '@dvss/dvss-integration-libs';\nimport {\n CustomException,\n ERROR_NAMES,\n GraphQLContext,\n LoggerService,\n} from '@dv4resi/dvss-backend-module-utility';\nimport { CONFIGURED_FOR_TYPE_ENUM } from '@dv4resi/dvss-backend-module-datastore/dist/datastore/models';\n\nimport {\n type ITrybeResourceMappingConfiguration,\n TRYBE_CATALOGING_BY_ENUM,\n} from '../../models/integration-resource-management.model';\n\n/** Error message when add is called but mapping already exists (MS can catch by message if needed). */\nexport const OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS =\n 'OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS';\n\nconst VALID_JOURNEY_VALUES = new Set<string>([\n 'SESSION',\n 'COURSE',\n 'APPOINTMENT',\n]);\n\n@Injectable()\nexport class TrybeIntegrationResourceManagementService extends BaseIntegrationResourceManagement {\n constructor(\n logger: LoggerService,\n integrationResourceManagementDao: IntegrationResourceManagementDao,\n ) {\n super(integrationResourceManagementDao, logger);\n }\n\n /**\n * Validates Trybe resource mapping config (same rules as MS trybe-offering-integration-management.service).\n * @throws CustomException BAD_REQUEST if config is invalid\n */\n validateResourceMappingConfig(config: Record<string, unknown>): void {\n const resourceMappingConfig = config as ITrybeResourceMappingConfiguration;\n\n if (\n !resourceMappingConfig.supportedJourneys ||\n resourceMappingConfig.supportedJourneys.length === 0\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys required and must be non-empty',\n );\n }\n\n if (\n !resourceMappingConfig.catalogingBy ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n resourceMappingConfig.catalogingBy !==\n TRYBE_CATALOGING_BY_ENUM.PEOPLE_RESOURCE\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: catalogingBy must be PEOPLE_RESOURCE',\n );\n }\n\n if (\n !resourceMappingConfig.supportedJourneys.some((journey) =>\n VALID_JOURNEY_VALUES.has(journey),\n )\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys must contain at least one of SESSION, COURSE, APPOINTMENT',\n );\n }\n\n if (\n resourceMappingConfig.supportedJourneys.some(\n (journey) => !VALID_JOURNEY_VALUES.has(journey),\n )\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: supportedJourneys may only contain SESSION, COURSE, APPOINTMENT',\n );\n }\n\n if (\n !resourceMappingConfig.paymentType ||\n typeof resourceMappingConfig.paymentType !== 'string'\n ) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Invalid Trybe resource mapping config: paymentType required and must be a string',\n );\n }\n }\n\n override async addResourceToIntegration(\n input: IAddResourceToIntegrationInput,\n context: GraphQLContext,\n ): Promise<IAddResourceToIntegrationResponse> {\n if (input.config != null && typeof input.config === 'object') {\n this.validateResourceMappingConfig(input.config);\n }\n\n const isMappingExists =\n await this.integrationResourceManagementDao.checkMappingExists(\n {\n capabilityIntegrationId: input.capabilityIntegrationId,\n configuredForId: input.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context.loggedInUserId,\n );\n\n if (isMappingExists) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n OFFERING_INTEGRATION_MAPPING_ALREADY_EXISTS,\n );\n }\n\n return super.addResourceToIntegration(input, context);\n }\n\n override async removeResourceFromIntegration(\n request: IRemoveResourceFromIntegrationRequest,\n context: GraphQLContext,\n ): Promise<IRemoveResourceFromIntegrationResponse> {\n const isMappingExists =\n await this.integrationResourceManagementDao.checkMappingExists(\n {\n capabilityIntegrationId: request.capabilityIntegrationId,\n configuredForId: request.offeringId,\n configuredForType: CONFIGURED_FOR_TYPE_ENUM.OFFERING,\n },\n context.loggedInUserId,\n );\n\n if (!isMappingExists) {\n throw new CustomException(ERROR_NAMES.BAD_REQUEST, 'Mapping not found');\n }\n\n return super.removeResourceFromIntegration(request, context);\n }\n\n override async updateOfferingIntegrationResourceConfiguration(\n input: IUpdateOfferingIntegrationResourceConfigurationInput,\n context: GraphQLContext,\n ): Promise<IUpdateOfferingIntegrationResourceConfigurationResponse> {\n const resourceMapping =\n await this.integrationResourceManagementDao.getCapabilityIntegrationResourceMappingById(\n input.id,\n context.loggedInUserId,\n );\n\n if (!resourceMapping) {\n throw new CustomException(\n ERROR_NAMES.BAD_REQUEST,\n 'Resource mapping not found',\n );\n }\n\n this.validateResourceMappingConfig(input.config);\n return await super.updateOfferingIntegrationResourceConfiguration(\n input,\n context,\n );\n }\n}\n","// Load environment variables BEFORE importing modules that check env vars at import time\nimport './load-env';\nimport { LoggerModule } from '@dv4resi/dvss-backend-module-utility';\nimport { HttpModule } from '@nestjs/axios';\nimport { ConfigModule } from '@nestjs/config';\nimport { Module } from '@nestjs/common';\nimport { resolve } from 'path';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport {\n IntegrationLibsModule,\n RateLimiterService,\n TrafficGatewayService,\n IntegrationRequestLoggerService,\n IntegrationConfigurationDao,\n IntegrationResourceManagementDao,\n} from '@dvss/dvss-integration-libs';\nimport { TrybeAuthService } from './capabilities/auth/auth.service';\nimport { TrybeCustomerManagement } from './capabilities/customer-management/customer-management.service';\nimport { TrybeCreditBooking } from './capabilities/credit-management/credit-booking.service';\nimport { TrybeWellnessManagement } from './capabilities/wellness/wellness-management.service';\nimport {\n CommonValidationDatabaseService,\n DatastoreModule,\n} from '@dv4resi/dvss-backend-module-datastore';\nimport { TrybeIntegrationConfigurationService } from './capabilities/integration-configuration/integration-configuration.service';\nimport { TrybeIntegrationResourceManagementService } from './capabilities/integration-resource-management/integration-resource-management.service';\n\n@Module({\n imports: [\n // Load environment variables from root .env file\n ConfigModule.forRoot({\n envFilePath: resolve(__dirname, '../../../.env'),\n isGlobal: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any,\n IntegrationLibsModule,\n HttpModule,\n LoggerModule,\n DatastoreModule,\n ],\n controllers: [AppController],\n providers: [\n AppService,\n TrybeAuthService,\n TrybeCustomerManagement,\n TrybeCreditBooking,\n TrybeWellnessManagement,\n IntegrationConfigurationDao,\n IntegrationResourceManagementDao,\n IntegrationRequestLoggerService,\n RateLimiterService,\n TrafficGatewayService,\n TrybeCustomerManagement,\n TrybeAuthService,\n TrybeIntegrationConfigurationService,\n TrybeIntegrationResourceManagementService,\n CommonValidationDatabaseService,\n ],\n exports: [\n TrybeAuthService,\n TrybeCustomerManagement,\n TrybeCreditBooking,\n TrybeWellnessManagement,\n TrybeIntegrationConfigurationService,\n TrybeIntegrationResourceManagementService,\n ],\n})\nexport class AppModule {}\n","import { Module } from '@nestjs/common';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\nimport { IntegrationTrybeModule } from '@dvss/dvss-integration-trybe';\nimport { IntegrationLibsModule } from '@dvss/dvss-integration-libs';\n\n@Module({\n imports: [IntegrationTrybeModule, IntegrationLibsModule],\n controllers: [AppController],\n providers: [AppService, IntegrationTrybeModule, IntegrationLibsModule],\n exports: [IntegrationTrybeModule, IntegrationLibsModule],\n})\nexport class AppModule {}\n"]}