diff --git a/.env.backup.20250908_174356 b/.env.backup.20250908_174356 deleted file mode 100644 index b9166c54..00000000 --- a/.env.backup.20250908_174356 +++ /dev/null @@ -1,100 +0,0 @@ -# ๐Ÿš€ Customer Portal - Development Environment -# Copy this file to .env for local development -# This configuration is optimized for development with hot-reloading - -# ============================================================================= -# ๐Ÿ—„๏ธ DATABASE CONFIGURATION (Development) -# ============================================================================= -DATABASE_URL="postgresql://dev:dev@localhost:5432/portal_dev?schema=public" - -# ============================================================================= -# ๐Ÿ”ด REDIS CONFIGURATION (Development) -# ============================================================================= -REDIS_URL="redis://localhost:6379" - -# ============================================================================= -# ๐ŸŒ APPLICATION CONFIGURATION (Development) -# ============================================================================= -# Backend Configuration -BFF_PORT=4000 -APP_NAME="customer-portal-bff" -NODE_ENV="development" - - -# Frontend Configuration (NEXT_PUBLIC_ variables are exposed to browser) -NEXT_PORT=3000 -NEXT_PUBLIC_APP_NAME="Customer Portal (Dev)" -NEXT_PUBLIC_APP_VERSION="1.0.0-dev" -NEXT_PUBLIC_API_BASE="http://localhost:4000/api" -NEXT_PUBLIC_ENABLE_DEVTOOLS="true" - -# ============================================================================= -# ๐Ÿ” SECURITY CONFIGURATION (Development) -# ============================================================================= -# JWT Secret (Development - OK to use simple secret) -JWT_SECRET="HjHsUyTE3WhPn5N07iSvurdV4hk2VEkIuN+lIflHhVQ=" -JWT_EXPIRES_IN="7d" - -# Password Hashing (Minimum rounds for security compliance) -BCRYPT_ROUNDS=10 - -# CORS (Allow local frontend) -CORS_ORIGIN="http://localhost:3000" - -# ============================================================================= -# ๐Ÿข EXTERNAL API CONFIGURATION (Development) -# ============================================================================= -# WHMCS Integration -#WHMCS Dev credentials -WHMCS_DEV_BASE_URL="https://dev-wh.asolutions.co.jp" -WHMCS_DEV_API_IDENTIFIER="WZckHGfzAQEum3v5SAcSfzgvVkPJEF2M" -WHMCS_DEV_API_SECRET="YlqKyynJ6I1088DV6jufFj6cJiW0N0y4" - -# Optional: If your WHMCS requires the API Access Key, set it here -# WHMCS_API_ACCESS_KEY="your_whmcs_api_access_key" - -# Salesforce Integration -SF_LOGIN_URL="https://asolutions.my.salesforce.com" -SF_CLIENT_ID="3MVG9n_HvETGhr3Af33utEHAR_KbKEQh_.KRzVBBA6u3tSIMraIlY9pqNqKJgUILstAPS4JASzExj3OpCRbLz" -SF_PRIVATE_KEY_PATH="./secrets/sf-private.key" -SF_USERNAME="portal.integration@asolutions.co.jp" - -GITHUB_TOKEN=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 - -# ============================================================================= -# ๐Ÿ“Š LOGGING CONFIGURATION (Development) -# ============================================================================= -LOG_LEVEL="debug" -# Available levels: error, warn, info, debug, trace -# Use "warn" for even less noise, "debug" for troubleshooting - -# Disable HTTP request/response logging for cleaner output -DISABLE_HTTP_LOGGING="false" - -# ============================================================================= -# ๐ŸŽ›๏ธ DEVELOPMENT CONFIGURATION -# ============================================================================= -# Node.js options for development -NODE_OPTIONS="--no-deprecation" - -# ============================================================================= -# ๐Ÿณ DOCKER DEVELOPMENT NOTES -# ============================================================================= -# For Docker development services (PostgreSQL + Redis only): -# 1. Run: pnpm dev:start -# 2. Frontend and Backend run locally (outside containers) for hot-reloading -# 3. Only database and cache services run in containers -# Freebit API Configuration -FREEBIT_BASE_URL=https://i1-q.mvno.net/emptool/api/ -FREEBIT_OEM_ID=PASI -FREEBIT_OEM_KEY=6Au3o7wrQNR07JxFHPmf0YfFqN9a31t5 -FREEBIT_TIMEOUT=30000 -FREEBIT_RETRY_ATTEMPTS=3 - -# Salesforce Platform Event -SF_EVENTS_ENABLED=true -SF_PROVISION_EVENT_CHANNEL=/event/Order_Fulfilment_Requested__e -SF_EVENTS_REPLAY=LATEST -SF_PUBSUB_ENDPOINT=api.pubsub.salesforce.com:7443 -SF_PUBSUB_NUM_REQUESTED=50 -SF_PUBSUB_QUEUE_MAX=100 \ No newline at end of file diff --git a/.gitignore b/.gitignore index f5884f0f..03e73713 100644 --- a/.gitignore +++ b/.gitignore @@ -79,6 +79,7 @@ jspm_packages/ # TypeScript cache *.tsbuildinfo **/tsconfig.tsbuildinfo +**/.typecheck/ # Optional npm cache directory .npm/ diff --git a/.nvmrc b/.nvmrc index 1d9b7831..d135defb 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.12.0 +22.12.0 \ No newline at end of file diff --git a/EXAMPLE_USAGE.md b/EXAMPLE_USAGE.md deleted file mode 100644 index 0d0413d4..00000000 --- a/EXAMPLE_USAGE.md +++ /dev/null @@ -1,565 +0,0 @@ -# Example Usage of New Type Patterns - -This document shows practical examples of how to use the new unified type patterns from `@customer-portal/domain`. - -## 1. Basic Async State Usage - -### Custom Hook with New Async State - -```typescript -// hooks/useUser.ts -import { useState, useEffect } from 'react'; -import { - AsyncState, - createIdleState, - createLoadingState, - createSuccessState, - createErrorState, - type User -} from '@customer-portal/domain'; - -export function useUser(userId: string) { - const [state, setState] = useState>(createIdleState()); - - useEffect(() => { - if (!userId) return; - - setState(createLoadingState()); - - fetchUser(userId) - .then(user => setState(createSuccessState(user))) - .catch(error => setState(createErrorState(error.message))); - }, [userId]); - - return state; -} -``` - -### Component Using Async State - -```typescript -// components/UserProfile.tsx -import React from 'react'; -import { isLoading, isError, isSuccess, isIdle } from '@customer-portal/domain'; -import { useUser } from '../hooks/useUser'; - -interface UserProfileProps { - userId: string; -} - -export function UserProfile({ userId }: UserProfileProps) { - const userState = useUser(userId); - - if (isIdle(userState)) { - return
Ready to load user...
; - } - - if (isLoading(userState)) { - return
Loading user...
; - } - - if (isError(userState)) { - return ( -
-

Error loading user

-

{userState.error}

-
- ); - } - - if (isSuccess(userState)) { - return ( -
-

{userState.data.name}

-

Email: {userState.data.email}

-

Phone: {userState.data.phone}

-
- ); - } - - // This should never happen with discriminated unions - return null; -} -``` - -## 2. Form State Usage - -### Custom Form Hook - -```typescript -// hooks/useLoginForm.ts -import { useState } from 'react'; -import { - FormState, - createFormState, - updateFormField, - getFormValues, - hasFormErrors, - isFormDirty -} from '@customer-portal/domain'; - -interface LoginFormData { - email: string; - password: string; -} - -export function useLoginForm() { - const [formState, setFormState] = useState>( - createFormState({ - email: '', - password: '', - }) - ); - - const updateField = (field: keyof LoginFormData, value: string, error?: string) => { - setFormState(prev => ({ - ...prev, - [field]: updateFormField(prev[field], value, error), - isValid: !error && !hasFormErrors(prev), - })); - }; - - const validateEmail = (email: string): string | undefined => { - if (!email) return 'Email is required'; - if (!/\S+@\S+\.\S+/.test(email)) return 'Email is invalid'; - return undefined; - }; - - const validatePassword = (password: string): string | undefined => { - if (!password) return 'Password is required'; - if (password.length < 8) return 'Password must be at least 8 characters'; - return undefined; - }; - - const handleEmailChange = (email: string) => { - const error = validateEmail(email); - updateField('email', email, error); - }; - - const handlePasswordChange = (password: string) => { - const error = validatePassword(password); - updateField('password', password, error); - }; - - const handleSubmit = async () => { - const formData = getFormValues(formState); - - // Validate all fields - const emailError = validateEmail(formData.email); - const passwordError = validatePassword(formData.password); - - if (emailError || passwordError) { - setFormState(prev => ({ - ...prev, - email: { ...prev.email, error: emailError }, - password: { ...prev.password, error: passwordError }, - isValid: false, - })); - return; - } - - setFormState(prev => ({ ...prev, isSubmitting: true })); - - try { - await login(formData); - // Handle success - } catch (error) { - // Handle error - setFormState(prev => ({ - ...prev, - isSubmitting: false, - errors: { email: 'Login failed. Please check your credentials.' } - })); - } - }; - - return { - formState, - handleEmailChange, - handlePasswordChange, - handleSubmit, - isValid: formState.isValid && !hasFormErrors(formState), - isDirty: isFormDirty(formState), - }; -} -``` - -### Login Form Component - -```typescript -// components/LoginForm.tsx -import React from 'react'; -import { useLoginForm } from '../hooks/useLoginForm'; - -export function LoginForm() { - const { - formState, - handleEmailChange, - handlePasswordChange, - handleSubmit, - isValid, - isDirty, - } = useLoginForm(); - - return ( -
{ e.preventDefault(); handleSubmit(); }}> -
- - handleEmailChange(e.target.value)} - className={formState.email.error ? 'error' : ''} - /> - {formState.email.error && ( - {formState.email.error} - )} -
- -
- - handlePasswordChange(e.target.value)} - className={formState.password.error ? 'error' : ''} - /> - {formState.password.error && ( - {formState.password.error} - )} -
- - - - {isDirty && ( -

You have unsaved changes

- )} -
- ); -} -``` - -## 3. API Integration with Adapters - -### Service Layer with Adapters - -```typescript -// services/userService.ts -import { - adaptWhmcsResponse, - adaptSalesforceResponse, - unwrapResponse, - isSuccessResponse, - type ApiResponse, - type User, - type WhmcsClientId, - createWhmcsClientId -} from '@customer-portal/domain'; - -class UserService { - async getUser(userId: string): Promise { - // Get user from WHMCS - const whmcsResponse = await this.whmcsApi.getClient( - createWhmcsClientId(parseInt(userId)) - ); - - const unifiedResponse = adaptWhmcsResponse(whmcsResponse); - return unwrapResponse(unifiedResponse); - } - - async updateUser(userId: string, userData: Partial): Promise { - // Update in both WHMCS and Salesforce - const [whmcsResponse, sfResponse] = await Promise.all([ - this.whmcsApi.updateClient(createWhmcsClientId(parseInt(userId)), userData), - this.salesforceApi.updateContact(userId, userData), - ]); - - const whmcsResult = adaptWhmcsResponse(whmcsResponse); - const sfResult = adaptSalesforceResponse(sfResponse); - - // Check both responses - if (!isSuccessResponse(whmcsResult)) { - throw new Error(`WHMCS update failed: ${whmcsResult.error.message}`); - } - - if (!isSuccessResponse(sfResult)) { - throw new Error(`Salesforce update failed: ${sfResult.error.message}`); - } - - return whmcsResult.data; - } - - async searchUsers(query: string): Promise { - try { - const response = await this.api.searchUsers(query); - const adaptedResponse = adaptWhmcsResponse(response); - return unwrapResponse(adaptedResponse); - } catch (error) { - console.error('User search failed:', error); - return []; - } - } -} - -export const userService = new UserService(); -``` - -### Hook with API Integration - -```typescript -// hooks/useUserSearch.ts -import { useState, useCallback } from 'react'; -import { - AsyncState, - createIdleState, - createLoadingState, - createSuccessState, - createErrorState, - type User -} from '@customer-portal/domain'; -import { userService } from '../services/userService'; - -export function useUserSearch() { - const [searchState, setSearchState] = useState>(createIdleState()); - const [query, setQuery] = useState(''); - - const searchUsers = useCallback(async (searchQuery: string) => { - if (!searchQuery.trim()) { - setSearchState(createIdleState()); - return; - } - - setSearchState(createLoadingState()); - - try { - const users = await userService.searchUsers(searchQuery); - setSearchState(createSuccessState(users)); - } catch (error) { - setSearchState(createErrorState(error instanceof Error ? error.message : 'Search failed')); - } - }, []); - - return { - searchState, - query, - setQuery, - searchUsers, - }; -} -``` - -## 4. Paginated Data Usage - -### Paginated List Hook - -```typescript -// hooks/useUserList.ts -import { useState, useEffect, useCallback } from 'react'; -import { - PaginatedAsyncState, - PaginationParams, - createIdleState, - createLoadingState, - createSuccessState, - createErrorState, - validatePaginationParams, - type User -} from '@customer-portal/domain'; - -export function useUserList(initialParams: PaginationParams = {}) { - const [state, setState] = useState>(createIdleState()); - const [params, setParams] = useState(() => validatePaginationParams(initialParams)); - - const loadUsers = useCallback(async (paginationParams: PaginationParams) => { - setState(createLoadingState()); - - try { - const validatedParams = validatePaginationParams(paginationParams); - const response = await userService.getUsers(validatedParams); - - setState({ - status: 'success', - data: response.data, - pagination: response.pagination, - }); - } catch (error) { - setState(createErrorState(error instanceof Error ? error.message : 'Failed to load users')); - } - }, []); - - const goToPage = useCallback((page: number) => { - const newParams = { ...params, page }; - setParams(newParams); - loadUsers(newParams); - }, [params, loadUsers]); - - const changePageSize = useCallback((limit: number) => { - const newParams = { ...params, limit, page: 1 }; - setParams(newParams); - loadUsers(newParams); - }, [params, loadUsers]); - - useEffect(() => { - loadUsers(params); - }, [loadUsers, params]); - - return { - state, - params, - goToPage, - changePageSize, - reload: () => loadUsers(params), - }; -} -``` - -### Paginated List Component - -```typescript -// components/UserList.tsx -import React from 'react'; -import { isLoading, isError, isSuccess } from '@customer-portal/domain'; -import { useUserList } from '../hooks/useUserList'; - -export function UserList() { - const { state, params, goToPage, changePageSize, reload } = useUserList({ - page: 1, - limit: 10, - }); - - if (isLoading(state)) { - return
Loading users...
; - } - - if (isError(state)) { - return ( -
-

Error: {state.error}

- -
- ); - } - - if (isSuccess(state)) { - return ( -
-
-

Users ({state.pagination.total})

- -
- -
- {state.data.map(user => ( -
-

{user.name}

-

{user.email}

-
- ))} -
- -
- - - - Page {state.pagination.page} of {state.pagination.totalPages} - - - -
-
- ); - } - - return null; -} -``` - -## 5. Selection State Usage - -### Selection Hook - -```typescript -// hooks/useSelection.ts -import { useState, useCallback } from 'react'; -import { - SelectionState, - createSelectionState, - updateSelectionState -} from '@customer-portal/domain'; - -export function useSelection() { - const [selectionState, setSelectionState] = useState>( - createSelectionState() - ); - - const toggleItem = useCallback((item: T) => { - setSelectionState(prev => { - const isSelected = prev.selected.includes(item); - return updateSelectionState(prev, item, !isSelected); - }); - }, []); - - const selectAll = useCallback((items: T[]) => { - setSelectionState({ - selected: [...items], - selectAll: true, - indeterminate: false, - }); - }, []); - - const deselectAll = useCallback(() => { - setSelectionState(createSelectionState()); - }, []); - - return { - selectionState, - toggleItem, - selectAll, - deselectAll, - hasSelection: selectionState.selected.length > 0, - selectedCount: selectionState.selected.length, - }; -} -``` - -## Key Benefits Demonstrated - -1. **Type Safety**: Impossible states are eliminated -2. **Consistency**: Same patterns across all components -3. **Reusability**: Hooks and utilities can be shared -4. **Maintainability**: Clear separation of concerns -5. **Developer Experience**: Better IntelliSense and debugging - -## Next Steps - -1. Use these patterns in your new components -2. Gradually migrate existing components -3. Add tests for your hooks and components -4. Customize the patterns for your specific needs - -These examples show how the new type patterns lead to more robust, maintainable, and type-safe code while providing an excellent developer experience. diff --git a/FINAL_IMPLEMENTATION_SUMMARY.md b/FINAL_IMPLEMENTATION_SUMMARY.md deleted file mode 100644 index a9004bd4..00000000 --- a/FINAL_IMPLEMENTATION_SUMMARY.md +++ /dev/null @@ -1,253 +0,0 @@ -# ๐ŸŽ‰ TypeScript Type Structure Modernization - COMPLETE! - -## Implementation Summary - -We have successfully completed the comprehensive modernization of the TypeScript type structure across the customer portal monorepo. All 4 phases have been implemented with excellent results. - -## โœ… **PHASE 1: FOUNDATION - COMPLETED** - -### ๐Ÿ”ง **Unified State Patterns Created** -- **Location**: `packages/domain/src/patterns/` -- **New Files**: - - `async-state.ts` - Discriminated union async states with type guards - - `form-state.ts` - Enhanced form state with field-level validation - - `pagination.ts` - Unified pagination types and utilities - - `index.ts` - Clean barrel exports - -### ๐Ÿท๏ธ **Branded Types Added** -- **Location**: `packages/domain/src/common.ts` -- **Enhanced Type Safety**: - - `UserId`, `OrderId`, `InvoiceId`, `SubscriptionId`, `PaymentId`, `CaseId`, `SessionId` - - `WhmcsClientId`, `WhmcsInvoiceId`, `WhmcsProductId` - - `SalesforceContactId`, `SalesforceAccountId`, `SalesforceCaseId` -- **Helper Functions**: Creation functions and type guards for all branded types - -### ๐Ÿ› ๏ธ **Utility Types Created** -- **Location**: `packages/domain/src/utils/type-utils.ts` -- **Categories**: - - Entity utilities (`WithId`, `WithTimestamps`, `CreateInput`, `UpdateInput`) - - API utilities (`ApiEndpoint`, `ResponseWithMeta`) - - Form utilities (`FormData`, `ValidationResult`) - - Selection utilities (`SelectionState`, `SelectionActions`) - - Filter utilities (`FilterState`, `DateRangeFilter`, `SearchFilter`) - - Advanced TypeScript utilities (`PartialBy`, `RequiredBy`, `DeepPartial`, etc.) - -## โœ… **PHASE 2: CONSOLIDATION - COMPLETED** - -### ๐Ÿ”„ **API Response Adapters Created** -- **Location**: `packages/domain/src/adapters/` (Note: Not exported in final version per user preference) -- **Adapters Built**: - - `adaptWhmcsResponse` - Converts WHMCS API responses to unified format - - `adaptSalesforceResponse` - Converts Salesforce API responses - - `adaptFreebitResponse` - Converts Freebit API responses - - `adaptHttpResponse` - Generic HTTP response adapter -- **Utilities**: `isSuccessResponse`, `isErrorResponse`, `unwrapResponse`, `mapResponseData` - -### ๐Ÿ”„ **Async State Migration** -- **Updated Files**: - - `packages/domain/src/utils/ui-state.ts` - Marked old patterns as deprecated, added migration helpers - - `apps/portal/src/types/index.ts` - Updated to use new patterns from domain package - - `apps/portal/src/features/checkout/hooks/useCheckout.ts` - Migrated to new AsyncState pattern - - `apps/portal/src/features/checkout/views/CheckoutContainer.tsx` - Updated to use type guards -- **Migration Helpers**: `migrateAsyncState`, `legacyAsyncState` for gradual migration -- **Backward Compatibility**: Old interfaces preserved with deprecation warnings - -### ๐Ÿ“ **Form State Updates** -- **Enhanced Patterns**: New form state with field-level validation and utilities -- **Helper Functions**: `createFormState`, `updateFormField`, `getFormValues`, etc. -- **Type Safety**: Better form field typing and validation integration - -## โœ… **PHASE 3: ENHANCEMENT - COMPLETED** - -### โœ… **Runtime Type Validation with Zod** -- **Location**: `packages/domain/src/validation/` -- **New Files**: - - `base-schemas.ts` - Common validation schemas (email, phone, address, etc.) - - `entity-schemas.ts` - Entity-specific validation schemas - - `form-builder.ts` - Type-safe form builder with validation - - `index.ts` - Clean exports to avoid conflicts -- **Features**: - - Runtime validation for all domain entities - - Form validation schemas for login, signup, address, contact forms - - Type-safe form builders with real-time validation - - Async validation support with debouncing - -### ๐ŸŒ **Type-Safe API Client** -- **Location**: `packages/domain/src/client/` -- **Features**: - - Branded type support for all ID types - - Generic CRUD operations with type safety - - Entity-specific methods (users, orders, invoices, subscriptions, payments, support cases) - - Built-in error handling and response transformation - - Authentication support with token management - - Configurable headers and request options - -### ๐Ÿ“‹ **Enhanced Form Builders** -- **Type-Safe Form Builder Class**: Integrates Zod validation with form state management -- **Field-Level Validation**: Real-time validation as users type -- **Async Validation Support**: For server-side validation (email uniqueness, etc.) -- **Form Submission Handling**: Type-safe form submission with error handling - -## โœ… **PHASE 4: CLEANUP - COMPLETED** - -### ๐Ÿงน **Removed Unnecessary Files** -- **Deleted**: `apps/portal/src/features/checkout/types/index.ts` and directory -- **Reason**: Unnecessary re-export file that just imported from domain and portal types - -### ๐Ÿ“ฆ **Updated Direct Imports** -- **Updated Files**: - - `apps/portal/src/features/catalog/hooks/useCatalog.ts` - - `apps/portal/src/features/catalog/services/catalog.service.ts` - - `apps/portal/src/features/catalog/utils/catalog.utils.ts` - - `apps/portal/src/features/checkout/hooks/useCheckout.ts` -- **Changes**: Replaced imports from `@/types` with direct imports from `@customer-portal/domain` -- **Type Aliases**: Added local type aliases for convenience where needed - -## ๐Ÿ“Š **QUANTIFIED RESULTS** - -### **Type Safety Improvements** -- โœ… **100% Elimination of Impossible States**: Discriminated unions prevent invalid state combinations -- โœ… **Enhanced ID Type Safety**: Branded types prevent mixing different ID types -- โœ… **Runtime Validation**: Zod schemas provide runtime type checking -- โœ… **Better IntelliSense**: Improved developer experience with better autocomplete - -### **Code Organization** -- โœ… **Single Source of Truth**: All patterns centralized in domain package -- โœ… **Clear Separation**: Business logic vs UI concerns properly separated -- โœ… **Consistent Patterns**: Same async state pattern used throughout application -- โœ… **Reduced Duplication**: ~80% reduction in type duplication (estimated) - -### **Developer Experience** -- โœ… **Type Guards**: Easy state checking with `isLoading`, `isSuccess`, `isError`, `isIdle` -- โœ… **Helper Functions**: Utility functions for common operations (`createLoadingState`, etc.) -- โœ… **Migration Support**: Backward compatibility and gradual migration path -- โœ… **Comprehensive Documentation**: Migration guides, usage examples, and implementation plans - -### **Performance Benefits** -- โœ… **Reduced Bundle Size**: Eliminated redundant type definitions -- โœ… **Better Tree-shaking**: Improved bundle optimization with proper exports -- โœ… **Smaller Memory Footprint**: More efficient state representation with discriminated unions -- โœ… **Faster Compilation**: Better TypeScript compilation times - -## ๐Ÿ”ง **TECHNICAL ACHIEVEMENTS** - -### **Modern TypeScript Patterns** -- โœ… **Discriminated Unions**: For impossible state elimination -- โœ… **Branded Types**: For enhanced type safety -- โœ… **Utility Types**: For DRY principles and code reuse -- โœ… **Generic Constraints**: For better type inference -- โœ… **Template Literal Types**: For better string type safety - -### **Runtime Validation** -- โœ… **Zod Integration**: Runtime type validation with excellent TypeScript integration -- โœ… **Form Validation**: Type-safe form handling with real-time validation -- โœ… **API Validation**: Request/response validation with proper error handling -- โœ… **Schema Composition**: Reusable validation schemas - -### **API Client Architecture** -- โœ… **Type-Safe HTTP Client**: Fully typed API client with branded types -- โœ… **Generic CRUD Operations**: Reusable patterns for all entities -- โœ… **Error Handling**: Consistent error handling across all API calls -- โœ… **Authentication**: Built-in auth token management - -## ๐Ÿ“š **DOCUMENTATION CREATED** - -### **Analysis and Planning** -- โœ… `TYPE_STRUCTURE_ANALYSIS_REPORT.md` - Comprehensive analysis and recommendations -- โœ… `TYPE_STRUCTURE_IMPLEMENTATION_PLAN.md` - Detailed step-by-step implementation guide -- โœ… `IMPLEMENTATION_PROGRESS.md` - Progress tracking and achievements - -### **Migration and Usage** -- โœ… `MIGRATION_GUIDE.md` - Before/after examples and troubleshooting -- โœ… `EXAMPLE_USAGE.md` - Real-world component and hook examples -- โœ… `FINAL_IMPLEMENTATION_SUMMARY.md` - This comprehensive summary - -## ๐Ÿš€ **READY FOR PRODUCTION** - -### **Quality Assurance** -- โœ… **All TypeScript Errors Fixed**: Both domain and portal packages compile successfully -- โœ… **No Linting Errors**: Clean code following project standards -- โœ… **Backward Compatibility**: Existing code continues to work -- โœ… **Migration Path**: Clear upgrade path for remaining code - -### **Team Readiness** -- โœ… **Comprehensive Documentation**: Everything needed for team adoption -- โœ… **Usage Examples**: Real-world patterns for common scenarios -- โœ… **Migration Helpers**: Tools to ease the transition -- โœ… **Best Practices**: Guidelines for future development - -## ๐ŸŽฏ **HOW TO USE THE NEW PATTERNS** - -### **Async State Management** -```typescript -import { AsyncState, isLoading, isSuccess, createLoadingState } from '@customer-portal/domain'; - -// New discriminated union pattern -const [state, setState] = useState>({ status: 'idle' }); - -// Type-safe state checking -if (isLoading(state)) return ; -if (isSuccess(state)) return ; -``` - -### **Form Handling** -```typescript -import { FormBuilder, loginFormSchema } from '@customer-portal/domain'; - -const formBuilder = new FormBuilder(loginFormSchema, { email: '', password: '' }); -const initialState = formBuilder.createInitialState(); -``` - -### **API Client** -```typescript -import { createTypedApiClient, UserId, createUserId } from '@customer-portal/domain'; - -const client = createTypedApiClient('/api', { authToken: 'token' }); -const user = await client.getUser(createUserId('123')); -``` - -### **Runtime Validation** -```typescript -import { userValidationSchema, validateOrThrow } from '@customer-portal/domain'; - -const validUser = validateOrThrow(userValidationSchema, userData); -``` - -## ๐Ÿ† **SUCCESS METRICS ACHIEVED** - -### **Technical Goals** โœ… -- [x] Unified state patterns implemented -- [x] Type safety enhanced with branded types -- [x] API response handling standardized -- [x] Runtime validation added -- [x] Backward compatibility maintained - -### **Developer Experience Goals** โœ… -- [x] Consistent patterns across codebase -- [x] Better IntelliSense and type checking -- [x] Comprehensive documentation provided -- [x] Migration path clearly defined -- [x] Real-world examples created - -### **Maintainability Goals** โœ… -- [x] Single source of truth established -- [x] Redundant code eliminated -- [x] Clear separation of concerns -- [x] Future-proof architecture -- [x] Team guidelines established - -## ๐ŸŽ‰ **CONCLUSION** - -The TypeScript type structure modernization has been **successfully completed** with all phases implemented. The system now features: - -- **๐Ÿ”’ Enhanced Type Safety**: Impossible states eliminated, branded types for IDs -- **๐Ÿš€ Better Performance**: Reduced bundle sizes, more efficient state management -- **๐Ÿ‘จโ€๐Ÿ’ป Improved Developer Experience**: Consistent patterns, better tooling support -- **๐Ÿ”ง Reduced Maintenance**: Single source of truth, less duplication -- **๐Ÿ“ˆ Future-Ready**: Modern TypeScript patterns, scalable architecture - -**The foundation is now in place for a more robust, maintainable, and type-safe customer portal application.** - -All code compiles successfully, maintains backward compatibility, and is ready for production use. The comprehensive documentation ensures smooth team adoption and future development. - -**Status: โœ… COMPLETE - Ready for Production Use** diff --git a/LOGGING_USAGE.md b/LOGGING_USAGE.md deleted file mode 100644 index 619fc3df..00000000 --- a/LOGGING_USAGE.md +++ /dev/null @@ -1,69 +0,0 @@ -# Simple Centralized Logging - -## โœ… **Single Pino Logger Everywhere** - -We now use **one simple Pino logger** across the entire application: - -- **Frontend (Portal)**: Uses the same Pino logger -- **Backend (BFF)**: Uses `nestjs-pino` with the same configuration -- **Shared**: Single logger configuration - -## ๐Ÿš€ **Usage Examples** - -### **Frontend (Portal)** - -```typescript -import { logger, log } from "@/lib/logger"; - -// Simple logging -log.info("User logged in", { userId: "123" }); -log.error("API call failed", error); - -// Direct Pino usage -logger.info({ userId: "123" }, "User logged in"); -``` - -### **Backend (BFF) - Dependency Injection** - -```typescript -import { Logger } from "nestjs-pino"; - -@Injectable() -export class UserService { - constructor(@Inject(Logger) private readonly logger: Logger) {} - - async findUser(id: string) { - this.logger.info({ userId: id }, "Finding user"); - } -} -``` - -### **Backend (BFF) - Direct Import** - -```typescript -import { logger, log } from "@customer-portal/domain"; - -// Simple logging -log.info("Service started"); -log.error("Database error", error); - -// Direct Pino usage -logger.info({ userId: "123" }, "User action"); -``` - -## ๐Ÿ”ง **Configuration** - -All configuration is in one place: `packages/shared/src/logger.ts` - -- **Development**: Pretty printed logs with colors -- **Production**: JSON logs for log aggregation -- **Browser**: Console-friendly output -- **Security**: Automatic redaction of sensitive fields - -## ๐ŸŽฏ **Benefits** - -- โœ… **One logger** instead of multiple complex systems -- โœ… **Same configuration** everywhere -- โœ… **No more fs/promises errors** -- โœ… **Simple imports** - just `import { log } from "@customer-portal/domain"` -- โœ… **Production ready** with automatic security redaction diff --git a/MEMORY_OPTIMIZATION_SUMMARY.md b/MEMORY_OPTIMIZATION_SUMMARY.md new file mode 100644 index 00000000..9bf049ef --- /dev/null +++ b/MEMORY_OPTIMIZATION_SUMMARY.md @@ -0,0 +1,29 @@ +# Memory & TypeScript Tooling + +## Current Status +- TypeScript diagnostics now run with a unified configuration shared across the monorepo. +- Portal and BFF type-check reliably on machines with ~8โ€“12GB available RAM when using the provided Node.js memory limits. +- Package builds remain incremental and continue to emit declaration files for downstream consumers. + +## Key Changes +- Introduced `tsconfig.base.json` to centralise shared compiler options. +- Each package/app now owns a single `tsconfig.json` (plus `tsconfig.build.json` for the NestJS app) instead of dozens of per-area configs. +- Removed the `.typecheck` staging folders and the chunked `run-chunks.mjs` workflow. +- Standardised type-check scripts to call `tsc --project --noEmit` with explicit memory budgets. +- Root `tsconfig.json` references the reusable libraries (`domain`, `logging`, `api-client`, `validation-service`) for fast incremental builds. + +## Recommended CI/CD Setup +1. Provide at least 8GB of RAM (12GB+ preferred) to the type-check job. +2. Run package checks: `pnpm type-check:packages` (invokes `tsc --noEmit` for each workspace package). +3. Run application checks: `pnpm type-check:apps` (executes the BFF and Portal scripts sequentially). +4. Optional: `pnpm type-check:workspace` runs `tsc -b --noEmit` against the shared libraries for an incremental baseline. + +## Local Development Tips +- Use `pnpm --filter run type-check:watch` (where available) for continuous feedback without emitting build artefacts. +- Keep `NODE_OPTIONS` memory ceilings from the scripts; they balance speed with predictable RAM usage on developer laptops. +- When additional capacity is available, bump `--max-old-space-size` to 8192+ in CI to future-proof larger schemas. + +## Follow-Up Ideas +- Monitor CI telemetry to validate the new memory headroom and tune limits as the codebase grows. +- Evaluate splitting large schema modules only if memory pressure returns; the current setup avoids premature fragmentation. +- Consider enabling `strict` extensions such as `noUncheckedIndexedAccess` once the pipeline is stable again. diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md deleted file mode 100644 index cf773688..00000000 --- a/MIGRATION_GUIDE.md +++ /dev/null @@ -1,393 +0,0 @@ -# TypeScript Type Migration Guide - -## Overview - -This guide helps you migrate from the old type patterns to the new unified patterns in `@customer-portal/domain`. - -## Quick Migration Reference - -### Async State Migration - -#### Before (Old Pattern) -```typescript -// Old way - multiple different patterns -interface AsyncState { - data: T | null; - loading: boolean; - error: string | null; -} - -// Usage -const [state, setState] = useState>({ - data: null, - loading: false, - error: null, -}); - -// Checking state -if (state.loading) { - return ; -} - -if (state.error) { - return ; -} - -if (state.data) { - return ; -} -``` - -#### After (New Pattern) -```typescript -// New way - discriminated union -import { AsyncState, isLoading, isError, isSuccess } from '@customer-portal/domain'; - -// Usage -const [state, setState] = useState>({ status: 'idle' }); - -// Checking state with type guards -if (isLoading(state)) { - return ; -} - -if (isError(state)) { - return ; -} - -if (isSuccess(state)) { - return ; -} -``` - -### Form State Migration - -#### Before (Old Pattern) -```typescript -interface FormState { - data: T; - errors: Record; - touched: Record; - dirty: boolean; - valid: boolean; - submitting: boolean; -} -``` - -#### After (New Pattern) -```typescript -import { FormState, createFormState, getFormValues } from '@customer-portal/domain'; - -// Create initial form state -const initialState = createFormState({ - email: '', - password: '', - name: '', -}); - -// Get form values -const formData = getFormValues(formState); -``` - -### API Response Handling - -#### Before (Multiple Patterns) -```typescript -// Different response formats everywhere -interface WhmcsResponse { - result: 'success' | 'error'; - data?: T; - message?: string; -} - -interface SalesforceResponse { - success: boolean; - data?: T; - errors?: any[]; -} -``` - -#### After (Unified with Adapters) -```typescript -import { - adaptWhmcsResponse, - adaptSalesforceResponse, - isSuccessResponse, - unwrapResponse -} from '@customer-portal/domain'; - -// Convert different API responses to unified format -const whmcsData = adaptWhmcsResponse(whmcsResponse); -const sfData = adaptSalesforceResponse(salesforceResponse); - -// Use unified response handling -if (isSuccessResponse(whmcsData)) { - console.log('WHMCS data:', whmcsData.data); -} - -// Or unwrap directly (throws on error) -const userData = unwrapResponse(whmcsData); -``` - -## Step-by-Step Migration Process - -### 1. Update Imports - -Replace old imports: -```typescript -// โŒ Old -import type { AsyncState } from '../types'; -import type { FormState } from '../utils/ui-state'; - -// โœ… New -import type { AsyncState, FormState } from '@customer-portal/domain'; -``` - -### 2. Update State Initialization - -Replace old state initialization: -```typescript -// โŒ Old -const [userState, setUserState] = useState({ - data: null, - loading: false, - error: null, -}); - -// โœ… New -const [userState, setUserState] = useState>({ - status: 'idle' -}); -``` - -### 3. Update State Transitions - -Replace old state updates: -```typescript -// โŒ Old -setUserState({ data: null, loading: true, error: null }); -setUserState({ data: user, loading: false, error: null }); -setUserState({ data: null, loading: false, error: 'Failed to load' }); - -// โœ… New -import { createLoadingState, createSuccessState, createErrorState } from '@customer-portal/domain'; - -setUserState(createLoadingState()); -setUserState(createSuccessState(user)); -setUserState(createErrorState('Failed to load')); -``` - -### 4. Update State Checks - -Replace old state checks: -```typescript -// โŒ Old -if (state.loading) { /* ... */ } -if (state.error) { /* ... */ } -if (state.data) { /* ... */ } - -// โœ… New -import { isLoading, isError, isSuccess } from '@customer-portal/domain'; - -if (isLoading(state)) { /* ... */ } -if (isError(state)) { /* ... */ } -if (isSuccess(state)) { /* ... */ } -``` - -### 5. Update Form Handling - -Replace old form state: -```typescript -// โŒ Old -const [formState, setFormState] = useState({ - data: { email: '', password: '' }, - errors: {}, - touched: {}, - dirty: false, - valid: true, - submitting: false, -}); - -// โœ… New -import { createFormState, updateFormField } from '@customer-portal/domain'; - -const [formState, setFormState] = useState( - createFormState({ email: '', password: '' }) -); - -// Update field -const updatedState = { - ...formState, - email: updateFormField(formState.email, newValue), -}; -``` - -## Migration Helpers - -### Temporary Compatibility - -If you need to migrate gradually, use the migration helpers: - -```typescript -import { migrateAsyncState, legacyAsyncState } from '@customer-portal/domain'; - -// Convert old state to new state -const newState = migrateAsyncState(oldState); - -// Convert new state back to old format (for backward compatibility) -const oldState = legacyAsyncState(newState); -``` - -### Custom Hooks Migration - -Update your custom hooks: - -```typescript -// โŒ Old -function useUser(id: string) { - const [state, setState] = useState({ - data: null, - loading: false, - error: null, - }); - - useEffect(() => { - setState({ data: null, loading: true, error: null }); - - fetchUser(id) - .then(user => setState({ data: user, loading: false, error: null })) - .catch(error => setState({ data: null, loading: false, error: error.message })); - }, [id]); - - return state; -} - -// โœ… New -import { AsyncState, createLoadingState, createSuccessState, createErrorState } from '@customer-portal/domain'; - -function useUser(id: string) { - const [state, setState] = useState>({ status: 'idle' }); - - useEffect(() => { - setState(createLoadingState()); - - fetchUser(id) - .then(user => setState(createSuccessState(user))) - .catch(error => setState(createErrorState(error.message))); - }, [id]); - - return state; -} -``` - -## Benefits of Migration - -### 1. Type Safety -- Impossible states are eliminated (can't have `loading: true` and `data: User` at the same time) -- Better IntelliSense and autocomplete -- Compile-time error detection - -### 2. Consistency -- Single pattern across the entire application -- Predictable state transitions -- Unified error handling - -### 3. Developer Experience -- Less cognitive load -- Easier testing -- Better debugging - -### 4. Performance -- Smaller bundle sizes -- Better tree-shaking -- Reduced memory usage - -## Common Patterns - -### Loading States -```typescript -// โœ… New pattern -function UserProfile({ userId }: { userId: string }) { - const userState = useUser(userId); - - return ( -
- {isLoading(userState) && } - {isError(userState) && } - {isSuccess(userState) && } -
- ); -} -``` - -### Form Handling -```typescript -// โœ… New pattern -function LoginForm() { - const [formState, setFormState] = useState( - createFormState({ email: '', password: '' }) - ); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - const formData = getFormValues(formState); - - try { - await login(formData); - } catch (error) { - // Handle form errors - } - }; - - return ( -
- {/* Form fields */} -
- ); -} -``` - -### API Integration -```typescript -// โœ… New pattern with adapters -async function fetchUserData(id: string) { - const whmcsResponse = await whmcsApi.getClient(id); - const unifiedResponse = adaptWhmcsResponse(whmcsResponse); - - return unwrapResponse(unifiedResponse); -} -``` - -## Troubleshooting - -### Common Issues - -1. **Type Errors After Migration** - - Make sure to import types from `@customer-portal/domain` - - Use type guards instead of direct property access - - Update state initialization to use discriminated unions - -2. **Runtime Errors** - - Check that you're using the correct state transition functions - - Ensure proper error handling with the new patterns - -3. **Performance Issues** - - The new patterns should improve performance - - If you see regressions, check for unnecessary re-renders - -### Getting Help - -- Check the implementation examples in `/packages/domain/src/patterns/` -- Look at the test files for usage patterns -- Refer to the main documentation in `TYPE_STRUCTURE_ANALYSIS_REPORT.md` - -## Next Steps - -After completing the migration: - -1. Remove deprecated type definitions -2. Update linting rules to prevent old patterns -3. Add tests for the new patterns -4. Update team documentation and training materials - -This migration will significantly improve the type safety, consistency, and maintainability of your codebase while providing a better developer experience. diff --git a/PHASE_4_CLEANUP_SUMMARY.md b/PHASE_4_CLEANUP_SUMMARY.md deleted file mode 100644 index e790082f..00000000 --- a/PHASE_4_CLEANUP_SUMMARY.md +++ /dev/null @@ -1,166 +0,0 @@ -# ๐Ÿงน Phase 4: Cleanup - Complete Summary - -## โœ… **PHASE 4 CLEANUP ACCOMPLISHED** - -### ๐Ÿ—‘๏ธ **Files Removed** -1. **`packages/domain/src/utils/ui-state.ts`** - Completely removed deprecated UI state patterns -2. **`apps/portal/src/features/checkout/types/index.ts`** - Removed unnecessary re-export file -3. **`apps/portal/src/features/checkout/types/`** - Removed empty directory - -### ๐Ÿงน **Deprecated Types Cleaned Up** -1. **Portal Types (`apps/portal/src/types/index.ts`)**: - - โŒ Removed `LegacyAsyncState` - - โŒ Removed `PaginatedState` - - โŒ Removed `FilteredState` - - โŒ Removed unnecessary type aliases (`OrderItem`, `CatalogProduct`, `ProductConfiguration`, `OrderSummary`) - - โœ… Kept only essential UI-specific extensions (`CheckoutState`) - - โœ… Cleaned up imports to only what's needed - -2. **Domain Utils (`packages/domain/src/utils/index.ts`)**: - - โŒ Removed export of deprecated `ui-state.ts` - - โœ… Added explanatory comment about migration to patterns - -### ๐Ÿ”„ **Import Updates Verified** -All files that previously imported deprecated types now use: -- โœ… **Local type aliases** where needed for convenience -- โœ… **Direct imports** from `@customer-portal/domain` -- โœ… **Modern patterns** (discriminated unions, branded types, etc.) - -**Files Updated in Previous Phases (Verified Still Working)**: -- `apps/portal/src/features/catalog/hooks/useCatalog.ts` -- `apps/portal/src/features/catalog/services/catalog.service.ts` -- `apps/portal/src/features/catalog/utils/catalog.utils.ts` -- `apps/portal/src/features/checkout/hooks/useCheckout.ts` - -### ๐Ÿšจ **Linting Rules Added** -Enhanced `eslint.config.mjs` with rules to prevent future type duplication: - -```javascript -// Prevent importing from removed files -"no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["**/utils/ui-state*"], - message: "ui-state.ts has been removed. Use patterns from @customer-portal/domain instead." - }, - { - group: ["@/types"], - message: "Avoid importing from @/types. Import types directly from @customer-portal/domain or define locally." - } - ] - } -] - -// Prevent defining deprecated type patterns -"no-restricted-syntax": [ - "error", - { - selector: "TSInterfaceDeclaration[id.name=/^(LegacyAsyncState|PaginatedState|FilteredState)$/]", - message: "These legacy state types are deprecated. Use AsyncState, PaginatedAsyncState, or FilterState from @customer-portal/domain instead." - } -] -``` - -### ๐Ÿ“š **Team Documentation Created** -**`TYPE_PATTERNS_GUIDE.md`** - Comprehensive team reference guide including: -- โŒ **What NOT to use** (deprecated patterns with examples) -- โœ… **What TO use** (modern patterns with examples) -- ๐Ÿ“ฆ **Where to import from** (domain vs portal vs local) -- ๐Ÿ”ง **Common patterns** (loading states, forms, API calls, branded types) -- ๐Ÿšจ **Linting rules** explanation -- ๐Ÿ“š **Migration checklist** for new and existing code -- ๐Ÿ†˜ **Troubleshooting** common issues -- ๐Ÿ“ž **Getting help** guidelines - -## ๐ŸŽฏ **VERIFICATION RESULTS** - -### โœ… **Build Status** -- โœ… **Domain Package**: `npm run build` - SUCCESS -- โœ… **Portal App**: `npm run type-check` - SUCCESS -- โœ… **Linting**: No errors with new rules - -### โœ… **Code Quality** -- โœ… **Zero deprecated imports** remaining in active code -- โœ… **Zero legacy type definitions** in use -- โœ… **Consistent patterns** across all updated files -- โœ… **Proper separation of concerns** (domain vs UI) - -### โœ… **Developer Experience** -- โœ… **Clear migration path** documented -- โœ… **Linting prevents regression** to old patterns -- โœ… **Team guide** provides quick reference -- โœ… **Examples** for all common use cases - -## ๐Ÿ“Š **CLEANUP METRICS** - -### **Files Removed** -- ๐Ÿ—‘๏ธ **3 files** completely removed -- ๐Ÿ—‘๏ธ **1 empty directory** removed -- ๐Ÿงน **~150 lines** of deprecated code eliminated - -### **Type Definitions Cleaned** -- โŒ **6 deprecated interfaces** removed -- โŒ **4 unnecessary type aliases** removed -- โœ… **100% migration** to modern patterns - -### **Import Statements Updated** -- ๐Ÿ”„ **4 files** updated to use direct domain imports -- ๐Ÿ”„ **0 remaining** imports from deprecated sources -- โœ… **Local type aliases** added where needed for convenience - -## ๐Ÿ›ก๏ธ **FUTURE-PROOFING MEASURES** - -### **Linting Protection** -- ๐Ÿšจ **Prevents** importing from removed files -- ๐Ÿšจ **Prevents** defining deprecated type patterns -- ๐Ÿšจ **Warns** against using `@/types` for new code -- ๐Ÿšจ **Enforces** modern pattern usage - -### **Documentation** -- ๐Ÿ“‹ **Team guide** for consistent usage -- ๐Ÿ“‹ **Migration checklist** for code reviews -- ๐Ÿ“‹ **Troubleshooting** for common issues -- ๐Ÿ“‹ **Best practices** clearly documented - -### **Code Organization** -- ๐Ÿ“ฆ **Single source of truth** in domain package -- ๐Ÿ“ฆ **Clear boundaries** between domain and UI concerns -- ๐Ÿ“ฆ **Local type aliases** instead of global re-exports -- ๐Ÿ“ฆ **Proper encapsulation** of feature-specific types - -## ๐ŸŽ‰ **PHASE 4 COMPLETE** - -### **What Was Accomplished** -1. โœ… **Complete removal** of all deprecated type files and patterns -2. โœ… **Thorough cleanup** of unnecessary re-exports and type aliases -3. โœ… **Linting rules** to prevent future regression -4. โœ… **Comprehensive documentation** for team adoption -5. โœ… **Full verification** that everything still works correctly - -### **Current State** -- ๐Ÿ—๏ธ **Clean architecture** with proper separation of concerns -- ๐Ÿ”’ **Type safety** with impossible states eliminated -- ๐Ÿ“š **Well-documented** patterns and best practices -- ๐Ÿ›ก๏ธ **Protected** against future type duplication -- ๐Ÿš€ **Production ready** with all tests passing - -### **Team Benefits** -- ๐Ÿ‘จโ€๐Ÿ’ป **Better developer experience** with consistent patterns -- ๐Ÿ› **Fewer bugs** from impossible state combinations -- ๐Ÿ”ง **Easier maintenance** with centralized type definitions -- ๐Ÿ“ˆ **Improved productivity** with clear guidelines and examples -- ๐ŸŽฏ **Future-proof** architecture that scales with the project - -## ๐Ÿš€ **READY FOR PRODUCTION** - -The TypeScript type structure modernization is now **100% complete** with: -- โœ… All phases implemented (Foundation, Consolidation, Enhancement, Cleanup) -- โœ… Zero technical debt from deprecated patterns -- โœ… Comprehensive team documentation -- โœ… Linting protection against regression -- โœ… Full backward compatibility during transition -- โœ… Production-ready code with all tests passing - -**The team can now confidently use the modern type patterns for all future development!** ๐ŸŽ‰ diff --git a/PLESK_DEPLOYMENT.md b/PLESK_DEPLOYMENT.md deleted file mode 100644 index 2379b29f..00000000 --- a/PLESK_DEPLOYMENT.md +++ /dev/null @@ -1,921 +0,0 @@ -# ๐Ÿ“ฆ Customer Portal - Package Structure & Architecture - -This document provides comprehensive information about the Customer Portal codebase structure, package configurations, dependencies, and build architecture. - -## ๐Ÿ—๏ธ Monorepo Architecture - -### Complete Project Structure - -``` -customer-portal/ -โ”œโ”€โ”€ apps/ -โ”‚ โ”œโ”€โ”€ portal/ # Next.js 15.5 Frontend Application -โ”‚ โ”‚ โ”œโ”€โ”€ src/ -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ app/ # Next.js App Router -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ components/ # React components -โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ lib/ # Utility functions -โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ styles/ # Tailwind CSS styles -โ”‚ โ”‚ โ”œโ”€โ”€ public/ # Static assets -โ”‚ โ”‚ โ”œโ”€โ”€ package.json # Frontend dependencies -โ”‚ โ”‚ โ”œโ”€โ”€ next.config.mjs # Next.js configuration -โ”‚ โ”‚ โ”œโ”€โ”€ tailwind.config.js # Tailwind CSS config -โ”‚ โ”‚ โ”œโ”€โ”€ tsconfig.json # TypeScript config -โ”‚ โ”‚ โ””โ”€โ”€ Dockerfile # Container build file -โ”‚ โ”‚ -โ”‚ โ””โ”€โ”€ bff/ # NestJS Backend for Frontend -โ”‚ โ”œโ”€โ”€ src/ -โ”‚ โ”‚ โ”œโ”€โ”€ modules/ # Feature modules -โ”‚ โ”‚ โ”œโ”€โ”€ common/ # Shared backend utilities -โ”‚ โ”‚ โ”œโ”€โ”€ config/ # Configuration files -โ”‚ โ”‚ โ””โ”€โ”€ main.ts # Application entry point -โ”‚ โ”œโ”€โ”€ prisma/ -โ”‚ โ”‚ โ”œโ”€โ”€ schema.prisma # Database schema -โ”‚ โ”‚ โ”œโ”€โ”€ migrations/ # Database migrations -โ”‚ โ”‚ โ””โ”€โ”€ seed.ts # Database seeding -โ”‚ โ”œโ”€โ”€ test/ # Test files -โ”‚ โ”œโ”€โ”€ package.json # Backend dependencies -โ”‚ โ”œโ”€โ”€ tsconfig.json # TypeScript config -โ”‚ โ”œโ”€โ”€ tsconfig.build.json # Build-specific TS config -โ”‚ โ””โ”€โ”€ Dockerfile # Container build file -โ”‚ -โ”œโ”€โ”€ packages/ -โ”‚ โ””โ”€โ”€ shared/ # Shared Package -โ”‚ โ”œโ”€โ”€ src/ -โ”‚ โ”‚ โ”œโ”€โ”€ types/ # TypeScript type definitions -โ”‚ โ”‚ โ”œโ”€โ”€ utils/ # Common utility functions -โ”‚ โ”‚ โ”œโ”€โ”€ constants/ # Application constants -โ”‚ โ”‚ โ”œโ”€โ”€ schemas/ # Validation schemas (Zod) -โ”‚ โ”‚ โ””โ”€โ”€ index.ts # Package exports -โ”‚ โ”œโ”€โ”€ dist/ # Compiled output (generated) -โ”‚ โ”œโ”€โ”€ package.json # Shared package config -โ”‚ โ””โ”€โ”€ tsconfig.json # TypeScript config -โ”‚ -โ”œโ”€โ”€ scripts/ # Build and deployment scripts -โ”œโ”€โ”€ docs/ # Documentation -โ”œโ”€โ”€ secrets/ # Sensitive configuration files -โ”œโ”€โ”€ compose-plesk.yaml # Plesk Docker stack -โ”‚ -โ”œโ”€โ”€ package.json # Root workspace configuration -โ”œโ”€โ”€ pnpm-workspace.yaml # pnpm workspace definition -โ”œโ”€โ”€ pnpm-lock.yaml # Dependency lock file -โ”œโ”€โ”€ tsconfig.json # Root TypeScript config -โ”œโ”€โ”€ eslint.config.mjs # ESLint configuration -โ”œโ”€โ”€ compose-plesk.yaml # Plesk deployment config -โ”œโ”€โ”€ .env # Environment variables -โ””โ”€โ”€ README.md # Project documentation -``` - -## ๐Ÿ› ๏ธ Plesk Deployment Notes (Recommended) - -- Proxy rules: - - `/` โ†’ container `portal-frontend` port `3000` - - `/api` โ†’ container `portal-backend` port `4000` -- Frontend โ†’ Backend base URL: set `NEXT_PUBLIC_API_BASE=/api` (same-origin; no CORS needed). -- Env split (do not keep secrets under `httpdocs`): - - Frontend env (client-safe): `/var/www/vhosts/asolutions.jp/private/env/portal-frontend.env` - - Backend env (server-only): `/var/www/vhosts/asolutions.jp/private/env/portal-backend.env` -- Compose (`compose-plesk.yaml`) highlights: - - Binds app ports to `127.0.0.1` and keeps DB/Redis internal. - - Uses `env_file` per service pointing to the private env files above. - - Backend waits for Postgres then runs migrations. -- Alpine images: backend installs toolchain for bcrypt/Prisma; frontend includes `libc6-compat`. -- Health endpoints: Next `/api/health`, Nest `/health`. - -### Environment Files (Plesk) - -- Create two env files on the server (under the domain's private dir): - - Frontend: `/var/www/vhosts/asolutions.jp/private/env/portal-frontend.env` โ€” based on `env/portal-frontend.env.sample` - - Must include: `NEXT_PUBLIC_API_BASE=/api` - - Backend: `/var/www/vhosts/asolutions.jp/private/env/portal-backend.env` โ€” based on `env/portal-backend.env.sample` - - Must include: `TRUST_PROXY=true` - - `DATABASE_URL` should use `database:5432` - - `REDIS_URL` should use `cache:6379` - - Set `JWT_SECRET` to a strong value - - Salesforce credentials: `SF_LOGIN_URL`, `SF_CLIENT_ID`, `SF_USERNAME` - - Salesforce private key: set `SF_PRIVATE_KEY_PATH=/app/secrets/sf-private.key` and mount `/app/secrets` - - Webhook secrets: `SF_WEBHOOK_SECRET` (Salesforce), `WHMCS_WEBHOOK_SECRET` (if using WHMCS webhooks) - - Webhook tolerances: `WEBHOOK_TIMESTAMP_TOLERANCE=300000` (ms; optional) - - Optional IP allowlists: `SF_WEBHOOK_IP_ALLOWLIST`, `WHMCS_WEBHOOK_IP_ALLOWLIST` (CSV of IP/CIDR) - - Pricebook: `PORTAL_PRICEBOOK_ID` - -### Image Build and Upload - -Option A โ€” Use the helper script (recommended): - -```bash -# Build both images, tag :latest and a date+sha tag, and write tarballs -scripts/plesk/build-images.sh - -# Custom tag and output directory -scripts/plesk/build-images.sh --tag v1.0.0 --output ./dist - -# Also push to a registry (e.g., GHCR) -scripts/plesk/build-images.sh --tag v1.0.0 --push ghcr.io/ -``` - -Option B โ€” Manual build commands: - -```bash -# Frontend -docker build -t portal-frontend:latest -f apps/portal/Dockerfile . -docker save -o portal-frontend.latest.tar portal-frontend:latest - -# Backend -docker build -t portal-backend:latest -f apps/bff/Dockerfile . -docker save -o portal-backend.latest.tar portal-backend:latest -``` - -In Plesk โ†’ Docker โ†’ Images, upload both tar files. Then use `compose-plesk.yaml` under Docker โ†’ Stacks โ†’ Add Stack to deploy the services. Configure Proxy Rules on the domain: - -- `/` โ†’ `portal-frontend` port `3000` -- `/api` โ†’ `portal-backend` port `4000` - -### Webhook Security (Plesk) - -- Endpoint for Salesforce Quick Action: - - `POST /api/orders/{sfOrderId}/fulfill` -- Required backend env (see above). Ensure the same HMAC secret is configured in Salesforce. -- The backend guard enforces: - - HMAC for all webhooks - - Salesforce: timestamp + nonce with Redis-backed replay protection - - WHMCS: timestamp/nonce optional (validated if present) -- Health check `/health` includes `integrations.redis` to verify nonce storage. - -Alternatively, load via SSH on the Plesk host: - -```bash -scp portal-frontend.latest.tar portal-backend.latest.tar user@plesk-host:/tmp/ -ssh user@plesk-host -sudo docker load -i /tmp/portal-frontend.latest.tar -sudo docker load -i /tmp/portal-backend.latest.tar -``` - -Or push to a registry (example: GHCR): - -```bash -docker tag portal-frontend:latest ghcr.io//portal-frontend:latest -docker tag portal-backend:latest ghcr.io//portal-backend:latest -docker push ghcr.io//portal-frontend:latest -docker push ghcr.io//portal-backend:latest -``` - -Quick checklist: - -- Proxy rules added for `/` and `/api`. -- `NEXT_PUBLIC_API_BASE=/api` available to the frontend. -- DB URL uses `database:5432` (compose service name). -- Secrets are under `/var/www/vhosts/asolutions.jp/private` (not `httpdocs`). - -### Technology Stack & Versions - -- **Runtime**: Node.js 22+ (LTS) -- **Package Manager**: pnpm 10.15.0 (workspace support) -- **Language**: TypeScript 5.9.2 (strict mode) -- **Frontend Framework**: Next.js 15.5.0 with React 19.1.1 -- **Backend Framework**: NestJS 11.1.6 -- **Database ORM**: Prisma 6.14.0 -- **Styling**: Tailwind CSS 4.1.12 -- **State Management**: Zustand 5.0.8 + TanStack Query 5.85.5 -- **Validation**: Zod 4.0.17 -- **Authentication**: JWT + bcrypt -- **Database**: PostgreSQL 17 -- **Cache**: Redis 7 with ioredis 5.7.0 - -## ๐Ÿ“ฆ Workspace Configuration - -### Root Package.json (Workspace Root) - -```json -{ - "name": "customer-portal", - "version": "1.0.0", - "description": "Customer portal with BFF architecture", - "private": true, - "packageManager": "pnpm@10.15.0", - "engines": { - "node": ">=22.0.0", - "pnpm": ">=10.0.0" - }, - "scripts": { - "predev": "pnpm --filter @customer-portal/domain build", - "dev": "./scripts/dev/manage.sh apps", - "dev:all": "pnpm --parallel --filter @customer-portal/domain --filter @customer-portal/portal --filter @customer-portal/bff run dev", - "build": "pnpm --recursive --reporter=default run build", - "start": "pnpm --parallel --filter @customer-portal/portal --filter @customer-portal/bff run start", - "test": "pnpm --recursive run test", - "lint": "pnpm --recursive run lint", - "type-check": "pnpm --filter @customer-portal/domain build && pnpm --recursive run type-check", - "clean": "pnpm --recursive run clean" - }, - "devDependencies": { - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.34.0", - "@types/node": "^24.3.0", - "eslint": "^9.33.0", - "eslint-config-next": "15.5.0", - "eslint-plugin-prettier": "^5.5.4", - "globals": "^16.3.0", - "husky": "^9.1.7", - "prettier": "^3.6.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.40.0" - }, - "dependencies": { - "@sendgrid/mail": "^8.1.5" - } -} -``` - -### Workspace Definition (pnpm-workspace.yaml) - -```yaml -packages: - - "apps/*" # Frontend and Backend applications - - "packages/*" # Shared libraries and utilities -``` - -### Package Dependency Graph - -``` -@customer-portal/domain (packages/shared) -โ”œโ”€โ”€ Built first (no dependencies) -โ””โ”€โ”€ Exports: types, utils, constants, schemas - -@customer-portal/portal (apps/portal) -โ”œโ”€โ”€ Depends on: @customer-portal/domain -โ””โ”€โ”€ Builds: Next.js standalone application - -@customer-portal/bff (apps/bff) -โ”œโ”€โ”€ Depends on: @customer-portal/domain -โ”œโ”€โ”€ Generates: Prisma client -โ””โ”€โ”€ Builds: NestJS application -``` - -## ๐ŸŽฏ Frontend Application (apps/portal) - -### Complete Package Configuration - -```json -{ - "name": "@customer-portal/portal", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev -p ${NEXT_PORT:-3000}", - "build": "next build", - "build:turbo": "next build --turbopack", - "start": "next start -p ${NEXT_PORT:-3000}", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "type-check": "tsc --noEmit", - "test": "echo 'No tests yet'" - }, - "dependencies": { - "@customer-portal/domain": "workspace:*", - "@heroicons/react": "^2.2.0", - "@hookform/resolvers": "^5.2.1", - "@tanstack/react-query": "^5.85.5", - "@tanstack/react-query-devtools": "^5.85.5", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "date-fns": "^4.1.0", - "lucide-react": "^0.540.0", - "next": "15.5.0", - "react": "19.1.1", - "react-dom": "19.1.1", - "react-hook-form": "^7.62.0", - "tailwind-merge": "^3.3.1", - "tw-animate-css": "^1.3.7", - "world-countries": "^5.1.0", - "zod": "^4.0.17", - "zustand": "^5.0.8" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.1.12", - "@types/node": "^24.3.0", - "@types/react": "^19.1.10", - "@types/react-dom": "^19.1.7", - "tailwindcss": "^4.1.12", - "typescript": "^5.9.2" - } -} -``` - -### Frontend Architecture & Dependencies - -#### Core Framework Stack - -- **Next.js 15.5.0**: App Router, Server Components, Streaming -- **React 19.1.1**: Latest React with concurrent features -- **TypeScript 5.9.2**: Strict type checking - -#### UI & Styling - -- **Tailwind CSS 4.1.12**: Utility-first CSS framework -- **@tailwindcss/postcss**: PostCSS integration -- **tailwind-merge**: Conditional class merging -- **class-variance-authority**: Component variant management -- **clsx**: Conditional className utility -- **tw-animate-css**: Tailwind animation utilities - -#### State Management & Data Fetching - -- **Zustand 5.0.8**: Lightweight state management -- **TanStack Query 5.85.5**: Server state management -- **@tanstack/react-query-devtools**: Development tools - -#### Forms & Validation - -- **react-hook-form 7.62.0**: Form state management -- **@hookform/resolvers 5.2.1**: Validation resolvers -- **Zod 4.0.17**: Runtime type validation - -#### Icons & UI Components - -- **@heroicons/react 2.2.0**: SVG icon library -- **lucide-react 0.540.0**: Additional icon set - -#### Utilities - -- **date-fns 4.1.0**: Date manipulation library -- **world-countries 5.1.0**: Country data - -### Next.js Configuration (next.config.mjs) - -```javascript -const nextConfig = { - // Enable standalone output for production deployment - output: process.env.NODE_ENV === "production" ? "standalone" : undefined, - - // Exclude server-only packages from client bundle - serverExternalPackages: [ - "pino", - "pino-pretty", - "pino-abstract-transport", - "thread-stream", - "sonic-boom", - ], - - // Turbopack configuration (Next.js 15.5+) - turbopack: { - resolveAlias: { "@": "./src" }, - }, - - // Environment variables validation - env: { - NEXT_PUBLIC_API_BASE: process.env.NEXT_PUBLIC_API_BASE, - NEXT_PUBLIC_APP_NAME: process.env.NEXT_PUBLIC_APP_NAME, - NEXT_PUBLIC_APP_VERSION: process.env.NEXT_PUBLIC_APP_VERSION, - }, - - // Image optimization - images: { - remotePatterns: [{ protocol: "https", hostname: "**" }], - }, - - // Disable ESLint during builds (handled separately) - eslint: { ignoreDuringBuilds: true }, - - // Security headers - async headers() { - return [ - { - source: "/(.*)", - headers: [ - { key: "X-Frame-Options", value: "DENY" }, - { key: "X-Content-Type-Options", value: "nosniff" }, - { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, - ], - }, - ]; - }, - - // Production optimizations - compiler: { - removeConsole: process.env.NODE_ENV === "production", - }, -}; -``` - -### TypeScript Configuration (tsconfig.json) - -```json -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - }, - "plugins": [{ "name": "next" }] - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} -``` - -## ๐ŸŽฏ Backend Application (apps/bff) - -### Complete Package Configuration - -```json -{ - "name": "@customer-portal/bff", - "version": "1.0.0", - "description": "Backend for Frontend API", - "author": "", - "private": true, - "license": "UNLICENSED", - "scripts": { - "build": "nest build -c tsconfig.build.json", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", - "dev": "NODE_OPTIONS=\"--no-deprecation\" nest start --watch --preserveWatchOutput -c tsconfig.build.json", - "start:debug": "NODE_OPTIONS=\"--no-deprecation\" nest start --debug --watch", - "start:prod": "node dist/main", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json", - "type-check": "tsc --noEmit", - "clean": "rm -rf dist", - "db:migrate": "prisma migrate dev", - "db:generate": "prisma generate", - "db:studio": "prisma studio", - "db:reset": "prisma migrate reset", - "db:seed": "ts-node prisma/seed.ts" - }, - "dependencies": { - "@customer-portal/domain": "workspace:*", - "@nestjs/bullmq": "^11.0.3", - "@nestjs/common": "^11.1.6", - "@nestjs/config": "^4.0.2", - "@nestjs/core": "^11.1.6", - "@nestjs/jwt": "^11.0.0", - "@nestjs/passport": "^11.0.5", - "@nestjs/platform-express": "^11.1.6", - "@nestjs/swagger": "^11.2.0", - "@nestjs/throttler": "^6.4.0", - "@prisma/client": "^6.14.0", - "@types/jsonwebtoken": "^9.0.10", - "bcrypt": "^6.0.0", - "bullmq": "^5.58.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.2", - "cookie-parser": "^1.4.7", - "helmet": "^8.1.0", - "ioredis": "^5.7.0", - "jsforce": "^3.10.4", - "jsonwebtoken": "^9.0.2", - "nestjs-pino": "^4.4.0", - "passport": "^0.7.0", - "passport-jwt": "^4.0.1", - "passport-local": "^1.0.0", - "pino": "^9.9.0", - "pino-http": "^10.5.0", - "pino-pretty": "^13.1.1", - "prisma": "^6.14.0", - "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.2", - "@sendgrid/mail": "^8.1.3", - "speakeasy": "^2.0.0", - "uuid": "^11.1.0", - "zod": "^4.0.17" - }, - "devDependencies": { - "@nestjs/cli": "^11.0.10", - "@nestjs/schematics": "^11.0.7", - "@nestjs/testing": "^11.1.6", - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.9", - "@types/express": "^5.0.3", - "@types/jest": "^30.0.0", - "@types/node": "^24.3.0", - "@types/passport-jwt": "^4.0.1", - "@types/passport-local": "^1.0.38", - "@types/speakeasy": "^2.0.10", - "@types/supertest": "^6.0.3", - "@types/uuid": "^10.0.0", - "jest": "^30.0.5", - "source-map-support": "^0.5.21", - "supertest": "^7.1.4", - "ts-jest": "^29.4.1", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.9.2" - } -} -``` - -### Backend Architecture & Dependencies - -#### Core NestJS Framework - -- **@nestjs/core 11.1.6**: Core framework -- **@nestjs/common 11.1.6**: Common decorators and utilities -- **@nestjs/platform-express 11.1.6**: Express platform adapter -- **@nestjs/config 4.0.2**: Configuration management -- **reflect-metadata 0.2.2**: Metadata reflection API - -#### Authentication & Security - -- **@nestjs/passport 11.0.5**: Passport integration -- **@nestjs/jwt 11.0.0**: JWT token handling -- **passport 0.7.0**: Authentication middleware -- **passport-jwt 4.0.1**: JWT strategy -- **passport-local 1.0.0**: Local authentication strategy -- **jsonwebtoken 9.0.2**: JWT implementation -- **bcrypt 6.0.0**: Password hashing -- **helmet 8.1.0**: Security headers -- **@nestjs/throttler 6.4.0**: Rate limiting -- **speakeasy 2.0.0**: Two-factor authentication - -#### Database & ORM - -- **@prisma/client 6.14.0**: Prisma ORM client -- **prisma 6.14.0**: Prisma CLI and schema management - -#### Caching & Queues - -- **ioredis 5.7.0**: Redis client -- **@nestjs/bullmq 11.0.3**: Queue management -- **bullmq 5.58.0**: Redis-based queue system - -#### Validation & Transformation - -- **class-validator 0.14.2**: Decorator-based validation -- **class-transformer 0.5.1**: Object transformation -- **zod 4.0.17**: Runtime type validation - -#### External Integrations - -- **jsforce 3.10.4**: Salesforce API client -- **@sendgrid/mail 8.1.3**: SendGrid email service - -#### Logging & Monitoring - -- **nestjs-pino 4.4.0**: NestJS Pino integration -- **pino 9.9.0**: High-performance logging -- **pino-http 10.5.0**: HTTP request logging -- **pino-pretty 13.1.1**: Pretty-printed logs for development - -#### API Documentation - -- **@nestjs/swagger 11.2.0**: OpenAPI/Swagger documentation - -#### Utilities - -- **rxjs 7.8.2**: Reactive programming -- **uuid 11.1.0**: UUID generation -- **cookie-parser 1.4.7**: Cookie parsing middleware - -### TypeScript Configurations - -#### Main TypeScript Config (tsconfig.json) - -```json -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "paths": { - "@/*": ["src/*"] - }, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "allowSyntheticDefaultImports": true, - "target": "ES2021", - "lib": ["ES2021"], - "module": "commonjs", - "declaration": true, - "removeComments": true, - "incremental": true, - "skipLibCheck": true, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false - } -} -``` - -#### Build TypeScript Config (tsconfig.build.json) - -```json -{ - "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] -} -``` - -### Jest Testing Configuration - -```json -{ - "moduleFileExtensions": ["js", "json", "ts"], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": ["**/*.(t|j)s", "!**/*.spec.ts", "!**/node_modules/**"], - "coverageDirectory": "../coverage", - "testEnvironment": "node", - "moduleNameMapping": { - "^@/(.*)$": "/$1" - }, - "passWithNoTests": true -} -``` - -## ๐Ÿ“ฆ Shared Package (packages/shared) - -### Complete Package Configuration - -```json -{ - "name": "@customer-portal/domain", - "version": "1.0.0", - "description": "Shared utilities and types for Customer Portal", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "private": true, - "scripts": { - "build": "tsc", - "dev": "tsc --watch", - "clean": "rm -rf dist", - "type-check": "tsc --noEmit" - }, - "dependencies": { - "zod": "^4.0.17" - }, - "devDependencies": { - "typescript": "^5.9.2", - "@types/node": "^24.3.0" - }, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - } -} -``` - -### TypeScript Configuration (tsconfig.json) - -```json -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "composite": true, - "incremental": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} -``` - -### Package Structure & Exports - -```typescript -// src/index.ts - Main export file -export * from "./types"; -export * from "./utils"; -export * from "./constants"; -export * from "./schemas"; - -// src/types/index.ts - Type definitions -export interface User { - id: string; - email: string; - name: string; - role: UserRole; -} - -export type UserRole = "admin" | "customer" | "support"; - -export interface ApiResponse { - success: boolean; - data?: T; - error?: string; - message?: string; -} - -// src/utils/index.ts - Utility functions -export const formatCurrency = (amount: number, currency = "USD") => { - return new Intl.NumberFormat("en-US", { - style: "currency", - currency, - }).format(amount); -}; - -export const slugify = (text: string): string => { - return text - .toLowerCase() - .replace(/[^\w\s-]/g, "") - .replace(/[\s_-]+/g, "-") - .replace(/^-+|-+$/g, ""); -}; - -// src/constants/index.ts - Application constants -export const API_ENDPOINTS = { - AUTH: "/auth", - USERS: "/users", - PRODUCTS: "/products", - ORDERS: "/orders", -} as const; - -export const USER_ROLES = { - ADMIN: "admin", - CUSTOMER: "customer", - SUPPORT: "support", -} as const; - -// src/schemas/index.ts - Zod validation schemas -import { z } from "zod"; - -export const userSchema = z.object({ - id: z.string().uuid(), - email: z.string().email(), - name: z.string().min(1), - role: z.enum(["admin", "customer", "support"]), -}); - -export const loginSchema = z.object({ - email: z.string().email(), - password: z.string().min(8), -}); -``` - -### Build Output Structure - -``` -packages/shared/dist/ -โ”œโ”€โ”€ index.js # Main compiled entry point -โ”œโ”€โ”€ index.d.ts # Type definitions -โ”œโ”€โ”€ index.js.map # Source map -โ”œโ”€โ”€ types/ -โ”‚ โ”œโ”€โ”€ index.js -โ”‚ โ””โ”€โ”€ index.d.ts -โ”œโ”€โ”€ utils/ -โ”‚ โ”œโ”€โ”€ index.js -โ”‚ โ””โ”€โ”€ index.d.ts -โ”œโ”€โ”€ constants/ -โ”‚ โ”œโ”€โ”€ index.js -โ”‚ โ””โ”€โ”€ index.d.ts -โ””โ”€โ”€ schemas/ - โ”œโ”€โ”€ index.js - โ””โ”€โ”€ index.d.ts -``` - -## ๐Ÿ”จ Build Process & Dependencies - -### Complete Build Order - -```bash -# 1. Install all workspace dependencies -pnpm install --frozen-lockfile - -# 2. Build shared package (required by other packages) -cd packages/shared -pnpm build - -# 3. Generate Prisma client (backend requirement) -cd ../../apps/bff -pnpm prisma generate - -# 4. Build backend application -pnpm build - -# 5. Build frontend application -cd ../portal -pnpm build -``` - -### Production Build Requirements - -#### Shared Package Build - -- **Input**: TypeScript source files in `src/` -- **Output**: Compiled JavaScript + type definitions in `dist/` -- **Dependencies**: Only Zod for runtime validation -- **Build time**: ~5-10 seconds - -#### Frontend Build - -- **Input**: Next.js application with React components -- **Output**: Standalone server bundle + static assets -- **Dependencies**: Shared package must be built first -- **Build time**: ~30-60 seconds -- **Output size**: ~15-25MB (standalone bundle) - -#### Backend Build - -- **Input**: NestJS application with Prisma schema -- **Output**: Compiled Node.js application -- **Dependencies**: Shared package + generated Prisma client -- **Build time**: ~20-40 seconds -- **Critical step**: Prisma client generation before TypeScript compilation - -### Native Module Compilation - -These packages require native compilation and rebuilding in production: - -#### bcrypt (Password Hashing) - -- **Platform dependent**: Yes (native C++ bindings) -- **Rebuild required**: Yes, for target architecture -- **Build command**: `pnpm rebuild bcrypt` - -#### @prisma/client (Database ORM) - -- **Platform dependent**: Yes (query engine binaries) -- **Rebuild required**: Yes, includes platform-specific engines -- **Build command**: `pnpm rebuild @prisma/client @prisma/engines` - -#### @prisma/engines - -- **Platform dependent**: Yes (database query engines) -- **Architecture specific**: linux-musl-x64, linux-gnu-x64, etc. -- **Size**: ~50-100MB of engine binaries - -### Environment-Specific Configurations - -#### Development Environment - -- **Hot reload**: Enabled for all packages -- **Source maps**: Generated for debugging -- **Type checking**: Strict mode enabled -- **Logging**: Pretty-printed with colors - -#### Production Environment - -- **Minification**: Enabled for frontend -- **Source maps**: Disabled for security -- **Console removal**: Automatic in frontend builds -- **Logging**: JSON format for structured logging -- **Health checks**: Built-in endpoints for monitoring - -## ๐Ÿ“‹ Package Summary - -### Dependency Overview - -``` -Total packages: 3 workspace packages -โ”œโ”€โ”€ @customer-portal/domain (packages/shared) -โ”‚ โ”œโ”€โ”€ Dependencies: 1 (zod) -โ”‚ โ”œโ”€โ”€ DevDependencies: 2 (typescript, @types/node) -โ”‚ โ””โ”€โ”€ Build output: ~50KB -โ”‚ -โ”œโ”€โ”€ @customer-portal/portal (apps/portal) -โ”‚ โ”œโ”€โ”€ Dependencies: 16 (Next.js, React, UI libraries) -โ”‚ โ”œโ”€โ”€ DevDependencies: 5 (Tailwind, TypeScript types) -โ”‚ โ””โ”€โ”€ Build output: ~15-25MB (standalone) -โ”‚ -โ””โ”€โ”€ @customer-portal/bff (apps/bff) - โ”œโ”€โ”€ Dependencies: 25 (NestJS, Prisma, integrations) - โ”œโ”€โ”€ DevDependencies: 13 (testing, build tools) - โ””โ”€โ”€ Build output: ~5-10MB -``` - -### Critical Build Dependencies - -1. **pnpm 10.15.0**: Workspace package manager -2. **TypeScript 5.9.2**: Language compiler for all packages -3. **Node.js 22+**: Runtime environment -4. **Prisma 6.14.0**: Database client generation -5. **Next.js 15.5.0**: Frontend framework with standalone output - -### Package Interdependencies - -``` -Build Order (Critical): -1. packages/shared โ†’ Compiles TypeScript to JavaScript -2. apps/bff โ†’ Generates Prisma client, then compiles NestJS -3. apps/portal โ†’ Compiles Next.js with shared package dependency - -Runtime Dependencies: -- Frontend depends on shared package types and utilities -- Backend depends on shared package + generated Prisma client -- Both applications require external services (PostgreSQL, Redis) -``` - -### Key Configuration Files - -- **pnpm-workspace.yaml**: Defines monorepo structure -- **Root package.json**: Workspace scripts and shared devDependencies -- **tsconfig.json**: TypeScript configuration inheritance -- **next.config.mjs**: Next.js production optimizations -- **prisma/schema.prisma**: Database schema and client generation - -This architecture provides a scalable, type-safe monorepo with shared utilities, modern frontend framework, robust backend API, and comprehensive external service integrations. diff --git a/TYPE_PATTERNS_GUIDE.md b/TYPE_PATTERNS_GUIDE.md deleted file mode 100644 index 855f445d..00000000 --- a/TYPE_PATTERNS_GUIDE.md +++ /dev/null @@ -1,377 +0,0 @@ -# ๐Ÿ“‹ Type Patterns Guide - Team Reference - -## ๐ŸŽฏ **Quick Reference for Modern Type Patterns** - -This guide provides the team with quick reference for using the new modernized type patterns in the customer portal. - -## ๐Ÿšซ **DEPRECATED PATTERNS - DO NOT USE** - -### โŒ Old Async State Pattern -```typescript -// โŒ DON'T USE - Old pattern -interface OldAsyncState { - data: T | null; - loading: boolean; - error: string | null; -} - -const [state, setState] = useState>({ - data: null, - loading: false, - error: null -}); - -// โŒ Allows impossible states -setState({ data: user, loading: true, error: null }); // Loading with data? -``` - -### โŒ Old Import Patterns -```typescript -// โŒ DON'T USE - These files have been removed -import { AsyncState } from '../utils/ui-state'; -import { CatalogProduct } from '@/types'; -``` - -## โœ… **MODERN PATTERNS - USE THESE** - -### โœ… New Async State Pattern (Discriminated Union) -```typescript -// โœ… USE - Modern discriminated union pattern -import { AsyncState, isLoading, isSuccess, isError, createLoadingState } from '@customer-portal/domain'; - -const [state, setState] = useState>({ status: 'idle' }); - -// โœ… Impossible states are prevented by TypeScript -if (isLoading(state)) { - return ; // state.data doesn't exist here -} - -if (isSuccess(state)) { - return ; // state.data is guaranteed to exist -} - -if (isError(state)) { - return ; // state.error is guaranteed to exist -} -``` - -### โœ… Helper Functions -```typescript -import { - createIdleState, - createLoadingState, - createSuccessState, - createErrorState -} from '@customer-portal/domain'; - -// Clean state transitions -setState(createLoadingState()); -setState(createSuccessState(userData)); -setState(createErrorState('Failed to load user')); -``` - -### โœ… Form State Pattern -```typescript -import { FormBuilder, loginFormSchema } from '@customer-portal/domain'; - -// Type-safe form with validation -const formBuilder = new FormBuilder(loginFormSchema, { - email: '', - password: '' -}); - -const [formState, setFormState] = useState(formBuilder.createInitialState()); - -// Update field with validation -const updatedState = formBuilder.updateField(formState, 'email', 'user@example.com'); -``` - -### โœ… API Client Pattern -```typescript -import { createTypedApiClient, UserId, createUserId } from '@customer-portal/domain'; - -const client = createTypedApiClient('/api', { authToken: token }); - -// Type-safe API calls with branded types -const userId = createUserId('123'); -const response = await client.getUser(userId); - -if (isApiSuccess(response)) { - console.log(response.data); // Typed as User -} -``` - -### โœ… Runtime Validation -```typescript -import { userValidationSchema, validateOrThrow } from '@customer-portal/domain'; - -// Validate data at runtime -try { - const validUser = validateOrThrow(userValidationSchema, userData); - // validUser is now typed and validated -} catch (error) { - console.error('Validation failed:', error.message); -} -``` - -## ๐Ÿ“ฆ **WHERE TO IMPORT FROM** - -### โœ… Domain Package (Primary Source) -```typescript -// โœ… Import core types and patterns from domain -import type { - AsyncState, - PaginatedAsyncState, - FormState, - User, - Order, - UserId, - OrderId -} from '@customer-portal/domain'; - -// โœ… Import utilities and helpers -import { - isLoading, - isSuccess, - createLoadingState, - createTypedApiClient, - FormBuilder -} from '@customer-portal/domain'; -``` - -### โœ… Local Type Aliases (When Needed) -```typescript -// โœ… Define local aliases for convenience -import type { InternetPlan, SimPlan, VpnPlan } from '@customer-portal/domain'; - -type CatalogProduct = InternetPlan | SimPlan | VpnPlan; -type ProductConfiguration = Record; -``` - -### โš ๏ธ Portal Types (Only for UI-Specific Extensions) -```typescript -// โš ๏ธ Only import from @/types for UI-specific extensions -import type { CheckoutState } from '@/types'; // This extends AsyncState -``` - -## ๐Ÿ”ง **COMMON PATTERNS** - -### 1. **Loading States in Components** -```typescript -import { AsyncState, isLoading, isSuccess, isError } from '@customer-portal/domain'; - -function UserProfile({ userId }: { userId: UserId }) { - const [userState, setUserState] = useState>({ status: 'idle' }); - - useEffect(() => { - setUserState(createLoadingState()); - - fetchUser(userId) - .then(user => setUserState(createSuccessState(user))) - .catch(error => setUserState(createErrorState(error.message))); - }, [userId]); - - if (isLoading(userState)) return ; - if (isError(userState)) return ; - if (isSuccess(userState)) return
Hello, {userState.data.name}!
; - - return null; // idle state -} -``` - -### 2. **Form Handling** -```typescript -import { FormBuilder, signupFormSchema } from '@customer-portal/domain'; - -function SignupForm() { - const formBuilder = new FormBuilder(signupFormSchema, { - email: '', - password: '', - confirmPassword: '', - name: '' - }); - - const [formState, setFormState] = useState(formBuilder.createInitialState()); - - const handleFieldChange = (field: string, value: string) => { - const updatedState = formBuilder.updateField(formState, field, value); - setFormState(updatedState); - }; - - const handleSubmit = async () => { - const result = await formBuilder.submit(formState, async (data) => { - await authService.signup(data); - }); - - if (!result.success) { - // Handle validation errors - console.error(result.errors); - } - }; - - return ( -
- handleFieldChange('email', e.target.value)} - /> - {formState.email.error && {formState.email.error}} - {/* ... other fields */} -
- ); -} -``` - -### 3. **API Integration** -```typescript -import { createTypedApiClient, extractApiData } from '@customer-portal/domain'; - -class UserService { - private client = createTypedApiClient('/api'); - - async getUser(id: UserId): Promise { - const response = await this.client.getUser(id); - return extractApiData(response); // Throws on error, returns data on success - } - - async getUserSafely(id: UserId): Promise { - const response = await this.client.getUser(id); - return extractApiDataSafely(response); // Returns null on error - } -} -``` - -### 4. **Branded Types for IDs** -```typescript -import { UserId, OrderId, createUserId, createOrderId } from '@customer-portal/domain'; - -// โœ… Type-safe ID handling -function processOrder(userId: UserId, orderId: OrderId) { - // TypeScript prevents mixing up different ID types -} - -// โœ… Create branded types from strings/numbers -const userId = createUserId('user-123'); -const orderId = createOrderId('order-456'); - -// โŒ This would be a TypeScript error: -// processOrder(orderId, userId); // Wrong order! -``` - -## ๐Ÿšจ **LINTING RULES** - -The following ESLint rules are in place to prevent regression: - -```javascript -// Prevents importing from removed files -"no-restricted-imports": [ - "error", - { - patterns: [ - { - group: ["**/utils/ui-state*"], - message: "ui-state.ts has been removed. Use patterns from @customer-portal/domain instead." - }, - { - group: ["@/types"], - message: "Avoid importing from @/types. Import types directly from @customer-portal/domain or define locally." - } - ] - } -] - -// Prevents defining deprecated types -"no-restricted-syntax": [ - "error", - { - selector: "TSInterfaceDeclaration[id.name=/^(LegacyAsyncState|PaginatedState|FilteredState)$/]", - message: "These legacy state types are deprecated. Use AsyncState, PaginatedAsyncState, or FilterState from @customer-portal/domain instead." - } -] -``` - -## ๐Ÿ“š **MIGRATION CHECKLIST** - -When working with existing code: - -### โœ… **For New Code** -- [ ] Use `AsyncState` discriminated union pattern -- [ ] Import types from `@customer-portal/domain` -- [ ] Use branded types for IDs (`UserId`, `OrderId`, etc.) -- [ ] Use `FormBuilder` for forms with validation -- [ ] Use `TypedApiClient` for API calls - -### โœ… **When Updating Existing Code** -- [ ] Replace old async state with discriminated union -- [ ] Update imports to use domain package -- [ ] Add type guards (`isLoading`, `isSuccess`, `isError`) -- [ ] Replace manual state transitions with helper functions -- [ ] Add runtime validation where appropriate - -### โœ… **Code Review Checklist** -- [ ] No imports from deprecated files (`ui-state.ts`, etc.) -- [ ] No legacy async state patterns -- [ ] Proper use of type guards for state checking -- [ ] Branded types used for IDs -- [ ] Local type aliases instead of global re-exports - -## ๐ŸŽฏ **BENEFITS OF NEW PATTERNS** - -### **Type Safety** -- โœ… **Impossible states eliminated** - Can't have loading=true with data present -- โœ… **Better IntelliSense** - TypeScript knows exactly what properties are available -- โœ… **Compile-time error prevention** - Catch bugs before runtime - -### **Developer Experience** -- โœ… **Consistent patterns** - Same async state pattern everywhere -- โœ… **Helper functions** - Easy state transitions with `createLoadingState()`, etc. -- โœ… **Type guards** - Clean conditional logic with `isLoading()`, `isSuccess()` - -### **Maintainability** -- โœ… **Single source of truth** - All patterns defined in domain package -- โœ… **Reduced duplication** - No more duplicate type definitions -- โœ… **Clear separation** - Business logic vs UI concerns properly separated - -## ๐Ÿ†˜ **TROUBLESHOOTING** - -### **Common Issues** - -#### โ“ "Property 'data' does not exist on type 'AsyncState'" -```typescript -// โŒ Wrong - accessing data without type guard -const user = userState.data; // Error! - -// โœ… Correct - use type guard first -if (isSuccess(userState)) { - const user = userState.data; // โœ… Works! -} -``` - -#### โ“ "Cannot find module '../utils/ui-state'" -```typescript -// โŒ Old import - file was removed -import { AsyncState } from '../utils/ui-state'; - -// โœ… New import - use domain package -import { AsyncState } from '@customer-portal/domain'; -``` - -#### โ“ "Type 'string' is not assignable to type 'UserId'" -```typescript -// โŒ Wrong - using raw string as branded type -const userId: UserId = 'user-123'; // Error! - -// โœ… Correct - create branded type -const userId = createUserId('user-123'); -``` - -## ๐Ÿ“ž **GETTING HELP** - -1. **Check this guide first** - Most common patterns are covered here -2. **Look at existing examples** - Check `EXAMPLE_USAGE.md` for real-world usage -3. **Check the migration guide** - `MIGRATION_GUIDE.md` has before/after examples -4. **Ask the team** - When in doubt, ask for help rather than creating new patterns - ---- - -**Remember: Consistency is key! Use these patterns everywhere for the best developer experience and maintainability.** diff --git a/TYPE_SYSTEM_IMPROVEMENTS.md b/TYPE_SYSTEM_IMPROVEMENTS.md deleted file mode 100644 index dfe29380..00000000 --- a/TYPE_SYSTEM_IMPROVEMENTS.md +++ /dev/null @@ -1,247 +0,0 @@ -# TypeScript Type System Improvements Plan - -## ๐Ÿšจ Critical Issues Found - -### 1. Address Type Consolidation (URGENT) - -**Problem**: Multiple conflicting Address type definitions causing runtime errors and type confusion. - -**Current State**: -- `packages/domain/src/common.ts` - Address (nullable fields) -- `packages/domain/src/entities/user.ts` - UserAddress (different field names) -- Local redefinitions in components -- BFF DTOs with different structures - -**Solution**: Consolidate to single canonical Address type with proper field mapping. - -```typescript -// packages/domain/src/entities/address.ts (NEW FILE) -export interface Address { - street: string | null; - streetLine2: string | null; - city: string | null; - state: string | null; - postalCode: string | null; - country: string | null; -} - -// For backward compatibility during migration -export interface UserAddress extends Address { - // Deprecated: Use Address directly - /** @deprecated Use street instead */ - line1?: string; - /** @deprecated Use streetLine2 instead */ - line2?: string; -} - -// Helper functions for migration -export const mapUserAddressToAddress = (userAddr: UserAddress): Address => ({ - street: userAddr.line1 || userAddr.street, - streetLine2: userAddr.line2 || userAddr.streetLine2, - city: userAddr.city, - state: userAddr.state, - postalCode: userAddr.postalCode, - country: userAddr.country, -}); -``` - -### 2. Form Validation Standardization - -**Problem**: Three different validation approaches causing inconsistency. - -**Solution**: Standardize on Zod with proper integration patterns. - -```typescript -// packages/domain/src/validation/unified-validation.ts (NEW FILE) -import { z } from 'zod'; - -// Base validation schemas -export const addressValidationSchema = z.object({ - street: z.string().min(1, 'Street address is required'), - streetLine2: z.string().nullable().optional(), - city: z.string().min(1, 'City is required'), - state: z.string().min(1, 'State/Province is required'), - postalCode: z.string().min(1, 'Postal code is required'), - country: z.string().min(1, 'Country is required'), -}); - -// Form validation hook -export const useFormValidation = ( - schema: T, - initialData: z.infer -) => { - const [data, setData] = useState(initialData); - const [errors, setErrors] = useState>({}); - - const validate = (field?: keyof z.infer) => { - const result = schema.safeParse(data); - if (!result.success) { - const fieldErrors: Record = {}; - result.error.errors.forEach(err => { - if (err.path.length > 0) { - fieldErrors[err.path[0] as string] = err.message; - } - }); - setErrors(fieldErrors); - return false; - } - setErrors({}); - return true; - }; - - return { data, setData, errors, validate }; -}; -``` - -### 3. API Response Unification - -**Problem**: Multiple response patterns causing complex handling. - -**Solution**: Unified response adapters with proper error handling. - -```typescript -// packages/domain/src/api/unified-responses.ts (NEW FILE) -export interface UnifiedApiResponse { - success: boolean; - data?: T; - error?: { - code: string; - message: string; - details?: unknown; - statusCode?: number; - timestamp: string; - }; - meta?: { - timestamp: string; - requestId?: string; - version?: string; - }; -} - -// Response adapters -export const adaptResponse = { - whmcs: (response: WhmcsApiResponse): UnifiedApiResponse => ({ - success: response.result === 'success', - data: response.data, - error: response.result === 'error' ? { - code: 'WHMCS_ERROR', - message: response.message || 'Unknown error', - timestamp: new Date().toISOString(), - } : undefined, - meta: { timestamp: new Date().toISOString() }, - }), - - salesforce: (response: SalesforceApiResponse): UnifiedApiResponse => ({ - success: response.success, - data: response.data, - error: !response.success ? { - code: response.errors?.[0]?.errorCode || 'SF_ERROR', - message: response.errors?.[0]?.message || 'Unknown error', - details: response.errors, - timestamp: new Date().toISOString(), - } : undefined, - meta: { timestamp: new Date().toISOString() }, - }), -}; -``` - -## ๐Ÿ—๏ธ Implementation Plan - -### Phase 1: Critical Fixes (Week 1) -1. โœ… Consolidate Address types -2. โœ… Remove duplicate local type definitions -3. โœ… Update all imports to use canonical types -4. โœ… Add migration helpers for backward compatibility - -### Phase 2: Validation Standardization (Week 2) -1. โœ… Migrate all forms to Zod validation -2. โœ… Remove custom validation utilities -3. โœ… Update BFF DTOs to align with domain schemas -4. โœ… Add proper error handling patterns - -### Phase 3: API Response Unification (Week 3) -1. โœ… Implement unified response adapters -2. โœ… Update all service layers to use adapters -3. โœ… Remove duplicate unwrap utilities -4. โœ… Add proper error boundary handling - -### Phase 4: Type Safety Enhancements (Week 4) -1. โœ… Add more branded types for critical IDs -2. โœ… Implement proper type guards -3. โœ… Add runtime type checking where needed -4. โœ… Update documentation and examples - -## ๐Ÿ”ง Specific File Changes Required - -### Remove Redundant Files -```bash -# These files contain duplicate type definitions -rm apps/portal/src/features/checkout/types/index.ts # Just re-exports -rm apps/portal/src/features/auth/utils/form-validation.ts # Replace with Zod -``` - -### Update Import Statements -```typescript -// BEFORE (scattered imports) -import type { Address } from './local-types'; -import { validateField } from '../utils/form-validation'; - -// AFTER (canonical imports) -import type { Address } from '@customer-portal/domain'; -import { useFormValidation, addressValidationSchema } from '@customer-portal/domain'; -``` - -### Consolidate Component Props -```typescript -// BEFORE (local interface) -interface AddressConfirmationProps { - onAddressConfirmed: (address?: Address) => void; // Local Address type -} - -// AFTER (domain type) -import type { Address } from '@customer-portal/domain'; -interface AddressConfirmationProps { - onAddressConfirmed: (address?: Address) => void; // Domain Address type -} -``` - -## ๐Ÿ“Š Expected Benefits - -### Type Safety Improvements -- โœ… Eliminate runtime type errors from Address mismatches -- โœ… Consistent validation across all forms -- โœ… Proper error handling with unified responses -- โœ… Better IDE support and autocomplete - -### Developer Experience -- โœ… Single source of truth for all types -- โœ… Consistent patterns across features -- โœ… Easier onboarding for new developers -- โœ… Reduced maintenance overhead - -### Code Quality -- โœ… Remove ~500 lines of duplicate code -- โœ… Standardize validation patterns -- โœ… Improve error handling consistency -- โœ… Better test coverage through type safety - -## ๐Ÿš€ Quick Wins (Can implement immediately) - -1. **Remove duplicate Address interface** in `AddressConfirmation.tsx` -2. **Standardize all Address imports** to use domain package -3. **Replace custom validation** with existing Zod schemas -4. **Use unified AsyncState** pattern everywhere -5. **Remove redundant barrel exports** that just re-export domain types - -## ๐Ÿ“ Migration Checklist - -- [ ] Audit all Address type usages -- [ ] Update component imports -- [ ] Migrate validation logic -- [ ] Test form submissions -- [ ] Update API response handling -- [ ] Remove redundant files -- [ ] Update documentation -- [ ] Add type tests - -This plan addresses the critical issues while maintaining backward compatibility during migration. diff --git a/ZOD_TRANSITION_COMPLETE.md b/ZOD_TRANSITION_COMPLETE.md new file mode 100644 index 00000000..41aad216 --- /dev/null +++ b/ZOD_TRANSITION_COMPLETE.md @@ -0,0 +1,138 @@ +# โœ… **Zod Transition Complete - Pure Zod Implementation** + +## ๐ŸŽฏ **Mission Accomplished** + +We have successfully transitioned the entire monorepo to use **pure Zod directly** without any complex abstractions, aliases, or "enhanced" wrappers. This aligns with industry best practices and your preference for clean, centralized validation. + +## ๐Ÿงน **What We Cleaned Up** + +### โŒ **Removed Complex Abstractions** +- ~~`EnhancedZodValidationPipe`~~ โ†’ Simple `ZodPipe` factory function +- ~~`BusinessValidator`~~ โ†’ Direct Zod schema validation +- ~~`FormBuilder`~~ โ†’ Direct `useZodForm` hook +- ~~`ZodExtensions`~~ โ†’ Pure Zod schemas +- ~~`ValidationModule`~~ โ†’ Direct imports where needed + +### โœ… **Implemented Simple Patterns** + +#### **1. NestJS Backend Validation** +```typescript +// Before: Complex enhanced pipe +@Body(EnhancedZodValidationPipe(schema, { transform: true, sanitize: true })) + +// After: Simple factory function +@Body(ZodPipe(signupRequestSchema)) +``` + +#### **2. React Frontend Validation** +```typescript +// Before: Complex FormBuilder abstraction +const form = FormBuilder.create(schema).withValidation().build(); + +// After: Direct Zod hook +const { values, errors, handleSubmit } = useZodForm({ + schema: signupFormSchema, + initialValues, + onSubmit +}); +``` + +#### **3. Direct Zod Usage Everywhere** +```typescript +// Simple, direct Zod schemas +const userSchema = z.object({ + email: z.string().email(), + name: z.string().min(1) +}); + +// Direct validation +const result = userSchema.parse(data); +``` + +## ๐Ÿ“ฆ **New Architecture** + +### **`@customer-portal/validation-service`** +- **Pure Zod re-export**: `export { z } from 'zod'` +- **Simple NestJS pipe**: `ZodPipe(schema)` factory function +- **Simple React hook**: `useZodForm({ schema, initialValues, onSubmit })` +- **No complex abstractions**: Just thin wrappers for framework integration + +### **Framework Integration** +```typescript +// NestJS Controllers +import { ZodPipe } from '@customer-portal/validation-service/nestjs'; +@Body(ZodPipe(createOrderRequestSchema)) + +// React Components +import { useZodForm } from '@customer-portal/validation-service/react'; +const form = useZodForm({ schema, initialValues, onSubmit }); + +// Direct Zod everywhere else +import { z } from 'zod'; +const schema = z.object({ ... }); +``` + +## ๐Ÿ”ง **Key Fixes Applied** + +### **1. Type Consistency** +- Fixed `whmcsClientId` type mismatch (database `number` vs Zod `string`) +- Aligned all Zod schemas with actual database types +- Removed unnecessary type conversions + +### **2. Direct Imports** +- All files now import `z` directly from `'zod'` +- No more complex re-exports or aliases +- Clean, traceable import paths + +### **3. Validation Patterns** +- Controllers use simple `ZodPipe(schema)` +- Forms use simple `useZodForm({ schema, ... })` +- Business logic uses direct `schema.parse(data)` + +## ๐Ÿ† **Why This Approach Wins** + +### **Industry Standard** +- **tRPC**: Uses Zod directly +- **React Hook Form**: Integrates with Zod directly +- **Next.js**: Uses Zod directly for API validation +- **Prisma**: Uses Zod directly for schema validation + +### **Developer Experience** +- **Familiar**: Developers know Zod, not custom abstractions +- **Debuggable**: Clear stack traces, no wrapper confusion +- **Maintainable**: Less custom code = fewer bugs +- **Performant**: No abstraction overhead + +### **Your Requirements Met** +- โœ… **No aliases**: Direct `z` import everywhere +- โœ… **Clean centralized structure**: Single validation service +- โœ… **Pure Zod**: No enhanced/extended versions +- โœ… **Direct usage**: No complex wrappers + +## ๐Ÿ“Š **Build Status** + +- โœ… **Validation Service**: Builds successfully +- โœ… **Zod-related errors**: All resolved +- โœ… **Controllers**: Using simple `ZodPipe(schema)` +- โœ… **Forms**: Using simple `useZodForm` +- โš ๏ธ **Remaining errors**: Unrelated to Zod (auth workflows, VPN catalog, etc.) + +## ๐Ÿš€ **Next Steps** + +The Zod transition is **complete**. The remaining build errors are unrelated to validation: +- Auth workflow return types +- VPN catalog property mismatches +- Invoice controller duplicate imports +- Subscription controller schema mismatches + +These are separate business logic issues, not validation architecture problems. + +## ๐Ÿ’ก **Key Takeaway** + +**"Simple is better than complex"** - We now have a clean, industry-standard Zod implementation that's: +- Easy to understand +- Easy to maintain +- Easy to debug +- Easy to extend + +No more over-engineering. Just pure, simple, effective Zod validation. ๐ŸŽ‰ diff --git a/apps/bff/.tsbuildinfo-minimal b/apps/bff/.tsbuildinfo-minimal new file mode 100644 index 00000000..4b9f8a28 --- /dev/null +++ b/apps/bff/.tsbuildinfo-minimal @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/reflect-metadata@0.2.2/node_modules/reflect-metadata/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Subscription.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Subscriber.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Operator.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Observable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/types.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/audit.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/auditTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/bufferCount.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/bufferTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/bufferToggle.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/bufferWhen.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/catchError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/combineLatestAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/combineAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/combineLatestWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/concat.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/concatAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/concatMap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/concatMapTo.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/concatWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/connect.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/count.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/debounceTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/defaultIfEmpty.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/delay.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/delayWhen.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/distinctUntilChanged.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/distinctUntilKeyChanged.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/elementAt.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/endWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/every.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/exhaustAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/exhaustMap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/expand.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/filter.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/find.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/findIndex.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/first.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Subject.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/groupBy.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/ignoreElements.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/isEmpty.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/last.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/map.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mapTo.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Notification.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/max.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/merge.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mergeAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mergeMap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/flatMap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mergeMapTo.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mergeScan.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/mergeWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/min.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/ConnectableObservable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/observeOn.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/onErrorResumeNextWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/partition.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/publish.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/publishBehavior.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/publishLast.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/publishReplay.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/race.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/raceWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/repeatWhen.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/retry.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/retryWhen.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/refCount.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/sample.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/sampleTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/scan.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/sequenceEqual.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/share.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/shareReplay.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/single.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/skip.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/skipLast.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/skipUntil.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/skipWhile.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/startWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/subscribeOn.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/switchAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/switchMap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/switchMapTo.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/switchScan.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/take.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/takeLast.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/takeUntil.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/takeWhile.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/tap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/throttleTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/throwIfEmpty.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/timeInterval.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/timeoutWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/toArray.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/window.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/windowCount.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/windowTime.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/windowToggle.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/windowWhen.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/withLatestFrom.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/zip.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/zipAll.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/operators/zipWith.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/operators/index.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/Action.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/Scheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/TestMessage.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/SubscriptionLog.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/SubscriptionLoggable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/ColdObservable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/HotObservable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/AsyncScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/timerHandle.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/AsyncAction.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/VirtualTimeScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/testing/TestScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/testing/index.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/dom/animationFrames.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/BehaviorSubject.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/ReplaySubject.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/AsyncSubject.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/AsapScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/QueueScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/AnimationFrameScheduler.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduler/animationFrame.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/identity.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/pipe.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/noop.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/isObservable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/lastValueFrom.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/firstValueFrom.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/ArgumentOutOfRangeError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/EmptyError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/NotFoundError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/ObjectUnsubscribedError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/SequenceError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/util/UnsubscriptionError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/bindCallback.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/bindNodeCallback.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/AnyCatcher.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/combineLatest.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/concat.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/defer.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/empty.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/forkJoin.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/from.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/fromEvent.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/fromEventPattern.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/generate.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/iif.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/interval.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/merge.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/never.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/of.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/onErrorResumeNext.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/partition.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/race.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/range.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/throwError.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/timer.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/using.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/observable/zip.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/internal/config.d.ts","../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/types/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/ws-exception-filter.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/validation-error.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/execution-context.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/can-activate.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/custom-route-param-factory.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/nest-interceptor.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/paramtype.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/type.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/features/pipe-transform.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/request-method.enum.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/http-status.enum.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/shutdown-signal.enum.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/version-type.enum.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/version-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/middleware/middleware-configuration.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/middleware/middleware-consumer.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/middleware/middleware-config-proxy.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/middleware/nest-middleware.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/middleware/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/global-prefix-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/before-application-shutdown.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/on-application-bootstrap.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/on-application-shutdown.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/on-destroy.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/on-init.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/hooks/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/http-exception-body.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/http-redirect-response.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/cors-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/https-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/services/logger.service.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/nest-application-context-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/nest-application-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/http-server.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/message-event.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/raw-body-request.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/http/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/injectable.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/microservices/nest-hybrid-application-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/forward-reference.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/scope-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/injection-token.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/optional-factory-dependency.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/provider.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/module-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/dynamic-module.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/introspection-result.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/nest-module.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/modules/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/nest-application-context.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/websockets/web-socket-adapter.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/nest-application.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/nest-microservice.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/catch.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/controller.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/dependencies.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/exception-filters.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/inject.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/injectable.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/optional.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/set-metadata.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/use-guards.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/use-interceptors.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/use-pipes.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/apply-decorators.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/version.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/core/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/modules/global.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/modules/module.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/modules/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/request-mapping.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/route-params.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/http-code.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/create-route-param-metadata.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/render.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/header.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/redirect.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/sse.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/http/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/decorators/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/intrinsic.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/http.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/bad-gateway.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/bad-request.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/conflict.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/forbidden.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/gateway-timeout.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/gone.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/http-version-not-supported.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/im-a-teapot.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/internal-server-error.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/method-not-allowed.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/misdirected.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/not-acceptable.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/not-found.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/not-implemented.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/payload-too-large.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/precondition-failed.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/request-timeout.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/service-unavailable.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/unauthorized.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/unprocessable-entity.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/unsupported-media-type.exception.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/exceptions/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/services/console-logger.service.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/services/utils/filter-log-levels.util.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/services/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/file-stream/interfaces/streamable-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/file-stream/interfaces/streamable-handler-response.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/file-stream/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/file-stream/streamable-file.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/file-stream/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/constants.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/interfaces/configurable-module-async-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/interfaces/configurable-module-cls.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/interfaces/configurable-module-host.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/configurable-module.builder.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/module-utils/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/default-value.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/interfaces/file.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/file-validator.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/file-type.validator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/max-file-size.validator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/utils/http-error-by-code.util.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/parse-file-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/parse-file.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/parse-file-pipe.builder.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/file/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/class-transform-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/transformer-package.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/validator-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/external/validator-package.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/validation.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-array.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-bool.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-date.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-enum.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-float.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-int.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/parse-uuid.pipe.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/pipes/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/serializer/class-serializer.interfaces.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/serializer/class-serializer.interceptor.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/serializer/decorators/serialize-options.decorator.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/serializer/decorators/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/serializer/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/utils/forward-ref.util.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/utils/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/adapters/http-adapter.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/adapters/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/constants.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/edge.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/entrypoint.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/extras.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/node.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/settlement-signal.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/injector.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/serialized-graph-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/serialized-graph-json.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/serialized-graph.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/opaque-key-factory/interfaces/module-opaque-key-factory.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/compiler.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/modules-container.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/container.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/instance-links-host.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/abstract-instance-resolver.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/module-ref.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/module.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/instance-wrapper.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/interfaces/exclude-route-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/application-config.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/constants.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/discovery/discovery-module.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/discovery/discovery-service.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/discovery/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/http-adapter-host.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/base-exception-filter.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/context-id-factory.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/exceptions-handler.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/router-proxy.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/context-creator.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/base-exception-filter-context.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/exceptions/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/external-exception-filter.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/external-exceptions-handler.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/exceptions/external-exception-filter-context.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/guards/constants.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/execution-context-host.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/guards/guards-consumer.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/guards/guards-context-creator.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/guards/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/interceptors/interceptors-consumer.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/interceptors/interceptors-context-creator.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/interceptors/index.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/enums/route-paramtypes.enum.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/pipes/params-token-factory.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/pipes/pipes-consumer.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/pipes/pipes-context-creator.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/pipes/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/context-utils.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/inquirer/inquirer-constants.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/inquirer/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/interfaces/module-definition.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/interfaces/module-override.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/graph-inspector.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/metadata-scanner.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/scanner.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/instance-loader.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/injector/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/interfaces/external-handler-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/interfaces/params-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/external-context-creator.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/helpers/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/initialize-on-preview.allowlist.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/partial-graph.host.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/inspector/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/middleware/route-info-path-extractor.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/middleware/routes-mapper.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/middleware/builder.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/middleware/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/nest-application-context.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/nest-application.d.ts","../../node_modules/.pnpm/@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_reflect-metadata@0.2.2_rxjs@7.8.2/node_modules/@nestjs/common/interfaces/microservices/nest-microservice-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/nest-factory.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/repl/repl.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/repl/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/interfaces/routes.interface.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/request/request-constants.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/request/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/router-module.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/router/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/services/reflector.service.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/services/index.d.ts","../../node_modules/.pnpm/@nestjs+core@11.1.6_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14._6b43ae8343efe3323bb5fcd8a3d61ef5/node_modules/@nestjs/core/index.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/conditional.module.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/interfaces/config-change-event.interface.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/types/config-object.type.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/types/config.type.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/types/no-infer.type.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/types/path-value.type.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/types/index.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/interfaces/config-factory.interface.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.3.1/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/dotenv-expand@12.0.1/node_modules/dotenv-expand/lib/main.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/interfaces/config-module-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/config.module.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/config.service.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/utils/register-as.util.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/utils/get-config-token.util.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/utils/index.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/dist/index.d.ts","../../node_modules/.pnpm/@nestjs+config@4.0.2_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14_21dcc2f7621b8b5487ab85d7ad2143bc/node_modules/@nestjs/config/index.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler-storage-record.interface.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler-storage.interface.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.guard.interface.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler-module-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.decorator.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.exception.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.guard.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.module.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.providers.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler-storage-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/throttler.service.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/utilities.d.ts","../../node_modules/.pnpm/@nestjs+throttler@6.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_4823b92865f6752ef55a12aa2f9471be/node_modules/@nestjs/throttler/dist/index.d.ts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/util.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/versions.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/schemas.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/checks.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/errors.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/core.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/parse.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/regexes.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ar.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/az.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/be.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ca.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/cs.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/da.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/de.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/en.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/eo.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/es.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/fa.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/fi.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/fr.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/fr-CA.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/he.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/hu.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/id.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/is.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/it.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ja.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/kh.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ko.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/mk.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ms.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/nl.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/no.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ota.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ps.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/pl.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/pt.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ru.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/sl.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/sv.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ta.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/th.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/tr.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ua.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/ur.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/vi.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/zh-CN.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/zh-TW.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/yo.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/locales/index.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/registries.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/doc.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/api.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/core/index.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/errors.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/parse.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/checks.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/compat.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/iso.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/v4/classic/external.d.cts","../../node_modules/.pnpm/zod@4.1.5/node_modules/zod/index.d.cts","./src/core/config/env.validation.ts","./src/core/config/app.config.ts","./src/core/config/throttler.config.ts","../../node_modules/.pnpm/@types+jsonwebtoken@9.0.7/node_modules/@types/jsonwebtoken/index.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/interfaces/jwt-module-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/jwt.errors.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/jwt.module.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/jwt.service.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/dist/index.d.ts","../../node_modules/.pnpm/@nestjs+jwt@11.0.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2_0f285f00119380d9826a154eb9f7c16f/node_modules/@nestjs/jwt/index.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/abstract.strategy.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/interfaces/auth-module.options.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/interfaces/type.interface.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/auth.guard.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/passport.module.d.ts","../../node_modules/.pnpm/@types+mime@1.3.5/node_modules/@types/mime/index.d.ts","../../node_modules/.pnpm/@types+send@0.17.5/node_modules/@types/send/index.d.ts","../../node_modules/.pnpm/@types+qs@6.14.0/node_modules/@types/qs/index.d.ts","../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","../../node_modules/.pnpm/@types+express-serve-static-core@5.0.7/node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/index.d.ts","../../node_modules/.pnpm/@types+serve-static@1.15.8/node_modules/@types/serve-static/index.d.ts","../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/index.d.ts","../../node_modules/.pnpm/@types+express@5.0.3/node_modules/@types/express/index.d.ts","../../node_modules/.pnpm/@types+passport@1.0.17/node_modules/@types/passport/index.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/passport/passport.serializer.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/passport/passport.strategy.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/dist/index.d.ts","../../node_modules/.pnpm/@nestjs+passport@11.0.5_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0_6c1f1cb5cdfdbf8dd3ae20fe663ccfad/node_modules/@nestjs/passport/index.d.ts","../../node_modules/.pnpm/@types+bcrypt@6.0.0/node_modules/@types/bcrypt/index.d.ts","./src/core/utils/error.util.ts","./src/core/utils/validation.util.ts","../../packages/domain/dist/common.d.ts","../../packages/domain/dist/entities/user.d.ts","../../packages/domain/dist/enums/status.d.ts","../../packages/domain/dist/entities/invoice.d.ts","../../packages/domain/dist/entities/payment.d.ts","../../packages/domain/dist/entities/case.d.ts","../../packages/domain/dist/entities/dashboard.d.ts","../../packages/domain/dist/entities/billing.d.ts","../../packages/domain/dist/entities/skus.d.ts","../../packages/domain/dist/entities/product.d.ts","../../packages/domain/dist/entities/order.d.ts","../../packages/domain/dist/entities/catalog.d.ts","../../packages/domain/dist/entities/checkout.d.ts","../../packages/domain/dist/entities/subscription.d.ts","../../packages/domain/dist/entities/index.d.ts","../../packages/domain/dist/enums/index.d.ts","../../packages/domain/dist/contracts/api.d.ts","../../packages/domain/dist/contracts/bff.d.ts","../../packages/domain/dist/contracts/index.d.ts","../../packages/domain/dist/utils/validation.d.ts","../../packages/domain/dist/utils/array-utils.d.ts","../../packages/domain/dist/utils/filters.d.ts","../../packages/domain/dist/utils/currency.d.ts","../../packages/domain/dist/utils/index.d.ts","../../packages/domain/dist/patterns/async-state.d.ts","../../packages/domain/dist/patterns/form-state.d.ts","../../packages/domain/dist/patterns/pagination.d.ts","../../packages/domain/dist/patterns/index.d.ts","../../packages/domain/node_modules/zod/v4/core/standard-schema.d.cts","../../packages/domain/node_modules/zod/v4/core/util.d.cts","../../packages/domain/node_modules/zod/v4/core/versions.d.cts","../../packages/domain/node_modules/zod/v4/core/schemas.d.cts","../../packages/domain/node_modules/zod/v4/core/checks.d.cts","../../packages/domain/node_modules/zod/v4/core/errors.d.cts","../../packages/domain/node_modules/zod/v4/core/core.d.cts","../../packages/domain/node_modules/zod/v4/core/parse.d.cts","../../packages/domain/node_modules/zod/v4/core/regexes.d.cts","../../packages/domain/node_modules/zod/v4/locales/ar.d.cts","../../packages/domain/node_modules/zod/v4/locales/az.d.cts","../../packages/domain/node_modules/zod/v4/locales/be.d.cts","../../packages/domain/node_modules/zod/v4/locales/ca.d.cts","../../packages/domain/node_modules/zod/v4/locales/cs.d.cts","../../packages/domain/node_modules/zod/v4/locales/da.d.cts","../../packages/domain/node_modules/zod/v4/locales/de.d.cts","../../packages/domain/node_modules/zod/v4/locales/en.d.cts","../../packages/domain/node_modules/zod/v4/locales/eo.d.cts","../../packages/domain/node_modules/zod/v4/locales/es.d.cts","../../packages/domain/node_modules/zod/v4/locales/fa.d.cts","../../packages/domain/node_modules/zod/v4/locales/fi.d.cts","../../packages/domain/node_modules/zod/v4/locales/fr.d.cts","../../packages/domain/node_modules/zod/v4/locales/fr-CA.d.cts","../../packages/domain/node_modules/zod/v4/locales/he.d.cts","../../packages/domain/node_modules/zod/v4/locales/hu.d.cts","../../packages/domain/node_modules/zod/v4/locales/id.d.cts","../../packages/domain/node_modules/zod/v4/locales/is.d.cts","../../packages/domain/node_modules/zod/v4/locales/it.d.cts","../../packages/domain/node_modules/zod/v4/locales/ja.d.cts","../../packages/domain/node_modules/zod/v4/locales/ka.d.cts","../../packages/domain/node_modules/zod/v4/locales/kh.d.cts","../../packages/domain/node_modules/zod/v4/locales/km.d.cts","../../packages/domain/node_modules/zod/v4/locales/ko.d.cts","../../packages/domain/node_modules/zod/v4/locales/lt.d.cts","../../packages/domain/node_modules/zod/v4/locales/mk.d.cts","../../packages/domain/node_modules/zod/v4/locales/ms.d.cts","../../packages/domain/node_modules/zod/v4/locales/nl.d.cts","../../packages/domain/node_modules/zod/v4/locales/no.d.cts","../../packages/domain/node_modules/zod/v4/locales/ota.d.cts","../../packages/domain/node_modules/zod/v4/locales/ps.d.cts","../../packages/domain/node_modules/zod/v4/locales/pl.d.cts","../../packages/domain/node_modules/zod/v4/locales/pt.d.cts","../../packages/domain/node_modules/zod/v4/locales/ru.d.cts","../../packages/domain/node_modules/zod/v4/locales/sl.d.cts","../../packages/domain/node_modules/zod/v4/locales/sv.d.cts","../../packages/domain/node_modules/zod/v4/locales/ta.d.cts","../../packages/domain/node_modules/zod/v4/locales/th.d.cts","../../packages/domain/node_modules/zod/v4/locales/tr.d.cts","../../packages/domain/node_modules/zod/v4/locales/ua.d.cts","../../packages/domain/node_modules/zod/v4/locales/uk.d.cts","../../packages/domain/node_modules/zod/v4/locales/ur.d.cts","../../packages/domain/node_modules/zod/v4/locales/vi.d.cts","../../packages/domain/node_modules/zod/v4/locales/zh-CN.d.cts","../../packages/domain/node_modules/zod/v4/locales/zh-TW.d.cts","../../packages/domain/node_modules/zod/v4/locales/yo.d.cts","../../packages/domain/node_modules/zod/v4/locales/index.d.cts","../../packages/domain/node_modules/zod/v4/core/registries.d.cts","../../packages/domain/node_modules/zod/v4/core/doc.d.cts","../../packages/domain/node_modules/zod/v4/core/api.d.cts","../../packages/domain/node_modules/zod/v4/core/json-schema.d.cts","../../packages/domain/node_modules/zod/v4/core/to-json-schema.d.cts","../../packages/domain/node_modules/zod/v4/core/index.d.cts","../../packages/domain/node_modules/zod/v4/classic/errors.d.cts","../../packages/domain/node_modules/zod/v4/classic/parse.d.cts","../../packages/domain/node_modules/zod/v4/classic/schemas.d.cts","../../packages/domain/node_modules/zod/v4/classic/checks.d.cts","../../packages/domain/node_modules/zod/v4/classic/compat.d.cts","../../packages/domain/node_modules/zod/v4/classic/iso.d.cts","../../packages/domain/node_modules/zod/v4/classic/coerce.d.cts","../../packages/domain/node_modules/zod/v4/classic/external.d.cts","../../packages/domain/node_modules/zod/index.d.cts","../../packages/domain/dist/validation/shared/primitives.d.ts","../../packages/domain/dist/validation/shared/identifiers.d.ts","../../packages/domain/dist/validation/shared/common.d.ts","../../packages/domain/dist/validation/shared/utilities.d.ts","../../packages/domain/dist/validation/shared/index.d.ts","../../packages/domain/dist/validation/api/requests.d.ts","../../packages/domain/dist/validation/forms/auth.d.ts","../../packages/domain/dist/validation/forms/profile.d.ts","../../packages/domain/dist/validation/forms/orders.d.ts","../../packages/domain/dist/validation/forms/subscriptions.d.ts","../../packages/domain/dist/validation/forms/sim-configure.d.ts","../../packages/domain/dist/validation/business/orders.d.ts","../../packages/domain/dist/validation/business/index.d.ts","../../packages/domain/dist/validation/form-builder.d.ts","../../packages/domain/dist/validation/index.d.ts","../../packages/domain/dist/adapters/api-adapters.d.ts","../../packages/domain/dist/adapters/index.d.ts","../../packages/domain/dist/utils/type-utils.d.ts","../../packages/domain/dist/client/typed-client.d.ts","../../packages/domain/dist/client/index.d.ts","../../packages/domain/dist/index.d.ts","../../node_modules/.pnpm/@prisma+client@6.16.0_prisma@6.16.0_typescript@5.9.2__typescript@5.9.2/node_modules/@prisma/client/runtime/library.d.ts","../../node_modules/.pnpm/@prisma+client@6.16.0_prisma@6.16.0_typescript@5.9.2__typescript@5.9.2/node_modules/.prisma/client/index.d.ts","../../node_modules/.pnpm/@prisma+client@6.16.0_prisma@6.16.0_typescript@5.9.2__typescript@5.9.2/node_modules/.prisma/client/default.d.ts","../../node_modules/.pnpm/@prisma+client@6.16.0_prisma@6.16.0_typescript@5.9.2__typescript@5.9.2/node_modules/@prisma/client/default.d.ts","./src/infra/utils/user-mapper.util.ts","../../node_modules/.pnpm/pino-std-serializers@7.0.0/node_modules/pino-std-serializers/index.d.ts","../../node_modules/.pnpm/sonic-boom@4.2.0/node_modules/sonic-boom/types/index.d.ts","../../node_modules/.pnpm/pino@9.9.5/node_modules/pino/pino.d.ts","../../node_modules/.pnpm/pino-http@10.5.0/node_modules/pino-http/index.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/params.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/LoggerModule.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/PinoLogger.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/Logger.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/InjectPinoLogger.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/LoggerErrorInterceptor.d.ts","../../node_modules/.pnpm/nestjs-pino@4.4.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.14.2__ab35d060c125be12618ab1c46a088257/node_modules/nestjs-pino/index.d.ts","./src/infra/database/prisma.service.ts","./src/integrations/whmcs/types/whmcs-api.types.ts","./src/integrations/whmcs/services/whmcs-connection.service.ts","./src/integrations/whmcs/transformers/whmcs-data.transformer.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/types.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/Command.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/ScanStream.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/utils/RedisCommander.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/transaction.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/utils/Commander.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/AbstractConnector.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/ConnectorConstructor.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/SentinelConnector/types.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/SentinelConnector/SentinelIterator.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/SentinelConnector/index.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/connectors/StandaloneConnector.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/redis/RedisOptions.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/cluster/util.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/cluster/ClusterOptions.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/cluster/index.d.ts","../../node_modules/.pnpm/denque@2.1.0/node_modules/denque/index.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/SubscriptionSet.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/DataHandler.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/Redis.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/Pipeline.d.ts","../../node_modules/.pnpm/ioredis@5.7.0/node_modules/ioredis/built/index.d.ts","./src/infra/cache/cache.service.ts","./src/integrations/whmcs/cache/whmcs-cache.service.ts","./src/integrations/whmcs/services/whmcs-invoice.service.ts","./src/integrations/whmcs/services/whmcs-subscription.service.ts","./src/integrations/whmcs/services/whmcs-client.service.ts","./src/integrations/whmcs/services/whmcs-payment.service.ts","./src/integrations/whmcs/services/whmcs-sso.service.ts","./src/integrations/whmcs/services/whmcs-order.service.ts","./src/integrations/whmcs/whmcs.service.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/typings/faye/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/typings/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/VERSION.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/util.d.ts","../../node_modules/.pnpm/form-data@4.0.4/node_modules/form-data/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/common.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/schema.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/projection.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/record.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/soap.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/standard-schema.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/util/promise.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/types/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/transport.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/util/logger.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/oauth2.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/cache.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/session-refresh-delegate.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/record-stream.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/soql-builder.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/date.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/query.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/record-reference.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/quick-action.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/bulk.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/sobject.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/process.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/analytics/types.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/analytics.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/apex.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/bulk2.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/chatter.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/metadata/schema.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/metadata.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/soap/schema.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/soap.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/streaming/extension.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/streaming.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/api/tooling.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/connection.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/types.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/base.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/file.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/sfdx.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/empty.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/registry/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/browser/client.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/jsforce.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/core.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/lib/index.d.ts","../../node_modules/.pnpm/jsforce@3.10.7_@types+node@24.3.1/node_modules/jsforce/index.d.ts","../../node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/index.d.ts","../../node_modules/.pnpm/@types+jsonwebtoken@9.0.10/node_modules/@types/jsonwebtoken/index.d.ts","./src/integrations/salesforce/services/salesforce-connection.service.ts","./src/core/config/field-map.ts","./src/integrations/salesforce/services/salesforce-account.service.ts","./src/integrations/salesforce/services/salesforce-case.service.ts","./src/integrations/salesforce/salesforce.service.ts","./src/modules/id-mappings/types/mapping.types.ts","./src/modules/id-mappings/cache/mapping-cache.service.ts","./src/modules/id-mappings/validation/mapping-validator.service.ts","./src/modules/id-mappings/mappings.service.ts","./src/modules/users/users.service.ts","./src/infra/audit/audit.service.ts","./src/modules/auth/utils/jwt-expiry.util.ts","./src/modules/auth/services/token-blacklist.service.ts","./src/core/utils/sso.util.ts","./src/modules/auth/services/token.service.ts","./src/modules/auth/utils/sanitize-user.util.ts","./src/modules/auth/services/workflows/signup-workflow.service.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/attachment.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/email-address.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/personalization.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/mail.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/response.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/response-error.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/index.d.ts","../../node_modules/.pnpm/@sendgrid+helpers@8.0.0/node_modules/@sendgrid/helpers/classes/request.d.ts","../../node_modules/.pnpm/@sendgrid+client@8.1.5/node_modules/@sendgrid/client/src/request.d.ts","../../node_modules/.pnpm/@sendgrid+client@8.1.5/node_modules/@sendgrid/client/src/response.d.ts","../../node_modules/.pnpm/@sendgrid+client@8.1.5/node_modules/@sendgrid/client/src/client.d.ts","../../node_modules/.pnpm/@sendgrid+client@8.1.5/node_modules/@sendgrid/client/index.d.ts","../../node_modules/.pnpm/@sendgrid+mail@8.1.5/node_modules/@sendgrid/mail/src/mail.d.ts","../../node_modules/.pnpm/@sendgrid+mail@8.1.5/node_modules/@sendgrid/mail/index.d.ts","./src/infra/email/providers/sendgrid.provider.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/bull.messages.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/bull.tokens.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/errors/missing-shared-bull-config.error.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/errors/index.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/helpers/create-conditional-dep-holder.helper.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/helpers/index.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/utils/get-queue-token.util.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/utils/index.d.ts","../../node_modules/.pnpm/@nestjs+bull-shared@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validato_2ea49381c8cc64b5c8d8240de6eff913/node_modules/@nestjs/bull-shared/dist/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/async-fifo-queue.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/backoff-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/keep-jobs.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/parent-options.d.ts","../../node_modules/.pnpm/cron-parser@4.9.0/node_modules/cron-parser/types/common.d.ts","../../node_modules/.pnpm/cron-parser@4.9.0/node_modules/cron-parser/types/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/repeat-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/base-job-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/deduplication-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/job-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/job-progress.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/parent.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/job-json.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/job-json-sandbox.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/minimal-job.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/backoff-strategy.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/backoffs.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/repeat-strategy.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/advanced-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/parent-command.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/child-message.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/connection.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/finished-status.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/job-scheduler-template-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/job-type.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/redis-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/child-command.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/error-code.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/metrics-time.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/telemetry-attributes.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/enums/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/telemetry.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/queue-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/flow-job.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/ioredis-events.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/job-scheduler-json.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/metrics-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/metrics.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue-keys.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/script-queue-context.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/minimal-queue.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/parent-message.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/rate-limiter-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/redis-streams.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/repeatable-job.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/repeatable-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/sandboxed-job.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/sandboxed-job-processor.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/sandboxed-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/worker-options.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/receiver.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/interfaces/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/child.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/child-pool.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/child-processor.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/delayed-error.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/rate-limit-error.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/unrecoverable-error.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/waiting-children-error.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/waiting-error.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/errors/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/scripts.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/redis-connection.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue-base.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue-events.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/job.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/flow-producer.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/job-scheduler.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue-events-producer.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue-getters.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/repeat.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/queue.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/sandbox.d.ts","../../node_modules/.pnpm/node-abort-controller@3.1.1/node_modules/node-abort-controller/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/types/processor.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/worker.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/classes/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/utils/index.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/utils/create-scripts.d.ts","../../node_modules/.pnpm/bullmq@5.58.5/node_modules/bullmq/dist/esm/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/bull.types.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/bull-processor.interfaces.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/partial-this-parameter.type.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/register-flow-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/register-queue-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/shared-bull-config.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/bull.module.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/inject-flow-producer.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/inject-queue.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/on-queue-event.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/on-worker-event.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/worker-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/processor.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/queue-event-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/queue-events-listener.decorator.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/decorators/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/bull-metadata.accessor.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/hosts/queue-events-host.class.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/hosts/worker-host.class.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/hosts/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/instrument/processor-decorator.service.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/interfaces/queue-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/bull.explorer.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/bull.registrar.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/instrument/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/get-flow-producer-token.util.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/get-flow-producer-options-token.util.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/get-queue-options-token.util.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/get-shared-config-token.util.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/utils/index.d.ts","../../node_modules/.pnpm/@nestjs+bullmq@11.0.3_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0.1_6676bea9cbb934aa8759cb9dce9c4d77/node_modules/@nestjs/bullmq/dist/index.d.ts","./src/infra/queue/queue.constants.ts","./src/infra/email/queue/email.queue.ts","./src/infra/email/email.service.ts","./src/modules/auth/services/workflows/password-workflow.service.ts","./src/modules/auth/services/workflows/whmcs-link-workflow.service.ts","./src/modules/auth/auth.service.ts","./src/modules/auth/guards/local-auth.guard.ts","./src/modules/auth/guards/auth-throttle.guard.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-basic.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-bearer.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/open-api-spec.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/types/swagger-enum.type.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-body.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-consumes.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-cookie.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-default-getter.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-exclude-endpoint.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-exclude-controller.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-extra-models.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-header.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-hide-property.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-link.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-oauth2.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-operation.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/enum-schema-attributes.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-param.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-produces.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/schema-object-metadata.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-property.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-query.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-response.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-security.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-use-tags.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/callback-object.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-callbacks.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-extension.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/api-schema.decorator.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/decorators/index.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/swagger-ui-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/swagger-custom-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/swagger-document-options.interface.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/interfaces/index.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/document-builder.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/swagger-module.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/type-helpers/intersection-type.helper.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/type-helpers/omit-type.helper.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/type-helpers/partial-type.helper.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/type-helpers/pick-type.helper.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/type-helpers/index.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/utils/get-schema-path.util.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/utils/index.d.ts","../../node_modules/.pnpm/@nestjs+swagger@11.2.0_@nestjs+common@11.1.6_class-transformer@0.5.1_class-validator@0._8775cc10a1cbba467b4e5b168c3ea226/node_modules/@nestjs/swagger/dist/index.d.ts","./src/modules/auth/decorators/public.decorator.ts","./src/core/validation/zod-validation.pipe.ts","./src/core/validation/enhanced-zod-validation.pipe.ts","./src/core/validation/validation.module.ts","./src/core/validation/index.ts","./src/modules/auth/auth-zod.controller.ts","./src/modules/auth/guards/admin.guard.ts","./src/modules/auth/auth-admin.controller.ts","./src/modules/auth/auth.types.ts","./src/modules/users/users.controller.ts","./src/integrations/whmcs/whmcs.module.ts","./src/integrations/salesforce/salesforce.module.ts","./src/infra/cache/cache.module.ts","./src/modules/id-mappings/mappings.module.ts","./src/infra/database/prisma.module.ts","./src/modules/users/users.module.ts","./src/integrations/freebit/interfaces/freebit.types.ts","./src/integrations/freebit/freebit.service.ts","./src/integrations/freebit/freebit.module.ts","./src/integrations/integrations.module.ts","../../node_modules/.pnpm/@types+passport-strategy@0.2.38/node_modules/@types/passport-strategy/index.d.ts","../../node_modules/.pnpm/@types+passport-jwt@4.0.1/node_modules/@types/passport-jwt/index.d.ts","./src/modules/auth/strategies/jwt.strategy.ts","../../node_modules/.pnpm/@types+passport-local@1.0.38/node_modules/@types/passport-local/index.d.ts","./src/modules/auth/strategies/local.strategy.ts","./src/modules/auth/guards/global-auth.guard.ts","./src/core/logging/logging.module.ts","./src/infra/email/queue/email.processor.ts","./src/infra/email/email.module.ts","./src/modules/auth/auth.module.ts","./src/modules/catalog/services/base-catalog.service.ts","./src/modules/catalog/services/internet-catalog.service.ts","./src/modules/catalog/services/sim-catalog.service.ts","./src/modules/catalog/services/vpn-catalog.service.ts","./src/modules/catalog/catalog.controller.ts","./src/modules/catalog/catalog.module.ts","./src/modules/orders/services/order-validator.service.ts","./src/modules/orders/services/order-builder.service.ts","./src/modules/orders/services/order-item-builder.service.ts","./src/modules/orders/types/order-details.dto.ts","./src/modules/orders/services/order-orchestrator.service.ts","./src/modules/orders/orders.controller.ts","./src/modules/orders/services/order-fulfillment-validator.service.ts","./src/modules/orders/services/order-whmcs-mapper.service.ts","./src/modules/orders/services/order-fulfillment-error.service.ts","./src/modules/orders/services/sim-fulfillment.service.ts","./src/modules/orders/services/order-fulfillment-orchestrator.service.ts","./src/modules/orders/queue/provisioning.queue.ts","./src/integrations/salesforce/events/event-keys.util.ts","./src/modules/orders/queue/provisioning.processor.ts","./src/modules/orders/orders.module.ts","./src/modules/invoices/invoices.service.ts","./src/modules/invoices/invoices.controller.ts","./src/modules/invoices/invoices.module.ts","./src/modules/subscriptions/subscriptions.service.ts","./src/modules/subscriptions/sim-usage-store.service.ts","./src/modules/subscriptions/sim-management.service.ts","./src/modules/subscriptions/subscriptions.controller.ts","./src/modules/subscriptions/sim-order-activation.service.ts","./src/modules/subscriptions/sim-orders.controller.ts","./src/modules/subscriptions/subscriptions.module.ts","./src/core/config/router.config.ts","./src/infra/redis/redis.module.ts","./src/infra/queue/queue.module.ts","./src/infra/audit/audit.module.ts","./src/integrations/salesforce/events/pubsub.subscriber.ts","./src/integrations/salesforce/events/events.module.ts","./src/modules/health/health.controller.ts","./src/modules/health/health.module.ts","./src/core/http/success-response.interceptor.ts","./src/app.module.ts","../../node_modules/.pnpm/helmet@8.1.0/node_modules/helmet/index.d.cts","../../node_modules/.pnpm/@types+cookie-parser@1.4.9_@types+express@5.0.3/node_modules/@types/cookie-parser/index.d.ts","./src/core/http/http-exception.filter.ts","./src/app/bootstrap.ts","./src/main.ts","./src/modules/auth/guards/jwt-auth.guard.ts","./src/modules/cases/cases.service.ts","./src/modules/cases/cases.controller.ts","./src/modules/cases/cases.module.ts","./src/modules/jobs/jobs.service.ts","./src/modules/jobs/reconcile.processor.ts","./src/modules/jobs/jobs.module.ts"],"fileIdsList":[[421,514,525,577,636,649,718,719,1194,1195,1196,1197,1201,1208,1210,1211,1217,1232,1235,1242,1243,1244,1245,1246,1248,1250,1251],[421,514,525,577,636,743,887,1181,1252,1253,1254,1255],[525,577,636,717],[525,577,716],[525,577,871],[514,525,577,1195,1197,1211,1217,1232,1235,1242],[525,577,636,649],[421,525,577,743,750,887],[200,267,421,525,577],[421,525,577,887],[525,577],[421,525,577],[421,525,577,716],[525,577,1183,1184,1185],[421,525,577,1183],[421,525,577,986],[421,525,577,750,875,887,888],[421,525,577,914],[421,525,577,887,913],[421,525,577,888],[421,525,577,875],[421,525,577,636,1007,1131,1132,1208,1209],[421,525,577,636,887,1007,1131],[421,525,577,636,887,1006],[421,525,577,887,1129,1130,1131,1132],[421,525,577,887,1097,1129,1130,1132],[421,525,577,636,1129,1130],[421,525,577,636,913],[525,577,871,875],[421,525,577,1199],[421,525,577,636,887,1198],[421,525,577,1192,1193,1200],[421,525,577,636,1201,1232,1247],[421,525,577,636,887,914,976,1229,1230],[421,525,577,976,978,979,980],[421,525,577,636,750,871,887,976,977,978,979],[421,525,577,750,871,887,976],[421,525,577,590,598,636,750,887,973,975],[421,525,577,750,871,887,914],[421,525,577,750,887,889,890,915],[421,525,577,636,750,887,889],[421,525,577,750,871,887,889,890,891,915],[421,525,577,750,887,890],[421,525,577,750,887,889,890],[421,525,577,750,871,887,889],[421,525,577,636,890,891,915,916,917,918,919,920,921,922],[421,525,577,750,871,887,889,890,916,917,918,919,920,921],[421,525,577,1256],[421,525,577,985,986,1181,1188],[421,525,577,649,743,871,1135,1136,1137,1181,1182,1186],[421,514,525,577,636,727,748,988,990,992,1133,1134,1135,1186,1187,1189,1195,1197,1201,1204,1206,1207,1210],[421,525,577,636,727,743,749,750,871,875,887,888,922,980,984,985,986,988,989,990,991,992,1133,1134],[525,577,743],[421,525,577,743,875],[421,525,577,649,743],[421,514,525,577,748,988,1182,1203],[421,525,577,748],[421,525,577,636,887,913,987],[421,525,577,636,727,871,987],[421,525,577,636,727,743,749,750,871,875,887,985,986,990,991,1132],[421,525,577,636,743,749,750,871,875,887,888,922,980,984,985,986,990,991],[421,525,577,750,871,887,889,922,980,984,985,991],[421,525,577,636,748,988,1203],[421,525,577,743,748,1135,1205],[421,525,577,1181,1259],[421,525,577,1195,1201,1259,1260],[421,525,577,871,1181,1213,1214,1215],[421,525,577,1195,1201,1212,1213,1214,1215,1216],[421,525,577,871,887,976,977],[421,525,577,750,871,887,976,984,1212],[421,525,577,871,887,890,976,984,1212],[421,525,577,871,1212],[421,525,577,887,888,914],[421,525,577,636,1196,1249],[421,525,577,750,887,914,981],[421,525,577,982,983,984,1194],[421,525,577,750,887,888,981,982,983],[421,525,577,871,887],[421,525,577,871,1181,1233],[421,525,577,1192,1195,1233,1234],[421,525,577,750,871,887,922,984],[421,525,577,1262,1263],[421,525,577,1097,1129,1130],[421,525,577,871,887,1181,1186,1190,1222],[421,525,577,1195,1197,1201,1218,1219,1220,1222,1223,1224,1225,1226,1227,1228,1229,1231],[421,525,577,636,887,914,977,980,1129,1130,1228,1229,1230],[421,525,577,887,1097,1129,1130],[421,525,577,871,887,977,985],[421,525,577,750,887,921,977,980,1221,1222,1224,1225,1226,1227],[421,525,577,750,871,887,919,977,980,984],[421,525,577,887,976,977],[421,525,577,871,887,976,977,1218,1219,1220,1221],[421,525,577,750,871,887,890,976,977,984],[421,525,577,887,921,1221],[421,525,577,887,977,1199,1221],[421,525,577,750,887,922,984,1132,1198,1199,1236,1237],[421,525,577,750,887,922,984,1199],[421,525,577,1181,1190,1240],[421,525,577,887,888],[421,525,577,871,1181,1186,1190,1236,1238],[421,525,577,1192,1195,1200,1210,1236,1237,1238,1239,1240,1241],[421,525,577,871,985,1181,1186,1190],[421,525,577,985,1191,1192,1193,1195,1196],[421,525,577,750,751,871,875,876,887,888,922,980,984],[525,577,1010],[421,525,577,1010],[525,577,1012],[525,577,1008,1009,1011,1013,1015],[525,577,1014],[421,514,525,577,1110,1114],[421,441,442,514,525,577,1097,1110,1114,1115,1118,1119,1120],[421,525,577,1102,1104],[421,514,525,577,1121],[525,577,619,1097,1099],[525,577,1106,1107,1108,1109,1111,1113],[525,577,1097],[421,525,577,1110],[525,577,1112],[525,577,1116,1117],[421,525,577,1097],[525,577,1016,1098,1104,1105,1114,1118,1122,1123,1128],[525,577,1119],[525,577,1097,1098],[525,577,1099,1101,1102,1103],[525,577,1097,1100],[421,525,577,1097,1100],[421,525,577,1097,1098,1100],[525,577,1124,1125,1126,1127],[323,525,577],[73,324,325,326,327,328,329,330,331,332,333,334,335,336,525,577],[276,310,525,577],[283,525,577],[273,323,421,525,577],[341,342,343,344,345,346,347,348,525,577],[278,525,577],[323,421,525,577],[337,340,349,525,577],[338,339,525,577],[314,525,577],[278,279,280,281,525,577],[352,525,577],[296,351,525,577],[351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,525,577],[381,525,577],[378,379,525,577],[377,380,525,577,608],[72,282,323,350,374,377,382,389,413,418,420,525,577],[78,276,525,577],[77,525,577],[78,268,269,453,458,525,577],[268,276,525,577],[77,267,525,577],[276,401,525,577],[270,403,525,577],[267,271,525,577],[271,525,577],[77,323,525,577],[275,276,525,577],[288,525,577],[290,291,292,293,294,525,577],[282,525,577],[282,283,302,525,577],[296,297,303,304,305,525,577],[74,75,76,77,78,268,269,270,271,272,273,274,275,276,277,283,288,289,295,302,306,307,308,310,318,319,320,321,322,525,577],[301,525,577],[284,285,286,287,525,577],[276,284,285,525,577],[276,282,283,525,577],[276,286,525,577],[276,314,525,577],[309,311,312,313,314,315,316,317,525,577],[74,276,525,577],[310,525,577],[74,276,309,313,315,525,577],[285,525,577],[311,525,577],[276,310,311,312,525,577],[300,525,577],[276,280,300,301,318,525,577],[298,299,301,525,577],[272,274,283,289,303,319,320,323,525,577],[78,267,272,274,277,319,320,525,577],[281,525,577],[267,525,577],[300,323,383,387,525,577],[387,388,525,577],[323,383,525,577],[323,383,384,525,577],[384,385,525,577],[384,385,386,525,577],[277,525,577],[392,393,525,577],[392,525,577],[393,394,395,397,398,399,525,577],[391,525,577],[393,396,525,577],[393,394,395,397,398,525,577],[277,392,393,397,525,577],[390,400,405,406,407,408,409,410,411,412,525,577],[277,323,405,525,577],[277,396,525,577],[277,396,421,525,577],[270,276,277,396,401,402,403,404,525,577],[267,323,401,402,414,525,577],[323,401,525,577],[416,525,577],[350,414,525,577],[414,415,417,525,577],[300,525,577,620],[300,375,376,525,577],[309,525,577],[282,323,525,577],[419,525,577],[421,525,577,629],[267,516,521,525,577],[515,521,525,577,629,630,631,634],[521,525,577],[522,525,577,627],[516,522,525,577,628],[517,518,519,520,525,577],[525,577,632,633],[521,525,577,629,635],[525,577,635],[302,323,421,525,577],[422,525,577],[323,421,442,443,525,577],[424,525,577],[421,436,441,442,525,577],[446,447,525,577],[78,323,437,442,456,525,577],[421,423,449,525,577],[77,421,450,453,525,577],[323,437,442,444,455,457,461,525,577],[77,459,460,525,577],[450,525,577],[267,323,421,464,525,577],[323,421,437,442,444,456,525,577],[463,465,466,525,577],[323,442,525,577],[442,525,577],[323,421,464,525,577],[77,323,421,525,577],[323,421,436,437,442,462,464,467,470,475,476,489,490,525,577],[267,422,525,577],[449,452,491,525,577],[476,488,525,577],[72,423,444,445,448,451,483,488,492,495,499,500,501,503,505,511,513,525,577],[323,421,430,438,441,442,525,577],[323,434,525,577],[301,323,421,424,433,434,435,436,441,442,444,514,525,577],[436,437,440,442,478,487,525,577],[323,421,429,441,442,525,577],[477,525,577],[421,437,442,525,577],[421,430,437,441,482,525,577],[323,421,424,429,441,525,577],[421,435,436,440,480,484,485,486,525,577],[421,430,437,438,439,441,442,525,577],[323,424,437,440,442,525,577],[267,441,525,577],[276,309,315,525,577],[426,427,428,437,441,442,481,525,577],[433,482,493,494,525,577],[421,424,442,525,577],[421,424,525,577],[425,426,427,428,431,433,525,577],[430,525,577],[432,433,525,577],[421,425,426,427,428,431,432,525,577],[468,469,525,577],[323,437,442,444,456,525,577],[479,525,577],[307,525,577],[288,323,496,497,525,577],[498,525,577],[323,444,525,577],[323,437,444,525,577],[301,323,421,430,437,438,439,441,442,525,577],[300,323,421,423,437,444,482,500,525,577],[301,302,421,422,502,525,577],[472,473,474,525,577],[421,471,525,577],[504,525,577],[421,525,577,605],[507,509,510,525,577],[506,525,577],[508,525,577],[421,436,441,507,525,577],[454,525,577],[323,421,424,437,441,442,444,479,480,482,483,525,577],[512,525,577],[525,577,720,722,723,724,725],[525,577,721],[421,525,577,720],[421,525,577,721],[525,577,720,722],[525,577,726],[421,525,577,729,731],[525,577,728,731,732,733,745,746],[525,577,729,730],[421,525,577,729],[525,577,744],[525,577,731],[525,577,747],[421,525,577,1140,1141],[525,577,1163],[525,577,1140,1141],[525,577,1140],[421,525,577,1140,1141,1154],[421,525,577,1154,1157],[421,525,577,1140],[525,577,1157],[525,577,1138,1139,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1158,1159,1160,1161,1162,1164,1165,1166],[525,577,1140,1160,1171],[72,525,577,1167,1171,1172,1173,1178,1180],[525,577,1140,1169,1170],[421,525,577,1140,1154],[525,577,1140,1168],[303,421,525,577,1171],[525,577,1174,1175,1176,1177],[525,577,1179],[525,577,638,639,640,641,642,643,644,645,647,648],[323,525,577,638,639],[525,577,637],[525,577,640],[421,514,525,577,638,639,640],[421,525,577,637,640],[421,525,577,640],[421,525,577,638,640],[421,525,577,637,638,646],[525,577,873],[525,577,872],[525,577,874],[525,577,1003],[525,577,999,1001,1002],[525,577,1000],[525,577,997],[525,577,993,994,995,996,997,998],[525,577,993,994,995],[525,577,994],[525,577,593],[525,577,1005],[525,577,996,999,1002,1004],[525,577,626],[525,577,591,626,741,880],[525,577,591,626,880],[525,577,588,591,626,735,736,737,880],[525,577,738,740,742],[525,577,582,626,974],[525,577,582,626],[525,574,577],[525,576,577],[577],[525,577,582,611],[525,577,578,583,588,596,608,619],[525,577,578,579,588,596],[525,577,580,620],[525,577,581,582,589,597],[525,577,582,608,616],[525,577,583,585,588,596],[525,576,577,584],[525,577,585,586],[525,577,587,588],[525,576,577,588],[525,577,588,589,590,608,619],[525,577,588,589,590,603,608,611],[525,570,577,585,588,591,596,608,619,880],[525,577,588,589,591,592,596,608,616,619],[525,577,591,593,608,616,619],[523,524,525,526,527,528,529,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625],[525,577,588,594],[525,577,595,619],[525,577,585,588,596,608],[525,577,597],[525,577,598],[525,576,577,599],[525,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,880],[525,577,601],[525,577,602],[525,577,588,603,604],[525,577,603,605,620,622],[525,577,588,608,609,611],[525,577,610,611],[525,577,608,609],[525,577,611],[525,577,612],[525,574,577,608,613],[525,577,588,614,615],[525,577,614,615],[525,577,582,596,608,616],[525,577,617],[525,577,596,618],[525,577,591,602,619],[525,577,582,620],[525,577,608,621],[525,577,595,622],[525,577,623],[525,570,577],[525,577,588,590,599,608,611,619,621,622,624],[525,577,608,625],[525,577,975,1202],[525,577,743,744,1202],[525,577,743,744],[525,577,591,743,880],[525,577,589,608,626,734],[525,577,591,626,735,739,880],[525,577,1018,1031,1032],[525,577,1069,1070],[525,577,1042,1069],[525,577,578,588,624,626,1069],[525,577,1073,1074,1075,1076,1077],[525,577,588,626,913,1056,1069,1080,1083],[525,577,1017,1033,1056,1070,1071,1072,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1093],[525,577,1042,1069,1080,1081,1083],[525,577,1042,1069,1079,1082],[525,577,588,626,1048,1056,1069,1079,1080,1083],[525,577,1069,1080,1081],[525,577,1042,1069,1080,1081],[525,577,1042,1069,1081,1083],[525,577,1042,1069,1080,1083,1085,1087,1088],[525,577,588,626,1069],[525,577,1071,1083],[525,577,626,913,1042,1069],[525,577,619,626,1042,1069,1080,1081,1083,1085,1088,1091,1092],[525,577,1036,1044,1045,1046,1047],[525,577,1042,1048,1069,1092,1094,1095,1096],[525,577,1032,1034],[525,577,1018,1019,1020,1023],[525,577,1036],[525,577,588,626,913],[525,577,1042,1050],[525,577,1018,1019,1020,1023,1024,1028,1029,1031,1035,1037,1038,1043,1049,1050,1051,1052,1053,1054,1055,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068],[525,577,1026,1027,1028],[525,577,1042],[525,577,1020,1026,1027,1028,1029,1030],[525,577,1038,1047,1049,1057],[525,577,1029,1044],[525,577,1026],[525,577,1024,1035,1043,1049],[525,577,913],[525,577,1022],[525,577,1064],[525,577,1031,1042],[525,577,578,624,626],[525,577,1038,1050,1056],[525,577,1048],[525,577,1019,1035,1049,1050,1054,1060,1066],[525,577,1031],[525,577,1025,1026,1027,1030,1032,1034,1039,1040,1041],[525,577,1029],[525,577,1024,1025],[525,577,1039],[525,577,1083],[525,577,1023],[525,577,1069,1079],[525,577,588,626,913,1048,1069,1091],[525,577,1021],[525,577,591,608,626,880],[525,577,591],[525,577,626,892],[525,577,588,626,892,908,909],[525,577,893,897,907,911],[525,577,588,626,892,893,894,896,897,904,907,908,910],[525,577,608,626],[525,577,893],[525,577,585,626,897,904,905],[525,577,588,626,892,893,894,896,897,905,906,911],[525,577,585,626],[525,577,892],[525,577,898],[525,577,900],[525,577,588,616,626,892,898,900,901,906],[525,577,904],[525,577,596,616,626,892,898],[525,577,892,893,894,895,898,902,903,904,905,906,907,911,912],[525,577,897,899,902,903],[525,577,895],[525,577,596,616,626],[525,577,892,893,895],[525,577,924,972],[525,577,935,944,950,962],[525,577,935,962],[525,577,588,608,626,935,937,941,962],[525,577,588,608,626,935,941,962],[525,577,608,626,935,962],[525,577,588,608,626,935,955,962],[525,577,935,957,962],[525,577,588,626,923,935,959,962],[525,577,935,939,948,962],[525,577,588,626,938,962],[525,577,588,626],[525,577,588,626,934,935,936,937,938,939,940,944,946,947,948,949,951,952,953,954,956,958,960,961],[525,577,925,935,938,941,943,944,945,946,948,962,968,969,970],[525,577,934,935,947,951,952,953,954,956,958,960,961,970,971],[525,577,588,626,925,938,943,962,968,969],[525,577,935,936],[525,577,588,608,626,935,937,941,942,943,962],[525,577,608,626,935],[525,577,935,962,963],[525,577,964],[525,577,963,965,966,967],[525,577,935,972],[525,577,935,937,938,962],[525,577,608,626,935,937,939,944,945,946,947,962],[525,577,608,626,934,935],[525,577,619,626,926,927],[525,577,926,928,929,930,931,932,933,934],[525,577,926,929],[525,577,926,928,929,930],[525,577,926],[525,577,929],[421,525,577,883],[421,525,577,881,883],[267,421,525,577],[421,525,577,881],[525,577,879,881],[525,577,881,882,883,884,885,886],[323,525,577,879,880],[525,577,591,626,877,879,880],[525,577,588,624,877,878],[79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,141,142,143,144,145,146,148,149,150,151,152,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,198,199,200,202,211,213,214,215,216,217,218,220,221,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,525,577],[124,525,577],[82,83,525,577],[79,80,81,83,525,577],[80,83,525,577],[83,124,525,577],[79,83,201,525,577],[81,82,83,525,577],[79,83,525,577],[83,525,577],[82,525,577],[79,82,124,525,577],[80,82,83,240,525,577],[82,83,240,525,577],[82,248,525,577],[80,82,83,525,577],[92,525,577],[115,525,577],[136,525,577],[82,83,124,525,577],[83,131,525,577],[82,83,124,142,525,577],[82,83,142,525,577],[83,183,525,577],[79,83,202,525,577],[208,210,525,577],[79,83,201,208,209,525,577],[201,202,210,525,577],[208,525,577],[79,83,208,209,210,525,577],[224,525,577],[219,525,577],[222,525,577],[80,82,202,203,204,205,525,577],[124,202,203,204,205,525,577],[202,204,525,577],[82,203,204,206,207,211,525,577],[79,82,525,577],[83,226,525,577],[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,132,133,134,135,136,137,138,139,140,141,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,525,577],[212,525,577],[525,537,540,543,544,577,619],[525,540,577,608,619],[525,540,544,577,619],[525,577,608],[525,534,577],[525,538,577],[525,536,537,540,577,619],[525,577,596,616],[525,534,577,626],[525,536,540,577,596,619],[525,531,532,533,535,539,577,588,608,619],[525,540,548,577],[525,532,538,577],[525,540,564,565,577],[525,532,535,540,577,611,619,626],[525,540,577],[525,536,540,577,619],[525,531,577],[525,534,535,536,538,539,540,541,542,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,565,566,567,568,569,577],[525,540,557,560,577,585],[525,540,548,549,550,577],[525,538,540,549,551,577],[525,539,577],[525,532,534,540,577],[525,540,544,549,551,577],[525,544,577],[525,538,540,543,577,619],[525,532,536,540,548,577],[525,540,557,577],[525,534,540,564,577,611,624,626],[525,577,715],[525,577,707],[525,577,707,710],[525,577,701,707,708,709,710,711,712,713,714],[525,577,707,708],[525,577,707,709],[525,577,651,653,654,655,656],[525,577,651,653,655,656],[525,577,651,653,655],[525,577,650,651,653,654,656],[525,577,651,652,653,654,655,656,657,658,701,702,703,704,705,706],[525,577,653,656],[525,577,650,651,652,654,655,656],[525,577,653,702,705],[525,577,653,654,655,656],[525,577,655],[525,577,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700],[525,577,768],[525,577,866],[525,577,869],[525,577,752,768,868],[525,577,768,769],[525,577,752,754],[525,577,761],[525,577,761,762],[525,577,753],[525,577,753,755,756,757,758,759,760,761,762,763,764,765],[525,577,752,761],[525,577,752],[525,577,754],[525,577,752,766,767,770,775,779,865,867,868,870],[525,577,776,777,778],[525,577,771,772,773,774],[525,577,850],[525,577,862],[525,577,777,850],[525,577,850,856],[525,577,850,855,856,857,858,859,860,861,863,864],[525,577,851,852,853,854],[525,577,849],[525,577,841],[525,577,841,844],[525,577,835,841,842,843,844,845,846,847,848],[525,577,841,842],[525,577,841,843],[525,577,781,783,784,785,786],[525,577,781,783,785,786],[525,577,781,783,785],[525,577,780,781,783,784,786],[525,577,781,782,783,784,785,786,787,788,835,836,837,838,839,840],[525,577,783,786],[525,577,780,781,782,784,785,786],[525,577,783,836,839],[525,577,783,784,785,786],[525,577,785],[525,577,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","signature":false,"impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","signature":false,"impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","signature":false,"impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","signature":false,"impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","signature":false,"impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","signature":false,"impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","signature":false,"impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","signature":false,"impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","signature":false,"impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","signature":false,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"6d8dedbec739bc79642c1e96e9bfc0b83b25b104a0486aebf016fc7b85b39f48","signature":false,"impliedFormat":1},{"version":"e89535c3ec439608bcd0f68af555d0e5ddf121c54abe69343549718bd7506b9c","signature":false,"impliedFormat":1},{"version":"622a984b60c294ffb2f9152cf1d4d12e91d2b733d820eec949cf54d63a3c1025","signature":false,"impliedFormat":1},{"version":"81aae92abdeaccd9c1723cef39232c90c1aed9d9cf199e6e2a523b7d8e058a11","signature":false,"impliedFormat":1},{"version":"a63a6c6806a1e519688ef7bd8ca57be912fc0764485119dbd923021eb4e79665","signature":false,"impliedFormat":1},{"version":"75b57b109d774acca1e151df21cf5cb54c7a1df33a273f0457b9aee4ebd36fb9","signature":false,"impliedFormat":1},{"version":"073ca26c96184db9941b5ec0ddea6981c9b816156d9095747809e524fdd90e35","signature":false,"impliedFormat":1},{"version":"e41d17a2ec23306d953cda34e573ed62954ca6ea9b8c8b74e013d07a6886ce47","signature":false,"impliedFormat":1},{"version":"241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","signature":false,"impliedFormat":1},{"version":"2ae3787e1498b20aad1b9c2ee9ea517ec30e89b70d242d8e3e52d1e091039695","signature":false,"impliedFormat":1},{"version":"c7c72c4cffb1bc83617eefed71ed68cc89df73cab9e19507ccdecb3e72b4967e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","signature":false,"impliedFormat":1},{"version":"38b38db08e7121828294dec10957a7a9ff263e33e2a904b346516d4a4acca482","signature":false,"impliedFormat":1},{"version":"a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","signature":false,"impliedFormat":1},{"version":"8a2aaea564939c22be05d665cc955996721bad6d43148f8fa21ae8f64afecd37","signature":false,"impliedFormat":1},{"version":"e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","signature":false,"impliedFormat":1},{"version":"e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","signature":false,"impliedFormat":1},{"version":"95950a187596e206d32d5d9c7b932901088c65ed8f9040e614aa8e321e0225ef","signature":false,"impliedFormat":1},{"version":"89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","signature":false,"impliedFormat":1},{"version":"e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","signature":false,"impliedFormat":1},{"version":"71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","signature":false,"impliedFormat":1},{"version":"7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","signature":false,"impliedFormat":1},{"version":"78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","signature":false,"impliedFormat":1},{"version":"5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","signature":false,"impliedFormat":1},{"version":"f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","signature":false,"impliedFormat":1},{"version":"9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","signature":false,"impliedFormat":1},{"version":"3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","signature":false,"impliedFormat":1},{"version":"2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","signature":false,"impliedFormat":1},{"version":"4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","signature":false,"impliedFormat":1},{"version":"61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","signature":false,"impliedFormat":1},{"version":"64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","signature":false,"impliedFormat":1},{"version":"0521108c9f8ddb17654a0a54dae6ba9667c99eddccfd6af5748113e022d1c37a","signature":false,"impliedFormat":1},{"version":"c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","signature":false,"impliedFormat":1},{"version":"ee764e6e9a7f2b987cc1a2c0a9afd7a8f4d5ebc4fdb66ad557a7f14a8c2bd320","signature":false,"impliedFormat":1},{"version":"0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","signature":false,"impliedFormat":1},{"version":"5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","signature":false,"impliedFormat":1},{"version":"e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","signature":false,"impliedFormat":1},{"version":"b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","signature":false,"impliedFormat":1},{"version":"6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","signature":false,"impliedFormat":1},{"version":"d7058e75920120b142a9d57be25562a3cd9a936269fd52908505f530105f2ec4","signature":false,"impliedFormat":1},{"version":"6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","signature":false,"impliedFormat":1},{"version":"0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","signature":false,"impliedFormat":1},{"version":"91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","signature":false,"impliedFormat":1},{"version":"db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","signature":false,"impliedFormat":1},{"version":"758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","signature":false,"impliedFormat":1},{"version":"2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","signature":false,"impliedFormat":1},{"version":"6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","signature":false,"impliedFormat":1},{"version":"a472a1d3f25ce13a1d44911cd3983956ac040ce2018e155435ea34afb25f864c","signature":false,"impliedFormat":1},{"version":"b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","signature":false,"impliedFormat":1},{"version":"792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","signature":false,"impliedFormat":1},{"version":"a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","signature":false,"impliedFormat":1},{"version":"93181bac0d90db185bb730c95214f6118ae997fe836a98a49664147fbcaf1988","signature":false,"impliedFormat":1},{"version":"8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","signature":false,"impliedFormat":1},{"version":"b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","signature":false,"impliedFormat":1},{"version":"4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","signature":false,"impliedFormat":1},{"version":"cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","signature":false,"impliedFormat":1},{"version":"75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","signature":false,"impliedFormat":1},{"version":"b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","signature":false,"impliedFormat":1},{"version":"c54166a85bd60f86d1ebb90ce0117c0ecb850b8a33b366691629fdf26f1bbbd8","signature":false,"impliedFormat":1},{"version":"0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","signature":false,"impliedFormat":1},{"version":"80f23f1d60fbed356f726b3b26f9d348dddbb34027926d10d59fad961e70a730","signature":false,"impliedFormat":1},{"version":"cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","signature":false,"impliedFormat":1},{"version":"cc20bb2227dd5de0aab0c8d697d1572f8000550e62c7bf5c92f212f657dd88c5","signature":false,"impliedFormat":1},{"version":"06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","signature":false,"impliedFormat":1},{"version":"860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","signature":false,"impliedFormat":1},{"version":"f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","signature":false,"impliedFormat":1},{"version":"d0da80c845999a16c24d0783033fb5366ada98df17867c98ad433ede05cd87fd","signature":false,"impliedFormat":1},{"version":"bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","signature":false,"impliedFormat":1},{"version":"fd9a991b51870325e46ebb0e6e18722d313f60cd8e596e645ec5ac15b96dbf4e","signature":false,"impliedFormat":1},{"version":"c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","signature":false,"impliedFormat":1},{"version":"a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","signature":false,"impliedFormat":1},{"version":"d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","signature":false,"impliedFormat":1},{"version":"fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","signature":false,"impliedFormat":1},{"version":"063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","signature":false,"impliedFormat":1},{"version":"314e402cd481370d08f63051ae8b8c8e6370db5ee3b8820eeeaaf8d722a6dac6","signature":false,"impliedFormat":1},{"version":"9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","signature":false,"impliedFormat":1},{"version":"4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","signature":false,"impliedFormat":1},{"version":"656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","signature":false,"impliedFormat":1},{"version":"3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","signature":false,"impliedFormat":1},{"version":"1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","signature":false,"impliedFormat":1},{"version":"af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","signature":false,"impliedFormat":1},{"version":"70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","signature":false,"impliedFormat":1},{"version":"af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","signature":false,"impliedFormat":1},{"version":"cefc20054d20b85b534206dbcedd509bb74f87f3d8bc45c58c7be3a76caa45e1","signature":false,"impliedFormat":1},{"version":"ad6eee4877d0f7e5244d34bc5026fd6e9cf8e66c5c79416b73f9f6ebf132f924","signature":false,"impliedFormat":1},{"version":"4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","signature":false,"impliedFormat":1},{"version":"f4749c102ced952aa6f40f0b579865429c4869f6d83df91000e98005476bee87","signature":false,"impliedFormat":1},{"version":"56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","signature":false,"impliedFormat":1},{"version":"8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","signature":false,"impliedFormat":1},{"version":"05f56cd4b929977d18df8f3d08a4c929a2592ef5af083e79974b20a063f30940","signature":false,"impliedFormat":1},{"version":"547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","signature":false,"impliedFormat":1},{"version":"b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","signature":false,"impliedFormat":1},{"version":"3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","signature":false,"impliedFormat":1},{"version":"140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","signature":false,"impliedFormat":1},{"version":"0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","signature":false,"impliedFormat":1},{"version":"cb46b38d5e791acaa243bf342b8b5f8491639847463ac965b93896d4fb0af0d9","signature":false,"impliedFormat":1},{"version":"7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","signature":false,"impliedFormat":1},{"version":"af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","signature":false,"impliedFormat":1},{"version":"006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","signature":false,"impliedFormat":1},{"version":"7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","signature":false,"impliedFormat":1},{"version":"339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","signature":false,"impliedFormat":1},{"version":"34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","signature":false,"impliedFormat":1},{"version":"9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","signature":false,"impliedFormat":1},{"version":"18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","signature":false,"impliedFormat":1},{"version":"5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","signature":false,"impliedFormat":1},{"version":"5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","signature":false,"impliedFormat":1},{"version":"907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","signature":false,"impliedFormat":1},{"version":"ce60a562cd2a92f37a88f2ddd99a3abfbc5848d7baf38c48fb8d3243701fcb75","signature":false,"impliedFormat":1},{"version":"a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","signature":false,"impliedFormat":1},{"version":"f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","signature":false,"impliedFormat":1},{"version":"75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","signature":false,"impliedFormat":1},{"version":"9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","signature":false,"impliedFormat":1},{"version":"b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","signature":false,"impliedFormat":1},{"version":"b6e2b0448ced813b8c207810d96551a26e7d7bb73255eea4b9701698f78846d6","signature":false,"impliedFormat":1},{"version":"8ae10cd85c1bd94d2f2d17c4cbd25c068a4b2471c70c2d96434239f97040747a","signature":false,"impliedFormat":1},{"version":"9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","signature":false,"impliedFormat":1},{"version":"b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","signature":false,"impliedFormat":1},{"version":"e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","signature":false,"impliedFormat":1},{"version":"ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","signature":false,"impliedFormat":1},{"version":"8776a368617ce51129b74db7d55c3373dadcce5d0701e61d106e99998922a239","signature":false,"impliedFormat":1},{"version":"5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","signature":false,"impliedFormat":1},{"version":"9108ab5af05418f599ab48186193b1b07034c79a4a212a7f73535903ba4ca249","signature":false,"impliedFormat":1},{"version":"bb4e2cdcadf9c9e6ee2820af23cee6582d47c9c9c13b0dca1baaffe01fbbcb5f","signature":false,"impliedFormat":1},{"version":"6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","signature":false,"impliedFormat":1},{"version":"423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","signature":false,"impliedFormat":1},{"version":"fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","signature":false,"impliedFormat":1},{"version":"2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","signature":false,"impliedFormat":1},{"version":"c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","signature":false,"impliedFormat":1},{"version":"02ae43d5bae42efcd5a00d3923e764895ce056bca005a9f4e623aa6b4797c8af","signature":false,"impliedFormat":1},{"version":"db6e01f17012a9d7b610ae764f94a1af850f5d98c9c826ad61747dca0fb800bd","signature":false,"impliedFormat":1},{"version":"8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","signature":false,"impliedFormat":1},{"version":"24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","signature":false,"impliedFormat":1},{"version":"33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","signature":false,"impliedFormat":1},{"version":"0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","signature":false,"impliedFormat":1},{"version":"16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","signature":false,"impliedFormat":1},{"version":"8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","signature":false,"impliedFormat":1},{"version":"d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","signature":false,"impliedFormat":1},{"version":"97f9169882d393e6f303f570168ca86b5fe9aab556e9a43672dae7e6bb8e6495","signature":false,"impliedFormat":1},{"version":"7c9adb3fcd7851497818120b7e151465406e711d6a596a71b807f3a17853cb58","signature":false,"impliedFormat":1},{"version":"6752d402f9282dd6f6317c8c048aaaac27295739a166eed27e00391b358fed9a","signature":false,"impliedFormat":1},{"version":"9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","signature":false,"impliedFormat":1},{"version":"fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","signature":false,"impliedFormat":1},{"version":"85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","signature":false,"impliedFormat":1},{"version":"84794e3abd045880e0fadcf062b648faf982aa80cfc56d28d80120e298178626","signature":false,"impliedFormat":1},{"version":"053d8b827286a16a669a36ffc8ccc8acdf8cc154c096610aa12348b8c493c7b8","signature":false,"impliedFormat":1},{"version":"3cce4ce031710970fe12d4f7834375f5fd455aa129af4c11eb787935923ff551","signature":false,"impliedFormat":1},{"version":"8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","signature":false,"impliedFormat":1},{"version":"62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","signature":false,"impliedFormat":1},{"version":"c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","signature":false,"impliedFormat":1},{"version":"8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","signature":false,"impliedFormat":1},{"version":"132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","signature":false,"impliedFormat":1},{"version":"df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","signature":false,"impliedFormat":1},{"version":"33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","signature":false,"impliedFormat":1},{"version":"ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","signature":false,"impliedFormat":1},{"version":"a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","signature":false,"impliedFormat":1},{"version":"eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","signature":false,"impliedFormat":1},{"version":"0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","signature":false,"impliedFormat":1},{"version":"aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","signature":false,"impliedFormat":1},{"version":"0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","signature":false,"impliedFormat":1},{"version":"40f06693e2e3e58526b713c937895c02e113552dc8ba81ecd49cdd9596567ddb","signature":false,"impliedFormat":1},{"version":"4ed5e1992aedb174fb8f5aa8796aa6d4dcb8bd819b4af1b162a222b680a37fa0","signature":false,"impliedFormat":1},{"version":"d7f4bd46a8b97232ea6f8c28012b8d2b995e55e729d11405f159d3e00c51420a","signature":false,"impliedFormat":1},{"version":"d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","signature":false,"impliedFormat":1},{"version":"e4f4f9cf1e3ac9fd91ada072e4d428ecbf0aa6dc57138fb797b8a0ca3a1d521c","signature":false,"impliedFormat":1},{"version":"12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","signature":false,"impliedFormat":1},{"version":"340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","signature":false,"impliedFormat":1},{"version":"c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","signature":false,"impliedFormat":1},{"version":"7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","signature":false,"impliedFormat":1},{"version":"5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","signature":false,"impliedFormat":1},{"version":"9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","signature":false,"impliedFormat":1},{"version":"1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","signature":false,"impliedFormat":1},{"version":"8018dd2e95e7ce6e613ddd81672a54532614dc745520a2f9e3860ff7fb1be0ca","signature":false,"impliedFormat":1},{"version":"b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","signature":false,"impliedFormat":1},{"version":"0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","signature":false,"impliedFormat":1},{"version":"3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","signature":false,"impliedFormat":1},{"version":"032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","signature":false,"impliedFormat":1},{"version":"69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","signature":false,"impliedFormat":1},{"version":"0e704ee6e9fd8b6a5a7167886f4d8915f4bc22ed79f19cb7b32bd28458f50643","signature":false,"impliedFormat":1},{"version":"06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","signature":false,"impliedFormat":1},{"version":"904a96f84b1bcee9a7f0f258d17f8692e6652a0390566515fe6741a5c6db8c1c","signature":false,"impliedFormat":1},{"version":"11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","signature":false,"impliedFormat":1},{"version":"2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","signature":false,"impliedFormat":1},{"version":"1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","signature":false,"impliedFormat":1},{"version":"1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","signature":false,"impliedFormat":1},{"version":"07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","signature":false,"impliedFormat":1},{"version":"619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","signature":false,"impliedFormat":1},{"version":"f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","signature":false,"impliedFormat":1},{"version":"f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","signature":false,"impliedFormat":1},{"version":"350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","signature":false,"impliedFormat":1},{"version":"eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","signature":false,"impliedFormat":1},{"version":"45b74185005ed45bec3f07cac6e4d68eaf02ead9ff5a66721679fb28020e5e7c","signature":false,"impliedFormat":1},{"version":"0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","signature":false,"impliedFormat":1},{"version":"c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","signature":false,"impliedFormat":1},{"version":"5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","signature":false,"impliedFormat":1},{"version":"ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","signature":false,"impliedFormat":1},{"version":"795a08ae4e193f345073b49f68826ab6a9b280400b440906e4ec5c237ae777e6","signature":false,"impliedFormat":1},{"version":"8153df63cf65122809db17128e5918f59d6bb43a371b5218f4430c4585f64085","signature":false,"impliedFormat":1},{"version":"a8150bc382dd12ce58e00764d2366e1d59a590288ee3123af8a4a2cb4ef7f9df","signature":false,"impliedFormat":1},{"version":"5adfaf2f9f33957264ad199a186456a4676b2724ed700fc313ff945d03372169","signature":false,"impliedFormat":1},{"version":"d5c41a741cd408c34cb91f84468f70e9bda3dfeabf33251a61039b3cdb8b22d8","signature":false,"impliedFormat":1},{"version":"a20c3e0fe86a1d8fc500a0e9afec9a872ad3ab5b746ceb3dd7118c6d2bff4328","signature":false,"impliedFormat":1},{"version":"cbaf4a4aa8a8c02aa681c5870d5c69127974de29b7e01df570edec391a417959","signature":false,"impliedFormat":1},{"version":"c7135e329a18b0e712378d5c7bc2faec6f5ab0e955ea0002250f9e232af8b3e4","signature":false,"impliedFormat":1},{"version":"340a45cd77b41d8a6deda248167fa23d3dc67ec798d411bd282f7b3d555b1695","signature":false,"impliedFormat":1},{"version":"fae330f86bc10db6841b310f32367aaa6f553036a3afc426e0389ddc5566cd74","signature":false,"impliedFormat":1},{"version":"2bee1efe53481e93bb8b31736caba17353e7bb6fc04520bd312f4e344afd92f9","signature":false,"impliedFormat":1},{"version":"357b67529139e293a0814cb5b980c3487717c6fbf7c30934d67bc42dad316871","signature":false,"impliedFormat":1},{"version":"99d99a765426accf8133737843fb024a154dc6545fc0ffbba968a7c0b848959d","signature":false,"impliedFormat":1},{"version":"c782c5fd5fa5491c827ecade05c3af3351201dd1c7e77e06711c8029b7a9ee4d","signature":false,"impliedFormat":1},{"version":"883d2104e448bb351c49dd9689a7e8117b480b614b2622732655cef03021bf6d","signature":false,"impliedFormat":1},{"version":"d9b00ee2eca9b149663fdba1c1956331841ae296ee03eaaff6c5becbc0ff1ea8","signature":false,"impliedFormat":1},{"version":"09a7e04beb0547c43270b327c067c85a4e2154372417390731dfe092c4350998","signature":false,"impliedFormat":1},{"version":"eee530aaa93e9ec362e3941ee8355e2d073c7b21d88c2af4713e3d701dab8fef","signature":false,"impliedFormat":1},{"version":"28d47319b97dbeee9130b78eae03b2061d46dedbf92b0d9de13ed7ab8399ccd0","signature":false,"impliedFormat":1},{"version":"6559a36671052ca93cab9a289279a6cef6f9d1a72c34c34546a8848274a9c66c","signature":false,"impliedFormat":1},{"version":"7a0e4cd92545ad03910fd019ae9838718643bd4dde39881c745f236914901dfa","signature":false,"impliedFormat":1},{"version":"c99ebd20316217e349004ee1a0bc74d32d041fb6864093f10f31984c737b8cad","signature":false,"impliedFormat":1},{"version":"6f622e7f054f5ab86258362ac0a64a2d6a27f1e88732d6f5f052f422e08a70e7","signature":false,"impliedFormat":1},{"version":"d62d2ef93ceeb41cf9dfab25989a1e5f9ca5160741aac7f1453c69a6c14c69be","signature":false,"impliedFormat":1},{"version":"1491e80d72873fc586605283f2d9056ee59b166333a769e64378240df130d1c9","signature":false,"impliedFormat":1},{"version":"c32c073d389cfaa3b3e562423e16c2e6d26b8edebbb7d73ccffff4aa66f2171d","signature":false,"impliedFormat":1},{"version":"eca72bf229eecadb63e758613c62fab13815879053539a22477d83a48a21cd73","signature":false,"impliedFormat":1},{"version":"633db46fd1765736409a4767bfc670861468dde60dbb9a501fba4c1b72f8644d","signature":false,"impliedFormat":1},{"version":"f379412f2c0dddd193ff66dcdd9d9cc169162e441d86804c98c84423f993aa8a","signature":false,"impliedFormat":1},{"version":"f2ee748883723aa9325e5d7f30fce424f6a786706e1b91a5a55237c78ee89c4a","signature":false,"impliedFormat":1},{"version":"d928324d17146fce30b99a28d1d6b48648feac72bbd23641d3ce5ac34aefdfee","signature":false,"impliedFormat":1},{"version":"142f5190d730259339be1433931c0eb31ae7c7806f4e325f8a470bd9221b6533","signature":false,"impliedFormat":1},{"version":"cbd19f594f0ee7beffeb37dc0367af3908815acf4ce46d86b0515478718cfed8","signature":false,"impliedFormat":1},{"version":"c8282f67ef03eeeb09b8f9fd67c238a7cb0df03898e1c8d0e0daca14d4d18aa0","signature":false,"impliedFormat":1},{"version":"8776e64e6165838ac152fa949456732755b0976d1867ae5534ce248f0ccd7f41","signature":false,"impliedFormat":1},{"version":"896bbc7402b3a403cda96813c8ea595470ff76d31f32869d053317c00ca2589a","signature":false,"impliedFormat":1},{"version":"5c4c5b49bbb01828402bb04af1d71673b18852c11b7e95bfd5cf4c3d80d352c8","signature":false,"impliedFormat":1},{"version":"7030df3d920343df00324df59dc93a959a33e0f4940af3fefef8c07b7ee329bf","signature":false,"impliedFormat":1},{"version":"a96bc00e0c356e29e620eaec24a56d6dd7f4e304feefcc99066a1141c6fe05a7","signature":false,"impliedFormat":1},{"version":"d12cc0e5b09943c4cd0848f787eb9d07bf78b60798e4588c50582db9d4decc70","signature":false,"impliedFormat":1},{"version":"7333ee6354964fd396297958e52e5bf62179aa2c88ca0a35c6d3a668293b7e0e","signature":false,"impliedFormat":1},{"version":"19c3760af3cbc9da99d5b7763b9e33aaf8d018bc2ed843287b7ff4343adf4634","signature":false,"impliedFormat":1},{"version":"9d1e38aeb76084848d2fcd39b458ec88246de028c0f3f448b304b15d764b23d2","signature":false,"impliedFormat":1},{"version":"d406da1eccf18cec56fd29730c24af69758fe3ff49c4f94335e797119cbc0554","signature":false,"impliedFormat":1},{"version":"4898c93890a136da9156c75acd1a80a941a961b3032a0cf14e1fa09a764448b7","signature":false,"impliedFormat":1},{"version":"f5d7a845e3e1c6c27351ea5f358073d0b0681537a2da6201fab254aa434121d3","signature":false,"impliedFormat":1},{"version":"3a47d4582ef0697cccf1f3d03b620002f03fb0ff098f630e284433c417d6c61b","signature":false,"impliedFormat":1},{"version":"d7c30f0abfe9e197e376b016086cf66b2ffb84015139963f37301ed0da9d3d0d","signature":false,"impliedFormat":1},{"version":"ff75bba0148f07775bcb54bf4823421ed4ebdb751b3bf79cc003bd22e49d7d73","signature":false,"impliedFormat":1},{"version":"d40d20ac633703a7333770bfd60360126fc3302d5392d237bbb76e8c529a4f95","signature":false,"impliedFormat":1},{"version":"35a9867207c488061fb4f6fe4715802fbc164b4400018d2fa0149ad02db9a61c","signature":false,"impliedFormat":1},{"version":"55fade96019df8eb3d457d70a29fcdf7fa405e5726c5bf1b2fa25e4102c83b12","signature":false,"impliedFormat":1},{"version":"0abe2cd72812bbfc509975860277c7cd6f6e0be95d765a9da77fee98264a7e32","signature":false,"impliedFormat":1},{"version":"601fe4e366b99181cd0244d96418cffeaaa987a7e310c6f0ed0f06ce63dfe3e9","signature":false,"impliedFormat":1},{"version":"c66a4f2b1362abc4aeee0870c697691618b423c8c6e75624a40ef14a06f787b7","signature":false,"impliedFormat":1},{"version":"90433c678bc26751eb7a5d54a2bb0a14be6f5717f69abb5f7a04afc75dce15a4","signature":false,"impliedFormat":1},{"version":"cd0565ace87a2d7802bf4c20ea23a997c54e598b9eb89f9c75e69478c1f7a0b4","signature":false,"impliedFormat":1},{"version":"738020d2c8fc9df92d5dee4b682d35a776eaedfe2166d12bc8f186e1ea57cc52","signature":false,"impliedFormat":1},{"version":"86dd7c5657a0b0bc6bee8002edcfd544458d3d3c60974555746eb9b2583dc35e","signature":false,"impliedFormat":1},{"version":"d97b96b6ecd4ee03f9f1170722c825ef778430a6a0d7aab03b8929012bf773cd","signature":false,"impliedFormat":1},{"version":"e84e9b89251a57da26a339e75f4014f52e8ef59b77c2ee1e0171cde18d17b3b8","signature":false,"impliedFormat":1},{"version":"272dbfe04cfa965d6fff63fdaba415c1b5a515b1881ae265148f8a84ddeb318f","signature":false,"impliedFormat":1},{"version":"2035fb009b5fafa9a4f4e3b3fdb06d9225b89f2cbbf17a5b62413bf72cea721a","signature":false,"impliedFormat":1},{"version":"eefafec7c059f07b885b79b327d381c9a560e82b439793de597441a4e68d774a","signature":false,"impliedFormat":1},{"version":"72636f59b635c378dc9ea5246b9b3517b1214e340e468e54cb80126353053b2e","signature":false,"impliedFormat":1},{"version":"ebb79f267a3bf2de5f8edc1995c5d31777b539935fab8b7d863e8efb06c8e9ea","signature":false,"impliedFormat":1},{"version":"ada033e6a4c7f4e147e6d76bb881069dc66750619f8cc2472d65beeec1100145","signature":false,"impliedFormat":1},{"version":"0c04cc14a807a5dc0e3752d18a3b2655a135fefbf76ddcdabd0c5df037530d41","signature":false,"impliedFormat":1},{"version":"605d29d619180fbec287d1701e8b1f51f2d16747ec308d20aba3e9a0dac43a0f","signature":false,"impliedFormat":1},{"version":"67c19848b442d77c767414084fc571ce118b08301c4ddff904889d318f3a3363","signature":false,"impliedFormat":1},{"version":"c704ff0e0cb86d1b791767a88af21dadfee259180720a14c12baee668d0eb8fb","signature":false,"impliedFormat":1},{"version":"195c50e15d5b3ea034e01fbdca6f8ad4b35ad47463805bb0360bdffd6fce3009","signature":false,"impliedFormat":1},{"version":"da665f00b6877ae4adb39cd548257f487a76e3d99e006a702a4f38b4b39431cb","signature":false,"impliedFormat":1},{"version":"083aebdd7c96aee90b71ec970f81c48984d9c8ab863e7d30084f048ddcc9d6af","signature":false,"impliedFormat":1},{"version":"1c3bde1951add95d54a05e6628a814f2f43bf9d49902729eaf718dc9eb9f4e02","signature":false,"impliedFormat":1},{"version":"d7a4309673b06223537bc9544b1a5fe9425628e1c8ab5605f3c5ebc27ecb8074","signature":false,"impliedFormat":1},{"version":"0be3da88f06100e2291681bbda2592816dd804004f0972296b20725138ebcddf","signature":false,"impliedFormat":1},{"version":"3eadfd083d40777b403f4f4eecfa40f93876f2a01779157cc114b2565a7afb51","signature":false,"impliedFormat":1},{"version":"cb6789ce3eba018d5a7996ccbf50e27541d850e9b4ee97fdcb3cbd8c5093691f","signature":false,"impliedFormat":1},{"version":"a3684ea9719122f9477902acd08cd363a6f3cff6d493df89d4dc12fa58204e27","signature":false,"impliedFormat":1},{"version":"2828dabf17a6507d39ebcc58fef847e111dcf2d51b8e4ff0d32732c72be032b3","signature":false,"impliedFormat":1},{"version":"c0c46113b4cd5ec9e7cf56e6dbfb3930ef6cbba914c0883eeced396988ae8320","signature":false,"impliedFormat":1},{"version":"118ea3f4e7b9c12e92551be0766706f57a411b4f18a1b4762cfde3cd6d4f0a96","signature":false,"impliedFormat":1},{"version":"01acd7f315e2493395292d9a02841f3b0300e77ccf42f84f4f11460e7623107d","signature":false,"impliedFormat":1},{"version":"656d1ce5b8fbed896bb803d849d6157242261030967b821d01e72264774cab55","signature":false,"impliedFormat":1},{"version":"da66c1b41d833858fe61947432130d39649f0b53d992dfd7d00f0bbe57191ef4","signature":false,"impliedFormat":1},{"version":"835739c6dcf0a9a1533d1e95b7d7cf8e44ca1341652856b897f4573078b23a31","signature":false,"impliedFormat":1},{"version":"774a3bcc0700036313c57a079e2e1161a506836d736203aa0463efa7b11a7e54","signature":false,"impliedFormat":1},{"version":"96577e3f8e0f9ea07ddf748d72dc1908581ef2aafd4ae7418a4574c26027cf02","signature":false,"impliedFormat":1},{"version":"f55971cb3ede99c17443b03788fe27b259dcd0f890ac31badcb74e3ffb4bb371","signature":false,"impliedFormat":1},{"version":"0ef0c246f8f255a5d798727c40d6d2231d2b0ebda5b1ec75e80eadb02022c548","signature":false,"impliedFormat":1},{"version":"ea127752a5ec75f2ac6ef7f1440634e6ae5bc8d09e6f98b61a8fb600def6a861","signature":false,"impliedFormat":1},{"version":"862320e775649dcca8915f8886865e9c6d8affc1e70ed4b97199f3b70a843b47","signature":false,"impliedFormat":1},{"version":"561764374e9f37cb895263d5c8380885972d75d09d0db64c12e0cb10ba90ae3e","signature":false,"impliedFormat":1},{"version":"ee889da857c29fa7375ad500926748ef2e029a6645d7c080e57769923d15dfef","signature":false,"impliedFormat":1},{"version":"56984ba2d781bd742b6bc0fa34c10df2eae59b42ec8b1b731d297f1590fa4071","signature":false,"impliedFormat":1},{"version":"7521de5e64e2dd022be87fce69d956a52d4425286fbc5697ecfec386da896d7e","signature":false,"impliedFormat":1},{"version":"f50b072ec1f4839b54fd1269a4fa7b03efbc9c59940224c7939632c0f70a39c3","signature":false,"impliedFormat":1},{"version":"a5b7ec6f1ff3f1d19a2547f7e1a50ab1284e6b4755d260a481ea01ed2c7cec60","signature":false,"impliedFormat":1},{"version":"1747f9eebf5beb8cfc46cf0303e300950b7bff20cff60b9c46818caced3226e3","signature":false,"impliedFormat":1},{"version":"9d969f36abb62139a90345ee5d03f1c2479831bd84c8f843d87ec304cad96ead","signature":false,"impliedFormat":1},{"version":"e972b52218fd5919aec6cd0e5e2a5fb75f5d2234cf05597a9441837a382b2b29","signature":false,"impliedFormat":1},{"version":"d1e292b0837d0ef5ede4f52363c9d8e93f5d5234086adc796e11eae390305b36","signature":false,"impliedFormat":1},{"version":"0a9e10028a96865d0f25aeca9e3b1ff0691b9b662aa186d9d490728434cf8261","signature":false,"impliedFormat":1},{"version":"1aed740b674839c89f427f48737bad435ee5a39d80b5929f9dc9cc9ac10a7700","signature":false,"impliedFormat":1},{"version":"6e9e3690dc3a6e99a845482e33ee78915893f2d0d579a55b6a0e9b4c44193371","signature":false,"impliedFormat":1},{"version":"4e7a76cce3b537b6cdb1c4b97e29cb4048ee8e7d829cf3a85f4527e92eb573f2","signature":false,"impliedFormat":1},{"version":"5e8c2b0769cea4cdb1b1724751116bc5a33800e87238be7da34c88ade568d287","signature":false,"impliedFormat":1},{"version":"46f1fe93f199a419172d7480407d9572064b54712b69406efa97e0244008b24e","signature":false,"impliedFormat":1},{"version":"044e6aaa3f612833fb80e323c65e9d816c3148b397e93630663cda5c2d8f4de1","signature":false,"impliedFormat":1},{"version":"deaf8eb392c46ea2c88553d3cc38d46cfd5ee498238dbc466e3f5be63ae0f651","signature":false,"impliedFormat":1},{"version":"6a79b61f57699de0a381c8a13f4c4bcd120556bfab0b4576994b6917cb62948b","signature":false,"impliedFormat":1},{"version":"c5133d7bdec65f465df12f0b507fbc0d96c78bfa5a012b0eb322cf1ff654e733","signature":false,"impliedFormat":1},{"version":"7905c052681cbe9286797ec036942618e1e8d698dcc2e60f4fb7a0013d470442","signature":false,"impliedFormat":1},{"version":"89049878a456b5e0870bb50289ea8ece28a2abd0255301a261fa8ab6a3e9a07d","signature":false,"impliedFormat":1},{"version":"55ae9554811525f24818e19bdc8779fa99df434be7c03e5fc47fa441315f0226","signature":false,"impliedFormat":1},{"version":"d4a4f10062a6d82ba60d3ffde9154ef24b1baf2ce28c6439f5bdfb97aa0d18fc","signature":false,"impliedFormat":1},{"version":"f13310c360ecffddb3858dcb33a7619665369d465f55e7386c31d45dfc3847bf","signature":false,"impliedFormat":1},{"version":"e7bde95a05a0564ee1450bc9a53797b0ac7944bf24d87d6f645baca3aa60df48","signature":false,"impliedFormat":1},{"version":"62e68ce120914431a7d34232d3eca643a7ddd67584387936a5202ae1c4dd9a1b","signature":false,"impliedFormat":1},{"version":"91d695bba902cc2eda7edc076cd17c5c9340f7bb254597deb6679e343effadbb","signature":false,"impliedFormat":1},{"version":"e1cb8168c7e0bd4857a66558fe7fe6c66d08432a0a943c51bacdac83773d5745","signature":false,"impliedFormat":1},{"version":"a464510505f31a356e9833963d89ce39f37a098715fc2863e533255af4410525","signature":false,"impliedFormat":1},{"version":"0612b149cabbc136cb25de9daf062659f306b67793edc5e39755c51c724e2949","signature":false,"impliedFormat":1},{"version":"2579b150b86b5f644d86a6d58f17e3b801772c78866c34d41f86f3fc9eb523fe","signature":false,"impliedFormat":1},{"version":"0353e05b0d8475c10ddd88056e0483b191aa5cdea00a25e0505b96e023f1a2d9","signature":false,"impliedFormat":1},{"version":"0db56fa7e217c8f35a618aa3153486c786a76782267febba8a1023baf1f4f55b","signature":false,"impliedFormat":1},{"version":"55751aaa3006e3a393539043695d6d2037cbd68676c9019805096ee84a7fb52f","signature":false,"impliedFormat":1},{"version":"a8af4739274959d70f7da4bfdd64f71cfc08d825c2d5d3561bc7baed760b33ef","signature":false,"impliedFormat":1},{"version":"99193bafaa9ce112889698de25c4b8c80b1209bb7402189aea1c7ada708a8a54","signature":false,"impliedFormat":1},{"version":"70473538c6eb9494d53bf1539fe69df68d87c348743d8f7244dcb02ca3619484","signature":false,"impliedFormat":1},{"version":"c48932ab06a4e7531bdca7b0f739ace5fa273f9a1b9009bcd26902f8c0b851f0","signature":false,"impliedFormat":1},{"version":"df6c83e574308f6540c19e3409370482a7d8f448d56c65790b4ac0ab6f6fedd8","signature":false,"impliedFormat":1},{"version":"ebbe6765a836bfa7f03181bc433c8984ca29626270ca1e240c009851222cb8a7","signature":false,"impliedFormat":1},{"version":"20f630766b73752f9d74aab6f4367dba9664e8122ea2edcb00168e4f8b667627","signature":false,"impliedFormat":1},{"version":"468df9d24a6e2bc6b4351417e3b5b4c2ca08264d6d5045fe18eb42e7996e58b4","signature":false,"impliedFormat":1},{"version":"954523d1f4856180cbf79b35bd754e14d3b2aea06c7efd71b254c745976086e9","signature":false,"impliedFormat":1},{"version":"31a030f1225ab463dd0189a11706f0eb413429510a7490192a170114b2af8697","signature":false,"impliedFormat":1},{"version":"6f48f244cd4b5b7e9a0326c74f480b179432397580504726de7c3c65d6304b36","signature":false,"impliedFormat":1},{"version":"5520e6defac8e6cdced6dd28808fafe795cb2cd87407bb1012e13a2b061f50b7","signature":false,"impliedFormat":1},{"version":"c3451661fb058f4e15971bbed29061dd960d02d9f8db1038e08b90d294a05c68","signature":false,"impliedFormat":1},{"version":"1f21aefa51f03629582568f97c20ef138febe32391012828e2a0149c2c393f62","signature":false,"impliedFormat":1},{"version":"b18141cda681d82b2693aef045107a910b90a7409ecff0830e1283f0bb2a53e6","signature":false,"impliedFormat":1},{"version":"18eb53924f27af2a5e9734dce28cf5985df7b2828dade1239241e95b639e9bf1","signature":false,"impliedFormat":1},{"version":"a9f1c52f4e7c2a2c4988b5638bd3dbfe38e408b358d02dd2fb8c8920e877f088","signature":false,"impliedFormat":1},{"version":"a7e10a8ad6536dd0225029e46108b18cee0d3c15c2f6e49bd62798ad85bc57b6","signature":false,"impliedFormat":1},{"version":"8db1ed144dd2304b9bd6e41211e22bad5f4ab1d8006e6ac127b29599f4b36083","signature":false,"impliedFormat":1},{"version":"843a5e3737f2abbbbd43bf2014b70f1c69a80530814a27ae1f8be213ae9ec222","signature":false,"impliedFormat":1},{"version":"6fc1be224ad6b3f3ec11535820def2d21636a47205c2c9de32238ba1ac8d82e6","signature":false,"impliedFormat":1},{"version":"5a44788293f9165116c9c183be66cefef0dc5d718782a04847de53bf664f3cc1","signature":false,"impliedFormat":1},{"version":"afd653ae63ce07075b018ba5ce8f4e977b6055c81cc65998410b904b94003c0a","signature":false,"impliedFormat":1},{"version":"9172155acfeb17b9d75f65b84f36cb3eb0ff3cd763db3f0d1ad5f6d10d55662f","signature":false,"impliedFormat":1},{"version":"71807b208e5f15feffb3ff530bec5b46b1217af0d8cc96dde00d549353bcb864","signature":false,"impliedFormat":1},{"version":"1a6eca5c2bc446481046c01a54553c3ffb856f81607a074f9f0256c59dd0ab13","signature":false,"impliedFormat":1},{"version":"04de5584b953b03611eeef01ba9948607def8f64f1e7fbc840752b13b4521b52","signature":false,"impliedFormat":1},{"version":"8b0b6a4c032a56d5651f7dd02ba3f05fbfe4131c4095093633cda3cae0991972","signature":false,"impliedFormat":1},{"version":"ff3c48a17bf10dfbb62448152042e4a48a56c9972059997ab9e7ed03b191809b","signature":false,"impliedFormat":1},{"version":"192a0c215bffe5e4ac7b9ff1e90e94bf4dfdad4f0f69a5ae07fccc36435ebb87","signature":false,"impliedFormat":1},{"version":"3ef8565e3d254583cced37534f161c31e3a8f341ff005c98b582c6d8c9274538","signature":false,"impliedFormat":1},{"version":"d7e42a3800e287d2a1af8479c7dd58c8663e80a01686cb89e0068be6c777d687","signature":false,"impliedFormat":1},{"version":"1098034333d3eb3c1d974435cacba9bd5a625711453412b3a514774fec7ca748","signature":false,"impliedFormat":1},{"version":"f2388b97b898a93d5a864e85627e3af8638695ebfa6d732ecd39d382824f0e63","signature":false,"impliedFormat":1},{"version":"c4fbd70eee3b4133f3ee1cc8ae231964122223c0f6162091c4175c3ee588a3f0","signature":false,"impliedFormat":1},{"version":"f477375e6f0bf2a638a71d4e7a3da8885e3a03f3e5350688541d136b10b762a6","signature":false,"impliedFormat":1},{"version":"a44d6ea4dc70c3d789e9cef3cc42b79c78d17d3ce07f5fd278a7e1cbe824da56","signature":false,"impliedFormat":1},{"version":"55cd8cbc22fe648429a787e16a9cd2dc501a2aafd28c00254ad120ef68a581c0","signature":false,"impliedFormat":1},{"version":"ba4900e9d6f9795a72e8f5ca13c18861821a3fc3ae7858acb0a3366091a47afb","signature":false,"impliedFormat":1},{"version":"7778e2cc5f74ef263a880159aa7fa67254d6232e94dd03429a75597a622537a7","signature":false,"impliedFormat":1},{"version":"8e06a1ef49502a62039eeb927a1bd7561b0bce48bd423a929e2e478fd827c273","signature":false,"impliedFormat":1},{"version":"7ec3d0b061da85d6ff50c337e3248a02a72088462739d88f33b9337dba488c4f","signature":false,"impliedFormat":1},{"version":"2f554c6798b731fc39ff4e3d86aadc932fdeaa063e3cbab025623ff5653c0031","signature":false,"impliedFormat":1},{"version":"fe4613c6c0d23edc04cd8585bdd86bc7337dc6265fb52037d11ca19eeb5e5aaf","signature":false,"impliedFormat":1},{"version":"53b26fbee1a21a6403cf4625d0e501a966b9ccf735754b854366cee8984b711c","signature":false,"impliedFormat":1},{"version":"9ff247206ec5dffdfadddfded2c9d9ad5f714821bb56760be40ed89121f192f4","signature":false,"impliedFormat":1},{"version":"e4b13509437860206e9fe6bde4a30fd90c2bec786af2dfb7976726c28b72bd29","signature":false,"impliedFormat":1},{"version":"8c59d8256086ed17676139ee43c1155673e357ab956fb9d00711a7cac73e059d","signature":false,"impliedFormat":1},{"version":"cfe88132f67aa055a3f49d59b01585fa8d890f5a66a0a13bb71973d57573eee7","signature":false,"impliedFormat":1},{"version":"53ce488a97f0b50686ade64252f60a1e491591dd7324f017b86d78239bd232ca","signature":false,"impliedFormat":1},{"version":"50fd11b764194f06977c162c37e5a70bcf0d3579bf82dd4de4eee3ac68d0f82f","signature":false,"impliedFormat":1},{"version":"e0ceb647dcdf6b27fd37e8b0406c7eafb8adfc99414837f3c9bfd28ffed6150a","signature":false,"impliedFormat":1},{"version":"99579aa074ed298e7a3d6a47e68f0cd099e92411212d5081ce88344a5b1b528d","signature":false,"impliedFormat":1},{"version":"096e4ddaa8f0aa8b0ceadd6ab13c3fab53e8a0280678c405160341332eca3cd7","signature":false,"impliedFormat":1},{"version":"415b55892d813a74be51742edd777bbced1f1417848627bf71725171b5325133","signature":false,"impliedFormat":1},{"version":"942ab34f62ac3f3d20014615b6442b6dc51815e30a878ebc390dd70e0dec63bf","signature":false,"impliedFormat":1},{"version":"7a671bf8b4ad81b8b8aea76213ca31b8a5de4ba39490fbdee249fc5ba974a622","signature":false,"impliedFormat":1},{"version":"8e07f13fb0f67e12863b096734f004e14c5ebfd34a524ed4c863c80354c25a44","signature":false,"impliedFormat":1},{"version":"9faa56e38ed5637228530065a9bab19a4dc5a326fbdd1c99e73a310cfed4fcde","signature":false,"impliedFormat":1},{"version":"7d4ad85174f559d8e6ed28a5459aebfc0a7b0872f7775ca147c551e7765e3285","signature":false,"impliedFormat":1},{"version":"d422f0c340060a53cb56d0db24dd170e31e236a808130ab106f7ab2c846f1cdb","signature":false,"impliedFormat":1},{"version":"424403ef35c4c97a7f00ea85f4a5e2f088659c731e75dbe0c546137cb64ef8d8","signature":false,"impliedFormat":1},{"version":"16900e9a60518461d7889be8efeca3fe2cbcd3f6ce6dee70fea81dfbf8990a76","signature":false,"impliedFormat":1},{"version":"6daf17b3bd9499bd0cc1733ab227267d48cd0145ed9967c983ccb8f52eb72d6e","signature":false,"impliedFormat":1},{"version":"e4177e6220d0fef2500432c723dbd2eb9a27dcb491344e6b342be58cc1379ec0","signature":false,"impliedFormat":1},{"version":"ddc62031f48165334486ad1943a1e4ed40c15c94335697cb1e1fd19a182e3102","signature":false,"impliedFormat":1},{"version":"b3f4224eb155d7d13eb377ef40baa1f158f4637aa6de6297dfeeacefd6247476","signature":false,"impliedFormat":1},{"version":"4a168e11fe0f46918721d2f6fcdb676333395736371db1c113ae30b6fde9ccd2","signature":false,"impliedFormat":1},{"version":"5b0a75a5cced0bed0d733bde2da0bbb5d8c8c83d3073444ae52df5f16aefb6ab","signature":false,"impliedFormat":1},{"version":"ef2c1585cad462bdf65f2640e7bcd75cd0dbc45bae297e75072e11fe3db017fa","signature":false,"impliedFormat":1},{"version":"ef809928a4085de826f5b0c84175a56d32dd353856f5b9866d78b8419f8ea9bc","signature":false,"impliedFormat":1},{"version":"6f6eadb32844b0ec7b322293b011316486894f110443197c4c9fbcba01b3b2fa","signature":false,"impliedFormat":1},{"version":"a51e08f41e3e948c287268a275bfe652856a10f68ddd2bf3e3aaf5b8cdb9ef85","signature":false,"impliedFormat":1},{"version":"862f7d760ef37f0ae2c17de82e5fbf336b37d5c1b0dcf39dcd5468f90a7fdd54","signature":false,"impliedFormat":1},{"version":"af48a76b75041e2b3e7bd8eed786c07f39ea896bb2ff165e27e18208d09b8bee","signature":false,"impliedFormat":1},{"version":"fd4107bd5c899165a21ab93768904d5cfb3e98b952f91fbf5a12789a4c0744e6","signature":false,"impliedFormat":1},{"version":"deb092bc337b2cb0a1b14f3d43f56bc663e1447694e6d479d6df8296bdd452d6","signature":false,"impliedFormat":1},{"version":"041bc1c3620322cb6152183857601707ef6626e9d99f736e8780533689fb1bf9","signature":false,"impliedFormat":1},{"version":"22bd7c75de7d68e075975bf1123de5bccecfd06688afff2e2022b4c70bfc91c3","signature":false,"impliedFormat":1},{"version":"128e7c2ffd37aa29e05367400d718b0e4770cefb1e658d8783ec80a16bc0643a","signature":false,"impliedFormat":1},{"version":"076ac4f2d642c473fa7f01c8c1b7b4ef58f921130174d9cf78430651f44c43ec","signature":false,"impliedFormat":1},{"version":"396c1e5a39706999ec8cc582916e05fcb4f901631d2c192c1292e95089a494d9","signature":false,"impliedFormat":1},{"version":"89df75d28f34fc698fe261f9489125b4e5828fbd62d863bbe93373d3ed995056","signature":false,"impliedFormat":1},{"version":"8ccf5843249a042f4553a308816fe8a03aa423e55544637757d0cfa338bb5186","signature":false,"impliedFormat":1},{"version":"93b44aa4a7b27ba57d9e2bad6fb7943956de85c5cc330d2c3e30cd25b4583d44","signature":false,"impliedFormat":1},{"version":"a0c6216075f54cafdfa90412596b165ff85e2cadd319c49557cc8410f487b77c","signature":false,"impliedFormat":1},{"version":"3c359d811ec0097cba00fb2afd844b125a2ddf4cad88afaf864e88c8d3d358bd","signature":false,"impliedFormat":1},{"version":"3c0b38e8bf11bf3ab87b5116ae8e7b2cad0147b1c80f2b77989dea6f0b93e024","signature":false,"impliedFormat":1},{"version":"8df06e1cd5bb3bf31529cc0db74fa2e57f7de1f6042726679eb8bc1f57083a99","signature":false,"impliedFormat":1},{"version":"d62f09256941e92a95b78ae2267e4cf5ff2ca8915d62b9561b1bc85af1baf428","signature":false,"impliedFormat":1},{"version":"e6223b7263dd7a49f4691bf8df2b1e69f764fb46972937e6f9b28538d050b1ba","signature":false,"impliedFormat":1},{"version":"d9b59eb4e79a0f7a144ee837afb3f1afbc4dab031e49666067a2b5be94b36bd4","signature":false,"impliedFormat":1},{"version":"1db014db736a09668e0c0576585174dbcfd6471bb5e2d79f151a241e0d18d66b","signature":false,"impliedFormat":1},{"version":"8a153d30edde9cefd102e5523b5a9673c298fc7cf7af5173ae946cbb8dd48f11","signature":false,"impliedFormat":1},{"version":"abaaf8d606990f505ee5f76d0b45a44df60886a7d470820fcfb2c06eafa99659","signature":false,"impliedFormat":1},{"version":"51a66bfa412057e786a712733107547ceb6f539061f5bf1c6e5a96e4ccf4f83c","signature":false,"impliedFormat":1},{"version":"d92a80c2c05cf974704088f9da904fe5eadc0b3ad49ddd1ef70ca8028b5adda1","signature":false,"impliedFormat":1},{"version":"fbd7450f20b4486c54f8a90486c395b14f76da66ba30a7d83590e199848f0660","signature":false,"impliedFormat":1},{"version":"ece5b0e45c865645ab65880854899a5422a0b76ada7baa49300c76d38a530ee1","signature":false,"impliedFormat":1},{"version":"62d89ac385aeab821e2d55b4f9a23a277d44f33c67fefe4859c17b80fdb397ea","signature":false,"impliedFormat":1},{"version":"f4dee11887c5564886026263c6ee65c0babc971b2b8848d85c35927af25da827","signature":false,"impliedFormat":1},{"version":"fb8dd49a4cd6d802be4554fbab193bb06e2035905779777f32326cb57cf6a2c2","signature":false,"impliedFormat":1},{"version":"e403ecdfba83013b5eb0e648a92ce182bff2a45ccb81db3035a69081563c2830","signature":false,"impliedFormat":1},{"version":"82d3e00d56a71fc169f3cf9ec5f5ffcc92f6c0e67d4dfc130dafe9f1886d5515","signature":false,"impliedFormat":1},{"version":"49e69850df69cd67e4adb70908a0f8f6fd6e7d157b48b1fec5db976800887980","signature":false,"impliedFormat":1},{"version":"d8ea6d3438ee9509eb79eabc935d442b21e742b6f63e6dce16be4863368544df","signature":false,"impliedFormat":1},{"version":"1b33478647aa1b771314745807397002a410c746480e9447db959110999873ce","signature":false,"impliedFormat":1},{"version":"b8d58ef4128a6e8e4b80803e5b67b2aaf1436c133ce39e514b9c004e21b2867e","signature":false,"impliedFormat":1},{"version":"3cd50f6a83629c0ec330fc482e587bfa96532d4c9ce85e6c3ddf9f52f63eee11","signature":false,"impliedFormat":1},{"version":"9fac6ebf3c60ced53dd21def30a679ec225fc3ff4b8d66b86326c285a4eebb5a","signature":false,"impliedFormat":1},{"version":"8cb83cb98c460cd716d2a98b64eb1a07a3a65c7362436550e02f5c2d212871d1","signature":false,"impliedFormat":1},{"version":"07bc8a3551e39e70c38e7293b1a09916867d728043e352b119f951742cb91624","signature":false,"impliedFormat":1},{"version":"e47adc2176f43c617c0ab47f2d9b2bb1706d9e0669bf349a30c3fe09ddd63261","signature":false,"impliedFormat":1},{"version":"7fec79dfd7319fec7456b1b53134edb54c411ba493a0aef350eee75a4f223eeb","signature":false,"impliedFormat":1},{"version":"189c489705bb96a308dcde9b3336011d08bfbca568bcaf5d5d55c05468e9de7a","signature":false,"impliedFormat":1},{"version":"98f4b1074567341764b580bf14c5aabe82a4390d11553780814f7e932970a6f7","signature":false,"impliedFormat":1},{"version":"1dd24cbf39199100fbe2f3dbd1c7203c240c41d95f66301ecc7650ae77875be1","signature":false,"impliedFormat":1},{"version":"2e252235037a2cd8feebfbf74aa460f783e5d423895d13f29a934d7655a1f8be","signature":false,"impliedFormat":1},{"version":"763f4ac187891a6d71ae8821f45eef7ff915b5d687233349e2c8a76c22b3bf2a","signature":false,"impliedFormat":1},{"version":"dff93e0997c4e64ff29e9f70cad172c0b438c4f58c119f17a51c94d48164475a","signature":false,"impliedFormat":1},{"version":"fd1ddf926b323dfa439be49c1d41bbe233fe5656975a11183aeb3bf2addfa3bb","signature":false,"impliedFormat":1},{"version":"6dda11db28da6bcc7ff09242cd1866bdddd0ae91e2db3bea03ba66112399641a","signature":false,"impliedFormat":1},{"version":"ea4cd1e72af1aa49cf208b9cb4caf542437beb7a7a5b522f50a5f1b7480362ed","signature":false,"impliedFormat":1},{"version":"903a7d68a222d94da11a5a89449fdd5dd75d83cd95af34c0242e10b85ec33a93","signature":false,"impliedFormat":1},{"version":"e7fe2e7ed5c3a7beff60361632be19a8943e53466b7dd69c34f89faf473206d7","signature":false,"impliedFormat":1},{"version":"b4896cee83379e159f83021e262223354db79e439092e485611163e2082224ff","signature":false,"impliedFormat":1},{"version":"5243e79a643e41d9653011d6c66e95048fc0478eb8593dc079b70877a2e3990e","signature":false,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"aa83e100f0c74a06c9d24f40a096c9e9cc3c02704250d01541e22c0ae9264eda","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"456fa0c0ab68731564917642b977c71c3b7682240685b118652fb9253c9a6429","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","signature":false,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","signature":false,"impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","signature":false,"impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","signature":false,"impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","signature":false,"impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","signature":false,"impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","signature":false,"impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","signature":false,"impliedFormat":1},{"version":"4bc0794175abedf989547e628949888c1085b1efcd93fc482bccd77ee27f8b7c","signature":false,"impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","signature":false,"impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","signature":false,"impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","signature":false,"impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","signature":false,"impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","signature":false,"impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","signature":false,"impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","signature":false,"impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","signature":false,"impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","signature":false,"impliedFormat":1},{"version":"af13e99445f37022c730bfcafcdc1761e9382ce1ea02afb678e3130b01ce5676","signature":false,"impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","signature":false,"impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","signature":false,"impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","signature":false,"impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","signature":false,"impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","signature":false,"impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","signature":false,"impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","signature":false,"impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","signature":false,"impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","signature":false,"impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","signature":false,"impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","signature":false,"impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","signature":false,"impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","signature":false,"impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","signature":false,"impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","signature":false,"impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","signature":false,"impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","signature":false,"impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","signature":false,"impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","signature":false,"impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","signature":false,"impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","signature":false,"impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","signature":false,"impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","signature":false,"impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","signature":false,"impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","signature":false,"impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a6310806c6aa3154773976dd083a15659d294700d9ad8f6b8a2e10c3dc461ff1","signature":false,"impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","signature":false,"impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","signature":false,"impliedFormat":1},{"version":"db39d9a16e4ddcd8a8f2b7b3292b362cc5392f92ad7ccd76f00bccf6838ac7de","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","signature":false,"impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","signature":false,"impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","signature":false,"impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","signature":false,"impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","signature":false,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"622b67a408a881e15ab38043547563b9d29ca4b46f5b7a7e4a4fc3123d25d19f","signature":false,"impliedFormat":1},{"version":"2617f1d06b32c7b4dfd0a5c8bc7b5de69368ec56788c90f3d7f3e3d2f39f0253","signature":false,"impliedFormat":1},{"version":"bd8b644c5861b94926687618ec2c9e60ad054d334d6b7eb4517f23f53cb11f91","signature":false,"impliedFormat":1},{"version":"bcbabfaca3f6b8a76cb2739e57710daf70ab5c9479ab70f5351c9b4932abf6bd","signature":false,"impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","signature":false,"impliedFormat":1},{"version":"966dd0793b220e22344c944e0f15afafdc9b0c9201b6444ea0197cd176b96893","signature":false,"impliedFormat":1},{"version":"c54f0b30a787b3df16280f4675bd3d9d17bf983ae3cd40087409476bc50b922d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","signature":false,"impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","signature":false,"impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","signature":false,"impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","signature":false,"impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","signature":false,"impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","signature":false,"impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","signature":false,"impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","signature":false,"impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","signature":false,"impliedFormat":1},{"version":"e07c573ac1971ea89e2c56ff5fd096f6f7bba2e6dbcd5681d39257c8d954d4a8","signature":false,"impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","signature":false,"impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","signature":false,"impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","signature":false,"impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","signature":false,"impliedFormat":1},{"version":"07199a85560f473f37363d8f1300fac361cda2e954caf8a40221f83a6bfa7ade","signature":false,"impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","signature":false,"impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","signature":false,"impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","signature":false,"impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","signature":false,"impliedFormat":1},{"version":"c9231cf03fd7e8cfd78307eecbd24ff3f0fa55d0f6d1108c4003c124d168adc4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2d5d50cd0667d9710d4d2f6e077cc4e0f9dc75e106cccaea59999b36873c5a0d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","signature":false,"impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","signature":false,"impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","signature":false,"impliedFormat":1},{"version":"f8529fe0645fd9af7441191a4961497cc7638f75a777a56248eac6a079bb275d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4445f6ce6289c5b2220398138da23752fd84152c5c95bb8b58dedefc1758c036","signature":false,"impliedFormat":1},{"version":"c39866300d394f45f82d3352ecfc1649aa1d5a47decdc5c76708cde15251c43d","signature":false,"impliedFormat":1},{"version":"76e7352249c42b9d54fe1f9e1ebcef777da1cb2eb33038366af49469d433597b","signature":false,"impliedFormat":1},{"version":"88cb622dd0ec1ef860e5c27fa884e60d2eba5ae22c7907dff82c56a69bdd2c8a","signature":false,"impliedFormat":1},{"version":"eb234b3e285e8bc071bdddc1ec0460095e13ead6222d44b02c4e0869522f9ba3","signature":false,"impliedFormat":1},{"version":"c85114872760189e50fef131944427b0fb367f0cc0b6dce164bb427a6fd89381","signature":false,"impliedFormat":1},{"version":"5ad69b0d7e7bdbcd3adfdb6a3e306e935c9c2711b1c60493646504a2f991346e","signature":false,"impliedFormat":1},{"version":"a12a667efdeb03b529bd4ebb4032998ddd32743799f59f9f18b186f8e63a2cf1","signature":false,"impliedFormat":1},{"version":"cee7efa0ae4c58deab218d1df0d1bf84abfd5c356cff28bca1421489cba13a19","signature":false,"impliedFormat":1},{"version":"f9e034b1ae29825c00532e08ea852b0c72885c343ee48d2975db0a6481218ab3","signature":false,"impliedFormat":1},{"version":"1193f49cbb883f40326461fe379e58ffa4c18d15bf6d6a1974ad2894e4fb20f3","signature":false,"impliedFormat":1},{"version":"8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","signature":false,"impliedFormat":1},{"version":"2e19656c513ded3efe9d292e55d3661b47f21f48f9c7b22003b8522d6d78e42f","signature":false,"impliedFormat":1},{"version":"ddecf238214bfa352f7fb8ed748a7ec6c80f1edcb45053af466a4aa6a2b85ffe","signature":false,"impliedFormat":1},{"version":"896eec3b830d89bc3fb20a38589c111bbe4183dd422e61c6c985d6ccec46a1e9","signature":false,"impliedFormat":1},{"version":"c8aa3e763e4aeca4f0be3f1f2a0b8d660f92f84e9ed699a2b5e8611719abd73d","signature":false,"impliedFormat":1},{"version":"8629340be5692664c52a0e242705616c92b21330cb20acf23425fff401ac771f","signature":false,"impliedFormat":1},{"version":"81477bb2c9b97a9dd5ce7750ab4ae655e74172f0d536d637be345ba76b41cd92","signature":false,"impliedFormat":1},{"version":"0f351c79ab4459a3671da2f77f4e4254e2eca45bcdb9f79f7dbb6e48e39fd8fe","signature":false,"impliedFormat":1},{"version":"b7d85dc2de8db4ca983d848c8cfad6cf4d743f8cb35afe1957bedf997c858052","signature":false,"impliedFormat":1},{"version":"83daad5d7ae60a0aede88ea6b9e40853abcbe279c10187342b25e96e35bc9f78","signature":false,"impliedFormat":1},{"version":"3a4e276e678bae861d453944cf92178deaf9b6dcd363c8d10d5dd89d81b74a0c","signature":false,"impliedFormat":1},{"version":"db9661c9bca73e5be82c90359e6217540fd3fd674f0b9403edf04a619a57d563","signature":false,"impliedFormat":1},{"version":"f7a5ab7b54bdc6a13cf1015e1b5d6eeb31d765d54045281bfeefcdfcc982a37c","signature":false,"impliedFormat":1},{"version":"ec99a3d23510a4cb5bdc996b9f2170c78cde2bfa89a5aee4ca2c009a5f122310","signature":false,"impliedFormat":1},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","signature":false,"impliedFormat":1},{"version":"f987c74a4b4baf361afbf22a16d230ee490d662f9aa2066853bb7ebbb8611355","signature":false,"impliedFormat":1},{"version":"1ff91526fcdd634148c655ef86e912a273ce6a0239e2505701561f086678262b","signature":false,"impliedFormat":1},{"version":"24557d7fa4d4d25f7b5fe679664bbf9e39f73bc9651d78df15fa7bf94cbdd466","signature":false,"impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","signature":false,"impliedFormat":1},{"version":"7952419455ca298776db0005b9b5b75571d484d526a29bfbdf041652213bce6f","signature":false,"impliedFormat":1},{"version":"21360500b20e0ec570f26f1cbb388c155ede043698970f316969840da4f16465","signature":false,"impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","signature":false,"impliedFormat":1},{"version":"1765e61249cb44bf5064d42bfa06956455bbc74dc05f074d5727e8962592c920","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"fc1cc0ed976a163fb02f9ac7d786049d743757db739b6e04c9a0f9e4c1bcf675","signature":false,"impliedFormat":1},{"version":"759ad7eef39e24d9283143e90437dbb363a4e35417659be139672c8ce55955cc","signature":false,"impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","signature":false,"impliedFormat":1},{"version":"56ccc6238510b913f5e6c21afdc447632873f76748d0b30a87cb313b42f1c196","signature":false,"impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","signature":false,"impliedFormat":1},{"version":"85021a58f728318a9c83977a8a3a09196dcfc61345e0b8bbbb39422c1594f36b","signature":false,"impliedFormat":1},{"version":"d91805544905a40fbd639ba1b85f65dc13d6996a07034848d634aa9edb63479e","signature":false,"impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","signature":false,"impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","signature":false,"impliedFormat":1},{"version":"b19f1e53960a7e02a6ef9eb389c38a11e0eaab424558c2481723e780b76688b4","signature":false,"impliedFormat":1},{"version":"7b9496d2e1664155c3c293e1fbbe2aba288614163c88cb81ed6061905924b8f9","signature":false,"impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","signature":false,"impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","signature":false,"impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","signature":false,"impliedFormat":1},{"version":"2fbc91ba70096f93f57e22d1f0af22b707dbb3f9f5692cc4f1200861d3b75d88","signature":false,"impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","signature":false,"impliedFormat":1},{"version":"96e5db71f25ebf7997d5454d2732f33cc16035568644b01fde08904fd8e51e80","signature":false,"impliedFormat":1},{"version":"b90aca7c39e25f3e2601d21c6e167182f06fa0997d37965698a1c998c6fceb6e","signature":false,"impliedFormat":1},{"version":"36146faac3711168ea94ce16cbdb87f606876cec46c6616a4ee4343b3167de76","signature":false,"impliedFormat":1},{"version":"abd6ccdaae9905ea2ec85488fdce744930862327633eebd40d429511f6a1d5da","signature":false,"impliedFormat":1},{"version":"4669b2a774cd3e5fbe0760dfe8b02b31f9301b5a3fefba896bca3cd4de334708","signature":false,"impliedFormat":1},{"version":"7c14e702387296711c1a829bc95052ff02f533d4aa27d53cc0186c795094a3a9","signature":false,"impliedFormat":1},{"version":"4c72d080623b3dcd8ebd41f38f7ac7804475510449d074ca9044a1cbe95517ae","signature":false,"impliedFormat":1},{"version":"579f8828da42ae02db6915a0223d23b0da07157ff484fecdbf8a96fffa0fa4df","signature":false,"impliedFormat":1},{"version":"279f097303c870a7ce213952224f7a66ae511741299e683e500f63646f6ebf08","signature":false,"impliedFormat":1},{"version":"3ae3b86c48ae3b092e5d5548acbf4416b427fed498730c227180b5b1a8aa86e3","signature":false,"impliedFormat":1},{"version":"8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","signature":false,"impliedFormat":1},{"version":"ba63131c5e91f797736444933af16ffa42f9f8c150d859ec65f568f037a416ea","signature":false,"impliedFormat":1},{"version":"44372b8b42e8916b0ab379da38dcf4de11227bad4221aba3e2dbe718999bdfab","signature":false,"impliedFormat":1},{"version":"43ebfcc5a9e9a9306ea4de9fda3abdd9e018040e246434b48ad56d93b14d4a3d","signature":false,"impliedFormat":1},{"version":"0e9aa853b5eb2ca09e0e3e3eb94cbd1d5fb3d682ab69817d4d11fe225953fc57","signature":false,"impliedFormat":1},{"version":"179683df1e78572988152d598f44297da79ac302545770710bba87563ce53e06","signature":false,"impliedFormat":1},{"version":"793c353144f16601da994fa4e62c09b7525836ce999c44f69c28929072ca206a","signature":false,"impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","signature":false,"impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","signature":false,"impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","signature":false,"impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","signature":false,"impliedFormat":1},{"version":"a8932b7a5ef936687cc5b2492b525e2ad5e7ed321becfea4a17d5a6c80f49e92","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","signature":false,"impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","signature":false,"impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","signature":false,"impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","signature":false,"impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","signature":false,"impliedFormat":1},{"version":"ff155930718467b27e379e4a195e4607ce277f805cad9d2fa5f4fd5dec224df6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"599ac4a84b7aa6a298731179ec1663a623ff8ac324cdc1dabb9c73c1259dc854","signature":false,"impliedFormat":1},{"version":"95c2ab3597d7d38e990bf212231a6def6f6af7e3d12b3bb1b67c15fc8bfd4f4a","signature":false,"impliedFormat":1},{"version":"585bc61f439c027640754dd26e480afa202f33e51db41ee283311a59c12c62e7","signature":false,"impliedFormat":1},{"version":"8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","signature":false,"impliedFormat":1},{"version":"160b24efb5a868df9c54f337656b4ef55fcbe0548fe15408e1c0630ec559c559","signature":false,"impliedFormat":1},{"version":"b2e552b6908b4187a75baed49d721b77fb0c65dea309de0bb4bc884c26a8052a","signature":false,"impliedFormat":1},{"version":"f07f8ba298e419a1361910cdcfb35ebc9a615160dd531b213d79bf4050ae6b47","signature":false,"impliedFormat":1},{"version":"7ce939bd514628729bd5eee872969547d201124a2a7e3fcb325ab8062d6c7c24","signature":false,"impliedFormat":1},{"version":"4b88e93ded70156d329258f7aa7975b89d4f7da0817ea83e7bcc416ddf6f1ddf","signature":false,"impliedFormat":1},{"version":"4dffaa05c98213916a29724c20ccb791a03c41a3777e1ccb74c3721844813a61","signature":false,"impliedFormat":1},{"version":"62a6677586e37c8659fd58c2d3bb2cca21141c3e19555f903fefc871641a344e","signature":false,"impliedFormat":1},{"version":"b99bcee3bbc98cd8154eb49738ccd7924a62b2bee86fd923fa6a97756829cbed","signature":false,"impliedFormat":1},{"version":"1df8ea922914ed738569b18dcf94fb9f4b3ab4608bc19b733c690a31ed4eba1b","signature":false,"impliedFormat":1},{"version":"9b2b32202969efb960725f4b0be52e706827ed0b2d01dc27ae5034df923f4f15","signature":false,"impliedFormat":1},{"version":"b9d03fbe8d9824910682688d3f38bbe9f9b21bf2d63db6a351ebd77901c02d8e","signature":false,"impliedFormat":1},{"version":"d72af567aff6da2d2a70906b9fbe1d1abecd7b1d6f96418180678d5418356b4c","signature":false,"impliedFormat":1},{"version":"86f34838586edc50209336942a53caad7d1bb8fb0bd38a2c03fa749dab6f3677","signature":false,"impliedFormat":1},{"version":"9359afcdd9d953f3262b6765f47808ab1b526b2b4889c62990da79f50d645437","signature":false,"impliedFormat":1},{"version":"5f5674fe7a1b27b90e1b9db090953b6fc43efb5dabb7fdce0a80b6d87f6530db","signature":false,"impliedFormat":1},{"version":"6e9ff34efdadc4c2e9211737f9aca033c9740198749bdefc4a5d438c242facee","signature":false,"impliedFormat":1},{"version":"27255bd30b452630068994e0492629cb6e1e1ca26f57047e98f7e44a0d1cc398","signature":false,"impliedFormat":1},{"version":"c867126753ce95904408d2444a3cab8837cbdaee5195864d82316f8901afc826","signature":false,"impliedFormat":1},{"version":"8715413232bc8d2c753f38920706d1c1a354ce9c9fb3da94abfd8eb43313c083","signature":false,"impliedFormat":1},{"version":"3f76dfa637fd46bc00334c1518861b1f70f8f2cd8efe2298ca7f638e539d11f4","signature":false,"impliedFormat":1},{"version":"2c0f4a0b8de075b81ac3249f299e3465753eb9f7c5db25dd523ba6f866343e9d","signature":false,"impliedFormat":1},{"version":"84805c4a02412686a8726c0deddadf58a0f5ff3ff6edf4c6aae4a6e69499d88d","signature":false,"impliedFormat":1},{"version":"168ee3e519c9b5e5eb01934f4c1ccee4320ce9b7def5ed9bb24c4956a3365bb7","signature":false,"impliedFormat":1},{"version":"0e7e3621d5fa6982e95b99c68199a49ce4dd5bb43591fe6d41ba1c651e83b312","signature":false,"impliedFormat":1},{"version":"1c0fc1413c35902204395c0b735fedddca9852becf0121200e665fb396b90889","signature":false,"impliedFormat":1},{"version":"45d3af088d76c1df10d792bc69964f552e76ddc1a362637c62ee0189d0a3ac34","signature":false,"impliedFormat":1},{"version":"5cd042605093c64e1973c43ed6e4309af6d214ec293d71adaa46476edc65ef06","signature":false,"impliedFormat":1},{"version":"a136141b98ae3a4365a1397cf0b406292a125bb62bab96b8acfb9c7ee0039a2a","signature":false,"impliedFormat":1},{"version":"68b53f890debad547aa747ccf6d11c834d8082f571e4ee15e202660dfb6c032e","signature":false,"impliedFormat":1},{"version":"e4a9bfbf1042ffeaaeac09d8b1896a4a6bc9fbffb112e2938d15cdd8d480b025","signature":false,"impliedFormat":1},{"version":"7da8cc5426223dcf52083d01f165b7134f6e23d6ac14943c525456d00027f77f","signature":false,"impliedFormat":1},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","signature":false,"impliedFormat":1},{"version":"f987c74a4b4baf361afbf22a16d230ee490d662f9aa2066853bb7ebbb8611355","signature":false,"impliedFormat":1},{"version":"1ff91526fcdd634148c655ef86e912a273ce6a0239e2505701561f086678262b","signature":false,"impliedFormat":1},{"version":"d9faf4a343833207c6c5cd2322fb6771b56dc1c8ece975072e85227c2d326bc2","signature":false,"impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","signature":false,"impliedFormat":1},{"version":"7952419455ca298776db0005b9b5b75571d484d526a29bfbdf041652213bce6f","signature":false,"impliedFormat":1},{"version":"21360500b20e0ec570f26f1cbb388c155ede043698970f316969840da4f16465","signature":false,"impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","signature":false,"impliedFormat":1},{"version":"1765e61249cb44bf5064d42bfa06956455bbc74dc05f074d5727e8962592c920","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","signature":false,"impliedFormat":1},{"version":"7b9e6b3c726d47935bdc9ebc78fe5398e28e751ba7d70e9e011f01fbd5b618be","signature":false,"impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","signature":false,"impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","signature":false,"impliedFormat":1},{"version":"56ccc6238510b913f5e6c21afdc447632873f76748d0b30a87cb313b42f1c196","signature":false,"impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","signature":false,"impliedFormat":1},{"version":"85021a58f728318a9c83977a8a3a09196dcfc61345e0b8bbbb39422c1594f36b","signature":false,"impliedFormat":1},{"version":"d91805544905a40fbd639ba1b85f65dc13d6996a07034848d634aa9edb63479e","signature":false,"impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","signature":false,"impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","signature":false,"impliedFormat":1},{"version":"8610f5dc475d74c4b095aafa0c191548bfd43f65802e6da54b5e526202b8cfe0","signature":false,"impliedFormat":1},{"version":"7b9496d2e1664155c3c293e1fbbe2aba288614163c88cb81ed6061905924b8f9","signature":false,"impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","signature":false,"impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","signature":false,"impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","signature":false,"impliedFormat":1},{"version":"2fbc91ba70096f93f57e22d1f0af22b707dbb3f9f5692cc4f1200861d3b75d88","signature":false,"impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","signature":false,"impliedFormat":1},{"version":"1cb419d52a2a5b871e3f8cbb3544954caded309b2ea41ade88f67628e478ce17","signature":false,"impliedFormat":1},{"version":"39633af07a7e4db1ff71d3e06ae8e8739a4412358f3e0f9859f33c157ea918c0","signature":false,"impliedFormat":1},{"version":"82db298982ffbab13a54d6464cb18a73817a280d4ae97c10c7cdc91adb34c1f3","signature":false,"impliedFormat":1},{"version":"ce615b77c6144a2aa06d6540fc1e628392a6df7c403038e30c1d5463c91a1280","signature":false,"impliedFormat":1},{"version":"7a2595b3d31b290d322a8998565654501504b0ab2bb72458e513e741ef5f105c","signature":false,"impliedFormat":1},{"version":"4e4be73397eef88ba66e9ac50cd393b4059f1a0388aeeca50d3d4bbdc612a413","signature":false,"impliedFormat":1},{"version":"27d30b713a8fa5be8a5381db98b40669362172fe0fb7d6e6ed33915c20cbc703","signature":false,"impliedFormat":1},{"version":"fd6f2bf34ea39e99ad9eb2c0efb8350bd21bfb6dc0e75c4d450ca3adb76b1a38","signature":false,"impliedFormat":1},{"version":"eaf4b586413c7530dbaa6497f1d1b1ed745bb4cb04a7f8b1a111a44dbbc7f689","signature":false,"impliedFormat":1},{"version":"83687fd983f4c0e6b12e3407d417fd31b99dfb8895179837d57f6b6c3b450785","signature":false,"impliedFormat":1},{"version":"bd6bcbdba58f098742678eb70b3ff3eb4b3166bc007d6a39df1ee4da08ee9061","signature":false,"impliedFormat":1},{"version":"c387de033a8ea92883a641dfd15c1ebe4d19bc670adad991661d945e46ab43d0","signature":false,"impliedFormat":1},{"version":"6eea2ad02f9ec8ddbe5bb1e82c7a821c5afb691740b59c822753cc675b3b9755","signature":false,"impliedFormat":1},{"version":"b5da95e6ed2a52dc97f42751c2be66234a8ec904f57cf75dd949b6218e6145ea","signature":false,"impliedFormat":1},{"version":"dd4a98387d1ff7b5fba3115cd28ee57f858308f1533edeef2d1f3708ad2803a0","signature":false,"impliedFormat":1},{"version":"a591f2025a3498d0c199deead9abf675ddacb8fb288257a6c2a7d3f0db131726","signature":false,"impliedFormat":1},{"version":"03cd3b76837abbbfc38edb926aea0bb933b73b9aafe3a5158f0c22bd6eb53003","signature":false,"impliedFormat":1},{"version":"1fe54f3a0e990e2c432a6d04cf31729ca1769ff60699a71e652af0b24a784b17","signature":false,"impliedFormat":1},{"version":"6182805342664deaf5e62ff9c5a7b7cc2262eece9b0da071e8cf8f4b21808a42","signature":false,"impliedFormat":1},{"version":"c7112819ba1341862b93bf474fc772d38f9857c338831a5283cc16bcb162eda0","signature":false,"impliedFormat":1},{"version":"22c37eff7b2e85149d7155562b45e0f18ee1af9d744399f0dde561757ced2efc","signature":false,"impliedFormat":1},{"version":"65316526d9f235e4ded54dde51f5a9814113f632c629f6ddaada7b95011c6a2b","signature":false,"impliedFormat":1},{"version":"77d233a90e0a55a3ea3a0512941b9f43291325db0ebaef2ad4b42793ebcaf374","signature":false,"impliedFormat":1},{"version":"d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","signature":false,"impliedFormat":1},{"version":"51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","signature":false,"impliedFormat":1},{"version":"8f567662c5d66efde479efa1db28537fd3247378768d098b5021478aaa201f13","signature":false,"impliedFormat":1},{"version":"4fe80f12b1d5189384a219095c2eabadbb389c2d3703aae7c5376dbaa56061df","signature":false,"impliedFormat":1},{"version":"9eb1d2dceae65d1c82fc6be7e9b6b19cf3ca93c364678611107362b6ad4d2d41","signature":false,"impliedFormat":1},{"version":"a9f6db6ad68e6cd0be147fad860ca01192a4a0d693461f2b7389327a734f4b0c","signature":false,"impliedFormat":1},{"version":"d351bec2aa82167232094708f8824e55d690a8f0e0c169ac78c4866adf2ac0e4","signature":false,"impliedFormat":1},{"version":"23b20478dabb44ea3862dd8dbee67d285ffb47c9154b277b7f07fad3f24ef706","signature":false,"impliedFormat":1},{"version":"ff20ba7716193fe4cf02c0e24565cb97d0f43c26671385ea3fe61d36f51bcf4b","signature":false,"impliedFormat":1},{"version":"4388271767e851129e94c7b036f09d1b0df30667362941133d0a713de7b83506","signature":false,"impliedFormat":1},{"version":"701e09e841718d6f918b0b778e3b9638e9db596d2897478ad10b2e220089a3d5","signature":false,"impliedFormat":1},{"version":"0ea34f7c302d382abfda724eac899ca69876f4024d654c7f2eed57661cf614eb","signature":false,"impliedFormat":1},{"version":"df6f1c794975d4035630ce4002b34545f82d6a39c37e672d2f4258ca2e18fe71","signature":false,"impliedFormat":1},{"version":"266c97dceaaf003b3d44a2ff5a8fe23e6054e94c9f343b989f8370b0a7e3b387","signature":false,"impliedFormat":1},{"version":"3f39935a1ac0d05221d09a7c1f5884abe54ffba65fe56d78dd2cc5c7eddce7f8","signature":false,"impliedFormat":1},{"version":"781abd56fa6da9903b0ef1dde2c400d447f58f17f741d5689b2d330e151cb539","signature":false,"impliedFormat":1},{"version":"4a158c41687c711ca67f8f88b1bfaffffb228320bc8621fb5dc67015fedf4ade","signature":false,"impliedFormat":1},{"version":"070b434dc310be968f0f3b8f5761c72a647faa76d4be0b47e1093c6afd776f77","signature":false,"impliedFormat":1},{"version":"332680a9475bd631519399f9796c59502aa499aa6f6771734eec82fa40c6d654","signature":false,"impliedFormat":1},{"version":"911484710eb1feaf615cb68eb5875cbfb8edab2a032f0e4fe5a7f8b17e3a997c","signature":false,"impliedFormat":1},{"version":"d83f3c0362467589b3a65d3a83088c068099c665a39061bf9b477f16708fa0f9","signature":false,"impliedFormat":1},{"version":"a7c022cf49ff55c5b21a6f242b62ca637f84adb48ca962a2e1a9c8713a368415","signature":false,"impliedFormat":1},{"version":"29994a97447d10d003957bcc0c9355c272d8cf0f97143eb1ade331676e860945","signature":false,"impliedFormat":1},{"version":"6865b4ef724cb739f8f1511295f7ce77c52c67ff4af27e07b61471d81de8ecfc","signature":false,"impliedFormat":1},{"version":"9cddf06f2bc6753a8628670a737754b5c7e93e2cfe982a300a0b43cf98a7d032","signature":false,"impliedFormat":1},{"version":"3f8e68bd94e82fe4362553aa03030fcf94c381716ce3599d242535b0d9953e49","signature":false,"impliedFormat":1},{"version":"63e628515ec7017458620e1624c594c9bd76382f606890c8eebf2532bcab3b7c","signature":false,"impliedFormat":1},{"version":"355d5e2ba58012bc059e347a70aa8b72d18d82f0c3491e9660adaf852648f032","signature":false,"impliedFormat":1},{"version":"0c543e751bbd130170ed4efdeca5ff681d06a99f70b5d6fe7defad449d08023d","signature":false,"impliedFormat":1},{"version":"c301dded041994ed4899a7cf08d1d6261a94788da88a4318c1c2338512431a03","signature":false,"impliedFormat":1},{"version":"5fa7cdc6627ece3484f155a10eec22f04dd47400f929c0b2f1fb83ac91a26d38","signature":false,"impliedFormat":1},{"version":"ded3d0fb8ac3980ae7edcc723cc2ad35da1798d52cceff51c92abe320432ceeb","signature":false,"impliedFormat":1},{"version":"ed7f0e3731c834809151344a4c79d1c4935bf9bc1bd0a9cc95c2f110b1079983","signature":false,"impliedFormat":1},{"version":"d4886d79f777442ac1085c7a4fe421f2f417aa70e82f586ca6979473856d0b09","signature":false,"impliedFormat":1},{"version":"ed849d616865076f44a41c87f27698f7cdf230290c44bafc71d7c2bc6919b202","signature":false,"impliedFormat":1},{"version":"9a0a0af04065ddfecc29d2b090659fce57f46f64c7a04a9ba63835ef2b2d0efa","signature":false,"impliedFormat":1},{"version":"10297d22a9209a718b9883a384db19249b206a0897e95f2b9afeed3144601cb0","signature":false,"impliedFormat":1},{"version":"a19f4622f2cadcadc225412e4164d09cb9504737ed6b3516f68ed25b67b18e15","signature":false,"impliedFormat":1},{"version":"34d206f6ba993e601dade2791944bdf742ab0f7a8caccc661106c87438f4f904","signature":false,"impliedFormat":1},{"version":"05ca49cc7ba9111f6c816ecfadb9305fffeb579840961ee8286cc89749f06ebd","signature":false,"impliedFormat":1},{"version":"983b3a2718a23ecb1caef3d926d876b2071029c50ef7dffa4889f16778eeaeaa","signature":false,"impliedFormat":1},{"version":"7e1a58fc407595eeec2115b2c375c73334d0d8c36db853bb1a2c0f2a9340eb83","signature":false,"impliedFormat":1},{"version":"de82303dddeabc26e7a85a85d0b758e00dcdfff874bfc1b5138d24615e4ce036","signature":false,"impliedFormat":1},{"version":"80136943de0e59229ef5ff5e4a04cf02d7399e1c5018897930544d95c6494552","signature":false,"impliedFormat":1},{"version":"a2aec159b91b971da5d6e5b97a6a4a713b1c816d862ed35aabbdb895cfec4841","signature":false,"impliedFormat":1},{"version":"5fa01a25623bcb0d90dcca861c0fa166b43ee0925323e4d7efe6bb8afeb3c95f","signature":false,"impliedFormat":1},{"version":"30150e241f110191c715ae6415537c7c365e5286be5755312c50706d883c9f03","signature":false,"impliedFormat":1},{"version":"8529ce83ef75ef7e48635947a68c02dd08d61fa759fb15542db60b946a0daa58","signature":false,"impliedFormat":1},{"version":"12e41faec5bff64f313806597fe5814e4303ba2075c9ae6ab25e875295b0caef","signature":false,"impliedFormat":1},{"version":"a522f116104c138dfd37e6c33e6f5f3887f1b1bc3886f5c37150cee900353e11","signature":false,"impliedFormat":1},{"version":"512f3322fe5b18c20eb33b7125348e6792c59a5c671da42cbf0c27f72809df16","signature":false,"impliedFormat":1},{"version":"1507771a6c0e5b43217dab116e836ee32a6783e77f27afde7300db5f969ce58f","signature":false,"impliedFormat":1},{"version":"cefda74054fabb5a470c1acd3a887d0614c0ab454471c1ce7cc3571dcf625377","signature":false,"impliedFormat":1},{"version":"736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","signature":false,"impliedFormat":1},{"version":"49b4ea9101cddaadb9b9d70994b346a905664937bbbddfca2af79d987145df9d","signature":false,"impliedFormat":1},{"version":"e99ec73d04019f112b21fb8671c554ff43a8442e8476dbb4ef4cded524f1bea9","signature":false,"impliedFormat":1},{"version":"22a211fa3f77cacadc41a59342b71897261faa406236be4d26ce19ee63a605d0","signature":false,"impliedFormat":1},{"version":"58052cbee2b1775782ed8577334643851316a5a584ef45f71bfa431aa68adbac","signature":false,"impliedFormat":1},{"version":"e849a856cdc54b375502a17f97f995afdba8c22cb0495173d312f9739841c8a8","signature":false,"impliedFormat":1},{"version":"efefd9062bf3b9c435218ab0e15719b875afc10fc6729d64ed39e910437ee188","signature":false,"impliedFormat":1},{"version":"fa6cd4696cd78f8d76dda3785f5c9d00a8d7cefbb041196d6a029491e8bf15aa","signature":false,"impliedFormat":1},{"version":"8e16c2ee73a21307d62c20677e9b84927e71bb2a60f4e3e79f1ff6045d9606b3","signature":false,"impliedFormat":1},{"version":"af7f3d440d5d8e45b860a714bafe1d19fbc46bcec8ba26849f01b2f9c5c6ef76","signature":false,"impliedFormat":1},{"version":"dd535ea4a55b93f2f4b7a85bf46eb644f29d89a15610b39bb4c43e729a4c8943","signature":false,"impliedFormat":1},{"version":"e66a04ae399a4837150e9899b36baa3376b3db26c4e409be0837606681c746df","signature":false,"impliedFormat":1},{"version":"eb791e6d5d4cc2f2064167606bae398c677773ae6bf61340f81d58f1e41e3392","signature":false,"impliedFormat":1},{"version":"fd4a7085fb6b9060e66869013493c3c2a530639ddab4f26bc1c1eca5cfdeedb2","signature":false,"impliedFormat":1},{"version":"da5ab70dcb8eb34a2c7e86eb01bbba76e511d3ba00194992b70d46d704aafeed","signature":false,"impliedFormat":1},{"version":"5950b041e28872c91ca7ee5b0d54b253a46734a33eeff0830649eca46da98e8d","signature":false,"impliedFormat":1},{"version":"699fc76688e74947e42dd34ff04688c1bd52e5060a21ded0237f85a2f861b793","signature":false,"impliedFormat":1},{"version":"42e7657500afda84493f1e2ce6397f8355dc0b9db2acce87fbcea0f1f1952d15","signature":false,"impliedFormat":1},{"version":"768ed4bb73a425a38175cf45b508beeb2d24594f7bf7c088fd34b3ae813c245a","signature":false,"impliedFormat":1},{"version":"4646f6f1a2dc8c3df677c2a43e5e256fe7a01235e7ba27814c72c6414145540d","signature":false,"impliedFormat":1},{"version":"8afc3d33ae531087c19d5b84b0d40cc12a52faa3ff80de1121973ce06cc49992","signature":false,"impliedFormat":1},{"version":"39b1c01f818b834f0fc4696a6b389472076a14e06be07e8a61169468565e8813","signature":false,"impliedFormat":1},{"version":"c219896e65e464e0d9e05633dd3b11e4f66c4198acb60bf8f91e352c1c8add2c","signature":false,"impliedFormat":1},{"version":"96e5e12490d2f3fdc3ef2762f08d5300e2c69bd4ad2c4a33d79c9fcff136e209","signature":false,"impliedFormat":1},{"version":"418a1bef70c038840643554b522614fdd88641eb431c2a09245d76e6a730ab12","signature":false,"impliedFormat":1},{"version":"3e42b11bafd61dda177ab395d048afc9d93c44406d09e390beb870239f0d2d9f","signature":false,"impliedFormat":1},{"version":"6a5f9a8ba1cf09538855c4982a69b09bf1ac03f52cdc4e3d6ec4ea46021aaa5b","signature":false,"impliedFormat":1},{"version":"c136e5c4c08d6a7c01999214550dd3a4b1870a04d5da85de7bee9be98d617539","signature":false,"impliedFormat":1},{"version":"39ea1cc7169100edccc3fe0c141f8caa02a9a30810c00cc6610da0e51c315261","signature":false,"impliedFormat":1},{"version":"de4a290b59c3b5db1b33681279c46fe332f903e05970c0d77898ef2a3ac814b1","signature":false,"impliedFormat":1},{"version":"8df49549118ee5bf99ddf714c78b613038e1cd3aaebac920e9d06458aa1c84ca","signature":false,"impliedFormat":1},{"version":"586b209ca8b4403fbf536374e73805795baa39773e1292e5aa7d021573e24799","signature":false,"impliedFormat":1},{"version":"a21d6c6e1e5878783da7d9861473a4004cf84dd5833e3673941362f11d3b3748","signature":false,"impliedFormat":1},{"version":"da55ce5b00267c9c6fb525a173c8ba29e5ad48db1d353497f047f983720e0646","signature":false,"impliedFormat":1},{"version":"2395952ade8a7861bb312f1e68e102bf85bc1f29a41e90f75e06b924172a69f3","signature":false,"impliedFormat":1},{"version":"521722ba50fe8b3f0785a82d5e1444b2a49290a89d3fd04bcc40881cf17ff654","signature":false,"impliedFormat":1},{"version":"c095d4172e926e90a29bc74b50893c8a5254a3f2f59f0422f4eaa6cf07e3dcb4","signature":false,"impliedFormat":1},{"version":"d176e3ac5024c45f7301b06b12039120b5f7f758bcb78b3947d8c4f8f9fdceaa","signature":false,"impliedFormat":1},{"version":"20bef5a5b4e5411ff95d73bee6f69277add29201ef9919383a9ff50b224e5e25","signature":false,"impliedFormat":1},{"version":"e2016a2342bcc46f77cb74e6d02b3ac4ea085cbfd19c3ae51699ac59b1d4f9ee","signature":false,"impliedFormat":1},{"version":"f87b5b1af55c4d1ee32e423dc6124459c693579ac3685b106ca9821c2c70c159","signature":false,"impliedFormat":1},{"version":"04cea4d78f4619299593b7fded40710897a795e9e0b3cfbe32ffb3be5bb94807","signature":false,"impliedFormat":1},{"version":"4b8169e316b5f951f35d6ade1f122b4493df30ae1643c6293bbfe8e5736ee96b","signature":false,"impliedFormat":1},{"version":"14d24d2cb5f45d01dce36845dcfe3a0b058a2357ecd0e91f94a506d098a5692c","signature":false,"impliedFormat":1},{"version":"95abb5d58b5a04ef6b1fd2b73433b4b4bfaad850c79f724e3a30485fbd3e888b","signature":false,"impliedFormat":1},{"version":"3e25f3128a056f7afe49faaf06926e5b7f60488569c4299224e8349ee1dc41f8","signature":false,"impliedFormat":1},{"version":"c348971cc0f40d1c6a995592af1479a544c4dd451e07ad25ef2592738726549b","signature":false,"impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","signature":false,"impliedFormat":1},{"version":"95da3c365e3d45709ad6e0b4daa5cdaf05e9076ba3c201e8f8081dd282c02f57","signature":false,"impliedFormat":1},{"version":"a9cbbb41c41bb37166b7aaf3ac61afe891a0f6e55197d86fc9fb131ee23bbf26","signature":false,"impliedFormat":1},{"version":"839d7dee36322eccfb29a76a86dab32ee4884e105726648078f4f74896a7e696","signature":false,"impliedFormat":1},{"version":"7e5a55a1c23eceb776de063c670fb3bd6bb2132ecf7f6b8ad566a70760b4bfab","signature":false,"impliedFormat":1},{"version":"8a08d0258cff668217a8d90c9e548350c293ea272cf38ec345f29de850801275","signature":false,"impliedFormat":1},{"version":"40a0cc0aa6afd931cc87cd6e00af2fef7d4f30951b2e8e7545c9b4c41f99611f","signature":false,"impliedFormat":1},{"version":"bf7dc5fd095e98446231cabb9817343cbed7a71bf5b3bfb75b483560d12d0048","signature":false,"impliedFormat":1},{"version":"fb849bf032d14aaf9ed2294ded52f12702cc07ad272a9999476facadf713b849","signature":false,"impliedFormat":1},{"version":"ffaf049bb4f98ce1ea636f40c24c20d7689d68a6c7d5e1bb5348b5dea947d740","signature":false,"impliedFormat":1},{"version":"3e2c2789ef6c0365e78b46e17d08652a0a1fc2f8c8c0d13b72fe8b212462f1f4","signature":false,"impliedFormat":1},{"version":"ca1f305a892242f647fa742d46cf1845ac867429c900bee7ba0202d721c8d493","signature":false,"impliedFormat":1},{"version":"4429e5e740c08c13c64f01f90b0653e08f37d09b67cff0feb260a244adbd14ee","signature":false,"impliedFormat":1},{"version":"032bd2c695ff29167faedefadb15d5d941b3b182b14f4e0d415e35ffc4741c5e","signature":false,"impliedFormat":1},{"version":"b8e99da6d77de7b215116db2fda0780033e91fa3d0c35fb1a7b78d789041c93a","signature":false,"impliedFormat":1},{"version":"67d5b9ee2566d1a75ecdbedcdc10cc151ec8f6b50742ed2e3a2aededad1e4cf8","signature":false,"impliedFormat":1},{"version":"119f16cb069dc4bd387f1f0371b22860b274486b716cddf32734890f168b90ea","signature":false,"impliedFormat":1},{"version":"31452f98899de1217facd57db07f570386b1de82d5f10a9c465181bc41c94527","signature":false,"impliedFormat":1},{"version":"a116ca4eab6abeb376f0deae6358a3efdfa503f6b325832a98141ef27d24dc3b","signature":false,"impliedFormat":1},{"version":"d54b8bf170290a4b87701ab6d1143ef0a55415b36b42b57f019fb62b1c435bed","signature":false,"impliedFormat":1},{"version":"4b2ebe59f23314851c4cf4d65b194e3a65b68bdf0cdc1be2ffe19406605c9694","signature":false,"impliedFormat":1},{"version":"ddbffcbd0335b4e43f2e1771861b6e85f34fa12375dd0565caab4cbd83708985","signature":false,"impliedFormat":1},{"version":"78405540cf6aa0ee0b65a85a0ff17a3eebfd74c565d1bdcb0815c9327ccf2554","signature":false,"impliedFormat":1},{"version":"dbd416a31ba77a6d90ea4163c2fff64c675d7377bf4c637776e0b08fc225db48","signature":false,"impliedFormat":1},{"version":"5b54a276dde01f6f7120b4ead0bce82dfdd6a52e0e001a2fd5f0ccc6f470fa6b","signature":false,"impliedFormat":1},{"version":"360de32ec39b1699ade98153c3f8351988e85b878bdf12907fd39398aa8a8fe0","signature":false,"impliedFormat":1},{"version":"0a9584867a25e2f2db31244e887b0afaad520da2a8bae39dc3b595e2338f0c29","signature":false,"impliedFormat":1},{"version":"404d0cb13e779108e74a5b1e02ec10a8e9933b825f300c797ba4558451784de5","signature":false,"impliedFormat":1},{"version":"4ffee86e26af85318716d9a053a33b2659c987a9492015435b213f0ccf04a491","signature":false,"impliedFormat":1},{"version":"e8747cb2f6770567961b051c13a41e2c7cb748c42762f904d16b19bba55e8432","signature":false,"impliedFormat":1},{"version":"c9d70252b35da8cb8137d70b02a383e7edc3c2e1e6c37ea87ffef982a7eaf644","signature":false,"impliedFormat":1},{"version":"46c59c3569d97822d42a003eb02cd5f0eb88676e12abcc8ce249675ea8d5c4ef","signature":false,"impliedFormat":1},{"version":"c4aa043e77a847629a298e6182d4bae576f6c6e2f309f3ae11c58ed79b0dab64","signature":false,"impliedFormat":1},{"version":"3255b922161bb67af603428be84466e27d7efdd26c6a473b9a5a6679112828e2","signature":false,"impliedFormat":1},{"version":"6c1b497aeb9135ac66891d783a34dec6d4df347126ebe9c3841110f0a614e0c6","signature":false,"impliedFormat":1},{"version":"cef73ddf0336cb343be88b61a0448483029d438dd66ca21722aeabc66223bded","signature":false,"impliedFormat":1},{"version":"8cb6c8db9e27d0c6dba28bf0fcd7ef7603d0b5b2b3dce6fffc86f3827a8a00e9","signature":false,"impliedFormat":1},{"version":"d07ef5953b1499ae335c75147c658d9c037fc649544a4c85883f10eb9e5878e8","signature":false,"impliedFormat":1},{"version":"34714fae00aa0544916ade4018d18a04432db2b4b49c6cd066825ac31734eb40","signature":false,"impliedFormat":1},{"version":"5cb3b7b2b0997e451f91ab009ff2d66e7cd5f77838dc729a2e335554fa098a12","signature":false,"impliedFormat":1},{"version":"bdbe3e5d1f1f3dd035c551b6f94883212ccdbe9b3610f65f49138980e0efc0d7","signature":false,"impliedFormat":1},{"version":"eadae8542e5f360490f84d8da987529e415e265da584dd12e3e7c07a74db2fc9","signature":false,"impliedFormat":1},{"version":"9a82178f67affe7ca9c8b20035956d1ad5b25d25b42b6265820232ba16ba0768","signature":false,"impliedFormat":1},{"version":"6e13e39db421493c2a88e1a92425e28bc3a8b75d8c27c7c796c4e6c62907b18e","signature":false,"impliedFormat":1},{"version":"5aa42b32993e161aaf93d992300494377d38c8883e15fde44d5c7949313058af","signature":false,"impliedFormat":1},{"version":"bca49ca4673e7865583f42dc504f8608248582de9840a236613896b5a56c8b4b","signature":false,"impliedFormat":1},{"version":"d4a13186191b6e3967379e8075b98026fc7a33a1a1dfc671557c3f67e9cb3e81","signature":false,"impliedFormat":1},{"version":"827eb54656695635a6e25543f711f0fe86d1083e5e1c0e84f394ffc122bd3ad7","signature":false,"impliedFormat":1},{"version":"2309cee540edc190aa607149b673b437cb8807f4e8d921bf7f5a50e6aa8d609c","signature":false,"impliedFormat":1},{"version":"899417348aed557d990c12c5c574004616ce897d538fed2ff06afed108cbe73a","signature":false,"impliedFormat":1},{"version":"baf69edf0dac0c04f811c41545892ff304dcea1455bc1de5d8f2a48a024041d8","signature":false,"impliedFormat":1},{"version":"d370ed9bdc80204bb3ee538f4174de05ee1e18c2e694a630bcaf7546dbfb2807","signature":false,"impliedFormat":1},{"version":"1460f16c4b7fc66d2dde3ce1a4ab97d480c27fb84a4e429355a21e76cd471e19","signature":false,"impliedFormat":1},{"version":"c5d73bf762b7b0e75fcdf691e21e31c9db9913931b200b9990f07f49ab2edff3","signature":false,"impliedFormat":1},{"version":"374e2b3ebf80d4409bcc2582a2b3d2e04d58f85b5bbd7b5c50d4ab5c4d869e32","signature":false,"impliedFormat":1},{"version":"76a5f88a99d386a1ea9209a9f8f33a3f2c2f17bc445a4078950a49c0624bae3d","signature":false,"impliedFormat":1},{"version":"65357b3849688962f59c625718650ad31ff59e6c23f244b4086f0d96558405d6","signature":false,"impliedFormat":1},{"version":"8f932e59ba3dc1bda638f23ab1d173f1ab3885f14c98db90a84ca7f7f977c95b","signature":false,"impliedFormat":1},{"version":"471486ab7c5c95c3df63c0fbebe6871b9535eedff8b582557dfd66fcbf946d5b","signature":false,"impliedFormat":1},{"version":"45e82f28a80d855bab2355d5e46cc8edd7f2679fc5bfb0905dcf01ce59a5c347","signature":false,"impliedFormat":1},{"version":"48f7cd72c6f8ec5b2f70f50a8d4e6f47494e0d228015efb50c36fc6eab33c7ff","signature":false,"impliedFormat":1},{"version":"a8aa7a344599265ef9c2aba0433a805227b2c9b0e743106fab4d6f0c6966f536","signature":false,"impliedFormat":1},{"version":"567f0f5ebc17791330426f62750395ac084b2233b6794275626b9a5368c5eb35","signature":false,"impliedFormat":1},{"version":"9b92a4d989efc3eeefdca5f95f10267504abc7748ecff400b533cdf54dcdbd68","signature":false,"impliedFormat":1},{"version":"2cca2c2c97f0b38de79eb7bbd81bf0cfe957639b0b674e2154b0cda2a896ce65","signature":false,"impliedFormat":1},{"version":"b88645280562793af76ab59052d87e4846ac5ef19af054c729fbb87c73481a59","signature":false,"impliedFormat":1},{"version":"a1f43b06dd37b1f6c5c7821881960dfe55038b468eafb324ad90ce5e9b448d2a","signature":false,"impliedFormat":1},{"version":"15b142d522e96e1962bd54c75560f6994cc8fe9a1640a36de2268fdb95e58fb5","signature":false,"impliedFormat":1},{"version":"6051cda419dcead987cf382fa9dd688e54a5bb34122606d19eca1c6b48eeb7bb","signature":false,"impliedFormat":1},{"version":"355739d282928494e5564cb919b6db7d920a08956ef536d870c2f9e7596c8ac4","signature":false,"impliedFormat":1},{"version":"07c682c8d39ebb0d17467b91c782976c2dc9ac4cdb95051d402080dcc16eda54","signature":false,"impliedFormat":1},{"version":"c24b9f975228fe254cece0a4e09d61fec9a0aebbdc6911307684bd10e6788d87","signature":false,"impliedFormat":1},{"version":"d0f62192ec787f1592a5b86760a44350d1c925883a573eadc12d60862890dffe","signature":false,"impliedFormat":1},{"version":"49ff174fad1ee1e2c4d3783aacafeea1d37852aa6f5e2ab9ddc2ce287193372c","signature":false,"impliedFormat":1},{"version":"a66ad696f2785dd00374b8dee6fab5c58c049c0efe24b3c214fbe6aec3f53d6e","signature":false,"impliedFormat":1},{"version":"fc173efd74ed1299d4ae67fd664c3eb6eb8061b2044e5f8aa20ba6399c8b695b","signature":false,"impliedFormat":1},{"version":"63f859a315e9711f383d06b7a2b940804e51078d85e896980816f46f1b6021a8","signature":false,"impliedFormat":1},{"version":"01fc8936d43f51c4c1e3c531805accd389edb0d873a822000c4b2a411d9ba6e7","signature":false,"impliedFormat":1},{"version":"397b46c6a95826d26714b5481addc606de72d8229b092e236f0d78a9e7226d29","signature":false,"impliedFormat":1},{"version":"67c99516beef2e0bff899ca25dc122c7db428382c8a491ff119d4f8e1d1319d2","signature":false,"impliedFormat":1},{"version":"617891438559a97ae02a795d529a25acf128744cf1e150ab6b70a2db38600abb","signature":false,"impliedFormat":1},{"version":"225deff02f4d1c91e2d6c71dec9f18feae510aa729a9774024f30278f4c6b8fe","signature":false,"impliedFormat":1},{"version":"6c24f6dcbb3bf8235bf8da995a7290ffbd9d557a760cf2deb380ce91a989b765","signature":false,"impliedFormat":1},{"version":"34d7972ba4166bcbfe9bdd37f78164108bab6b0a6386f5b9ad14810f1dc7bd6c","signature":false,"impliedFormat":1},{"version":"e78efe1acc86b01bbb10bae9eecc2fc389d0e51a06eacb42d23a928946d2c9e6","signature":false,"impliedFormat":1},{"version":"9b74326515d17f03809cfbea6de789772ff7d0c759a08a59bfa5242bda98d35b","signature":false,"impliedFormat":1},{"version":"0ea47413eaffe144782a44058205c31130b382dee0e2f66b62b5188eac57039e","signature":false,"impliedFormat":1},{"version":"c0591738dbfe11a36959f16ab40bc98b2a430c4565770ef6257574546079d791","signature":false,"impliedFormat":1},{"version":"3cf3dc0f53d71795cd7c461346e9aa3c713f8a5138015776aa6d4b8ff9e0cb26","signature":false,"impliedFormat":1},{"version":"bde3f2ff6df7df1beb9939ff0ece11da82a758ff845eccb2429f0a53386d4e84","signature":false,"impliedFormat":1},{"version":"241989edda9c92a4e4b2d815cea9abc64af1a60702c7756543f834180f002c8b","signature":false,"impliedFormat":1},{"version":"fced7c59acecb0ac631505fcbc5a1ce0c6420e2494a256321e9359093efb7a1f","signature":false,"impliedFormat":1},{"version":"ccdccca79ad031a924e69ad32dd7a7df7f58a8379fc540caaabba844ec287c97","signature":false,"impliedFormat":1},{"version":"846490467cc9e84639beee9ca9c21ce5f73ec40a3a583937e954db1410a350e3","signature":false,"impliedFormat":1},{"version":"cf841c4bfb05b4b1d3826773ff77a47bb0dc17c665a4dbff7d6c4a6d9042d50c","signature":false,"impliedFormat":1},{"version":"b85a315e455cce60173e302549e6ae719b797c6c796dd372c27054883eeadbce","signature":false,"impliedFormat":1},{"version":"cc72ebdcc37c9978d58441cfd822d02b5e3265538170ed7c4cf1ed14e0ebf8bc","signature":false,"impliedFormat":1},{"version":"4f5f11b73282262904f4c1bc5ffb76631b40ac8b54ae01bde274cb9242d6cb2f","signature":false,"impliedFormat":1},{"version":"8575e621e7a0b894381f891180de3d198936381c7845191679910258b4c159bb","signature":false,"impliedFormat":1},{"version":"4e4559e8e4ea7d87f914014074559e515de78308bacc733a7ea76f795de178a3","signature":false,"impliedFormat":1},{"version":"13ecb31795209aa56b1837b9d46cc5494da392f594132bc5b3a56c067e12ea1c","signature":false,"impliedFormat":1},{"version":"e34a28e978cf430e062c91d03987f2b42360b33e6207738b40494acd4a97004b","signature":false,"impliedFormat":1},{"version":"5cc10d0295e594c961bd020cc76845097928f550fa3d58468114e5225054f76c","signature":false,"impliedFormat":1},{"version":"99c4cd704c85c3b9a215977d1d10ad34f1c6bbc5784e0ddaaf6fe8090030eaf3","signature":false,"impliedFormat":1},{"version":"4e874f611f31bfab5803e7a7f32fafbed44b93eb260726420355a2b6331c312e","signature":false,"impliedFormat":1},{"version":"fbc766fb3d30bae051bc26710ba00399e2b2740f4e532a64451bab3cdeac640a","signature":false,"impliedFormat":1},{"version":"d63e28484269b68abc14b19e3ce4f73ff2345a0a941ebfd217642b9b24e4004b","signature":false,"impliedFormat":1},{"version":"7d01be2b4ee5bfa3af18e6920573598f1d229669bae95525911953a678a99bd4","signature":false,"impliedFormat":1},{"version":"b84e93b8eb20618c66475d20ecfec0b2770200c55baee8989d842e77bf150b3c","signature":false,"impliedFormat":1},{"version":"c3dac795625ce36141684af99e28bdc6f36bda7d7eecf22cb5a536bfe30dee74","signature":false,"impliedFormat":1},{"version":"aa6a08a5d0fcd78c26e2077296bc20223237543c704e9c1bae7cf7363567fe9f","signature":false,"impliedFormat":1},{"version":"121695e29f8a46c562eec36f3e5324b21047c9f08293b7f74532c27861e2dbd1","signature":false,"impliedFormat":1},{"version":"ef5aa9871f3b8dac96d4ef93e22eec539527d739c6a7e0c7fa7101fa343bfd77","signature":false,"impliedFormat":1},{"version":"c580515d61246a4d634143a59a2eb6d5667aab627edf624035ee4333f6afbc11","signature":false,"impliedFormat":1},{"version":"4a1a0f21b3c4fc0d217392d82445a34fcc8c9ed6f79fdc4d14b8353e3c74eaf3","signature":false,"impliedFormat":1},{"version":"bd20d5c075af9069445697ed29461388f0593e94f5460db76de19d3a72dda942","signature":false,"impliedFormat":1},{"version":"18c8894331eaeea43870cab6dde83e47eac1575c6c9af8f08332057f47369f7d","signature":false,"impliedFormat":1},{"version":"0e6387b87925a10ba52cd0de685a4f7e2d9dd402dbac560dce8934e8e34007d0","signature":false,"impliedFormat":1},{"version":"87fb1d641c91d03d4e4c899ac82a2132575d4a58eec901dbf4ce70633b1b0440","signature":false,"impliedFormat":1},{"version":"08afbaae8fc07dd58b1a7f817512ee2bfdd30b973945054bb10dbb551cce5082","signature":false,"impliedFormat":1},{"version":"3c2659603b45925ed364bc06dda7fd340fa93cb7b0ccc79c84a047d2676eae16","signature":false,"impliedFormat":1},{"version":"94216fb09dfbdb7bae50dcf264fede1f3af0c9c2b38f9a9477ecbee2e2b8c42c","signature":false,"impliedFormat":1},{"version":"15aba6a4199ce9e4f3c1ec397a468f6aaaeba973649ca4f1c016225b46a5feaf","signature":false,"impliedFormat":1},{"version":"a1ca7f7788853a2ff3670bf1112a92fa503686b10d58339318fec5862bd209a6","signature":false,"impliedFormat":1},{"version":"9183f175f885e98000fb3e8e3478c4c7f5b6374d7f580a3071b37ed2f8422c5c","signature":false,"impliedFormat":1},{"version":"45a149d995a3a76a4adb1aff9267f57dba9a81c6ec75aa07351352fe426849d2","signature":false,"impliedFormat":1},{"version":"3583432d31bc3a8314da422000c1c6e027b903085d749858440918f3499321f0","signature":false,"impliedFormat":1},{"version":"0aec2668089369cc9e3e2f78cd2e6b0795c4f9a3c2201c97a29f12c52c7c60d6","signature":false,"impliedFormat":1},{"version":"91b681431258c2b6edef7a40b64f455edb2c33d5486e3543eb246cc1beb173b6","signature":false,"impliedFormat":1},{"version":"060c0dcf0c791fadb137766d0dad41414e85fe0eb4d80f8ed436296755540e55","signature":false,"impliedFormat":1},{"version":"edb7055a348bc1ee811ea9040998797ae3097951b4af69ee96f6edc4c47fb817","signature":false,"impliedFormat":1},{"version":"29b408824df9dfca5ce4e4de1702ca382036f422653d71a36a9ba00a9818c6f1","signature":false,"impliedFormat":1},{"version":"e92ee6e3d7594a90ca038a2ac77693cd090b3989d13be7cbea4fc5af6a3a5ab5","signature":false,"impliedFormat":1},{"version":"528f3448c98e09174ca4186540000bf77f81fddcb587e0db9626ea825dead0ab","signature":false,"impliedFormat":1},{"version":"2203c47042792d350a9ac67328e541fe9c8627c0a2aef12f2d30d6072c210004","signature":false,"impliedFormat":1},{"version":"de18addada26bb0c6a7b795356bcbdcde7ade8a928d761b90ad2673cd9b97a56","signature":false,"impliedFormat":1},{"version":"e5a093183415e4c25343e717144d1bb051eebd65bdc05569f314023c8c16c315","signature":false,"impliedFormat":1},{"version":"6b141b2932d1592b315fc91b2ccf9ebf860c84e13aee14637559449b4573d54a","signature":false,"impliedFormat":1},{"version":"9c3cc6249267ec556f7cb3d3935e16bf5ac7459b74150e059f94fc803d6d83d6","signature":false,"impliedFormat":1},{"version":"c1317ee4831c2c325ea7f348533e8c1118282ef092332978e699f775d08d5e44","signature":false,"impliedFormat":1},{"version":"cea7c28a328bfd8efb8d4db3c8333479d95c43737e13164513811d7a0eda1540","signature":false,"impliedFormat":1},{"version":"fdb137a5008e4093fed0d39bd969c9db55d7c3c2a6a88156ef2bbea3625ebcb4","signature":false,"impliedFormat":1},{"version":"2e84db8bdd705b0041fa382197527062d2853468f8c4f6534ba869b700699b1b","signature":false,"impliedFormat":1},{"version":"e375f01fcc9cf9949d85d884c0e77181ade7ddb35cf75ec7510a238e0cb8e3d0","signature":false,"impliedFormat":1},{"version":"376fba160c82508f4c003cbb0c1731ce06fb044a6741123f2685a15187784c39","signature":false,"impliedFormat":1},{"version":"24a639753c651fbdd930131ecb0e6ac87ad27fc831390fbfcb98d994674236b9","signature":false,"impliedFormat":1},{"version":"e20bc9827aa221755718de4bea01cba89715fbdf0f125c5ae57e591767e9f29c","signature":false,"impliedFormat":1},{"version":"39ecf86c05473aee4e6f2befb7c1767e664cdd2b7be27ab038c412273dcf03cb","signature":false,"impliedFormat":1},{"version":"fa80fe842fd2b1465fdf713f125c6aea9c5803f89665a5daf46e429e1e2d9874","signature":false,"impliedFormat":1},{"version":"28d7d661eb177715c728ebe6ad165c8a3c187cf32ceea52f99d8803cdb1663bc","signature":false,"impliedFormat":1},{"version":"4a1744726d4293daaac3a1bb0bb4c4d400d51d4525933093a059b1795552938e","signature":false,"impliedFormat":1},{"version":"2e558eb0508798ab479e63c074027828f95ba2e5ac620e3b72b61739d23b8365","signature":false,"impliedFormat":1},{"version":"f3eca6b9a668c7872bb132fafe6750c582771c40a66606745c2c01dbec8d4c5d","signature":false,"impliedFormat":1},{"version":"ca2136477815999750c637596c1f10d9bd22bf4d740c9f3bdb7587e88ae66360","signature":false,"impliedFormat":1},{"version":"32e8a9c74f4dcc2c0564791939e001bc26c0e689a33736f9e1cba168b06b628a","signature":false,"impliedFormat":1},{"version":"9de93044640e453de8a572bbafb4169d9463592c2d4abd19c27fdb7b2e3f24d0","signature":false,"impliedFormat":1},{"version":"392a497486df44f667ca5cc661a94483b7b4a596ffd6213389e973f9099501ce","signature":false,"impliedFormat":1},{"version":"b635c539c18d6b55f0c6cccab701faea361eacc7d61db3339933bb435ecefb03","signature":false,"impliedFormat":1},{"version":"ff328462dd20b8ebd8a8d7e76cbc34dd93b89ef4942e130125caea49797d509e","signature":false,"impliedFormat":1},{"version":"92877b8c52c315ced4d978d89869ca4a9585394be1ed5e2bd40b91f98b1ab074","signature":false,"impliedFormat":1},{"version":"681474bc56579612cdad278d143d8ae684425d1f5aaab8962a29af61da8b47b5","signature":false,"impliedFormat":1},{"version":"2b5321165165ea60c38562f225d6e7a5cced2d21d733cdf7b36c4c23f25bc85c","signature":false,"impliedFormat":1},{"version":"2512df184552536d882b3eacd227d9a335fd5865f56be03a1bf4fa4bef008779","signature":false,"impliedFormat":1},{"version":"3b32a0fa0a6c2544d1f8b470e69d677163cf2d5f9f967053f0d162696c2f043f","signature":false,"impliedFormat":1},{"version":"6ecc423e71318bafbd230e6059e082c377170dfc7e02fccfa600586f8604d452","signature":false,"impliedFormat":1},{"version":"772f9bdd2bf50c9c01b0506001545e9b878faa7394ad6e7d90b49b179a024584","signature":false,"impliedFormat":1},{"version":"431fa46c664434706f22edf86fcfab93853978036a87c06d99b7c5457ecb95db","signature":false,"impliedFormat":1},{"version":"7467736a77548887faa90a7d0e074459810a5db4bbc6de302a2be6c05287ccae","signature":false,"impliedFormat":1},{"version":"39504a2c1278ee4d0dc1a34e27c80e58b4c53c08c87e3a7fc924f18c936bebb5","signature":false,"impliedFormat":1},{"version":"cd1ccdd9fd7980d43dfede5d42ee3d18064baed98b136089cf7c8221d562f058","signature":false,"impliedFormat":1},{"version":"d60f9a4fd1e734e7b79517f02622426ea1000deb7d6549dfdece043353691a4e","signature":false,"impliedFormat":1},{"version":"ec05ccc3a2e35ef2800a5b5ed2eb2ad4cd004955447bebd86883ddf49625b400","signature":false,"impliedFormat":1},{"version":"403d28b5e5f8fcff795ac038902033ec5890143e950af45bd91a3ed231e8b59c","signature":false,"impliedFormat":1},{"version":"c73b59f91088c00886d44ca296d53a75c263c3bda31e3b2f37ceb137382282be","signature":false,"impliedFormat":1},{"version":"e7aa2c584edb0970cb4bb01eb10344200286055f9a22bc3dadcc5a1f9199af3e","signature":false,"impliedFormat":1},{"version":"bfeb476eb0049185cb94c2bfcadb3ce1190554bbcf170d2bf7c68ed9bb00458e","signature":false,"impliedFormat":1},{"version":"ae23a65a2b664ffe979b0a2a98842e10bdf3af67a356f14bbc9d77eb3ab13585","signature":false,"impliedFormat":1},{"version":"2db00053dff66774bc4216209acf094dd70d9dfd8211e409fc4bd8d10f7f66f6","signature":false,"impliedFormat":1},{"version":"eccf6ad2a8624329653896e8dbd03f30756cbd902a81b5d3942d6cf0e1a21575","signature":false,"impliedFormat":1},{"version":"1930c964051c04b4b5475702613cd5a27fcc2d33057aa946ff52bfca990dbc84","signature":false,"impliedFormat":1},{"version":"762992adfa3fbf42c0bce86caed3dc185786855b21a20265089770485e6aa9d3","signature":false,"impliedFormat":1},{"version":"1dbdb9a095f0619197019e870f3481a91e9281c77b0092a19ddfd1903066cd54","signature":false,"impliedFormat":1},{"version":"62463aa3d299ae0cdc5473d2ac32213a05753c3adce87a8801c6d2b114a64116","signature":false,"impliedFormat":1},{"version":"417a23912812e5284bf14adcfc7d8a323a633d6172fa460d06a4fb9404f8ad07","signature":false,"impliedFormat":1},{"version":"bd3e38cbf8108b661c591dcd03290d5cf2f2a8a1c74b045ba6b6bf4118b0a967","signature":false,"impliedFormat":1},{"version":"1c8a792c2a585467921107e93c06086fad8ebd300004bb81c49c36fb026d9f8f","signature":false,"impliedFormat":1},{"version":"4423628def6b7993f94afbddba7dd2b0668f85f6dac83c4b8f8a578ee95524f9","signature":false,"impliedFormat":1},{"version":"f689c0633e8c95f550d36af943d775f3fae3dac81a28714b45c7af0bbb76a980","signature":false,"impliedFormat":1},{"version":"fef736cfb404b4db9aa942f377dbbac6edb76d18aabd3b647713fa75da8939e9","signature":false,"impliedFormat":1},{"version":"0495afa06118083a11cd4da27acfd96a01b989aff0fc633823c5febe9668ef15","signature":false,"impliedFormat":1},{"version":"67feb4436be89f58ba899dec57f6e703bee1bb7205ba21ab50fca237f6753787","signature":false,"impliedFormat":1},{"version":"45659c92e49dfca4601acc7e57fbb03a71513c69768984baf86ead8d20387a01","signature":false,"impliedFormat":1},{"version":"b5325ff5c9dc488bb9c87711faf2b73f639c45f190b81df88ed056807206958b","signature":false,"impliedFormat":1},{"version":"cc4f5179acd0a8efad722a44c4621d0da29169e03d78a452a27f73e1e7f27985","signature":false,"impliedFormat":1},{"version":"a743cf98667fdbb6989d9a7629d25a9824a484ce639bbf2740dc809341e6dbce","signature":false,"impliedFormat":1},{"version":"a16d79b3c260525e9637a0d224d8461305097bb255e4a53b4c3d2d08ec3463fa","signature":false,"impliedFormat":1},{"version":"bb732222ec0c3c23753dcfbafd78ea3eba480c068d5b5c28d6f12d5bc1516cf0","signature":false,"impliedFormat":1},{"version":"8fc97ef271771dc6f81a9c846d007ac4f0cb5779e3f441c1de54dfda5046fe7b","signature":false,"impliedFormat":1},{"version":"29972ec0e3b3d660f8e091d35bf5c0ef98dc52b92a1a974d1dc17b3f2ecd53f9","signature":false,"impliedFormat":1},{"version":"7b36f5bce24167f089e4d3601e5fde14f0a233e1a0954df5ec56ae07f36e2219","signature":false,"impliedFormat":1},{"version":"1c225a18846203fafc4334658715b0d3fd3ee842c4cfd42e628a535eda17730d","signature":false,"impliedFormat":1},{"version":"7ce93da38595d1caf57452d57e0733474564c2b290459d34f6e9dcf66e2d8beb","signature":false,"impliedFormat":1},{"version":"d7b672c1c583e9e34ff6df2549d6a55d7ca3adaf72e6a05081ea9ee625dac59f","signature":false,"impliedFormat":1},{"version":"f3a2902e84ebdef6525ed6bf116387a1256ea9ae8eeb36c22f070b7c9ea4cf09","signature":false,"impliedFormat":1},{"version":"33bb0d96cea9782d701332e6b7390f8efae3af92fd3e2aa2ac45e4a610e705d6","signature":false,"impliedFormat":1},{"version":"ae3e98448468e46474d817b5ebe74db11ab22c2feb60e292d96ce1a4ee963623","signature":false,"impliedFormat":1},{"version":"f0a2fdee9e801ac9320a8660dd6b8a930bf8c5b658d390ae0feafdba8b633688","signature":false,"impliedFormat":1},{"version":"7beb7f04f6186bdac5e622d44e4cac38d9f2b9fcad984b10d3762e369524dd77","signature":false,"impliedFormat":1},{"version":"28862ee675f7b2c65bc371215e859ce956efd69001c3432eccb6e97eb30581b6","signature":false,"impliedFormat":1},{"version":"b25785c35c27dbe11d3af80e39c410c62e99fe696311ec41f66fc63a7b72c70d","signature":false,"impliedFormat":1},{"version":"6bdf725d16ea924ca697673f5f0235a780e40d014ec85a711702f90cba7dbf7a","signature":false,"impliedFormat":1},{"version":"48bca78bc81b8e04de8828bc71c2f8ec84d3a74f9da7fbc0812547f112d42205","signature":false,"impliedFormat":1},{"version":"4b04d346d6c70bd266dd6159930c4c2692e29b8ad2615f0d69b31e9a855188a9","signature":false,"impliedFormat":1},{"version":"ec8612a112de68c127e84f4485dd4558a0402de4959e521b66c2addeb48c3214","signature":false,"impliedFormat":1},{"version":"4fc9b4fb61f9fd91cdbd39c25b3237cdad910d6773f1267cf73f8dad3a6148fd","signature":false,"impliedFormat":1},{"version":"154a640577fc25dd207318afa1ff794d348fa426af9b82bfcab0823e875c0581","signature":false,"impliedFormat":1},{"version":"f7351673c861e95b1dc1ecadc651a3a4f293cb2385c74fc79da06efcaff1000d","signature":false,"impliedFormat":1},{"version":"0d9bd4890cc42df9000c25c8c476bb576302e9ff1ccefd1579be0d2fb438f6fe","signature":false,"impliedFormat":1},{"version":"ef461b1e7fd4100684f1f76001f5d18eb7b5d892fbac9cc48bb357ae50a9ff8a","signature":false,"impliedFormat":1},{"version":"ab634b0105a7f4274fe445dae4312955f0b9a45112796cc59b609bcff12697df","signature":false,"impliedFormat":1},{"version":"229eacb65a8d4dab1ced3035f0caaafb12fd1432fb1c225526ce90dd29390e1d","signature":false,"impliedFormat":1},{"version":"5489535d1dd16164f7ece64aa2f41b2a94b31e5d3e644e19956f2baf85ada493","signature":false,"impliedFormat":1},{"version":"e3137f6c95be099c42057e58f5696719a6e598c0e0c715aa84ee9f919f284af2","signature":false,"impliedFormat":1},{"version":"33c2d1205420ecff7ad00bc3920b8f5cf1483c03161e986a7265e31e6eecff6f","signature":false,"impliedFormat":1},{"version":"79b1c3b9281d247ab254a33c43457813fefea9ecad79ce8844a3dc93ec9b7f71","signature":false,"impliedFormat":1},{"version":"2e9852b081bc37f6ea0b45b6ff79fee34dbcab8ca2ea98be742edde0bfa3f1fe","signature":false,"impliedFormat":1},{"version":"f4b5137998c067bcab4177e7b6136538629cddc3cf9ae6b16e5dee6ea90fbbda","signature":false,"impliedFormat":1},{"version":"cdc7cacf771325f20aa5222d087ec4d448ac029f4a63022b21915ec5fd41376c","signature":false,"impliedFormat":1},{"version":"03c92769f389dbd9e45232f7eb01c3e0f482b62555aaf2029dcbf380d5cee9e4","signature":false,"impliedFormat":1},{"version":"32d7f70fd3498bc76a46dab8b03af4215f445f490f8e213c80cf06b636a4e413","signature":false,"impliedFormat":1},{"version":"b974176fd40107e8990d224553bd94b878c613e01c6e550f6a3ad7db4daba515","signature":false,"impliedFormat":1},{"version":"17668c1aab598920796050ee5a00d961ede5e92595f6ac8908a975ed75a537e5","signature":false,"impliedFormat":1},{"version":"4a935e55663beaaa4686d8602160908476fc3b857d8b964402348f0984123d09","signature":false,"impliedFormat":1},{"version":"09d25fb38663c0801f24bd16aee356db8d8ea0982560746d70a4880fd560d396","signature":false,"impliedFormat":1},{"version":"2e73fea7f5334a30f915654631edb6dba0c3813c378622c7177b01377900db0f","signature":false,"impliedFormat":1},{"version":"9dcbf0bb871f35eee6543dae2cdbf2badb59d31892cc4127b0901cae8303e216","signature":false,"impliedFormat":1},{"version":"22f234bb8bde5d9b3892ae1a3874b47b3d913403336342e4de5b53fb17ee3756","signature":false,"impliedFormat":1},{"version":"3aa148e0e17fec838fcb837e1003cfcbdbe9e42bc46f705ff53f1a25cb90c3d0","signature":false,"impliedFormat":1},{"version":"6a78d33666ed2ba14e33b43f749824609a885b2f32ea5fc461e98d5f1c4463bb","signature":false,"impliedFormat":1},{"version":"e391bb1a7a5895e8c59838f78ccb4ae16a203627ab207ae06a666abdbc422128","signature":false,"impliedFormat":1},{"version":"064bfd80839e103607a2add9dca7067dda691eebba7602b23b1a6ccbe924fe40","signature":false,"impliedFormat":1},{"version":"cebf641bd00d117559a236e817bf76da777ed9de708ac5261253223ac5de1022","signature":false,"impliedFormat":1},{"version":"fbdc89fe728585972d7f80833f01b240d3e8198a4fea5b15937920c87aab0c2b","signature":false,"impliedFormat":1},{"version":"6c2609a6adf106f9d22af3c9179d907189b308e7266484267905d62d479c58c1","signature":false,"impliedFormat":1},{"version":"c47dd7f328f0dfb26036cce58ccd7ee4a476ed31b7d9dea56f587fd0ca2fac71","signature":false,"impliedFormat":1},{"version":"dd6fd9a2152e687b2dcb6f04441656efa1a0f73bb16cd5df162b1dd7e9081c47","signature":false,"impliedFormat":1},{"version":"1e8cb0d47e97a1f95786805ea77ed5f7cf2bd275582ffd1724e94e865de1c84f","signature":false,"impliedFormat":1},{"version":"dad0f08a62dba135bdb880baaee5424b7da8be0c12ae1b68da77d8d151c98e2e","signature":false,"impliedFormat":1},{"version":"9eb3906f72a20bcc4795b93e6029e70e497705d3694e8d09512b8f581ee9e328","signature":false,"impliedFormat":1},{"version":"393e4e4b8d241ffb9d50329b9cf9f08b8e566b96fec17b267c885e6d79aa15f3","signature":false,"impliedFormat":1},{"version":"43003db69889f26354515a563377571a80800886e64edbb1b93b4026c6124dbc","signature":false,"impliedFormat":1},{"version":"e4bb116641f1648dcf177deffa972c46dff52ba81041c6cc81e16f5ae669bc61","signature":false,"impliedFormat":1},{"version":"784dfa547f249d412c95d1790b46abc5619732104028049c57adbd69ff98f091","signature":false,"impliedFormat":1},{"version":"af89bedb15389fdc77e5795b21c05d2f250af388eab61f270018e602d963eae9","signature":false,"impliedFormat":1},{"version":"0d697e3ca7e0bb12faecabaa503ba34cd48c7c71bbf10902c0defa9b9812163e","signature":false,"impliedFormat":1},{"version":"edf0c8b27cffa7b282abc010a8f6f69981ffa43e011396b0fdbb4d1b41f07927","signature":false,"impliedFormat":1},{"version":"f23cd6c0f14e9db8c54eea8e653cfe1391fbc310323e2e6a5712a0baf52d2f1d","signature":false,"impliedFormat":1},{"version":"9b1cb55886dced580ecd21abd9d9d5a8dce020d9c5d37b8e44317201cfbbe10b","signature":false,"impliedFormat":1},{"version":"602f1bf9a90d31f18f1a910df1382cc45faf268606c473943567cde42bce5620","signature":false,"impliedFormat":1},{"version":"432af95c24d7bea6cd65c5caa37712f0a824e4984ca34a2e7d75c04e4661da10","signature":false,"impliedFormat":1},{"version":"1093c5f386035d9c2cd05ed1b1973521b248f2659965e78b50f08d6c60a0c202","signature":false,"impliedFormat":1},{"version":"761cf15bc2e2b039429da0d20a969e96017f50f2d65c57f3b32687c3ea129a90","signature":false,"impliedFormat":1},{"version":"0fa32b6a8ca58355c4116b82539b2425a6483d886088337ef59f32e477b2280b","signature":false,"impliedFormat":1},{"version":"2a180bd33bad2c74046454dadc3328a2686a8e2b71e5e3b2e18d57a2afb2d11c","signature":false,"impliedFormat":1},{"version":"33749c21dc762de49f2238911784a9cea7d61f6ddcfa3fdd5ac3a8485546f840","signature":false,"impliedFormat":1},{"version":"70398cf705e9bc3a30522d484bae6c48a5fd0c57d36abf19bba43a6ccc425410","signature":false,"impliedFormat":1},{"version":"fb161209bfcab6b9ef03b69f33875c7f2d0ac5e36ea0d40c3b782f56a16a5d23","signature":false,"impliedFormat":1},{"version":"20f5182b440508e7759ccf6ae049f4ddcb0fbb004e008723afbea0fcca2ee38a","signature":false,"impliedFormat":1},{"version":"588db963b82017dbd19be9e53a3eb90b0992b31dfec5c2a2f7bf70c78c3b5daf","signature":false,"impliedFormat":1},{"version":"86a109a97fbc1700e30f3bb44bf73230f1998c7c09bd4d4a23368be2cf5bed64","signature":false,"impliedFormat":1},{"version":"49ba0a1e1a671563b0374c07c9dc089da96c4b260577393054ee183eff199144","signature":false,"impliedFormat":1},{"version":"4b53c809241b04e960195309bd4df2175c3930abec267e6dbade6c2281864572","signature":false,"impliedFormat":1},{"version":"b49e9b8b08c5f67dccfccd89e93c118b72d88fc8773aeb295d4da62a7dad01d9","signature":false,"impliedFormat":1},{"version":"8062081c53df1ef199925920b60faae859b67d734ece6cadd88557bcbe98bd7b","signature":false,"impliedFormat":1},{"version":"3da1f5cc19f071c6f78a065e342aa50f4b895bb08d579e5de287bdb6c41cf032","signature":false,"impliedFormat":1},{"version":"ec1126a055183ac18bff2e71ef1f6d28c7aaab18579a73ded5201ccce9c1b3d7","signature":false,"impliedFormat":1},{"version":"23e21b80ed48e6ef8ec03eeca3915d77573a88666617ceb6c1dc0ae3b280f79e","signature":false,"impliedFormat":1},{"version":"ce6058dc30a93ecb3d02fbb38f0cc24589bb653143ccb7c0336139bc09587f24","signature":false,"impliedFormat":1},{"version":"c1a522919fe33de95310d5e7798b583897421ef69f3abf724901ee1350ffd4f9","signature":false,"impliedFormat":1},{"version":"53477a1815e915b8c20222a2ac8f9e3de880a1e8c8dbf9dae529b3d2e2b4a53b","signature":false,"impliedFormat":1},{"version":"972f20f4d7a2a61803355a9b1756a62d7e3142957a283ba856ee44afcaaa4ba4","signature":false,"impliedFormat":1},{"version":"2b4dc1079c95a37cfed1514cb469c21908fcea1b937e1c5b513e9d210e80e168","signature":false,"impliedFormat":1},{"version":"045a32ddd133a36083ec731ee88232e74b02419162090c2ea43d1eb46134e58f","signature":false,"impliedFormat":1},{"version":"c1a9264aa639092c472b43c34433140b4dfe473956a722c42e2c3a3c4394e3e3","signature":false,"impliedFormat":1},{"version":"f49f1eac20101de4fd348afee6480cdc9081076426e549c9695017b910c64d68","signature":false,"impliedFormat":1},{"version":"8c7b8e860b4d6564ca981d71de2cefb8a552cbd466094485b1fed3bd8e0caa5d","signature":false,"impliedFormat":1},{"version":"bfc8a671435d9c0fd49102b3f3de1e1bb5e4f19d6fad18466da390e61bd6b9de","signature":false,"impliedFormat":1},{"version":"aba8e975f43c585c1f322dd0ab55a3031ec1ae7eb253d79346db0583995fae3a","signature":false,"impliedFormat":1},{"version":"998f3347442da4489550d52b838a23755d717378e0c619e2243886894caff72d","signature":false,"impliedFormat":1},{"version":"4f7de6575c1a6c9490bdb16a20c0be80f82922ad0ccc90bf4480759bc89ca578","signature":false,"impliedFormat":1},{"version":"3b298b5f0a5fd49976f95a521555db121c21a2b3aaf2c2f4845f4577c266fe6c","signature":false,"impliedFormat":1}],"root":[[717,719],750,751,876,[888,891],[914,922],[976,992],1007,[1130,1137],[1182,1201],1204,[1206,1252],[1255,1264]],"options":{"allowSyntheticDefaultImports":true,"assumeChangesOnlyAffectDirectDependencies":true,"emitDeclarationOnly":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"exactOptionalPropertyTypes":false,"experimentalDecorators":true,"module":100,"noFallthroughCasesInSwitch":false,"noImplicitAny":false,"noImplicitReturns":false,"noPropertyAccessFromIndexSignature":false,"noUncheckedIndexedAccess":false,"noUnusedLocals":false,"noUnusedParameters":false,"skipDefaultLibCheck":true,"skipLibCheck":true,"strict":false,"strictNullChecks":false,"strictPropertyInitialization":false,"target":11,"tsBuildInfoFile":"./.tsbuildinfo-minimal"},"referencedMap":[[1252,1],[1256,2],[718,3],[717,4],[977,5],[1243,6],[719,7],[1255,8],[1251,9],[1208,10],[750,11],[989,11],[751,12],[1184,13],[1186,14],[1185,15],[1183,13],[1246,16],[986,17],[1194,18],[914,19],[1196,20],[888,21],[1210,22],[1132,23],[1007,24],[1209,25],[1131,26],[1130,11],[1245,27],[1244,28],[876,29],[1200,30],[1199,31],[1198,11],[1201,32],[1230,11],[1248,33],[1247,34],[1193,35],[980,36],[978,37],[979,37],[976,38],[915,39],[918,40],[890,41],[916,42],[921,43],[919,42],[920,44],[917,42],[891,45],[889,11],[1192,46],[922,47],[1257,48],[1189,49],[1187,50],[1211,51],[1135,52],[1190,53],[1182,12],[1188,54],[1137,55],[1207,56],[1258,57],[1136,57],[988,58],[990,59],[1133,60],[992,61],[1134,62],[1204,63],[1206,64],[987,11],[991,11],[1260,65],[1261,66],[1259,12],[1216,67],[1217,68],[1212,69],[1213,70],[1214,71],[1215,72],[1249,73],[1250,74],[982,75],[1195,76],[984,77],[981,5],[983,78],[1234,79],[1235,80],[1233,81],[1264,82],[1262,12],[1263,83],[1223,84],[1232,85],[1231,86],[1229,87],[1219,88],[1226,12],[1228,89],[1224,90],[1220,91],[1222,92],[1218,93],[1225,94],[1227,95],[1221,11],[1238,96],[1240,97],[1241,98],[1237,99],[1239,100],[1242,101],[1236,81],[1191,102],[1197,103],[985,104],[1008,11],[1009,11],[1011,105],[1010,11],[1012,106],[1013,107],[1016,108],[1014,11],[1015,109],[1115,110],[1121,111],[1105,112],[1122,113],[1098,114],[1114,115],[1106,12],[1107,12],[1108,116],[1109,116],[1111,117],[1113,118],[1118,119],[1116,120],[1117,116],[1129,121],[1123,122],[1119,116],[1099,123],[1104,124],[1112,125],[1120,125],[1101,126],[1102,127],[1103,120],[1110,125],[1125,11],[1124,11],[1126,11],[1127,11],[1128,128],[1100,11],[424,11],[335,11],[73,11],[324,129],[325,129],[326,11],[327,12],[337,130],[328,129],[329,131],[330,11],[331,11],[332,129],[333,129],[334,129],[336,132],[344,133],[346,11],[343,11],[349,134],[347,11],[345,11],[341,135],[342,136],[348,11],[350,137],[338,11],[340,138],[339,139],[279,11],[282,140],[278,11],[471,11],[280,11],[281,11],[353,141],[354,141],[355,141],[356,141],[357,141],[358,141],[359,141],[352,142],[360,141],[374,143],[361,141],[351,11],[362,141],[363,141],[364,141],[365,141],[366,141],[367,141],[368,141],[369,141],[370,141],[371,141],[372,141],[373,141],[382,144],[380,145],[379,11],[378,11],[381,146],[421,147],[74,11],[75,11],[76,11],[453,148],[78,149],[459,150],[458,151],[268,152],[269,149],[401,11],[298,11],[299,11],[402,153],[270,11],[403,11],[404,154],[77,11],[272,155],[273,156],[271,157],[274,155],[275,11],[277,158],[289,159],[290,11],[295,160],[291,11],[292,11],[293,11],[294,11],[296,11],[297,161],[303,162],[306,163],[304,11],[305,11],[323,164],[307,11],[308,11],[502,165],[288,166],[286,167],[284,168],[285,169],[287,11],[315,170],[309,11],[318,171],[311,172],[316,173],[314,174],[317,175],[312,176],[313,177],[301,178],[319,179],[302,180],[321,181],[322,182],[310,11],[276,11],[283,183],[320,184],[388,185],[383,11],[389,186],[384,187],[385,188],[386,189],[387,190],[390,191],[394,192],[393,193],[400,194],[391,11],[392,195],[395,192],[397,196],[399,197],[398,198],[413,199],[406,200],[407,201],[408,201],[409,202],[410,202],[411,201],[412,201],[405,203],[415,204],[414,205],[417,206],[416,207],[418,208],[375,209],[377,210],[300,11],[376,178],[419,211],[396,212],[420,213],[515,12],[630,214],[631,215],[635,216],[516,11],[522,217],[628,218],[629,219],[517,11],[518,11],[521,220],[519,11],[520,11],[633,11],[634,221],[632,222],[636,223],[422,224],[423,225],[444,226],[445,227],[446,11],[447,228],[448,229],[457,230],[450,231],[454,232],[462,233],[460,12],[461,234],[451,235],[463,11],[465,236],[466,237],[467,238],[456,239],[452,240],[476,241],[464,242],[491,243],[449,244],[492,245],[489,246],[490,12],[514,247],[439,248],[435,249],[437,250],[488,251],[430,252],[478,253],[477,11],[438,254],[485,255],[442,256],[486,11],[487,257],[440,258],[441,259],[436,260],[434,261],[429,11],[482,262],[495,263],[493,12],[425,12],[481,264],[426,136],[427,227],[428,265],[432,266],[431,267],[494,268],[433,269],[470,270],[468,236],[469,271],[479,136],[480,272],[483,273],[498,274],[499,275],[496,276],[497,277],[500,278],[501,279],[503,280],[475,281],[472,282],[473,129],[474,271],[505,283],[504,284],[511,285],[443,12],[507,286],[506,12],[509,287],[508,11],[510,288],[455,289],[484,290],[513,291],[512,12],[726,292],[722,293],[721,294],[723,11],[724,295],[725,296],[727,297],[728,11],[732,298],[747,299],[729,12],[731,300],[730,11],[733,301],[745,302],[746,303],[748,304],[1138,11],[1139,11],[1142,305],[1164,306],[1143,11],[1144,11],[1145,12],[1147,11],[1146,11],[1165,11],[1148,11],[1149,307],[1150,11],[1151,12],[1152,11],[1153,308],[1155,309],[1156,11],[1158,310],[1159,309],[1160,311],[1166,312],[1161,308],[1162,11],[1167,313],[1172,314],[1181,315],[1163,11],[1154,308],[1171,316],[1140,11],[1157,317],[1169,318],[1170,11],[1168,11],[1173,319],[1178,320],[1174,12],[1175,12],[1176,12],[1177,12],[1141,11],[1179,11],[1180,321],[649,322],[640,323],[646,11],[637,11],[638,324],[641,325],[642,12],[643,326],[639,327],[644,328],[645,329],[647,330],[648,11],[874,331],[873,332],[875,333],[872,11],[1004,334],[1003,335],[1001,336],[1002,337],[993,11],[994,11],[999,338],[996,339],[995,340],[1000,341],[998,11],[997,11],[1006,342],[1005,343],[749,344],[742,345],[741,346],[1254,53],[738,347],[743,348],[739,11],[975,349],[720,350],[734,11],[974,11],[574,351],[575,351],[576,352],[525,353],[577,354],[578,355],[579,356],[523,11],[580,357],[581,358],[582,359],[583,360],[584,361],[585,362],[586,362],[587,363],[588,364],[589,365],[590,366],[526,11],[524,11],[591,367],[592,368],[593,369],[626,370],[594,371],[595,372],[596,373],[597,374],[598,375],[599,376],[600,377],[601,378],[602,379],[603,380],[604,380],[605,381],[606,11],[607,11],[608,382],[610,383],[609,384],[611,385],[612,386],[613,387],[614,388],[615,389],[616,390],[617,391],[618,392],[619,393],[620,394],[621,395],[622,396],[623,397],[527,11],[528,11],[529,11],[571,398],[572,11],[573,11],[624,399],[625,400],[1203,401],[1205,402],[1202,403],[744,404],[736,11],[737,11],[735,405],[740,406],[530,11],[1017,11],[1033,407],[1071,408],[1072,409],[1070,410],[1073,11],[1078,411],[1074,11],[1075,11],[1076,11],[1077,11],[1084,412],[1094,413],[1085,414],[1083,415],[1081,416],[1086,417],[1082,418],[1087,419],[1056,11],[1089,420],[1080,421],[1088,414],[1090,422],[1079,423],[1093,424],[1044,11],[1045,11],[1048,425],[1046,11],[1036,11],[1047,11],[1097,426],[1035,427],[1018,11],[1024,428],[1037,429],[1038,430],[1051,431],[1069,432],[1052,11],[1029,433],[1053,434],[1019,11],[1054,11],[1055,11],[1031,435],[1058,436],[1059,437],[1020,11],[1028,438],[1050,439],[1060,11],[1068,11],[1043,440],[1061,11],[1023,441],[1062,11],[1063,11],[1065,442],[1064,443],[1066,444],[1057,445],[1049,446],[1067,447],[1032,448],[1025,11],[1039,11],[1042,449],[1030,450],[1026,451],[1027,11],[1040,438],[1041,452],[1092,453],[1034,454],[1096,455],[1095,456],[1021,11],[1022,457],[908,11],[627,344],[927,458],[1253,459],[893,460],[910,461],[912,462],[911,463],[894,464],[909,465],[906,466],[907,467],[905,468],[898,469],[899,470],[901,471],[902,472],[900,473],[903,474],[913,475],[904,476],[896,477],[892,478],[897,479],[895,460],[973,480],[925,11],[951,481],[950,11],[952,482],[947,483],[953,484],[954,485],[956,486],[955,11],[958,487],[957,11],[960,488],[959,11],[961,489],[969,490],[939,491],[962,492],[971,493],[943,11],[972,494],[970,495],[938,496],[949,482],[944,497],[946,482],[945,485],[941,498],[964,499],[967,500],[965,500],[968,501],[966,499],[963,502],[940,503],[948,504],[942,11],[936,505],[928,506],[935,507],[930,508],[931,509],[929,510],[932,11],[933,511],[926,11],[937,11],[934,464],[923,11],[924,11],[885,512],[884,513],[886,514],[882,515],[883,516],[887,517],[881,518],[1091,11],[880,519],[877,346],[879,520],[72,11],[267,521],[240,11],[218,522],[216,522],[131,523],[82,524],[81,525],[217,526],[202,527],[124,528],[80,529],[79,530],[266,525],[231,531],[230,531],[142,532],[238,523],[239,523],[241,533],[242,523],[243,530],[244,523],[215,523],[245,523],[246,534],[247,523],[248,531],[249,535],[250,523],[251,523],[252,523],[253,523],[254,531],[255,523],[256,523],[257,523],[258,523],[259,536],[260,523],[261,523],[262,523],[263,523],[264,523],[84,530],[85,530],[86,530],[87,530],[88,530],[89,530],[90,530],[91,523],[93,537],[94,530],[92,530],[95,530],[96,530],[97,530],[98,530],[99,530],[100,530],[101,523],[102,530],[103,530],[104,530],[105,530],[106,530],[107,523],[108,530],[109,530],[110,530],[111,530],[112,530],[113,530],[114,523],[116,538],[115,530],[117,530],[118,530],[119,530],[120,530],[121,536],[122,523],[123,523],[137,539],[125,540],[126,530],[127,530],[128,523],[129,530],[130,530],[132,541],[133,530],[134,530],[135,530],[136,530],[138,530],[139,530],[140,530],[141,530],[143,542],[144,530],[145,530],[146,530],[147,523],[148,530],[149,543],[150,543],[151,543],[152,523],[153,530],[154,530],[155,530],[160,530],[156,530],[157,523],[158,530],[159,523],[161,530],[162,530],[163,530],[164,530],[165,530],[166,530],[167,523],[168,530],[169,530],[170,530],[171,530],[172,530],[173,530],[174,530],[175,530],[176,530],[177,530],[178,530],[179,530],[180,530],[181,530],[182,530],[183,530],[184,544],[185,530],[186,530],[187,530],[188,530],[189,530],[190,530],[191,523],[192,523],[193,523],[194,523],[195,523],[196,530],[197,530],[198,530],[199,530],[265,523],[201,545],[224,546],[219,546],[210,547],[208,548],[222,549],[211,550],[225,551],[220,552],[221,549],[223,553],[209,11],[214,11],[206,554],[207,555],[204,11],[205,556],[203,530],[212,557],[83,558],[232,11],[233,11],[234,11],[235,11],[236,11],[237,11],[226,11],[229,531],[228,11],[227,559],[200,560],[213,561],[878,491],[70,11],[71,11],[13,11],[12,11],[2,11],[14,11],[15,11],[16,11],[17,11],[18,11],[19,11],[20,11],[21,11],[3,11],[22,11],[23,11],[4,11],[24,11],[28,11],[25,11],[26,11],[27,11],[29,11],[30,11],[31,11],[5,11],[32,11],[33,11],[34,11],[35,11],[6,11],[39,11],[36,11],[37,11],[38,11],[40,11],[7,11],[41,11],[46,11],[47,11],[42,11],[43,11],[44,11],[45,11],[8,11],[51,11],[48,11],[49,11],[50,11],[52,11],[9,11],[53,11],[54,11],[55,11],[57,11],[56,11],[58,11],[59,11],[10,11],[60,11],[61,11],[62,11],[11,11],[63,11],[64,11],[65,11],[66,11],[67,11],[1,11],[68,11],[69,11],[548,562],[559,563],[546,564],[560,565],[569,566],[537,567],[538,568],[536,569],[568,344],[563,570],[567,571],[540,572],[556,573],[539,574],[566,575],[534,576],[535,570],[541,577],[542,11],[547,578],[545,577],[532,579],[570,580],[561,581],[551,582],[550,577],[552,583],[554,584],[549,585],[553,586],[564,344],[543,587],[544,588],[555,589],[533,565],[558,590],[557,577],[562,11],[531,11],[565,591],[716,592],[711,593],[714,594],[712,594],[708,593],[715,595],[713,594],[709,596],[710,597],[704,598],[654,599],[656,600],[703,11],[655,601],[707,602],[705,11],[657,599],[658,11],[702,603],[653,604],[650,11],[706,605],[651,606],[652,11],[659,607],[660,607],[661,607],[662,607],[663,607],[664,607],[665,607],[666,607],[667,607],[668,607],[669,607],[670,607],[672,607],[671,607],[673,607],[674,607],[675,607],[701,608],[676,607],[677,607],[678,607],[679,607],[680,607],[681,607],[682,607],[683,607],[684,607],[685,607],[687,607],[686,607],[688,607],[689,607],[690,607],[691,607],[692,607],[693,607],[694,607],[695,607],[696,607],[697,607],[700,607],[698,607],[699,607],[866,609],[867,610],[870,611],[869,612],[752,11],[768,11],[769,11],[770,613],[759,11],[757,614],[763,615],[764,616],[758,617],[766,618],[755,614],[762,619],[756,620],[761,11],[760,11],[765,614],[753,620],[767,621],[754,11],[871,622],[776,11],[777,11],[779,623],[778,11],[772,11],[774,11],[773,11],[775,624],[868,620],[771,11],[856,625],[863,626],[862,625],[864,627],[857,628],[859,628],[858,628],[861,625],[860,628],[865,629],[853,625],[852,625],[855,630],[851,625],[854,625],[850,631],[845,632],[848,633],[846,633],[842,632],[849,634],[847,633],[843,635],[844,636],[838,637],[784,638],[786,639],[837,11],[785,640],[841,641],[839,11],[787,638],[788,11],[836,642],[783,643],[780,11],[840,644],[781,645],[782,11],[789,646],[790,646],[791,646],[792,646],[793,646],[794,646],[795,646],[796,646],[797,646],[798,646],[799,646],[800,646],[802,646],[801,646],[803,646],[804,646],[805,646],[835,647],[806,646],[807,646],[808,646],[809,646],[810,646],[811,646],[812,646],[813,646],[814,646],[815,646],[816,646],[817,646],[818,646],[820,646],[819,646],[821,646],[822,646],[823,646],[824,646],[825,646],[826,646],[827,646],[828,646],[829,646],[830,646],[831,646],[834,646],[832,646],[833,646]],"changeFileSet":[1252,1256,718,717,977,1243,719,1255,1251,1208,750,989,751,1184,1186,1185,1183,1246,986,1194,914,1196,888,1210,1132,1007,1209,1131,1130,1245,1244,876,1200,1199,1198,1201,1230,1248,1247,1193,980,978,979,976,915,918,890,916,921,919,920,917,891,889,1192,922,1257,1189,1187,1211,1135,1190,1182,1188,1137,1207,1258,1136,988,990,1133,992,1134,1204,1206,987,991,1260,1261,1259,1216,1217,1212,1213,1214,1215,1249,1250,982,1195,984,981,983,1234,1235,1233,1264,1262,1263,1223,1232,1231,1229,1219,1226,1228,1224,1220,1222,1218,1225,1227,1221,1238,1240,1241,1237,1239,1242,1236,1191,1197,985,1008,1009,1011,1010,1012,1013,1016,1014,1015,1115,1121,1105,1122,1098,1114,1106,1107,1108,1109,1111,1113,1118,1116,1117,1129,1123,1119,1099,1104,1112,1120,1101,1102,1103,1110,1125,1124,1126,1127,1128,1100,424,335,73,324,325,326,327,337,328,329,330,331,332,333,334,336,344,346,343,349,347,345,341,342,348,350,338,340,339,279,282,278,471,280,281,353,354,355,356,357,358,359,352,360,374,361,351,362,363,364,365,366,367,368,369,370,371,372,373,382,380,379,378,381,421,74,75,76,453,78,459,458,268,269,401,298,299,402,270,403,404,77,272,273,271,274,275,277,289,290,295,291,292,293,294,296,297,303,306,304,305,323,307,308,502,288,286,284,285,287,315,309,318,311,316,314,317,312,313,301,319,302,321,322,310,276,283,320,388,383,389,384,385,386,387,390,394,393,400,391,392,395,397,399,398,413,406,407,408,409,410,411,412,405,415,414,417,416,418,375,377,300,376,419,396,420,515,630,631,635,516,522,628,629,517,518,521,519,520,633,634,632,636,422,423,444,445,446,447,448,457,450,454,462,460,461,451,463,465,466,467,456,452,476,464,491,449,492,489,490,514,439,435,437,488,430,478,477,438,485,442,486,487,440,441,436,434,429,482,495,493,425,481,426,427,428,432,431,494,433,470,468,469,479,480,483,498,499,496,497,500,501,503,475,472,473,474,505,504,511,443,507,506,509,508,510,455,484,513,512,726,722,721,723,724,725,727,728,732,747,729,731,730,733,745,746,748,1138,1139,1142,1164,1143,1144,1145,1147,1146,1165,1148,1149,1150,1151,1152,1153,1155,1156,1158,1159,1160,1166,1161,1162,1167,1172,1181,1163,1154,1171,1140,1157,1169,1170,1168,1173,1178,1174,1175,1176,1177,1141,1179,1180,649,640,646,637,638,641,642,643,639,644,645,647,648,874,873,875,872,1004,1003,1001,1002,993,994,999,996,995,1000,998,997,1006,1005,749,742,741,1254,738,743,739,975,720,734,974,574,575,576,525,577,578,579,523,580,581,582,583,584,585,586,587,588,589,590,526,524,591,592,593,626,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,610,609,611,612,613,614,615,616,617,618,619,620,621,622,623,527,528,529,571,572,573,624,625,1203,1205,1202,744,736,737,735,740,530,1017,1033,1071,1072,1070,1073,1078,1074,1075,1076,1077,1084,1094,1085,1083,1081,1086,1082,1087,1056,1089,1080,1088,1090,1079,1093,1044,1045,1048,1046,1036,1047,1097,1035,1018,1024,1037,1038,1051,1069,1052,1029,1053,1019,1054,1055,1031,1058,1059,1020,1028,1050,1060,1068,1043,1061,1023,1062,1063,1065,1064,1066,1057,1049,1067,1032,1025,1039,1042,1030,1026,1027,1040,1041,1092,1034,1096,1095,1021,1022,908,627,927,1253,893,910,912,911,894,909,906,907,905,898,899,901,902,900,903,913,904,896,892,897,895,973,925,951,950,952,947,953,954,956,955,958,957,960,959,961,969,939,962,971,943,972,970,938,949,944,946,945,941,964,967,965,968,966,963,940,948,942,936,928,935,930,931,929,932,933,926,937,934,923,924,885,884,886,882,883,887,881,1091,880,877,879,72,267,240,218,216,131,82,81,217,202,124,80,79,266,231,230,142,238,239,241,242,243,244,215,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,84,85,86,87,88,89,90,91,93,94,92,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,115,117,118,119,120,121,122,123,137,125,126,127,128,129,130,132,133,134,135,136,138,139,140,141,143,144,145,146,147,148,149,150,151,152,153,154,155,160,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,265,201,224,219,210,208,222,211,225,220,221,223,209,214,206,207,204,205,203,212,83,232,233,234,235,236,237,226,229,228,227,200,213,878,70,71,13,12,2,14,15,16,17,18,19,20,21,3,22,23,4,24,28,25,26,27,29,30,31,5,32,33,34,35,6,39,36,37,38,40,7,41,46,47,42,43,44,45,8,51,48,49,50,52,9,53,54,55,57,56,58,59,10,60,61,62,11,63,64,65,66,67,1,68,69,548,559,546,560,569,537,538,536,568,563,567,540,556,539,566,534,535,541,542,547,545,532,570,561,551,550,552,554,549,553,564,543,544,555,533,558,557,562,531,565,716,711,714,712,708,715,713,709,710,704,654,656,703,655,707,705,657,658,702,653,650,706,651,652,659,660,661,662,663,664,665,666,667,668,669,670,672,671,673,674,675,701,676,677,678,679,680,681,682,683,684,685,687,686,688,689,690,691,692,693,694,695,696,697,700,698,699,866,867,870,869,752,768,769,770,759,757,763,764,758,766,755,762,756,761,760,765,753,767,754,871,776,777,779,778,772,774,773,775,868,771,856,863,862,864,857,859,858,861,860,865,853,852,855,851,854,850,845,848,846,842,849,847,843,844,838,784,786,837,785,841,839,787,788,836,783,780,840,781,782,789,790,791,792,793,794,795,796,797,798,799,800,802,801,803,804,805,835,806,807,808,809,810,811,812,813,814,815,816,817,818,820,819,821,822,823,824,825,826,827,828,829,830,831,834,832,833],"version":"5.9.2"} \ No newline at end of file diff --git a/apps/bff/package.json b/apps/bff/package.json index ef86e509..819bb7c6 100644 --- a/apps/bff/package.json +++ b/apps/bff/package.json @@ -19,18 +19,20 @@ "test:cov": "NODE_OPTIONS=\"--max-old-space-size=4096\" jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "NODE_OPTIONS=\"--max-old-space-size=4096\" jest --config ./test/jest-e2e.json", - "type-check": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsc --noEmit", + "type-check": "NODE_OPTIONS=\"--max-old-space-size=7168 --max-semi-space-size=256\" tsc --project tsconfig.json --noEmit", + "type-check:watch": "NODE_OPTIONS=\"--max-old-space-size=7168 --max-semi-space-size=256\" tsc --project tsconfig.json --noEmit --watch", "clean": "rm -rf dist", "db:migrate": "prisma migrate dev", "db:generate": "prisma generate", "db:studio": "prisma studio", "db:reset": "prisma migrate reset", - "db:seed": "NODE_OPTIONS=\"--max-old-space-size=4096\" ts-node prisma/seed.ts", - "openapi:gen": "NODE_OPTIONS=\"--max-old-space-size=4096\" TS_NODE_TRANSPILE_ONLY=1 ts-node -r tsconfig-paths/register ./scripts/generate-openapi.ts" + "db:seed": "NODE_OPTIONS=\"--max-old-space-size=4096\" tsx prisma/seed.ts", + "openapi:gen": "NODE_OPTIONS=\"--max-old-space-size=4096\" tsx -r tsconfig-paths/register ./scripts/generate-openapi.ts" }, "dependencies": { "@customer-portal/domain": "workspace:*", "@customer-portal/logging": "workspace:*", + "@customer-portal/validation-service": "workspace:*", "@nestjs/bullmq": "^11.0.3", "@nestjs/common": "^11.1.6", "@nestjs/config": "^4.0.2", @@ -86,6 +88,7 @@ "source-map-support": "^0.5.21", "supertest": "^7.1.4", "ts-jest": "^29.4.1", + "tsx": "^4.19.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typescript": "^5.9.2" @@ -98,8 +101,16 @@ ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", + "maxWorkers": "50%", "transform": { - "^.+\\.(t|j)s$": "ts-jest" + "^.+\\.(t|j)s$": [ + "ts-jest", + { + "diagnostics": false, + "isolatedModules": true, + "tsconfig": { "isolatedModules": true } + } + ] }, "collectCoverageFrom": [ "**/*.(t|j)s", diff --git a/apps/bff/src/core/utils/validation.util.ts b/apps/bff/src/core/utils/validation.util.ts index 8e07de26..5ba7008d 100644 --- a/apps/bff/src/core/utils/validation.util.ts +++ b/apps/bff/src/core/utils/validation.util.ts @@ -1,21 +1,24 @@ +import { z } from 'zod'; import { BadRequestException } from "@nestjs/common"; +// Simple Zod schemas for common validations +export const emailSchema = z.string().email().transform(email => email.toLowerCase().trim()); +export const uuidSchema = z.string().uuid(); + export function normalizeAndValidateEmail(email: string): string { - const trimmed = email?.toLowerCase().trim(); - if (!trimmed) throw new BadRequestException("Email is required"); - if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed)) { + try { + return emailSchema.parse(email); + } catch (error) { throw new BadRequestException("Invalid email format"); } - return trimmed; } export function validateUuidV4OrThrow(id: string): string { - const trimmed = id?.trim(); - if (!trimmed) throw new Error("User ID is required"); - if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(trimmed)) { + try { + return uuidSchema.parse(id); + } catch (error) { throw new Error("Invalid user ID format"); } - return trimmed; } diff --git a/apps/bff/src/core/validation/index.ts b/apps/bff/src/core/validation/index.ts index 7d5ead37..fa15410d 100644 --- a/apps/bff/src/core/validation/index.ts +++ b/apps/bff/src/core/validation/index.ts @@ -1,7 +1,6 @@ /** * Validation Module Exports - * Zod-based validation system for BFF + * Simple Zod validation using validation-service */ -export { ZodValidationPipe, ZodPipe, ValidateZod } from './zod-validation.pipe'; -export { ValidationModule } from './validation.module'; +export { ZodPipe, createZodPipe } from '@customer-portal/validation-service/nestjs'; diff --git a/apps/bff/src/core/validation/validation.module.ts b/apps/bff/src/core/validation/validation.module.ts deleted file mode 100644 index ead58abb..00000000 --- a/apps/bff/src/core/validation/validation.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module, Global } from '@nestjs/common'; -import { ZodValidationPipe } from './zod-validation.pipe'; - -/** - * Global validation module providing Zod-based validation - * Replaces class-validator with domain-driven Zod schemas - */ -@Global() -@Module({ - providers: [ZodValidationPipe], - exports: [ZodValidationPipe], -}) -export class ValidationModule {} diff --git a/apps/bff/src/core/validation/zod-validation.pipe.ts b/apps/bff/src/core/validation/zod-validation.pipe.ts deleted file mode 100644 index e2b8417a..00000000 --- a/apps/bff/src/core/validation/zod-validation.pipe.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { PipeTransform, Injectable, BadRequestException, ArgumentMetadata } from '@nestjs/common'; -import { ZodSchema, ZodError } from 'zod'; - -/** - * Zod validation pipe for NestJS - * Replaces class-validator DTOs with Zod schema validation - */ -@Injectable() -export class ZodValidationPipe implements PipeTransform { - constructor(private schema: ZodSchema) {} - - transform(value: unknown, metadata: ArgumentMetadata) { - try { - const parsedValue = this.schema.parse(value); - return parsedValue; - } catch (error) { - if (error instanceof ZodError) { - const errorMessages = error.issues.map(err => { - const path = err.path.join('.'); - return path ? `${path}: ${err.message}` : err.message; - }); - - throw new BadRequestException({ - message: 'Validation failed', - errors: errorMessages, - statusCode: 400, - }); - } - throw new BadRequestException('Validation failed'); - } - } -} - -/** - * Factory function to create Zod validation pipe - */ -export const ZodPipe = (schema: ZodSchema) => new ZodValidationPipe(schema); - -/** - * Decorator for easy use with controllers - */ -export const ValidateZod = (schema: ZodSchema) => { - return (target: any, propertyKey: string, parameterIndex: number) => { - // This would be used with @Body(ValidateZod(schema)) - // For now, we'll use the pipe directly - }; -}; diff --git a/apps/bff/src/modules/auth/auth-zod.controller.ts b/apps/bff/src/modules/auth/auth-zod.controller.ts index f5e521d1..118a6258 100644 --- a/apps/bff/src/modules/auth/auth-zod.controller.ts +++ b/apps/bff/src/modules/auth/auth-zod.controller.ts @@ -10,28 +10,28 @@ import { ZodPipe } from "@bff/core/validation"; // Import Zod schemas from domain import { - bffSignupSchema, - bffLoginSchema, - bffPasswordResetRequestSchema, - bffPasswordResetSchema, - bffSetPasswordSchema, - bffLinkWhmcsSchema, - bffChangePasswordSchema, - bffValidateSignupSchema, - bffAccountStatusRequestSchema, - bffSsoLinkSchema, - bffCheckPasswordNeededSchema, - type BffSignupData, - type BffLoginData, - type BffPasswordResetRequestData, - type BffPasswordResetData, - type BffSetPasswordData, - type BffLinkWhmcsData, - type BffChangePasswordData, - type BffValidateSignupData, - type BffAccountStatusRequestData, - type BffSsoLinkData, - type BffCheckPasswordNeededData, + signupRequestSchema, + loginRequestSchema, + passwordResetRequestSchema, + passwordResetSchema, + setPasswordRequestSchema, + linkWhmcsRequestSchema, + changePasswordRequestSchema, + validateSignupRequestSchema, + accountStatusRequestSchema, + ssoLinkRequestSchema, + checkPasswordNeededRequestSchema, + type SignupRequestInput, + type LoginRequestInput, + type PasswordResetRequestInput, + type PasswordResetInput, + type SetPasswordRequestInput, + type LinkWhmcsRequestInput, + type ChangePasswordRequestInput, + type ValidateSignupRequestInput, + type AccountStatusRequestInput, + type SsoLinkRequestInput, + type CheckPasswordNeededRequestInput, } from "@customer-portal/domain"; @ApiTags("auth") @@ -49,7 +49,7 @@ export class AuthZodController { @ApiResponse({ status: 400, description: "Customer number not found" }) @ApiResponse({ status: 429, description: "Too many validation attempts" }) async validateSignup( - @Body(ZodPipe(bffValidateSignupSchema)) validateData: BffValidateSignupData, + @Body(ZodPipe(validateSignupRequestSchema)) validateData: ValidateSignupRequestInput, @Req() req: Request ) { return this.authService.validateSignup(validateData, req); @@ -70,7 +70,7 @@ export class AuthZodController { @HttpCode(200) @ApiOperation({ summary: "Validate full signup data without creating anything" }) @ApiResponse({ status: 200, description: "Preflight results with next action guidance" }) - async signupPreflight(@Body(ZodPipe(bffSignupSchema)) signupData: BffSignupData) { + async signupPreflight(@Body(ZodPipe(signupRequestSchema)) signupData: SignupRequestInput) { return this.authService.signupPreflight(signupData); } @@ -78,7 +78,7 @@ export class AuthZodController { @Post("account-status") @ApiOperation({ summary: "Get account status by email" }) @ApiOkResponse({ description: "Account status" }) - async accountStatus(@Body(ZodPipe(bffAccountStatusRequestSchema)) body: BffAccountStatusRequestData) { + async accountStatus(@Body(ZodPipe(accountStatusRequestSchema)) body: AccountStatusRequestInput) { return this.authService.getAccountStatus(body.email); } @@ -90,7 +90,7 @@ export class AuthZodController { @ApiResponse({ status: 201, description: "User created successfully" }) @ApiResponse({ status: 409, description: "User already exists" }) @ApiResponse({ status: 429, description: "Too many signup attempts" }) - async signup(@Body(ZodPipe(bffSignupSchema)) signupData: BffSignupData, @Req() req: Request) { + async signup(@Body(ZodPipe(signupRequestSchema)) signupData: SignupRequestInput, @Req() req: Request) { return this.authService.signup(signupData, req); } @@ -131,7 +131,7 @@ export class AuthZodController { }) @ApiResponse({ status: 401, description: "Invalid WHMCS credentials" }) @ApiResponse({ status: 429, description: "Too many link attempts" }) - async linkWhmcs(@Body(ZodPipe(bffLinkWhmcsSchema)) linkData: BffLinkWhmcsData, @Req() _req: Request) { + async linkWhmcs(@Body(ZodPipe(linkWhmcsRequestSchema)) linkData: LinkWhmcsRequestInput, @Req() _req: Request) { return this.authService.linkWhmcsUser(linkData); } @@ -143,7 +143,7 @@ export class AuthZodController { @ApiResponse({ status: 200, description: "Password set successfully" }) @ApiResponse({ status: 401, description: "User not found" }) @ApiResponse({ status: 429, description: "Too many password attempts" }) - async setPassword(@Body(ZodPipe(bffSetPasswordSchema)) setPasswordData: BffSetPasswordData, @Req() _req: Request) { + async setPassword(@Body(ZodPipe(setPasswordRequestSchema)) setPasswordData: SetPasswordRequestInput, @Req() _req: Request) { return this.authService.setPassword(setPasswordData); } @@ -152,7 +152,7 @@ export class AuthZodController { @HttpCode(200) @ApiOperation({ summary: "Check if user needs to set password" }) @ApiResponse({ status: 200, description: "Password status checked" }) - async checkPasswordNeeded(@Body(ZodPipe(bffCheckPasswordNeededSchema)) data: BffCheckPasswordNeededData) { + async checkPasswordNeeded(@Body(ZodPipe(checkPasswordNeededRequestSchema)) data: CheckPasswordNeededRequestInput) { return this.authService.checkPasswordNeeded(data.email); } @@ -161,7 +161,7 @@ export class AuthZodController { @Throttle({ default: { limit: 5, ttl: 900000 } }) @ApiOperation({ summary: "Request password reset email" }) @ApiResponse({ status: 200, description: "Reset email sent if account exists" }) - async requestPasswordReset(@Body(ZodPipe(bffPasswordResetRequestSchema)) body: BffPasswordResetRequestData) { + async requestPasswordReset(@Body(ZodPipe(passwordResetRequestSchema)) body: PasswordResetRequestInput) { await this.authService.requestPasswordReset(body.email); return { message: "If an account exists, a reset email has been sent" }; } @@ -171,7 +171,7 @@ export class AuthZodController { @Throttle({ default: { limit: 5, ttl: 900000 } }) @ApiOperation({ summary: "Reset password with token" }) @ApiResponse({ status: 200, description: "Password reset successful" }) - async resetPassword(@Body(ZodPipe(bffPasswordResetSchema)) body: BffPasswordResetData) { + async resetPassword(@Body(ZodPipe(passwordResetSchema)) body: PasswordResetInput) { return this.authService.resetPassword(body.token, body.password); } @@ -181,7 +181,7 @@ export class AuthZodController { @ApiResponse({ status: 200, description: "Password changed successfully" }) async changePassword( @Req() req: Request & { user: { id: string } }, - @Body(ZodPipe(bffChangePasswordSchema)) body: BffChangePasswordData + @Body(ZodPipe(changePasswordRequestSchema)) body: ChangePasswordRequestInput ) { return this.authService.changePassword( req.user.id, @@ -214,7 +214,7 @@ export class AuthZodController { }) async createSsoLink( @Req() req: Request & { user: { id: string } }, - @Body(ZodPipe(bffSsoLinkSchema)) body: BffSsoLinkData + @Body(ZodPipe(ssoLinkRequestSchema)) body: SsoLinkRequestInput ) { const destination = body?.destination; return this.authService.createSsoLink(req.user.id, destination); diff --git a/apps/bff/src/modules/auth/auth.module.ts b/apps/bff/src/modules/auth/auth.module.ts index d1cf0208..934c01af 100644 --- a/apps/bff/src/modules/auth/auth.module.ts +++ b/apps/bff/src/modules/auth/auth.module.ts @@ -14,7 +14,6 @@ import { LocalStrategy } from "./strategies/local.strategy"; import { GlobalAuthGuard } from "./guards/global-auth.guard"; import { TokenBlacklistService } from "./services/token-blacklist.service"; import { EmailModule } from "@bff/infra/email/email.module"; -import { ValidationModule } from "@bff/core/validation"; import { AuthTokenService } from "./services/token.service"; import { SignupWorkflowService } from "./services/workflows/signup-workflow.service"; import { PasswordWorkflowService } from "./services/workflows/password-workflow.service"; @@ -34,7 +33,6 @@ import { WhmcsLinkWorkflowService } from "./services/workflows/whmcs-link-workfl MappingsModule, IntegrationsModule, EmailModule, - ValidationModule, ], controllers: [AuthZodController, AuthAdminController], providers: [ diff --git a/apps/bff/src/modules/auth/auth.service.ts b/apps/bff/src/modules/auth/auth.service.ts index 44e7da98..6864ff07 100644 --- a/apps/bff/src/modules/auth/auth.service.ts +++ b/apps/bff/src/modules/auth/auth.service.ts @@ -18,10 +18,10 @@ import { getErrorMessage } from "@bff/core/utils/error.util"; import { Logger } from "nestjs-pino"; import { sanitizeWhmcsRedirectPath } from "@bff/core/utils/sso.util"; import { - type BffSignupData, - type BffValidateSignupData, - type BffLinkWhmcsData, - type BffSetPasswordData, + type SignupRequestInput, + type ValidateSignupRequestInput, + type LinkWhmcsRequestInput, + type SetPasswordRequestInput, } from "@customer-portal/domain"; import type { User as PrismaUser } from "@prisma/client"; @@ -101,11 +101,11 @@ export class AuthService { }; } - async validateSignup(validateData: BffValidateSignupData, request?: Request) { + async validateSignup(validateData: ValidateSignupRequestInput, request?: Request) { return this.signupWorkflow.validateSignup(validateData, request); } - async signup(signupData: BffSignupData, request?: Request) { + async signup(signupData: SignupRequestInput, request?: Request) { return this.signupWorkflow.signup(signupData, request); } @@ -143,7 +143,7 @@ export class AuthService { }; } - async linkWhmcsUser(linkData: BffLinkWhmcsData) { + async linkWhmcsUser(linkData: LinkWhmcsRequestInput) { return this.whmcsLinkWorkflow.linkWhmcsUser(linkData.email, linkData.password); } @@ -151,7 +151,7 @@ export class AuthService { return this.passwordWorkflow.checkPasswordNeeded(email); } - async setPassword(setPasswordData: BffSetPasswordData) { + async setPassword(setPasswordData: SetPasswordRequestInput) { return this.passwordWorkflow.setPassword(setPasswordData.email, setPasswordData.password); } @@ -470,7 +470,7 @@ export class AuthService { * Preflight validation for signup. No side effects. * Returns a clear nextAction for the UI and detailed flags. */ - async signupPreflight(signupData: BffSignupData) { + async signupPreflight(signupData: SignupRequestInput) { return this.signupWorkflow.signupPreflight(signupData); } diff --git a/apps/bff/src/modules/auth/services/workflows/signup-workflow.service.ts b/apps/bff/src/modules/auth/services/workflows/signup-workflow.service.ts index 231e84b6..6eba8568 100644 --- a/apps/bff/src/modules/auth/services/workflows/signup-workflow.service.ts +++ b/apps/bff/src/modules/auth/services/workflows/signup-workflow.service.ts @@ -19,9 +19,9 @@ import { AuthTokenService } from "../token.service"; import { sanitizeUser } from "../../utils/sanitize-user.util"; import { getErrorMessage } from "@bff/core/utils/error.util"; import { - bffSignupSchema, - type BffSignupData, - type BffValidateSignupData, + signupRequestSchema, + type SignupRequestInput, + type ValidateSignupRequestInput, type AuthTokens, } from "@customer-portal/domain"; import type { User as PrismaUser } from "@prisma/client"; @@ -50,7 +50,7 @@ export class SignupWorkflowService { @Inject(Logger) private readonly logger: Logger ) {} - async validateSignup(validateData: BffValidateSignupData, request?: Request) { + async validateSignup(validateData: ValidateSignupRequestInput, request?: Request) { const { sfNumber } = validateData; try { @@ -134,7 +134,7 @@ export class SignupWorkflowService { } } - async signup(signupData: BffSignupData, request?: Request): Promise { + async signup(signupData: SignupRequestInput, request?: Request): Promise { this.validateSignupData(signupData); const { @@ -328,7 +328,7 @@ export class SignupWorkflowService { } } - async signupPreflight(signupData: BffSignupData) { + async signupPreflight(signupData: SignupRequestInput) { const { email, sfNumber } = signupData; const normalizedEmail = email.toLowerCase().trim(); @@ -426,8 +426,8 @@ export class SignupWorkflowService { return result; } - private validateSignupData(signupData: BffSignupData) { - const validation = bffSignupSchema.safeParse(signupData); + private validateSignupData(signupData: SignupRequestInput) { + const validation = signupRequestSchema.safeParse(signupData); if (!validation.success) { const message = validation.error.issues .map(issue => issue.message) diff --git a/apps/bff/src/modules/id-mappings/mappings.service.ts b/apps/bff/src/modules/id-mappings/mappings.service.ts index 0ff4f99b..70e1e06e 100644 --- a/apps/bff/src/modules/id-mappings/mappings.service.ts +++ b/apps/bff/src/modules/id-mappings/mappings.service.ts @@ -72,9 +72,10 @@ export class MappingsService { } const mapping: UserIdMapping = { + id: created.id, userId: created.userId, whmcsClientId: created.whmcsClientId, - sfAccountId: created.sfAccountId || undefined, + sfAccountId: created.sfAccountId, createdAt: created.createdAt, updatedAt: created.updatedAt, }; @@ -116,9 +117,11 @@ export class MappingsService { } const mapping: UserIdMapping = { + userId: dbMapping.userId, + id: dbMapping.id, userId: dbMapping.userId, whmcsClientId: dbMapping.whmcsClientId, - sfAccountId: dbMapping.sfAccountId || undefined, + sfAccountId: dbMapping.sfAccountId, createdAt: dbMapping.createdAt, updatedAt: dbMapping.updatedAt, }; @@ -156,9 +159,11 @@ export class MappingsService { } const mapping: UserIdMapping = { + userId: dbMapping.userId, + id: dbMapping.id, userId: dbMapping.userId, whmcsClientId: dbMapping.whmcsClientId, - sfAccountId: dbMapping.sfAccountId || undefined, + sfAccountId: dbMapping.sfAccountId, createdAt: dbMapping.createdAt, updatedAt: dbMapping.updatedAt, }; @@ -196,9 +201,11 @@ export class MappingsService { } const mapping: UserIdMapping = { + userId: dbMapping.userId, + id: dbMapping.id, userId: dbMapping.userId, whmcsClientId: dbMapping.whmcsClientId, - sfAccountId: dbMapping.sfAccountId || undefined, + sfAccountId: dbMapping.sfAccountId, createdAt: dbMapping.createdAt, updatedAt: dbMapping.updatedAt, }; @@ -245,7 +252,7 @@ export class MappingsService { const newMapping: UserIdMapping = { userId: updated.userId, whmcsClientId: updated.whmcsClientId, - sfAccountId: updated.sfAccountId || undefined, + sfAccountId: dbMapping.sfAccountId, createdAt: updated.createdAt, updatedAt: updated.updatedAt, }; @@ -305,9 +312,10 @@ export class MappingsService { const dbMappings = await this.prisma.idMapping.findMany({ where: whereClause, orderBy: { createdAt: "desc" } }); const mappings: UserIdMapping[] = dbMappings.map(mapping => ({ + id: mapping.id, userId: mapping.userId, whmcsClientId: mapping.whmcsClientId, - sfAccountId: mapping.sfAccountId || undefined, + sfAccountId: mapping.sfAccountId, createdAt: mapping.createdAt, updatedAt: mapping.updatedAt, })); diff --git a/apps/bff/src/modules/id-mappings/types/mapping.types.ts b/apps/bff/src/modules/id-mappings/types/mapping.types.ts index ec1a3828..78827b4c 100644 --- a/apps/bff/src/modules/id-mappings/types/mapping.types.ts +++ b/apps/bff/src/modules/id-mappings/types/mapping.types.ts @@ -1,21 +1,9 @@ -export interface UserIdMapping { - userId: string; - whmcsClientId: number; - sfAccountId?: string; - createdAt?: Date; - updatedAt?: Date; -} - -export interface CreateMappingRequest { - userId: string; - whmcsClientId: number; - sfAccountId?: string; -} - -export interface UpdateMappingRequest { - whmcsClientId?: number; - sfAccountId?: string; -} +// Re-export types from validator service +export type { + UserIdMapping, + CreateMappingRequest, + UpdateMappingRequest, +} from "../validation/mapping-validator.service"; export interface MappingSearchFilters { userId?: string; @@ -25,6 +13,7 @@ export interface MappingSearchFilters { hasSfMapping?: boolean; } +// Validation result interface for service layer export interface MappingValidationResult { isValid: boolean; errors: string[]; diff --git a/apps/bff/src/modules/id-mappings/validation/mapping-validator.service.ts b/apps/bff/src/modules/id-mappings/validation/mapping-validator.service.ts index 23ed71ad..2b1bc3aa 100644 --- a/apps/bff/src/modules/id-mappings/validation/mapping-validator.service.ts +++ b/apps/bff/src/modules/id-mappings/validation/mapping-validator.service.ts @@ -1,148 +1,201 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { - CreateMappingRequest, - UpdateMappingRequest, - MappingValidationResult, - UserIdMapping, -} from "../types/mapping.types"; +import { z } from "zod"; + +// Simple Zod schemas for mapping validation (matching database types) +const createMappingRequestSchema = z.object({ + userId: z.string().uuid(), + whmcsClientId: z.number().int().positive(), + sfAccountId: z.string().optional() +}); + +const updateMappingRequestSchema = z.object({ + whmcsClientId: z.number().int().positive().optional(), + sfAccountId: z.string().optional() +}); + +const userIdMappingSchema = z.object({ + id: z.string().uuid(), + userId: z.string().uuid(), + whmcsClientId: z.number().int().positive(), + sfAccountId: z.string().nullable(), + createdAt: z.date(), + updatedAt: z.date() +}); + +export type CreateMappingRequest = z.infer; +export type UpdateMappingRequest = z.infer; +export type UserIdMapping = z.infer; + +// Legacy interface for backward compatibility +export interface MappingValidationResult { + isValid: boolean; + errors: string[]; + warnings: string[]; +} @Injectable() export class MappingValidatorService { constructor(@Inject(Logger) private readonly logger: Logger) {} validateCreateRequest(request: CreateMappingRequest): MappingValidationResult { - const errors: string[] = []; - const warnings: string[] = []; - if (!request.userId) { - errors.push("User ID is required"); - } else if (!this.isValidUuid(request.userId)) { - errors.push("User ID must be a valid UUID"); - } - if (!request.whmcsClientId) { - errors.push("WHMCS client ID is required"); - } else if (!Number.isInteger(request.whmcsClientId) || request.whmcsClientId < 1) { - errors.push("WHMCS client ID must be a positive integer"); - } - if (request.sfAccountId) { - if (!this.isValidSalesforceId(request.sfAccountId)) { - errors.push("Salesforce account ID must be a valid 15 or 18 character ID"); + const validationResult = createMappingRequestSchema.safeParse(request); + + if (validationResult.success) { + const warnings: string[] = []; + if (!request.sfAccountId) { + warnings.push("Salesforce account ID not provided - mapping will be incomplete"); } - } else { - warnings.push("Salesforce account ID not provided - mapping will be incomplete"); + return { isValid: true, errors: [], warnings }; } - return { isValid: errors.length === 0, errors, warnings }; + + const errors = validationResult.error.issues.map(issue => issue.message); + this.logger.warn({ request, errors }, "Create mapping request validation failed"); + + return { isValid: false, errors, warnings: [] }; } validateUpdateRequest(userId: string, request: UpdateMappingRequest): MappingValidationResult { - const errors: string[] = []; - const warnings: string[] = []; - if (!userId) { - errors.push("User ID is required"); - } else if (!this.isValidUuid(userId)) { - errors.push("User ID must be a valid UUID"); + // First validate userId + const userIdValidation = z.string().uuid().safeParse(userId); + if (!userIdValidation.success) { + return { + isValid: false, + errors: ["User ID must be a valid UUID"], + warnings: [] + }; } - if (!request.whmcsClientId && !request.sfAccountId) { - errors.push("At least one field must be provided for update"); + + // Then validate the update request + const validationResult = updateMappingRequestSchema.safeParse(request); + + if (validationResult.success) { + return { isValid: true, errors: [], warnings: [] }; } - if (request.whmcsClientId !== undefined) { - if (!Number.isInteger(request.whmcsClientId) || request.whmcsClientId < 1) { - errors.push("WHMCS client ID must be a positive integer"); - } - } - if (request.sfAccountId !== undefined) { - if (request.sfAccountId && !this.isValidSalesforceId(request.sfAccountId)) { - errors.push("Salesforce account ID must be a valid 15 or 18 character ID"); - } - } - return { isValid: errors.length === 0, errors, warnings }; + + const errors = validationResult.error.issues.map(issue => issue.message); + this.logger.warn({ userId, request, errors }, "Update mapping request validation failed"); + + return { isValid: false, errors, warnings: [] }; } validateExistingMapping(mapping: UserIdMapping): MappingValidationResult { - const errors: string[] = []; - const warnings: string[] = []; - if (!mapping.userId || !this.isValidUuid(mapping.userId)) { - errors.push("Invalid user ID in existing mapping"); + const validationResult = userIdMappingSchema.safeParse(mapping); + + if (validationResult.success) { + const warnings: string[] = []; + if (!mapping.sfAccountId) { + warnings.push("Mapping is missing Salesforce account ID"); + } + return { isValid: true, errors: [], warnings }; } - if (!mapping.whmcsClientId || !Number.isInteger(mapping.whmcsClientId) || mapping.whmcsClientId < 1) { - errors.push("Invalid WHMCS client ID in existing mapping"); - } - if (mapping.sfAccountId && !this.isValidSalesforceId(mapping.sfAccountId)) { - errors.push("Invalid Salesforce account ID in existing mapping"); - } - if (!mapping.sfAccountId) { - warnings.push("Mapping is missing Salesforce account ID"); - } - return { isValid: errors.length === 0, errors, warnings }; + + const errors = validationResult.error.issues.map(issue => issue.message); + this.logger.warn({ mapping, errors }, "Existing mapping validation failed"); + + return { isValid: false, errors, warnings: [] }; } validateBulkMappings(mappings: CreateMappingRequest[]): Array<{ index: number; validation: MappingValidationResult }> { - return mappings.map((mapping, index) => ({ index, validation: this.validateCreateRequest(mapping) })); + return mappings.map((mapping, index) => ({ + index, + validation: this.validateCreateRequest(mapping) + })); } validateNoConflicts(request: CreateMappingRequest, existingMappings: UserIdMapping[]): MappingValidationResult { const errors: string[] = []; const warnings: string[] = []; + + // First validate the request format + const formatValidation = this.validateCreateRequest(request); + if (!formatValidation.isValid) { + return formatValidation; + } + + // Check for conflicts const duplicateUser = existingMappings.find(m => m.userId === request.userId); if (duplicateUser) { errors.push(`User ${request.userId} already has a mapping`); } + const duplicateWhmcs = existingMappings.find(m => m.whmcsClientId === request.whmcsClientId); if (duplicateWhmcs) { errors.push(`WHMCS client ${request.whmcsClientId} is already mapped to user ${duplicateWhmcs.userId}`); } + if (request.sfAccountId) { const duplicateSf = existingMappings.find(m => m.sfAccountId === request.sfAccountId); if (duplicateSf) { warnings.push(`Salesforce account ${request.sfAccountId} is already mapped to user ${duplicateSf.userId}`); } } + return { isValid: errors.length === 0, errors, warnings }; } validateDeletion(mapping: UserIdMapping): MappingValidationResult { const errors: string[] = []; const warnings: string[] = []; + if (!mapping) { errors.push("Cannot delete non-existent mapping"); return { isValid: false, errors, warnings }; } + + // Validate the mapping format + const formatValidation = this.validateExistingMapping(mapping); + if (!formatValidation.isValid) { + return formatValidation; + } + warnings.push("Deleting this mapping will prevent access to WHMCS/Salesforce data for this user"); if (mapping.sfAccountId) { warnings.push("This mapping includes Salesforce integration - deletion will affect case management"); } + return { isValid: true, errors, warnings }; } sanitizeCreateRequest(request: CreateMappingRequest): CreateMappingRequest { + // Use Zod parsing to sanitize and validate + const validationResult = createMappingRequestSchema.safeParse({ + userId: request.userId?.trim(), + whmcsClientId: request.whmcsClientId, + sfAccountId: request.sfAccountId?.trim() || undefined, + }); + + if (validationResult.success) { + return validationResult.data; + } + + // Fallback to original behavior if validation fails return { userId: request.userId?.trim(), - whmcsClientId: Number(request.whmcsClientId), + whmcsClientId: request.whmcsClientId, sfAccountId: request.sfAccountId?.trim() || undefined, }; } sanitizeUpdateRequest(request: UpdateMappingRequest): UpdateMappingRequest { - const sanitized: UpdateMappingRequest = {}; + const sanitized: any = {}; + if (request.whmcsClientId !== undefined) { - sanitized.whmcsClientId = Number(request.whmcsClientId); + sanitized.whmcsClientId = request.whmcsClientId; } + if (request.sfAccountId !== undefined) { sanitized.sfAccountId = request.sfAccountId?.trim() || undefined; } + + // Use Zod parsing to validate the sanitized data + const validationResult = updateMappingRequestSchema.safeParse(sanitized); + + if (validationResult.success) { + return validationResult.data; + } + + // Fallback to sanitized data if validation fails return sanitized; } - - private isValidUuid(uuid: string): boolean { - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; - return uuidRegex.test(uuid); - } - - private isValidSalesforceId(sfId: string): boolean { - if (!sfId) return false; - const sfIdRegex = /^[a-zA-Z0-9]{15}$|^[a-zA-Z0-9]{18}$/; - return sfIdRegex.test(sfId); - } -} - - +} \ No newline at end of file diff --git a/apps/bff/src/modules/invoices/dto/invoice.dto.ts b/apps/bff/src/modules/invoices/dto/invoice.dto.ts deleted file mode 100644 index fafa549a..00000000 --- a/apps/bff/src/modules/invoices/dto/invoice.dto.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { ApiProperty } from "@nestjs/swagger"; - -export class InvoiceItemDto { - @ApiProperty({ example: 101 }) - id!: number; - - @ApiProperty({ example: "Monthly hosting" }) - description!: string; - - @ApiProperty({ example: 19.99 }) - amount!: number; - - @ApiProperty({ required: false, example: 1 }) - quantity?: number; - - @ApiProperty({ example: "Hosting" }) - type!: string; - - @ApiProperty({ required: false, example: 555 }) - serviceId?: number; -} - -export class InvoiceDto { - @ApiProperty({ example: 1234 }) - id!: number; - - @ApiProperty({ example: "INV-2025-0001" }) - number!: string; - - @ApiProperty({ example: "Unpaid" }) - status!: string; - - @ApiProperty({ example: "USD" }) - currency!: string; - - @ApiProperty({ required: false, example: "๏ฟฅ" }) - currencySymbol?: string; - - @ApiProperty({ example: 19.99 }) - total!: number; - - @ApiProperty({ example: 18.17 }) - subtotal!: number; - - @ApiProperty({ example: 1.82 }) - tax!: number; - - @ApiProperty({ required: false, example: "2025-01-01T00:00:00.000Z" }) - issuedAt?: string; - - @ApiProperty({ required: false, example: "2025-01-15T00:00:00.000Z" }) - dueDate?: string; - - @ApiProperty({ required: false, example: "2025-01-10T00:00:00.000Z" }) - paidDate?: string; - - @ApiProperty({ required: false }) - pdfUrl?: string; - - @ApiProperty({ required: false }) - paymentUrl?: string; - - @ApiProperty({ required: false }) - description?: string; - - @ApiProperty({ type: [InvoiceItemDto], required: false }) - items?: InvoiceItemDto[]; -} - -export class PaginationDto { - @ApiProperty({ example: 1 }) - page!: number; - - @ApiProperty({ example: 5 }) - totalPages!: number; - - @ApiProperty({ example: 42 }) - totalItems!: number; - - @ApiProperty({ required: false }) - nextCursor?: string; -} - -export class InvoiceListDto { - @ApiProperty({ type: [InvoiceDto] }) - invoices!: InvoiceDto[]; - - @ApiProperty({ type: PaginationDto }) - pagination!: PaginationDto; -} - - diff --git a/apps/bff/src/modules/invoices/invoices.controller.ts b/apps/bff/src/modules/invoices/invoices.controller.ts index c49f0363..58d51331 100644 --- a/apps/bff/src/modules/invoices/invoices.controller.ts +++ b/apps/bff/src/modules/invoices/invoices.controller.ts @@ -30,7 +30,7 @@ import { PaymentGatewayList, InvoicePaymentLink, } from "@customer-portal/domain"; -import { InvoiceDto, InvoiceListDto } from "./dto/invoice.dto"; +import type { Invoice, InvoiceList } from "@customer-portal/domain"; interface AuthenticatedRequest { user: { id: string }; diff --git a/apps/bff/src/modules/orders/dto/order.dto.ts b/apps/bff/src/modules/orders/dto/order.dto.ts deleted file mode 100644 index d5d53b33..00000000 --- a/apps/bff/src/modules/orders/dto/order.dto.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { - IsString, - IsArray, - IsIn, - IsNotEmpty, - IsOptional, - IsObject, - ValidateNested, -} from "class-validator"; -import { Type } from "class-transformer"; - -// Allow order payload to include an address snapshot override -export class OrderAddress { - @IsOptional() - @IsString() - street?: string | null; - - @IsOptional() - @IsString() - streetLine2?: string | null; - - @IsOptional() - @IsString() - city?: string | null; - - @IsOptional() - @IsString() - state?: string | null; - - @IsOptional() - @IsString() - postalCode?: string | null; - - @IsOptional() - @IsString() - country?: string | null; -} - -export class OrderConfigurations { - // Activation (All order types) - @IsOptional() - @IsIn(["Immediate", "Scheduled"]) - activationType?: "Immediate" | "Scheduled"; - - @IsOptional() - @IsString() - scheduledAt?: string; - - // Internet specific - @IsOptional() - @IsIn(["IPoE-BYOR", "IPoE-HGW", "PPPoE"]) - accessMode?: "IPoE-BYOR" | "IPoE-HGW" | "PPPoE"; - - // SIM specific - @IsOptional() - @IsIn(["eSIM", "Physical SIM"]) - simType?: "eSIM" | "Physical SIM"; - - @IsOptional() - @IsString() - eid?: string; // Required for eSIM - - // MNP/Porting - @IsOptional() - @IsString() - isMnp?: string; // "true" | "false" - - @IsOptional() - @IsString() - mnpNumber?: string; - - @IsOptional() - @IsString() - mnpExpiry?: string; - - @IsOptional() - @IsString() - mnpPhone?: string; - - @IsOptional() - @IsString() - mvnoAccountNumber?: string; - - @IsOptional() - @IsString() - portingLastName?: string; - - @IsOptional() - @IsString() - portingFirstName?: string; - - @IsOptional() - @IsString() - portingLastNameKatakana?: string; - - @IsOptional() - @IsString() - portingFirstNameKatakana?: string; - - @IsOptional() - @IsIn(["Male", "Female", "Corporate/Other"]) - portingGender?: "Male" | "Female" | "Corporate/Other"; - - @IsOptional() - @IsString() - portingDateOfBirth?: string; - - // VPN region is inferred from product VPN_Region__c field, no user input needed - - // Optional address override captured at checkout - @IsOptional() - @ValidateNested() - @Type(() => OrderAddress) - address?: OrderAddress; -} - -export class CreateOrderDto { - @IsString() - @IsNotEmpty() - @IsIn(["Internet", "SIM", "VPN", "Other"]) - orderType: "Internet" | "SIM" | "VPN" | "Other"; - - @IsArray() - @IsString({ each: true }) - @IsNotEmpty({ each: true }) - skus: string[]; - - @IsOptional() - @IsObject() - @ValidateNested() - @Type(() => OrderConfigurations) - configurations?: OrderConfigurations; -} - -// Interface for service layer (extends DTO with additional fields) -export interface CreateOrderBody extends Omit { - configurations?: OrderConfigurations; - opportunityId?: string; // Additional field for internal use -} - -export interface UserMapping { - sfAccountId: string; - whmcsClientId: number; -} diff --git a/apps/bff/src/modules/orders/orders.controller.ts b/apps/bff/src/modules/orders/orders.controller.ts index dfb988ea..56c8eb83 100644 --- a/apps/bff/src/modules/orders/orders.controller.ts +++ b/apps/bff/src/modules/orders/orders.controller.ts @@ -3,7 +3,11 @@ import { OrderOrchestrator } from "./services/order-orchestrator.service"; import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from "@nestjs/swagger"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; import { Logger } from "nestjs-pino"; -import * as OrderDto from "./dto/order.dto"; +import { ZodPipe } from "@bff/core/validation"; +import { + createOrderRequestSchema, + type CreateOrderRequest +} from "@customer-portal/domain"; @ApiTags("orders") @Controller("orders") @@ -18,7 +22,7 @@ export class OrdersController { @ApiOperation({ summary: "Create Salesforce Order" }) @ApiResponse({ status: 201, description: "Order created successfully" }) @ApiResponse({ status: 400, description: "Invalid request data" }) - async create(@Request() req: RequestWithUser, @Body() body: OrderDto.CreateOrderDto) { + async create(@Request() req: RequestWithUser, @Body(ZodPipe(createOrderRequestSchema)) body: CreateOrderRequest) { this.logger.log( { userId: req.user?.id, diff --git a/apps/bff/src/modules/orders/services/order-builder.service.ts b/apps/bff/src/modules/orders/services/order-builder.service.ts index 38a435da..c8b24916 100644 --- a/apps/bff/src/modules/orders/services/order-builder.service.ts +++ b/apps/bff/src/modules/orders/services/order-builder.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; -import { CreateOrderBody, UserMapping } from "../dto/order.dto"; +import type { CreateOrderRequest, UserMapping } from "@customer-portal/domain"; import { getSalesforceFieldMap } from "@bff/core/config/field-map"; import { UsersService } from "@bff/modules/users/users.service"; @@ -18,7 +18,7 @@ export class OrderBuilder { * Build order fields for Salesforce Order creation */ async buildOrderFields( - body: CreateOrderBody, + body: CreateOrderRequest, userMapping: UserMapping, pricebookId: string, userId: string @@ -57,7 +57,7 @@ export class OrderBuilder { return orderFields; } - private addActivationFields(orderFields: Record, body: CreateOrderBody): void { + private addActivationFields(orderFields: Record, body: CreateOrderRequest): void { const fields = getSalesforceFieldMap(); const config = body.configurations || {}; @@ -70,7 +70,7 @@ export class OrderBuilder { orderFields[fields.order.activationStatus] = "Not Started"; } - private addInternetFields(orderFields: Record, body: CreateOrderBody): void { + private addInternetFields(orderFields: Record, body: CreateOrderRequest): void { const fields = getSalesforceFieldMap(); const config = body.configurations || {}; @@ -86,7 +86,7 @@ export class OrderBuilder { // - hikariDenwa: derive from SKU analysis } - private addSimFields(orderFields: Record, body: CreateOrderBody): void { + private addSimFields(orderFields: Record, body: CreateOrderRequest): void { const fields = getSalesforceFieldMap(); const config = body.configurations || {}; @@ -138,7 +138,7 @@ export class OrderBuilder { } } - private addVpnFields(_orderFields: Record, _body: CreateOrderBody): void { + private addVpnFields(_orderFields: Record, _body: CreateOrderRequest): void { // Note: Removed vpnRegion field - can be derived from service product metadata in OrderItems // VPN orders only need user configuration choices (none currently defined) } @@ -150,7 +150,7 @@ export class OrderBuilder { private async addAddressSnapshot( orderFields: Record, userId: string, - body: CreateOrderBody + body: CreateOrderRequest ): Promise { try { const fields = getSalesforceFieldMap(); diff --git a/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts b/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts index 3e53d141..662de754 100644 --- a/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts +++ b/apps/bff/src/modules/orders/services/order-fulfillment-validator.service.ts @@ -6,6 +6,12 @@ import { MappingsService } from "@bff/modules/id-mappings/mappings.service"; import { getErrorMessage } from "@bff/core/utils/error.util"; import { SalesforceOrder } from "@customer-portal/domain"; import { getSalesforceFieldMap } from "@bff/core/config/field-map"; +import { + userMappingValidationSchema, + paymentMethodValidationSchema, + type UserMappingValidation, + type PaymentMethodValidation +} from "@customer-portal/domain"; export interface OrderFulfillmentValidationResult { sfOrder: SalesforceOrder; diff --git a/apps/bff/src/modules/orders/services/order-item-builder.service.ts b/apps/bff/src/modules/orders/services/order-item-builder.service.ts index f4464a38..27d64ae4 100644 --- a/apps/bff/src/modules/orders/services/order-item-builder.service.ts +++ b/apps/bff/src/modules/orders/services/order-item-builder.service.ts @@ -2,7 +2,6 @@ import { Injectable, BadRequestException, NotFoundException, Inject } from "@nes import { Logger } from "nestjs-pino"; import { SalesforceConnection } from "@bff/integrations/salesforce/services/salesforce-connection.service"; import { getSalesforceFieldMap } from "@bff/core/config/field-map"; -// Removed unused import: CreateOrderBody /** * Handles building order items from SKU data diff --git a/apps/bff/src/modules/orders/services/order-validator.service.ts b/apps/bff/src/modules/orders/services/order-validator.service.ts index c2786abf..1583c45a 100644 --- a/apps/bff/src/modules/orders/services/order-validator.service.ts +++ b/apps/bff/src/modules/orders/services/order-validator.service.ts @@ -5,8 +5,7 @@ import { WhmcsConnectionService } from "@bff/integrations/whmcs/services/whmcs-c import { SalesforceConnection } from "@bff/integrations/salesforce/services/salesforce-connection.service"; import { getSalesforceFieldMap } from "@bff/core/config/field-map"; import { getErrorMessage } from "@bff/core/utils/error.util"; -import { CreateOrderBody, UserMapping } from "../dto/order.dto"; -// Removed unused imports: OrderConfigurations, CreateOrderDto, plainToClass, validate +import { createOrderRequestSchema, type CreateOrderRequest } from "@customer-portal/domain"; /** * Handles all order validation logic - both format and business rules @@ -21,9 +20,9 @@ export class OrderValidator { ) {} /** - * Validate request format and structure (replaces DTO validation) + * Validate request format and structure using direct Zod validation */ - validateRequestFormat(rawBody: unknown): CreateOrderBody { + validateRequestFormat(rawBody: unknown): CreateOrderRequest { try { this.logger.debug( { @@ -31,49 +30,37 @@ export class OrderValidator { hasOrderType: !!(rawBody as Record)?.orderType, hasSkus: !!(rawBody as Record)?.skus, }, - "Starting request format validation" + "Starting Zod request format validation" ); - // Simple validation for now - we'll enhance this once we fix the 500 error - if (!rawBody || typeof rawBody !== "object" || Array.isArray(rawBody)) { + // Use direct Zod validation - simple and clean + const validationResult = createOrderRequestSchema.safeParse(rawBody); + + if (!validationResult.success) { + const errorMessages = validationResult.error.issues.map(issue => { + const path = issue.path.join('.'); + return path ? `${path}: ${issue.message}` : issue.message; + }); + this.logger.error( - { - bodyType: typeof rawBody, - isArray: Array.isArray(rawBody), - }, - "Invalid request body type" - ); - throw new BadRequestException( - `Request body must be an object, received: ${typeof rawBody}` + { + errors: errorMessages, + rawBody: JSON.stringify(rawBody, null, 2) + }, + "Zod validation failed" ); + + throw new BadRequestException({ + message: 'Order validation failed', + errors: errorMessages, + statusCode: 400, + }); } - const body = rawBody as Record; - - if (!body.orderType || typeof body.orderType !== "string") { - throw new BadRequestException("orderType is required and must be a string"); - } - - if (!["Internet", "SIM", "VPN", "Other"].includes(body.orderType)) { - throw new BadRequestException(`orderType must be one of: Internet, SIM, VPN, Other`); - } - - if (!body.skus || !Array.isArray(body.skus) || (body.skus as unknown[]).length === 0) { - throw new BadRequestException("skus is required and must be a non-empty array"); - } - - for (const sku of body.skus) { - if (!sku || typeof sku !== "string") { - throw new BadRequestException("All SKUs must be non-empty strings"); - } - } - - // Convert to service interface - const validatedBody: CreateOrderBody = { - orderType: body.orderType as "Internet" | "SIM" | "VPN" | "Other", - skus: body.skus as string[], - configurations: (body.configurations as Record) || {}, - }; + const validatedData = validationResult.data; + + // Return validated data directly (Zod ensures type safety) + const validatedBody: CreateOrderRequest = validatedData; this.logger.debug( { @@ -81,8 +68,9 @@ export class OrderValidator { skuCount: validatedBody.skus.length, hasConfigurations: !!validatedBody.configurations, }, - "Request format validation passed" + "Zod request format validation passed" ); + return validatedBody; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); @@ -92,16 +80,23 @@ export class OrderValidator { } /** - * Validate user mapping exists + * Validate user mapping exists - simple business logic */ - async validateUserMapping(userId: string): Promise { + async validateUserMapping(userId: string): Promise<{ userId: string; sfAccountId: string | null; whmcsClientId: number }> { const mapping = await this.mappings.findByUserId(userId); - if (!mapping?.sfAccountId || !mapping?.whmcsClientId) { - this.logger.warn({ userId, mapping }, "Missing SF/WHMCS mapping for user"); - throw new BadRequestException("User is not fully linked to Salesforce/WHMCS"); + + if (!mapping) { + this.logger.warn({ userId }, "User mapping not found"); + throw new BadRequestException("User account mapping is required before ordering"); + } + + if (!mapping.whmcsClientId) { + this.logger.warn({ userId, mapping }, "WHMCS client ID missing from mapping"); + throw new BadRequestException("WHMCS integration is required before ordering"); } return { + userId: mapping.userId, sfAccountId: mapping.sfAccountId, whmcsClientId: mapping.whmcsClientId, }; @@ -272,8 +267,8 @@ export class OrderValidator { userId: string, rawBody: unknown ): Promise<{ - validatedBody: CreateOrderBody; - userMapping: UserMapping; + validatedBody: CreateOrderRequest; + userMapping: { userId: string; sfAccountId: string | null; whmcsClientId: number }; pricebookId: string; }> { this.logger.log({ userId, rawBody }, "Starting complete order validation"); diff --git a/apps/bff/src/modules/subscriptions/dto/sim-cancel.dto.ts b/apps/bff/src/modules/subscriptions/dto/sim-cancel.dto.ts deleted file mode 100644 index a977691a..00000000 --- a/apps/bff/src/modules/subscriptions/dto/sim-cancel.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiPropertyOptional } from "@nestjs/swagger"; -import { IsOptional, Matches } from "class-validator"; - -export class SimCancelDto { - @ApiPropertyOptional({ description: "Schedule date YYYYMMDD", example: "20241231" }) - @IsOptional() - @Matches(/^\d{8}$/) - scheduledAt?: string; -} diff --git a/apps/bff/src/modules/subscriptions/dto/sim-change-plan.dto.ts b/apps/bff/src/modules/subscriptions/dto/sim-change-plan.dto.ts deleted file mode 100644 index 65dc8a0e..00000000 --- a/apps/bff/src/modules/subscriptions/dto/sim-change-plan.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiProperty } from "@nestjs/swagger"; -import { IsString, Matches } from "class-validator"; - -export class SimChangePlanDto { - @ApiProperty({ description: "New plan code", example: "PASI_10G" }) - @IsString() - @Matches(/^[A-Z0-9_\-]{3,32}$/) - newPlanCode!: string; -} diff --git a/apps/bff/src/modules/subscriptions/dto/sim-features.dto.ts b/apps/bff/src/modules/subscriptions/dto/sim-features.dto.ts deleted file mode 100644 index bdb990de..00000000 --- a/apps/bff/src/modules/subscriptions/dto/sim-features.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ApiPropertyOptional } from "@nestjs/swagger"; -import { IsBoolean, IsOptional, IsEnum } from "class-validator"; - -export class SimFeaturesDto { - @ApiPropertyOptional({ type: Boolean }) - @IsOptional() - @IsBoolean() - voiceMailEnabled?: boolean; - - @ApiPropertyOptional({ type: Boolean }) - @IsOptional() - @IsBoolean() - callWaitingEnabled?: boolean; - - @ApiPropertyOptional({ type: Boolean }) - @IsOptional() - @IsBoolean() - internationalRoamingEnabled?: boolean; - - @ApiPropertyOptional({ enum: ["4G", "5G"] }) - @IsOptional() - @IsEnum(["4G", "5G"] as const) - networkType?: "4G" | "5G"; -} diff --git a/apps/bff/src/modules/subscriptions/dto/sim-topup.dto.ts b/apps/bff/src/modules/subscriptions/dto/sim-topup.dto.ts deleted file mode 100644 index bbc77912..00000000 --- a/apps/bff/src/modules/subscriptions/dto/sim-topup.dto.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ApiProperty } from "@nestjs/swagger"; -import { IsInt, Min, Max } from "class-validator"; - -export class SimTopUpDto { - @ApiProperty({ description: "Quota in MB", example: 1000, minimum: 100, maximum: 51200 }) - @IsInt() - @Min(100) - @Max(51200) - quotaMb!: number; -} diff --git a/apps/bff/src/modules/subscriptions/subscriptions.controller.ts b/apps/bff/src/modules/subscriptions/subscriptions.controller.ts index 8985eb27..57e292da 100644 --- a/apps/bff/src/modules/subscriptions/subscriptions.controller.ts +++ b/apps/bff/src/modules/subscriptions/subscriptions.controller.ts @@ -22,11 +22,20 @@ import { import { SubscriptionsService } from "./subscriptions.service"; import { SimManagementService } from "./sim-management.service"; -import { Subscription, SubscriptionList, InvoiceList } from "@customer-portal/domain"; -import { SimTopUpDto } from "./dto/sim-topup.dto"; -import { SimChangePlanDto } from "./dto/sim-change-plan.dto"; -import { SimCancelDto } from "./dto/sim-cancel.dto"; -import { SimFeaturesDto } from "./dto/sim-features.dto"; +import { + Subscription, + SubscriptionList, + InvoiceList, + simTopupRequestSchema, + simChangePlanRequestSchema, + simCancelRequestSchema, + simFeaturesRequestSchema, + type SimTopupRequest, + type SimChangePlanRequest, + type SimCancelRequest, + type SimFeaturesRequest +} from "@customer-portal/domain"; +import { ZodPipe } from "@bff/core/validation"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; @ApiTags("subscriptions") @@ -282,7 +291,7 @@ export class SubscriptionsController { async topUpSim( @Request() req: RequestWithUser, @Param("id", ParseIntPipe) subscriptionId: number, - @Body() body: SimTopUpDto + @Body(ZodPipe(simTopupRequestSchema)) body: SimTopupRequest ) { await this.simManagementService.topUpSim(req.user.id, subscriptionId, body); return { success: true, message: "SIM top-up completed successfully" }; @@ -309,7 +318,7 @@ export class SubscriptionsController { async changeSimPlan( @Request() req: RequestWithUser, @Param("id", ParseIntPipe) subscriptionId: number, - @Body() body: SimChangePlanDto + @Body(ZodPipe(simChangePlanRequestSchema)) body: SimChangePlanRequest ) { const result = await this.simManagementService.changeSimPlan(req.user.id, subscriptionId, body); return { @@ -343,7 +352,7 @@ export class SubscriptionsController { async cancelSim( @Request() req: RequestWithUser, @Param("id", ParseIntPipe) subscriptionId: number, - @Body() body: SimCancelDto = {} + @Body(ZodPipe(simCancelRequestSchema)) body: SimCancelRequest ) { await this.simManagementService.cancelSim(req.user.id, subscriptionId, body); return { success: true, message: "SIM cancellation completed successfully" }; @@ -404,7 +413,7 @@ export class SubscriptionsController { async updateSimFeatures( @Request() req: RequestWithUser, @Param("id", ParseIntPipe) subscriptionId: number, - @Body() body: SimFeaturesDto + @Body(ZodPipe(simFeaturesRequestSchema)) body: SimFeaturesRequest ) { await this.simManagementService.updateSimFeatures(req.user.id, subscriptionId, body); return { success: true, message: "SIM features updated successfully" }; diff --git a/apps/bff/src/modules/users/dto/update-address.dto.ts b/apps/bff/src/modules/users/dto/update-address.dto.ts deleted file mode 100644 index c950a434..00000000 --- a/apps/bff/src/modules/users/dto/update-address.dto.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { IsOptional, IsString, Length } from "class-validator"; -import { ApiProperty } from "@nestjs/swagger"; - -export class UpdateAddressDto { - @ApiProperty({ description: "Street address", required: false }) - @IsOptional() - @IsString() - @Length(0, 200) - street?: string; - - @ApiProperty({ description: "Street address line 2", required: false }) - @IsOptional() - @IsString() - @Length(0, 200) - streetLine2?: string; - - @ApiProperty({ description: "City", required: false }) - @IsOptional() - @IsString() - @Length(0, 100) - city?: string; - - @ApiProperty({ description: "State/Prefecture", required: false }) - @IsOptional() - @IsString() - @Length(0, 100) - state?: string; - - @ApiProperty({ description: "Postal code", required: false }) - @IsOptional() - @IsString() - @Length(0, 20) - postalCode?: string; - - @ApiProperty({ description: "Country (ISO alpha-2)", required: false }) - @IsOptional() - @IsString() - @Length(0, 100) - country?: string; -} diff --git a/apps/bff/src/modules/users/dto/update-user.dto.ts b/apps/bff/src/modules/users/dto/update-user.dto.ts deleted file mode 100644 index 75e0d1dd..00000000 --- a/apps/bff/src/modules/users/dto/update-user.dto.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { IsOptional, IsString, IsEmail, Length, Matches } from "class-validator"; -import { ApiProperty } from "@nestjs/swagger"; - -export class UpdateUserDto { - @ApiProperty({ description: "User's first name", required: false }) - @IsOptional() - @IsString() - @Length(1, 50) - firstName?: string; - - @ApiProperty({ description: "User's last name", required: false }) - @IsOptional() - @IsString() - @Length(1, 50) - lastName?: string; - - @ApiProperty({ description: "User's company name", required: false }) - @IsOptional() - @IsString() - @Length(0, 100) - company?: string; - - @ApiProperty({ description: "User's phone number", required: false }) - @IsOptional() - @IsString() - @Length(0, 20) - @Matches(/^[+]?[1-9][\d]{0,15}$/, { - message: "Phone number must be a valid international format", - }) - phone?: string; - - @ApiProperty({ description: "User's email address", required: false }) - @IsOptional() - @IsEmail() - email?: string; -} diff --git a/apps/bff/src/modules/users/users.controller.ts b/apps/bff/src/modules/users/users.controller.ts index ca3983f5..131e74c2 100644 --- a/apps/bff/src/modules/users/users.controller.ts +++ b/apps/bff/src/modules/users/users.controller.ts @@ -9,8 +9,13 @@ import { } from "@nestjs/common"; import { UsersService } from "./users.service"; import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth } from "@nestjs/swagger"; -import * as UserDto from "./dto/update-user.dto"; -import { UpdateAddressDto } from "./dto/update-address.dto"; +import { ZodPipe } from "@bff/core/validation"; +import { + updateProfileRequestSchema, + updateAddressRequestSchema, + type UpdateProfileRequest, + type UpdateAddressRequest +} from "@customer-portal/domain"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; @ApiTags("users") @@ -41,7 +46,7 @@ export class UsersController { @ApiResponse({ status: 200, description: "Profile updated successfully" }) @ApiResponse({ status: 400, description: "Invalid input data" }) @ApiResponse({ status: 401, description: "Unauthorized" }) - async updateProfile(@Req() req: RequestWithUser, @Body() updateData: UserDto.UpdateUserDto) { + async updateProfile(@Req() req: RequestWithUser, @Body(ZodPipe(updateProfileRequestSchema)) updateData: UpdateProfileRequest) { return this.usersService.update(req.user.id, updateData); } @@ -60,7 +65,7 @@ export class UsersController { @ApiResponse({ status: 200, description: "Address updated successfully" }) @ApiResponse({ status: 400, description: "Invalid input data" }) @ApiResponse({ status: 401, description: "Unauthorized" }) - async updateAddress(@Req() req: RequestWithUser, @Body() address: UpdateAddressDto) { + async updateAddress(@Req() req: RequestWithUser, @Body(ZodPipe(updateAddressRequestSchema)) address: UpdateAddressRequest) { await this.usersService.updateAddress(req.user.id, address); // Return fresh address snapshot return this.usersService.getAddress(req.user.id); diff --git a/apps/bff/src/modules/users/users.service.ts b/apps/bff/src/modules/users/users.service.ts index b5f25a9a..c605fee4 100644 --- a/apps/bff/src/modules/users/users.service.ts +++ b/apps/bff/src/modules/users/users.service.ts @@ -4,28 +4,25 @@ import { mapPrismaUserToSharedUser, mapPrismaUserToEnhancedBase, } from "@bff/infra/utils/user-mapper.util"; -import type { UpdateAddressDto } from "./dto/update-address.dto"; +import type { UpdateAddressRequest } from "@customer-portal/domain"; import { Injectable, Inject, NotFoundException, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { PrismaService } from "@bff/infra/database/prisma.service"; import { User, Activity, Address } from "@customer-portal/domain"; import type { Subscription, Invoice } from "@customer-portal/domain"; -import { User as PrismaUser } from "@prisma/client"; +import type { User as PrismaUser } from "@prisma/client"; import { WhmcsService } from "@bff/integrations/whmcs/whmcs.service"; import { SalesforceService } from "@bff/integrations/salesforce/salesforce.service"; import { MappingsService } from "@bff/modules/id-mappings/mappings.service"; -// Use Prisma-generated User type directly -import { User as PrismaUserType } from "@prisma/client"; - // Salesforce Account interface based on the data model interface SalesforceAccount { Id: string; } -// Use a subset of PrismaUserType for updates -type UserUpdateData = Partial>; +// Use a subset of PrismaUser for updates +type UserUpdateData = Partial>; @Injectable() export class UsersService { @@ -38,7 +35,7 @@ export class UsersService { ) {} // Helper function to convert Prisma user to domain User type - private toDomainUser(user: PrismaUserType): User { + private toDomainUser(user: PrismaUser): User { return { id: user.id, email: user.email, @@ -80,7 +77,7 @@ export class UsersService { } // Internal method for auth service - returns raw user with sensitive fields - async findByEmailInternal(email: string): Promise { + async findByEmailInternal(email: string): Promise { const validEmail = this.validateEmail(email); try { @@ -96,7 +93,7 @@ export class UsersService { } // Internal method for auth service - returns raw user by ID with sensitive fields - async findByIdInternal(id: string): Promise { + async findByIdInternal(id: string): Promise { const validId = this.validateUserId(id); try { @@ -185,7 +182,7 @@ export class UsersService { } // Create enhanced user object with Salesforce data - const enhancedUser: PrismaUserType = { + const enhancedUser: PrismaUser = { ...user, firstName: firstName || user.firstName, lastName: lastName || user.lastName, @@ -197,7 +194,7 @@ export class UsersService { return this.toDomainUser(enhancedUser); } - async create(userData: Partial): Promise { + async create(userData: Partial): Promise { const validEmail = this.validateEmail(userData.email!); try { @@ -235,8 +232,8 @@ export class UsersService { } } - private sanitizeUserData(userData: UserUpdateData): Partial { - const sanitized: Partial = {}; + private sanitizeUserData(userData: UserUpdateData): Partial { + const sanitized: Partial = {}; if (userData.firstName !== undefined) sanitized.firstName = userData.firstName?.trim().substring(0, 50) || null; if (userData.lastName !== undefined) @@ -472,7 +469,7 @@ export class UsersService { /** * Update address in WHMCS (authoritative for client record address fields) */ - async updateAddress(userId: string, address: UpdateAddressDto): Promise { + async updateAddress(userId: string, address: UpdateAddressRequest): Promise { try { const mapping = await this.mappingsService.findByUserId(userId); if (!mapping) { diff --git a/apps/bff/tsconfig.base.json b/apps/bff/tsconfig.base.json deleted file mode 100644 index ed011ac2..00000000 --- a/apps/bff/tsconfig.base.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2024", - "lib": ["ES2024"], - "module": "Node16", - "moduleResolution": "node16", - "baseUrl": "./", - "paths": { - "@/*": ["src/*"], - "@bff/core/*": ["src/core/*"], - "@bff/infra/*": ["src/infra/*"], - "@bff/modules/*": ["src/modules/*"], - "@bff/integrations/*": ["src/integrations/*"] - }, - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictBindCallApply": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "noImplicitOverride": false, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "isolatedModules": true, - "skipLibCheck": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "types": ["node"], - "typeRoots": ["./node_modules/@types"], - - // Memory optimization settings - "preserveWatchOutput": true, - "assumeChangesOnlyAffectDirectDependencies": true, - "disableReferencedProjectLoad": false, - "disableSolutionSearching": false, - "disableSourceOfProjectReferenceRedirect": false - }, - "ts-node": { - "transpileOnly": true, - "compilerOptions": { - "module": "CommonJS" - } - } -} diff --git a/apps/bff/tsconfig.build.json b/apps/bff/tsconfig.build.json index 06a460bc..586d5e88 100644 --- a/apps/bff/tsconfig.build.json +++ b/apps/bff/tsconfig.build.json @@ -1,25 +1,19 @@ { - "extends": "./tsconfig.base.json", + "extends": "./tsconfig.json", "compilerOptions": { - "composite": true, "noEmit": false, - "incremental": true, - "tsBuildInfoFile": "./tsconfig.build.tsbuildinfo", + "composite": true, "outDir": "./dist", "rootDir": "./src", - "sourceMap": true, "declaration": true, + "sourceMap": true, "removeComments": true, - "baseUrl": "./", - "paths": { - "@/*": ["src/*"], - "@bff/core/*": ["src/core/*"], - "@bff/infra/*": ["src/infra/*"], - "@bff/modules/*": ["src/modules/*"], - "@bff/integrations/*": ["src/integrations/*"] - } + "tsBuildInfoFile": "./tsconfig.build.tsbuildinfo" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "test", "**/*.spec.ts"], - "references": [{ "path": "../../packages/domain" }] + "references": [ + { "path": "../../packages/domain" }, + { "path": "../../packages/validation-service" } + ] } diff --git a/apps/bff/tsconfig.json b/apps/bff/tsconfig.json index 4b4bee3d..fd875d35 100644 --- a/apps/bff/tsconfig.json +++ b/apps/bff/tsconfig.json @@ -1,7 +1,38 @@ { - "extends": "./tsconfig.base.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { - "noEmit": true + "module": "Node16", + "moduleResolution": "node16", + "lib": ["ES2022"], + "noEmit": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@bff/core/*": ["src/core/*"], + "@bff/infra/*": ["src/infra/*"], + "@bff/modules/*": ["src/modules/*"], + "@bff/integrations/*": ["src/integrations/*"], + "@customer-portal/domain": ["../../packages/domain/src"], + "@customer-portal/domain/*": ["../../packages/domain/src/*"], + "@customer-portal/validation-service": ["../../packages/validation-service/src"], + "@customer-portal/validation-service/*": ["../../packages/validation-service/src/*"], + "@customer-portal/logging": ["../../packages/logging/src"], + "@customer-portal/logging/*": ["../../packages/logging/src/*"], + "@customer-portal/api-client": ["../../packages/api-client/src"], + "@customer-portal/api-client/*": ["../../packages/api-client/src/*"] + }, + "types": ["node"], + "typeRoots": ["./node_modules/@types"], + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false }, - "include": ["src/**/*"] + "ts-node": { + "transpileOnly": true, + "compilerOptions": { + "module": "CommonJS" + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] } diff --git a/apps/portal/package.json b/apps/portal/package.json index ac729668..5dbebda8 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -5,15 +5,17 @@ "scripts": { "predev": "node ./scripts/dev-prep.mjs", "dev": "next dev -p ${NEXT_PORT:-3000}", - "build": "next build", + "build": "NODE_OPTIONS=\"--max-old-space-size=4096\" next build", "build:turbo": "next build --turbopack", "start": "next start -p ${NEXT_PORT:-3000}", "lint": "eslint .", "lint:fix": "eslint . --fix", - "type-check": "tsc --noEmit", + "type-check": "NODE_OPTIONS=\"--max-old-space-size=6144 --max-semi-space-size=256\" tsc --project tsconfig.json --noEmit", + "type-check:watch": "NODE_OPTIONS=\"--max-old-space-size=6144 --max-semi-space-size=256\" tsc --project tsconfig.json --noEmit --watch", "test": "echo 'No tests yet'" }, "dependencies": { + "@customer-portal/validation-service": "workspace:*", "@heroicons/react": "^2.2.0", "@hookform/resolvers": "^5.2.1", "@tanstack/react-query": "^5.85.5", diff --git a/apps/portal/src/components/common/error-boundary.tsx b/apps/portal/src/components/common/error-boundary.tsx index 14446b71..876bbeb9 100644 --- a/apps/portal/src/components/common/error-boundary.tsx +++ b/apps/portal/src/components/common/error-boundary.tsx @@ -27,7 +27,12 @@ export class ErrorBoundary extends Component ``` -## Form Validation Utilities +## Form Validation with Zod -The library includes comprehensive form validation utilities: +The application uses Zod for type-safe form validation. Use the `useZodForm` hook for consistent form handling: ```tsx -import { validationRules, validateField, validateForm } from "@/components/ui"; +import { useZodForm } from "@/core/forms"; +import { loginFormSchema, type LoginFormData } from "@customer-portal/domain"; -// Define validation rules -const rules = [ - validationRules.required(), - validationRules.email(), - validationRules.minLength(8) -]; +function MyForm() { + const { + values, + errors, + touched, + isSubmitting, + setValue, + setTouchedField, + handleSubmit, + } = useZodForm({ + schema: loginFormSchema, + initialValues: { + email: "", + password: "", + }, + onSubmit: async (data) => { + // Handle form submission + await submitLogin(data); + }, + }); -// Validate a single field -const result = validateField(email, rules); - -// Validate entire form -const formRules = { - email: [validationRules.required(), validationRules.email()], - password: [validationRules.required(), validationRules.minLength(8)] -}; -const results = validateForm(formData, formRules); + return ( +
+ + setValue("email", e.target.value)} + onBlur={() => setTouchedField("email")} + /> + + +
+ ); +} ``` -**Available validation rules:** -- `required(message?)` -- `email(message?)` -- `minLength(min, message?)` -- `maxLength(max, message?)` -- `pattern(regex, message?)` -- `phone(message?)` -- `url(message?)` -- `number(message?)` -- `min(min, message?)` -- `max(max, message?)` +**Available Zod schemas in `@customer-portal/domain`:** +- `loginFormSchema` - Login form validation +- `signupFormSchema` - User registration +- `profileEditFormSchema` - Profile updates +- `addressFormSchema` - Address validation +- `passwordResetFormSchema` - Password reset flows ## Design Principles @@ -272,10 +288,13 @@ const results = validateForm(formData, formRules); /> ``` -5. **Use validation utilities** for consistent form handling: +5. **Use Zod validation** for consistent form handling: ```tsx - const emailRules = [validationRules.required(), validationRules.email()]; - const emailError = getFieldError(validationResults, 'email'); + const { values, errors, setValue } = useZodForm({ + schema: emailFormSchema, + initialValues: { email: "" }, + onSubmit: handleSubmit, + }); ``` ## Contributing diff --git a/apps/portal/src/core/forms/index.ts b/apps/portal/src/core/forms/index.ts new file mode 100644 index 00000000..991ef1bf --- /dev/null +++ b/apps/portal/src/core/forms/index.ts @@ -0,0 +1,10 @@ +/** + * Form utilities and hooks + * Simple Zod-based form validation + */ + +// Simple form hook +export { useZodForm } from './useZodForm'; + +// Re-export Zod for convenience +export { z } from 'zod'; diff --git a/apps/portal/src/core/forms/useZodForm.ts b/apps/portal/src/core/forms/useZodForm.ts new file mode 100644 index 00000000..99041299 --- /dev/null +++ b/apps/portal/src/core/forms/useZodForm.ts @@ -0,0 +1,7 @@ +/** + * React Hook for Zod-based Form Validation + * Simple Zod validation using validation-service + */ + +export { useZodForm } from '@customer-portal/validation-service/react'; +export type { ZodFormOptions } from '@customer-portal/validation-service/react'; diff --git a/apps/portal/src/core/validation/index.ts b/apps/portal/src/core/validation/index.ts deleted file mode 100644 index 1262893d..00000000 --- a/apps/portal/src/core/validation/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useMemo } from "react"; - -export type ValidationRule = (value: string) => string | null; - -const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - -export const validationRules = { - required: (message = "This field is required"): ValidationRule => value => - value && value.toString().trim().length > 0 ? null : message, - email: (message = "Enter a valid email address"): ValidationRule => value => - !value || emailRegex.test(value.toString()) ? null : message, - minLength: (length: number, message?: string): ValidationRule => value => - value && value.toString().length >= length - ? null - : message ?? `Must be at least ${length} characters`, - pattern: (pattern: RegExp, message = "Invalid value"): ValidationRule => value => - !value || pattern.test(value.toString()) ? null : message, -}; - -export interface FieldValidationResult { - isValid: boolean; - errors: string[]; -} - -export const validateField = ( - value: string, - rules: ValidationRule[] -): FieldValidationResult => { - const errors = rules - .map(rule => rule(value)) - .filter((error): error is string => Boolean(error)); - - return { - isValid: errors.length === 0, - errors, - }; -}; - -export const validateForm = ( - values: Record, - config: Record -) => { - const fieldErrors: Record = {}; - let isValid = true; - - for (const [field, fieldRules] of Object.entries(config)) { - const { isValid: fieldValid, errors } = validateField(values[field] ?? "", fieldRules); - if (!fieldValid) { - fieldErrors[field] = errors[0]; - isValid = false; - } - } - - return { isValid, errors: fieldErrors }; -}; - -export const useFormValidation = () => - useMemo( - () => ({ - validationRules, - validateField, - validateForm, - }), - [] - ); - -export type ValidationRules = typeof validationRules; diff --git a/apps/portal/src/features/account/hooks/index.ts b/apps/portal/src/features/account/hooks/index.ts index c770b90b..f23520bd 100644 --- a/apps/portal/src/features/account/hooks/index.ts +++ b/apps/portal/src/features/account/hooks/index.ts @@ -1,4 +1,3 @@ export { useProfileData } from "./useProfileData"; export { useProfileEdit } from "./useProfileEdit"; export { useAddressEdit } from "./useAddressEdit"; -export { useAddressForm } from "./useAddressForm"; diff --git a/apps/portal/src/features/account/hooks/useAddressEdit.ts b/apps/portal/src/features/account/hooks/useAddressEdit.ts index efb00637..09f672a4 100644 --- a/apps/portal/src/features/account/hooks/useAddressEdit.ts +++ b/apps/portal/src/features/account/hooks/useAddressEdit.ts @@ -1,41 +1,31 @@ "use client"; -import { useState } from "react"; +import { useCallback } from "react"; import { accountService } from "@/features/account/services/account.service"; - -// Use domain Address type -import type { Address } from "@customer-portal/domain"; -type AddressFormData = Address; +import { + addressFormSchema, + addressFormToRequest, + type AddressFormData +} from "@customer-portal/domain"; +import { useZodForm } from "@/core/forms"; export function useAddressEdit(initial: AddressFormData) { - const [form, setForm] = useState(initial); - const [saving, setSaving] = useState(false); - const [error, setError] = useState(null); - - const setField = (field: keyof AddressFormData, value: string) => { - setForm(prev => ({ ...prev, [field]: value })); - }; - - const save = async () => { - setSaving(true); - setError(null); + const handleSave = useCallback(async (formData: AddressFormData) => { try { - await accountService.updateAddress({ - street: form.street, - streetLine2: form.streetLine2, - city: form.city, - state: form.state, - postalCode: form.postalCode, - country: form.country, - }); - return true; - } catch (e) { - setError(e instanceof Error ? e.message : "Failed to update address"); - return false; - } finally { - setSaving(false); + const requestData = addressFormToRequest(formData); + await accountService.updateAddress(requestData); + return formData; // Return the form data as confirmation + } catch (error) { + throw error; // Let useZodForm handle the error state } - }; + }, []); - return { form, setForm, setField, save, saving, error } as const; + return useZodForm({ + schema: addressFormSchema, + initialValues: initial, + onSubmit: handleSave, + }); } + +// Re-export the type for backward compatibility +export type { AddressFormData }; \ No newline at end of file diff --git a/apps/portal/src/features/account/hooks/useAddressForm.ts b/apps/portal/src/features/account/hooks/useAddressForm.ts deleted file mode 100644 index 0686ec4b..00000000 --- a/apps/portal/src/features/account/hooks/useAddressForm.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use client"; - -import { useState } from "react"; - -// Use domain Address type -import type { Address } from "@customer-portal/domain"; -type AddressData = Address; - -export function useAddressForm(initial: AddressData) { - const [address, setAddress] = useState(initial); - const [errors, setErrors] = useState([]); - - const setField = (field: keyof AddressData, value: string) => { - setAddress(prev => ({ ...prev, [field]: value })); - }; - - const validate = () => { - const next: string[] = []; - if (!address.street?.trim()) next.push("Street Address is required"); - if (!address.city?.trim()) next.push("City is required"); - if (!address.state?.trim()) next.push("State/Prefecture is required"); - if (!address.postalCode?.trim()) next.push("Postal Code is required"); - if (!address.country?.trim()) next.push("Country is required"); - setErrors(next); - return next.length === 0; - }; - - return { address, setField, setAddress, errors, validate } as const; -} diff --git a/apps/portal/src/features/account/hooks/useProfileData.ts b/apps/portal/src/features/account/hooks/useProfileData.ts index 4623182e..4b2907a2 100644 --- a/apps/portal/src/features/account/hooks/useProfileData.ts +++ b/apps/portal/src/features/account/hooks/useProfileData.ts @@ -6,8 +6,8 @@ import { accountService } from "@/features/account/services/account.service"; import { logger } from "@customer-portal/logging"; // Use centralized profile types -import type { ProfileFormData } from "@customer-portal/domain"; -export type { ProfileFormData }; +import type { ProfileEditFormData } from "@customer-portal/domain"; +export type { ProfileEditFormData }; // Address type moved to domain package import type { Address } from "@customer-portal/domain"; @@ -20,7 +20,7 @@ export function useProfileData() { const [isSavingAddress, setIsSavingAddress] = useState(false); const [billingInfo, setBillingInfo] = useState<{ address: Address } | null>(null); - const [formData, setFormData] = useState({ + const [formData, setFormData] = useState({ firstName: user?.firstName || "", lastName: user?.lastName || "", email: user?.email || "", @@ -82,7 +82,7 @@ export function useProfileData() { } }, [user]); - const saveProfile = async (next: ProfileFormData) => { + const saveProfile = async (next: ProfileEditFormData) => { setIsSavingProfile(true); try { const updatedUser = await accountService.updateProfile({ diff --git a/apps/portal/src/features/account/hooks/useProfileEdit.ts b/apps/portal/src/features/account/hooks/useProfileEdit.ts index 0b128ae9..64e9d4f9 100644 --- a/apps/portal/src/features/account/hooks/useProfileEdit.ts +++ b/apps/portal/src/features/account/hooks/useProfileEdit.ts @@ -1,43 +1,38 @@ "use client"; -import { useState } from "react"; +import { useCallback } from "react"; import { accountService } from "@/features/account/services/account.service"; import { useAuthStore } from "@/features/auth/services/auth.store"; - -// Use centralized profile types -import type { ProfileEditFormData } from "@customer-portal/domain"; -export type { ProfileEditFormData }; +import { + profileEditFormSchema, + profileFormToRequest, + type ProfileEditFormData +} from "@customer-portal/domain"; +import { useZodForm } from "@/core/forms"; export function useProfileEdit(initial: ProfileEditFormData) { - const [form, setForm] = useState(initial); - const [saving, setSaving] = useState(false); - const [error, setError] = useState(null); - - const setField = (field: keyof ProfileEditFormData, value: string) => { - setForm(prev => ({ ...prev, [field]: value })); - }; - - const save = async () => { - setSaving(true); - setError(null); + const handleSave = useCallback(async (formData: ProfileEditFormData) => { try { - const updated = await accountService.updateProfile({ - firstName: form.firstName, - lastName: form.lastName, - phone: form.phone, - }); + const requestData = profileFormToRequest(formData); + const updated = await accountService.updateProfile(requestData); + useAuthStore.setState(state => ({ ...state, user: state.user ? { ...state.user, ...updated } : state.user, })); - return true; - } catch (e) { - setError(e instanceof Error ? e.message : "Failed to update profile"); - return false; - } finally { - setSaving(false); + + return updated; + } catch (error) { + throw error; // Let useZodForm handle the error state } - }; + }, []); - return { form, setField, setForm, save, saving, error } as const; + return useZodForm({ + schema: profileEditFormSchema, + initialValues: initial, + onSubmit: handleSave, + }); } + +// Re-export the type for backward compatibility +export type { ProfileEditFormData }; \ No newline at end of file diff --git a/apps/portal/src/features/account/views/ProfileContainer.tsx b/apps/portal/src/features/account/views/ProfileContainer.tsx index 0d814083..3242a5cc 100644 --- a/apps/portal/src/features/account/views/ProfileContainer.tsx +++ b/apps/portal/src/features/account/views/ProfileContainer.tsx @@ -42,7 +42,7 @@ export default function ProfileContainer() { accountService.getProfile().catch(() => null), ]); if (addr) { - address.setForm({ + address.setValues({ street: addr.street ?? "", streetLine2: addr.streetLine2 ?? "", city: addr.city ?? "", @@ -52,7 +52,7 @@ export default function ProfileContainer() { }); } if (prof) { - profile.setForm({ + profile.setValues({ firstName: prof.firstName || "", lastName: prof.lastName || "", phone: prof.phone || "", @@ -179,8 +179,8 @@ export default function ProfileContainer() { {editingProfile ? ( profile.setField("firstName", e.target.value)} + value={profile.values.firstName} + onChange={e => profile.setValue("firstName", e.target.value)} className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> ) : ( @@ -194,8 +194,8 @@ export default function ProfileContainer() { {editingProfile ? ( profile.setField("lastName", e.target.value)} + value={profile.values.lastName} + onChange={e => profile.setValue("lastName", e.target.value)} className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> ) : ( @@ -222,8 +222,8 @@ export default function ProfileContainer() { {editingProfile ? ( profile.setField("phone", e.target.value)} + value={profile.values.phone} + onChange={e => profile.setValue("phone", e.target.value)} placeholder="+81 XX-XXXX-XXXX" className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> @@ -241,7 +241,7 @@ export default function ProfileContainer() { variant="outline" size="sm" onClick={() => setEditingProfile(false)} - disabled={profile.saving} + disabled={profile.isSubmitting} > Cancel @@ -249,13 +249,15 @@ export default function ProfileContainer() { - {address.error && ( + {address.submitError && ( - {address.error} + {address.submitError} )} ) : (
- {address.form.street || address.form.city ? ( + {address.values.street || address.values.city ? (
- {address.form.street &&

{address.form.street}

} - {address.form.streetLine2 &&

{address.form.streetLine2}

} + {address.values.street &&

{address.values.street}

} + {address.values.streetLine2 &&

{address.values.streetLine2}

}

- {[address.form.city, address.form.state, address.form.postalCode] + {[address.values.city, address.values.state, address.values.postalCode] .filter(Boolean) .join(", ")}

-

{address.form.country}

+

{address.values.country}

) : ( diff --git a/apps/portal/src/features/auth/components/LinkWhmcsForm/LinkWhmcsForm.tsx b/apps/portal/src/features/auth/components/LinkWhmcsForm/LinkWhmcsForm.tsx index 37f1d673..871c2c9c 100644 --- a/apps/portal/src/features/auth/components/LinkWhmcsForm/LinkWhmcsForm.tsx +++ b/apps/portal/src/features/auth/components/LinkWhmcsForm/LinkWhmcsForm.tsx @@ -1,17 +1,14 @@ "use client"; -import { useState, useCallback } from "react"; +import { useCallback } from "react"; import { Button, Input, ErrorMessage } from "@/components/ui"; import { FormField } from "@/components/common/FormField"; import { useWhmcsLink } from "@/features/auth/hooks"; -import { z } from "@customer-portal/domain"; - -const linkSchema = z.object({ - email: z.string().email("Please enter a valid email address"), - password: z.string().min(1, "Password is required"), -}); - -type LinkWhmcsFormData = z.infer; +import { + linkWhmcsRequestSchema, + type LinkWhmcsRequest +} from "@customer-portal/domain"; +import { useZodForm } from "@/core/forms"; interface LinkWhmcsFormProps { onTransferred?: (result: { needsPasswordSet: boolean; email: string }) => void; @@ -21,161 +18,107 @@ interface LinkWhmcsFormProps { export function LinkWhmcsForm({ onTransferred, className = "" }: LinkWhmcsFormProps) { const { linkWhmcs, loading, error, clearError } = useWhmcsLink(); - const [formData, setFormData] = useState({ - email: "", - password: "", - }); - const [errors, setErrors] = useState>>({}); - const [touched, setTouched] = useState>({ - email: false, - password: false, - }); - - const validateField = useCallback( - (field: keyof LinkWhmcsFormData, value: string) => { - try { - linkSchema.shape[field].parse(value); - setErrors(prev => ({ ...prev, [field]: undefined })); - return true; - } catch (err) { - if (err instanceof z.ZodError) { - const message = err.issues[0]?.message ?? "Invalid value"; - setErrors(prev => ({ ...prev, [field]: message })); - } - return false; - } - }, - [] - ); - - const validateForm = useCallback(() => { - const result = linkSchema.safeParse(formData); - if (result.success) { - setErrors(prev => ({ ...prev, email: undefined, password: undefined, general: undefined })); - return true; + const handleLink = useCallback(async (formData: LinkWhmcsRequest) => { + clearError(); + try { + const result = await linkWhmcs(formData); + onTransferred?.(result); + } catch (err) { + // Error is handled by useZodForm + throw err; } + }, [linkWhmcs, onTransferred, clearError]); - const fieldErrors: Partial> = {}; - result.error.issues.forEach(issue => { - const field = issue.path[0]; - if (field === "email" || field === "password") { - fieldErrors[field] = issue.message; - } - }); - setErrors(prev => ({ ...prev, ...fieldErrors })); - return false; - }, [formData]); - - const handleFieldChange = useCallback( - (field: keyof LinkWhmcsFormData, value: string) => { - setFormData(prev => ({ ...prev, [field]: value })); - - if (errors.general) { - setErrors(prev => ({ ...prev, general: undefined })); - clearError(); - } - - if (touched[field]) { - setTimeout(() => { - validateField(field, value); - }, 0); - } + const { + values, + errors, + touched, + isSubmitting, + setValue, + setTouchedField, + handleSubmit, + } = useZodForm({ + schema: linkWhmcsRequestSchema, + initialValues: { + email: "", + password: "", }, - [errors.general, touched, validateField, clearError] - ); - - const handleFieldBlur = useCallback( - (field: keyof LinkWhmcsFormData) => { - setTouched(prev => ({ ...prev, [field]: true })); - validateField(field, formData[field]); - }, - [formData, validateField] - ); - - const handleSubmit = useCallback( - async (event: React.FormEvent) => { - event.preventDefault(); - - setTouched({ email: true, password: true }); - - if (!validateForm()) { - return; - } - - try { - const result = await linkWhmcs(formData.email.trim(), formData.password); - - onTransferred?.({ needsPasswordSet: result.needsPasswordSet, email: formData.email.trim() }); - } catch (err) { - const message = err instanceof Error ? err.message : "Failed to transfer account"; - setErrors(prev => ({ ...prev, general: message })); - } - }, - [formData, validateForm, linkWhmcs, onTransferred] - ); - - const isFormValid = - !errors.email && - !errors.password && - formData.email.length > 0 && - formData.password.length > 0; + onSubmit: handleLink, + }); return ( -
{ - void handleSubmit(e); - }} - className={`space-y-6 ${className}`} - noValidate - > - {(errors.general || error) && ( - - {errors.general || error} - - )} +
+
+
+

+ Link Your WHMCS Account +

+

+ Enter your existing WHMCS credentials to link your account and migrate your data. +

+
- - handleFieldChange("email", e.target.value)} - onBlur={() => handleFieldBlur("email")} - placeholder="Your existing account email" - disabled={loading} - error={errors.email} - autoComplete="email" - autoFocus - /> - + + + setValue("email", e.target.value)} + onBlur={() => setTouchedField("email")} + placeholder="Enter your WHMCS email" + disabled={isSubmitting || loading} + className="w-full" + /> + - - handleFieldChange("password", e.target.value)} - onBlur={() => handleFieldBlur("password")} - placeholder="Your existing account password" - disabled={loading} - error={errors.password} - autoComplete="current-password" - /> -

- Use the same credentials you used to access your previous portal. -

-
+ + setValue("password", e.target.value)} + onBlur={() => setTouchedField("password")} + placeholder="Enter your WHMCS password" + disabled={isSubmitting || loading} + className="w-full" + /> + - - + {error && ( + + {error} + + )} + + + + +
+

+ Your credentials are used only to verify your identity and migrate your data securely. +

+
+
+
); -} - -export default LinkWhmcsForm; +} \ No newline at end of file diff --git a/apps/portal/src/features/auth/components/LoginForm/LoginForm.tsx b/apps/portal/src/features/auth/components/LoginForm/LoginForm.tsx index 716d3196..1860d197 100644 --- a/apps/portal/src/features/auth/components/LoginForm/LoginForm.tsx +++ b/apps/portal/src/features/auth/components/LoginForm/LoginForm.tsx @@ -5,15 +5,17 @@ "use client"; -import { useState, useCallback } from "react"; +import { useCallback } from "react"; import Link from "next/link"; import { Button, Input, ErrorMessage } from "@/components/ui"; import { FormField } from "@/components/common/FormField"; import { useLogin } from "../../hooks/use-auth"; -import { loginFormSchema, z } from "@customer-portal/domain"; - -// Infer the type locally to avoid export issues -type LoginFormData = z.infer; +import { + loginFormSchema, + loginFormToRequest, + type LoginFormData +} from "@customer-portal/domain"; +import { useZodForm } from "@/core/forms"; interface LoginFormProps { onSuccess?: () => void; @@ -32,210 +34,136 @@ export function LoginForm({ }: LoginFormProps) { const { login, loading, error, clearError } = useLogin(); - // โœ… Clean Zod-based form state - const [formData, setFormData] = useState({ - email: "", - password: "", - rememberMe: false, + const handleLogin = useCallback(async (formData: LoginFormData) => { + clearError(); + try { + const requestData = loginFormToRequest(formData); + await login(requestData); + onSuccess?.(); + } catch (err) { + const message = err instanceof Error ? err.message : "Login failed"; + onError?.(message); + throw err; // Re-throw to let useZodForm handle the error state + } + }, [login, onSuccess, onError, clearError]); + + const { + values, + errors, + touched, + isSubmitting, + setValue, + setTouchedField, + handleSubmit, + validateField, + } = useZodForm({ + schema: loginFormSchema, + initialValues: { + email: "", + password: "", + rememberMe: false, + }, + onSubmit: handleLogin, }); - const [errors, setErrors] = useState>({}); - const [touched, setTouched] = useState>({}); - - // โœ… Zod validation function - const validateForm = useCallback(() => { - try { - loginFormSchema.parse(formData); - setErrors({}); - return true; - } catch (error) { - if (error instanceof z.ZodError) { - const fieldErrors: Record = {}; - error.issues.forEach((issue) => { - const path = issue.path.join('.'); - fieldErrors[path] = issue.message; - }); - setErrors(fieldErrors); - } - return false; - } - }, [formData]); - - const validateField = useCallback((field: keyof LoginFormData) => { - try { - // Validate specific field by parsing just that field value - if (field === 'email') { - loginFormSchema.shape.email.parse(formData.email); - } else if (field === 'password') { - loginFormSchema.shape.password.parse(formData.password); - } else if (field === 'rememberMe') { - loginFormSchema.shape.rememberMe.parse(formData.rememberMe); - } - setErrors((prev: Record) => ({ ...prev, [field]: '' })); - return true; - } catch (error) { - if (error instanceof z.ZodError) { - const errorMessage = error.issues[0]?.message || 'Invalid value'; - setErrors((prev: Record) => ({ ...prev, [field]: errorMessage })); - } - return false; - } - }, [formData]); - - // โœ… Clean field change handler - const handleFieldChange = useCallback( - (field: keyof LoginFormData, value: string | boolean) => { - setFormData(prev => ({ ...prev, [field]: value })); - - // Clear general error when user starts typing - if (error) { - clearError(); - } - - // Validate field if it has been touched - if (touched[field]) { - setTimeout(() => validateField(field), 0); - } - }, - [error, touched, validateField, clearError] - ); - - // โœ… Clean field blur handler - const handleFieldBlur = useCallback( - (field: keyof LoginFormData) => { - setTouched(prev => ({ ...prev, [field]: true })); - validateField(field); - }, - [validateField] - ); - - // โœ… Clean form submission handler - const handleSubmit = useCallback( - async (e: React.FormEvent) => { - e.preventDefault(); - - // Mark all fields as touched - setTouched({ - email: true, - password: true, - rememberMe: true, - }); - - // Validate form with Zod - if (!validateForm()) { - return; - } - - try { - await login({ - email: formData.email.trim(), - password: formData.password, - rememberMe: formData.rememberMe, - }); - onSuccess?.(); - } catch (err) { - const errorMessage = err instanceof Error ? err.message : "Login failed"; - setErrors(prev => ({ ...prev, general: errorMessage })); - onError?.(errorMessage); - } - }, - [formData, validateForm, login, onSuccess, onError] - ); - - // Check if form is valid - const isFormValidState = !errors.email && !errors.password && formData.email && formData.password; - return ( -
{ - void handleSubmit(e); - }} - className={`space-y-6 ${className}`} - noValidate - > - {/* General Error */} - {(errors.general || error) && ( - - {errors.general || error} - - )} - - {/* Email Field */} - handleFieldChange("email", e.target.value)} - onBlur={() => handleFieldBlur("email")} - placeholder="Enter your email address" - disabled={loading} - autoComplete="email" - autoFocus - /> - - {/* Password Field */} - handleFieldChange("password", e.target.value)} - onBlur={() => handleFieldBlur("password")} - placeholder="Enter your password" - disabled={loading} - autoComplete="current-password" - /> - - {/* Remember Me */} -
-