tywrap 0.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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +263 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.d.ts +41 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +234 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/core/analyzer.d.ts +63 -0
  12. package/dist/core/analyzer.d.ts.map +1 -0
  13. package/dist/core/analyzer.js +676 -0
  14. package/dist/core/analyzer.js.map +1 -0
  15. package/dist/core/discovery.d.ts +85 -0
  16. package/dist/core/discovery.d.ts.map +1 -0
  17. package/dist/core/discovery.js +344 -0
  18. package/dist/core/discovery.js.map +1 -0
  19. package/dist/core/generator.d.ts +37 -0
  20. package/dist/core/generator.d.ts.map +1 -0
  21. package/dist/core/generator.js +368 -0
  22. package/dist/core/generator.js.map +1 -0
  23. package/dist/core/mapper.d.ts +40 -0
  24. package/dist/core/mapper.d.ts.map +1 -0
  25. package/dist/core/mapper.js +401 -0
  26. package/dist/core/mapper.js.map +1 -0
  27. package/dist/core/validation.d.ts +79 -0
  28. package/dist/core/validation.d.ts.map +1 -0
  29. package/dist/core/validation.js +486 -0
  30. package/dist/core/validation.js.map +1 -0
  31. package/dist/index.d.ts +26 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +29 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/runtime/base.d.ts +12 -0
  36. package/dist/runtime/base.d.ts.map +1 -0
  37. package/dist/runtime/base.js +6 -0
  38. package/dist/runtime/base.js.map +1 -0
  39. package/dist/runtime/errors.d.ts +17 -0
  40. package/dist/runtime/errors.d.ts.map +1 -0
  41. package/dist/runtime/errors.js +21 -0
  42. package/dist/runtime/errors.js.map +1 -0
  43. package/dist/runtime/http.d.ts +22 -0
  44. package/dist/runtime/http.d.ts.map +1 -0
  45. package/dist/runtime/http.js +79 -0
  46. package/dist/runtime/http.js.map +1 -0
  47. package/dist/runtime/index.d.ts +8 -0
  48. package/dist/runtime/index.d.ts.map +1 -0
  49. package/dist/runtime/index.js +17 -0
  50. package/dist/runtime/index.js.map +1 -0
  51. package/dist/runtime/node.d.ts +48 -0
  52. package/dist/runtime/node.d.ts.map +1 -0
  53. package/dist/runtime/node.js +328 -0
  54. package/dist/runtime/node.js.map +1 -0
  55. package/dist/runtime/optimized-node.d.ts +131 -0
  56. package/dist/runtime/optimized-node.d.ts.map +1 -0
  57. package/dist/runtime/optimized-node.js +622 -0
  58. package/dist/runtime/optimized-node.js.map +1 -0
  59. package/dist/runtime/protocol.d.ts +3 -0
  60. package/dist/runtime/protocol.d.ts.map +1 -0
  61. package/dist/runtime/protocol.js +3 -0
  62. package/dist/runtime/protocol.js.map +1 -0
  63. package/dist/runtime/pyodide.d.ts +27 -0
  64. package/dist/runtime/pyodide.d.ts.map +1 -0
  65. package/dist/runtime/pyodide.js +191 -0
  66. package/dist/runtime/pyodide.js.map +1 -0
  67. package/dist/tools/python_suite.js +173 -0
  68. package/dist/tools/python_suite.js.map +1 -0
  69. package/dist/types/index.d.ts +299 -0
  70. package/dist/types/index.d.ts.map +1 -0
  71. package/dist/types/index.js +5 -0
  72. package/dist/types/index.js.map +1 -0
  73. package/dist/tywrap.d.ts +29 -0
  74. package/dist/tywrap.d.ts.map +1 -0
  75. package/dist/tywrap.js +589 -0
  76. package/dist/tywrap.js.map +1 -0
  77. package/dist/utils/bundle-optimizer.d.ts +182 -0
  78. package/dist/utils/bundle-optimizer.d.ts.map +1 -0
  79. package/dist/utils/bundle-optimizer.js +680 -0
  80. package/dist/utils/bundle-optimizer.js.map +1 -0
  81. package/dist/utils/cache.d.ts +149 -0
  82. package/dist/utils/cache.d.ts.map +1 -0
  83. package/dist/utils/cache.js +492 -0
  84. package/dist/utils/cache.js.map +1 -0
  85. package/dist/utils/codec.d.ts +94 -0
  86. package/dist/utils/codec.d.ts.map +1 -0
  87. package/dist/utils/codec.js +150 -0
  88. package/dist/utils/codec.js.map +1 -0
  89. package/dist/utils/logger.d.ts +42 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +140 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/memory-profiler.d.ts +123 -0
  94. package/dist/utils/memory-profiler.d.ts.map +1 -0
  95. package/dist/utils/memory-profiler.js +426 -0
  96. package/dist/utils/memory-profiler.js.map +1 -0
  97. package/dist/utils/parallel-processor.d.ts +146 -0
  98. package/dist/utils/parallel-processor.d.ts.map +1 -0
  99. package/dist/utils/parallel-processor.js +636 -0
  100. package/dist/utils/parallel-processor.js.map +1 -0
  101. package/dist/utils/python.d.ts +8 -0
  102. package/dist/utils/python.d.ts.map +1 -0
  103. package/dist/utils/python.js +56 -0
  104. package/dist/utils/python.js.map +1 -0
  105. package/dist/utils/runtime.d.ts +153 -0
  106. package/dist/utils/runtime.d.ts.map +1 -0
  107. package/dist/utils/runtime.js +519 -0
  108. package/dist/utils/runtime.js.map +1 -0
  109. package/package.json +136 -0
  110. package/runtime/python_bridge.py +476 -0
  111. package/src/cli.ts +331 -0
  112. package/src/config/index.ts +289 -0
  113. package/src/core/analyzer.ts +788 -0
  114. package/src/core/discovery.ts +415 -0
  115. package/src/core/generator.ts +447 -0
  116. package/src/core/mapper.ts +504 -0
  117. package/src/core/validation.ts +693 -0
  118. package/src/index.ts +83 -0
  119. package/src/runtime/base.ts +32 -0
  120. package/src/runtime/errors.ts +19 -0
  121. package/src/runtime/http.ts +132 -0
  122. package/src/runtime/index.ts +24 -0
  123. package/src/runtime/node.ts +431 -0
  124. package/src/runtime/optimized-node.ts +838 -0
  125. package/src/runtime/protocol.ts +2 -0
  126. package/src/runtime/pyodide.ts +228 -0
  127. package/src/types/global.d.ts +60 -0
  128. package/src/types/index.ts +410 -0
  129. package/src/tywrap.ts +669 -0
  130. package/src/utils/bundle-optimizer.ts +876 -0
  131. package/src/utils/cache.ts +634 -0
  132. package/src/utils/codec.ts +275 -0
  133. package/src/utils/logger.ts +201 -0
  134. package/src/utils/memory-profiler.ts +582 -0
  135. package/src/utils/parallel-processor.ts +879 -0
  136. package/src/utils/python.ts +79 -0
  137. package/src/utils/runtime.ts +616 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/utils/python.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA6BD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BjG"}
