@adaas/a-server 0.0.27 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/A-Request/A-HttpRequestData.context.ts","../../src/lib/A-Request/A-HttpServerRequest.context.ts","../../src/lib/A-Request/A-Request.constants.ts","../../src/lib/A-Server/A-HttpServer.error.ts","../../src/lib/A-Request/A-Request.error.ts","../../src/lib/A-Request/A-Request.helper.ts","../../src/lib/A-Request/A-Request.env.ts","../../src/lib/A-Request/A-Request.entity.ts","../../src/lib/A-Request/A-Request.types.ts","../../src/lib/A-Response/A-Response.constants.ts","../../src/lib/A-Response/A-Response.entity.ts","../../src/lib/A-Response/A-Response.error.ts","../../src/lib/A-Server/A-HttpServer.constants.ts","../../src/lib/A-ServerRoute/A-ServerRoute.entity.ts","../../src/lib/A-Server/A-Server.context.ts","../../src/lib/A-ServerLogger/A-ServerLogger.component.ts","../../src/lib/A-Server/A-HttpServer.container.ts","../../src/lib/A-Server/A-Server.error.ts","../../src/lib/A-ServerRoute/A-ServerRoute.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.meta.ts","../../src/lib/A-ServerRouter/A-ServerRouterDefine.decorator.ts","../../src/lib/A-ServerRouter/A-ServerRouter.component.ts","../../src/lib/A-ServerController/A-ServerController.component.ts","../../src/lib/A-ServerEntityList/A-EntityList.entity.ts","../../src/lib/A-ServerEntityList/A-EntityList.types.ts","../../src/lib/A-ServerListQuery/A-ServerListQueryFilter.context.ts","../../src/lib/A-ServerLogger/A-ServerLogger.constants.ts","../../src/lib/A-ServerMiddleware/A-ServerMiddleware.component.ts","../../src/lib/A-ServerProxy/A-ServerProxy.constants.ts","../../src/lib/A-ServerProxy/A-ServerProxy.context.ts","../../src/lib/A-ServerProxy/A-ServerProxy.component.ts","../../src/lib/A-ServerStatic/A-ServerStatic.context.ts","../../src/lib/A-ServerStatic/A-ServerStatic.component.ts","../../src/constants/env.constants.ts"],"names":["A_Error","A_IdentityHelper","A_Context","A_Request_Event","_a","_b","_c","A_Entity","ASEID","A_Feature","A_Inject","A_Fragment","_d","_e","A_Service","A_ServiceFeatures","A_Scope","A_Config","A_Component","A_Logger","A_SERVER_TYPES__A_EntityListEvent","A_Concept","A_Polyfill"],"mappings":"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","file":"index.mjs","sourcesContent":["import { A_ExecutionContext } from \"@adaas/a-utils/a-execution\";\n\n\n\nexport class A_HttpRequestData extends A_ExecutionContext<{\n data: Buffer;\n}> {\n\n\n constructor(data: Buffer) {\n super(\n 'a-http-request-data'\n );\n this._meta.set('data', data);\n }\n\n get length(): number {\n return this.data?.length || 0;\n }\n\n get data(): Buffer {\n return this._meta.get('data')!;\n }\n\n\n toString(encoding: BufferEncoding = 'utf-8'): string {\n return this.data.toString(encoding);\n }\n\n}\n","import { A_Context, A_Fragment, A_IdentityHelper } from \"@adaas/a-concept\";\nimport { IncomingMessage, request, ServerResponse } from \"http\";\nimport { A_Operation_Storage, A_OperationContext } from \"@adaas/a-utils/a-operation\";\n\n\nexport class A_HttpServerRequestContext<\n _DataType extends any = any,\n> extends A_OperationContext<\n 'http-server-request',\n {\n request: IncomingMessage,\n response: ServerResponse\n },\n {\n buffers: Buffer[]\n data: _DataType\n files: Record<string, any[]>\n },\n {\n buffers: Buffer[]\n data: _DataType\n files: Record<string, any[]>\n params: {\n request: IncomingMessage,\n response: ServerResponse\n }\n } & A_Operation_Storage\n> {\n\n protected _id!: string;\n\n protected _startTime!: [number, number];\n protected _endTime?: [number, number];\n protected _ready?: Promise<void>;\n\n protected get _request(): IncomingMessage {\n return super.params.request;\n }\n\n protected get _response(): ServerResponse {\n return super.params.response;\n }\n\n protected _customResponse: any;\n\n\n constructor(\n request: IncomingMessage,\n response: ServerResponse\n ) {\n super('http-server-request', { request, response });\n\n\n this._id = A_IdentityHelper.generateTimeId();\n }\n\n get id(): string {\n return `[${this._request.method}]${this._request.url}-${this._id}`;\n }\n\n get buffers(): Buffer[] {\n if (!this._meta.has('buffers')) {\n this._meta.set('buffers', []);\n }\n return this._meta.get('buffers')!;\n }\n\n get contentType(): string | undefined {\n return this._request.headers['content-type'] || undefined;\n }\n\n\n get data(): _DataType {\n return this._meta.get('data')!;\n }\n\n set data(value: _DataType) {\n this._meta.set('data', value);\n }\n\n get length(): number {\n return this.buffers.reduce((acc, buf) => acc + buf.length, 0);\n }\n\n get processingTime(): number {\n let endTime = this._endTime;\n if (!endTime) {\n endTime = process.hrtime();\n }\n\n const [seconds, nanoseconds] = process.hrtime(this._startTime);\n return seconds * 1000 + nanoseconds / 1000000;\n }\n\n\n startProcessing() {\n this._startTime = process.hrtime();\n }\n\n stopProcessing() {\n this._endTime = process.hrtime();\n }\n}","export const A_RequestFeatures = {\n\n onError: 'A_Request_onError',\n\n onInit: 'A_Request_onInit',\n\n onAfterInit: 'A_Request_onAfterInit',\n\n onParse: 'A_Request_onParse',\n\n onValidate: 'A_Request_onValidate',\n\n onClose: 'A_Request_onClose',\n\n onAborted: 'A_Request_onAborted',\n\n onTimeout: 'A_Request_onTimeout',\n\n onData: 'A_Request_onData',\n\n onEnd: 'A_Request_onEnd',\n\n onBodyParse: 'A_Request_onBodyParse',\n\n onQueryParse: 'A_Request_onQueryParse',\n\n onParamsParse: 'A_Request_onParamsParse',\n\n onCookiesParse: 'A_Request_onCookiesParse',\n} as const\n","import { A_Error } from '@adaas/a-concept';\nimport { A_HttpServerError_Init, A_HttpServerError_Serialized } from './A-HttpServer.types';\n\n\nexport class A_HttpServerError extends A_Error<A_HttpServerError_Init, A_HttpServerError_Serialized> {\n\n static readonly NotFoundErrorStatus: number = 404;\n static readonly NotFoundError = 'Resource Not Found';\n\n static readonly InternalServerErrorStatus: number = 500;\n static readonly InternalServerError = 'Internal Server Error';\n\n /**\n * HTTP status code to title mapping\n */\n private static readonly HTTP_STATUS_TITLES: Record<number, string> = {\n // 4xx Client Errors\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 417: 'Expectation Failed',\n 418: 'I\\'m a teapot',\n 421: 'Misdirected Request',\n 422: 'Unprocessable Entity',\n 423: 'Locked',\n 424: 'Failed Dependency',\n 425: 'Too Early',\n 426: 'Upgrade Required',\n 428: 'Precondition Required',\n 429: 'Too Many Requests',\n 431: 'Request Header Fields Too Large',\n 451: 'Unavailable For Legal Reasons',\n\n // 5xx Server Errors\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates',\n 507: 'Insufficient Storage',\n 508: 'Loop Detected',\n 510: 'Not Extended',\n 511: 'Network Authentication Required'\n };\n\n status!: number;\n\n /**\n * Gets the appropriate title for a given HTTP status code\n */\n private static getHttpStatusTitle(status: number): string {\n return this.HTTP_STATUS_TITLES[status] || 'Unknown Error';\n }\n\n constructor(\n /**\n * A_Error Constructor params with required title\n */\n params: A_HttpServerError_Init\n )\n constructor(\n /**\n * Simplified params with optional title - will auto-generate from status\n */\n params: { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown }\n )\n constructor(\n /**\n * HTTP Status Code of the error\n */\n status: number,\n /**\n * Error description\n */\n description: string\n )\n constructor(\n /**\n * Original JS Error\n */\n error: Error\n )\n constructor(\n param1: A_HttpServerError_Init | { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown } | Error | number,\n param2?: string\n ) {\n // Handle the different constructor overloads\n switch (true) {\n // Pattern: new A_HttpServerError(404, 'The requested resource was not found')\n case typeof param1 === 'number' && typeof param2 === 'string':\n super({\n title: A_HttpServerError.getHttpStatusTitle(param1),\n description: param2\n });\n this.status = param1;\n break;\n\n // Pattern: new A_HttpServerError(someErrorObject)\n case param1 instanceof Error:\n super(param1);\n this.status = 500; // Default status for Error objects\n break;\n\n // Pattern: new A_HttpServerError({ status: 500, description: '...', originalError: ... })\n case typeof param1 === 'object' && param1 !== null && !(param1 instanceof Error):\n const params = param1 as any;\n \n // If title is provided, use the full A_Error init\n if ('title' in params && params.title) {\n super(params as A_HttpServerError_Init);\n this.status = params.status || 500;\n } else {\n // Auto-generate title from status\n const title = params.status ? A_HttpServerError.getHttpStatusTitle(params.status) : 'Internal Server Error';\n super({\n title: title,\n description: params.description,\n code: params.code,\n scope: params.scope,\n link: params.link,\n originalError: params.originalError\n });\n this.status = params.status || 500;\n }\n break;\n\n default:\n // Fallback for any other case\n throw new Error('Invalid parameters provided to A_HttpServerError constructor');\n }\n }\n\n\n protected fromConstructor(params: A_HttpServerError_Init): void {\n super.fromConstructor(params);\n if (params.status) {\n this.status = params.status;\n }\n }\n\n\n toJSON(): A_HttpServerError_Serialized {\n return {\n ...super.toJSON(),\n status: this.status\n }\n }\n}\n\n","import { A_Error } from \"@adaas/a-concept\";\n\nexport class A_RequestError extends A_Error {\n\n static readonly RequestBodyParsingError = 'Unable to parse request body';\n static readonly FileUploadError = 'File upload error';\n static readonly RequestTimeoutError = 'Request timed out';\n static readonly InvalidRequestError = 'Invalid request';\n static readonly MissingParametersError = 'Missing required parameters';\n\n}","import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data);\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}","\n\nexport const A_RequestEnvVariables = {\n\n /**\n * Default request timeout in milliseconds\n */\n A_SERVER_REQUEST_TIMEOUT: 5000,\n\n /**\n * Maximum request body size in bytes\n */\n A_SERVER_REQUEST_MAX_BODY_SIZE: 10 * 1024 * 1024, // 10MB\n\n /**\n * Default request encoding\n */\n A_SERVER_REQUEST_DEFAULT_ENCODING: 'utf8',\n\n /**\n * Enable automatic cookie parsing\n */\n A_SERVER_REQUEST_PARSE_COOKIES: true,\n\n /**\n * Enable automatic query parameter parsing\n */\n A_SERVER_REQUEST_PARSE_QUERY: true,\n\n /**\n * Enable automatic body parsing\n */\n A_SERVER_REQUEST_PARSE_BODY: true,\n\n /**\n * Enable file upload handling\n */\n A_SERVER_REQUEST_ENABLE_FILE_UPLOADS: false,\n\n} as const;\n\n\nexport const A_RequestEnvVariablesArray = Object.keys(A_RequestEnvVariables) as Array<keyof typeof A_RequestEnvVariables>;\n\n\n\n/**\n * Array of all possible fields in A_RequestEnvVariables\n */\nexport type A_RequestEnvVariablesType = Array<keyof typeof A_RequestEnvVariables>;","import type { IncomingHttpHeaders, IncomingMessage } from \"http\";\nimport {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_IdentityHelper,\n A_Inject,\n A_Scope,\n ASEID,\n} from '@adaas/a-concept';\nimport {\n A_Request_BodyType,\n A_Request_FileUpload,\n A_Request_Init,\n A_Request_Listener,\n A_Request_Options,\n A_Request_Serialized,\n A_RequestFeatureNames,\n} from \"./A-Request.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\nimport { A_RequestHelper } from \"./A-Request.helper\";\nimport { A_RequestEnvVariables, A_RequestEnvVariablesType } from \"./A-Request.env\";\nimport { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_HttpRequestData } from \"./A-HttpRequestData.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_ScheduleObject } from \"@adaas/a-utils/a-schedule\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_Request<\n _ReqBodyType = any,\n _ParamsType extends Record<string, string> = any,\n _QueryType = any,\n>\n extends A_Entity<\n A_Request_Init,\n A_Request_Serialized<_ReqBodyType, _ParamsType, _QueryType>\n > {\n\n static get concept(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n\n /**\n * Request processing status\n */\n protected _listeners: Map<A_RequestFeatureNames, Set<A_Request_Listener>> = new Map();\n\n // =============================================\n // Cookie Management\n // =============================================\n /**\n * Parsed cookies from request headers\n */\n private _cookies!: Record<string, string>;\n\n // ============================================\n // Data Management \n // ============================================\n /**\n * Request body type\n */\n private _bodyType?: A_Request_BodyType;\n /**\n * Request body data\n */\n private _body!: _ReqBodyType;\n private _req!: IncomingMessage;\n\n private _timeout: A_ScheduleObject | undefined;\n\n // =============================================\n // File Upload Handling\n // =============================================\n /**\n * Uploaded files from multipart requests\n */\n private _files!: A_Request_FileUpload[];\n\n // =============================================\n // Request Metadata\n // =============================================\n\n /**\n * User agent string from request headers\n */\n private _userAgent?: string;\n\n /**\n * Content length in bytes\n */\n private _contentLength?: number;\n\n // =============================================\n // Configuration\n // =============================================\n /**\n * Request processing configuration options\n */\n private _options!: Required<A_Request_Options>\n\n private _routeDefinition?: A_ServerRoute;\n\n\n /**\n * A_Request - Comprehensive HTTP Request Processing Entity\n * \n * This class provides a complete wrapper around Node.js IncomingMessage with advanced features:\n * - Automatic body parsing (JSON, form-data, multipart, raw)\n * - Cookie and session management\n * - File upload handling with easy access methods\n * - Request validation\n * - Middleware support\n * - Type-safe parameter extraction\n * - Request timing and metrics\n * \n * @example\n * ```typescript\n * const request = new A_Request({\n * id: 'req-123',\n * request: incomingMessage,\n * scope: 'api'\n * }, {\n * enableFileUploads: true,\n * maxBodySize: 50 * 1024 * 1024 // 50MB for file uploads\n * });\n * \n * await request.init();\n * \n * // Access parsed body\n * const userData = request.body;\n * \n * // Get typed parameters\n * const userId = request.params.id;\n * \n * // Handle file uploads\n * if (request.hasFiles()) {\n * const avatar = request.getFile('avatar');\n * if (avatar) {\n * console.log(`Uploaded file: ${avatar.filename}`);\n * console.log(`File size: ${avatar.size} bytes`);\n * console.log(`File type: ${avatar.mimetype}`);\n * \n * // Access file buffer for processing\n * const fileBuffer = avatar.buffer;\n * // Save to disk, process, etc.\n * }\n * \n * // Get all files for a specific field\n * const documents = request.getFiles('documents');\n * for (const doc of documents) {\n * // Process each document...\n * }\n * }\n * \n * // Check specific files\n * if (request.hasFile('profilePicture')) {\n * const pic = request.getFile('profilePicture');\n * // Process profile picture...\n * }\n * ```\n */\n constructor(params: A_Request_Init, options?: A_Request_Options) {\n super(params);\n this._options = {\n maxBodySize: 10 * 1024 * 1024, // 10MB default\n timeout: 30000, // 30 seconds\n encoding: 'utf8',\n parseCookies: true,\n parseQuery: true,\n parseBody: true,\n enableFileUploads: false,\n strictValidation: false,\n ...(options || {})\n }\n }\n\n /**\n * Creates A_Request entity from initialization data\n * \n * @param newEntity \n */\n fromNew(newEntity: A_Request_Init): void {\n this.aseid = new ASEID({\n concept: (this.constructor as typeof A_Request).concept,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Request).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._req = newEntity.request;\n }\n\n\n /**\n * Core HTTP request object from Node.js\n */\n get original(): IncomingMessage {\n return this._req;\n }\n /**\n * Parsed request body data\n */\n get body(): _ReqBodyType {\n return this._body;\n }\n /**\n * URL route parameters (e.g., /users/:id)\n */\n get params(): _ParamsType {\n\n console.log('Extracting params using route definition:', this.url);\n console.log('Extracting params using route definition:', this._routeDefinition?.path);\n\n return A_RequestHelper.extractParams(this.url,\n this._routeDefinition?.path || ''\n\n ) as _ParamsType;\n }\n /**\n * Query string parameters\n */\n get query(): _QueryType {\n return A_RequestHelper.extractQuery(this.url) as _QueryType;\n }\n /**\n * Gets the parsed cookies\n */\n get cookies(): Record<string, string> {\n if (!this._cookies) {\n this._cookies = A_RequestHelper.parseCookies(this.headers['cookie']);\n }\n\n return this._cookies;\n }\n /**\n * Gets the request URL\n */\n get url(): string {\n return this.original.url!;\n }\n /**\n * Gets the HTTP method\n */\n get method(): A_HttpServerRequestMethod {\n return (String(this.original.method).toUpperCase() as A_HttpServerRequestMethod) || 'DEFAULT';\n }\n /**\n * Gets the request headers\n */\n get headers(): IncomingHttpHeaders {\n return this.original.headers;\n }\n /**\n * Gets the timestamp when the request was started\n */\n get startedAt(): Date | undefined {\n const timeId = A_IdentityHelper.parseTimeId(this.aseid.id.split('-')[0]);\n return timeId ? new Date(timeId.timestamp) : undefined;\n }\n /**\n * Gets uploaded files\n */\n get files(): A_Request_FileUpload[] {\n return this._files || [];\n }\n /**\n * Gets user agent string\n */\n get userAgent(): string | undefined {\n return this.headers?.['user-agent'] || ''\n }\n /**\n * Gets content length\n */\n get contentLength(): number {\n return this.headers?.['content-length'] ? parseInt(this.headers['content-length'], 10) : 0;\n }\n /**\n * Check if request is secure (HTTPS)\n */\n get isSecure(): boolean {\n return this.original.socket && 'encrypted' in this.original.socket;\n }\n /**\n * Check if request is from mobile device\n */\n get isMobile(): boolean {\n const userAgent = this._userAgent?.toLowerCase() || '';\n return /mobile|android|iphone|ipad|phone/i.test(userAgent);\n }\n /**\n * Get request size in bytes\n */\n get size(): number {\n return this._contentLength || 0;\n }\n /**\n * Gets content type from headers\n */\n get contentType(): string | undefined {\n return this.headers['content-type'] || undefined;\n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n /**\n * Pipes request stream to destination\n */\n pipe(\n destination: NodeJS.WritableStream,\n options?: { end?: boolean | undefined; }\n ): NodeJS.WritableStream {\n return this.original.pipe(destination, options);\n }\n /**\n * Get a file by field name\n */\n getFile(fieldName: string): A_Request_FileUpload | undefined {\n return this._files?.find(file => file.fieldName === fieldName);\n }\n\n /**\n * Get all files for a specific field name\n */\n getFiles(fieldName: string): A_Request_FileUpload[] {\n return this._files?.filter(file => file.fieldName === fieldName) || [];\n }\n\n /**\n * Check if request has any files\n */\n hasFiles(): boolean {\n return this._files && this._files.length > 0;\n }\n\n /**\n * Check if request has a file with specific field name\n */\n hasFile(fieldName: string): boolean {\n return this._files?.some(file => file.fieldName === fieldName) || false;\n }\n\n /**\n * Get total size of all uploaded files\n */\n getTotalFileSize(): number {\n return this._files?.reduce((total, file) => total + file.size, 0) || 0;\n }\n\n /**\n * Get a cookie value\n */\n getCookie(name: string): string | undefined {\n return this._cookies[name];\n }\n /**\n * Check if request has a specific cookie\n */\n hasCookie(name: string): boolean {\n return name in this._cookies;\n }\n /**\n * Check if request accepts specific content type\n */\n accepts(contentType: string): boolean {\n const acceptHeader = this.headers.accept || '';\n return acceptHeader.includes(contentType) || acceptHeader.includes('*/*');\n }\n /**\n * Get request fingerprint for caching/identification\n */\n getFingerprint(): string {\n const components = [\n this.method,\n this.url,\n this._userAgent,\n JSON.stringify(this.body)\n ];\n\n return Buffer.from(components.join('|')).toString('base64');\n }\n\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_RequestFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n /**\n * Allows to use a route definition for this request\n * \n * @param route \n */\n useRoute(route: A_ServerRoute): void {\n this._routeDefinition = route;\n }\n\n\n clearTimeout(): void {\n this._timeout?.clear();\n }\n\n /**\n * Initialize the request - parse cookies, query, body etc.\n */\n async load(): Promise<void> {\n\n // this.original.on('close', this.handleClose.bind(this));\n\n try {\n\n await this.call(A_RequestFeatures.onInit);\n\n await new Promise<void>((resolve, reject) => {\n const onData = this.handleData.bind(this);\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n const cleanup = () => {\n this.original.off('data', onData);\n this.original.off('end', onEnd);\n this.original.off('error', onError);\n };\n\n this.original.on('data', onData);\n this.original.on('end', onEnd);\n this.original.on('error', onError);\n });\n\n await this.handleEnd();\n\n } catch (error) {\n\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while processing the request.',\n originalError: error\n });\n\n await this.fail(targetError);\n }\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n\n\n async validate(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onValidate);\n } catch (error) {\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 400,\n description: ` Request Validation Failed: ${error instanceof A_Error ? error.message : 'Invalid request.'}`,\n originalError: error\n });\n\n await this.fail(targetError);\n }\n }\n /**\n * Destroy the request A-Entity with cleanup\n * \n * @returns \n */\n async destroy(): Promise<any> {\n const targetError = A_Context.scope(this)?.resolve(A_Error);\n\n if (!this.original.destroyed) {\n this.original.destroy(targetError);\n this.original.removeAllListeners();\n\n this._listeners.clear();\n\n return super.destroy();\n }\n }\n\n /**\n * Handles request failure - registers error, emits event, and destroys request\n * \n * [!] Destroys the request after handling the failure.\n * \n * @param err \n */\n async fail(err?: A_HttpServerError): Promise<void> {\n console.log('Request failed with error:', this.method, this.url, err?.message);\n\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n this._timeout?.clear();\n\n await this.call(A_RequestFeatures.onError);\n\n await this.destroy();\n }\n\n\n // ======================================================================================\n // Internal handlers for request events\n // ======================================================================================\n /**\n * Internal helper method to handle incoming data chunks\n * It creates a new scope for each data chunk, inherits the parent scope,\n * and calls the onData feature with the new scope.\n * \n * [!] This method ensures that each data chunk is processed in isolation, \n * preventing side effects between chunks.\n * \n * @param data \n */\n protected async handleData(data: Buffer): Promise<void> {\n const chunk = new A_HttpRequestData(data);\n\n const scope = new A_Scope({\n name: `${this.aseid.toString()}-data-chunk`,\n fragments: [chunk],\n })\n .inherit(A_Context.scope(this));\n\n try {\n\n scope.inherit(A_Context.scope(this));\n\n await this.call(A_RequestFeatures.onData, scope);\n\n scope.destroy();\n\n } catch (error) {\n\n scope.destroy();\n\n await this.fail(new A_HttpServerError({\n status: 500,\n description: `Request data chunk error: ${error instanceof A_Error ? error.message : 'Unable to process request data chunk.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request close event\n * \n * This method is called when the request is closed prematurely.\n * It triggers the onClose feature and handles any errors that occur during processing.\n * \n */\n protected async handleClose(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onClose);\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: `Request closed error: ${error instanceof A_Error ? error.message : 'Request was closed.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request end event\n * \n * This method is called when the request has finished sending data.\n * It triggers the onEnd feature and handles any errors that occur during processing.\n */\n protected async handleEnd(): Promise<void> {\n try {\n\n await this.call(A_RequestFeatures.onEnd);\n\n } catch (error) {\n await this.fail(new A_HttpServerError({\n status: 500,\n description: `Request processing error: ${error instanceof A_Error ? error.message : 'Unable to process request.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request timeout event\n * \n * This method is called when the request processing exceeds the configured timeout.\n * It triggers the onTimeout feature and fails the request with a timeout error.\n */\n protected async handleTimeout(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onTimeout);\n\n throw new A_HttpServerError({\n status: 503,\n description: `Request processing take too long and timed out. Current timeout is set to ${this._options.timeout} ms.`,\n })\n\n } catch (error) {\n\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 503,\n description: `Request timeout error: ${error instanceof A_Error ? error.message : 'Request timed out.'}`,\n originalError: error\n });\n\n await this.fail(targetError);\n }\n }\n\n\n\n\n // ======================================================================================\n // A-Request Feature Extensions\n // ======================================================================================\n\n @A_Feature.Extend()\n /**\n * Hook called during initialization\n * \n * Default Behavior: Starts request processing timer and sets up timeout handling.\n */\n async [A_RequestFeatures.onInit](\n @A_Inject(A_Config) config: A_Config<['A_SERVER_REQUEST_TIMEOUT']>,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n context.startProcessing();\n\n const ms = Number(config?.get('A_SERVER_REQUEST_TIMEOUT')\n || A_RequestEnvVariables.A_SERVER_REQUEST_TIMEOUT);\n\n this._timeout = new A_ScheduleObject(ms, this.handleTimeout.bind(this), { resolveOnClear: true });\n }\n\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on receiving data chunk\n * \n * Default Behavior: Accumulates data chunks into context buffers and checks for max body size.\n */\n async [A_RequestFeatures.onData](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_HttpRequestData) chunk: A_HttpRequestData,\n ...args: any[]\n ): Promise<void> {\n\n if (context.length + chunk.length > this._options.maxBodySize!) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n `Request body too large. Max size is ${this._options.maxBodySize} bytes.`\n );\n }\n\n context.buffers.push(chunk.data);\n if (!context.data)\n context.data = '';\n\n context.data += chunk.toString(this._options.encoding as BufferEncoding);\n }\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on request timeout\n * \n * Default Behavior: Stops request processing and emits timeout event.\n * \n * @param context \n * @param args \n */\n async [A_RequestFeatures.onTimeout](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n context.stopProcessing();\n\n this._timeout?.clear();\n\n this.emit(A_RequestFeatures.onTimeout);\n }\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on request close\n */\n async [A_RequestFeatures.onClose](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n this.emit(A_RequestFeatures.onClose);\n }\n\n\n @A_Feature.Extend({\n after: /.*/\n })\n /**\n * Hook called on request error\n */\n async [A_RequestFeatures.onError](\n @A_Inject(A_Error) error: A_Error,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n context.stopProcessing();\n\n this.emit(A_RequestFeatures.onError);\n }\n\n @A_Feature.Extend()\n /**\n * Hook called to parse request data\n */\n async [A_RequestFeatures.onEnd](\n @A_Inject(A_Config) config: A_Config<A_RequestEnvVariablesType>,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n const { data, type } = A_RequestHelper.parseRequestBody(context);\n\n this._body = data;\n this._bodyType = type;\n }\n\n\n\n @A_Feature.Extend()\n /**\n * Hook called to validate request data\n */\n async [A_RequestFeatures.onValidate](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n // Validate file uploads if multipart data detected\n if (!!this.contentType && this.contentType.includes('multipart/form-data') && !this._options.enableFileUploads) {\n throw new A_HttpServerError({\n status: 400,\n description: 'File uploads detected but not enabled. Set enableFileUploads: true in options.',\n });\n }\n }\n\n\n /**\n * Serialize request for logging/debugging\n */\n toJSON(): A_Request_Serialized {\n return {\n ...super.toJSON(),\n method: this.method,\n url: this.url,\n headers: this.headers,\n params: this.params,\n query: this.query,\n cookies: this._cookies,\n userAgent: this.userAgent,\n bodyType: this._bodyType,\n body: this._body,\n filesCount: this._files?.length || 0,\n totalFileSize: this.getTotalFileSize(),\n };\n }\n}","import type { IncomingMessage } from \"http\";\nimport { A_Request } from \"./A-Request.entity\";\nimport { A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\n\n\n// =============================================\n// Core Request Types\n// =============================================\n/**\n * Constructor parameters for A_Request entity\n */\nexport type A_Request_Init = {\n /**\n * Unique identifier for the request (should correspond to Response id)\n */\n id: string;\n\n /**\n * ASEID Shard for the request. \n * it's some sort of request fingerprint\n */\n shard: string\n /**\n * Node.js IncomingMessage object\n */\n request: IncomingMessage;\n /**\n * Request scope for context resolution\n */\n scope: string;\n};\n\n/**\n * Serialized representation of A_Request entity\n */\nexport type A_Request_Serialized<\n _ReqBodyType = any,\n _ParamsType extends Record<string, string> = any,\n _QueryType = any,\n> = A_TYPES__Entity_Serialized & {\n method: A_HttpServerRequestMethod;\n url: string;\n headers: Record<string, string | string[] | undefined>;\n params?: _ParamsType;\n query?: _QueryType;\n cookies: Record<string, string>;\n body?: _ReqBodyType;\n userAgent?: string;\n isValid: boolean;\n bodyType?: A_Request_BodyType;\n filesCount?: number;\n fileFieldNames?: string[];\n totalFileSize?: number;\n}\n\n/**\n * Supported HTTP request methods\n */\nexport type A_Request_Methods =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'OPTIONS'\n | 'HEAD'\n | 'CONNECT'\n | 'TRACE'\n | 'DEFAULT'; // Default is used for routes that do not have a method specified\n\n/**\n * Request lifecycle events\n */\nexport enum A_Request_Event {\n Error = 'error',\n Finish = 'finish',\n Data = 'data',\n End = 'end',\n Close = 'close',\n}\n\n\nexport type A_RequestFeatureNames = typeof A_RequestFeatures[keyof typeof A_RequestFeatures];\n\n/**\n * Request event callback function type\n */\nexport type A_Request_EventCallback = (request: A_Request) => void;\n\n\n// =============================================\n// Body Parsing Types\n// =============================================\n\n/**\n * Supported body content types for parsing\n */\nexport type A_Request_BodyType = 'json' | 'form' | 'multipart' | 'raw' | 'text';\n\n/**\n * Result of body parsing operation\n */\nexport type A_Request_ParsedBody = {\n /**\n * Type of parsed content\n */\n type: A_Request_BodyType;\n /**\n * Parsed data\n */\n data: any;\n /**\n * Size of the body in bytes\n */\n size: number;\n /**\n * Character encoding used\n */\n encoding?: string;\n /**\n * Multipart boundary (for multipart content)\n */\n boundary?: string;\n};\n\n\n\n// =============================================\n// Session Management Types\n// =============================================\n\n/**\n * Session data structure for user session management\n */\nexport type A_Request_SessionData = {\n /**\n * Unique session identifier\n */\n id?: string;\n /**\n * Associated user ID\n */\n userId?: string;\n /**\n * Session creation timestamp\n */\n createdAt?: Date;\n /**\n * Last access timestamp\n */\n lastAccess?: Date;\n /**\n * Session data storage\n */\n data?: Record<string, any>;\n /**\n * Whether session is expired\n */\n isExpired?: boolean;\n /**\n * Maximum session age in milliseconds\n */\n maxAge?: number;\n};\n\n\n// =============================================\n// File Upload Types\n// =============================================\n\n/**\n * File upload information for multipart requests\n */\nexport type A_Request_FileUpload = {\n /**\n * Form field name\n */\n fieldName: string;\n /**\n * Original filename\n */\n filename: string;\n /**\n * File encoding\n */\n encoding: string;\n /**\n * MIME type\n */\n mimetype: string;\n /**\n * File size in bytes\n */\n size: number;\n /**\n * File buffer data\n */\n buffer: Buffer;\n /**\n * Path if saved to disk\n */\n path?: string;\n /**\n * File hash for integrity verification\n */\n hash?: string;\n};\n\n\n// =============================================\n// Validation Types\n// =============================================\n\n/**\n * Request validation result with detailed feedback\n */\nexport type A_Request_ValidationResult = {\n /**\n * Whether validation passed\n */\n isValid: boolean;\n /**\n * Validation error messages\n */\n errors: string[];\n /**\n * Warning messages\n */\n warnings: string[];\n /**\n * Sanitized data after validation\n */\n sanitized?: any;\n};\n\n\n// =============================================\n// Configuration Types\n// =============================================\n\n/**\n * Request processing configuration options\n */\nexport type A_Request_Options = {\n /**\n * Maximum request body size in bytes (default: 10MB)\n */\n maxBodySize?: number;\n /**\n * Request timeout in milliseconds (default: 30s)\n */\n timeout?: number;\n /**\n * Default character encoding (default: 'utf8')\n */\n encoding?: string;\n /**\n * Automatically parse cookies (default: true)\n */\n parseCookies?: boolean;\n /**\n * Automatically parse query parameters (default: true)\n */\n parseQuery?: boolean;\n /**\n * Automatically parse request body (default: true)\n */\n parseBody?: boolean;\n /**\n * Enable file upload handling (default: false)\n */\n enableFileUploads?: boolean;\n /**\n * Enable strict validation mode (default: false)\n */\n strictValidation?: boolean;\n};\n\n/**\n * Request Event Listener Function\n */\nexport type A_Request_Listener = (req?: A_Request) => void;","\n\nexport const A_ResponseFeatures = {\n /**\n * Event fired when an error occurs while sending the response\n */\n onError: '_A_Response_onError',\n /**\n * Event fired when the response is closed\n */\n onClose: '_A_Response_onClose',\n /**\n * Event fired when the response is finished\n */\n onFinish: '_A_Response_onFinish',\n /**\n * Event fired when the response is sent\n */\n onSend: '_A_Response_onSend',\n /**\n * Event fired when the response is redirected\n */\n onRedirect: '_A_Response_onRedirect',\n} as const;","import {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_Inject,\n ASEID,\n} from \"@adaas/a-concept\";\nimport type {\n IncomingHttpHeaders,\n ServerResponse\n} from \"http\";\nimport {\n A_Response_Constructor,\n A_Response_CacheOptions,\n A_Response_Options,\n A_Response_Serialized,\n A_Response_CookieOptions,\n A_ResponseFeatureNames,\n} from \"./A-Response.types\";\nimport { pipeline, Readable } from 'stream';\nimport { A_ResponseFeatures } from \"./A-Response.constants\";\nimport { A_Response_Listener } from \"./A-Response.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\n\n/**\n * A_Response - Comprehensive HTTP Response Processing Entity\n * \n * This class provides a complete wrapper around Node.js ServerResponse with advanced features:\n * - Response data accumulation and value management\n * - Error collection and standardized error responses\n * - Response streaming with progress tracking\n * - Template rendering and view engine support\n * - Cookie management and secure cookie handling\n * - Response compression (gzip, deflate, brotli)\n * - File downloads and static file serving\n * - Response caching and ETags\n * - Performance metrics and timing\n * - Response validation and content negotiation\n * \n * @example\n */\nexport class A_Response<_ResponseType = any> extends A_Entity<\n A_Response_Constructor,\n A_Response_Serialized<_ResponseType>\n> {\n\n // =============================================\n // Static Properties\n // =============================================\n static get namespace(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n /**\n * Original ServerResponse object\n */\n private _res!: ServerResponse;\n /**\n * Internal object to store all response data\n */\n private _data!: Map<string, _ResponseType>;\n /**\n * uses in case the response isn't an object \n */\n private _dataOverride?: _ResponseType\n /**\n * Redirect URL for handling redirects\n */\n private _redirectURL?: string;\n /**\n * Cookies map for managing response cookies\n */\n private _cookies!: Map<string, { value: string, options?: A_Response_CookieOptions }>;\n /**\n * Indicates if the response has finished\n */\n private _cacheOptions?: A_Response_CacheOptions;\n /**\n * Indicates if the response has finished\n */\n private _options!: Required<A_Response_Options>\n /**\n * Event listeners map for A_Response events\n */\n private _listeners: Map<A_ResponseFeatureNames, Set<A_Response_Listener>> = new Map();\n /**\n * Whether this response is operating as a persistent SSE stream\n */\n private _isStreaming: boolean = false;\n\n\n constructor(params: A_Response_Constructor, options?: A_Response_Options) {\n super(params);\n this._options = {\n autoCompress: true,\n compressionThreshold: 1024, // 1KB\n enableCaching: true,\n defaultCacheMaxAge: 3600, // 1 hour\n enableMetrics: true,\n enableEtag: true,\n enableLastModified: true,\n charset: 'utf-8',\n defaultContentType: 'application/json',\n maxRedirects: 5,\n enableCookies: true,\n enableSessions: true,\n ...(options || {})\n };\n }\n\n /**\n * Initialize from new entity parameters\n */\n fromNew(newEntity: A_Response_Constructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Response).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._res = newEntity.response;\n this._data = new Map<string, _ResponseType>();\n this._cookies = new Map<string, { value: string, options?: A_Response_CookieOptions }>();\n\n\n }\n /**\n * Gets the response data map\n */\n get data(): Map<string, _ResponseType> {\n return this._data;\n }\n /**\n * Gets the original ServerResponse object\n */\n get original(): ServerResponse {\n return this._res;\n }\n /**\n * Gets whether headers have been sent\n */\n get headersSent(): boolean {\n return this.original.headersSent;\n }\n /**\n * Gets the current status code\n */\n get statusCode(): number {\n return this.original.statusCode;\n }\n /**\n * Gets response size in bytes\n */\n get size(): number {\n return this.original.getHeader('Content-Length') as number || 0;\n }\n /**\n * Whether this response is in SSE streaming mode.\n * When true the server container will NOT auto-send and destroy() will\n * leave the underlying socket open.\n */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Primary Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Initialize the response\n */\n async load(): Promise<void> {\n\n // Track response completion\n // this.original.on('finish', this.handleFinish.bind(this));\n\n // this.original.on('close', this.handleClose.bind(this));\n\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n /**\n * Destroy the response\n */\n async destroy(): Promise<any> {\n\n if (!this._isStreaming) {\n // Only call end() if not already ended — avoids double-end which can\n // interrupt an in-flight response body on keep-alive connections.\n if (!this.original.writableEnded) {\n this.original.end();\n }\n\n this._listeners.clear();\n\n // Remove only the 'error' listener we added in load().\n // Do NOT call removeAllListeners() — that strips Node.js HTTP's own\n // internal keep-alive 'finish' handler, causing the socket to never\n // re-enter the server's connection pool and hanging all subsequent\n // requests on the same keep-alive connection.\n this.original.removeAllListeners('error');\n }\n\n return super.destroy();\n }\n /**\n * Handle response failure with error details\n */\n async fail(err?: A_HttpServerError): Promise<void> {\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n await this.call(A_ResponseFeatures.onError);\n\n await this.destroy();\n }\n /**\n * Send a plain text or JSON response\n */\n async send(data?: any): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._dataOverride = data;\n\n await this.call(A_ResponseFeatures.onSend);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while sending the response.',\n originalError: error\n }));\n }\n }\n /**\n * Stream response data\n */\n public async stream(\n dataStream: Readable | any[]\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n return new Promise((resolve, reject) => {\n this.original.setHeader('Transfer-Encoding', 'chunked');\n this.setDefaultResponseHeaders();\n this.setCookieHeaders();\n this.original.writeHead(this.statusCode);\n\n let stream: Readable;\n\n if (Array.isArray(dataStream)) {\n // Convert array to readable stream\n stream = new Readable({\n read() {\n if (dataStream.length > 0) {\n const chunk = dataStream.shift();\n this.push(typeof chunk === 'string' ? chunk : JSON.stringify(chunk) + '\\n');\n } else {\n this.push(null);\n }\n }\n });\n } else {\n stream = dataStream;\n }\n\n let bytesWritten = 0;\n\n stream.on('data', (chunk) => {\n bytesWritten += chunk.length;\n });\n\n stream.on('end', resolve);\n\n stream.on('error', reject);\n\n pipeline(stream, this.original, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n });\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while streaming the response. Unable to process the stream.',\n originalError: error\n }));\n }\n }\n /**\n * Redirect response\n * \n * [!] Note: This method ends the response immediately.\n */\n public async redirect(\n url: string\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._redirectURL = url;\n\n await this.call(A_ResponseFeatures.onRedirect);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while redirecting the response.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response SSE (Server-Sent Events) Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Upgrade this response to a persistent SSE stream.\n * Sends the required headers and writes the initial `:ok` comment to flush\n * the connection. After calling this the response will NOT be auto-closed\n * by the server container or by destroy().\n */\n public sseOpen(): void {\n if (this.headersSent || this._isStreaming) return;\n this._isStreaming = true;\n this.original.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n this.original.write(':ok\\n\\n');\n // Reset streaming flag when the client disconnects\n this.original.once('close', () => {\n this._isStreaming = false;\n });\n }\n /**\n * Write a named SSE event onto the open stream.\n * Format: `event: <name>\\ndata: <JSON>\\n\\n`\n *\n * Compatible with browser EventSource `addEventListener(name, handler)`.\n *\n * @returns false when the channel is no longer writable\n */\n public sseWrite(event: string, data?: any): boolean {\n if (!this._isStreaming || this.original.destroyed) return false;\n try {\n return this.original.write(`event: ${event}\\ndata: ${JSON.stringify(data ?? {})}\\n\\n`);\n } catch {\n return false;\n }\n }\n /**\n * Close the SSE stream gracefully.\n */\n public sseClose(): void {\n if (!this._isStreaming || this.original.destroyed) return;\n this._isStreaming = false;\n this.original.end();\n }\n /**\n * Write head with status and headers\n */\n public writeHead(statusCode: number, headers?: Record<string, string> | IncomingHttpHeaders | any): this {\n this.original.writeHead(statusCode, headers);\n return this;\n }\n /**\n * Set HTTP status code\n */\n public status(code: number): this {\n this.original.statusCode = code;\n return this;\n }\n /**\n * Set response header\n */\n public setHeader(key: string, value: string | number | string[]): this {\n this.original.setHeader(key, value);\n return this;\n }\n /**\n * Get response header\n */\n public getHeader(key: string): string | number | string[] | undefined {\n return this.original.getHeader(key);\n }\n /**\n * Remove response header\n */\n public removeHeader(key: string): this {\n this.original.removeHeader(key);\n return this;\n }\n /**\n * Set cookie\n */\n public setCookie(\n name: string,\n value: string,\n options?: A_Response_CookieOptions\n ): this {\n this._cookies.set(name, { value, options });\n return this;\n }\n /**\n * Clear cookie\n */\n public clearCookie(name: string, options?: A_Response_CookieOptions): this {\n const clearOptions = {\n ...options,\n expires: new Date(0),\n maxAge: 0\n };\n this._cookies.set(name, { value: '', options: clearOptions });\n return this;\n }\n // --------------------------------------------------------------------------\n // Response Data manipulation methods\n // --------------------------------------------------------------------------\n /**\n * Add data to response\n */\n public add(key: string, data: _ResponseType): this {\n this._data.set(key, data);\n return this;\n }\n /**\n * Remove data from response\n */\n public remove(key: string): this {\n this._data.delete(key);\n return this;\n }\n /**\n * Get data from response\n */\n public get(key: string): _ResponseType | undefined {\n return this._data.get(key);\n }\n /**\n * Check if response has data\n */\n public has(key: string): boolean {\n return this._data.has(key);\n }\n /**\n * Clear all response data\n */\n public clear(): this {\n this._data.clear();\n return this;\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // Internal handlers for request events\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Handle response finish event\n * \n * @returns \n */\n protected handleFinish(): Promise<void> {\n try {\n return this.call(A_ResponseFeatures.onFinish) as Promise<void>;\n } catch (error) {\n return this.fail(new A_HttpServerError({\n status: 500,\n description: `Response finish error: ${error instanceof A_Error ? error.message : 'An error occurred while finishing the response.'}`,\n originalError: error\n }));\n }\n }\n /**\n * Handle response close event\n */\n protected async handleClose(): Promise<void> {\n try {\n\n await this.call(A_ResponseFeatures.onClose);\n\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: 'Client closed the connection before the response could be completed.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_ResponseFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Feature Default Extensions\n // --------------------------------------------------------------------------\n // ======================================================================================\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onSend](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n const responseData = this._dataOverride || this.toResponse();\n\n switch (true) {\n case !!responseData && typeof responseData === 'object':\n this.original.setHeader('Content-Type', `application/json; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n // this.setCookieHeaders();\n // this.setCacheHeaders();\n\n this.original.end(JSON.stringify(responseData));\n return;\n\n case !!responseData && typeof responseData === 'string':\n this.original.setHeader('Content-Type', `text/plain; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n\n default:\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n }\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onRedirect](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n if (!this._redirectURL) return;\n\n this.original.setHeader('Location', this._redirectURL!);\n if (!this.statusCode || (this.statusCode < 300 || this.statusCode > 399))\n this.status(301);\n\n this.original.end();\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onError](\n @A_Inject(A_HttpServerError) error: A_HttpServerError,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Request) request: A_Request,\n ...args: any[]\n ) {\n\n if (this.headersSent) {\n return;\n }\n\n const statusCode = error.status || 500;\n this.status(statusCode);\n\n const errorResponse = {\n error: {\n message: error.message,\n status: statusCode,\n description: error.description || '',\n }\n };\n\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(JSON.stringify(errorResponse));\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Helper Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Set standard response headers\n */\n protected setDefaultResponseHeaders(): void {\n // Security headers\n this.original.setHeader('X-Content-Type-Options', 'nosniff');\n this.original.setHeader('X-Frame-Options', 'DENY');\n this.original.setHeader('X-XSS-Protection', '1; mode=block');\n\n // Request ID for tracking\n this.original.setHeader('X-Request-ID', this.aseid.id);\n }\n /**\n * Set cookie headers\n */\n protected setCookieHeaders(): void {\n if (!this._options.enableCookies || this._cookies.size === 0) return;\n\n const cookieStrings: string[] = [];\n\n this._cookies.forEach(({ value, options }, name) => {\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options) {\n if (options.domain) cookieString += `; Domain=${options.domain}`;\n if (options.path) cookieString += `; Path=${options.path}`;\n if (options.maxAge) cookieString += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookieString += `; Expires=${options.expires.toUTCString()}`;\n if (options.httpOnly) cookieString += '; HttpOnly';\n if (options.secure) cookieString += '; Secure';\n if (options.sameSite) cookieString += `; SameSite=${options.sameSite}`;\n }\n\n cookieStrings.push(cookieString);\n });\n\n this.original.setHeader('Set-Cookie', cookieStrings);\n }\n /**\n * Set cache headers\n */\n protected setCacheHeaders(): void {\n if (!this._cacheOptions) return;\n\n const cacheControl: string[] = [];\n\n if (this._cacheOptions.public) cacheControl.push('public');\n if (this._cacheOptions.private) cacheControl.push('private');\n if (this._cacheOptions.noCache) cacheControl.push('no-cache');\n if (this._cacheOptions.noStore) cacheControl.push('no-store');\n if (this._cacheOptions.mustRevalidate) cacheControl.push('must-revalidate');\n if (this._cacheOptions.proxyRevalidate) cacheControl.push('proxy-revalidate');\n if (this._cacheOptions.immutable) cacheControl.push('immutable');\n\n if (this._cacheOptions.maxAge !== undefined) {\n cacheControl.push(`max-age=${this._cacheOptions.maxAge}`);\n }\n\n if (this._cacheOptions.sMaxAge !== undefined) {\n cacheControl.push(`s-maxage=${this._cacheOptions.sMaxAge}`);\n }\n\n if (cacheControl.length > 0) {\n this.original.setHeader('Cache-Control', cacheControl.join(', '));\n }\n\n if (this._cacheOptions.etag) {\n this.original.setHeader('ETag', this._cacheOptions.etag);\n }\n\n if (this._cacheOptions.lastModified) {\n this.original.setHeader('Last-Modified', this._cacheOptions.lastModified.toUTCString());\n }\n }\n\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Serialization Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Convert accumulated data to response object\n */\n public toResponse(): _ResponseType {\n const response = Array.from(this._data.entries()).reduce((acc, [key, value]) => {\n if (value instanceof A_Entity) {\n acc[key] = value.toJSON();\n } else {\n acc[key] = value;\n }\n return acc;\n }, {} as any);\n\n return response;\n }\n /**\n * Enhanced JSON serialization for logging/debugging\n */\n public toJSON(): A_Response_Serialized<_ResponseType> {\n return {\n ...super.toJSON(),\n status: this.statusCode,\n headersSent: this.headersSent,\n size: this.size,\n data: this.toResponse(),\n redirectURL: this._redirectURL,\n };\n }\n}","import { A_Error } from \"@adaas/a-concept\"\n\n\nexport class A_ResponseError extends A_Error {\n\n}","\n\n\nexport const A_HttpServerFeatures = {\n onBeforeRequest: '_A_HTTPServer_onBeforeRequest',\n onRequest: '_A_HTTPServer_onRequest',\n onAfterRequest: '_A_HTTPServer_onAfterRequest',\n} as const\n\n","import { A_Route } from '@adaas/a-utils/a-route';\nimport { A_ServerRouteHttpMethodNames } from './A-ServerRoute.types';\n\n\n\nexport class A_ServerRoute extends A_Route {\n\n public url!: string;\n public method!: A_ServerRouteHttpMethodNames;\n\n\n constructor(\n url: string | RegExp,\n method: A_ServerRouteHttpMethodNames\n )\n constructor(\n url: string | RegExp,\n )\n constructor(\n param1: string | RegExp,\n param2?: A_ServerRouteHttpMethodNames\n ) {\n super(param1);\n this.url = param1 instanceof RegExp ? param1.source : param1;\n this.method = param2 || 'GET';\n }\n\n\n toString(): string {\n // path can be like /api/v1/users/:id\n // and because of that :id we need to replace it with regex that matches chars and numbers only \n return `${this.method}::${this.path}`;\n\n // .replace(/\\/:([^\\/]+)/g, '\\\\/([^\\/]+)')\n }\n\n toRegExp(): RegExp {\n return new RegExp(`^${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n }\n\n toAFeatureExtension(extensionScope: Array<string> = []): RegExp {\n return new RegExp(`^${extensionScope.length\n ? `(${extensionScope.join('|')})`\n : '.*'\n }\\\\.${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n }\n}\n\n","import { A_Fragment, A_TYPES__Required } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ServerConstructor } from \"./A-Server.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\nexport class A_Server extends A_Fragment {\n\n public port: number;\n public version: string;\n protected _routes: A_ServerRoute[] = [];\n\n constructor(\n params: A_TYPES__Required<Partial<A_SERVER_TYPES__ServerConstructor>, [\n 'port',\n 'name'\n ]>\n ) {\n super(params);\n\n this.port = params.port;\n this._name = params.name;\n this.version = params.version || 'v1';\n\n this._routes = params.routes || this._routes;\n }\n\n\n /**\n * A list of routes that the server will listen to\n */\n get routes(): A_ServerRoute[] {\n return this._routes\n }\n\n}\n\n\n","import { A_Error, A_Feature, A_Inject, } from \"@adaas/a-concept\";\nimport { A_Server } from \"@adaas/a-server/server/A-Server.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ResponseFeatures } from \"@adaas/a-server/response/A-Response.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\n\n\nexport class A_ServerLogger extends A_Logger {\n\n protected declare config: A_Config<any>\n\n\n\n @A_Feature.Extend({\n name: A_ResponseFeatures.onSend,\n scope: [A_Response]\n })\n logRequestFinish(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ) {\n\n this.info('green', `Request ${request.method} ${request.url} finished with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n }\n\n\n @A_Feature.Extend({\n name: A_ResponseFeatures.onError,\n scope: [A_Response]\n })\n logResponseError(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Error) error: A_Error,\n ) {\n this.info('red', `Request ${request.method} ${request.url} errored with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n this.error(error);\n }\n\n\n\n\n // @A_Feature.Extend({\n // name: A_ServiceFeatures.onAfterStart,\n // scope: [A_Service]\n // })\n // logStart(\n // @A_Inject(A_Service) container: A_Service,\n // ): void {\n // // this.serverReady({\n // // port: container.port,\n // // app: {\n // // name: container.name,\n // // }\n // // })\n // }\n\n\n\n\n @A_Feature.Extend({\n name: A_ServiceFeatures.onAfterStop,\n scope: [A_Service]\n })\n logStop(\n @A_Inject(A_Server) server: A_Server,\n ) {\n this.log('red', `Server ${server.name} stopped`);\n }\n\n\n\n\n serverReady(\n params: {\n port: number,\n\n app: {\n name: string,\n version?: string\n }\n }\n ) {\n const processId = process.pid;\n\n this.info('cyan',\n ` ${params.app.name} v${params.app.version || '0.0.1'} is running on port ${params.port}`,\n ` Process ID: ${processId}`,\n ` Open In Browser: http://localhost:${params.port}`,\n ``,\n `-------------------------------`,\n ` ==============================`,\n ` LISTENING... `,\n ` ==============================`\n );\n }\n\n\n /**\n * Displays a proxy routes \n * \n * @param params \n */\n proxy(\n params: {\n original: string,\n destination: string,\n }\n ) {\n console.log(`\\x1b[35m[${this.scope.name}] |${this.getTime()}| Proxy:\n${' '.repeat(this.scopeLength + 3)}| ${params.original} -> ${params.destination}\n${' '.repeat(this.scopeLength + 3)}|-------------------------------\\x1b[0m`);\n }\n\n}","import type { IncomingMessage, Server, ServerResponse } from \"http\";\nimport { A_HttpServerFeatures } from \"./A-HttpServer.constants\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_TYPES__ServerENVVariables } from \"@adaas/a-server/constants/env.constants\";\nimport { A_Dependency, A_Error, A_Feature, A_IdentityHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_HttpServerRequestMethod } from \"./A-HttpServer.types\";\nimport { A_HttpServerError } from \"./A-HttpServer.error\";\nimport { A_RequestFeatures } from \"@adaas/a-server/request/A-Request.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\n\n\n\n\n/**\n * A-Service is a container that can run different types of services, such as HTTP servers, workers, etc.\n * Depending on the provided config and configuration, it will load the necessary components and start the service.\n * \n */\nexport class A_HttpServer extends A_Service {\n\n protected server!: Server;\n\n\n static get onBeforeRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onBeforeRequest,\n scope: [target.constructor],\n })(target, propertyKey, descriptor);\n }\n }\n\n static get onRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n scope: [target.constructor],\n })(target, propertyKey, descriptor);\n }\n }\n\n static get onAfterRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onAfterRequest,\n scope: [target.constructor],\n })(target, propertyKey, descriptor);\n }\n }\n\n\n\n @A_Feature.Extend()\n protected async [A_ServiceFeatures.onStart](\n\n @A_Dependency.Required()\n @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n\n @A_Dependency.Required()\n @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n\n ): Promise<void> {\n const http = await polyfill.http();\n\n // Create the HTTP server\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Start listening on the specified port\n await this.listen(config.get('A_SERVER_PORT'));\n }\n\n @A_Feature.Extend()\n protected async [A_ServiceFeatures.onAfterStart](\n @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger,\n ): Promise<void> {\n logger.serverReady({\n port: config.get('A_SERVER_PORT'),\n app: {\n name: this.scope.name,\n }\n });\n }\n\n protected async [A_ServiceFeatures.onStop](...args: any[]): Promise<void> {\n await this.close();\n }\n\n close() {\n return new Promise<void>((resolve, reject) => {\n this.server.close(() => {\n resolve();\n });\n });\n }\n\n listen(port: number) {\n return new Promise<void>((resolve, reject) => {\n this.server.listen(port, () => {\n resolve();\n });\n });\n }\n\n\n // ======================================================================================\n // ============================= A_HttpServer Lifecycle =================================\n // ======================================================================================\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onBeforeRequest](...args: any[]) { }\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onRequest](...args: any[]) { }\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onAfterRequest](...args: any[]) { }\n\n\n // ======================================================================================\n // ============================= A_HttpServer Methods =================================\n // ======================================================================================\n\n async handleRequest(\n request: IncomingMessage,\n response: ServerResponse\n ) {\n const route = new A_ServerRoute(\n request.url || '',\n request.method as A_HttpServerRequestMethod\n );\n\n const id = A_IdentityHelper.generateTimeId();\n const shard = `${request.method}-${route.path.replace('/', '-')}`;\n\n const req = new A_Request({ id, shard, request, scope: this.scope.name });\n const res = new A_Response({ id, shard, response, scope: this.scope.name });\n const context = new A_HttpServerRequestContext(request, response);\n\n const scope = new A_Scope({\n name: id,\n entities: [req, res],\n fragments: [route, context]\n }).inherit(this.scope);\n\n try {\n const onBeforeRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onBeforeRequest,\n component: this\n });\n\n const onRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onRequest,\n component: this\n });\n\n const onAfterRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onAfterRequest,\n component: this\n });\n\n await new Promise<void>(async (resolve, reject) => {\n\n const cleanup = () => {\n onBeforeRequestFeature.interrupt();\n onRequestFeature.interrupt();\n onAfterRequestFeature.interrupt();\n\n req.off(A_RequestFeatures.onError, cleanup);\n req.off(A_RequestFeatures.onClose, cleanup);\n req.off(A_RequestFeatures.onTimeout, cleanup);\n\n\n reject(scope.resolve(A_Error)!);\n }\n\n\n req.on(A_RequestFeatures.onError, cleanup.bind(this));\n req.on(A_RequestFeatures.onClose, cleanup.bind(this));\n\n try {\n await req.load();\n await res.load();\n\n\n await onBeforeRequestFeature.process(scope);\n\n await onRequestFeature.process(scope);\n\n await onAfterRequestFeature.process(scope);\n\n\n req.clearTimeout();\n\n // For SSE streams the controller calls response.sseOpen() which keeps\n // the socket alive; skip the auto-send so we don't close it here.\n if (!res.isStreaming) {\n await res.status(200).send();\n }\n\n resolve();\n } catch (error) {\n\n req.clearTimeout();\n reject(error);\n }\n });\n\n } catch (error) {\n\n let wrappedError;\n\n switch (true) {\n case error instanceof A_HttpServerError:\n wrappedError = error;\n break;\n\n case error instanceof A_Error && error.originalError instanceof A_HttpServerError:\n wrappedError = error.originalError;\n break;\n\n // Duck-type: A_Error (e.g. A_FeatureError) wrapping an HttpError-like original.\n // A_Error.fromConstructor() unwraps nested A_Error chains, so originalError is\n // always the root non-A_Error cause — check it for a numeric statusCode.\n case error instanceof A_Error &&\n error.originalError instanceof Error &&\n typeof (error.originalError as any).statusCode === 'number':\n wrappedError = new A_HttpServerError({\n status: (error.originalError as any).statusCode as number,\n description: (error.originalError as Error).message,\n originalError: error.originalError,\n });\n break;\n\n // Duck-type: any Error with a numeric statusCode property (e.g. http-errors,\n // Express-style errors, or plain project HttpError classes). Honour the\n // status code so the caller gets the right 4xx / 5xx rather than a blanket 500.\n case error instanceof Error && typeof (error as any).statusCode === 'number':\n wrappedError = new A_HttpServerError({\n status: (error as any).statusCode as number,\n description: error.message,\n originalError: error,\n });\n break;\n\n default:\n wrappedError = new A_HttpServerError({\n status: 500,\n description: 'An error occurred while processing the request.',\n originalError: error\n })\n break;\n }\n\n\n scope.register(wrappedError);\n\n await res.fail(wrappedError);\n\n await this.call(A_ServiceFeatures.onError, scope);\n }\n\n scope.destroy();\n }\n\n}\n\n\n\n\n\n\n\n\n","import { A_Error } from '@adaas/a-concept';\nimport { A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized } from './A-Server.types';\n\n\nexport class A_ServerError extends A_Error<A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized> {\n\n status: number = 500;\n\n\n protected fromConstructor(params: A_SERVER_TYPES__ServerError_Init): void {\n super.fromConstructor(params);\n if (params.status) {\n this.status = params.status;\n }\n }\n\n\n toJSON(): A_SERVER_TYPES__ServerError_Serialized {\n return {\n ...super.toJSON(),\n status: this.status\n }\n }\n}\n\n\n","export const A_ServerRouteHttpMethods = {\n DEFAULT: 'DEFAULT',\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n OPTIONS: 'OPTIONS',\n HEAD: 'HEAD',\n CONNECT: 'CONNECT',\n TRACE: 'TRACE',\n} as const\n\n\nexport const A_ServerRouteProtocols = {\n HTTP: 'http',\n HTTPS: 'https',\n WS: 'ws',\n WSS: 'wss',\n} as const","\n\nexport const A_ServerRouterMetaKeys = {\n ROUTES: '_A_ServerRouterMeta_ROUTES',\n ROUTES_CONFIGS: '_A_ServerRouterMeta_ROUTES_CONFIGS',\n} as const\n\n\n","import { A_ComponentMeta } from \"@adaas/a-concept\";\nimport { A_ServerRouterMetaStructure, A_ServerRouterRouteDefinition } from \"./A-ServerRouter.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouterMetaKeys } from \"./A-ServerRouter.constants\";\n\n\n\nexport class A_ServerRouterMeta extends A_ComponentMeta<A_ServerRouterMetaStructure> {\n\n\n get routes(): Array<A_ServerRoute> {\n return this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n }\n\n\n get definitions(): Map<string, A_ServerRouterRouteDefinition> {\n return this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n }\n\n\n addRoute(regexp: RegExp, route: A_ServerRouterRouteDefinition) {\n const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n existingRoutes.set(regexp.source, route);\n this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n existingRoutesConfigs.push(route.route);\n this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n }\n\n\n removeRoute(route: A_ServerRoute) {\n const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n existingRoutes.forEach((value, key) => {\n if (value.route === route) {\n existingRoutes.delete(key);\n }\n });\n this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n const index = existingRoutesConfigs.indexOf(route);\n if (index !== -1) {\n existingRoutesConfigs.splice(index, 1);\n }\n this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n }\n}","import { A_Component, A_Context, A_Feature_Define, A_Feature_Extend, A_TYPES__MetaLinkedComponentConstructors } from \"@adaas/a-concept\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRoute } from \"../A-ServerRoute/A-ServerRoute.entity\";\nimport { A_ServerRouter } from \"./A-ServerRouter.component\";\n\n/**\n * \n * This decorator should allow to set a default meta type for the class, this helps to avoid\n * the need to create custom meta classes for each class.\n * \n * @returns \n */\nexport function A_ServerRouterDefineDecorator(route: A_ServerRoute) {\n return function <TTarget extends A_TYPES__MetaLinkedComponentConstructors>(\n target: A_Component,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n\n const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(A_ServerRouter);\n\n const searchKey = route.toAFeatureExtension(['A_ServerRouter', 'A_Service']);\n\n meta.addRoute(searchKey, {\n component: target,\n handler: propertyKey,\n route\n });\n\n A_Feature_Define({\n name: searchKey.source,\n invoke: false\n })(target, propertyKey, descriptor)\n\n return A_Feature_Extend(searchKey)(target, propertyKey, descriptor);\n }\n}","import {\n A_Component,\n A_Concept,\n A_Context,\n A_Feature,\n A_Inject,\n A_Meta,\n A_Scope,\n A_TypeGuards,\n A_TYPES__Required\n} from \"@adaas/a-concept\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_ServerLogger } from \"../A-ServerLogger/A-ServerLogger.component\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouteHttpMethodNames } from \"@adaas/a-server/route/A-ServerRoute.types\";\nimport { A_ServerRouteHttpMethods } from \"@adaas/a-server/route/A-ServerRoute.constants\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRouterDefineDecorator } from \"./A-ServerRouterDefine.decorator\";\nimport { A_ServerRouterRouteConfig } from \"./A-ServerRouter.types\";\n\n\n\n@A_Meta.Define(A_ServerRouterMeta)\nexport class A_ServerRouter extends A_Component {\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n /**\n * Allows to define a custom route for POST requests\n * \n * @param path \n * @returns \n */\n static Post(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.POST,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for GET requests\n * \n * @param path \n * @returns \n */\n static Get(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.GET,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for PUT requests\n * \n * @param path \n * @returns \n */\n static Put(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.PUT,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for DELETE requests\n * \n * @param path \n * @returns \n */\n static Delete(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.DELETE,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for PATCH requests\n * \n * @param path \n * @returns \n */\n static Patch(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.PATCH,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for DEFAULT requests\n * \n * @param path \n * @returns \n */\n static Default(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.DEFAULT,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n\n // static routes: Array<A_ServerRoute> = [];\n\n /**\n * Private method to have the same signature for all route methods\n * \n * @param method \n * @param path \n * @returns \n */\n private static defineRoute(\n config: A_ServerRouterRouteConfig & { method: A_ServerRouteHttpMethodNames }\n ) {\n const route = typeof config.path === 'string' || config.path instanceof RegExp\n ? new A_ServerRoute(\n `/${config.prefix}/${config.version}${config.path instanceof RegExp ? config.path.source : config.path.startsWith('/') ? config.path : `/${config.path}`}`,\n config.method)\n : config.path;\n\n return A_ServerRouterDefineDecorator(route);\n }\n\n\n // =====================================================\n // ================ Concept Lifecycle ========================\n // =====================================================\n\n @A_Concept.Load()\n protected async load(\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<void> {\n const meta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n const routes = meta.routes;\n\n if (!routes || !routes.length) {\n logger.warning('yellow', `No routes defined for ${this.constructor.name}`);\n return;\n }\n\n\n logger.info('cyan',\n `Registered Routes:`,\n `------------------------------------\\n`,\n ...routes\n .map(route => `[${route.method.toUpperCase()}]${' '.repeat(7 - route.method.length)} ${route.path}`)\n\n );\n }\n\n\n\n // =======================================================\n // ================ Feature Definition=====================\n // =======================================================\n // @A_Feature.Define({\n // invoke: false\n // })\n @A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n })\n async identifyRoute(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_ServerRoute) route: A_ServerRoute,\n ) {\n if (route.method === 'OPTIONS') {\n // Ignore OPTIONS requests\n return;\n }\n /**\n * just execute all listeners on the Route\n * url example: /api/v1/users/123\n * OR\n * url example: /api/v1/users\n * => Then The feature will be \"GET::/api/v1/users\"\n * And it will return all stages that are similar to the feature name \n */\n\n const feature = new A_Feature({ name: route.toString(), component: this, })\n\n if (!feature.size)\n throw new A_HttpServerError({\n status: 404,\n title: 'Route Not Found',\n description: `No route found for ${request.method} ${request.url}`,\n })\n\n\n for (const stage of feature) {\n\n const targetConstructor = stage.definition.dependency.target;\n\n if (A_TypeGuards.isComponentConstructor(targetConstructor)) {\n\n const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n const routeDefinitions = meta.definitions;\n\n const routeDefinition = routeDefinitions?.get(stage.definition.name || '');\n\n\n\n\n if (routeDefinition) {\n request.useRoute(routeDefinition.route);\n }\n }\n\n const stageScope = new A_Scope({\n name: `a-route--${request.id}--${stage.definition.name}`,\n }, {\n parent: scope\n });\n\n\n await stage.process(stageScope);\n }\n\n }\n}","import { A_Component, A_Container, A_Context, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\n\n\n\nexport class A_ServerController extends A_Component {\n\n\n @A_ServerRouter.Post({\n path: '/:component/:operation',\n version: 'v1',\n prefix: 'a-component'\n })\n async callEntityMethod(\n @A_Inject(A_Request) request: A_Request<any, any, {\n component: string,\n operation: string\n }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope\n ) {\n\n // check step by step each parameter to ensure they are valid\n\n if (!scope.has(request.params.component))\n return\n\n if (!request.params.operation || typeof request.params.operation !== 'string')\n return;\n\n\n const possibleComponent = scope.resolve(request.params.component);\n\n if (\n !possibleComponent\n ||\n ![A_Component, A_Container]\n .some(c => possibleComponent instanceof c)\n )\n return;\n\n const component = possibleComponent as A_Component | A_Container;\n\n const meta = A_Context.meta(component);\n\n const targetFeature = meta.features().find(f => f.name === `${component.constructor.name}.${request.params.operation}`);\n\n if (!targetFeature)\n return;\n\n\n await component.call(request.params.operation, scope);\n }\n}","import {\n A_Context, A_Entity,\n ASEID,\n} from \"@adaas/a-concept\";\nimport {\n A_SERVER_TYPES__A_EntityListConstructor,\n A_SERVER_TYPES__A_EntityListPagination,\n A_SERVER_TYPES__A_EntityListSerialized\n} from \"./A-EntityList.types\";\n\n\n\n/**\n * A-EntityList\n * \n * Entity that represents a list of entities with pagination of particular type\n */\nexport class A_ServerEntityList<\n EntityType extends A_Entity = A_Entity,\n> extends A_Entity<\n A_SERVER_TYPES__A_EntityListConstructor,\n A_SERVER_TYPES__A_EntityListSerialized\n> {\n\n static get scope(): string {\n return 'a-server';\n }\n\n protected _entityConstructor!: new (...args: ConstructorParameters<typeof A_Entity>) => EntityType;\n protected _items: Array<EntityType> = [];\n protected _pagination: A_SERVER_TYPES__A_EntityListPagination = {\n total: 0,\n page: 1,\n pageSize: 10\n };\n\n\n /**\n * Returns the entity constructor used for the list\n */\n get entityConstructor(): new (...args: ConstructorParameters<typeof A_Entity>) => EntityType {\n return this._entityConstructor;\n }\n\n /**\n * Returns the list of items contained in the entity list\n */\n get items(): Array<EntityType> {\n return this._items;\n }\n\n /**\n * Returns pagination information about the entity list\n */\n get pagination(): A_SERVER_TYPES__A_EntityListPagination {\n return this._pagination;\n }\n\n\n\n\n /**\n * Creates a new instance of A_EntityList\n * \n * @param newEntity \n */\n fromNew(newEntity: A_SERVER_TYPES__A_EntityListConstructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: 'default',\n entity: 'a-list' + (newEntity.name ? `.${newEntity.name}` : ''),\n id: (new Date()).getTime().toString(),\n });\n\n this._entityConstructor = newEntity.constructor as new (...args: any[]) => EntityType;\n }\n\n\n\n /**\n * Allows to convert Repository Response data to EntityList instance\n * \n * [!] This method does not load the data from the repository, it only converts the data to the EntityList instance\n * \n * @param items \n * @param pagination \n */\n fromList(\n items: Array<EntityType> | Array<ReturnType<EntityType['toJSON']>>,\n pagination?: A_SERVER_TYPES__A_EntityListPagination\n ) {\n this._items = items.map(item => {\n if (item instanceof A_Entity) {\n return item as EntityType;\n } else {\n const entity = new this._entityConstructor(item);\n return entity;\n }\n });\n\n if (pagination) {\n this._pagination = {\n total: pagination.total,\n page: pagination.page,\n pageSize: pagination.pageSize\n }\n }\n }\n\n\n\n /**\n * Serializes the EntityList to a JSON object\n * \n * @returns \n */\n toJSON(): A_SERVER_TYPES__A_EntityListSerialized<EntityType> {\n return {\n ...super.toJSON(),\n items: this._items.map(i => i.toJSON()) as ReturnType<EntityType['toJSON']>[],\n pagination: this._pagination\n }\n }\n}\n","import { A_Entity, A_TYPES__Entity_Constructor, A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\n\n\nexport type A_SERVER_TYPES__A_EntityListConstructor = {\n name: string,\n scope: string,\n constructor: A_TYPES__Entity_Constructor,\n}\n\nexport enum A_SERVER_TYPES__A_EntityListEvent {\n Load = 'load',\n}\n\nexport type A_SERVER_TYPES__A_EntityListSerialized<EntityTypes extends A_Entity = A_Entity> = {\n items: Array<ReturnType<EntityTypes['toJSON']>>,\n type: string,\n pagination: A_SERVER_TYPES__A_EntityListPagination\n} & A_TYPES__Entity_Serialized;\n\n\n\nexport type A_SERVER_TYPES__A_EntityListPagination = {\n total: number,\n page: number,\n pageSize: number,\n}\n\n","import { A_Fragment } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerListQueryFilter<FilterFields extends string[]> extends A_Fragment {\n\n protected parsedQuery!: Record<FilterFields[number], string>;\n\n constructor(\n protected _query: string | Partial<Record<FilterFields[number], string>> = {},\n protected defaults: Partial<Record<FilterFields[number], string>> = {}\n ) {\n super();\n this.parsedQuery = this.parseQueryString(_query);\n }\n\n\n get query() {\n return this._query;\n }\n\n\n get(property: FilterFields[number], defaultValue: string = '') {\n return this.parsedQuery[property] || this.defaults[property] || defaultValue;\n }\n\n protected parseQueryString(value: string | Partial<Record<FilterFields[number], string>> = {}): Record<FilterFields[number], string> {\n if (typeof value === 'string') {\n return value.split('&').reduce((acc, part) => {\n const [key, val] = part.split('=');\n acc[decodeURIComponent(key)] = decodeURIComponent(val || '');\n return acc;\n }, {}) as Record<FilterFields[number], string>;\n }\n return value as Record<FilterFields[number], string>;\n }\n}","export const A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES = {\n // ----------------------------------------------------------\n // A-ServerLogger Environment Variables\n // ----------------------------------------------------------\n // These environment variables are used by A-Concept core to configure the application\n // ----------------------------------------------------------\n /**\n * Enable logging of 200 responses\n */\n SERVER_IGNORE_LOG_200: 'SERVER_IGNORE_LOG_200',\n /**\n * Enable logging of 404 responses\n */\n SERVER_IGNORE_LOG_404: 'SERVER_IGNORE_LOG_404',\n /**\n * Enable logging of 500 responses\n */\n SERVER_IGNORE_LOG_500: 'SERVER_IGNORE_LOG_500',\n /**\n * Enable logging of 400 responses\n */\n SERVER_IGNORE_LOG_400: 'SERVER_IGNORE_LOG_400',\n /**\n * Enable logging of default responses\n */\n SERVER_IGNORE_LOG_DEFAULT: 'SERVER_IGNORE_LOG_DEFAULT',\n} as const","import { A_Component } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerMiddleware extends A_Component {\n\n\n // static get features() {\n // // return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // // return A_Feature.Extend({\n // // name: A_ServerMiddlewareFeatures.onBeforeInit,\n // // scope: [target.constructor],\n // // })(target, propertyKey, descriptor);\n // // }\n // }\n\n}","import { A_SERVER_TYPES__ProxyConfigConstructorConfig } from \"./A-ServerProxy.types\";\n\nexport const PROXY_CONFIG_DEFAULTS: A_SERVER_TYPES__ProxyConfigConstructorConfig = {\n path: '/',\n hostname: 'localhost',\n port: 80,\n method: 'GET',\n headers: {},\n protocol: 'http'\n};\n","import { A_Fragment } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ProxyConfigConstructor, A_SERVER_TYPES__ProxyConfigConstructorConfig, A_SERVER_TYPES__RoutesConfig } from \"./A-ServerProxy.types\";\nimport { PROXY_CONFIG_DEFAULTS } from \"./A-ServerProxy.constants\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_ProxyConfig extends A_Fragment {\n\n protected readonly _configs: Array<A_SERVER_TYPES__RoutesConfig>\n\n constructor(\n /**\n * Setup proxy configs, where key is the path to match, and value is either a full URL or a partial config object\n */\n configs: A_SERVER_TYPES__ProxyConfigConstructor = {}\n ) {\n super();\n\n this._configs = Object.entries(configs).map(([path, config]) => {\n\n const targetUrl = new URL(typeof config === 'string' ? config : config.hostname || ''); // parse hostname, may include scheme\n\n const port =\n targetUrl.port ||\n (targetUrl.protocol === \"https:\" ? '443' : '80');\n\n\n const prepared = {\n ...PROXY_CONFIG_DEFAULTS,\n ...(typeof config === 'string' ? {\n path,\n port: parseInt(port),\n protocol: targetUrl.protocol,\n hostname: targetUrl.hostname\n } : config)\n }\n\n return {\n route: new A_ServerRoute(prepared.path, prepared.method),\n hostname: prepared.hostname,\n port: prepared.port,\n headers: prepared.headers,\n protocol: prepared.protocol\n }\n });\n }\n\n /**\n * Returns all configured proxy configs\n * \n */\n get configs(): Array<A_SERVER_TYPES__RoutesConfig> {\n return this._configs;\n }\n\n\n /**\n * Checks if a given path is configured in the proxy\n * \n * @param path \n * @returns \n */\n has(path: string): boolean {\n return this._configs.some(route => route.route.toRegExp().test(path));\n }\n\n /**\n * Returns the proxy configuration for a given path, if exists\n *\n * @param path \n * @returns \n */\n config(path: string): A_SERVER_TYPES__RoutesConfig | undefined {\n \n\n return this._configs.find(route => route.route.toRegExp().test(path));\n }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_ProxyConfig } from \"./A-ServerProxy.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_Logger, A_LOGGER_COLORS } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\n\n\nexport class A_ServerProxy extends A_Component {\n\n\n @A_Concept.Load()\n async load(\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_ProxyConfig) config: A_ProxyConfig\n ) {\n logger.info(\n 'green',\n `Proxy routes configured:`,\n ...config.configs.map(c => `${c.route.toString()} -> ${c.protocol}//${c.hostname}:${c.port}`)\n );\n }\n\n\n\n @A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n before:/.*/\n })\n async onRequest(\n @A_Inject(A_Request) req: A_Request,\n @A_Inject(A_Response) res: A_Response,\n @A_Inject(A_ProxyConfig) proxyConfig: A_ProxyConfig,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n @A_Inject(A_Feature) feature: A_Feature\n ) {\n return new Promise<void>(async (resolve, reject) => {\n const { method, url } = req;\n\n const route = new A_ServerRoute(url, method);\n const config = proxyConfig.config(route.toString());\n\n if (!config) {\n return resolve(); // nothing to proxy\n }\n\n logger.log(\n \"yellow\",\n `Proxying request ${method} ${url} to ${config.hostname}`,\n config\n );\n\n const client = await (config.protocol === \"https:\"\n ? polyfill.https()\n : polyfill.http());\n\n const proxyReq = client.request(\n {\n method: config.route.method,\n hostname: config.hostname,\n port: config.port,\n headers: config.headers,\n path: route.path,\n },\n (proxyRes) => {\n if (!res.headersSent) {\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n }\n proxyRes.on(\"end\", () => {\n\n logger.log(\"green\", `Proxy request to ${config?.hostname} completed`);\n\n resolve();\n });\n\n proxyRes.pipe(res.original);\n }\n );\n\n proxyReq.on(\"error\", (err) => reject(err));\n\n req.pipe(proxyReq);\n\n feature.interrupt();\n });\n }\n\n}","import { A_Fragment } from \"@adaas/a-concept\";\n\nexport interface A_StaticAlias {\n alias: string;\n path: string;\n directory: string;\n enabled?: boolean;\n}\n\nexport interface A_StaticDirectoryConfig {\n path: string;\n directory: string;\n alias?: string;\n}\n\nexport class A_StaticConfig extends A_Fragment {\n\n readonly directories: Array<string>;\n private _aliases: Map<string, A_StaticAlias> = new Map();\n private _directoryConfigs: A_StaticDirectoryConfig[] = [];\n\n constructor(\n /**\n * Setup directories to serve static files from, comma separated\n */\n directories: string[] = [],\n /**\n * Custom directory configurations with aliases\n */\n directoryConfigs: A_StaticDirectoryConfig[] = []\n ) {\n super();\n\n this.directories = directories;\n this._directoryConfigs = directoryConfigs;\n\n // Initialize default aliases from directories\n this.initializeDefaultAliases();\n\n // Initialize custom aliases from directoryConfigs\n this.initializeCustomAliases();\n }\n\n private initializeDefaultAliases(): void {\n this.directories.forEach((dir, index) => {\n const alias: A_StaticAlias = {\n alias: `/static${index > 0 ? index : ''}`,\n path: `/static${index > 0 ? index : ''}`,\n directory: dir,\n enabled: true\n };\n this._aliases.set(alias.path, alias);\n });\n }\n\n private initializeCustomAliases(): void {\n this._directoryConfigs.forEach((config) => {\n const alias: A_StaticAlias = {\n alias: config.alias || config.path,\n path: config.path,\n directory: config.directory,\n enabled: true\n };\n this._aliases.set(alias.path, alias);\n });\n }\n\n /**\n * Add a custom static file alias\n * @param alias - The URL path alias (e.g., '/assets')\n * @param directory - The local directory path\n * @param path - Optional custom path (defaults to alias)\n */\n public addAlias(alias: string, directory: string, path?: string): void {\n const staticAlias: A_StaticAlias = {\n alias,\n path: path || alias,\n directory,\n enabled: true\n };\n\n this._aliases.set(staticAlias.path, staticAlias);\n }\n\n /**\n * Remove a static file alias\n * @param aliasPath - The path of the alias to remove\n */\n public removeAlias(aliasPath: string): boolean {\n return this._aliases.delete(aliasPath);\n }\n\n /**\n * Enable or disable an alias\n * @param aliasPath - The path of the alias\n * @param enabled - Whether to enable or disable\n */\n public setAliasEnabled(aliasPath: string, enabled: boolean): boolean {\n const alias = this._aliases.get(aliasPath);\n if (alias) {\n alias.enabled = enabled;\n return true;\n }\n return false;\n }\n\n /**\n * Get all configured aliases\n */\n public getAliases(): A_StaticAlias[] {\n return Array.from(this._aliases.values());\n }\n\n /**\n * Get enabled aliases only\n */\n public getEnabledAliases(): A_StaticAlias[] {\n return Array.from(this._aliases.values()).filter(alias => alias.enabled !== false);\n }\n\n /**\n * Find the best matching alias for a given request path\n * @param requestPath - The request path to match\n */\n public findMatchingAlias(requestPath: string): A_StaticAlias | null {\n let bestMatch: A_StaticAlias | null = null;\n let longestMatch = 0;\n\n for (const alias of this.getEnabledAliases()) {\n if (requestPath.startsWith(alias.path) && alias.path.length > longestMatch) {\n bestMatch = alias;\n longestMatch = alias.path.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Check if an alias exists\n * @param aliasPath - The path to check\n */\n public hasAlias(aliasPath: string): boolean {\n return this._aliases.has(aliasPath);\n }\n\n /**\n * Get a specific alias by path\n * @param aliasPath - The path of the alias\n */\n public getAlias(aliasPath: string): A_StaticAlias | undefined {\n return this._aliases.get(aliasPath);\n }\n\n /**\n * Add multiple aliases at once\n * @param aliases - Array of alias configurations\n */\n public addAliases(aliases: A_StaticDirectoryConfig[]): void {\n aliases.forEach(config => {\n this.addAlias(config.alias || config.path, config.directory, config.path);\n });\n }\n\n /**\n * Clear all aliases\n */\n public clearAliases(): void {\n this._aliases.clear();\n }\n\n /**\n * Update an existing alias\n * @param aliasPath - The path of the alias to update\n * @param updates - Partial updates to apply\n */\n public updateAlias(aliasPath: string, updates: Partial<A_StaticAlias>): boolean {\n const alias = this._aliases.get(aliasPath);\n if (alias) {\n Object.assign(alias, updates);\n return true;\n }\n return false;\n }\n\n /**\n * Get statistics about configured aliases\n */\n public getStats(): {\n total: number;\n enabled: number;\n disabled: number;\n directories: string[];\n } {\n const aliases = this.getAliases();\n const enabled = aliases.filter(a => a.enabled !== false);\n const disabled = aliases.filter(a => a.enabled === false);\n const directories = [...new Set(aliases.map(a => a.directory))];\n\n return {\n total: aliases.length,\n enabled: enabled.length,\n disabled: disabled.length,\n directories\n };\n }\n\n /**\n * Checks if a given path is configured in the proxy (legacy method)\n * @deprecated Use findMatchingAlias instead\n * @param path \n * @returns \n */\n has(path: string): boolean {\n const alias = this.findMatchingAlias(path);\n return alias ? !!alias.directory : false;\n }\n\n /**\n * Gets the directory for a given path if configured (legacy method)\n * \n * @param path \n * @returns \n */\n get(path: string): string | undefined {\n const alias = this.findMatchingAlias(path);\n return alias ? alias.directory : undefined;\n }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\"\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_StaticConfig, A_StaticAlias } from \"./A-ServerStatic.context\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\nexport class A_StaticLoader extends A_Component {\n\n private _fsPolyfill: any;\n private _pathPolyfill: any;\n\n @A_Concept.Load()\n async load(\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_StaticConfig) config: A_StaticConfig,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill\n ) {\n // Initialize polyfills\n this._fsPolyfill = await polyfill.fs();\n this._pathPolyfill = await polyfill.path();\n\n // Log configured aliases\n const aliases = config.getEnabledAliases();\n logger.info('cyan',\n\n `Static aliases configured:`,\n ...aliases.map(alias => `${alias.alias} -> ${alias.directory}`)\n );\n }\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_Feature.Extend({\n before: /.*/\n })\n async [A_HttpServerFeatures.onRequest](\n @A_Inject(A_Request) req: A_Request,\n @A_Inject(A_Response) res: A_Response,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_StaticConfig) config: A_StaticConfig,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill\n ) {\n\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n return; // Only handle GET and HEAD requests\n }\n\n const { method, url } = req;\n const route = new A_ServerRoute(url, method);\n\n // Check if this request matches any of our configured aliases\n const alias = config.findMatchingAlias(route.path);\n if (!alias) {\n return; // No static config for this path\n }\n\n try {\n // Ensure polyfills are available\n const fs = this._fsPolyfill || await polyfill.fs();\n const path = this._pathPolyfill || await polyfill.path();\n\n const staticDir = path.resolve(process.cwd(), alias.directory);\n\n // Validate static directory exists\n if (!fs.existsSync(staticDir)) {\n logger.log(\"red\", `Static directory ${staticDir} does not exist.`);\n return;\n }\n\n // Get the file path relative to the alias\n const relativePath = route.path.replace(alias.path, '');\n const safePath = this.safeFilePath(staticDir, relativePath, req.headers?.host, path, fs);\n\n await this.serveFile(safePath, res, logger, fs, path);\n\n logger.log('green', `Successfully served: ${safePath}`);\n\n } catch (error: any) {\n throw new A_HttpServerError({\n status: 500,\n title: 'Static File Serving Error',\n description: `Error serving static file for ${route.path}: ${error.message}`,\n originalError: error\n });\n }\n }\n\n /**\n * Add a custom static file alias through the config\n * @param alias - The URL path alias (e.g., '/assets')\n * @param directory - The local directory path\n * @param path - Optional custom path (defaults to alias)\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public addAlias(\n alias: string,\n directory: string,\n config: A_StaticConfig,\n logger?: A_Logger,\n path?: string\n ): void {\n config.addAlias(alias, directory, path);\n\n if (logger) {\n logger.log('cyan', `Static alias added: ${alias} -> ${directory}`);\n }\n }\n\n /**\n * Remove a static file alias through the config\n * @param aliasPath - The path of the alias to remove\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public removeAlias(aliasPath: string, config: A_StaticConfig, logger?: A_Logger): boolean {\n const removed = config.removeAlias(aliasPath);\n\n if (removed && logger) {\n logger.log('yellow', `Static alias removed: ${aliasPath}`);\n }\n\n return removed;\n }\n\n /**\n * Get all configured aliases from config\n * @param config - Static config instance\n */\n public getAliases(config: A_StaticConfig): A_StaticAlias[] {\n return config.getAliases();\n }\n\n /**\n * Enable or disable an alias\n * @param aliasPath - The path of the alias\n * @param enabled - Whether to enable or disable\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public setAliasEnabled(\n aliasPath: string,\n enabled: boolean,\n config: A_StaticConfig,\n logger?: A_Logger\n ): boolean {\n const result = config.setAliasEnabled(aliasPath, enabled);\n\n if (result && logger) {\n logger.log('blue', `Static alias ${enabled ? 'enabled' : 'disabled'}: ${aliasPath}`);\n }\n\n return result;\n }\n\n protected getMimeType(ext: string): string {\n const mimeTypes: Record<string, string> = {\n // Text\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".xml\": \"application/xml\",\n\n // JavaScript\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".jsx\": \"application/javascript\",\n \".ts\": \"application/typescript\",\n \".tsx\": \"application/typescript\",\n\n // JSON\n \".json\": \"application/json\",\n \".jsonld\": \"application/ld+json\",\n\n // Images\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".webp\": \"image/webp\",\n \".bmp\": \"image/bmp\",\n \".tiff\": \"image/tiff\",\n\n // Fonts\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n // Audio/Video\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".ogg\": \"application/ogg\",\n\n // Archives\n \".zip\": \"application/zip\",\n \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n\n // Documents\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n };\n\n return mimeTypes[ext.toLowerCase()] || \"application/octet-stream\";\n }\n\n\n protected safeFilePath(staticDir: string, reqUrl: string, host: string = 'localhost', pathPolyfill: any, fsPolyfill: any): string {\n const parsedUrl = new URL(reqUrl || \"/\", `http://${host}`);\n let pathname = decodeURIComponent(parsedUrl.pathname);\n\n // Prevent path traversal attacks\n pathname = pathname.replace(/\\.\\.[\\/\\\\]/g, \"\");\n\n let filePath = pathPolyfill.join(staticDir, pathname);\n\n if (!fsPolyfill.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n return filePath;\n }\n\n protected serveFile(\n filePath: string,\n res: A_Response,\n logger: A_Logger,\n fsPolyfill: any,\n pathPolyfill: any\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n if (fsPolyfill.existsSync(filePath)) {\n const ext = pathPolyfill.extname(filePath);\n const contentType = this.getMimeType(ext);\n\n // Set appropriate headers\n const headers: Record<string, string> = {\n \"Content-Type\": contentType,\n \"Cache-Control\": this.getCacheControl(ext),\n \"X-Content-Type-Options\": \"nosniff\"\n };\n\n res.writeHead(200, headers);\n\n const stream = fsPolyfill.createReadStream(filePath);\n\n if (stream && res.original) {\n stream.pipe(res.original);\n\n stream.on('end', () => {\n resolve();\n });\n\n stream.on(\"error\", (err: any) => {\n reject(new A_HttpServerError({\n status: 500,\n title: 'File Stream Error',\n description: `Error reading file stream for ${filePath}: ${err.message}`,\n originalError: err\n }));\n });\n } else {\n reject(new A_HttpServerError({\n status: 500,\n title: 'Response Stream Error',\n description: `Unable to pipe file stream for ${filePath}`,\n }));\n }\n } else {\n reject(new A_HttpServerError({\n status: 404,\n title: 'File Not Found',\n description: `File not found: ${filePath}`,\n }));\n }\n } catch (error: any) {\n logger.error(`Error serving file: ${error.message}`);\n reject(new A_HttpServerError({\n status: 500,\n title: 'Internal Server Error',\n description: `Error serving file: ${error.message}`,\n originalError: error\n }));\n }\n });\n }\n\n protected getCacheControl(ext: string): string {\n // Different cache strategies for different file types\n const staticAssets = ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.otf'];\n const dynamicContent = ['.html', '.htm'];\n\n if (staticAssets.includes(ext.toLowerCase())) {\n return \"public, max-age=31536000\"; // 1 year for static assets\n } else if (dynamicContent.includes(ext.toLowerCase())) {\n return \"public, max-age=3600\"; // 1 hour for HTML\n } else {\n return \"public, max-age=86400\"; // 1 day for other files\n }\n }\n\n}\n\n\n","export const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES = {\n // ----------------------------------------------------------\n // A-Server Environment Variables\n // ----------------------------------------------------------\n // These environment variables are used by A-Server to configure the application\n // ----------------------------------------------------------\n /**\n * Port for the server to listen on\n * [!] Default is 3000\n * @default 3000\n */\n A_SERVER_PORT: 'A_SERVER_PORT',\n\n} as const;\n\nexport type A_TYPES__ServerENVVariables = (typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES)[keyof typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES][];\n\n\n\nexport const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY = [\n A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES.A_SERVER_PORT,\n] as const;\n\n\n\n\n"]}
1
+ {"version":3,"sources":["../../src/lib/A-Request/A-HttpRequestData.context.ts","../../src/lib/A-Request/A-HttpServerRequest.context.ts","../../src/lib/A-Request/A-Request.constants.ts","../../src/lib/A-Server/A-HttpServer.error.ts","../../src/lib/A-Request/A-Request.error.ts","../../src/lib/A-Request/A-Request.helper.ts","../../src/lib/A-Request/A-Request.env.ts","../../src/lib/A-Request/A-Request.entity.ts","../../src/lib/A-Request/A-Request.types.ts","../../src/lib/A-Response/A-Response.constants.ts","../../src/lib/A-Response/A-Response.entity.ts","../../src/lib/A-Response/A-Response.error.ts","../../src/lib/A-Server/A-HttpServer.constants.ts","../../src/lib/A-ServerRoute/A-ServerRoute.entity.ts","../../src/lib/A-Server/A-Server.context.ts","../../src/lib/A-ServerLogger/A-ServerLogger.component.ts","../../src/lib/A-Server/A-HttpServer.container.ts","../../src/lib/A-Server/A-Server.error.ts","../../src/lib/A-ServerRoute/A-ServerRoute.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.meta.ts","../../src/lib/A-ServerRouter/A-ServerRouterDefine.decorator.ts","../../src/lib/A-ServerRouter/A-ServerRouter.component.ts","../../src/lib/A-ServerController/A-ServerController.component.ts","../../src/lib/A-ServerEntityList/A-EntityList.entity.ts","../../src/lib/A-ServerEntityList/A-EntityList.types.ts","../../src/lib/A-ServerListQuery/A-ServerListQueryFilter.context.ts","../../src/lib/A-ServerLogger/A-ServerLogger.constants.ts","../../src/lib/A-ServerMiddleware/A-ServerMiddleware.component.ts","../../src/lib/A-ServerProxy/A-ServerProxy.constants.ts","../../src/lib/A-ServerProxy/A-ServerProxy.context.ts","../../src/lib/A-ServerProxy/A-ServerProxy.component.ts","../../src/lib/A-ServerStatic/A-ServerStatic.context.ts","../../src/lib/A-ServerStatic/A-ServerStatic.component.ts","../../src/constants/env.constants.ts"],"names":["A_Error","A_IdentityHelper","A_Context","A_Request_Event","_a","_b","_c","A_Entity","ASEID","A_Feature","A_Inject","A_Fragment","_d","_e","A_Service","A_ServiceFeatures","A_Scope","A_Config","A_Component","A_Logger","A_SERVER_TYPES__A_EntityListEvent","A_Concept","A_Polyfill"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIO,IAAM,iBAAA,GAAN,cAAgC,kBAAA,CAEpC;AAAA,EAGC,YAAY,IAAA,EAAc;AACtB,IAAA,KAAA;AAAA,MACI;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,IAAU,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAChC;AAAA,EAGA,QAAA,CAAS,WAA2B,OAAA,EAAiB;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EACtC;AAEJ;ACxBO,IAAM,0BAAA,GAAN,cAEG,kBAAA,CAoBR;AAAA,EAQE,IAAc,QAAA,GAA4B;AACtC,IAAA,OAAO,MAAM,MAAA,CAAO,OAAA;AAAA,EACxB;AAAA,EAEA,IAAc,SAAA,GAA4B;AACtC,IAAA,OAAO,MAAM,MAAA,CAAO,QAAA;AAAA,EACxB;AAAA,EAKA,WAAA,CACI,SACA,QAAA,EACF;AACE,IAAA,KAAA,CAAM,qBAAA,EAAuB,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAGlD,IAAA,IAAA,CAAK,GAAA,GAAM,iBAAiB,cAAA,EAAe;AAAA,EAC/C;AAAA,EAEA,IAAI,EAAA,GAAa;AACb,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,KAAK,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,EACpE;AAAA,EAEA,IAAI,OAAA,GAAoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,EAAE,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,WAAA,GAAkC;AAClC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA,IAAK,MAAA;AAAA,EACpD;AAAA,EAGA,IAAI,IAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,KAAK,KAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,IAAI,cAAA,GAAyB;AACzB,IAAA,IAAI,UAAU,IAAA,CAAK,QAAA;AACnB,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAA,GAAU,QAAQ,MAAA,EAAO;AAAA,IAC7B;AAEA,IAAA,MAAM,CAAC,OAAA,EAAS,WAAW,IAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,UAAU,CAAA;AAC7D,IAAA,OAAO,OAAA,GAAU,MAAO,WAAA,GAAc,GAAA;AAAA,EAC1C;AAAA,EAGA,eAAA,GAAkB;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,MAAA,EAAO;AAAA,EACrC;AAAA,EAEA,cAAA,GAAiB;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,MAAA,EAAO;AAAA,EACnC;AACJ;;;ACtGO,IAAM,iBAAA,GAAoB;AAAA,EAE7B,OAAA,EAAS,mBAAA;AAAA,EAET,MAAA,EAAQ,kBAAA;AAAA,EAER,WAAA,EAAa,uBAAA;AAAA,EAEb,OAAA,EAAS,mBAAA;AAAA,EAET,UAAA,EAAY,sBAAA;AAAA,EAEZ,OAAA,EAAS,mBAAA;AAAA,EAET,SAAA,EAAW,qBAAA;AAAA,EAEX,SAAA,EAAW,qBAAA;AAAA,EAEX,MAAA,EAAQ,kBAAA;AAAA,EAER,KAAA,EAAO,iBAAA;AAAA,EAEP,WAAA,EAAa,uBAAA;AAAA,EAEb,YAAA,EAAc,wBAAA;AAAA,EAEd,aAAA,EAAe,yBAAA;AAAA,EAEf,cAAA,EAAgB;AACpB;ACzBO,IAAM,kBAAA,GAAN,MAAM,kBAAA,SAA0B,OAAA,CAA8D;AAAA;AAAA;AAAA;AAAA,EA8DjG,OAAe,mBAAmB,MAAA,EAAwB;AACtD,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA,IAAK,eAAA;AAAA,EAC9C;AAAA,EA8BA,WAAA,CACI,QACA,MAAA,EACF;AAEE,IAAA,QAAQ,IAAA;AAAM;AAAA,MAEV,MAAK,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,MAAA,KAAW,QAAA;AACjD,QAAA,KAAA,CAAM;AAAA,UACF,KAAA,EAAO,kBAAA,CAAkB,kBAAA,CAAmB,MAAM,CAAA;AAAA,UAClD,WAAA,EAAa;AAAA,SAChB,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA;AAAA;AAAA,MAGJ,KAAK,MAAA,YAAkB,KAAA;AACnB,QAAA,KAAA,CAAM,MAAM,CAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AACd,QAAA;AAAA;AAAA,MAGJ,MAAK,OAAO,MAAA,KAAW,YAAY,MAAA,KAAW,IAAA,IAAQ,EAAE,MAAA,YAAkB,KAAA,CAAA;AACtE,QAAA,MAAM,MAAA,GAAS,MAAA;AAGf,QAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,EAAO;AACnC,UAAA,KAAA,CAAM,MAAgC,CAAA;AACtC,UAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,GAAA;AAAA,QACnC,CAAA,MAAO;AAEH,UAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,GAAS,mBAAkB,kBAAA,CAAmB,MAAA,CAAO,MAAM,CAAA,GAAI,uBAAA;AACpF,UAAA,KAAA,CAAM;AAAA,YACF,KAAA;AAAA,YACA,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,eAAe,MAAA,CAAO;AAAA,WACzB,CAAA;AACD,UAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,GAAA;AAAA,QACnC;AACA,QAAA;AAAA,MAEJ;AAEI,QAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA;AACtF,EACJ;AAAA,EAGU,gBAAgB,MAAA,EAAsC;AAC5D,IAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAC5B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,IACzB;AAAA,EACJ;AAAA,EAGA,MAAA,GAAuC;AACnC,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK;AAAA,KACjB;AAAA,EACJ;AACJ,CAAA;AA/Ja,kBAAA,CAEO,mBAAA,GAA8B,GAAA;AAFrC,kBAAA,CAGO,aAAA,GAAgB,oBAAA;AAHvB,kBAAA,CAKO,yBAAA,GAAoC,GAAA;AAL3C,kBAAA,CAMO,mBAAA,GAAsB,uBAAA;AAAA;AAAA;AAAA;AAN7B,kBAAA,CAWe,kBAAA,GAA6C;AAAA;AAAA,EAEjE,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,kBAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,gBAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,wBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,kBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,iCAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA;AAAA,EAGL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,4BAAA;AAAA,EACL,GAAA,EAAK,yBAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,eAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK;AACT,CAAA;AAvDG,IAAM,iBAAA,GAAN;ACFA,IAAM,cAAA,GAAN,cAA6BA,OAAAA,CAAQ;AAQ5C;AARa,cAAA,CAEO,uBAAA,GAA0B,8BAAA;AAFjC,cAAA,CAGO,eAAA,GAAkB,mBAAA;AAHzB,cAAA,CAIO,mBAAA,GAAsB,mBAAA;AAJ7B,cAAA,CAKO,mBAAA,GAAsB,iBAAA;AAL7B,cAAA,CAMO,sBAAA,GAAyB,6BAAA;;;ACuBtC,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzB,OAAO,aAAA,CAAc,GAAA,EAAa,YAAA,EAA8C;AAE5E,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAE9C,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,IAAA,MAAM,kBAAkB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAE9D,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,cAAA,GAAiB,gBAAgB,CAAC,CAAA;AACxC,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAEhC,MAAA,IAAI,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACxC,QAAA,IAAI,UAAA,EAAY;AACZ,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,kBAAA,CAAmB,UAAU,CAAA;AAAA,QACrD;AAAA,MACJ,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AAEtC,QAAA,OAAO,EAAC;AAAA,MACZ;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,aAAyC,GAAA,EAAgB;AAC5D,IAAA,MAAM,QAAgC,EAAC;AAGvC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAGzB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG3C,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,KAAA,CAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aACH,YAAA,EACsB;AACtB,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,IAAA,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAA,MAAA,KAAU;AACtC,MAAA,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC3B,MAAA,IAAI,QAAQ,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,iBACH,OAAA,EAIF;AACE,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,kBAAkB,CAAA;AACzE,QAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpC,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,mCAAmC,CAAA;AAC1F,QAAA,UAAA,GAAa,gBAAA,CAAgB,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA;AAC7D,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,qBAAqB,CAAA;AAC5E,QAAA,MAAM,eAAA,GAAkB,iBAAgB,kBAAA,CAAmB,MAAA,CAAO,OAAO,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA;AAE9G,QAAA,UAAA,GAAa;AAAA,UACT,GAAG,eAAA,CAAgB,MAAA;AAAA,UACnB,QAAQ,eAAA,CAAgB;AAAA,SAC5B;AACA,QAAA,QAAA,GAAW,WAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,OAAO,CAAA;AAC9D,QAAA,UAAA,GAAa,OAAA,CAAQ,IAAA;AACrB,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC1C,QAAA,QAAA,GAAW,KAAA;AACX,QAAA;AAAA;AAIR,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAIH,IAAA,EACiC;AACjC,IAAA,MAAM,SAA4C,EAAC;AAEnD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,MAAM,aAAa,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7D,MAAA,MAAM,eAAe,kBAAA,CAAmB,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAGjE,MAAA,IAAI,cAAc,MAAA,EAAQ;AACtB,QAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,QAC9B,CAAA,MAAO;AACH,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,YAAY,CAAA;AAAA,QAChD;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAA,CAAO,UAAU,CAAA,GAAI,YAAA;AAAA,MACzB;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,kBAAA,CAIH,MAAA,EAIA,WAAA,EAIF;AAEE,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,eAAe,CAAA;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,MAAM,IAAI,cAAA;AAAA,QACN,cAAA,CAAe,uBAAA;AAAA,QACf;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,GAAO,aAAA,CAAc,CAAC,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAEzF,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,QAAgC,EAAC;AAEvC,IAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAClB,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,MAAA,EAAW;AAEvC,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,oBAAoB,CAAA;AACxD,MAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AAEjE,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,SAAA,GAAY,UAAU,CAAC,CAAA;AAC7B,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAEhD,QAAA,IAAI,aAAA,EAAe;AAEf,UAAA,MAAM,IAAA,GAA6B;AAAA,YAC/B,SAAA;AAAA,YACA,QAAA,EAAU,cAAc,CAAC,CAAA;AAAA,YACzB,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU,gBAAA,GAAmB,CAAC,CAAA,IAAK,0BAAA;AAAA,YACnC,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAAA,YACpC,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,QAAQ;AAAA,WAC9C;AACA,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACnB,CAAA,MAAO;AAEH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,YAAA;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EAC3B;AAEJ;;;ACjRO,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA,EAKjC,wBAAA,EAA0B,GAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,8BAAA,EAAgC,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5C,iCAAA,EAAmC,MAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,8BAAA,EAAgC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,4BAAA,EAA8B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,2BAAA,EAA6B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,oCAAA,EAAsC;AAE1C;AAGO,IAAM,0BAAA,GAA6B,MAAA,CAAO,IAAA,CAAK,qBAAqB;AC1C3E,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkCO,IAAM,SAAA,GAAN,cAKK,QAAA,CAGN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiIF,WAAA,CAAY,QAAwB,OAAA,EAA6B;AAC7D,IAAA,KAAA,CAAM,MAAM,CAAA;AArHhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,UAAA,uBAAsE,GAAA,EAAI;AAsHhF,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,WAAA,EAAa,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA,MACzB,OAAA,EAAS,GAAA;AAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAmB,KAAA;AAAA,MACnB,gBAAA,EAAkB,KAAA;AAAA,MAClB,GAAI,WAAW;AAAC,KACpB;AAAA,EACJ;AAAA,EA5IA,WAAW,OAAA,GAAkB;AACzB,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiJA,QAAQ,SAAA,EAAiC;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,MACnB,OAAA,EAAU,KAAK,WAAA,CAAiC,OAAA;AAAA,MAChD,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,MAAA,EAAS,KAAK,WAAA,CAAiC,MAAA;AAAA,MAC/C,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,IAAI,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,OAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,MAAA,GAAsB;AAEtB,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,IAAA,CAAK,GAAG,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAA;AAEpF,IAAA,OAAO,eAAA,CAAgB,aAAA;AAAA,MAAc,IAAA,CAAK,GAAA;AAAA,MACtC,IAAA,CAAK,kBAAkB,IAAA,IAAQ;AAAA,KAEnC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,KAAA,GAAoB;AACpB,IAAA,OAAO,eAAA,CAAgB,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAAkC;AAClC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,MAAA,IAAA,CAAK,WAAW,eAAA,CAAgB,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,GAAA,GAAc;AACd,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,MAAA,GAAoC;AACpC,IAAA,OAAQ,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,aAAY,IAAmC,SAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAA+B;AAC/B,IAAA,OAAO,KAAK,QAAA,CAAS,OAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAA,GAA8B;AAC9B,IAAA,MAAM,MAAA,GAASC,gBAAAA,CAAiB,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AACvE,IAAA,OAAO,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,KAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,UAAU,EAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,YAAY,CAAA,IAAK,EAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,aAAA,GAAwB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,OAAA,CAAQ,gBAAgB,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,WAAA,IAAe,KAAK,QAAA,CAAS,MAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAAoB;AACpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,EAAY,WAAA,EAAY,IAAK,EAAA;AACpD,IAAA,OAAO,mCAAA,CAAoC,KAAK,SAAS,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,cAAA,IAAkB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAkC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA,IAAK,MAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAmBA,IAAA,CACI,aACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ,SAAA,EAAqD;AACzD,IAAA,OAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,cAAc,SAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAA,EAA2C;AAChD,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,SAAA,KAAc,SAAS,KAAK,EAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAoB;AAChB,IAAA,OAAO,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAA,EAA4B;AAChC,IAAA,OAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,UAAQ,IAAA,CAAK,SAAA,KAAc,SAAS,CAAA,IAAK,KAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA2B;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,CAAC,KAAA,EAAO,SAAS,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAkC;AACxC,IAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU,IAAA,EAAuB;AAC7B,IAAA,OAAO,QAAQ,IAAA,CAAK,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ,WAAA,EAA8B;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,EAAA;AAC5C,IAAA,OAAO,aAAa,QAAA,CAAS,WAAW,CAAA,IAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAIA,cAAA,GAAyB;AACrB,IAAA,MAAM,UAAA,GAAa;AAAA,MACf,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,GAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI;AAAA,KAC5B;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,EAAA,CAAG,OAA8B,QAAA,EAA8B;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,OAA8B,QAAA,EAA8B;AAC5D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAA,EAA8B;AAC/B,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAM,QAAA,KAAY;AAClD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,EAC5B;AAAA,EAGA,YAAA,GAAqB;AACjB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAIxB,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAExC,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACxC,QAAA,MAAM,QAAQ,MAAM;AAChB,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,EAAQ;AAAA,QACZ,CAAA;AACA,QAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC5B,UAAA,OAAA,EAAQ;AACR,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACd,CAAA;AAEA,QAAA,MAAM,UAAU,MAAM;AAClB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAChC,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,QACtC,CAAA;AAEA,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,MAAM,KAAK,SAAA,EAAU;AAAA,IAEzB,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,iDAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QAC1C,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACL;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC5B,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,4BAAA,EAA+B,KAAA,YAAiBD,OAAAA,GAAU,KAAA,CAAM,UAAU,kBAAkB,CAAA,CAAA;AAAA,QACzG,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAwB;AAC1B,IAAA,MAAM,cAAcE,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG,QAAQF,OAAO,CAAA;AAE1D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,WAAW,CAAA;AACjC,MAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAEjC,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAEtB,MAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,GAAA,EAAwC;AAC/C,IAAA,OAAA,CAAQ,IAAI,4BAAA,EAA8B,IAAA,CAAK,QAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,OAAO,CAAA;AAE7E,IAAA,IAAI,GAAA;AACA,MAAAE,SAAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,SAAS,GAAG,CAAA;AAErB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAErB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAEzC,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAgB,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAI,iBAAA,CAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ;AAAA,MACtB,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,WAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,KAAK;AAAA,KACpB,CAAA,CACA,OAAA,CAAQA,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AAE9B,IAAA,IAAI;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQA,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AAEnC,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA;AAE/C,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAElB,SAAS,KAAA,EAAO;AAEZ,MAAA,KAAA,CAAM,OAAA,EAAQ;AAEd,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,0BAAA,EAA6B,KAAA,YAAiBF,OAAAA,GAAU,KAAA,CAAM,UAAU,uCAAuC,CAAA,CAAA;AAAA,QAC5H,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAgB,WAAA,GAA6B;AACzC,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,sBAAA,EAAyB,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,qBAAqB,CAAA,CAAA;AAAA,QACtG,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,SAAA,GAA2B;AACvC,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAE3C,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,0BAAA,EAA6B,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,4BAA4B,CAAA,CAAA;AAAA,QACjH,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,aAAA,GAA+B;AAC3C,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAE3C,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,0EAAA,EAA6E,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAA;AAAA,OAClH,CAAA;AAAA,IAEL,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,uBAAA,EAA0B,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,oBAAoB,CAAA,CAAA;AAAA,QACtG,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,EAAA,GAAA,iBAAA,CAAkB,MAAM,CAAA,CACP,MAAA,EACkB,YACnC,IAAA,EACU;AAEb,IAAA,OAAA,CAAQ,eAAA,EAAgB;AAExB,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,EAAQ,IAAI,0BAA0B,CAAA,IACjD,sBAAsB,wBAAwB,CAAA;AAErD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,EAAA,GAAA,iBAAA,CAAkB,MAAM,CAAA,CACW,OAAA,EACT,UAC1B,IAAA,EACU;AAEb,IAAA,IAAI,QAAQ,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,SAAS,WAAA,EAAc;AAC5D,MAAA,MAAM,IAAI,cAAA;AAAA,QACN,cAAA,CAAe,uBAAA;AAAA,QACf,CAAA,oCAAA,EAAuC,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,OAAA;AAAA,OACpE;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA;AACT,MAAA,OAAA,CAAQ,IAAA,GAAO,EAAA;AAEnB,IAAA,OAAA,CAAQ,IAAA,IAAQ,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,SAAS,QAA0B,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,EAAA,GAAA,iBAAA,CAAkB,SAAS,CAAA,CACQ,YACnC,IAAA,EACU;AACb,IAAA,OAAA,CAAQ,cAAA,EAAe;AAEvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAErB,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAA,GAAA,iBAAA,CAAkB,OAAO,CAAA,CACU,YACnC,IAAA,EACU;AAEb,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,EAAA,GAAA,iBAAA,CAAkB,OAAO,CAAA,CACT,KAAA,EACmB,YACnC,IAAA,EACU;AACb,IAAA,OAAA,CAAQ,cAAA,EAAe;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,EAAA,GAAA,iBAAA,CAAkB,KAAK,CAAA,CACN,MAAA,EACkB,YACnC,IAAA,EACU;AAEb,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,eAAA,CAAgB,iBAAiB,OAAO,CAAA;AAE/D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAA,GAAA,iBAAA,CAAkB,UAAU,CAAA,CACO,YACnC,IAAA,EACU;AAEb,IAAA,IAAI,CAAC,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAmB;AAC5G,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa;AAAA,OAChB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAA+B;AAC3B,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,UAAA,EAAY,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,MACnC,aAAA,EAAe,KAAK,gBAAA;AAAiB,KACzC;AAAA,EACJ;AACJ;AAvJW,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,EAAO;AAAA,EAOb,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAppB/B,SAAA,CAkpBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAuBA,eAAA,CAAA;AAAA,EARN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAOI,4BAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,4BAAS,iBAAiB,CAAA;AAAA,CAAA,EA3qBtB,SAAA,CAyqBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AA+BA,eAAA,CAAA;AAAA,EAXN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAUI,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAzsB/B,SAAA,CAwsBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAKI,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EA1tB/B,SAAA,CAytBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAeA,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAKI,4BAASA,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EA1uB/B,SAAA,CAwuBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAcA,eAAA,CAAA;AAAA,EAJN,UAAU,MAAA,EAAO;AAAA,EAKb,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAxvB/B,SAAA,CAsvBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAkBA,eAAA,CAAA;AAAA,EAJN,UAAU,MAAA,EAAO;AAAA,EAKb,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAzwB/B,SAAA,CAwwBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;;AC/tBJ,IAAK,eAAA,qBAAAG,gBAAAA,KAAL;AACH,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,iBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AALA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;;;ACzEL,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA,EAI9B,OAAA,EAAS,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIT,OAAA,EAAS,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIT,QAAA,EAAU,sBAAA;AAAA;AAAA;AAAA;AAAA,EAIV,MAAA,EAAQ,oBAAA;AAAA;AAAA;AAAA;AAAA,EAIR,UAAA,EAAY;AAChB;ACvBA,IAAAC,KAAAC,GAAAA,EAAAC,GAAAA;AA4CO,IAAM,UAAA,GAAN,cAA8CC,QAAAA,CAGnD;AAAA,EAkDE,WAAA,CAAY,QAAgC,OAAA,EAA8B;AACtE,IAAA,KAAA,CAAM,MAAM,CAAA;AARhB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAwE,GAAA,EAAI;AAIpF;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAwB,KAAA;AAK5B,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,oBAAA,EAAsB,IAAA;AAAA;AAAA,MACtB,aAAA,EAAe,IAAA;AAAA,MACf,kBAAA,EAAoB,IAAA;AAAA;AAAA,MACpB,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,IAAA;AAAA,MACZ,kBAAA,EAAoB,IAAA;AAAA,MACpB,OAAA,EAAS,OAAA;AAAA,MACT,kBAAA,EAAoB,kBAAA;AAAA,MACpB,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAI,WAAW;AAAC,KACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EA9DA,WAAW,SAAA,GAAoB;AAC3B,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAiEA,QAAQ,SAAA,EAAyC;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,KAAAA,CAAM;AAAA,MACnB,OAAA,EAASN,UAAU,IAAA,CAAK,IAAA;AAAA,MACxB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,MAAA,EAAS,KAAK,WAAA,CAAkC,MAAA;AAAA,MAChD,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,IAAI,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,EAA2B;AAC5C,IAAA,IAAA,CAAK,QAAA,uBAAe,GAAA,EAAmE;AAAA,EAG3F;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,KAAK,QAAA,CAAS,WAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,UAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,UAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,gBAAgB,CAAA,IAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,GAAsB;AAQxB,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QAC1C,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,OAAA,GAAwB;AAE1B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAGpB,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe;AAC9B,QAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,MACtB;AAEA,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAOtB,MAAA,IAAA,CAAK,QAAA,CAAS,mBAAmB,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,GAAA,EAAwC;AAC/C,IAAA,IAAI,GAAA;AACA,MAAAA,SAAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,SAAS,GAAG,CAAA;AAErB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAE1C,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,IAAA,EAA2B;AAClC,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAAA,IAE7C,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+CAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAa,OACT,UAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,mBAAA,EAAqB,SAAS,CAAA;AACtD,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAI,MAAA;AAEJ,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAE3B,UAAA,MAAA,GAAS,IAAI,QAAA,CAAS;AAAA,YAClB,IAAA,GAAO;AACH,cAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,gBAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,EAAM;AAC/B,gBAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,cAC9E,CAAA,MAAO;AACH,gBAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,cAClB;AAAA,YACJ;AAAA,WACH,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAA,MAAA,GAAS,UAAA;AAAA,QACb;AAEA,QAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,QAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACzB,UAAA,YAAA,IAAgB,KAAA,CAAM,MAAA;AAAA,QAC1B,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,OAAO,OAAO,CAAA;AAExB,QAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAEzB,QAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,CAAC,KAAA,KAAU;AACvC,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UAChB;AAAA,QACJ,CAAC,CAAA;AAAA,MAEL,CAAC,CAAA;AAAA,IACL,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+EAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,SACT,GAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AAEpB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAAA,IAEjD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,mDAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,OAAA,GAAgB;AACnB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,CAAS,UAAU,GAAA,EAAK;AAAA,MACzB,cAAA,EAAgB,mBAAA;AAAA,MAChB,eAAA,EAAiB,wBAAA;AAAA,MACjB,YAAA,EAAc,YAAA;AAAA,MACd,mBAAA,EAAqB;AAAA,KACxB,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,SAAS,CAAA;AAE7B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,MAAM;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,QAAA,CAAS,OAAe,IAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,QAAA,CAAS,WAAW,OAAO,KAAA;AAC1D,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAA,OAAA,EAAU,KAAK;AAAA,MAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAC;;AAAA,CAAM,CAAA;AAAA,IACzF,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIO,QAAA,GAAiB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,SAAS,SAAA,EAAW;AACnD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,YAAoB,OAAA,EAAoE;AACrG,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,IAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,SAAS,UAAA,GAAa,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,KAAa,KAAA,EAAyC;AACnE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,UAAU,GAAA,EAAqD;AAClE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAIO,aAAa,GAAA,EAAmB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,GAAG,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CACH,IAAA,EACA,KAAA,EACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,SAAS,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,WAAA,CAAY,MAAc,OAAA,EAA0C;AACvE,IAAA,MAAM,YAAA,GAAe;AAAA,MACjB,GAAG,OAAA;AAAA,MACH,OAAA,kBAAS,IAAI,IAAA,CAAK,CAAC,CAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,EAAM,EAAE,OAAO,EAAA,EAAI,OAAA,EAAS,cAAc,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,GAAA,CAAI,KAAa,IAAA,EAA2B;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,GAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAwC;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAsB;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,YAAA,GAA8B;AACpC,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QACnC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,uBAAA,EAA0B,KAAA,YAAiBF,OAAAA,GAAU,KAAA,CAAM,UAAU,iDAAiD,CAAA,CAAA;AAAA,QACnI,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAgB,WAAA,GAA6B;AACzC,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAE9C,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,sEAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,EAAA,CAAG,OAA+B,QAAA,EAA+B;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,OAA+B,QAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAA,EAA+B;AAChC,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAM,QAAA,KAAY;AAClD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACL;AAAA,EAWA,OAAOM,GAAAA,GAAA,kBAAA,CAAmB,MAAM,CAAA,CACU,YACnC,IAAA,EACL;AAEE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA,EAAW;AAE3D,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,6BAA6B,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAC5F,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAKvC,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAC9C,QAAA;AAAA,MAEJ,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,uBAAuB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACtF,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA,MAEJ;AACI,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA;AACR,EACJ;AAAA,EAKA,OAAOD,GAAAA,GAAA,kBAAA,CAAmB,UAAU,CAAA,CACM,YACnC,IAAA,EACL;AAEE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,YAAa,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,GAAa,GAAA,IAAO,KAAK,UAAA,GAAa,GAAA,CAAA;AAChE,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAEnB,IAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EACtB;AAAA,EAKA,OAAOD,MAAA,kBAAA,CAAmB,OAAO,EACA,KAAA,EACS,OAAA,EACjB,YAClB,IAAA,EACL;AAEE,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,IAAU,GAAA;AACnC,IAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAa,MAAM,WAAA,IAAe;AAAA;AACtC,KACJ;AAEA,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,yBAAA,GAAkC;AAExC,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,wBAAA,EAA0B,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,iBAAA,EAAmB,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,kBAAA,EAAoB,eAAe,CAAA;AAG3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,cAAA,EAAgB,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAIU,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAiB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAE9D,IAAA,MAAM,gBAA0B,EAAC;AAEjC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,CAAC,EAAE,KAAA,EAAO,OAAA,IAAW,IAAA,KAAS;AAChD,MAAA,IAAI,eAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAC9D,QAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,YAAA,IAAgB,CAAA,OAAA,EAAU,QAAQ,IAAI,CAAA,CAAA;AACxD,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,UAAA,EAAa,QAAQ,MAAM,CAAA,CAAA;AAC/D,QAAA,IAAI,QAAQ,OAAA,EAAS,YAAA,IAAgB,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,CAAA;AAC/E,QAAA,IAAI,OAAA,CAAQ,UAAU,YAAA,IAAgB,YAAA;AACtC,QAAA,IAAI,OAAA,CAAQ,QAAQ,YAAA,IAAgB,UAAA;AACpC,QAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,YAAA,IAAgB,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,MACxE;AAEA,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,YAAA,EAAc,aAAa,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAIU,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEzB,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,YAAA,CAAa,KAAK,QAAQ,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,YAAA,CAAa,KAAK,iBAAiB,CAAA;AAC1E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,YAAA,CAAa,KAAK,kBAAkB,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,YAAA,CAAa,KAAK,WAAW,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,MAAA,EAAW;AACzC,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,KAAY,MAAA,EAAW;AAC1C,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AACzB,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,YAAA,EAAc;AACjC,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,KAAK,aAAA,CAAc,YAAA,CAAa,aAAa,CAAA;AAAA,IAC1F;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,UAAA,GAA4B;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5E,MAAA,IAAI,iBAAiBG,QAAAA,EAAU;AAC3B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAO;AAAA,MAC5B,CAAA,MAAO;AACH,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,MACf;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,EAAG,EAAS,CAAA;AAEZ,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,MAAA,GAA+C;AAClD,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK,UAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,KAAK,UAAA,EAAW;AAAA,MACtB,aAAa,IAAA,CAAK;AAAA,KACtB;AAAA,EACJ;AACJ;AArMW,eAAA,CAAA;AAAA,EAHNE,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAzgB/B,UAAA,CAwgBF,WAAAJ,GAAAA,EAAA,CAAA,CAAA;AAuCA,eAAA,CAAA;AAAA,EAHNG,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAhjB/B,UAAA,CA+iBF,WAAAL,GAAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAHNI,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,iBAAiB,CAAA,CAAA;AAAA,EAC1B,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,eAAA,CAAA,CAAA,EAAAA,SAAS,SAAS,CAAA;AAAA,CAAA,EAnkBd,UAAA,CAgkBF,WAAAN,GAAAA,EAAA,CAAA,CAAA;ACzmBJ,IAAM,eAAA,GAAN,cAA8BJ,OAAAA,CAAQ;AAE7C;;;ACFO,IAAM,oBAAA,GAAuB;AAAA,EAChC,eAAA,EAAiB,+BAAA;AAAA,EACjB,SAAA,EAAW,yBAAA;AAAA,EACX,cAAA,EAAgB;AACpB;ACFO,IAAM,aAAA,GAAN,cAA4B,OAAA,CAAQ;AAAA,EAavC,WAAA,CACI,QACA,MAAA,EACF;AACE,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA,YAAkB,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,MAAA;AACtD,IAAA,IAAA,CAAK,SAAS,MAAA,IAAU,KAAA;AAAA,EAC5B;AAAA,EAGA,QAAA,GAAmB;AAGf,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,CAAA;AAAA,EAGvC;AAAA,EAEA,QAAA,GAAmB;AACf,IAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1F;AAAA,EAEA,mBAAA,CAAoB,cAAA,GAAgC,EAAC,EAAW;AAC5D,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,EAAI,cAAA,CAAe,SAC/B,CAAA,CAAA,EAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAC5B,IACF,CAAA,GAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9E;AACJ;ACzCO,IAAM,QAAA,GAAN,cAAuBW,UAAAA,CAAW;AAAA,EAMrC,YACI,MAAA,EAIF;AACE,IAAA,KAAA,CAAM,MAAM,CAAA;AARhB,IAAA,IAAA,CAAU,UAA2B,EAAC;AAUlC,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,IAAA;AAEjC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAEJ;ACvBO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAUzC,gBAAA,CACyB,OAAA,EACC,QAAA,EACgB,OAAA,EACxC;AAEE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,sBAAA,EAAyB,SAAS,UAAU,CAAA,IAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,EACrJ;AAAA,EAOA,gBAAA,CACyB,OAAA,EACC,QAAA,EACgB,OAAA,EACnB,KAAA,EACrB;AACE,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,qBAAA,EAAwB,SAAS,UAAU,CAAA,IAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,KAAK,CAAA,EAAA,CAAI,CAAA;AAC9I,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACpB;AAAA,EA2BA,QACwB,MAAA,EACtB;AACE,IAAA,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,EACnD;AAAA,EAKA,YACI,MAAA,EAQF;AACE,IAAA,MAAM,YAAY,OAAA,CAAQ,GAAA;AAE1B,IAAA,IAAA,CAAK,IAAA;AAAA,MAAK,MAAA;AAAA,MACN,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,OAAO,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAI,CAAA,CAAA;AAAA,MACvF,gBAAgB,SAAS,CAAA,CAAA;AAAA,MACzB,CAAA,mCAAA,EAAsC,OAAO,IAAI,CAAA,CAAA;AAAA,MACjD,CAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,4BAAA,CAAA;AAAA,MACA,CAAA,+BAAA;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MACI,MAAA,EAIF;AACE,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAAA,EACjE,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,QAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,WAAW;AAAA,EAC7E,IAAI,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAC,CAAA,uCAAA,CAAyC,CAAA;AAAA,EACvE;AAEJ;AAnGI,eAAA,CAAA;AAAA,EAJCF,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,kBAAA,CAAmB,MAAA;AAAA,IACzB,KAAA,EAAO,CAAC,UAAU;AAAA,GACrB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAb/B,cAAA,CAUT,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAcA,eAAA,CAAA;AAAA,EAJCD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,kBAAA,CAAmB,OAAA;AAAA,IACzB,KAAA,EAAO,CAAC,UAAU;AAAA,GACrB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,eAAA,CAAA,CAAA,EAAAA,SAASV,OAAO,CAAA;AAAA,CAAA,EA5BZ,cAAA,CAwBT,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAmCA,eAAA,CAAA;AAAA,EAJCS,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,iBAAA,CAAkB,WAAA;AAAA,IACxB,KAAA,EAAO,CAAC,SAAS;AAAA,GACpB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,QAAQ,CAAA;AAAA,CAAA,EA5Db,cAAA,CA2DT,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;ACtEJ,IAAAN,GAAAA,EAAAC,GAAAA,EAAAC,GAAAA,EAAAM,GAAAA,EAAAC,GAAAA;AAwBO,IAAM,aAAA,GAAN,MAAM,aAAA,SAAqBC,SAAAA,CAAU;AAAA,EAKxC,WAAW,eAAA,GAAkB;AACzB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOL,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,eAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAEA,WAAW,SAAA,GAAY;AACnB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOA,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,SAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAEA,WAAW,cAAA,GAAiB;AACxB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOA,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,cAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAKA,OAAiBI,GAAAA,GAAAE,iBAAAA,CAAkB,OAAO,CAAA,CAGhB,UAGF,MAAA,EAEP;AACb,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,YAAA,CAAa,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAG7D,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA,EACjD;AAAA,EAGA,OAAiBH,GAAAA,GAAAG,iBAAAA,CAAkB,YAAY,CAAA,CACvB,QACM,MAAA,EACb;AACb,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAAA,MAChC,GAAA,EAAK;AAAA,QACD,IAAA,EAAM,KAAK,KAAA,CAAM;AAAA;AACrB,KACH,CAAA;AAAA,EACL;AAAA,EAEA,OAAiBA,iBAAAA,CAAkB,MAAM,CAAA,CAAA,GAAK,IAAA,EAA4B;AACtE,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,KAAA,GAAQ;AACJ,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM;AACpB,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,OAAO,IAAA,EAAc;AACjB,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,MAAM;AAC3B,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAQA,OAAiBT,GAAAA,GAAA,oBAAA,CAAqB,eAAe,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA,EAGzE,OAAiBD,GAAAA,GAAA,oBAAA,CAAqB,SAAS,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA,EAGnE,OAAiBD,GAAAA,GAAA,oBAAA,CAAqB,cAAc,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAOxE,MAAM,aAAA,CACF,OAAA,EACA,QAAA,EACF;AACE,IAAA,MAAM,QAAQ,IAAI,aAAA;AAAA,MACd,QAAQ,GAAA,IAAO,EAAA;AAAA,MACf,OAAA,CAAQ;AAAA,KACZ;AAEA,IAAA,MAAM,EAAA,GAAKH,iBAAiB,cAAA,EAAe;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AAE/D,IAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AACxE,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAI,0BAAA,CAA2B,OAAA,EAAS,QAAQ,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,IAAIe,OAAAA,CAAQ;AAAA,MACtB,IAAA,EAAM,EAAA;AAAA,MACN,QAAA,EAAU,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,MACnB,SAAA,EAAW,CAAC,KAAA,EAAO,OAAO;AAAA,KAC7B,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAErB,IAAA,IAAI;AACA,MAAA,MAAM,sBAAA,GAAyB,IAAIP,SAAAA,CAAU;AAAA,QACzC,MAAM,oBAAA,CAAqB,eAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,gBAAA,GAAmB,IAAIA,SAAAA,CAAU;AAAA,QACnC,MAAM,oBAAA,CAAqB,SAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,qBAAA,GAAwB,IAAIA,SAAAA,CAAU;AAAA,QACxC,MAAM,oBAAA,CAAqB,cAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,IAAI,OAAA,CAAc,OAAO,OAAA,EAAS,MAAA,KAAW;AAE/C,QAAA,MAAM,UAAU,MAAM;AAClB,UAAA,sBAAA,CAAuB,SAAA,EAAU;AACjC,UAAA,gBAAA,CAAiB,SAAA,EAAU;AAC3B,UAAA,qBAAA,CAAsB,SAAA,EAAU;AAEhC,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA;AAC1C,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA;AAC1C,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,SAAA,EAAW,OAAO,CAAA;AAG5C,UAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQT,OAAO,CAAE,CAAA;AAAA,QAClC,CAAA;AAGA,QAAA,GAAA,CAAI,GAAG,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACpD,QAAA,GAAA,CAAI,GAAG,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAEpD,QAAA,IAAI;AACA,UAAA,MAAM,IAAI,IAAA,EAAK;AACf,UAAA,MAAM,IAAI,IAAA,EAAK;AAGf,UAAA,MAAM,sBAAA,CAAuB,QAAQ,KAAK,CAAA;AAE1C,UAAA,MAAM,gBAAA,CAAiB,QAAQ,KAAK,CAAA;AAEpC,UAAA,MAAM,qBAAA,CAAsB,QAAQ,KAAK,CAAA;AAGzC,UAAA,GAAA,CAAI,YAAA,EAAa;AAIjB,UAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AAClB,YAAA,MAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,UAC/B;AAEA,UAAA,OAAA,EAAQ;AAAA,QACZ,SAAS,KAAA,EAAO;AAEZ,UAAA,GAAA,CAAI,YAAA,EAAa;AACjB,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QAChB;AAAA,MACJ,CAAC,CAAA;AAAA,IAEL,SAAS,KAAA,EAAO;AAEZ,MAAA,IAAI,YAAA;AAEJ,MAAA,QAAQ,IAAA;AAAM,QACV,KAAK,KAAA,YAAiB,iBAAA;AAClB,UAAA,YAAA,GAAe,KAAA;AACf,UAAA;AAAA,QAEJ,MAAK,KAAA,YAAiBA,OAAAA,IAAW,KAAA,CAAM,aAAA,YAAyB,iBAAA;AAC5D,UAAA,YAAA,GAAe,KAAA,CAAM,aAAA;AACrB,UAAA;AAAA;AAAA;AAAA;AAAA,QAKJ,MAAK,iBAAiBA,OAAAA,IAClB,KAAA,CAAM,yBAAyB,KAAA,IAC/B,OAAQ,KAAA,CAAM,aAAA,CAAsB,UAAA,KAAe,QAAA;AACnD,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,MAAA,EAAS,MAAM,aAAA,CAAsB,UAAA;AAAA,YACrC,WAAA,EAAc,MAAM,aAAA,CAAwB,OAAA;AAAA,YAC5C,eAAe,KAAA,CAAM;AAAA,WACxB,CAAA;AACD,UAAA;AAAA;AAAA;AAAA;AAAA,QAKJ,MAAK,KAAA,YAAiB,KAAA,IAAS,OAAQ,MAAc,UAAA,KAAe,QAAA;AAChE,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,QAAS,KAAA,CAAc,UAAA;AAAA,YACvB,aAAa,KAAA,CAAM,OAAA;AAAA,YACnB,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QAEJ;AACI,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,MAAA,EAAQ,GAAA;AAAA,YACR,WAAA,EAAa,iDAAA;AAAA,YACb,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA;AAAA;AAIR,MAAA,KAAA,CAAM,SAAS,YAAY,CAAA;AAE3B,MAAA,MAAM,GAAA,CAAI,KAAK,YAAY,CAAA;AAE3B,MAAA,MAAM,IAAA,CAAK,IAAA,CAAKe,iBAAAA,CAAkB,OAAA,EAAS,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClB;AAEJ,CAAA;AApNqB,eAAA,CAAA;AAAA,EADhBN,UAAU,MAAA,EAAO;AAAA,EAGb,gCAAa,QAAA,EAAS,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAC,SAAS,UAAU,CAAA,CAAA;AAAA,EAEnB,gCAAa,QAAA,EAAS,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAA,SAASO,QAAQ,CAAA;AAAA,CAAA,EAzCb,aAAA,CAmCQ,WAAAJ,GAAAA,EAAA,CAAA,CAAA;AAmBA,eAAA,CAAA;AAAA,EADhBJ,UAAU,MAAA,EAAO;AAAA,EAEb,eAAA,CAAA,CAAA,EAAAC,SAASO,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAP,SAAS,cAAc,CAAA;AAAA,CAAA,EAxDnB,aAAA,CAsDQ,WAAAE,GAAAA,EAAA,CAAA,CAAA;AAsCA,eAAA,CAAA;AAAA,EADhBH,UAAU,MAAA;AAAO,CAAA,EA3FT,aAAA,CA4FQ,WAAAH,GAAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADhBG,UAAU,MAAA;AAAO,CAAA,EA9FT,aAAA,CA+FQ,WAAAJ,GAAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADhBI,UAAU,MAAA;AAAO,CAAA,EAjGT,aAAA,CAkGQ,WAAAL,GAAAA,EAAA,CAAA,CAAA;AAlGd,IAAM,YAAA,GAAN;ACpBA,IAAM,aAAA,GAAN,cAA4BJ,OAAAA,CAAkF;AAAA,EAA9G,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEH,IAAA,IAAA,CAAA,MAAA,GAAiB,GAAA;AAAA,EAAA;AAAA,EAGP,gBAAgB,MAAA,EAAgD;AACtE,IAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAC5B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,IACzB;AAAA,EACJ;AAAA,EAGA,MAAA,GAAiD;AAC7C,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK;AAAA,KACjB;AAAA,EACJ;AACJ;;;ACvBO,IAAM,wBAAA,GAA2B;AAAA,EACpC,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO;AACX;AAGO,IAAM,sBAAA,GAAyB;AAAA,EAClC,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK;AACT;;;ACjBO,IAAM,sBAAA,GAAyB;AAAA,EAClC,MAAA,EAAQ,4BAAA;AAAA,EACR,cAAA,EAAgB;AACpB;;;ACEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAA6C;AAAA,EAGjF,IAAI,MAAA,GAA+B;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAAA,EAC5F;AAAA,EAGA,IAAI,WAAA,GAA0D;AAC1D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AAAA,EACxJ;AAAA,EAGA,QAAA,CAAS,QAAgB,KAAA,EAAsC;AAC3D,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AACpK,IAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,MAAA,EAAQ,cAAc,CAAA;AAE3D,IAAA,MAAM,wBAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAC/G,IAAA,qBAAA,CAAsB,IAAA,CAAK,MAAM,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAA,EAAgB,qBAAqB,CAAA;AAAA,EAC9E;AAAA,EAGA,YAAY,KAAA,EAAsB;AAC9B,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AACpK,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACnC,MAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACvB,QAAA,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,MAAA,EAAQ,cAAc,CAAA;AAE3D,IAAA,MAAM,wBAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAC/G,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,qBAAA,CAAsB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAA,EAAgB,qBAAqB,CAAA;AAAA,EAC9E;AACJ;ACnCO,SAAS,8BAA8B,KAAA,EAAsB;AAChE,EAAA,OAAO,SACH,MAAA,EACA,WAAA,EACA,UAAA,EACF;AAEE,IAAA,MAAM,IAAA,GAA2BE,SAAAA,CAAU,IAAA,CAAyB,cAAc,CAAA;AAElF,IAAA,MAAM,YAAY,KAAA,CAAM,mBAAA,CAAoB,CAAC,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAE3E,IAAA,IAAA,CAAK,SAAS,SAAA,EAAW;AAAA,MACrB,SAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACH,CAAA;AAED,IAAA,gBAAA,CAAiB;AAAA,MACb,MAAM,SAAA,CAAU,MAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACX,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAElC,IAAA,OAAO,gBAAA,CAAiB,SAAS,CAAA,CAAE,MAAA,EAAQ,aAAa,UAAU,CAAA;AAAA,EACtE,CAAA;AACJ;;;ACRO,IAAM,cAAA,GAAN,cAA6BgB,WAAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY5C,OAAO,KAAK,IAAA,EAAyG;AACjH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,IAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,IAAA,EAAyG;AAChH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,GAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,IAAA,EAAyG;AAChH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,GAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAO,IAAA,EAAyG;AACnH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,MAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM,IAAA,EAAyG;AAClH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,KAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ,IAAA,EAAyG;AACpH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,OAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAe,YACX,MAAA,EACF;AACE,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,YAAY,MAAA,CAAO,IAAA,YAAgB,SAClE,IAAI,aAAA;AAAA,MACF,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,EAAG,MAAA,CAAO,IAAA,YAAgB,MAAA,GAAS,MAAA,CAAO,KAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA;AAAA,MACxJ,MAAA,CAAO;AAAA,QACT,MAAA,CAAO,IAAA;AAEb,IAAA,OAAO,8BAA8B,KAAK,CAAA;AAAA,EAC9C;AAAA,EAQA,MAAgB,KACc,MAAA,EACb;AACb,IAAA,MAAM,IAAA,GAAOhB,SAAAA,CAAU,IAAA,CAAyB,IAAA,CAAK,WAAkB,CAAA;AAEvE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAQ;AAC3B,MAAA,MAAA,CAAO,QAAQ,QAAA,EAAU,CAAA,sBAAA,EAAyB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AACzE,MAAA;AAAA,IACJ;AAGA,IAAA,MAAA,CAAO,IAAA;AAAA,MAAK,MAAA;AAAA,MACR,CAAA,kBAAA,CAAA;AAAA,MACA,CAAA;AAAA,CAAA;AAAA,MACA,GAAG,OACE,GAAA,CAAI,CAAA,KAAA,KAAS,IAAI,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,CAAA,GAAI,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE;AAAA,KAE3G;AAAA,EACJ;AAAA,EAaA,MAAM,aAAA,CACmB,OAAA,EACC,UACH,KAAA,EACC,MAAA,EACA,QACK,KAAA,EAC3B;AACE,IAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAE5B,MAAA;AAAA,IACJ;AAUA,IAAA,MAAM,OAAA,GAAU,IAAIO,SAAAA,CAAU,EAAE,IAAA,EAAM,MAAM,QAAA,EAAS,EAAG,SAAA,EAAW,IAAA,EAAO,CAAA;AAE1E,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA;AACT,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,iBAAA;AAAA,QACP,aAAa,CAAA,mBAAA,EAAsB,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,OACnE,CAAA;AAGL,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAEzB,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,UAAA,CAAW,UAAA,CAAW,MAAA;AAEtD,MAAA,IAAI,YAAA,CAAa,sBAAA,CAAuB,iBAAiB,CAAA,EAAG;AAExD,QAAA,MAAM,IAAA,GAA2BP,SAAAA,CAAU,IAAA,CAAyB,IAAA,CAAK,WAAkB,CAAA;AAE3F,QAAA,MAAM,mBAAmB,IAAA,CAAK,WAAA;AAE9B,QAAA,MAAM,kBAAkB,gBAAA,EAAkB,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,EAAE,CAAA;AAKzE,QAAA,IAAI,eAAA,EAAiB;AACjB,UAAA,OAAA,CAAQ,QAAA,CAAS,gBAAgB,KAAK,CAAA;AAAA,QAC1C;AAAA,MACJ;AAEA,MAAA,MAAM,UAAA,GAAa,IAAIc,OAAAA,CAAQ;AAAA,QAC3B,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,EAAE,CAAA,EAAA,EAAK,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,OAC1D,EAAG;AAAA,QACC,MAAA,EAAQ;AAAA,OACX,CAAA;AAGD,MAAA,MAAM,KAAA,CAAM,QAAQ,UAAU,CAAA;AAAA,IAClC;AAAA,EAEJ;AACJ;AA/FoB,eAAA,CAAA;AAAA,EADf,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAN,SAAS,cAAc,CAAA;AAAA,CAAA,EA7HnB,cAAA,CA4HO,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAiCV,eAAA,CAAA;AAAA,EAHLD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,oBAAA,CAAqB;AAAA,GAC9B,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASM,OAAO,CAAA,CAAA;AAAA,EAChB,eAAA,CAAA,CAAA,EAAAN,SAASO,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAP,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,aAAa,CAAA;AAAA,CAAA,EAnKlB,cAAA,CA6JH,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AA7JG,cAAA,GAAN,eAAA,CAAA;AAAA,EADN,MAAA,CAAO,OAAO,kBAAkB;AAAA,CAAA,EACpB,cAAA,CAAA;;;ACrBN,IAAM,kBAAA,GAAN,cAAiCQ,WAAAA,CAAY;AAAA,EAQhD,MAAM,gBAAA,CACmB,OAAA,EAIC,QAAA,EACH,KAAA,EACrB;AAIE,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,SAAS,CAAA;AACnC,MAAA;AAEJ,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,aAAa,OAAO,OAAA,CAAQ,OAAO,SAAA,KAAc,QAAA;AACjE,MAAA;AAGJ,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,SAAS,CAAA;AAEhE,IAAA,IACI,CAAC,iBAAA,IAED,CAAC,CAACA,WAAAA,EAAa,WAAW,CAAA,CACrB,IAAA,CAAK,CAAA,CAAA,KAAK,iBAAA,YAA6B,CAAC,CAAA;AAE7C,MAAA;AAEJ,IAAA,MAAM,SAAA,GAAY,iBAAA;AAElB,IAAA,MAAM,IAAA,GAAOhB,SAAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAErC,IAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,SAAA,CAAU,YAAY,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAEtH,IAAA,IAAI,CAAC,aAAA;AACD,MAAA;AAGJ,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,WAAW,KAAK,CAAA;AAAA,EACxD;AACJ;AAxCU,eAAA,CAAA;AAAA,EALL,eAAe,IAAA,CAAK;AAAA,IACjB,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAQ,SAAS,SAAS,CAAA,CAAA;AAAA,EAIlB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASM,OAAO,CAAA;AAAA,CAAA,EAdZ,kBAAA,CAQH,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;ACEH,IAAM,kBAAA,GAAN,cAEGT,QAAAA,CAGR;AAAA,EALK,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAYH,IAAA,IAAA,CAAU,SAA4B,EAAC;AACvC,IAAA,IAAA,CAAU,WAAA,GAAsD;AAAA,MAC5D,KAAA,EAAO,CAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACd;AAAA,EAAA;AAAA,EAVA,WAAW,KAAA,GAAgB;AACvB,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,iBAAA,GAAyF;AACzF,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAqD;AACrD,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,SAAA,EAA0D;AAC9D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,KAAAA,CAAM;AAAA,MACnB,OAAA,EAASN,UAAU,IAAA,CAAK,IAAA;AAAA,MACxB,KAAA,EAAO,SAAA;AAAA,MACP,QAAQ,QAAA,IAAY,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAA,GAAK,EAAA,CAAA;AAAA,MAC5D,qBAAK,IAAI,IAAA,EAAK,EAAG,OAAA,GAAU,QAAA;AAAS,KACvC,CAAA;AAED,IAAA,IAAA,CAAK,qBAAqB,SAAA,CAAU,WAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAA,CACI,OACA,UAAA,EACF;AACE,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AAC5B,MAAA,IAAI,gBAAgBK,QAAAA,EAAU;AAC1B,QAAA,OAAO,IAAA;AAAA,MACX,CAAA,MAAO;AACH,QAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAC/C,QAAA,OAAO,MAAA;AAAA,MACX;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,IAAA,CAAK,WAAA,GAAc;AAAA,QACf,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,UAAU,UAAA,CAAW;AAAA,OACzB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,GAA6D;AACzD,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,MACtC,YAAY,IAAA,CAAK;AAAA,KACrB;AAAA,EACJ;AACJ;;;AClHO,IAAK,iCAAA,qBAAAa,kCAAAA,KAAL;AACH,EAAAA,mCAAA,MAAA,CAAA,GAAO,MAAA;AADC,EAAA,OAAAA,kCAAAA;AAAA,CAAA,EAAA,iCAAA,IAAA,EAAA;ACLL,IAAM,uBAAA,GAAN,cAAqET,UAAAA,CAAW;AAAA,EAInF,YACc,MAAA,GAAiE,EAAC,EAClE,QAAA,GAA0D,EAAC,EACvE;AACE,IAAA,KAAA,EAAM;AAHI,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGV,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAAA,EACnD;AAAA,EAGA,IAAI,KAAA,GAAQ;AACR,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAGA,GAAA,CAAI,QAAA,EAAgC,YAAA,GAAuB,EAAA,EAAI;AAC3D,IAAA,OAAO,KAAK,WAAA,CAAY,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,YAAA;AAAA,EACpE;AAAA,EAEU,gBAAA,CAAiB,KAAA,GAAgE,EAAC,EAAyC;AACjI,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,MAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AAC1C,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACjC,QAAA,GAAA,CAAI,mBAAmB,GAAG,CAAC,CAAA,GAAI,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAC3D,QAAA,OAAO,GAAA;AAAA,MACX,CAAA,EAAG,EAAE,CAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;ACpCO,IAAM,uCAAA,GAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,yBAAA,EAA2B;AAC/B;ACtBO,IAAM,kBAAA,GAAN,cAAiCO,WAAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYpD;;;ACdO,IAAM,qBAAA,GAAsE;AAAA,EAC/E,IAAA,EAAM,GAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,MAAA,EAAQ,KAAA;AAAA,EACR,SAAS,EAAC;AAAA,EACV,QAAA,EAAU;AACd;;;ACFO,IAAM,aAAA,GAAN,cAA4BP,UAAAA,CAAW;AAAA,EAI1C,WAAA,CAII,OAAA,GAAkD,EAAC,EACrD;AACE,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AAE5D,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAO,WAAW,QAAA,GAAW,MAAA,GAAS,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAErF,MAAA,MAAM,OACF,SAAA,CAAU,IAAA,KACT,SAAA,CAAU,QAAA,KAAa,WAAW,KAAA,GAAQ,IAAA,CAAA;AAG/C,MAAA,MAAM,QAAA,GAAW;AAAA,QACb,GAAG,qBAAA;AAAA,QACH,GAAI,OAAO,MAAA,KAAW,QAAA,GAAW;AAAA,UAC7B,IAAA;AAAA,UACA,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,UACnB,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,UAAU,SAAA,CAAU;AAAA,SACxB,GAAI;AAAA,OACR;AAEA,MAAA,OAAO;AAAA,QACH,OAAO,IAAI,aAAA,CAAc,QAAA,CAAS,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QACvD,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,UAAU,QAAA,CAAS;AAAA,OACvB;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAA+C;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,IAAA,EAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,QAAA,EAAS,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAA,EAAwD;AAG3D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,QAAA,EAAS,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxE;AACJ;ACpEO,IAAM,aAAA,GAAN,cAA4BO,WAAAA,CAAY;AAAA,EAI3C,MAAM,IAAA,CACkB,MAAA,EACK,MAAA,EAC3B;AACE,IAAA,MAAA,CAAO,IAAA;AAAA,MACH,OAAA;AAAA,MACA,CAAA,wBAAA,CAAA;AAAA,MACA,GAAG,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAA,CAAM,QAAA,EAAU,CAAA,IAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,KAChG;AAAA,EACJ;AAAA,EAQA,MAAM,SAAA,CACmB,GAAA,EACC,KACG,WAAA,EACL,MAAA,EACE,UACD,OAAA,EACvB;AACE,IAAA,OAAO,IAAI,OAAA,CAAc,OAAO,OAAA,EAAS,MAAA,KAAW;AAChD,MAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,GAAA;AAExB,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAElD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAO,OAAA,EAAQ;AAAA,MACnB;AAEA,MAAA,MAAA,CAAO,GAAA;AAAA,QACH,QAAA;AAAA,QACA,oBAAoB,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,EAAO,OAAO,QAAQ,CAAA,CAAA;AAAA,QACvD;AAAA,OACJ;AAEA,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,QAAA,KAAa,WACpC,QAAA,CAAS,KAAA,EAAM,GACf,QAAA,CAAS,IAAA,EAAK,CAAA;AAEpB,MAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AAAA,QACpB;AAAA,UACI,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA;AAAA,UACrB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,KAAA,CAAM;AAAA,SAChB;AAAA,QACA,CAAC,QAAA,KAAa;AACV,UAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AAClB,YAAA,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,UAAA,IAAc,GAAA,EAAK,SAAS,OAAO,CAAA;AAAA,UAC9D;AACA,UAAA,QAAA,CAAS,EAAA,CAAG,OAAO,MAAM;AAErB,YAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAA,iBAAA,EAAoB,MAAA,EAAQ,QAAQ,CAAA,UAAA,CAAY,CAAA;AAEpE,YAAA,OAAA,EAAQ;AAAA,UACZ,CAAC,CAAA;AAED,UAAA,QAAA,CAAS,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,QAC9B;AAAA,OACJ;AAEA,MAAA,QAAA,CAAS,GAAG,OAAA,EAAS,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAEzC,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAEjB,MAAA,OAAA,CAAQ,SAAA,EAAU;AAAA,IACtB,CAAC,CAAA;AAAA,EACL;AAEJ;AA5EU,eAAA,CAAA;AAAA,EADLG,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAX,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,aAAa,CAAA;AAAA,CAAA,EANlB,aAAA,CAIH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAJLD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,oBAAA,CAAqB,SAAA;AAAA,IAC3B,MAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,aAAa,CAAA,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAA,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAASY,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAZ,SAASD,SAAS,CAAA;AAAA,CAAA,EA3Bd,aAAA,CAqBH,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AChBH,IAAM,cAAA,GAAN,cAA6BE,UAAAA,CAAW;AAAA,EAM3C,YAII,WAAA,GAAwB,EAAC,EAIzB,gBAAA,GAA8C,EAAC,EACjD;AACE,IAAA,KAAA,EAAM;AAbV,IAAA,IAAA,CAAQ,QAAA,uBAA2C,GAAA,EAAI;AACvD,IAAA,IAAA,CAAQ,oBAA+C,EAAC;AAcpD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,gBAAA;AAGzB,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAG9B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,EACjC;AAAA,EAEQ,wBAAA,GAAiC;AACrC,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACrC,MAAA,MAAM,KAAA,GAAuB;AAAA,QACzB,KAAA,EAAO,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAA,GAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,QACvC,IAAA,EAAM,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAA,GAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,QACtC,SAAA,EAAW,GAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACb;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,uBAAA,GAAgC;AACpC,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAC,MAAA,KAAW;AACvC,MAAA,MAAM,KAAA,GAAuB;AAAA,QACzB,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,IAAA;AAAA,QAC9B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,OAAA,EAAS;AAAA,OACb;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,IAAA,EAAqB;AACnE,IAAA,MAAM,WAAA,GAA6B;AAAA,MAC/B,KAAA;AAAA,MACA,MAAM,IAAA,IAAQ,KAAA;AAAA,MACd,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAY,SAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,eAAA,CAAgB,WAAmB,OAAA,EAA2B;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAA8B;AACjC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAA,GAAqC;AACxC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,KAAY,KAAK,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAkB,WAAA,EAA2C;AAChE,IAAA,IAAI,SAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAC1C,MAAA,IAAI,WAAA,CAAY,WAAW,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,YAAA,EAAc;AACxE,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA;AAAA,MAC9B;AAAA,IACJ;AAEA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,SAAA,EAA4B;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,SAAA,EAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,OAAA,EAA0C;AACxD,IAAA,OAAA,CAAQ,QAAQ,CAAA,MAAA,KAAU;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAA,IAAS,MAAA,CAAO,MAAM,MAAA,CAAO,SAAA,EAAW,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAqB;AACxB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAA,CAAY,WAAmB,OAAA,EAA0C;AAC5E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,GAKL;AACE,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,KAAK,CAAA;AACvD,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,KAAK,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACH,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAA,EAAuB;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AACzC,IAAA,OAAO,KAAA,GAAQ,CAAC,CAAC,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAA,EAAkC;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AACzC,IAAA,OAAO,KAAA,GAAQ,MAAM,SAAA,GAAY,MAAA;AAAA,EACrC;AACJ;ACpOA,IAAAP,GAAAA;AAUO,IAAM,cAAA,GAAN,cAA6Bc,WAAAA,CAAY;AAAA,EAM5C,MAAM,IAAA,CACkB,MAAA,EACM,MAAA,EACJ,QAAA,EACxB;AAEE,IAAA,IAAA,CAAK,WAAA,GAAc,MAAM,QAAA,CAAS,EAAA,EAAG;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAGzC,IAAA,MAAM,OAAA,GAAU,OAAO,iBAAA,EAAkB;AACzC,IAAA,MAAA,CAAO,IAAA;AAAA,MAAK,MAAA;AAAA,MAER,CAAA,0BAAA,CAAA;AAAA,MACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS,CAAA,EAAG,MAAM,KAAK,CAAA,IAAA,EAAO,KAAA,CAAM,SAAS,CAAA,CAAE;AAAA,KAClE;AAAA,EACJ;AAAA,EAUA,OAAOd,MAAA,oBAAA,CAAqB,SAAS,EACZ,GAAA,EACC,GAAA,EACF,MAAA,EACM,MAAA,EACJ,QAAA,EACxB;AAEE,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,GAAA,CAAI,WAAW,MAAA,EAAQ;AAC/C,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,GAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAG3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AAEA,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,IAAe,MAAM,SAAS,EAAA,EAAG;AACjD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,IAAiB,MAAM,SAAS,IAAA,EAAK;AAEvD,MAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,MAAM,SAAS,CAAA;AAG7D,MAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,gBAAA,CAAkB,CAAA;AACjE,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,EAAE,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa,SAAA,EAAW,cAAc,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAEvF,MAAA,MAAM,KAAK,SAAA,CAAU,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,IAAI,IAAI,CAAA;AAEpD,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAE1D,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,2BAAA;AAAA,QACP,aAAa,CAAA,8BAAA,EAAiC,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,QAC1E,aAAA,EAAe;AAAA,OAClB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,QAAA,CACH,KAAA,EACA,SAAA,EACA,MAAA,EACA,QACA,IAAA,EACI;AACJ,IAAA,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,CAAA,oBAAA,EAAuB,KAAK,CAAA,IAAA,EAAO,SAAS,CAAA,CAAE,CAAA;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAA,CAAY,SAAA,EAAmB,MAAA,EAAwB,MAAA,EAA4B;AACtF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AAE5C,IAAA,IAAI,WAAW,MAAA,EAAQ;AACnB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,MAAA,EAAyC;AACvD,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CACH,SAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACO;AACP,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAExD,IAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,aAAA,EAAgB,OAAA,GAAU,YAAY,UAAU,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEU,YAAY,GAAA,EAAqB;AACvC,IAAA,MAAM,SAAA,GAAoC;AAAA;AAAA,MAEtC,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,eAAA;AAAA,MACP,MAAA,EAAQ,iBAAA;AAAA;AAAA,MAGR,KAAA,EAAO,wBAAA;AAAA,MACP,MAAA,EAAQ,wBAAA;AAAA,MACR,MAAA,EAAQ,wBAAA;AAAA,MACR,KAAA,EAAO,wBAAA;AAAA,MACP,MAAA,EAAQ,wBAAA;AAAA;AAAA,MAGR,OAAA,EAAS,kBAAA;AAAA,MACT,SAAA,EAAW,qBAAA;AAAA;AAAA,MAGX,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA;AAAA,MAGT,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,+BAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,iBAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,mBAAA;AAAA,MACR,KAAA,EAAO,kBAAA;AAAA;AAAA,MAGP,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,oBAAA;AAAA,MACR,OAAA,EAAS,yEAAA;AAAA,MACT,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACb;AAEA,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,CAAA,IAAK,0BAAA;AAAA,EAC3C;AAAA,EAGU,aAAa,SAAA,EAAmB,MAAA,EAAgB,IAAA,GAAe,WAAA,EAAa,cAAmB,UAAA,EAAyB;AAC9H,IAAA,MAAM,YAAY,IAAI,GAAA,CAAI,UAAU,GAAA,EAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,QAAA,GAAW,kBAAA,CAAmB,SAAA,CAAU,QAAQ,CAAA;AAGpD,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAE7C,IAAA,IAAI,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEU,SAAA,CACN,QAAA,EACA,GAAA,EACA,MAAA,EACA,YACA,YAAA,EACa;AACb,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAI;AACA,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,EAAG;AACjC,UAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACzC,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAGxC,UAAA,MAAM,OAAA,GAAkC;AAAA,YACpC,cAAA,EAAgB,WAAA;AAAA,YAChB,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAAA,YACzC,wBAAA,EAA0B;AAAA,WAC9B;AAEA,UAAA,GAAA,CAAI,SAAA,CAAU,KAAK,OAAO,CAAA;AAE1B,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,gBAAA,CAAiB,QAAQ,CAAA;AAEnD,UAAA,IAAI,MAAA,IAAU,IAAI,QAAA,EAAU;AACxB,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA;AAExB,YAAA,MAAA,CAAO,EAAA,CAAG,OAAO,MAAM;AACnB,cAAA,OAAA,EAAQ;AAAA,YACZ,CAAC,CAAA;AAED,YAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAa;AAC7B,cAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,gBACzB,MAAA,EAAQ,GAAA;AAAA,gBACR,KAAA,EAAO,mBAAA;AAAA,gBACP,WAAA,EAAa,CAAA,8BAAA,EAAiC,QAAQ,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAAA,gBACtE,aAAA,EAAe;AAAA,eAClB,CAAC,CAAA;AAAA,YACN,CAAC,CAAA;AAAA,UACL,CAAA,MAAO;AACH,YAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,cACzB,MAAA,EAAQ,GAAA;AAAA,cACR,KAAA,EAAO,uBAAA;AAAA,cACP,WAAA,EAAa,kCAAkC,QAAQ,CAAA;AAAA,aAC1D,CAAC,CAAA;AAAA,UACN;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,YACzB,MAAA,EAAQ,GAAA;AAAA,YACR,KAAA,EAAO,gBAAA;AAAA,YACP,WAAA,EAAa,mBAAmB,QAAQ,CAAA;AAAA,WAC3C,CAAC,CAAA;AAAA,QACN;AAAA,MACJ,SAAS,KAAA,EAAY;AACjB,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACnD,QAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,UACzB,MAAA,EAAQ,GAAA;AAAA,UACR,KAAA,EAAO,uBAAA;AAAA,UACP,WAAA,EAAa,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,UACjD,aAAA,EAAe;AAAA,SAClB,CAAC,CAAA;AAAA,MACN;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEU,gBAAgB,GAAA,EAAqB;AAE3C,IAAA,MAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvH,IAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,MAAM,CAAA;AAEvC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AAC1C,MAAA,OAAO,0BAAA;AAAA,IACX,WAAW,cAAA,CAAe,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACnD,MAAA,OAAO,sBAAA;AAAA,IACX,CAAA,MAAO;AACH,MAAA,OAAO,uBAAA;AAAA,IACX;AAAA,EACJ;AAEJ;AAhTU,eAAA,CAAA;AAAA,EADLiB,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAX,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,cAAc,CAAA,CAAA;AAAA,EACvB,eAAA,CAAA,CAAA,EAAAA,SAASY,UAAU,CAAA;AAAA,CAAA,EATf,cAAA,CAMH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AA0BC,eAAA,CAAA;AAAA,EAHNb,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,cAAc,CAAA,CAAA;AAAA,EACvB,eAAA,CAAA,CAAA,EAAAA,SAASY,UAAU,CAAA;AAAA,CAAA,EArCf,cAAA,CAgCF,WAAAlB,GAAAA,EAAA,CAAA,CAAA;;;AC1CJ,IAAM,yCAAA,GAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrD,aAAA,EAAe;AAEnB;AAMO,IAAM,+CAAA,GAAkD;AAAA,EAC3D,yCAAA,CAA0C;AAC9C","file":"index.mjs","sourcesContent":["import { A_ExecutionContext } from \"@adaas/a-utils/a-execution\";\n\n\n\nexport class A_HttpRequestData extends A_ExecutionContext<{\n data: Buffer;\n}> {\n\n\n constructor(data: Buffer) {\n super(\n 'a-http-request-data'\n );\n this._meta.set('data', data);\n }\n\n get length(): number {\n return this.data?.length || 0;\n }\n\n get data(): Buffer {\n return this._meta.get('data')!;\n }\n\n\n toString(encoding: BufferEncoding = 'utf-8'): string {\n return this.data.toString(encoding);\n }\n\n}\n","import { A_Context, A_Fragment, A_IdentityHelper } from \"@adaas/a-concept\";\nimport { IncomingMessage, request, ServerResponse } from \"http\";\nimport { A_Operation_Storage, A_OperationContext } from \"@adaas/a-utils/a-operation\";\n\n\nexport class A_HttpServerRequestContext<\n _DataType extends any = any,\n> extends A_OperationContext<\n 'http-server-request',\n {\n request: IncomingMessage,\n response: ServerResponse\n },\n {\n buffers: Buffer[]\n data: _DataType\n files: Record<string, any[]>\n },\n {\n buffers: Buffer[]\n data: _DataType\n files: Record<string, any[]>\n params: {\n request: IncomingMessage,\n response: ServerResponse\n }\n } & A_Operation_Storage\n> {\n\n protected _id!: string;\n\n protected _startTime!: [number, number];\n protected _endTime?: [number, number];\n protected _ready?: Promise<void>;\n\n protected get _request(): IncomingMessage {\n return super.params.request;\n }\n\n protected get _response(): ServerResponse {\n return super.params.response;\n }\n\n protected _customResponse: any;\n\n\n constructor(\n request: IncomingMessage,\n response: ServerResponse\n ) {\n super('http-server-request', { request, response });\n\n\n this._id = A_IdentityHelper.generateTimeId();\n }\n\n get id(): string {\n return `[${this._request.method}]${this._request.url}-${this._id}`;\n }\n\n get buffers(): Buffer[] {\n if (!this._meta.has('buffers')) {\n this._meta.set('buffers', []);\n }\n return this._meta.get('buffers')!;\n }\n\n get contentType(): string | undefined {\n return this._request.headers['content-type'] || undefined;\n }\n\n\n get data(): _DataType {\n return this._meta.get('data')!;\n }\n\n set data(value: _DataType) {\n this._meta.set('data', value);\n }\n\n get length(): number {\n return this.buffers.reduce((acc, buf) => acc + buf.length, 0);\n }\n\n get processingTime(): number {\n let endTime = this._endTime;\n if (!endTime) {\n endTime = process.hrtime();\n }\n\n const [seconds, nanoseconds] = process.hrtime(this._startTime);\n return seconds * 1000 + nanoseconds / 1000000;\n }\n\n\n startProcessing() {\n this._startTime = process.hrtime();\n }\n\n stopProcessing() {\n this._endTime = process.hrtime();\n }\n}","export const A_RequestFeatures = {\n\n onError: 'A_Request_onError',\n\n onInit: 'A_Request_onInit',\n\n onAfterInit: 'A_Request_onAfterInit',\n\n onParse: 'A_Request_onParse',\n\n onValidate: 'A_Request_onValidate',\n\n onClose: 'A_Request_onClose',\n\n onAborted: 'A_Request_onAborted',\n\n onTimeout: 'A_Request_onTimeout',\n\n onData: 'A_Request_onData',\n\n onEnd: 'A_Request_onEnd',\n\n onBodyParse: 'A_Request_onBodyParse',\n\n onQueryParse: 'A_Request_onQueryParse',\n\n onParamsParse: 'A_Request_onParamsParse',\n\n onCookiesParse: 'A_Request_onCookiesParse',\n} as const\n","import { A_Error } from '@adaas/a-concept';\nimport { A_HttpServerError_Init, A_HttpServerError_Serialized } from './A-HttpServer.types';\n\n\nexport class A_HttpServerError extends A_Error<A_HttpServerError_Init, A_HttpServerError_Serialized> {\n\n static readonly NotFoundErrorStatus: number = 404;\n static readonly NotFoundError = 'Resource Not Found';\n\n static readonly InternalServerErrorStatus: number = 500;\n static readonly InternalServerError = 'Internal Server Error';\n\n /**\n * HTTP status code to title mapping\n */\n private static readonly HTTP_STATUS_TITLES: Record<number, string> = {\n // 4xx Client Errors\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable',\n 417: 'Expectation Failed',\n 418: 'I\\'m a teapot',\n 421: 'Misdirected Request',\n 422: 'Unprocessable Entity',\n 423: 'Locked',\n 424: 'Failed Dependency',\n 425: 'Too Early',\n 426: 'Upgrade Required',\n 428: 'Precondition Required',\n 429: 'Too Many Requests',\n 431: 'Request Header Fields Too Large',\n 451: 'Unavailable For Legal Reasons',\n\n // 5xx Server Errors\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates',\n 507: 'Insufficient Storage',\n 508: 'Loop Detected',\n 510: 'Not Extended',\n 511: 'Network Authentication Required'\n };\n\n status!: number;\n\n /**\n * Gets the appropriate title for a given HTTP status code\n */\n private static getHttpStatusTitle(status: number): string {\n return this.HTTP_STATUS_TITLES[status] || 'Unknown Error';\n }\n\n constructor(\n /**\n * A_Error Constructor params with required title\n */\n params: A_HttpServerError_Init\n )\n constructor(\n /**\n * Simplified params with optional title - will auto-generate from status\n */\n params: { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown }\n )\n constructor(\n /**\n * HTTP Status Code of the error\n */\n status: number,\n /**\n * Error description\n */\n description: string\n )\n constructor(\n /**\n * Original JS Error\n */\n error: Error\n )\n constructor(\n param1: A_HttpServerError_Init | { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown } | Error | number,\n param2?: string\n ) {\n // Handle the different constructor overloads\n switch (true) {\n // Pattern: new A_HttpServerError(404, 'The requested resource was not found')\n case typeof param1 === 'number' && typeof param2 === 'string':\n super({\n title: A_HttpServerError.getHttpStatusTitle(param1),\n description: param2\n });\n this.status = param1;\n break;\n\n // Pattern: new A_HttpServerError(someErrorObject)\n case param1 instanceof Error:\n super(param1);\n this.status = 500; // Default status for Error objects\n break;\n\n // Pattern: new A_HttpServerError({ status: 500, description: '...', originalError: ... })\n case typeof param1 === 'object' && param1 !== null && !(param1 instanceof Error):\n const params = param1 as any;\n \n // If title is provided, use the full A_Error init\n if ('title' in params && params.title) {\n super(params as A_HttpServerError_Init);\n this.status = params.status || 500;\n } else {\n // Auto-generate title from status\n const title = params.status ? A_HttpServerError.getHttpStatusTitle(params.status) : 'Internal Server Error';\n super({\n title: title,\n description: params.description,\n code: params.code,\n scope: params.scope,\n link: params.link,\n originalError: params.originalError\n });\n this.status = params.status || 500;\n }\n break;\n\n default:\n // Fallback for any other case\n throw new Error('Invalid parameters provided to A_HttpServerError constructor');\n }\n }\n\n\n protected fromConstructor(params: A_HttpServerError_Init): void {\n super.fromConstructor(params);\n if (params.status) {\n this.status = params.status;\n }\n }\n\n\n toJSON(): A_HttpServerError_Serialized {\n return {\n ...super.toJSON(),\n status: this.status\n }\n }\n}\n\n","import { A_Error } from \"@adaas/a-concept\";\n\nexport class A_RequestError extends A_Error {\n\n static readonly RequestBodyParsingError = 'Unable to parse request body';\n static readonly FileUploadError = 'File upload error';\n static readonly RequestTimeoutError = 'Request timed out';\n static readonly InvalidRequestError = 'Invalid request';\n static readonly MissingParametersError = 'Missing required parameters';\n\n}","import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n /**\n * Extract URL parameters from a URL using a route pattern\n * @param url - The actual URL to extract parameters from\n * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n * @returns Object containing extracted parameters\n */\n static extractParams(url: string, routePattern: string): Record<string, string> {\n // Remove query string (anything after ?)\n const cleanUrl = url.split('?')[0];\n const cleanPattern = routePattern.split('?')[0];\n\n const urlSegments = cleanUrl.split('/').filter(Boolean);\n const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const urlSegment = urlSegments[i];\n\n if (patternSegment.startsWith(':')) {\n const paramName = patternSegment.slice(1); // Remove ':' from pattern\n if (urlSegment) {\n params[paramName] = decodeURIComponent(urlSegment);\n }\n } else if (patternSegment !== urlSegment) {\n // If static segments don't match → fail\n return {};\n }\n }\n\n return params;\n }\n\n\n\n /**\n * Extract query parameters from URL\n * @param url - The URL to extract query parameters from\n * @returns Object containing query parameters\n */\n static extractQuery<T = Record<string, string>>(url: string): T {\n const query: Record<string, string> = {};\n\n // Take only the part after \"?\"\n const queryString = url.split('?')[1];\n if (!queryString) return query as T;\n\n // Remove fragment (#...) if present\n const cleanQuery = queryString.split('#')[0];\n\n // Split into key=value pairs\n for (const pair of cleanQuery.split('&')) {\n if (!pair) continue;\n const [key, value = ''] = pair.split('=');\n query[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return query as T;\n }\n\n\n /**\n * Parse cookies from Cookie header\n */\n static parseCookies(\n cookieHeader?: string\n ): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n if (!cookieHeader) return {};\n\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n if (name && value) {\n cookies[name] = decodeURIComponent(value);\n }\n });\n\n return cookies;\n }\n\n /**\n * Parse request body based on Content-Type\n * \n * \n * @param context - The HTTP server request context\n * @returns Parsed body data and detected body type\n */\n static parseRequestBody<T extends any = any>(\n context: A_HttpServerRequestContext\n ): {\n data: T;\n type: A_Request_BodyType;\n } {\n let parsedBody: any;\n let bodyType: A_Request_BodyType;\n\n switch (true) {\n case !!context.contentType && context.contentType.includes('application/json'):\n parsedBody = JSON.parse(context.data);\n bodyType = 'json';\n break;\n case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n bodyType = 'form';\n break;\n case !!context.contentType && context.contentType.includes('multipart/form-data'):\n const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n // Return the entire multipart result (fields + files) as T\n parsedBody = {\n ...multipartResult.fields,\n _files: multipartResult.files\n } as T;\n bodyType = 'multipart';\n break;\n case !!context.contentType && context.contentType.includes('text/'):\n parsedBody = context.data as T;\n bodyType = 'text';\n break;\n default:\n parsedBody = Buffer.concat(context.buffers) as T;\n bodyType = 'raw';\n break;\n }\n\n\n return {\n data: parsedBody,\n type: bodyType\n };\n }\n\n /**\n * Parse URL-encoded form data (application/x-www-form-urlencoded)\n * @param body - The URL-encoded body string\n * @returns Object containing form data\n */\n static parseFormUrlEncoded(\n /**\n * The URL-encoded body string\n */\n body: string\n ): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n\n if (!body) return result;\n\n const pairs = body.split('&');\n\n for (const pair of pairs) {\n if (!pair) continue;\n\n const [key, value = ''] = pair.split('=');\n const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n // Handle multiple values for the same key (arrays)\n if (decodedKey in result) {\n const existing = result[decodedKey];\n if (Array.isArray(existing)) {\n existing.push(decodedValue);\n } else {\n result[decodedKey] = [existing, decodedValue];\n }\n } else {\n result[decodedKey] = decodedValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parse multipart form data (for file uploads and form data)\n * @param buffer - The raw buffer containing multipart data\n * @param contentType - The content type header\n * @returns Object containing fields and files\n */\n static parseMultipartData(\n /**\n * The raw buffer containing multipart data\n */\n buffer: Buffer,\n /**\n * The content type header\n */\n contentType: string\n ): {\n fields: Record<string, string>;\n files: A_Request_FileUpload[];\n } {\n // Extract boundary\n const boundaryMatch = contentType.match(/boundary=(.+)/);\n if (!boundaryMatch) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n 'Missing boundary in multipart/form-data content type'\n )\n }\n\n const boundary = '--' + boundaryMatch[1];\n const textData = buffer.toString();\n const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n const fields: Record<string, string> = {};\n const files: A_Request_FileUpload[] = [];\n\n parts.forEach(part => {\n const [headers, content] = part.split('\\r\\n\\r\\n');\n if (!headers || content === undefined) return;\n\n const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n if (nameMatch) {\n const fieldName = nameMatch[1];\n const cleanContent = content.replace(/\\r\\n$/, '');\n\n if (filenameMatch) {\n // It's a file upload\n const file: A_Request_FileUpload = {\n fieldName,\n filename: filenameMatch[1],\n encoding: 'binary',\n mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n size: Buffer.byteLength(cleanContent),\n buffer: Buffer.from(cleanContent, 'binary')\n };\n files.push(file);\n } else {\n // It's a regular field\n fields[fieldName] = cleanContent;\n }\n }\n });\n\n return { fields, files };\n }\n\n}","\n\nexport const A_RequestEnvVariables = {\n\n /**\n * Default request timeout in milliseconds\n */\n A_SERVER_REQUEST_TIMEOUT: 5000,\n\n /**\n * Maximum request body size in bytes\n */\n A_SERVER_REQUEST_MAX_BODY_SIZE: 10 * 1024 * 1024, // 10MB\n\n /**\n * Default request encoding\n */\n A_SERVER_REQUEST_DEFAULT_ENCODING: 'utf8',\n\n /**\n * Enable automatic cookie parsing\n */\n A_SERVER_REQUEST_PARSE_COOKIES: true,\n\n /**\n * Enable automatic query parameter parsing\n */\n A_SERVER_REQUEST_PARSE_QUERY: true,\n\n /**\n * Enable automatic body parsing\n */\n A_SERVER_REQUEST_PARSE_BODY: true,\n\n /**\n * Enable file upload handling\n */\n A_SERVER_REQUEST_ENABLE_FILE_UPLOADS: false,\n\n} as const;\n\n\nexport const A_RequestEnvVariablesArray = Object.keys(A_RequestEnvVariables) as Array<keyof typeof A_RequestEnvVariables>;\n\n\n\n/**\n * Array of all possible fields in A_RequestEnvVariables\n */\nexport type A_RequestEnvVariablesType = Array<keyof typeof A_RequestEnvVariables>;","import type { IncomingHttpHeaders, IncomingMessage } from \"http\";\nimport {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_IdentityHelper,\n A_Inject,\n A_Scope,\n ASEID,\n} from '@adaas/a-concept';\nimport {\n A_Request_BodyType,\n A_Request_FileUpload,\n A_Request_Init,\n A_Request_Listener,\n A_Request_Options,\n A_Request_Serialized,\n A_RequestFeatureNames,\n} from \"./A-Request.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\nimport { A_RequestHelper } from \"./A-Request.helper\";\nimport { A_RequestEnvVariables, A_RequestEnvVariablesType } from \"./A-Request.env\";\nimport { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_HttpRequestData } from \"./A-HttpRequestData.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_ScheduleObject } from \"@adaas/a-utils/a-schedule\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_Request<\n _ReqBodyType = any,\n _ParamsType extends Record<string, string> = any,\n _QueryType = any,\n>\n extends A_Entity<\n A_Request_Init,\n A_Request_Serialized<_ReqBodyType, _ParamsType, _QueryType>\n > {\n\n static get concept(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n\n /**\n * Request processing status\n */\n protected _listeners: Map<A_RequestFeatureNames, Set<A_Request_Listener>> = new Map();\n\n // =============================================\n // Cookie Management\n // =============================================\n /**\n * Parsed cookies from request headers\n */\n private _cookies!: Record<string, string>;\n\n // ============================================\n // Data Management \n // ============================================\n /**\n * Request body type\n */\n private _bodyType?: A_Request_BodyType;\n /**\n * Request body data\n */\n private _body!: _ReqBodyType;\n private _req!: IncomingMessage;\n\n private _timeout: A_ScheduleObject | undefined;\n\n // =============================================\n // File Upload Handling\n // =============================================\n /**\n * Uploaded files from multipart requests\n */\n private _files!: A_Request_FileUpload[];\n\n // =============================================\n // Request Metadata\n // =============================================\n\n /**\n * User agent string from request headers\n */\n private _userAgent?: string;\n\n /**\n * Content length in bytes\n */\n private _contentLength?: number;\n\n // =============================================\n // Configuration\n // =============================================\n /**\n * Request processing configuration options\n */\n private _options!: Required<A_Request_Options>\n\n private _routeDefinition?: A_ServerRoute;\n\n\n /**\n * A_Request - Comprehensive HTTP Request Processing Entity\n * \n * This class provides a complete wrapper around Node.js IncomingMessage with advanced features:\n * - Automatic body parsing (JSON, form-data, multipart, raw)\n * - Cookie and session management\n * - File upload handling with easy access methods\n * - Request validation\n * - Middleware support\n * - Type-safe parameter extraction\n * - Request timing and metrics\n * \n * @example\n * ```typescript\n * const request = new A_Request({\n * id: 'req-123',\n * request: incomingMessage,\n * scope: 'api'\n * }, {\n * enableFileUploads: true,\n * maxBodySize: 50 * 1024 * 1024 // 50MB for file uploads\n * });\n * \n * await request.init();\n * \n * // Access parsed body\n * const userData = request.body;\n * \n * // Get typed parameters\n * const userId = request.params.id;\n * \n * // Handle file uploads\n * if (request.hasFiles()) {\n * const avatar = request.getFile('avatar');\n * if (avatar) {\n * console.log(`Uploaded file: ${avatar.filename}`);\n * console.log(`File size: ${avatar.size} bytes`);\n * console.log(`File type: ${avatar.mimetype}`);\n * \n * // Access file buffer for processing\n * const fileBuffer = avatar.buffer;\n * // Save to disk, process, etc.\n * }\n * \n * // Get all files for a specific field\n * const documents = request.getFiles('documents');\n * for (const doc of documents) {\n * // Process each document...\n * }\n * }\n * \n * // Check specific files\n * if (request.hasFile('profilePicture')) {\n * const pic = request.getFile('profilePicture');\n * // Process profile picture...\n * }\n * ```\n */\n constructor(params: A_Request_Init, options?: A_Request_Options) {\n super(params);\n this._options = {\n maxBodySize: 10 * 1024 * 1024, // 10MB default\n timeout: 30000, // 30 seconds\n encoding: 'utf8',\n parseCookies: true,\n parseQuery: true,\n parseBody: true,\n enableFileUploads: false,\n strictValidation: false,\n ...(options || {})\n }\n }\n\n /**\n * Creates A_Request entity from initialization data\n * \n * @param newEntity \n */\n fromNew(newEntity: A_Request_Init): void {\n this.aseid = new ASEID({\n concept: (this.constructor as typeof A_Request).concept,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Request).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._req = newEntity.request;\n }\n\n\n /**\n * Core HTTP request object from Node.js\n */\n get original(): IncomingMessage {\n return this._req;\n }\n /**\n * Parsed request body data\n */\n get body(): _ReqBodyType {\n return this._body;\n }\n /**\n * URL route parameters (e.g., /users/:id)\n */\n get params(): _ParamsType {\n\n console.log('Extracting params using route definition:', this.url);\n console.log('Extracting params using route definition:', this._routeDefinition?.path);\n\n return A_RequestHelper.extractParams(this.url,\n this._routeDefinition?.path || ''\n\n ) as _ParamsType;\n }\n /**\n * Query string parameters\n */\n get query(): _QueryType {\n return A_RequestHelper.extractQuery(this.url) as _QueryType;\n }\n /**\n * Gets the parsed cookies\n */\n get cookies(): Record<string, string> {\n if (!this._cookies) {\n this._cookies = A_RequestHelper.parseCookies(this.headers['cookie']);\n }\n\n return this._cookies;\n }\n /**\n * Gets the request URL\n */\n get url(): string {\n return this.original.url!;\n }\n /**\n * Gets the HTTP method\n */\n get method(): A_HttpServerRequestMethod {\n return (String(this.original.method).toUpperCase() as A_HttpServerRequestMethod) || 'DEFAULT';\n }\n /**\n * Gets the request headers\n */\n get headers(): IncomingHttpHeaders {\n return this.original.headers;\n }\n /**\n * Gets the timestamp when the request was started\n */\n get startedAt(): Date | undefined {\n const timeId = A_IdentityHelper.parseTimeId(this.aseid.id.split('-')[0]);\n return timeId ? new Date(timeId.timestamp) : undefined;\n }\n /**\n * Gets uploaded files\n */\n get files(): A_Request_FileUpload[] {\n return this._files || [];\n }\n /**\n * Gets user agent string\n */\n get userAgent(): string | undefined {\n return this.headers?.['user-agent'] || ''\n }\n /**\n * Gets content length\n */\n get contentLength(): number {\n return this.headers?.['content-length'] ? parseInt(this.headers['content-length'], 10) : 0;\n }\n /**\n * Check if request is secure (HTTPS)\n */\n get isSecure(): boolean {\n return this.original.socket && 'encrypted' in this.original.socket;\n }\n /**\n * Check if request is from mobile device\n */\n get isMobile(): boolean {\n const userAgent = this._userAgent?.toLowerCase() || '';\n return /mobile|android|iphone|ipad|phone/i.test(userAgent);\n }\n /**\n * Get request size in bytes\n */\n get size(): number {\n return this._contentLength || 0;\n }\n /**\n * Gets content type from headers\n */\n get contentType(): string | undefined {\n return this.headers['content-type'] || undefined;\n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n /**\n * Pipes request stream to destination\n */\n pipe(\n destination: NodeJS.WritableStream,\n options?: { end?: boolean | undefined; }\n ): NodeJS.WritableStream {\n return this.original.pipe(destination, options);\n }\n /**\n * Get a file by field name\n */\n getFile(fieldName: string): A_Request_FileUpload | undefined {\n return this._files?.find(file => file.fieldName === fieldName);\n }\n\n /**\n * Get all files for a specific field name\n */\n getFiles(fieldName: string): A_Request_FileUpload[] {\n return this._files?.filter(file => file.fieldName === fieldName) || [];\n }\n\n /**\n * Check if request has any files\n */\n hasFiles(): boolean {\n return this._files && this._files.length > 0;\n }\n\n /**\n * Check if request has a file with specific field name\n */\n hasFile(fieldName: string): boolean {\n return this._files?.some(file => file.fieldName === fieldName) || false;\n }\n\n /**\n * Get total size of all uploaded files\n */\n getTotalFileSize(): number {\n return this._files?.reduce((total, file) => total + file.size, 0) || 0;\n }\n\n /**\n * Get a cookie value\n */\n getCookie(name: string): string | undefined {\n return this._cookies[name];\n }\n /**\n * Check if request has a specific cookie\n */\n hasCookie(name: string): boolean {\n return name in this._cookies;\n }\n /**\n * Check if request accepts specific content type\n */\n accepts(contentType: string): boolean {\n const acceptHeader = this.headers.accept || '';\n return acceptHeader.includes(contentType) || acceptHeader.includes('*/*');\n }\n /**\n * Get request fingerprint for caching/identification\n */\n getFingerprint(): string {\n const components = [\n this.method,\n this.url,\n this._userAgent,\n JSON.stringify(this.body)\n ];\n\n return Buffer.from(components.join('|')).toString('base64');\n }\n\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_RequestFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n /**\n * Allows to use a route definition for this request\n * \n * @param route \n */\n useRoute(route: A_ServerRoute): void {\n this._routeDefinition = route;\n }\n\n\n clearTimeout(): void {\n this._timeout?.clear();\n }\n\n /**\n * Initialize the request - parse cookies, query, body etc.\n */\n async load(): Promise<void> {\n\n // this.original.on('close', this.handleClose.bind(this));\n\n try {\n\n await this.call(A_RequestFeatures.onInit);\n\n await new Promise<void>((resolve, reject) => {\n const onData = this.handleData.bind(this);\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n\n const cleanup = () => {\n this.original.off('data', onData);\n this.original.off('end', onEnd);\n this.original.off('error', onError);\n };\n\n this.original.on('data', onData);\n this.original.on('end', onEnd);\n this.original.on('error', onError);\n });\n\n await this.handleEnd();\n\n } catch (error) {\n\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while processing the request.',\n originalError: error\n });\n\n await this.fail(targetError);\n }\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n\n\n async validate(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onValidate);\n } catch (error) {\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 400,\n description: ` Request Validation Failed: ${error instanceof A_Error ? error.message : 'Invalid request.'}`,\n originalError: error\n });\n\n await this.fail(targetError);\n }\n }\n /**\n * Destroy the request A-Entity with cleanup\n * \n * @returns \n */\n async destroy(): Promise<any> {\n const targetError = A_Context.scope(this)?.resolve(A_Error);\n\n if (!this.original.destroyed) {\n this.original.destroy(targetError);\n this.original.removeAllListeners();\n\n this._listeners.clear();\n\n return super.destroy();\n }\n }\n\n /**\n * Handles request failure - registers error, emits event, and destroys request\n * \n * [!] Destroys the request after handling the failure.\n * \n * @param err \n */\n async fail(err?: A_HttpServerError): Promise<void> {\n console.log('Request failed with error:', this.method, this.url, err?.message);\n\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n this._timeout?.clear();\n\n await this.call(A_RequestFeatures.onError);\n\n await this.destroy();\n }\n\n\n // ======================================================================================\n // Internal handlers for request events\n // ======================================================================================\n /**\n * Internal helper method to handle incoming data chunks\n * It creates a new scope for each data chunk, inherits the parent scope,\n * and calls the onData feature with the new scope.\n * \n * [!] This method ensures that each data chunk is processed in isolation, \n * preventing side effects between chunks.\n * \n * @param data \n */\n protected async handleData(data: Buffer): Promise<void> {\n const chunk = new A_HttpRequestData(data);\n\n const scope = new A_Scope({\n name: `${this.aseid.toString()}-data-chunk`,\n fragments: [chunk],\n })\n .inherit(A_Context.scope(this));\n\n try {\n\n scope.inherit(A_Context.scope(this));\n\n await this.call(A_RequestFeatures.onData, scope);\n\n scope.destroy();\n\n } catch (error) {\n\n scope.destroy();\n\n await this.fail(new A_HttpServerError({\n status: 500,\n description: `Request data chunk error: ${error instanceof A_Error ? error.message : 'Unable to process request data chunk.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request close event\n * \n * This method is called when the request is closed prematurely.\n * It triggers the onClose feature and handles any errors that occur during processing.\n * \n */\n protected async handleClose(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onClose);\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: `Request closed error: ${error instanceof A_Error ? error.message : 'Request was closed.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request end event\n * \n * This method is called when the request has finished sending data.\n * It triggers the onEnd feature and handles any errors that occur during processing.\n */\n protected async handleEnd(): Promise<void> {\n try {\n\n await this.call(A_RequestFeatures.onEnd);\n\n } catch (error) {\n await this.fail(new A_HttpServerError({\n status: 500,\n description: `Request processing error: ${error instanceof A_Error ? error.message : 'Unable to process request.'}`,\n originalError: error\n }));\n }\n }\n\n /**\n * Handles request timeout event\n * \n * This method is called when the request processing exceeds the configured timeout.\n * It triggers the onTimeout feature and fails the request with a timeout error.\n */\n protected async handleTimeout(): Promise<void> {\n try {\n await this.call(A_RequestFeatures.onTimeout);\n\n throw new A_HttpServerError({\n status: 503,\n description: `Request processing take too long and timed out. Current timeout is set to ${this._options.timeout} ms.`,\n })\n\n } catch (error) {\n\n const targetError = error instanceof A_HttpServerError\n ? error\n : new A_HttpServerError({\n status: 503,\n description: `Request timeout error: ${error instanceof A_Error ? error.message : 'Request timed out.'}`,\n originalError: error\n });\n\n await this.fail(targetError);\n }\n }\n\n\n\n\n // ======================================================================================\n // A-Request Feature Extensions\n // ======================================================================================\n\n @A_Feature.Extend()\n /**\n * Hook called during initialization\n * \n * Default Behavior: Starts request processing timer and sets up timeout handling.\n */\n async [A_RequestFeatures.onInit](\n @A_Inject(A_Config) config: A_Config<['A_SERVER_REQUEST_TIMEOUT']>,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n context.startProcessing();\n\n const ms = Number(config?.get('A_SERVER_REQUEST_TIMEOUT')\n || A_RequestEnvVariables.A_SERVER_REQUEST_TIMEOUT);\n\n this._timeout = new A_ScheduleObject(ms, this.handleTimeout.bind(this), { resolveOnClear: true });\n }\n\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on receiving data chunk\n * \n * Default Behavior: Accumulates data chunks into context buffers and checks for max body size.\n */\n async [A_RequestFeatures.onData](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_HttpRequestData) chunk: A_HttpRequestData,\n ...args: any[]\n ): Promise<void> {\n\n if (context.length + chunk.length > this._options.maxBodySize!) {\n throw new A_RequestError(\n A_RequestError.RequestBodyParsingError,\n `Request body too large. Max size is ${this._options.maxBodySize} bytes.`\n );\n }\n\n context.buffers.push(chunk.data);\n if (!context.data)\n context.data = '';\n\n context.data += chunk.toString(this._options.encoding as BufferEncoding);\n }\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on request timeout\n * \n * Default Behavior: Stops request processing and emits timeout event.\n * \n * @param context \n * @param args \n */\n async [A_RequestFeatures.onTimeout](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n context.stopProcessing();\n\n this._timeout?.clear();\n\n this.emit(A_RequestFeatures.onTimeout);\n }\n\n @A_Feature.Extend({\n before: /.*/\n })\n /**\n * Hook called on request close\n */\n async [A_RequestFeatures.onClose](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n this.emit(A_RequestFeatures.onClose);\n }\n\n\n @A_Feature.Extend({\n after: /.*/\n })\n /**\n * Hook called on request error\n */\n async [A_RequestFeatures.onError](\n @A_Inject(A_Error) error: A_Error,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n context.stopProcessing();\n\n this.emit(A_RequestFeatures.onError);\n }\n\n @A_Feature.Extend()\n /**\n * Hook called to parse request data\n */\n async [A_RequestFeatures.onEnd](\n @A_Inject(A_Config) config: A_Config<A_RequestEnvVariablesType>,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n\n const { data, type } = A_RequestHelper.parseRequestBody(context);\n\n this._body = data;\n this._bodyType = type;\n }\n\n\n\n @A_Feature.Extend()\n /**\n * Hook called to validate request data\n */\n async [A_RequestFeatures.onValidate](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ): Promise<void> {\n // Validate file uploads if multipart data detected\n if (!!this.contentType && this.contentType.includes('multipart/form-data') && !this._options.enableFileUploads) {\n throw new A_HttpServerError({\n status: 400,\n description: 'File uploads detected but not enabled. Set enableFileUploads: true in options.',\n });\n }\n }\n\n\n /**\n * Serialize request for logging/debugging\n */\n toJSON(): A_Request_Serialized {\n return {\n ...super.toJSON(),\n method: this.method,\n url: this.url,\n headers: this.headers,\n params: this.params,\n query: this.query,\n cookies: this._cookies,\n userAgent: this.userAgent,\n bodyType: this._bodyType,\n body: this._body,\n filesCount: this._files?.length || 0,\n totalFileSize: this.getTotalFileSize(),\n };\n }\n}","import type { IncomingMessage } from \"http\";\nimport { A_Request } from \"./A-Request.entity\";\nimport { A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\n\n\n// =============================================\n// Core Request Types\n// =============================================\n/**\n * Constructor parameters for A_Request entity\n */\nexport type A_Request_Init = {\n /**\n * Unique identifier for the request (should correspond to Response id)\n */\n id: string;\n\n /**\n * ASEID Shard for the request. \n * it's some sort of request fingerprint\n */\n shard: string\n /**\n * Node.js IncomingMessage object\n */\n request: IncomingMessage;\n /**\n * Request scope for context resolution\n */\n scope: string;\n};\n\n/**\n * Serialized representation of A_Request entity\n */\nexport type A_Request_Serialized<\n _ReqBodyType = any,\n _ParamsType extends Record<string, string> = any,\n _QueryType = any,\n> = A_TYPES__Entity_Serialized & {\n method: A_HttpServerRequestMethod;\n url: string;\n headers: Record<string, string | string[] | undefined>;\n params?: _ParamsType;\n query?: _QueryType;\n cookies: Record<string, string>;\n body?: _ReqBodyType;\n userAgent?: string;\n isValid: boolean;\n bodyType?: A_Request_BodyType;\n filesCount?: number;\n fileFieldNames?: string[];\n totalFileSize?: number;\n}\n\n/**\n * Supported HTTP request methods\n */\nexport type A_Request_Methods =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'PATCH'\n | 'OPTIONS'\n | 'HEAD'\n | 'CONNECT'\n | 'TRACE'\n | 'DEFAULT'; // Default is used for routes that do not have a method specified\n\n/**\n * Request lifecycle events\n */\nexport enum A_Request_Event {\n Error = 'error',\n Finish = 'finish',\n Data = 'data',\n End = 'end',\n Close = 'close',\n}\n\n\nexport type A_RequestFeatureNames = typeof A_RequestFeatures[keyof typeof A_RequestFeatures];\n\n/**\n * Request event callback function type\n */\nexport type A_Request_EventCallback = (request: A_Request) => void;\n\n\n// =============================================\n// Body Parsing Types\n// =============================================\n\n/**\n * Supported body content types for parsing\n */\nexport type A_Request_BodyType = 'json' | 'form' | 'multipart' | 'raw' | 'text';\n\n/**\n * Result of body parsing operation\n */\nexport type A_Request_ParsedBody = {\n /**\n * Type of parsed content\n */\n type: A_Request_BodyType;\n /**\n * Parsed data\n */\n data: any;\n /**\n * Size of the body in bytes\n */\n size: number;\n /**\n * Character encoding used\n */\n encoding?: string;\n /**\n * Multipart boundary (for multipart content)\n */\n boundary?: string;\n};\n\n\n\n// =============================================\n// Session Management Types\n// =============================================\n\n/**\n * Session data structure for user session management\n */\nexport type A_Request_SessionData = {\n /**\n * Unique session identifier\n */\n id?: string;\n /**\n * Associated user ID\n */\n userId?: string;\n /**\n * Session creation timestamp\n */\n createdAt?: Date;\n /**\n * Last access timestamp\n */\n lastAccess?: Date;\n /**\n * Session data storage\n */\n data?: Record<string, any>;\n /**\n * Whether session is expired\n */\n isExpired?: boolean;\n /**\n * Maximum session age in milliseconds\n */\n maxAge?: number;\n};\n\n\n// =============================================\n// File Upload Types\n// =============================================\n\n/**\n * File upload information for multipart requests\n */\nexport type A_Request_FileUpload = {\n /**\n * Form field name\n */\n fieldName: string;\n /**\n * Original filename\n */\n filename: string;\n /**\n * File encoding\n */\n encoding: string;\n /**\n * MIME type\n */\n mimetype: string;\n /**\n * File size in bytes\n */\n size: number;\n /**\n * File buffer data\n */\n buffer: Buffer;\n /**\n * Path if saved to disk\n */\n path?: string;\n /**\n * File hash for integrity verification\n */\n hash?: string;\n};\n\n\n// =============================================\n// Validation Types\n// =============================================\n\n/**\n * Request validation result with detailed feedback\n */\nexport type A_Request_ValidationResult = {\n /**\n * Whether validation passed\n */\n isValid: boolean;\n /**\n * Validation error messages\n */\n errors: string[];\n /**\n * Warning messages\n */\n warnings: string[];\n /**\n * Sanitized data after validation\n */\n sanitized?: any;\n};\n\n\n// =============================================\n// Configuration Types\n// =============================================\n\n/**\n * Request processing configuration options\n */\nexport type A_Request_Options = {\n /**\n * Maximum request body size in bytes (default: 10MB)\n */\n maxBodySize?: number;\n /**\n * Request timeout in milliseconds (default: 30s)\n */\n timeout?: number;\n /**\n * Default character encoding (default: 'utf8')\n */\n encoding?: string;\n /**\n * Automatically parse cookies (default: true)\n */\n parseCookies?: boolean;\n /**\n * Automatically parse query parameters (default: true)\n */\n parseQuery?: boolean;\n /**\n * Automatically parse request body (default: true)\n */\n parseBody?: boolean;\n /**\n * Enable file upload handling (default: false)\n */\n enableFileUploads?: boolean;\n /**\n * Enable strict validation mode (default: false)\n */\n strictValidation?: boolean;\n};\n\n/**\n * Request Event Listener Function\n */\nexport type A_Request_Listener = (req?: A_Request) => void;","\n\nexport const A_ResponseFeatures = {\n /**\n * Event fired when an error occurs while sending the response\n */\n onError: '_A_Response_onError',\n /**\n * Event fired when the response is closed\n */\n onClose: '_A_Response_onClose',\n /**\n * Event fired when the response is finished\n */\n onFinish: '_A_Response_onFinish',\n /**\n * Event fired when the response is sent\n */\n onSend: '_A_Response_onSend',\n /**\n * Event fired when the response is redirected\n */\n onRedirect: '_A_Response_onRedirect',\n} as const;","import {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_Inject,\n ASEID,\n} from \"@adaas/a-concept\";\nimport type {\n IncomingHttpHeaders,\n ServerResponse\n} from \"http\";\nimport {\n A_Response_Constructor,\n A_Response_CacheOptions,\n A_Response_Options,\n A_Response_Serialized,\n A_Response_CookieOptions,\n A_ResponseFeatureNames,\n} from \"./A-Response.types\";\nimport { pipeline, Readable } from 'stream';\nimport { A_ResponseFeatures } from \"./A-Response.constants\";\nimport { A_Response_Listener } from \"./A-Response.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\n\n/**\n * A_Response - Comprehensive HTTP Response Processing Entity\n * \n * This class provides a complete wrapper around Node.js ServerResponse with advanced features:\n * - Response data accumulation and value management\n * - Error collection and standardized error responses\n * - Response streaming with progress tracking\n * - Template rendering and view engine support\n * - Cookie management and secure cookie handling\n * - Response compression (gzip, deflate, brotli)\n * - File downloads and static file serving\n * - Response caching and ETags\n * - Performance metrics and timing\n * - Response validation and content negotiation\n * \n * @example\n */\nexport class A_Response<_ResponseType = any> extends A_Entity<\n A_Response_Constructor,\n A_Response_Serialized<_ResponseType>\n> {\n\n // =============================================\n // Static Properties\n // =============================================\n static get namespace(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n /**\n * Original ServerResponse object\n */\n private _res!: ServerResponse;\n /**\n * Internal object to store all response data\n */\n private _data!: Map<string, _ResponseType>;\n /**\n * uses in case the response isn't an object \n */\n private _dataOverride?: _ResponseType\n /**\n * Redirect URL for handling redirects\n */\n private _redirectURL?: string;\n /**\n * Cookies map for managing response cookies\n */\n private _cookies!: Map<string, { value: string, options?: A_Response_CookieOptions }>;\n /**\n * Indicates if the response has finished\n */\n private _cacheOptions?: A_Response_CacheOptions;\n /**\n * Indicates if the response has finished\n */\n private _options!: Required<A_Response_Options>\n /**\n * Event listeners map for A_Response events\n */\n private _listeners: Map<A_ResponseFeatureNames, Set<A_Response_Listener>> = new Map();\n /**\n * Whether this response is operating as a persistent SSE stream\n */\n private _isStreaming: boolean = false;\n\n\n constructor(params: A_Response_Constructor, options?: A_Response_Options) {\n super(params);\n this._options = {\n autoCompress: true,\n compressionThreshold: 1024, // 1KB\n enableCaching: true,\n defaultCacheMaxAge: 3600, // 1 hour\n enableMetrics: true,\n enableEtag: true,\n enableLastModified: true,\n charset: 'utf-8',\n defaultContentType: 'application/json',\n maxRedirects: 5,\n enableCookies: true,\n enableSessions: true,\n ...(options || {})\n };\n }\n\n /**\n * Initialize from new entity parameters\n */\n fromNew(newEntity: A_Response_Constructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Response).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._res = newEntity.response;\n this._data = new Map<string, _ResponseType>();\n this._cookies = new Map<string, { value: string, options?: A_Response_CookieOptions }>();\n\n\n }\n /**\n * Gets the response data map\n */\n get data(): Map<string, _ResponseType> {\n return this._data;\n }\n /**\n * Gets the original ServerResponse object\n */\n get original(): ServerResponse {\n return this._res;\n }\n /**\n * Gets whether headers have been sent\n */\n get headersSent(): boolean {\n return this.original.headersSent;\n }\n /**\n * Gets the current status code\n */\n get statusCode(): number {\n return this.original.statusCode;\n }\n /**\n * Gets response size in bytes\n */\n get size(): number {\n return this.original.getHeader('Content-Length') as number || 0;\n }\n /**\n * Whether this response is in SSE streaming mode.\n * When true the server container will NOT auto-send and destroy() will\n * leave the underlying socket open.\n */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Primary Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Initialize the response\n */\n async load(): Promise<void> {\n\n // Track response completion\n // this.original.on('finish', this.handleFinish.bind(this));\n\n // this.original.on('close', this.handleClose.bind(this));\n\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n /**\n * Destroy the response\n */\n async destroy(): Promise<any> {\n\n if (!this._isStreaming) {\n // Only call end() if not already ended — avoids double-end which can\n // interrupt an in-flight response body on keep-alive connections.\n if (!this.original.writableEnded) {\n this.original.end();\n }\n\n this._listeners.clear();\n\n // Remove only the 'error' listener we added in load().\n // Do NOT call removeAllListeners() — that strips Node.js HTTP's own\n // internal keep-alive 'finish' handler, causing the socket to never\n // re-enter the server's connection pool and hanging all subsequent\n // requests on the same keep-alive connection.\n this.original.removeAllListeners('error');\n }\n\n return super.destroy();\n }\n /**\n * Handle response failure with error details\n */\n async fail(err?: A_HttpServerError): Promise<void> {\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n await this.call(A_ResponseFeatures.onError);\n\n await this.destroy();\n }\n /**\n * Send a plain text or JSON response\n */\n async send(data?: any): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._dataOverride = data;\n\n await this.call(A_ResponseFeatures.onSend);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while sending the response.',\n originalError: error\n }));\n }\n }\n /**\n * Stream response data\n */\n public async stream(\n dataStream: Readable | any[]\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n return new Promise((resolve, reject) => {\n this.original.setHeader('Transfer-Encoding', 'chunked');\n this.setDefaultResponseHeaders();\n this.setCookieHeaders();\n this.original.writeHead(this.statusCode);\n\n let stream: Readable;\n\n if (Array.isArray(dataStream)) {\n // Convert array to readable stream\n stream = new Readable({\n read() {\n if (dataStream.length > 0) {\n const chunk = dataStream.shift();\n this.push(typeof chunk === 'string' ? chunk : JSON.stringify(chunk) + '\\n');\n } else {\n this.push(null);\n }\n }\n });\n } else {\n stream = dataStream;\n }\n\n let bytesWritten = 0;\n\n stream.on('data', (chunk) => {\n bytesWritten += chunk.length;\n });\n\n stream.on('end', resolve);\n\n stream.on('error', reject);\n\n pipeline(stream, this.original, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n });\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while streaming the response. Unable to process the stream.',\n originalError: error\n }));\n }\n }\n /**\n * Redirect response\n * \n * [!] Note: This method ends the response immediately.\n */\n public async redirect(\n url: string\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._redirectURL = url;\n\n await this.call(A_ResponseFeatures.onRedirect);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while redirecting the response.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response SSE (Server-Sent Events) Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Upgrade this response to a persistent SSE stream.\n * Sends the required headers and writes the initial `:ok` comment to flush\n * the connection. After calling this the response will NOT be auto-closed\n * by the server container or by destroy().\n */\n public sseOpen(): void {\n if (this.headersSent || this._isStreaming) return;\n this._isStreaming = true;\n this.original.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n this.original.write(':ok\\n\\n');\n // Reset streaming flag when the client disconnects\n this.original.once('close', () => {\n this._isStreaming = false;\n });\n }\n /**\n * Write a named SSE event onto the open stream.\n * Format: `event: <name>\\ndata: <JSON>\\n\\n`\n *\n * Compatible with browser EventSource `addEventListener(name, handler)`.\n *\n * @returns false when the channel is no longer writable\n */\n public sseWrite(event: string, data?: any): boolean {\n if (!this._isStreaming || this.original.destroyed) return false;\n try {\n return this.original.write(`event: ${event}\\ndata: ${JSON.stringify(data ?? {})}\\n\\n`);\n } catch {\n return false;\n }\n }\n /**\n * Close the SSE stream gracefully.\n */\n public sseClose(): void {\n if (!this._isStreaming || this.original.destroyed) return;\n this._isStreaming = false;\n this.original.end();\n }\n /**\n * Write head with status and headers\n */\n public writeHead(statusCode: number, headers?: Record<string, string> | IncomingHttpHeaders | any): this {\n this.original.writeHead(statusCode, headers);\n return this;\n }\n /**\n * Set HTTP status code\n */\n public status(code: number): this {\n this.original.statusCode = code;\n return this;\n }\n /**\n * Set response header\n */\n public setHeader(key: string, value: string | number | string[]): this {\n this.original.setHeader(key, value);\n return this;\n }\n /**\n * Get response header\n */\n public getHeader(key: string): string | number | string[] | undefined {\n return this.original.getHeader(key);\n }\n /**\n * Remove response header\n */\n public removeHeader(key: string): this {\n this.original.removeHeader(key);\n return this;\n }\n /**\n * Set cookie\n */\n public setCookie(\n name: string,\n value: string,\n options?: A_Response_CookieOptions\n ): this {\n this._cookies.set(name, { value, options });\n return this;\n }\n /**\n * Clear cookie\n */\n public clearCookie(name: string, options?: A_Response_CookieOptions): this {\n const clearOptions = {\n ...options,\n expires: new Date(0),\n maxAge: 0\n };\n this._cookies.set(name, { value: '', options: clearOptions });\n return this;\n }\n // --------------------------------------------------------------------------\n // Response Data manipulation methods\n // --------------------------------------------------------------------------\n /**\n * Add data to response\n */\n public add(key: string, data: _ResponseType): this {\n this._data.set(key, data);\n return this;\n }\n /**\n * Remove data from response\n */\n public remove(key: string): this {\n this._data.delete(key);\n return this;\n }\n /**\n * Get data from response\n */\n public get(key: string): _ResponseType | undefined {\n return this._data.get(key);\n }\n /**\n * Check if response has data\n */\n public has(key: string): boolean {\n return this._data.has(key);\n }\n /**\n * Clear all response data\n */\n public clear(): this {\n this._data.clear();\n return this;\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // Internal handlers for request events\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Handle response finish event\n * \n * @returns \n */\n protected handleFinish(): Promise<void> {\n try {\n return this.call(A_ResponseFeatures.onFinish) as Promise<void>;\n } catch (error) {\n return this.fail(new A_HttpServerError({\n status: 500,\n description: `Response finish error: ${error instanceof A_Error ? error.message : 'An error occurred while finishing the response.'}`,\n originalError: error\n }));\n }\n }\n /**\n * Handle response close event\n */\n protected async handleClose(): Promise<void> {\n try {\n\n await this.call(A_ResponseFeatures.onClose);\n\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: 'Client closed the connection before the response could be completed.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_ResponseFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Feature Default Extensions\n // --------------------------------------------------------------------------\n // ======================================================================================\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onSend](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n const responseData = this._dataOverride || this.toResponse();\n\n switch (true) {\n case !!responseData && typeof responseData === 'object':\n this.original.setHeader('Content-Type', `application/json; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n // this.setCookieHeaders();\n // this.setCacheHeaders();\n\n this.original.end(JSON.stringify(responseData));\n return;\n\n case !!responseData && typeof responseData === 'string':\n this.original.setHeader('Content-Type', `text/plain; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n\n default:\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n }\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onRedirect](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n if (!this._redirectURL) return;\n\n this.original.setHeader('Location', this._redirectURL!);\n if (!this.statusCode || (this.statusCode < 300 || this.statusCode > 399))\n this.status(301);\n\n this.original.end();\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onError](\n @A_Inject(A_HttpServerError) error: A_HttpServerError,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Request) request: A_Request,\n ...args: any[]\n ) {\n\n if (this.headersSent) {\n return;\n }\n\n const statusCode = error.status || 500;\n this.status(statusCode);\n\n const errorResponse = {\n error: {\n message: error.message,\n status: statusCode,\n description: error.description || '',\n }\n };\n\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(JSON.stringify(errorResponse));\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Helper Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Set standard response headers\n */\n protected setDefaultResponseHeaders(): void {\n // Security headers\n this.original.setHeader('X-Content-Type-Options', 'nosniff');\n this.original.setHeader('X-Frame-Options', 'DENY');\n this.original.setHeader('X-XSS-Protection', '1; mode=block');\n\n // Request ID for tracking\n this.original.setHeader('X-Request-ID', this.aseid.id);\n }\n /**\n * Set cookie headers\n */\n protected setCookieHeaders(): void {\n if (!this._options.enableCookies || this._cookies.size === 0) return;\n\n const cookieStrings: string[] = [];\n\n this._cookies.forEach(({ value, options }, name) => {\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options) {\n if (options.domain) cookieString += `; Domain=${options.domain}`;\n if (options.path) cookieString += `; Path=${options.path}`;\n if (options.maxAge) cookieString += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookieString += `; Expires=${options.expires.toUTCString()}`;\n if (options.httpOnly) cookieString += '; HttpOnly';\n if (options.secure) cookieString += '; Secure';\n if (options.sameSite) cookieString += `; SameSite=${options.sameSite}`;\n }\n\n cookieStrings.push(cookieString);\n });\n\n this.original.setHeader('Set-Cookie', cookieStrings);\n }\n /**\n * Set cache headers\n */\n protected setCacheHeaders(): void {\n if (!this._cacheOptions) return;\n\n const cacheControl: string[] = [];\n\n if (this._cacheOptions.public) cacheControl.push('public');\n if (this._cacheOptions.private) cacheControl.push('private');\n if (this._cacheOptions.noCache) cacheControl.push('no-cache');\n if (this._cacheOptions.noStore) cacheControl.push('no-store');\n if (this._cacheOptions.mustRevalidate) cacheControl.push('must-revalidate');\n if (this._cacheOptions.proxyRevalidate) cacheControl.push('proxy-revalidate');\n if (this._cacheOptions.immutable) cacheControl.push('immutable');\n\n if (this._cacheOptions.maxAge !== undefined) {\n cacheControl.push(`max-age=${this._cacheOptions.maxAge}`);\n }\n\n if (this._cacheOptions.sMaxAge !== undefined) {\n cacheControl.push(`s-maxage=${this._cacheOptions.sMaxAge}`);\n }\n\n if (cacheControl.length > 0) {\n this.original.setHeader('Cache-Control', cacheControl.join(', '));\n }\n\n if (this._cacheOptions.etag) {\n this.original.setHeader('ETag', this._cacheOptions.etag);\n }\n\n if (this._cacheOptions.lastModified) {\n this.original.setHeader('Last-Modified', this._cacheOptions.lastModified.toUTCString());\n }\n }\n\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Serialization Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Convert accumulated data to response object\n */\n public toResponse(): _ResponseType {\n const response = Array.from(this._data.entries()).reduce((acc, [key, value]) => {\n if (value instanceof A_Entity) {\n acc[key] = value.toJSON();\n } else {\n acc[key] = value;\n }\n return acc;\n }, {} as any);\n\n return response;\n }\n /**\n * Enhanced JSON serialization for logging/debugging\n */\n public toJSON(): A_Response_Serialized<_ResponseType> {\n return {\n ...super.toJSON(),\n status: this.statusCode,\n headersSent: this.headersSent,\n size: this.size,\n data: this.toResponse(),\n redirectURL: this._redirectURL,\n };\n }\n}","import { A_Error } from \"@adaas/a-concept\"\n\n\nexport class A_ResponseError extends A_Error {\n\n}","\n\n\nexport const A_HttpServerFeatures = {\n onBeforeRequest: '_A_HTTPServer_onBeforeRequest',\n onRequest: '_A_HTTPServer_onRequest',\n onAfterRequest: '_A_HTTPServer_onAfterRequest',\n} as const\n\n","import { A_Route } from '@adaas/a-utils/a-route';\nimport { A_ServerRouteHttpMethodNames } from './A-ServerRoute.types';\n\n\n\nexport class A_ServerRoute extends A_Route {\n\n public url!: string;\n public method!: A_ServerRouteHttpMethodNames;\n\n\n constructor(\n url: string | RegExp,\n method: A_ServerRouteHttpMethodNames\n )\n constructor(\n url: string | RegExp,\n )\n constructor(\n param1: string | RegExp,\n param2?: A_ServerRouteHttpMethodNames\n ) {\n super(param1);\n this.url = param1 instanceof RegExp ? param1.source : param1;\n this.method = param2 || 'GET';\n }\n\n\n toString(): string {\n // path can be like /api/v1/users/:id\n // and because of that :id we need to replace it with regex that matches chars and numbers only \n return `${this.method}::${this.path}`;\n\n // .replace(/\\/:([^\\/]+)/g, '\\\\/([^\\/]+)')\n }\n\n toRegExp(): RegExp {\n return new RegExp(`^${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n }\n\n toAFeatureExtension(extensionScope: Array<string> = []): RegExp {\n return new RegExp(`^${extensionScope.length\n ? `(${extensionScope.join('|')})`\n : '.*'\n }\\\\.${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n }\n}\n\n","import { A_Fragment, A_TYPES__Required } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ServerConstructor } from \"./A-Server.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\nexport class A_Server extends A_Fragment {\n\n public port: number;\n public version: string;\n protected _routes: A_ServerRoute[] = [];\n\n constructor(\n params: A_TYPES__Required<Partial<A_SERVER_TYPES__ServerConstructor>, [\n 'port',\n 'name'\n ]>\n ) {\n super(params);\n\n this.port = params.port;\n this._name = params.name;\n this.version = params.version || 'v1';\n\n this._routes = params.routes || this._routes;\n }\n\n\n /**\n * A list of routes that the server will listen to\n */\n get routes(): A_ServerRoute[] {\n return this._routes\n }\n\n}\n\n\n","import { A_Error, A_Feature, A_Inject, } from \"@adaas/a-concept\";\nimport { A_Server } from \"@adaas/a-server/server/A-Server.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ResponseFeatures } from \"@adaas/a-server/response/A-Response.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\n\n\nexport class A_ServerLogger extends A_Logger {\n\n protected declare config: A_Config<any>\n\n\n\n @A_Feature.Extend({\n name: A_ResponseFeatures.onSend,\n scope: [A_Response]\n })\n logRequestFinish(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ) {\n\n this.info('green', `Request ${request.method} ${request.url} finished with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n }\n\n\n @A_Feature.Extend({\n name: A_ResponseFeatures.onError,\n scope: [A_Response]\n })\n logResponseError(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Error) error: A_Error,\n ) {\n this.info('red', `Request ${request.method} ${request.url} errored with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n this.error(error);\n }\n\n\n\n\n // @A_Feature.Extend({\n // name: A_ServiceFeatures.onAfterStart,\n // scope: [A_Service]\n // })\n // logStart(\n // @A_Inject(A_Service) container: A_Service,\n // ): void {\n // // this.serverReady({\n // // port: container.port,\n // // app: {\n // // name: container.name,\n // // }\n // // })\n // }\n\n\n\n\n @A_Feature.Extend({\n name: A_ServiceFeatures.onAfterStop,\n scope: [A_Service]\n })\n logStop(\n @A_Inject(A_Server) server: A_Server,\n ) {\n this.log('red', `Server ${server.name} stopped`);\n }\n\n\n\n\n serverReady(\n params: {\n port: number,\n\n app: {\n name: string,\n version?: string\n }\n }\n ) {\n const processId = process.pid;\n\n this.info('cyan',\n ` ${params.app.name} v${params.app.version || '0.0.1'} is running on port ${params.port}`,\n ` Process ID: ${processId}`,\n ` Open In Browser: http://localhost:${params.port}`,\n ``,\n `-------------------------------`,\n ` ==============================`,\n ` LISTENING... `,\n ` ==============================`\n );\n }\n\n\n /**\n * Displays a proxy routes \n * \n * @param params \n */\n proxy(\n params: {\n original: string,\n destination: string,\n }\n ) {\n console.log(`\\x1b[35m[${this.scope.name}] |${this.getTime()}| Proxy:\n${' '.repeat(this.scopeLength + 3)}| ${params.original} -> ${params.destination}\n${' '.repeat(this.scopeLength + 3)}|-------------------------------\\x1b[0m`);\n }\n\n}","import type { IncomingMessage, Server, ServerResponse } from \"http\";\nimport { A_HttpServerFeatures } from \"./A-HttpServer.constants\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_TYPES__ServerENVVariables } from \"@adaas/a-server/constants/env.constants\";\nimport { A_Dependency, A_Error, A_Feature, A_IdentityHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_HttpServerRequestMethod } from \"./A-HttpServer.types\";\nimport { A_HttpServerError } from \"./A-HttpServer.error\";\nimport { A_RequestFeatures } from \"@adaas/a-server/request/A-Request.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\n\n\n\n\n/**\n * A-Service is a container that can run different types of services, such as HTTP servers, workers, etc.\n * Depending on the provided config and configuration, it will load the necessary components and start the service.\n * \n */\nexport class A_HttpServer extends A_Service {\n\n protected server!: Server;\n\n\n static get onBeforeRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onBeforeRequest,\n scope: [A_HttpServer],\n })(target, propertyKey, descriptor);\n }\n }\n\n static get onRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n scope: [A_HttpServer],\n })(target, propertyKey, descriptor);\n }\n }\n\n static get onAfterRequest() {\n return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n return A_Feature.Extend({\n name: A_HttpServerFeatures.onAfterRequest,\n scope: [A_HttpServer],\n })(target, propertyKey, descriptor);\n }\n }\n\n\n\n @A_Feature.Extend()\n protected async [A_ServiceFeatures.onStart](\n\n @A_Dependency.Required()\n @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n\n @A_Dependency.Required()\n @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n\n ): Promise<void> {\n const http = await polyfill.http();\n\n // Create the HTTP server\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Start listening on the specified port\n await this.listen(config.get('A_SERVER_PORT'));\n }\n\n @A_Feature.Extend()\n protected async [A_ServiceFeatures.onAfterStart](\n @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger,\n ): Promise<void> {\n logger.serverReady({\n port: config.get('A_SERVER_PORT'),\n app: {\n name: this.scope.name,\n }\n });\n }\n\n protected async [A_ServiceFeatures.onStop](...args: any[]): Promise<void> {\n await this.close();\n }\n\n close() {\n return new Promise<void>((resolve, reject) => {\n this.server.close(() => {\n resolve();\n });\n });\n }\n\n listen(port: number) {\n return new Promise<void>((resolve, reject) => {\n this.server.listen(port, () => {\n resolve();\n });\n });\n }\n\n\n // ======================================================================================\n // ============================= A_HttpServer Lifecycle =================================\n // ======================================================================================\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onBeforeRequest](...args: any[]) { }\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onRequest](...args: any[]) { }\n\n @A_Feature.Extend()\n protected async [A_HttpServerFeatures.onAfterRequest](...args: any[]) { }\n\n\n // ======================================================================================\n // ============================= A_HttpServer Methods =================================\n // ======================================================================================\n\n async handleRequest(\n request: IncomingMessage,\n response: ServerResponse\n ) {\n const route = new A_ServerRoute(\n request.url || '',\n request.method as A_HttpServerRequestMethod\n );\n\n const id = A_IdentityHelper.generateTimeId();\n const shard = `${request.method}-${route.path.replace('/', '-')}`;\n\n const req = new A_Request({ id, shard, request, scope: this.scope.name });\n const res = new A_Response({ id, shard, response, scope: this.scope.name });\n const context = new A_HttpServerRequestContext(request, response);\n\n const scope = new A_Scope({\n name: id,\n entities: [req, res],\n fragments: [route, context]\n }).inherit(this.scope);\n\n try {\n const onBeforeRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onBeforeRequest,\n component: this\n });\n\n const onRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onRequest,\n component: this\n });\n\n const onAfterRequestFeature = new A_Feature({\n name: A_HttpServerFeatures.onAfterRequest,\n component: this\n });\n\n await new Promise<void>(async (resolve, reject) => {\n\n const cleanup = () => {\n onBeforeRequestFeature.interrupt();\n onRequestFeature.interrupt();\n onAfterRequestFeature.interrupt();\n\n req.off(A_RequestFeatures.onError, cleanup);\n req.off(A_RequestFeatures.onClose, cleanup);\n req.off(A_RequestFeatures.onTimeout, cleanup);\n\n\n reject(scope.resolve(A_Error)!);\n }\n\n\n req.on(A_RequestFeatures.onError, cleanup.bind(this));\n req.on(A_RequestFeatures.onClose, cleanup.bind(this));\n\n try {\n await req.load();\n await res.load();\n\n\n await onBeforeRequestFeature.process(scope);\n\n await onRequestFeature.process(scope);\n\n await onAfterRequestFeature.process(scope);\n\n\n req.clearTimeout();\n\n // For SSE streams the controller calls response.sseOpen() which keeps\n // the socket alive; skip the auto-send so we don't close it here.\n if (!res.isStreaming) {\n await res.status(200).send();\n }\n\n resolve();\n } catch (error) {\n\n req.clearTimeout();\n reject(error);\n }\n });\n\n } catch (error) {\n\n let wrappedError;\n\n switch (true) {\n case error instanceof A_HttpServerError:\n wrappedError = error;\n break;\n\n case error instanceof A_Error && error.originalError instanceof A_HttpServerError:\n wrappedError = error.originalError;\n break;\n\n // Duck-type: A_Error (e.g. A_FeatureError) wrapping an HttpError-like original.\n // A_Error.fromConstructor() unwraps nested A_Error chains, so originalError is\n // always the root non-A_Error cause — check it for a numeric statusCode.\n case error instanceof A_Error &&\n error.originalError instanceof Error &&\n typeof (error.originalError as any).statusCode === 'number':\n wrappedError = new A_HttpServerError({\n status: (error.originalError as any).statusCode as number,\n description: (error.originalError as Error).message,\n originalError: error.originalError,\n });\n break;\n\n // Duck-type: any Error with a numeric statusCode property (e.g. http-errors,\n // Express-style errors, or plain project HttpError classes). Honour the\n // status code so the caller gets the right 4xx / 5xx rather than a blanket 500.\n case error instanceof Error && typeof (error as any).statusCode === 'number':\n wrappedError = new A_HttpServerError({\n status: (error as any).statusCode as number,\n description: error.message,\n originalError: error,\n });\n break;\n\n default:\n wrappedError = new A_HttpServerError({\n status: 500,\n description: 'An error occurred while processing the request.',\n originalError: error\n })\n break;\n }\n\n\n scope.register(wrappedError);\n\n await res.fail(wrappedError);\n\n await this.call(A_ServiceFeatures.onError, scope);\n }\n\n scope.destroy();\n }\n\n}\n\n\n\n\n\n\n\n\n","import { A_Error } from '@adaas/a-concept';\nimport { A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized } from './A-Server.types';\n\n\nexport class A_ServerError extends A_Error<A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized> {\n\n status: number = 500;\n\n\n protected fromConstructor(params: A_SERVER_TYPES__ServerError_Init): void {\n super.fromConstructor(params);\n if (params.status) {\n this.status = params.status;\n }\n }\n\n\n toJSON(): A_SERVER_TYPES__ServerError_Serialized {\n return {\n ...super.toJSON(),\n status: this.status\n }\n }\n}\n\n\n","export const A_ServerRouteHttpMethods = {\n DEFAULT: 'DEFAULT',\n GET: 'GET',\n POST: 'POST',\n PUT: 'PUT',\n DELETE: 'DELETE',\n PATCH: 'PATCH',\n OPTIONS: 'OPTIONS',\n HEAD: 'HEAD',\n CONNECT: 'CONNECT',\n TRACE: 'TRACE',\n} as const\n\n\nexport const A_ServerRouteProtocols = {\n HTTP: 'http',\n HTTPS: 'https',\n WS: 'ws',\n WSS: 'wss',\n} as const","\n\nexport const A_ServerRouterMetaKeys = {\n ROUTES: '_A_ServerRouterMeta_ROUTES',\n ROUTES_CONFIGS: '_A_ServerRouterMeta_ROUTES_CONFIGS',\n} as const\n\n\n","import { A_ComponentMeta } from \"@adaas/a-concept\";\nimport { A_ServerRouterMetaStructure, A_ServerRouterRouteDefinition } from \"./A-ServerRouter.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouterMetaKeys } from \"./A-ServerRouter.constants\";\n\n\n\nexport class A_ServerRouterMeta extends A_ComponentMeta<A_ServerRouterMetaStructure> {\n\n\n get routes(): Array<A_ServerRoute> {\n return this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n }\n\n\n get definitions(): Map<string, A_ServerRouterRouteDefinition> {\n return this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n }\n\n\n addRoute(regexp: RegExp, route: A_ServerRouterRouteDefinition) {\n const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n existingRoutes.set(regexp.source, route);\n this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n existingRoutesConfigs.push(route.route);\n this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n }\n\n\n removeRoute(route: A_ServerRoute) {\n const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n existingRoutes.forEach((value, key) => {\n if (value.route === route) {\n existingRoutes.delete(key);\n }\n });\n this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n const index = existingRoutesConfigs.indexOf(route);\n if (index !== -1) {\n existingRoutesConfigs.splice(index, 1);\n }\n this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n }\n}","import { A_Component, A_Context, A_Feature_Define, A_Feature_Extend, A_TYPES__MetaLinkedComponentConstructors } from \"@adaas/a-concept\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRoute } from \"../A-ServerRoute/A-ServerRoute.entity\";\nimport { A_ServerRouter } from \"./A-ServerRouter.component\";\n\n/**\n * \n * This decorator should allow to set a default meta type for the class, this helps to avoid\n * the need to create custom meta classes for each class.\n * \n * @returns \n */\nexport function A_ServerRouterDefineDecorator(route: A_ServerRoute) {\n return function <TTarget extends A_TYPES__MetaLinkedComponentConstructors>(\n target: A_Component,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n\n const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(A_ServerRouter);\n\n const searchKey = route.toAFeatureExtension(['A_ServerRouter', 'A_Service']);\n\n meta.addRoute(searchKey, {\n component: target,\n handler: propertyKey,\n route\n });\n\n A_Feature_Define({\n name: searchKey.source,\n invoke: false\n })(target, propertyKey, descriptor)\n\n return A_Feature_Extend(searchKey)(target, propertyKey, descriptor);\n }\n}","import {\n A_Component,\n A_Concept,\n A_Context,\n A_Feature,\n A_Inject,\n A_Meta,\n A_Scope,\n A_TypeGuards,\n A_TYPES__Required\n} from \"@adaas/a-concept\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_ServerLogger } from \"../A-ServerLogger/A-ServerLogger.component\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouteHttpMethodNames } from \"@adaas/a-server/route/A-ServerRoute.types\";\nimport { A_ServerRouteHttpMethods } from \"@adaas/a-server/route/A-ServerRoute.constants\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRouterDefineDecorator } from \"./A-ServerRouterDefine.decorator\";\nimport { A_ServerRouterRouteConfig } from \"./A-ServerRouter.types\";\n\n\n\n@A_Meta.Define(A_ServerRouterMeta)\nexport class A_ServerRouter extends A_Component {\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n /**\n * Allows to define a custom route for POST requests\n * \n * @param path \n * @returns \n */\n static Post(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.POST,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for GET requests\n * \n * @param path \n * @returns \n */\n static Get(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.GET,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for PUT requests\n * \n * @param path \n * @returns \n */\n static Put(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.PUT,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for DELETE requests\n * \n * @param path \n * @returns \n */\n static Delete(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.DELETE,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for PATCH requests\n * \n * @param path \n * @returns \n */\n static Patch(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.PATCH,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n /**\n * Allows to define a custom route for DEFAULT requests\n * \n * @param path \n * @returns \n */\n static Default(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n return this.defineRoute({\n method: A_ServerRouteHttpMethods.DEFAULT,\n path: typeof path === 'object' && 'path' in path ? path.path : path,\n version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n });\n }\n\n\n // static routes: Array<A_ServerRoute> = [];\n\n /**\n * Private method to have the same signature for all route methods\n * \n * @param method \n * @param path \n * @returns \n */\n private static defineRoute(\n config: A_ServerRouterRouteConfig & { method: A_ServerRouteHttpMethodNames }\n ) {\n const route = typeof config.path === 'string' || config.path instanceof RegExp\n ? new A_ServerRoute(\n `/${config.prefix}/${config.version}${config.path instanceof RegExp ? config.path.source : config.path.startsWith('/') ? config.path : `/${config.path}`}`,\n config.method)\n : config.path;\n\n return A_ServerRouterDefineDecorator(route);\n }\n\n\n // =====================================================\n // ================ Concept Lifecycle ========================\n // =====================================================\n\n @A_Concept.Load()\n protected async load(\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<void> {\n const meta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n const routes = meta.routes;\n\n if (!routes || !routes.length) {\n logger.warning('yellow', `No routes defined for ${this.constructor.name}`);\n return;\n }\n\n\n logger.info('cyan',\n `Registered Routes:`,\n `------------------------------------\\n`,\n ...routes\n .map(route => `[${route.method.toUpperCase()}]${' '.repeat(7 - route.method.length)} ${route.path}`)\n\n );\n }\n\n\n\n // =======================================================\n // ================ Feature Definition=====================\n // =======================================================\n // @A_Feature.Define({\n // invoke: false\n // })\n @A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n })\n async identifyRoute(\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Config) config: A_Config,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_ServerRoute) route: A_ServerRoute,\n ) {\n if (route.method === 'OPTIONS') {\n // Ignore OPTIONS requests\n return;\n }\n /**\n * just execute all listeners on the Route\n * url example: /api/v1/users/123\n * OR\n * url example: /api/v1/users\n * => Then The feature will be \"GET::/api/v1/users\"\n * And it will return all stages that are similar to the feature name \n */\n\n const feature = new A_Feature({ name: route.toString(), component: this, })\n\n if (!feature.size)\n throw new A_HttpServerError({\n status: 404,\n title: 'Route Not Found',\n description: `No route found for ${request.method} ${request.url}`,\n })\n\n\n for (const stage of feature) {\n\n const targetConstructor = stage.definition.dependency.target;\n\n if (A_TypeGuards.isComponentConstructor(targetConstructor)) {\n\n const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n const routeDefinitions = meta.definitions;\n\n const routeDefinition = routeDefinitions?.get(stage.definition.name || '');\n\n\n\n\n if (routeDefinition) {\n request.useRoute(routeDefinition.route);\n }\n }\n\n const stageScope = new A_Scope({\n name: `a-route--${request.id}--${stage.definition.name}`,\n }, {\n parent: scope\n });\n\n\n await stage.process(stageScope);\n }\n\n }\n}","import { A_Component, A_Container, A_Context, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\n\n\n\nexport class A_ServerController extends A_Component {\n\n\n @A_ServerRouter.Post({\n path: '/:component/:operation',\n version: 'v1',\n prefix: 'a-component'\n })\n async callEntityMethod(\n @A_Inject(A_Request) request: A_Request<any, any, {\n component: string,\n operation: string\n }>,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_Scope) scope: A_Scope\n ) {\n\n // check step by step each parameter to ensure they are valid\n\n if (!scope.has(request.params.component))\n return\n\n if (!request.params.operation || typeof request.params.operation !== 'string')\n return;\n\n\n const possibleComponent = scope.resolve(request.params.component);\n\n if (\n !possibleComponent\n ||\n ![A_Component, A_Container]\n .some(c => possibleComponent instanceof c)\n )\n return;\n\n const component = possibleComponent as A_Component | A_Container;\n\n const meta = A_Context.meta(component);\n\n const targetFeature = meta.features().find(f => f.name === `${component.constructor.name}.${request.params.operation}`);\n\n if (!targetFeature)\n return;\n\n\n await component.call(request.params.operation, scope);\n }\n}","import {\n A_Context, A_Entity,\n ASEID,\n} from \"@adaas/a-concept\";\nimport {\n A_SERVER_TYPES__A_EntityListConstructor,\n A_SERVER_TYPES__A_EntityListPagination,\n A_SERVER_TYPES__A_EntityListSerialized\n} from \"./A-EntityList.types\";\n\n\n\n/**\n * A-EntityList\n * \n * Entity that represents a list of entities with pagination of particular type\n */\nexport class A_ServerEntityList<\n EntityType extends A_Entity = A_Entity,\n> extends A_Entity<\n A_SERVER_TYPES__A_EntityListConstructor,\n A_SERVER_TYPES__A_EntityListSerialized\n> {\n\n static get scope(): string {\n return 'a-server';\n }\n\n protected _entityConstructor!: new (...args: ConstructorParameters<typeof A_Entity>) => EntityType;\n protected _items: Array<EntityType> = [];\n protected _pagination: A_SERVER_TYPES__A_EntityListPagination = {\n total: 0,\n page: 1,\n pageSize: 10\n };\n\n\n /**\n * Returns the entity constructor used for the list\n */\n get entityConstructor(): new (...args: ConstructorParameters<typeof A_Entity>) => EntityType {\n return this._entityConstructor;\n }\n\n /**\n * Returns the list of items contained in the entity list\n */\n get items(): Array<EntityType> {\n return this._items;\n }\n\n /**\n * Returns pagination information about the entity list\n */\n get pagination(): A_SERVER_TYPES__A_EntityListPagination {\n return this._pagination;\n }\n\n\n\n\n /**\n * Creates a new instance of A_EntityList\n * \n * @param newEntity \n */\n fromNew(newEntity: A_SERVER_TYPES__A_EntityListConstructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: 'default',\n entity: 'a-list' + (newEntity.name ? `.${newEntity.name}` : ''),\n id: (new Date()).getTime().toString(),\n });\n\n this._entityConstructor = newEntity.constructor as new (...args: any[]) => EntityType;\n }\n\n\n\n /**\n * Allows to convert Repository Response data to EntityList instance\n * \n * [!] This method does not load the data from the repository, it only converts the data to the EntityList instance\n * \n * @param items \n * @param pagination \n */\n fromList(\n items: Array<EntityType> | Array<ReturnType<EntityType['toJSON']>>,\n pagination?: A_SERVER_TYPES__A_EntityListPagination\n ) {\n this._items = items.map(item => {\n if (item instanceof A_Entity) {\n return item as EntityType;\n } else {\n const entity = new this._entityConstructor(item);\n return entity;\n }\n });\n\n if (pagination) {\n this._pagination = {\n total: pagination.total,\n page: pagination.page,\n pageSize: pagination.pageSize\n }\n }\n }\n\n\n\n /**\n * Serializes the EntityList to a JSON object\n * \n * @returns \n */\n toJSON(): A_SERVER_TYPES__A_EntityListSerialized<EntityType> {\n return {\n ...super.toJSON(),\n items: this._items.map(i => i.toJSON()) as ReturnType<EntityType['toJSON']>[],\n pagination: this._pagination\n }\n }\n}\n","import { A_Entity, A_TYPES__Entity_Constructor, A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\n\n\nexport type A_SERVER_TYPES__A_EntityListConstructor = {\n name: string,\n scope: string,\n constructor: A_TYPES__Entity_Constructor,\n}\n\nexport enum A_SERVER_TYPES__A_EntityListEvent {\n Load = 'load',\n}\n\nexport type A_SERVER_TYPES__A_EntityListSerialized<EntityTypes extends A_Entity = A_Entity> = {\n items: Array<ReturnType<EntityTypes['toJSON']>>,\n type: string,\n pagination: A_SERVER_TYPES__A_EntityListPagination\n} & A_TYPES__Entity_Serialized;\n\n\n\nexport type A_SERVER_TYPES__A_EntityListPagination = {\n total: number,\n page: number,\n pageSize: number,\n}\n\n","import { A_Fragment } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerListQueryFilter<FilterFields extends string[]> extends A_Fragment {\n\n protected parsedQuery!: Record<FilterFields[number], string>;\n\n constructor(\n protected _query: string | Partial<Record<FilterFields[number], string>> = {},\n protected defaults: Partial<Record<FilterFields[number], string>> = {}\n ) {\n super();\n this.parsedQuery = this.parseQueryString(_query);\n }\n\n\n get query() {\n return this._query;\n }\n\n\n get(property: FilterFields[number], defaultValue: string = '') {\n return this.parsedQuery[property] || this.defaults[property] || defaultValue;\n }\n\n protected parseQueryString(value: string | Partial<Record<FilterFields[number], string>> = {}): Record<FilterFields[number], string> {\n if (typeof value === 'string') {\n return value.split('&').reduce((acc, part) => {\n const [key, val] = part.split('=');\n acc[decodeURIComponent(key)] = decodeURIComponent(val || '');\n return acc;\n }, {}) as Record<FilterFields[number], string>;\n }\n return value as Record<FilterFields[number], string>;\n }\n}","export const A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES = {\n // ----------------------------------------------------------\n // A-ServerLogger Environment Variables\n // ----------------------------------------------------------\n // These environment variables are used by A-Concept core to configure the application\n // ----------------------------------------------------------\n /**\n * Enable logging of 200 responses\n */\n SERVER_IGNORE_LOG_200: 'SERVER_IGNORE_LOG_200',\n /**\n * Enable logging of 404 responses\n */\n SERVER_IGNORE_LOG_404: 'SERVER_IGNORE_LOG_404',\n /**\n * Enable logging of 500 responses\n */\n SERVER_IGNORE_LOG_500: 'SERVER_IGNORE_LOG_500',\n /**\n * Enable logging of 400 responses\n */\n SERVER_IGNORE_LOG_400: 'SERVER_IGNORE_LOG_400',\n /**\n * Enable logging of default responses\n */\n SERVER_IGNORE_LOG_DEFAULT: 'SERVER_IGNORE_LOG_DEFAULT',\n} as const","import { A_Component } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerMiddleware extends A_Component {\n\n\n // static get features() {\n // // return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n // // return A_Feature.Extend({\n // // name: A_ServerMiddlewareFeatures.onBeforeInit,\n // // scope: [target.constructor],\n // // })(target, propertyKey, descriptor);\n // // }\n // }\n\n}","import { A_SERVER_TYPES__ProxyConfigConstructorConfig } from \"./A-ServerProxy.types\";\n\nexport const PROXY_CONFIG_DEFAULTS: A_SERVER_TYPES__ProxyConfigConstructorConfig = {\n path: '/',\n hostname: 'localhost',\n port: 80,\n method: 'GET',\n headers: {},\n protocol: 'http'\n};\n","import { A_Fragment } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ProxyConfigConstructor, A_SERVER_TYPES__ProxyConfigConstructorConfig, A_SERVER_TYPES__RoutesConfig } from \"./A-ServerProxy.types\";\nimport { PROXY_CONFIG_DEFAULTS } from \"./A-ServerProxy.constants\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_ProxyConfig extends A_Fragment {\n\n protected readonly _configs: Array<A_SERVER_TYPES__RoutesConfig>\n\n constructor(\n /**\n * Setup proxy configs, where key is the path to match, and value is either a full URL or a partial config object\n */\n configs: A_SERVER_TYPES__ProxyConfigConstructor = {}\n ) {\n super();\n\n this._configs = Object.entries(configs).map(([path, config]) => {\n\n const targetUrl = new URL(typeof config === 'string' ? config : config.hostname || ''); // parse hostname, may include scheme\n\n const port =\n targetUrl.port ||\n (targetUrl.protocol === \"https:\" ? '443' : '80');\n\n\n const prepared = {\n ...PROXY_CONFIG_DEFAULTS,\n ...(typeof config === 'string' ? {\n path,\n port: parseInt(port),\n protocol: targetUrl.protocol,\n hostname: targetUrl.hostname\n } : config)\n }\n\n return {\n route: new A_ServerRoute(prepared.path, prepared.method),\n hostname: prepared.hostname,\n port: prepared.port,\n headers: prepared.headers,\n protocol: prepared.protocol\n }\n });\n }\n\n /**\n * Returns all configured proxy configs\n * \n */\n get configs(): Array<A_SERVER_TYPES__RoutesConfig> {\n return this._configs;\n }\n\n\n /**\n * Checks if a given path is configured in the proxy\n * \n * @param path \n * @returns \n */\n has(path: string): boolean {\n return this._configs.some(route => route.route.toRegExp().test(path));\n }\n\n /**\n * Returns the proxy configuration for a given path, if exists\n *\n * @param path \n * @returns \n */\n config(path: string): A_SERVER_TYPES__RoutesConfig | undefined {\n \n\n return this._configs.find(route => route.route.toRegExp().test(path));\n }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_ProxyConfig } from \"./A-ServerProxy.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_Logger, A_LOGGER_COLORS } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\n\n\nexport class A_ServerProxy extends A_Component {\n\n\n @A_Concept.Load()\n async load(\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_ProxyConfig) config: A_ProxyConfig\n ) {\n logger.info(\n 'green',\n `Proxy routes configured:`,\n ...config.configs.map(c => `${c.route.toString()} -> ${c.protocol}//${c.hostname}:${c.port}`)\n );\n }\n\n\n\n @A_Feature.Extend({\n name: A_HttpServerFeatures.onRequest,\n before:/.*/\n })\n async onRequest(\n @A_Inject(A_Request) req: A_Request,\n @A_Inject(A_Response) res: A_Response,\n @A_Inject(A_ProxyConfig) proxyConfig: A_ProxyConfig,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n @A_Inject(A_Feature) feature: A_Feature\n ) {\n return new Promise<void>(async (resolve, reject) => {\n const { method, url } = req;\n\n const route = new A_ServerRoute(url, method);\n const config = proxyConfig.config(route.toString());\n\n if (!config) {\n return resolve(); // nothing to proxy\n }\n\n logger.log(\n \"yellow\",\n `Proxying request ${method} ${url} to ${config.hostname}`,\n config\n );\n\n const client = await (config.protocol === \"https:\"\n ? polyfill.https()\n : polyfill.http());\n\n const proxyReq = client.request(\n {\n method: config.route.method,\n hostname: config.hostname,\n port: config.port,\n headers: config.headers,\n path: route.path,\n },\n (proxyRes) => {\n if (!res.headersSent) {\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n }\n proxyRes.on(\"end\", () => {\n\n logger.log(\"green\", `Proxy request to ${config?.hostname} completed`);\n\n resolve();\n });\n\n proxyRes.pipe(res.original);\n }\n );\n\n proxyReq.on(\"error\", (err) => reject(err));\n\n req.pipe(proxyReq);\n\n feature.interrupt();\n });\n }\n\n}","import { A_Fragment } from \"@adaas/a-concept\";\n\nexport interface A_StaticAlias {\n alias: string;\n path: string;\n directory: string;\n enabled?: boolean;\n}\n\nexport interface A_StaticDirectoryConfig {\n path: string;\n directory: string;\n alias?: string;\n}\n\nexport class A_StaticConfig extends A_Fragment {\n\n readonly directories: Array<string>;\n private _aliases: Map<string, A_StaticAlias> = new Map();\n private _directoryConfigs: A_StaticDirectoryConfig[] = [];\n\n constructor(\n /**\n * Setup directories to serve static files from, comma separated\n */\n directories: string[] = [],\n /**\n * Custom directory configurations with aliases\n */\n directoryConfigs: A_StaticDirectoryConfig[] = []\n ) {\n super();\n\n this.directories = directories;\n this._directoryConfigs = directoryConfigs;\n\n // Initialize default aliases from directories\n this.initializeDefaultAliases();\n\n // Initialize custom aliases from directoryConfigs\n this.initializeCustomAliases();\n }\n\n private initializeDefaultAliases(): void {\n this.directories.forEach((dir, index) => {\n const alias: A_StaticAlias = {\n alias: `/static${index > 0 ? index : ''}`,\n path: `/static${index > 0 ? index : ''}`,\n directory: dir,\n enabled: true\n };\n this._aliases.set(alias.path, alias);\n });\n }\n\n private initializeCustomAliases(): void {\n this._directoryConfigs.forEach((config) => {\n const alias: A_StaticAlias = {\n alias: config.alias || config.path,\n path: config.path,\n directory: config.directory,\n enabled: true\n };\n this._aliases.set(alias.path, alias);\n });\n }\n\n /**\n * Add a custom static file alias\n * @param alias - The URL path alias (e.g., '/assets')\n * @param directory - The local directory path\n * @param path - Optional custom path (defaults to alias)\n */\n public addAlias(alias: string, directory: string, path?: string): void {\n const staticAlias: A_StaticAlias = {\n alias,\n path: path || alias,\n directory,\n enabled: true\n };\n\n this._aliases.set(staticAlias.path, staticAlias);\n }\n\n /**\n * Remove a static file alias\n * @param aliasPath - The path of the alias to remove\n */\n public removeAlias(aliasPath: string): boolean {\n return this._aliases.delete(aliasPath);\n }\n\n /**\n * Enable or disable an alias\n * @param aliasPath - The path of the alias\n * @param enabled - Whether to enable or disable\n */\n public setAliasEnabled(aliasPath: string, enabled: boolean): boolean {\n const alias = this._aliases.get(aliasPath);\n if (alias) {\n alias.enabled = enabled;\n return true;\n }\n return false;\n }\n\n /**\n * Get all configured aliases\n */\n public getAliases(): A_StaticAlias[] {\n return Array.from(this._aliases.values());\n }\n\n /**\n * Get enabled aliases only\n */\n public getEnabledAliases(): A_StaticAlias[] {\n return Array.from(this._aliases.values()).filter(alias => alias.enabled !== false);\n }\n\n /**\n * Find the best matching alias for a given request path\n * @param requestPath - The request path to match\n */\n public findMatchingAlias(requestPath: string): A_StaticAlias | null {\n let bestMatch: A_StaticAlias | null = null;\n let longestMatch = 0;\n\n for (const alias of this.getEnabledAliases()) {\n if (requestPath.startsWith(alias.path) && alias.path.length > longestMatch) {\n bestMatch = alias;\n longestMatch = alias.path.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Check if an alias exists\n * @param aliasPath - The path to check\n */\n public hasAlias(aliasPath: string): boolean {\n return this._aliases.has(aliasPath);\n }\n\n /**\n * Get a specific alias by path\n * @param aliasPath - The path of the alias\n */\n public getAlias(aliasPath: string): A_StaticAlias | undefined {\n return this._aliases.get(aliasPath);\n }\n\n /**\n * Add multiple aliases at once\n * @param aliases - Array of alias configurations\n */\n public addAliases(aliases: A_StaticDirectoryConfig[]): void {\n aliases.forEach(config => {\n this.addAlias(config.alias || config.path, config.directory, config.path);\n });\n }\n\n /**\n * Clear all aliases\n */\n public clearAliases(): void {\n this._aliases.clear();\n }\n\n /**\n * Update an existing alias\n * @param aliasPath - The path of the alias to update\n * @param updates - Partial updates to apply\n */\n public updateAlias(aliasPath: string, updates: Partial<A_StaticAlias>): boolean {\n const alias = this._aliases.get(aliasPath);\n if (alias) {\n Object.assign(alias, updates);\n return true;\n }\n return false;\n }\n\n /**\n * Get statistics about configured aliases\n */\n public getStats(): {\n total: number;\n enabled: number;\n disabled: number;\n directories: string[];\n } {\n const aliases = this.getAliases();\n const enabled = aliases.filter(a => a.enabled !== false);\n const disabled = aliases.filter(a => a.enabled === false);\n const directories = [...new Set(aliases.map(a => a.directory))];\n\n return {\n total: aliases.length,\n enabled: enabled.length,\n disabled: disabled.length,\n directories\n };\n }\n\n /**\n * Checks if a given path is configured in the proxy (legacy method)\n * @deprecated Use findMatchingAlias instead\n * @param path \n * @returns \n */\n has(path: string): boolean {\n const alias = this.findMatchingAlias(path);\n return alias ? !!alias.directory : false;\n }\n\n /**\n * Gets the directory for a given path if configured (legacy method)\n * \n * @param path \n * @returns \n */\n get(path: string): string | undefined {\n const alias = this.findMatchingAlias(path);\n return alias ? alias.directory : undefined;\n }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\"\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_StaticConfig, A_StaticAlias } from \"./A-ServerStatic.context\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\nexport class A_StaticLoader extends A_Component {\n\n private _fsPolyfill: any;\n private _pathPolyfill: any;\n\n @A_Concept.Load()\n async load(\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_StaticConfig) config: A_StaticConfig,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill\n ) {\n // Initialize polyfills\n this._fsPolyfill = await polyfill.fs();\n this._pathPolyfill = await polyfill.path();\n\n // Log configured aliases\n const aliases = config.getEnabledAliases();\n logger.info('cyan',\n\n `Static aliases configured:`,\n ...aliases.map(alias => `${alias.alias} -> ${alias.directory}`)\n );\n }\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_Feature.Extend({\n before: /.*/\n })\n async [A_HttpServerFeatures.onRequest](\n @A_Inject(A_Request) req: A_Request,\n @A_Inject(A_Response) res: A_Response,\n @A_Inject(A_Logger) logger: A_Logger,\n @A_Inject(A_StaticConfig) config: A_StaticConfig,\n @A_Inject(A_Polyfill) polyfill: A_Polyfill\n ) {\n\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n return; // Only handle GET and HEAD requests\n }\n\n const { method, url } = req;\n const route = new A_ServerRoute(url, method);\n\n // Check if this request matches any of our configured aliases\n const alias = config.findMatchingAlias(route.path);\n if (!alias) {\n return; // No static config for this path\n }\n\n try {\n // Ensure polyfills are available\n const fs = this._fsPolyfill || await polyfill.fs();\n const path = this._pathPolyfill || await polyfill.path();\n\n const staticDir = path.resolve(process.cwd(), alias.directory);\n\n // Validate static directory exists\n if (!fs.existsSync(staticDir)) {\n logger.log(\"red\", `Static directory ${staticDir} does not exist.`);\n return;\n }\n\n // Get the file path relative to the alias\n const relativePath = route.path.replace(alias.path, '');\n const safePath = this.safeFilePath(staticDir, relativePath, req.headers?.host, path, fs);\n\n await this.serveFile(safePath, res, logger, fs, path);\n\n logger.log('green', `Successfully served: ${safePath}`);\n\n } catch (error: any) {\n throw new A_HttpServerError({\n status: 500,\n title: 'Static File Serving Error',\n description: `Error serving static file for ${route.path}: ${error.message}`,\n originalError: error\n });\n }\n }\n\n /**\n * Add a custom static file alias through the config\n * @param alias - The URL path alias (e.g., '/assets')\n * @param directory - The local directory path\n * @param path - Optional custom path (defaults to alias)\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public addAlias(\n alias: string,\n directory: string,\n config: A_StaticConfig,\n logger?: A_Logger,\n path?: string\n ): void {\n config.addAlias(alias, directory, path);\n\n if (logger) {\n logger.log('cyan', `Static alias added: ${alias} -> ${directory}`);\n }\n }\n\n /**\n * Remove a static file alias through the config\n * @param aliasPath - The path of the alias to remove\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public removeAlias(aliasPath: string, config: A_StaticConfig, logger?: A_Logger): boolean {\n const removed = config.removeAlias(aliasPath);\n\n if (removed && logger) {\n logger.log('yellow', `Static alias removed: ${aliasPath}`);\n }\n\n return removed;\n }\n\n /**\n * Get all configured aliases from config\n * @param config - Static config instance\n */\n public getAliases(config: A_StaticConfig): A_StaticAlias[] {\n return config.getAliases();\n }\n\n /**\n * Enable or disable an alias\n * @param aliasPath - The path of the alias\n * @param enabled - Whether to enable or disable\n * @param config - Static config instance\n * @param logger - Logger instance for logging\n */\n public setAliasEnabled(\n aliasPath: string,\n enabled: boolean,\n config: A_StaticConfig,\n logger?: A_Logger\n ): boolean {\n const result = config.setAliasEnabled(aliasPath, enabled);\n\n if (result && logger) {\n logger.log('blue', `Static alias ${enabled ? 'enabled' : 'disabled'}: ${aliasPath}`);\n }\n\n return result;\n }\n\n protected getMimeType(ext: string): string {\n const mimeTypes: Record<string, string> = {\n // Text\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".xml\": \"application/xml\",\n\n // JavaScript\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".jsx\": \"application/javascript\",\n \".ts\": \"application/typescript\",\n \".tsx\": \"application/typescript\",\n\n // JSON\n \".json\": \"application/json\",\n \".jsonld\": \"application/ld+json\",\n\n // Images\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".webp\": \"image/webp\",\n \".bmp\": \"image/bmp\",\n \".tiff\": \"image/tiff\",\n\n // Fonts\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n // Audio/Video\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".ogg\": \"application/ogg\",\n\n // Archives\n \".zip\": \"application/zip\",\n \".tar\": \"application/x-tar\",\n \".gz\": \"application/gzip\",\n\n // Documents\n \".pdf\": \"application/pdf\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n };\n\n return mimeTypes[ext.toLowerCase()] || \"application/octet-stream\";\n }\n\n\n protected safeFilePath(staticDir: string, reqUrl: string, host: string = 'localhost', pathPolyfill: any, fsPolyfill: any): string {\n const parsedUrl = new URL(reqUrl || \"/\", `http://${host}`);\n let pathname = decodeURIComponent(parsedUrl.pathname);\n\n // Prevent path traversal attacks\n pathname = pathname.replace(/\\.\\.[\\/\\\\]/g, \"\");\n\n let filePath = pathPolyfill.join(staticDir, pathname);\n\n if (!fsPolyfill.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n return filePath;\n }\n\n protected serveFile(\n filePath: string,\n res: A_Response,\n logger: A_Logger,\n fsPolyfill: any,\n pathPolyfill: any\n ): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n try {\n if (fsPolyfill.existsSync(filePath)) {\n const ext = pathPolyfill.extname(filePath);\n const contentType = this.getMimeType(ext);\n\n // Set appropriate headers\n const headers: Record<string, string> = {\n \"Content-Type\": contentType,\n \"Cache-Control\": this.getCacheControl(ext),\n \"X-Content-Type-Options\": \"nosniff\"\n };\n\n res.writeHead(200, headers);\n\n const stream = fsPolyfill.createReadStream(filePath);\n\n if (stream && res.original) {\n stream.pipe(res.original);\n\n stream.on('end', () => {\n resolve();\n });\n\n stream.on(\"error\", (err: any) => {\n reject(new A_HttpServerError({\n status: 500,\n title: 'File Stream Error',\n description: `Error reading file stream for ${filePath}: ${err.message}`,\n originalError: err\n }));\n });\n } else {\n reject(new A_HttpServerError({\n status: 500,\n title: 'Response Stream Error',\n description: `Unable to pipe file stream for ${filePath}`,\n }));\n }\n } else {\n reject(new A_HttpServerError({\n status: 404,\n title: 'File Not Found',\n description: `File not found: ${filePath}`,\n }));\n }\n } catch (error: any) {\n logger.error(`Error serving file: ${error.message}`);\n reject(new A_HttpServerError({\n status: 500,\n title: 'Internal Server Error',\n description: `Error serving file: ${error.message}`,\n originalError: error\n }));\n }\n });\n }\n\n protected getCacheControl(ext: string): string {\n // Different cache strategies for different file types\n const staticAssets = ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.otf'];\n const dynamicContent = ['.html', '.htm'];\n\n if (staticAssets.includes(ext.toLowerCase())) {\n return \"public, max-age=31536000\"; // 1 year for static assets\n } else if (dynamicContent.includes(ext.toLowerCase())) {\n return \"public, max-age=3600\"; // 1 hour for HTML\n } else {\n return \"public, max-age=86400\"; // 1 day for other files\n }\n }\n\n}\n\n\n","export const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES = {\n // ----------------------------------------------------------\n // A-Server Environment Variables\n // ----------------------------------------------------------\n // These environment variables are used by A-Server to configure the application\n // ----------------------------------------------------------\n /**\n * Port for the server to listen on\n * [!] Default is 3000\n * @default 3000\n */\n A_SERVER_PORT: 'A_SERVER_PORT',\n\n} as const;\n\nexport type A_TYPES__ServerENVVariables = (typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES)[keyof typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES][];\n\n\n\nexport const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY = [\n A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES.A_SERVER_PORT,\n] as const;\n\n\n\n\n"]}