@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 27.9 kB
Source Map (JSON)
{"version":3,"file":"error.cjs","sources":["../../../src/utils/error.ts"],"sourcesContent":["import type {FrankAuthError, JSONObject} from '../types';\n\n// Base error classes\nexport class FrankAuthBaseError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly details?: JSONObject;\n public readonly timestamp: string;\n public readonly context?: string;\n\n constructor(\n message: string,\n code = 'FRANK_AUTH_ERROR',\n statusCode?: number,\n details?: JSONObject,\n context?: string\n ) {\n super(message);\n this.name = 'FrankAuthError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n this.timestamp = new Date().toISOString();\n this.context = context;\n\n // Ensure the error stack is captured correctly\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON(): FrankAuthError {\n return {\n code: this.code,\n message: this.message,\n details: this.details,\n statusCode: this.statusCode,\n };\n }\n}\n\n// Specific error classes\nexport class AuthenticationError extends FrankAuthBaseError {\n constructor(message = 'Authentication failed', details?: JSONObject) {\n super(message, 'AUTHENTICATION_ERROR', 401, details, 'authentication');\n }\n}\n\nexport class AuthorizationError extends FrankAuthBaseError {\n constructor(message = 'Access denied', details?: JSONObject) {\n super(message, 'AUTHORIZATION_ERROR', 403, details, 'authorization');\n }\n}\n\nexport class ValidationError extends FrankAuthBaseError {\n public readonly fieldErrors: Record<string, string[]>;\n\n constructor(\n message = 'Validation failed',\n fieldErrors: Record<string, string[]> = {},\n details?: JSONObject\n ) {\n super(message, 'VALIDATION_ERROR', 400, details, 'validation');\n this.fieldErrors = fieldErrors;\n }\n\n getFieldError(field: string): string | undefined {\n const errors = this.fieldErrors[field];\n return errors && errors.length > 0 ? errors[0] : undefined;\n }\n\n hasFieldError(field: string): boolean {\n return Boolean(this.fieldErrors[field]?.length);\n }\n\n getAllFieldErrors(): string[] {\n return Object.values(this.fieldErrors).flat();\n }\n}\n\nexport class NetworkError extends FrankAuthBaseError {\n public readonly isRetryable: boolean;\n\n constructor(\n message = 'Network request failed',\n isRetryable = true,\n details?: JSONObject\n ) {\n super(message, 'NETWORK_ERROR', undefined, details, 'network');\n this.isRetryable = isRetryable;\n }\n}\n\nexport class TimeoutError extends FrankAuthBaseError {\n constructor(message = 'Request timed out', details?: JSONObject) {\n super(message, 'TIMEOUT_ERROR', 408, details, 'timeout');\n }\n}\n\nexport class RateLimitError extends FrankAuthBaseError {\n public readonly retryAfter?: number;\n\n constructor(\n message = 'Rate limit exceeded',\n retryAfter?: number,\n details?: JSONObject\n ) {\n super(message, 'RATE_LIMIT_ERROR', 429, details, 'rate_limit');\n this.retryAfter = retryAfter;\n }\n}\n\nexport class ServerError extends FrankAuthBaseError {\n constructor(message = 'Internal server error', details?: JSONObject) {\n super(message, 'SERVER_ERROR', 500, details, 'server');\n }\n}\n\nexport class ConfigurationError extends FrankAuthBaseError {\n constructor(message = 'Configuration error', details?: JSONObject) {\n super(message, 'CONFIGURATION_ERROR', undefined, details, 'configuration');\n }\n}\n\nexport class SessionError extends FrankAuthBaseError {\n constructor(message = 'Session error', details?: JSONObject) {\n super(message, 'SESSION_ERROR', 401, details, 'session');\n }\n}\n\nexport class MFAError extends FrankAuthBaseError {\n public readonly challenge?: any;\n\n constructor(\n message = 'Multi-factor authentication required',\n challenge?: any,\n details?: JSONObject\n ) {\n super(message, 'MFA_ERROR', 428, details, 'mfa');\n this.challenge = challenge;\n }\n}\n\nexport class PasskeyError extends FrankAuthBaseError {\n constructor(message = 'Passkey operation failed', details?: JSONObject) {\n super(message, 'PASSKEY_ERROR', undefined, details, 'passkey');\n }\n}\n\nexport class OAuthError extends FrankAuthBaseError {\n public readonly provider?: string;\n public readonly errorCode?: string;\n\n constructor(\n message = 'OAuth authentication failed',\n provider?: string,\n errorCode?: string,\n details?: JSONObject\n ) {\n super(message, 'OAUTH_ERROR', 400, details, 'oauth');\n this.provider = provider;\n this.errorCode = errorCode;\n }\n}\n\nexport class OrganizationError extends FrankAuthBaseError {\n constructor(message = 'Organization error', details?: JSONObject) {\n super(message, 'ORGANIZATION_ERROR', 400, details, 'organization');\n }\n}\n\nexport class InvitationError extends FrankAuthBaseError {\n constructor(message = 'Invitation error', details?: JSONObject) {\n super(message, 'INVITATION_ERROR', 400, details, 'invitation');\n }\n}\n\n// Error factory functions\nexport const createError = (\n type: string,\n message: string,\n details?: JSONObject\n): FrankAuthBaseError => {\n switch (type) {\n case 'AUTHENTICATION_ERROR':\n return new AuthenticationError(message, details);\n case 'AUTHORIZATION_ERROR':\n return new AuthorizationError(message, details);\n case 'VALIDATION_ERROR':\n return new ValidationError(message, {}, details);\n case 'NETWORK_ERROR':\n return new NetworkError(message, true, details);\n case 'TIMEOUT_ERROR':\n return new TimeoutError(message, details);\n case 'RATE_LIMIT_ERROR':\n return new RateLimitError(message, undefined, details);\n case 'SERVER_ERROR':\n return new ServerError(message, details);\n case 'CONFIGURATION_ERROR':\n return new ConfigurationError(message, details);\n case 'SESSION_ERROR':\n return new SessionError(message, details);\n case 'MFA_ERROR':\n return new MFAError(message, undefined, details);\n case 'PASSKEY_ERROR':\n return new PasskeyError(message, details);\n case 'OAUTH_ERROR':\n return new OAuthError(message, undefined, undefined, details);\n case 'ORGANIZATION_ERROR':\n return new OrganizationError(message, details);\n case 'INVITATION_ERROR':\n return new InvitationError(message, details);\n default:\n return new FrankAuthBaseError(message, type, undefined, details);\n }\n};\n\nexport const createAuthenticationError = (message?: string, details?: JSONObject) =>\n new AuthenticationError(message, details);\n\nexport const createAuthorizationError = (message?: string, details?: JSONObject) =>\n new AuthorizationError(message, details);\n\nexport const createValidationError = (\n message?: string,\n fieldErrors?: Record<string, string[]>,\n details?: JSONObject\n) => new ValidationError(message, fieldErrors, details);\n\nexport const createNetworkError = (\n message?: string,\n isRetryable?: boolean,\n details?: JSONObject\n) => new NetworkError(message, isRetryable, details);\n\nexport const createSessionError = (message?: string, details?: JSONObject) =>\n new SessionError(message, details);\n\nexport const createMFAError = (\n message?: string,\n challenge?: any,\n details?: JSONObject\n) => new MFAError(message, challenge, details);\n\n// Error type guards\nexport const isFrankAuthError = (error: any): error is FrankAuthBaseError => {\n return error instanceof FrankAuthBaseError ||\n (error && typeof error === 'object' && error.code && error.message);\n};\n\nexport const isAuthenticationError = (error: any): error is AuthenticationError => {\n return error instanceof AuthenticationError ||\n (isFrankAuthError(error) && error.code === 'AUTHENTICATION_ERROR');\n};\n\nexport const isAuthorizationError = (error: any): error is AuthorizationError => {\n return error instanceof AuthorizationError ||\n (isFrankAuthError(error) && error.code === 'AUTHORIZATION_ERROR');\n};\n\nexport const isValidationError = (error: any): error is ValidationError => {\n return error instanceof ValidationError ||\n (isFrankAuthError(error) && error.code === 'VALIDATION_ERROR');\n};\n\nexport const isNetworkError = (error: any): error is NetworkError => {\n return error instanceof NetworkError ||\n (isFrankAuthError(error) && error.code === 'NETWORK_ERROR');\n};\n\nexport const isTimeoutError = (error: any): error is TimeoutError => {\n return error instanceof TimeoutError ||\n (isFrankAuthError(error) && error.code === 'TIMEOUT_ERROR');\n};\n\nexport const isRateLimitError = (error: any): error is RateLimitError => {\n return error instanceof RateLimitError ||\n (isFrankAuthError(error) && error.code === 'RATE_LIMIT_ERROR');\n};\n\nexport const isServerError = (error: any): error is ServerError => {\n return error instanceof ServerError ||\n (isFrankAuthError(error) && error.code === 'SERVER_ERROR');\n};\n\nexport const isSessionError = (error: any): error is SessionError => {\n return error instanceof SessionError ||\n (isFrankAuthError(error) && error.code === 'SESSION_ERROR');\n};\n\nexport const isMFAError = (error: any): error is MFAError => {\n return error instanceof MFAError ||\n (isFrankAuthError(error) && error.code === 'MFA_ERROR');\n};\n\nexport const isPasskeyError = (error: any): error is PasskeyError => {\n return error instanceof PasskeyError ||\n (isFrankAuthError(error) && error.code === 'PASSKEY_ERROR');\n};\n\nexport const isOAuthError = (error: any): error is OAuthError => {\n return error instanceof OAuthError ||\n (isFrankAuthError(error) && error.code === 'OAUTH_ERROR');\n};\n\nexport const isRetryableError = (error: any): boolean => {\n if (isNetworkError(error)) {\n return error.isRetryable;\n }\n\n if (isTimeoutError(error) || isRateLimitError(error) || isServerError(error)) {\n return true;\n }\n\n return false;\n};\n\n// Error handling utilities\nexport const handleError = (\n error: any,\n context?: string,\n defaultMessage?: string\n): FrankAuthBaseError => {\n if (isFrankAuthError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n return new FrankAuthBaseError(\n error.message || defaultMessage || 'An error occurred',\n 'UNKNOWN_ERROR',\n undefined,\n { originalError: error.name },\n context\n );\n }\n\n if (typeof error === 'string') {\n return new FrankAuthBaseError(\n error || defaultMessage || 'An error occurred',\n 'UNKNOWN_ERROR',\n undefined,\n undefined,\n context\n );\n }\n\n return new FrankAuthBaseError(\n defaultMessage || 'An unknown error occurred',\n 'UNKNOWN_ERROR',\n undefined,\n { originalError: error },\n context\n );\n};\n\nexport const parseAPIError = (response: any): FrankAuthBaseError => {\n if (!response) {\n return new ServerError('No response received');\n }\n\n const { status, data } = response;\n\n // Handle different status codes\n switch (status) {\n case 400:\n if (data?.errors) {\n return new ValidationError(\n data.message || 'Validation failed',\n data.errors,\n data\n );\n }\n return new FrankAuthBaseError(\n data?.message || 'Bad request',\n 'BAD_REQUEST',\n 400,\n data\n );\n\n case 401:\n return new AuthenticationError(\n data?.message || 'Authentication required',\n data\n );\n\n case 403:\n return new AuthorizationError(\n data?.message || 'Access denied',\n data\n );\n\n case 404:\n return new FrankAuthBaseError(\n data?.message || 'Resource not found',\n 'NOT_FOUND',\n 404,\n data\n );\n\n case 408:\n return new TimeoutError(\n data?.message || 'Request timeout',\n data\n );\n\n case 429:\n return new RateLimitError(\n data?.message || 'Rate limit exceeded',\n data?.retryAfter,\n data\n );\n\n case 500:\n case 502:\n case 503:\n case 504:\n return new ServerError(\n data?.message || 'Server error',\n data\n );\n\n default:\n return new FrankAuthBaseError(\n data?.message || `HTTP ${status} error`,\n `HTTP_${status}`,\n status,\n data\n );\n }\n};\n\nexport const formatErrorMessage = (error: any): string => {\n if (isFrankAuthError(error)) {\n return error.message;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return 'An unknown error occurred';\n};\n\nexport const getErrorCode = (error: any): string => {\n if (isFrankAuthError(error)) {\n return error.code;\n }\n\n if (error instanceof Error) {\n return error.name;\n }\n\n return 'UNKNOWN_ERROR';\n};\n\nexport const getErrorDetails = (error: any): JSONObject | undefined => {\n if (isFrankAuthError(error)) {\n return error.details;\n }\n\n return undefined;\n};\n\n// Error logging utilities\nexport interface ErrorLogger {\n error(message: string, error?: any, context?: JSONObject): void;\n warn(message: string, context?: JSONObject): void;\n info(message: string, context?: JSONObject): void;\n debug(message: string, context?: JSONObject): void;\n}\n\nexport const createConsoleLogger = (): ErrorLogger => ({\n error: (message, error, context) => {\n console.error(message, error, context);\n },\n warn: (message, context) => {\n console.warn(message, context);\n },\n info: (message, context) => {\n console.info(message, context);\n },\n debug: (message, context) => {\n console.debug(message, context);\n },\n});\n\nexport const logError = (\n error: any,\n logger: ErrorLogger = createConsoleLogger(),\n context?: JSONObject\n): void => {\n const frankError = handleError(error);\n\n logger.error(\n `[${frankError.code}] ${frankError.message}`,\n {\n error: frankError,\n stack: frankError.stack,\n timestamp: frankError.timestamp,\n context: frankError.context,\n ...context,\n }\n );\n};\n\n// Error retry utilities\nexport interface RetryOptions {\n maxAttempts: number;\n delay: number;\n backoff: 'fixed' | 'exponential' | 'linear';\n shouldRetry?: (error: any, attempt: number) => boolean;\n onRetry?: (error: any, attempt: number) => void;\n}\n\nexport const withRetry = async <T>(\n operation: () => Promise<T>,\n options: Partial<RetryOptions> = {}\n): Promise<T> => {\n const {\n maxAttempts = 3,\n delay = 1000,\n backoff = 'exponential',\n shouldRetry = isRetryableError,\n onRetry,\n } = options;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxAttempts || !shouldRetry(error, attempt)) {\n throw handleError(error);\n }\n\n if (onRetry) {\n onRetry(error, attempt);\n }\n\n // Calculate delay based on backoff strategy\n let actualDelay = delay;\n switch (backoff) {\n case 'exponential':\n actualDelay = delay * Math.pow(2, attempt - 1);\n break;\n case 'linear':\n actualDelay = delay * attempt;\n break;\n case 'fixed':\n default:\n actualDelay = delay;\n break;\n }\n\n // Add some jitter to prevent thundering herd\n actualDelay += Math.random() * 1000;\n\n await new Promise(resolve => setTimeout(resolve, actualDelay));\n }\n }\n\n throw handleError(lastError);\n};\n\n// Error boundary helpers for React\nexport interface ErrorBoundaryState {\n hasError: boolean;\n error?: FrankAuthBaseError;\n}\n\nexport const createErrorBoundaryState = (): ErrorBoundaryState => ({\n hasError: false,\n error: undefined,\n});\n\nexport const handleErrorBoundaryError = (\n error: any,\n errorInfo?: any\n): ErrorBoundaryState => ({\n hasError: true,\n error: handleError(error, 'error_boundary', 'Component error occurred'),\n});\n\n// Export utilities object\nexport const ErrorUtils = {\n // Error classes\n FrankAuthBaseError,\n AuthenticationError,\n AuthorizationError,\n ValidationError,\n NetworkError,\n TimeoutError,\n RateLimitError,\n ServerError,\n ConfigurationError,\n SessionError,\n MFAError,\n PasskeyError,\n OAuthError,\n OrganizationError,\n InvitationError,\n\n // Factory functions\n createError,\n createAuthenticationError,\n createAuthorizationError,\n createValidationError,\n createNetworkError,\n createSessionError,\n createMFAError,\n\n // Type guards\n isFrankAuthError,\n isAuthenticationError,\n isAuthorizationError,\n isValidationError,\n isNetworkError,\n isTimeoutError,\n isRateLimitError,\n isServerError,\n isSessionError,\n isMFAError,\n isPasskeyError,\n isOAuthError,\n isRetryableError,\n\n // Utilities\n handleError,\n parseAPIError,\n formatErrorMessage,\n getErrorCode,\n getErrorDetails,\n logError,\n withRetry,\n\n // Error boundary\n createErrorBoundaryState,\n handleErrorBoundaryError,\n};"],"names":["FrankAuthBaseError","message","code","statusCode","details","context","__publicField","AuthenticationError","AuthorizationError","ValidationError","fieldErrors","field","errors","NetworkError","isRetryable","TimeoutError","RateLimitError","retryAfter","ServerError","ConfigurationError","SessionError","MFAError","challenge","PasskeyError","OAuthError","provider","errorCode","OrganizationError","InvitationError","createError","type","createAuthenticationError","createAuthorizationError","createValidationError","createNetworkError","createSessionError","createMFAError","isFrankAuthError","error","isAuthenticationError","isAuthorizationError","isValidationError","isNetworkError","isTimeoutError","isRateLimitError","isServerError","isSessionError","isMFAError","isPasskeyError","isOAuthError","isRetryableError","handleError","defaultMessage","parseAPIError","response","status","data","formatErrorMessage","getErrorCode","getErrorDetails","createConsoleLogger","logError","logger","frankError","withRetry","operation","options","maxAttempts","delay","backoff","shouldRetry","onRetry","lastError","attempt","actualDelay","resolve","createErrorBoundaryState","handleErrorBoundaryError","errorInfo","ErrorUtils"],"mappings":"gPAGO,MAAMA,UAA2B,KAAM,CAO1C,YACIC,EACAC,EAAO,mBACPC,EACAC,EACAC,EACF,CACE,MAAMJ,CAAO,EAbDK,EAAA,KAAA,MAAA,EACAA,EAAA,KAAA,YAAA,EACAA,EAAA,KAAA,SAAA,EACAA,EAAA,KAAA,WAAA,EACAA,EAAA,KAAA,SAAA,EAUZ,KAAK,KAAO,iBACZ,KAAK,KAAOJ,EACZ,KAAK,WAAaC,EAClB,KAAK,QAAUC,EACf,KAAK,UAAY,IAAI,KAAK,EAAE,YAAY,EACxC,KAAK,QAAUC,EAGX,MAAM,mBACA,MAAA,kBAAkB,KAAM,KAAK,WAAW,CAClD,CAGJ,QAAyB,CACd,MAAA,CACH,KAAM,KAAK,KACX,QAAS,KAAK,QACd,QAAS,KAAK,QACd,WAAY,KAAK,UACrB,CAAA,CAER,CAGO,MAAME,UAA4BP,CAAmB,CACxD,YAAYC,EAAU,wBAAyBG,EAAsB,CACjE,MAAMH,EAAS,uBAAwB,IAAKG,EAAS,gBAAgB,CAAA,CAE7E,CAEO,MAAMI,UAA2BR,CAAmB,CACvD,YAAYC,EAAU,gBAAiBG,EAAsB,CACzD,MAAMH,EAAS,sBAAuB,IAAKG,EAAS,eAAe,CAAA,CAE3E,CAEO,MAAMK,UAAwBT,CAAmB,CAGpD,YACIC,EAAU,oBACVS,EAAwC,CAAA,EACxCN,EACF,CACE,MAAMH,EAAS,mBAAoB,IAAKG,EAAS,YAAY,EAPjDE,EAAA,KAAA,aAAA,EAQZ,KAAK,YAAcI,CAAA,CAGvB,cAAcC,EAAmC,CACvC,MAAAC,EAAS,KAAK,YAAYD,CAAK,EACrC,OAAOC,GAAUA,EAAO,OAAS,EAAIA,EAAO,CAAC,EAAI,MAAA,CAGrD,cAAcD,EAAwB,CAClC,MAAO,EAAQ,KAAK,YAAYA,CAAK,GAAG,MAAM,CAGlD,mBAA8B,CAC1B,OAAO,OAAO,OAAO,KAAK,WAAW,EAAE,KAAK,CAAA,CAEpD,CAEO,MAAME,UAAqBb,CAAmB,CAGjD,YACIC,EAAU,yBACVa,EAAc,GACdV,EACF,CACE,MAAMH,EAAS,gBAAiB,OAAWG,EAAS,SAAS,EAPjDE,EAAA,KAAA,aAAA,EAQZ,KAAK,YAAcQ,CAAA,CAE3B,CAEO,MAAMC,UAAqBf,CAAmB,CACjD,YAAYC,EAAU,oBAAqBG,EAAsB,CAC7D,MAAMH,EAAS,gBAAiB,IAAKG,EAAS,SAAS,CAAA,CAE/D,CAEO,MAAMY,UAAuBhB,CAAmB,CAGnD,YACIC,EAAU,sBACVgB,EACAb,EACF,CACE,MAAMH,EAAS,mBAAoB,IAAKG,EAAS,YAAY,EAPjDE,EAAA,KAAA,YAAA,EAQZ,KAAK,WAAaW,CAAA,CAE1B,CAEO,MAAMC,UAAoBlB,CAAmB,CAChD,YAAYC,EAAU,wBAAyBG,EAAsB,CACjE,MAAMH,EAAS,eAAgB,IAAKG,EAAS,QAAQ,CAAA,CAE7D,CAEO,MAAMe,UAA2BnB,CAAmB,CACvD,YAAYC,EAAU,sBAAuBG,EAAsB,CAC/D,MAAMH,EAAS,sBAAuB,OAAWG,EAAS,eAAe,CAAA,CAEjF,CAEO,MAAMgB,UAAqBpB,CAAmB,CACjD,YAAYC,EAAU,gBAAiBG,EAAsB,CACzD,MAAMH,EAAS,gBAAiB,IAAKG,EAAS,SAAS,CAAA,CAE/D,CAEO,MAAMiB,UAAiBrB,CAAmB,CAG7C,YACIC,EAAU,uCACVqB,EACAlB,EACF,CACE,MAAMH,EAAS,YAAa,IAAKG,EAAS,KAAK,EAPnCE,EAAA,KAAA,WAAA,EAQZ,KAAK,UAAYgB,CAAA,CAEzB,CAEO,MAAMC,UAAqBvB,CAAmB,CACjD,YAAYC,EAAU,2BAA4BG,EAAsB,CACpE,MAAMH,EAAS,gBAAiB,OAAWG,EAAS,SAAS,CAAA,CAErE,CAEO,MAAMoB,UAAmBxB,CAAmB,CAI/C,YACIC,EAAU,8BACVwB,EACAC,EACAtB,EACF,CACE,MAAMH,EAAS,cAAe,IAAKG,EAAS,OAAO,EATvCE,EAAA,KAAA,UAAA,EACAA,EAAA,KAAA,WAAA,EASZ,KAAK,SAAWmB,EAChB,KAAK,UAAYC,CAAA,CAEzB,CAEO,MAAMC,UAA0B3B,CAAmB,CACtD,YAAYC,EAAU,qBAAsBG,EAAsB,CAC9D,MAAMH,EAAS,qBAAsB,IAAKG,EAAS,cAAc,CAAA,CAEzE,CAEO,MAAMwB,UAAwB5B,CAAmB,CACpD,YAAYC,EAAU,mBAAoBG,EAAsB,CAC5D,MAAMH,EAAS,mBAAoB,IAAKG,EAAS,YAAY,CAAA,CAErE,CAGO,MAAMyB,EAAc,CACvBC,EACA7B,EACAG,IACqB,CACrB,OAAQ0B,EAAM,CACV,IAAK,uBACM,OAAA,IAAIvB,EAAoBN,EAASG,CAAO,EACnD,IAAK,sBACM,OAAA,IAAII,EAAmBP,EAASG,CAAO,EAClD,IAAK,mBACD,OAAO,IAAIK,EAAgBR,EAAS,CAAA,EAAIG,CAAO,EACnD,IAAK,gBACD,OAAO,IAAIS,EAAaZ,EAAS,GAAMG,CAAO,EAClD,IAAK,gBACM,OAAA,IAAIW,EAAad,EAASG,CAAO,EAC5C,IAAK,mBACD,OAAO,IAAIY,EAAef,EAAS,OAAWG,CAAO,EACzD,IAAK,eACM,OAAA,IAAIc,EAAYjB,EAASG,CAAO,EAC3C,IAAK,sBACM,OAAA,IAAIe,EAAmBlB,EAASG,CAAO,EAClD,IAAK,gBACM,OAAA,IAAIgB,EAAanB,EAASG,CAAO,EAC5C,IAAK,YACD,OAAO,IAAIiB,EAASpB,EAAS,OAAWG,CAAO,EACnD,IAAK,gBACM,OAAA,IAAImB,EAAatB,EAASG,CAAO,EAC5C,IAAK,cACD,OAAO,IAAIoB,EAAWvB,EAAS,OAAW,OAAWG,CAAO,EAChE,IAAK,qBACM,OAAA,IAAIuB,EAAkB1B,EAASG,CAAO,EACjD,IAAK,mBACM,OAAA,IAAIwB,EAAgB3B,EAASG,CAAO,EAC/C,QACI,OAAO,IAAIJ,EAAmBC,EAAS6B,EAAM,OAAW1B,CAAO,CAAA,CAE3E,EAEa2B,EAA4B,CAAC9B,EAAkBG,IACxD,IAAIG,EAAoBN,EAASG,CAAO,EAE/B4B,EAA2B,CAAC/B,EAAkBG,IACvD,IAAII,EAAmBP,EAASG,CAAO,EAE9B6B,EAAwB,CACjChC,EACAS,EACAN,IACC,IAAIK,EAAgBR,EAASS,EAAaN,CAAO,EAEzC8B,EAAqB,CAC9BjC,EACAa,EACAV,IACC,IAAIS,EAAaZ,EAASa,EAAaV,CAAO,EAEtC+B,EAAqB,CAAClC,EAAkBG,IACjD,IAAIgB,EAAanB,EAASG,CAAO,EAExBgC,EAAiB,CAC1BnC,EACAqB,EACAlB,IACC,IAAIiB,EAASpB,EAASqB,EAAWlB,CAAO,EAGhCiC,EAAoBC,GACtBA,aAAiBtC,GACnBsC,GAAS,OAAOA,GAAU,UAAYA,EAAM,MAAQA,EAAM,QAGtDC,EAAyBD,GAC3BA,aAAiB/B,GACnB8B,EAAiBC,CAAK,GAAKA,EAAM,OAAS,uBAGtCE,EAAwBF,GAC1BA,aAAiB9B,GACnB6B,EAAiBC,CAAK,GAAKA,EAAM,OAAS,sBAGtCG,EAAqBH,GACvBA,aAAiB7B,GACnB4B,EAAiBC,CAAK,GAAKA,EAAM,OAAS,mBAGtCI,EAAkBJ,GACpBA,aAAiBzB,GACnBwB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,gBAGtCK,EAAkBL,GACpBA,aAAiBvB,GACnBsB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,gBAGtCM,EAAoBN,GACtBA,aAAiBtB,GACnBqB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,mBAGtCO,EAAiBP,GACnBA,aAAiBpB,GACnBmB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,eAGtCQ,EAAkBR,GACpBA,aAAiBlB,GACnBiB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,gBAGtCS,EAAcT,GAChBA,aAAiBjB,GACnBgB,EAAiBC,CAAK,GAAKA,EAAM,OAAS,YAGtCU,EAAkBV,GACpBA,aAAiBf,GACnBc,EAAiBC,CAAK,GAAKA,EAAM,OAAS,gBAGtCW,EAAgBX,GAClBA,aAAiBd,GACnBa,EAAiBC,CAAK,GAAKA,EAAM,OAAS,cAGtCY,EAAoBZ,GACzBI,EAAeJ,CAAK,EACbA,EAAM,YAGb,GAAAK,EAAeL,CAAK,GAAKM,EAAiBN,CAAK,GAAKO,EAAcP,CAAK,GAQlEa,EAAc,CACvBb,EACAjC,EACA+C,IAEIf,EAAiBC,CAAK,EACfA,EAGPA,aAAiB,MACV,IAAItC,EACPsC,EAAM,SAAWc,GAAkB,oBACnC,gBACA,OACA,CAAE,cAAed,EAAM,IAAK,EAC5BjC,CACJ,EAGA,OAAOiC,GAAU,SACV,IAAItC,EACPsC,GAASc,GAAkB,oBAC3B,gBACA,OACA,OACA/C,CACJ,EAGG,IAAIL,EACPoD,GAAkB,4BAClB,gBACA,OACA,CAAE,cAAed,CAAM,EACvBjC,CACJ,EAGSgD,EAAiBC,GAAsC,CAChE,GAAI,CAACA,EACM,OAAA,IAAIpC,EAAY,sBAAsB,EAG3C,KAAA,CAAE,OAAAqC,EAAQ,KAAAC,CAAA,EAASF,EAGzB,OAAQC,EAAQ,CACZ,IAAK,KACD,OAAIC,GAAM,OACC,IAAI/C,EACP+C,EAAK,SAAW,oBAChBA,EAAK,OACLA,CACJ,EAEG,IAAIxD,EACPwD,GAAM,SAAW,cACjB,cACA,IACAA,CACJ,EAEJ,IAAK,KACD,OAAO,IAAIjD,EACPiD,GAAM,SAAW,0BACjBA,CACJ,EAEJ,IAAK,KACD,OAAO,IAAIhD,EACPgD,GAAM,SAAW,gBACjBA,CACJ,EAEJ,IAAK,KACD,OAAO,IAAIxD,EACPwD,GAAM,SAAW,qBACjB,YACA,IACAA,CACJ,EAEJ,IAAK,KACD,OAAO,IAAIzC,EACPyC,GAAM,SAAW,kBACjBA,CACJ,EAEJ,IAAK,KACD,OAAO,IAAIxC,EACPwC,GAAM,SAAW,sBACjBA,GAAM,WACNA,CACJ,EAEJ,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACD,OAAO,IAAItC,EACPsC,GAAM,SAAW,eACjBA,CACJ,EAEJ,QACI,OAAO,IAAIxD,EACPwD,GAAM,SAAW,QAAQD,CAAM,SAC/B,QAAQA,CAAM,GACdA,EACAC,CACJ,CAAA,CAEZ,EAEaC,EAAsBnB,GAC3BD,EAAiBC,CAAK,GAItBA,aAAiB,MACVA,EAAM,QAGb,OAAOA,GAAU,SACVA,EAGJ,4BAGEoB,EAAgBpB,GACrBD,EAAiBC,CAAK,EACfA,EAAM,KAGbA,aAAiB,MACVA,EAAM,KAGV,gBAGEqB,EAAmBrB,GAAuC,CAC/D,GAAAD,EAAiBC,CAAK,EACtB,OAAOA,EAAM,OAIrB,EAUasB,EAAsB,KAAoB,CACnD,MAAO,CAAC3D,EAASqC,EAAOjC,IAAY,CACxB,QAAA,MAAMJ,EAASqC,EAAOjC,CAAO,CACzC,EACA,KAAM,CAACJ,EAASI,IAAY,CAChB,QAAA,KAAKJ,EAASI,CAAO,CACjC,EACA,KAAM,CAACJ,EAASI,IAAY,CAChB,QAAA,KAAKJ,EAASI,CAAO,CACjC,EACA,MAAO,CAACJ,EAASI,IAAY,CACjB,QAAA,MAAMJ,EAASI,CAAO,CAAA,CAEtC,GAEawD,EAAW,CACpBvB,EACAwB,EAAsBF,EAAA,EACtBvD,IACO,CACD,MAAA0D,EAAaZ,EAAYb,CAAK,EAE7BwB,EAAA,MACH,IAAIC,EAAW,IAAI,KAAKA,EAAW,OAAO,GAC1C,CACI,MAAOA,EACP,MAAOA,EAAW,MAClB,UAAWA,EAAW,UACtB,QAASA,EAAW,QACpB,GAAG1D,CAAA,CAEX,CACJ,EAWa2D,GAAY,MACrBC,EACAC,EAAiC,KACpB,CACP,KAAA,CACF,YAAAC,EAAc,EACd,MAAAC,EAAQ,IACR,QAAAC,EAAU,cACV,YAAAC,EAAcpB,EACd,QAAAqB,CAAA,EACAL,EAEA,IAAAM,EAEJ,QAASC,EAAU,EAAGA,GAAWN,EAAaM,IACtC,GAAA,CACA,OAAO,MAAMR,EAAU,QAClB3B,EAAO,CAGZ,GAFYkC,EAAAlC,EAERmC,IAAYN,GAAe,CAACG,EAAYhC,EAAOmC,CAAO,EACtD,MAAMtB,EAAYb,CAAK,EAGvBiC,GACAA,EAAQjC,EAAOmC,CAAO,EAI1B,IAAIC,EAAcN,EAClB,OAAQC,EAAS,CACb,IAAK,cACDK,EAAcN,EAAQ,KAAK,IAAI,EAAGK,EAAU,CAAC,EAC7C,MACJ,IAAK,SACDC,EAAcN,EAAQK,EACtB,MACJ,IAAK,QACL,QACkBC,EAAAN,EACd,KAAA,CAIOM,GAAA,KAAK,SAAW,IAE/B,MAAM,IAAI,QAAQC,IAAW,WAAWA,GAASD,CAAW,CAAC,CAAA,CAIrE,MAAMvB,EAAYqB,CAAS,CAC/B,EAQaI,GAA2B,KAA2B,CAC/D,SAAU,GACV,MAAO,MACX,GAEaC,GAA2B,CACpCvC,EACAwC,KACsB,CACtB,SAAU,GACV,MAAO3B,EAAYb,EAAO,iBAAkB,0BAA0B,CAC1E,GAGayC,GAAa,CAEtB,mBAAA/E,EACA,oBAAAO,EACA,mBAAAC,EACA,gBAAAC,EACA,aAAAI,EACA,aAAAE,EACA,eAAAC,EACA,YAAAE,EACA,mBAAAC,EACA,aAAAC,EACA,SAAAC,EACA,aAAAE,EACA,WAAAC,EACA,kBAAAG,EACA,gBAAAC,EAGA,YAAAC,EACA,0BAAAE,EACA,yBAAAC,EACA,sBAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,eAAAC,EAGA,iBAAAC,EACA,sBAAAE,EACA,qBAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,eAAAC,EACA,WAAAC,EACA,eAAAC,EACA,aAAAC,EACA,iBAAAC,EAGA,YAAAC,EACA,cAAAE,EACA,mBAAAI,EACA,aAAAC,EACA,gBAAAC,EACA,SAAAE,EACA,UAAAG,GAGA,yBAAAY,GACA,yBAAAC,EACJ"}