@@ -0,0 +1,56 @@
1
+ import { detectRuntime, pathUtils, isAbsolutePath, getPythonExecutableName, getVenvBinDir, getVenvPythonExe, } from './runtime.js';
2
+ let nodePathModule;
3
+ async function loadNodePathModule() {
4
+ if (nodePathModule !== undefined) {
5
+ return nodePathModule;
6
+ }
7
+ const runtime = detectRuntime();
8
+ if (runtime.name === 'node' || runtime.name === 'bun') {
9
+ try {
10
+ nodePathModule = await import('node:path');
11
+ return nodePathModule;
12
+ }
13
+ catch {
14
+ try {
15
+ nodePathModule = await import('path');
16
+ return nodePathModule;
17
+ }
18
+ catch {
19
+ nodePathModule = null;
20
+ return nodePathModule;
21
+ }
22
+ }
23
+ }
24
+ nodePathModule = null;
25
+ return nodePathModule;
26
+ }
27
+ export function getDefaultPythonPath() {
28
+ return getPythonExecutableName();
29
+ }
30
+ export async function resolvePythonExecutable(options = {}) {
31
+ const pythonPath = options.pythonPath?.trim();
32
+ const virtualEnv = options.virtualEnv?.trim();
33
+ if (virtualEnv) {
34
+ const usesDefaultPython = !pythonPath || pythonPath === 'python3' || pythonPath === 'python';
35
+ if (usesDefaultPython) {
36
+ const cwd = options.cwd ??
37
+ (typeof process !== 'undefined' && typeof process.cwd === 'function' ? process.cwd() : '.');
38
+ const binDir = getVenvBinDir();
39
+ const exe = getVenvPythonExe();
40
+ const pathMod = await loadNodePathModule();
41
+ if (pathMod) {
42
+ const venvRoot = pathMod.resolve(cwd, virtualEnv);
43
+ return pathMod.join(venvRoot, binDir, exe);
44
+ }
45
+ const venvRoot = isAbsolutePath(virtualEnv)
46
+ ? pathUtils.join(virtualEnv)
47
+ : pathUtils.join(cwd, virtualEnv);
48
+ return pathUtils.join(venvRoot, binDir, exe);
49
+ }
50
+ }
51
+ if (pythonPath) {
52
+ return pythonPath;
53
+ }
54
+ return getDefaultPythonPath();
55
+ }
56
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/utils/python.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EAET,cAAc,EACd,uBAAuB,EACvB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAUtB,IAAI,cAA6C,CAAC;AAElD,KAAK,UAAU,kBAAkB;IAC/B,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3C,OAAO,cAAc,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtC,OAAO,cAAc,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc,GAAG,IAAI,CAAC;gBACtB,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;IACtB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAAgC,EAAE;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAE9C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,iBAAiB,GAAG,CAAC,UAAU,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,CAAC;QAC7F,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;gBACX,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAE3C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAClD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC;gBACzC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC5B,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Runtime detection utilities for Node.js, Deno, Bun, and Browser environments
3
+ */
4
+ export type Runtime = 'node' | 'deno' | 'bun' | 'browser' | 'unknown';
5
+ interface RuntimeInfo {
6
+ name: Runtime;
7
+ version?: string;
8
+ capabilities: RuntimeCapabilities;
9
+ }
10
+ interface RuntimeCapabilities {
11
+ filesystem: boolean;
12
+ subprocess: boolean;
13
+ webassembly: boolean;
14
+ webworkers: boolean;
15
+ sharedArrayBuffer: boolean;
16
+ fetch: boolean;
17
+ }
18
+ /**
19
+ * Clear runtime cache (for testing purposes only)
20
+ * @internal
21
+ */
22
+ export declare function clearRuntimeCache(): void;
23
+ /**
24
+ * Detect the current JavaScript runtime environment
25
+ * Results are cached and frozen to prevent external mutation
26
+ */
27
+ export declare function detectRuntime(): RuntimeInfo;
28
+ /**
29
+ * Check if running in Node.js
30
+ */
31
+ export declare function isNodejs(): boolean;
32
+ /**
33
+ * Check if running in Deno
34
+ */
35
+ export declare function isDeno(): boolean;
36
+ /**
37
+ * Check if running in Bun
38
+ */
39
+ export declare function isBun(): boolean;
40
+ /**
41
+ * Check if running in browser
42
+ */
43
+ export declare function isBrowser(): boolean;
44
+ /**
45
+ * Get runtime capabilities
46
+ */
47
+ export declare function getRuntimeCapabilities(): RuntimeCapabilities;
48
+ /**
49
+ * Check if a specific capability is supported
50
+ */
51
+ export declare function hasCapability(capability: keyof RuntimeCapabilities): boolean;
52
+ /**
53
+ * Get the best runtime strategy for Python execution
54
+ */
55
+ export declare function getBestPythonRuntime(): 'node' | 'pyodide' | 'http';
56
+ /**
57
+ * Runtime-specific path utilities
58
+ */
59
+ export declare const pathUtils: {
60
+ /**
61
+ * Join paths in a cross-runtime way
62
+ */
63
+ join(...segments: string[]): string;
64
+ /**
65
+ * Join paths asynchronously with enhanced Node.js support
66
+ */
67
+ joinAsync(...segments: string[]): Promise<string>;
68
+ /**
69
+ * Resolve absolute path in a cross-runtime way (synchronous)
70
+ */
71
+ resolve(path: string): string;
72
+ /**
73
+ * Resolve absolute path in a cross-runtime way (asynchronous)
74
+ */
75
+ resolveAsync(path: string): Promise<string>;
76
+ };
77
+ /**
78
+ * Cross-runtime file system operations
79
+ */
80
+ export declare const fsUtils: {
81
+ /**
82
+ * Check if file system operations are available
83
+ */
84
+ isAvailable(): boolean;
85
+ /**
86
+ * Read file in a cross-runtime way
87
+ */
88
+ readFile(path: string): Promise<string>;
89
+ /**
90
+ * Write file in a cross-runtime way
91
+ */
92
+ writeFile(path: string, content: string): Promise<void>;
93
+ };
94
+ /**
95
+ * Cross-runtime subprocess execution
96
+ */
97
+ export declare const processUtils: {
98
+ /**
99
+ * Check if subprocess operations are available
100
+ */
101
+ isAvailable(): boolean;
102
+ /**
103
+ * Execute command in a cross-runtime way
104
+ */
105
+ exec(command: string, args?: string[]): Promise<{
106
+ stdout: string;
107
+ stderr: string;
108
+ code: number;
109
+ }>;
110
+ };
111
+ /**
112
+ * Platform detection utilities
113
+ */
114
+ /**
115
+ * Check if running on Windows
116
+ */
117
+ export declare function isWindows(): boolean;
118
+ /**
119
+ * Check if running on macOS
120
+ */
121
+ export declare function isMacOS(): boolean;
122
+ /**
123
+ * Check if running on Linux
124
+ */
125
+ export declare function isLinux(): boolean;
126
+ /**
127
+ * Check if a path is absolute
128
+ */
129
+ export declare function isAbsolutePath(path: string): boolean;
130
+ /**
131
+ * Get the path separator for the current platform
132
+ */
133
+ export declare function getPathSeparator(): string;
134
+ /**
135
+ * Get the default Python executable name for the current platform
136
+ */
137
+ export declare function getPythonExecutableName(): string;
138
+ /**
139
+ * Get the virtual environment bin directory name
140
+ */
141
+ export declare function getVenvBinDir(): string;
142
+ /**
143
+ * Get the Python executable filename in a virtual environment
144
+ */
145
+ export declare function getVenvPythonExe(): string;
146
+ /**
147
+ * Cross-runtime hashing and stable stringify utilities
148
+ */
149
+ export declare const hashUtils: {
150
+ sha256Hex(text: string): Promise<string>;
151
+ };
152
+ export {};
153
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED,UAAU,mBAAmB;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAsG3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,mBAAmB,GAAG,OAAO,CAG5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,GAAG,MAAM,CAalE;AAwDD;;GAEG;AACH,eAAO,MAAM,SAAS;IACpB;;OAEG;sBACe,MAAM,EAAE,GAAG,MAAM;IAUnC;;OAEG;2BAC0B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBvD;;OAEG;kBACW,MAAM,GAAG,MAAM;IAoB7B;;OAEG;uBACsB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiBlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB;;OAEG;mBACY,OAAO;IAItB;;OAEG;mBACkB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB7C;;OAEG;oBACmB,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B9D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB;;OAEG;mBACY,OAAO;IAItB;;OAEG;kBAEQ,MAAM,SACT,MAAM,EAAE,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAuE7D,CAAC;AAEF;;GAEG;AAEH;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAMnC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAMjC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAMjC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;oBACE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA0B/C,CAAC"}