@wgtechlabs/log-engine 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +869 -608
- package/dist/formatter/data-formatter.d.ts +2 -1
- package/dist/formatter/data-formatter.d.ts.map +1 -1
- package/dist/formatter/data-formatter.js +1 -1
- package/dist/formatter/message-formatter.d.ts +23 -23
- package/dist/formatter/message-formatter.d.ts.map +1 -1
- package/dist/formatter/message-formatter.js +23 -23
- package/dist/formatter/timestamp.d.ts.map +1 -1
- package/dist/index.d.ts +130 -136
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +108 -108
- package/dist/logger/advanced-outputs.d.ts +159 -0
- package/dist/logger/advanced-outputs.d.ts.map +1 -0
- package/dist/logger/advanced-outputs.js +586 -0
- package/dist/logger/config.d.ts +18 -18
- package/dist/logger/config.d.ts.map +1 -1
- package/dist/logger/config.js +32 -29
- package/dist/logger/core.d.ts +128 -84
- package/dist/logger/core.d.ts.map +1 -1
- package/dist/logger/core.js +259 -74
- package/dist/logger/environment.d.ts +15 -15
- package/dist/logger/environment.d.ts.map +1 -1
- package/dist/logger/environment.js +15 -15
- package/dist/logger/filtering.d.ts +16 -16
- package/dist/logger/filtering.d.ts.map +1 -1
- package/dist/logger/filtering.js +37 -22
- package/dist/redaction/config.d.ts +8 -8
- package/dist/redaction/config.d.ts.map +1 -1
- package/dist/redaction/config.js +8 -8
- package/dist/redaction/redactor.d.ts +60 -60
- package/dist/redaction/redactor.d.ts.map +1 -1
- package/dist/redaction/redactor.js +101 -96
- package/dist/types/index.d.ts +98 -16
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +80 -68
package/dist/index.js
CHANGED
|
@@ -32,155 +32,155 @@ const logger = new logger_1.Logger();
|
|
|
32
32
|
*/
|
|
33
33
|
exports.LogEngine = {
|
|
34
34
|
/**
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
* Configure the logger with new settings
|
|
36
|
+
* @param config - Configuration object containing logger settings
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* LogEngine.configure({ mode: LogMode.PRODUCTION });
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
42
|
configure: (config) => logger.configure(config),
|
|
43
43
|
// Standard logging methods with automatic redaction
|
|
44
44
|
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
* Log a debug message with automatic data redaction
|
|
46
|
+
* Only shown in DEVELOPMENT mode
|
|
47
|
+
* @param message - The debug message to log
|
|
48
|
+
* @param data - Optional data object to log (sensitive data will be redacted)
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* LogEngine.debug('Processing user data', { userId: 123, email: 'user@example.com' });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
54
|
debug: (message, data) => logger.debug(message, data),
|
|
55
55
|
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
* Log an info message with automatic data redaction
|
|
57
|
+
* Shown in DEVELOPMENT and PRODUCTION modes
|
|
58
|
+
* @param message - The info message to log
|
|
59
|
+
* @param data - Optional data object to log (sensitive data will be redacted)
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* LogEngine.info('User login successful', { username: 'john' });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
65
|
info: (message, data) => logger.info(message, data),
|
|
66
66
|
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
67
|
+
* Log a warning message with automatic data redaction
|
|
68
|
+
* Shown in DEVELOPMENT and PRODUCTION modes
|
|
69
|
+
* @param message - The warning message to log
|
|
70
|
+
* @param data - Optional data object to log (sensitive data will be redacted)
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* LogEngine.warn('API rate limit approaching', { requestsRemaining: 10 });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
76
|
warn: (message, data) => logger.warn(message, data),
|
|
77
77
|
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
* Log an error message with automatic data redaction
|
|
79
|
+
* Shown in DEVELOPMENT and PRODUCTION modes
|
|
80
|
+
* @param message - The error message to log
|
|
81
|
+
* @param data - Optional data object to log (sensitive data will be redacted)
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* LogEngine.error('Database connection failed', { host: 'localhost', port: 5432 });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
87
|
error: (message, data) => logger.error(message, data),
|
|
88
88
|
/**
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
89
|
+
* Log a critical message with automatic data redaction
|
|
90
|
+
* Always shown regardless of mode (except OFF)
|
|
91
|
+
* @param message - The critical log message to log
|
|
92
|
+
* @param data - Optional data object to log (sensitive data will be redacted)
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* LogEngine.log('Application starting', { version: '1.0.0' });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
98
|
log: (message, data) => logger.log(message, data),
|
|
99
99
|
// Raw methods that bypass redaction (use with caution)
|
|
100
100
|
/**
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
* Log a debug message without redaction (use with caution)
|
|
102
|
+
* Bypasses automatic data redaction for debugging purposes
|
|
103
|
+
* @param message - The debug message to log
|
|
104
|
+
* @param data - Optional data object to log (no redaction applied)
|
|
105
|
+
*/
|
|
106
106
|
debugRaw: (message, data) => logger.debugRaw(message, data),
|
|
107
107
|
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
108
|
+
* Log an info message without redaction (use with caution)
|
|
109
|
+
* Bypasses automatic data redaction for debugging purposes
|
|
110
|
+
* @param message - The info message to log
|
|
111
|
+
* @param data - Optional data object to log (no redaction applied)
|
|
112
|
+
*/
|
|
113
113
|
infoRaw: (message, data) => logger.infoRaw(message, data),
|
|
114
114
|
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
* Log a warning message without redaction (use with caution)
|
|
116
|
+
* Bypasses automatic data redaction for debugging purposes
|
|
117
|
+
* @param message - The warning message to log
|
|
118
|
+
* @param data - Optional data object to log (no redaction applied)
|
|
119
|
+
*/
|
|
120
120
|
warnRaw: (message, data) => logger.warnRaw(message, data),
|
|
121
121
|
/**
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
* Log an error message without redaction (use with caution)
|
|
123
|
+
* Bypasses automatic data redaction for debugging purposes
|
|
124
|
+
* @param message - The error message to log
|
|
125
|
+
* @param data - Optional data object to log (no redaction applied)
|
|
126
|
+
*/
|
|
127
127
|
errorRaw: (message, data) => logger.errorRaw(message, data),
|
|
128
128
|
/**
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
* Log a critical message without redaction (use with caution)
|
|
130
|
+
* Bypasses automatic data redaction for debugging purposes
|
|
131
|
+
* @param message - The critical log message to log
|
|
132
|
+
* @param data - Optional data object to log (no redaction applied)
|
|
133
|
+
*/
|
|
134
134
|
logRaw: (message, data) => logger.logRaw(message, data),
|
|
135
135
|
// Redaction configuration methods
|
|
136
136
|
/**
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
* Configure data redaction settings
|
|
138
|
+
* @param config - Partial redaction configuration to apply
|
|
139
|
+
*/
|
|
140
140
|
configureRedaction: (config) => redaction_1.DataRedactor.updateConfig(config),
|
|
141
141
|
/**
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
* Refresh redaction configuration from environment variables
|
|
143
|
+
* Useful for picking up runtime environment changes
|
|
144
|
+
*/
|
|
145
145
|
refreshRedactionConfig: () => redaction_1.DataRedactor.refreshConfig(),
|
|
146
146
|
/**
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
* Reset redaction configuration to defaults
|
|
148
|
+
*/
|
|
149
149
|
resetRedactionConfig: () => redaction_1.DataRedactor.updateConfig(redaction_1.defaultRedactionConfig),
|
|
150
150
|
/**
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
* Get current redaction configuration
|
|
152
|
+
* @returns Current redaction configuration
|
|
153
|
+
*/
|
|
154
154
|
getRedactionConfig: () => redaction_1.DataRedactor.getConfig(),
|
|
155
|
-
// Advanced redaction methods
|
|
155
|
+
// Advanced redaction methods
|
|
156
156
|
/**
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
* Add custom regex patterns for advanced field detection
|
|
158
|
+
* @param patterns - Array of regex patterns to add
|
|
159
|
+
*/
|
|
160
160
|
addCustomRedactionPatterns: (patterns) => redaction_1.DataRedactor.addCustomPatterns(patterns),
|
|
161
161
|
/**
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
* Clear all custom redaction patterns
|
|
163
|
+
*/
|
|
164
164
|
clearCustomRedactionPatterns: () => redaction_1.DataRedactor.clearCustomPatterns(),
|
|
165
165
|
/**
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
166
|
+
* Add custom sensitive field names to the existing list
|
|
167
|
+
* @param fields - Array of field names to add
|
|
168
|
+
*/
|
|
169
169
|
addSensitiveFields: (fields) => redaction_1.DataRedactor.addSensitiveFields(fields),
|
|
170
170
|
/**
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
171
|
+
* Test if a field name would be redacted with current configuration
|
|
172
|
+
* @param fieldName - Field name to test
|
|
173
|
+
* @returns true if field would be redacted, false otherwise
|
|
174
|
+
*/
|
|
175
175
|
testFieldRedaction: (fieldName) => redaction_1.DataRedactor.testFieldRedaction(fieldName),
|
|
176
176
|
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
177
|
+
* Temporarily disable redaction for a specific logging call
|
|
178
|
+
* @returns LogEngine instance with redaction bypassed
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* LogEngine.withoutRedaction().info('Debug data', sensitiveObject);
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
184
|
withoutRedaction: () => ({
|
|
185
185
|
debug: (message, data) => logger.debugRaw(message, data),
|
|
186
186
|
info: (message, data) => logger.infoRaw(message, data),
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced output handlers for log-engine
|
|
3
|
+
* Provides file, HTTP, and other production-ready output handlers
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import type { FileOutputConfig, HttpOutputConfig } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Secure filesystem operations for logging operations
|
|
9
|
+
*
|
|
10
|
+
* SECURITY NOTE: These functions implement comprehensive path validation and access controls
|
|
11
|
+
* to prevent path traversal attacks, directory injection, and unauthorized file access.
|
|
12
|
+
* ESLint security rules are disabled for specific fs operations because:
|
|
13
|
+
*
|
|
14
|
+
* 1. All paths are validated through validatePath() which:
|
|
15
|
+
* - Prevents directory traversal (../)
|
|
16
|
+
* - Restricts access to predefined safe directories
|
|
17
|
+
* - Blocks access to system directories
|
|
18
|
+
* - Normalizes and resolves paths securely
|
|
19
|
+
*
|
|
20
|
+
* 2. The logging library requires dynamic file paths by design (user-configurable log files)
|
|
21
|
+
* 3. All operations are wrapped in try-catch with comprehensive error handling
|
|
22
|
+
* 4. File operations are restricted to log and temp directories only
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Predefined safe base directories for different operation types
|
|
26
|
+
* Restricted to specific subdirectories to prevent unauthorized access
|
|
27
|
+
*/
|
|
28
|
+
declare const SAFE_BASE_DIRS: {
|
|
29
|
+
readonly LOG_FILES: readonly [string, string, string];
|
|
30
|
+
readonly TEMP_FILES: readonly [string, string, string, string];
|
|
31
|
+
readonly CONFIG_FILES: readonly [string, string, string];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Validates file path with comprehensive security checks
|
|
35
|
+
* Prevents path traversal, restricts to safe directories, blocks system paths
|
|
36
|
+
*/
|
|
37
|
+
declare function validatePath(filePath: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Secure file existence check
|
|
40
|
+
* Uses fs.accessSync instead of fs.existsSync for better security practices
|
|
41
|
+
*/
|
|
42
|
+
declare function secureExistsSync(filePath: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Secure directory creation with recursive option support
|
|
45
|
+
* Restricted to log and temp directories only
|
|
46
|
+
*/
|
|
47
|
+
declare function secureMkdirSync(dirPath: string, options?: {
|
|
48
|
+
recursive?: boolean;
|
|
49
|
+
}): void;
|
|
50
|
+
/**
|
|
51
|
+
* Secure file stat operation
|
|
52
|
+
* Returns file system statistics for validated paths only
|
|
53
|
+
*/
|
|
54
|
+
declare function secureStatSync(filePath: string): fs.Stats;
|
|
55
|
+
/**
|
|
56
|
+
* Secure file write operation
|
|
57
|
+
* Validates path and data before writing to prevent injection attacks
|
|
58
|
+
*/
|
|
59
|
+
declare function secureWriteFileSync(filePath: string, data: string, options?: {
|
|
60
|
+
flag?: string;
|
|
61
|
+
}): void;
|
|
62
|
+
/**
|
|
63
|
+
* Secure file deletion
|
|
64
|
+
* Restricted to log and temp files only for safety
|
|
65
|
+
*/
|
|
66
|
+
declare function secureUnlinkSync(filePath: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Secure file rename/move operation
|
|
69
|
+
* Both source and destination must be in safe directories
|
|
70
|
+
*/
|
|
71
|
+
declare function secureRenameSync(oldPath: string, newPath: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* File output handler with rotation support and concurrency protection
|
|
74
|
+
* Implements atomic file operations and write queuing to prevent corruption
|
|
75
|
+
*/
|
|
76
|
+
export declare class FileOutputHandler {
|
|
77
|
+
private config;
|
|
78
|
+
private currentFileSize;
|
|
79
|
+
private rotationInProgress;
|
|
80
|
+
private writeQueue;
|
|
81
|
+
constructor(config: FileOutputConfig);
|
|
82
|
+
/**
|
|
83
|
+
* Default formatter for file output
|
|
84
|
+
*/
|
|
85
|
+
private defaultFormatter;
|
|
86
|
+
/**
|
|
87
|
+
* Write log to file with rotation support and concurrency protection
|
|
88
|
+
* Queues writes during rotation to prevent file corruption
|
|
89
|
+
*/
|
|
90
|
+
write: (level: string, message: string, data?: unknown) => void;
|
|
91
|
+
/**
|
|
92
|
+
* Write to file with concurrency protection and rotation check
|
|
93
|
+
* If rotation is in progress, messages are queued to prevent corruption
|
|
94
|
+
*/
|
|
95
|
+
private writeToFile;
|
|
96
|
+
/**
|
|
97
|
+
* Process queued writes after rotation completes
|
|
98
|
+
*/
|
|
99
|
+
private processWriteQueue;
|
|
100
|
+
/**
|
|
101
|
+
* Rotate log files when size limit is reached
|
|
102
|
+
* Implements concurrency protection to prevent corruption during rotation
|
|
103
|
+
*/
|
|
104
|
+
private rotateFile;
|
|
105
|
+
/**
|
|
106
|
+
* Clean up resources and process any remaining queued writes
|
|
107
|
+
*/
|
|
108
|
+
destroy(): void;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* HTTP output handler for sending logs to remote endpoints
|
|
112
|
+
*/
|
|
113
|
+
export declare class HttpOutputHandler {
|
|
114
|
+
private config;
|
|
115
|
+
private logBuffer;
|
|
116
|
+
private flushTimeout;
|
|
117
|
+
constructor(config: HttpOutputConfig);
|
|
118
|
+
/**
|
|
119
|
+
* Default formatter for HTTP output
|
|
120
|
+
*/
|
|
121
|
+
private defaultFormatter;
|
|
122
|
+
/**
|
|
123
|
+
* Write log to HTTP endpoint with batching support
|
|
124
|
+
*/
|
|
125
|
+
write: (level: string, message: string, data?: unknown) => void;
|
|
126
|
+
/**
|
|
127
|
+
* Flush buffered logs to HTTP endpoint
|
|
128
|
+
*/
|
|
129
|
+
private flush;
|
|
130
|
+
/**
|
|
131
|
+
* Send HTTP request with appropriate method based on environment
|
|
132
|
+
*/
|
|
133
|
+
private sendHttpRequest;
|
|
134
|
+
/**
|
|
135
|
+
* Fallback HTTP implementation for Node.js environments without fetch
|
|
136
|
+
*/
|
|
137
|
+
private sendHttpRequestNodeJS;
|
|
138
|
+
/**
|
|
139
|
+
* Cleanup method to prevent memory leaks
|
|
140
|
+
*/
|
|
141
|
+
destroy(): void;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Returns a logging handler function based on the specified type and configuration.
|
|
145
|
+
*
|
|
146
|
+
* Supported types are:
|
|
147
|
+
* - `'console'`: Logs to the console using the appropriate method for the log level.
|
|
148
|
+
* - `'silent'`: Returns a no-op handler that discards all logs.
|
|
149
|
+
* - `'file'`: Writes logs to a file with optional rotation; requires `filePath` in config.
|
|
150
|
+
* - `'http'`: Sends logs to a remote HTTP endpoint; requires `url` in config.
|
|
151
|
+
*
|
|
152
|
+
* If required configuration is missing or initialization fails, logs an error and returns either a fallback handler or `null`.
|
|
153
|
+
*
|
|
154
|
+
* @param type - The type of output handler to create (`'console'`, `'silent'`, `'file'`, or `'http'`)
|
|
155
|
+
* @returns A log handler function or `null` if the handler cannot be created
|
|
156
|
+
*/
|
|
157
|
+
export declare function createBuiltInHandler(type: string, config?: Record<string, unknown>): ((level: string, message: string, data?: unknown) => void) | null;
|
|
158
|
+
export { secureExistsSync, secureMkdirSync, secureStatSync, secureWriteFileSync, secureUnlinkSync, secureRenameSync, validatePath, SAFE_BASE_DIRS };
|
|
159
|
+
//# sourceMappingURL=advanced-outputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-outputs.d.ts","sourceRoot":"","sources":["../../src/logger/advanced-outputs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAuBnE;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,QAAA,MAAM,cAAc;;;;CAIV,CAAC;AAEX;;;GAGG;AACH,iBAAS,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqC9C;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CASnD;AAED;;;GAGG;AACH,iBAAS,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAWjF;AAED;;;GAGG;AACH,iBAAS,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,CAUlD;AAED;;;GAGG;AACH,iBAAS,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgB9F;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkBhD;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBhE;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,UAAU,CAAiE;gBAEvE,MAAM,EAAE,gBAAgB;IA6BpC;;SAEK;IACL,OAAO,CAAC,gBAAgB,CAItB;IAEF;;;SAGK;IACE,KAAK,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,OAAO,OAAO,KAAG,IAAI,CAcnE;IAEF;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;SAGK;IACL,OAAO,CAAC,UAAU;IAwClB;;OAEG;IACI,OAAO,IAAI,IAAI;CAUvB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAA+B;gBAEvC,MAAM,EAAE,gBAAgB;IAYpC;;SAEK;IACL,OAAO,CAAC,gBAAgB,CAStB;IAEF;;SAEK;IACE,KAAK,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,OAAO,OAAO,KAAG,IAAI,CA0BnE;IAEF;;SAEK;IACL,OAAO,CAAC,KAAK;IAqBb;;SAEK;IACL,OAAO,CAAC,eAAe;IAiBvB;;SAEK;IACL,OAAO,CAAC,qBAAqB;IAgD7B;;OAEG;IACI,OAAO,IAAI,IAAI;CAQvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CA2CtJ;AAGD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACf,CAAC"}
|