@volter/browser-wali 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.
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/browser-wali-command.d.ts +22 -0
- package/dist/browser-wali-command.d.ts.map +1 -0
- package/dist/browser-wali-command.js +44 -0
- package/dist/browser-wali-command.js.map +1 -0
- package/dist/capabilities.d.ts +3 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +23 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/coherent-file-locks.d.ts +23 -0
- package/dist/coherent-file-locks.d.ts.map +1 -0
- package/dist/coherent-file-locks.js +134 -0
- package/dist/coherent-file-locks.js.map +1 -0
- package/dist/events.d.ts +30 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +289 -0
- package/dist/events.js.map +1 -0
- package/dist/filesystem-protocol.d.ts +48 -0
- package/dist/filesystem-protocol.d.ts.map +1 -0
- package/dist/filesystem-protocol.js +27 -0
- package/dist/filesystem-protocol.js.map +1 -0
- package/dist/filesystem-remote.d.ts +65 -0
- package/dist/filesystem-remote.d.ts.map +1 -0
- package/dist/filesystem-remote.js +271 -0
- package/dist/filesystem-remote.js.map +1 -0
- package/dist/filesystem-worker.d.ts +2 -0
- package/dist/filesystem-worker.d.ts.map +1 -0
- package/dist/filesystem-worker.js +269 -0
- package/dist/filesystem-worker.js.map +1 -0
- package/dist/filesystem.d.ts +115 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +1179 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +7 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +32 -0
- package/dist/inspect.js.map +1 -0
- package/dist/local-sockets.d.ts +13 -0
- package/dist/local-sockets.d.ts.map +1 -0
- package/dist/local-sockets.js +139 -0
- package/dist/local-sockets.js.map +1 -0
- package/dist/loopback-host.d.ts +14 -0
- package/dist/loopback-host.d.ts.map +1 -0
- package/dist/loopback-host.js +476 -0
- package/dist/loopback-host.js.map +1 -0
- package/dist/loopback-protocol.d.ts +41 -0
- package/dist/loopback-protocol.d.ts.map +1 -0
- package/dist/loopback-protocol.js +2 -0
- package/dist/loopback-protocol.js.map +1 -0
- package/dist/memory.d.ts +39 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +520 -0
- package/dist/memory.js.map +1 -0
- package/dist/module-layout.d.ts +9 -0
- package/dist/module-layout.d.ts.map +1 -0
- package/dist/module-layout.js +105 -0
- package/dist/module-layout.js.map +1 -0
- package/dist/network-protocol.d.ts +43 -0
- package/dist/network-protocol.d.ts.map +1 -0
- package/dist/network-protocol.js +26 -0
- package/dist/network-protocol.js.map +1 -0
- package/dist/network-worker.d.ts +2 -0
- package/dist/network-worker.d.ts.map +1 -0
- package/dist/network-worker.js +943 -0
- package/dist/network-worker.js.map +1 -0
- package/dist/network.d.ts +52 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +427 -0
- package/dist/network.js.map +1 -0
- package/dist/process-adapter.d.ts +14 -0
- package/dist/process-adapter.d.ts.map +1 -0
- package/dist/process-adapter.js +45 -0
- package/dist/process-adapter.js.map +1 -0
- package/dist/process-bridge.d.ts +54 -0
- package/dist/process-bridge.d.ts.map +1 -0
- package/dist/process-bridge.js +150 -0
- package/dist/process-bridge.js.map +1 -0
- package/dist/program.d.ts +49 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +204 -0
- package/dist/program.js.map +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +528 -0
- package/dist/runtime.js.map +1 -0
- package/dist/shared-pipes.d.ts +44 -0
- package/dist/shared-pipes.d.ts.map +1 -0
- package/dist/shared-pipes.js +306 -0
- package/dist/shared-pipes.js.map +1 -0
- package/dist/snapshot-filesystem.d.ts +31 -0
- package/dist/snapshot-filesystem.d.ts.map +1 -0
- package/dist/snapshot-filesystem.js +247 -0
- package/dist/snapshot-filesystem.js.map +1 -0
- package/dist/stdin.d.ts +36 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +143 -0
- package/dist/stdin.js.map +1 -0
- package/dist/symlink.d.ts +8 -0
- package/dist/symlink.d.ts.map +1 -0
- package/dist/symlink.js +66 -0
- package/dist/symlink.js.map +1 -0
- package/dist/system.d.ts +41 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +305 -0
- package/dist/system.js.map +1 -0
- package/dist/thread-coordinator-worker.d.ts +25 -0
- package/dist/thread-coordinator-worker.d.ts.map +1 -0
- package/dist/thread-coordinator-worker.js +49 -0
- package/dist/thread-coordinator-worker.js.map +1 -0
- package/dist/thread-worker.d.ts +2 -0
- package/dist/thread-worker.d.ts.map +1 -0
- package/dist/thread-worker.js +725 -0
- package/dist/thread-worker.js.map +1 -0
- package/dist/threads.d.ts +44 -0
- package/dist/threads.d.ts.map +1 -0
- package/dist/threads.js +154 -0
- package/dist/threads.js.map +1 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/websocket-peer.d.ts +38 -0
- package/dist/websocket-peer.d.ts.map +1 -0
- package/dist/websocket-peer.js +407 -0
- package/dist/websocket-peer.js.map +1 -0
- package/dist/worker-program-protocol.d.ts +71 -0
- package/dist/worker-program-protocol.d.ts.map +1 -0
- package/dist/worker-program-protocol.js +2 -0
- package/dist/worker-program-protocol.js.map +1 -0
- package/dist/worker-program-worker.d.ts +2 -0
- package/dist/worker-program-worker.d.ts.map +1 -0
- package/dist/worker-program-worker.js +109 -0
- package/dist/worker-program-worker.js.map +1 -0
- package/dist/worker-program.d.ts +58 -0
- package/dist/worker-program.d.ts.map +1 -0
- package/dist/worker-program.js +425 -0
- package/dist/worker-program.js.map +1 -0
- package/package.json +23 -0
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import { assertWaliModule, compileWaliModule, inspectWaliModule } from "./inspect.js";
|
|
2
|
+
import { createStdioAliasRegistry, WaliFileDescriptorTable } from "./filesystem.js";
|
|
3
|
+
import { createWaliAllocatorControl, createWaliSharedMmapRegistry, WaliMemoryManager } from "./memory.js";
|
|
4
|
+
import { WaliPthreadProcessExit, WaliSystemHost } from "./system.js";
|
|
5
|
+
import { WaliEventHost } from "./events.js";
|
|
6
|
+
import { createImportedMemory } from "./module-layout.js";
|
|
7
|
+
import { WaliThreadPool } from "./threads.js";
|
|
8
|
+
import { WaliLocalSocketHost } from "./local-sockets.js";
|
|
9
|
+
import { WaliNetworkCoordinator, WaliNetworkHost } from "./network.js";
|
|
10
|
+
import { BufferedWaliStdin, SharedWaliStdinReader } from "./stdin.js";
|
|
11
|
+
import { WaliFilesystemCoordinator, WaliSharedFileDescriptorHost } from "./filesystem-remote.js";
|
|
12
|
+
import { createWaliSharedPipeState, WaliSharedPipeHost } from "./shared-pipes.js";
|
|
13
|
+
import { applyProcessFilesystemPatch, BROWSER_PROCESS_RESPONSE_BYTES, closeSharedPipe, decodeProcessSnapshot, retainSharedPipe, } from "./process-bridge.js";
|
|
14
|
+
import { BrowserFileLockClient } from "@volter/browser-runtime/browser-file-locks.js";
|
|
15
|
+
import { BrowserFileCoherenceClient } from "@volter/browser-runtime/browser-file-coherence.js";
|
|
16
|
+
import { WaliCoherentFileLockClient } from "./coherent-file-locks.js";
|
|
17
|
+
const EBADF = 9n;
|
|
18
|
+
const EINVAL = 22n;
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
const decoder = new TextDecoder();
|
|
21
|
+
const WNOHANG = 1;
|
|
22
|
+
export class UnsupportedWaliImportError extends Error {
|
|
23
|
+
imports;
|
|
24
|
+
constructor(imports) {
|
|
25
|
+
super(`Unsupported WALI imports: ${imports.join(", ")}`);
|
|
26
|
+
this.imports = imports;
|
|
27
|
+
this.name = "UnsupportedWaliImportError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
class WaliProcessExit extends Error {
|
|
31
|
+
code;
|
|
32
|
+
constructor(code) {
|
|
33
|
+
super(`WALI process exited with status ${code}`);
|
|
34
|
+
this.code = code;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class BrowserWaliRuntime {
|
|
38
|
+
async run(source, options = {}) {
|
|
39
|
+
const module = await compileWaliModule(source);
|
|
40
|
+
const descriptors = inspectWaliModule(module);
|
|
41
|
+
assertWaliModule(descriptors);
|
|
42
|
+
const waliDescriptors = descriptors.filter((descriptor) => descriptor.module === "wali");
|
|
43
|
+
const stdout = [];
|
|
44
|
+
const stderr = [];
|
|
45
|
+
const stdin = typeof options.stdin === "object" && options.stdin !== null && "read" in options.stdin
|
|
46
|
+
? options.stdin
|
|
47
|
+
: new BufferedWaliStdin(typeof options.stdin === "string" ? encoder.encode(options.stdin) : options.stdin ?? new Uint8Array());
|
|
48
|
+
const argv = options.argv?.length ? [...options.argv] : ["wali-program"];
|
|
49
|
+
const argvBytes = argv.map((argument) => encoder.encode(`${argument}\0`));
|
|
50
|
+
const pid = normalizePid(options.pid);
|
|
51
|
+
const signalActions = new Map();
|
|
52
|
+
let instance;
|
|
53
|
+
let threadPool;
|
|
54
|
+
let networkCoordinator;
|
|
55
|
+
let filesystemCoordinator;
|
|
56
|
+
const importedMemory = createImportedMemory(source, options.memory);
|
|
57
|
+
const stdioAliasRegistry = createStdioAliasRegistry();
|
|
58
|
+
// Word 0 is the fatal flag. Word 1 retains the first failing worker slot,
|
|
59
|
+
// so a later futex wake cannot hide the original pthread diagnostic.
|
|
60
|
+
// Word 0: 0 healthy, 1 worker failure, 2 pthread exit_group.
|
|
61
|
+
// Word 1: first failing worker slot. Word 2: process exit code.
|
|
62
|
+
const pthreadFatal = new Int32Array(new SharedArrayBuffer(3 * Int32Array.BYTES_PER_ELEMENT));
|
|
63
|
+
Atomics.store(pthreadFatal, 1, -1);
|
|
64
|
+
const sharedPipeState = createWaliSharedPipeState();
|
|
65
|
+
const memory = () => {
|
|
66
|
+
if (importedMemory)
|
|
67
|
+
return importedMemory;
|
|
68
|
+
const exported = instance?.exports.memory;
|
|
69
|
+
if (!(exported instanceof WebAssembly.Memory))
|
|
70
|
+
throw new Error("WALI module does not export linear memory.");
|
|
71
|
+
return exported;
|
|
72
|
+
};
|
|
73
|
+
const view = () => new DataView(memory().buffer);
|
|
74
|
+
const bytes = () => new Uint8Array(memory().buffer);
|
|
75
|
+
const copyOut = (pointer, length) => {
|
|
76
|
+
assertMemoryRange(memory(), pointer, length);
|
|
77
|
+
return bytes().slice(pointer, pointer + length);
|
|
78
|
+
};
|
|
79
|
+
const copyIn = (pointer, value) => {
|
|
80
|
+
assertMemoryRange(memory(), pointer, value.byteLength);
|
|
81
|
+
bytes().set(value, pointer);
|
|
82
|
+
};
|
|
83
|
+
const emit = (fd, value) => {
|
|
84
|
+
if (fd === 1) {
|
|
85
|
+
stdout.push(value);
|
|
86
|
+
options.onStdout?.(value.slice());
|
|
87
|
+
}
|
|
88
|
+
else if (fd === 2) {
|
|
89
|
+
stderr.push(value);
|
|
90
|
+
options.onStderr?.(value.slice());
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return -EBADF;
|
|
94
|
+
}
|
|
95
|
+
return BigInt(value.byteLength);
|
|
96
|
+
};
|
|
97
|
+
const exit = (status) => { throw new WaliProcessExit(status & 0xff); };
|
|
98
|
+
const executablePath = options.executablePath
|
|
99
|
+
?? (argv[0].startsWith("/") ? argv[0] : `/usr/bin/${argv[0]}`);
|
|
100
|
+
const threaded = waliDescriptors.some((descriptor) => descriptor.name === "__wasm_thread_spawn");
|
|
101
|
+
const mmapCursor = createWaliAllocatorControl();
|
|
102
|
+
const sharedMmapRegistry = createWaliSharedMmapRegistry();
|
|
103
|
+
if (threaded && options.filesystem?.toSnapshot && options.filesystem.replaceSnapshot) {
|
|
104
|
+
if (!importedMemory) {
|
|
105
|
+
throw new Error("A threaded WALI module must import its shared process memory.");
|
|
106
|
+
}
|
|
107
|
+
filesystemCoordinator = await WaliFilesystemCoordinator.create(options.filesystem.toSnapshot(), {
|
|
108
|
+
memory: importedMemory,
|
|
109
|
+
cwd: options.cwd ?? "/",
|
|
110
|
+
executablePath,
|
|
111
|
+
pid,
|
|
112
|
+
...(options.filesystemUpdatePort ? { updatePort: options.filesystemUpdatePort } : {}),
|
|
113
|
+
...(options.fileLocks ? { fileLocks: options.fileLocks } : {}),
|
|
114
|
+
...(options.fileCoherence ? { fileCoherence: options.fileCoherence } : {}),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const runtimeFilesystem = filesystemCoordinator?.filesystem() ?? options.filesystem;
|
|
118
|
+
const syncFilesystem = () => {
|
|
119
|
+
if (filesystemCoordinator && options.filesystem?.replaceSnapshot) {
|
|
120
|
+
options.filesystem.replaceSnapshot(filesystemCoordinator.snapshot());
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const fileDescriptors = new WaliFileDescriptorTable({
|
|
124
|
+
...(runtimeFilesystem ? { filesystem: runtimeFilesystem } : {}),
|
|
125
|
+
cwd: options.cwd ?? "/",
|
|
126
|
+
stdin,
|
|
127
|
+
executablePath,
|
|
128
|
+
memory,
|
|
129
|
+
emit,
|
|
130
|
+
stdioAliasRegistry,
|
|
131
|
+
pid,
|
|
132
|
+
...(!filesystemCoordinator && options.fileLocks ? {
|
|
133
|
+
fileLocks: options.fileCoherence
|
|
134
|
+
? new WaliCoherentFileLockClient(new BrowserFileLockClient(options.fileLocks.channel), new BrowserFileCoherenceClient(options.fileCoherence), runtimeFilesystem)
|
|
135
|
+
: new BrowserFileLockClient(options.fileLocks.channel),
|
|
136
|
+
lockOwner: options.fileLocks.owner,
|
|
137
|
+
} : {}),
|
|
138
|
+
...(filesystemCoordinator ? { specialDescriptorMinimum: 10_000, descriptorMaximum: 19_999 } : {}),
|
|
139
|
+
});
|
|
140
|
+
const environmentFile = fileDescriptors.writeEnvironmentFile(options.env ?? {}, pid);
|
|
141
|
+
const sharedFileHost = filesystemCoordinator
|
|
142
|
+
? new WaliSharedFileDescriptorHost(filesystemCoordinator.filesystem(), stdioAliasRegistry) : undefined;
|
|
143
|
+
const memoryManager = new WaliMemoryManager(memory, (fd, offset, length) => sharedFileHost?.readForMapping(fd, offset, length)
|
|
144
|
+
?? fileDescriptors.readForMapping(fd, offset, length), mmapCursor, (fd) => sharedFileHost?.mappingPath(fd) ?? fileDescriptors.mappingPath(fd), (path, offset, value) => sharedFileHost?.writeForMapping(path, offset, value)
|
|
145
|
+
?? fileDescriptors.writeForMapping(path, offset, value), sharedMmapRegistry);
|
|
146
|
+
const systemHost = new WaliSystemHost(memory, pid, stdin, pthreadFatal);
|
|
147
|
+
if (options.network) {
|
|
148
|
+
networkCoordinator = await WaliNetworkCoordinator.create(options.network, sharedPipeState, stdin instanceof SharedWaliStdinReader ? stdin.buffer : undefined, stdioAliasRegistry.buffer);
|
|
149
|
+
}
|
|
150
|
+
const networkHost = networkCoordinator ? new WaliNetworkHost(memory, networkCoordinator.createChannel()) : undefined;
|
|
151
|
+
const sharedPipeHost = new WaliSharedPipeHost(memory, sharedPipeState);
|
|
152
|
+
const eventHost = new WaliEventHost(memory, fileDescriptors, (fd, events) => sharedPipeHost.pollDescriptor(fd, events) ?? (networkHost?.isNetworkFd(fd)
|
|
153
|
+
? networkHost.pollFd(fd, events) : undefined));
|
|
154
|
+
const localSocketHost = new WaliLocalSocketHost(memory, fileDescriptors);
|
|
155
|
+
const localFileImports = fileDescriptors.imports();
|
|
156
|
+
const fileImports = sharedFileHost?.imports(localFileImports) ?? localFileImports;
|
|
157
|
+
const pipeImports = sharedPipeHost.imports({ ...localSocketHost.imports(), ...fileImports });
|
|
158
|
+
const eventImports = eventHost.imports();
|
|
159
|
+
const systemImports = systemHost.imports();
|
|
160
|
+
const childProcesses = new Map();
|
|
161
|
+
const nextChildPid = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
|
|
162
|
+
Atomics.store(nextChildPid, 0, Math.max(pid + 1, 10_000));
|
|
163
|
+
const readCString = (pointer) => {
|
|
164
|
+
if (!Number.isSafeInteger(pointer) || pointer <= 0 || pointer >= bytes().byteLength) {
|
|
165
|
+
throw new WebAssembly.RuntimeError("WALI process string pointer is out of bounds.");
|
|
166
|
+
}
|
|
167
|
+
const end = bytes().indexOf(0, pointer);
|
|
168
|
+
if (end < 0 || end - pointer > 1024 * 1024)
|
|
169
|
+
throw new WebAssembly.RuntimeError("WALI process string is not terminated.");
|
|
170
|
+
return decoder.decode(bytes().slice(pointer, end));
|
|
171
|
+
};
|
|
172
|
+
const readCStringArray = (pointer) => {
|
|
173
|
+
if (pointer === 0)
|
|
174
|
+
return [];
|
|
175
|
+
const values = [];
|
|
176
|
+
for (let index = 0; index < 65_536; index += 1) {
|
|
177
|
+
assertMemoryRange(memory(), pointer + index * 4, 4);
|
|
178
|
+
const item = view().getUint32(pointer + index * 4, true);
|
|
179
|
+
if (item === 0)
|
|
180
|
+
return values;
|
|
181
|
+
values.push(readCString(item));
|
|
182
|
+
}
|
|
183
|
+
throw new WebAssembly.RuntimeError("WALI process string array is not terminated.");
|
|
184
|
+
};
|
|
185
|
+
const exportPipe = (fd, role) => {
|
|
186
|
+
const handle = sharedPipeHost.exportBrowserProcessPipe(fd) ?? fileDescriptors.exportBrowserProcessPipe(fd);
|
|
187
|
+
if (!handle || handle.role !== role)
|
|
188
|
+
return;
|
|
189
|
+
return retainSharedPipe(handle);
|
|
190
|
+
};
|
|
191
|
+
const applyChildSnapshot = (process) => {
|
|
192
|
+
if (process.snapshotApplied)
|
|
193
|
+
return;
|
|
194
|
+
process.snapshotApplied = true;
|
|
195
|
+
const patch = decodeProcessSnapshot(process);
|
|
196
|
+
if (patch) {
|
|
197
|
+
if (filesystemCoordinator)
|
|
198
|
+
applyProcessFilesystemPatch(filesystemCoordinator.filesystem(), patch);
|
|
199
|
+
if (options.filesystem)
|
|
200
|
+
applyProcessFilesystemPatch(options.filesystem, patch);
|
|
201
|
+
const snapshot = options.filesystem?.toSnapshot?.();
|
|
202
|
+
if (snapshot)
|
|
203
|
+
options.browserProcess?.restore?.(snapshot);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const waitForChild = (requestedPid, statusPointer, optionsValue) => {
|
|
207
|
+
let childPid;
|
|
208
|
+
let process;
|
|
209
|
+
if (requestedPid === -1) {
|
|
210
|
+
const entry = childProcesses.entries().next().value;
|
|
211
|
+
if (!entry)
|
|
212
|
+
return -10n;
|
|
213
|
+
[childPid, process] = entry;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const exact = childProcesses.get(requestedPid);
|
|
217
|
+
if (!exact)
|
|
218
|
+
return -10n;
|
|
219
|
+
childPid = requestedPid;
|
|
220
|
+
process = exact;
|
|
221
|
+
}
|
|
222
|
+
const control = new Int32Array(process.control);
|
|
223
|
+
if (Atomics.load(control, 0) === 0) {
|
|
224
|
+
if ((optionsValue & WNOHANG) !== 0)
|
|
225
|
+
return 0n;
|
|
226
|
+
while (Atomics.load(control, 0) === 0)
|
|
227
|
+
Atomics.wait(control, 0, 0, 1000);
|
|
228
|
+
}
|
|
229
|
+
applyChildSnapshot(process);
|
|
230
|
+
if (statusPointer !== 0) {
|
|
231
|
+
assertMemoryRange(memory(), statusPointer, 4);
|
|
232
|
+
view().setInt32(statusPointer, (Atomics.load(control, 1) & 0xff) << 8, true);
|
|
233
|
+
}
|
|
234
|
+
childProcesses.delete(childPid);
|
|
235
|
+
return BigInt(childPid);
|
|
236
|
+
};
|
|
237
|
+
const builtins = {
|
|
238
|
+
__init: () => 0,
|
|
239
|
+
__deinit: () => 0,
|
|
240
|
+
__proc_exit: (status) => exit(Number(status)),
|
|
241
|
+
__cl_get_argc: () => argvBytes.length,
|
|
242
|
+
__cl_get_argv_len: (index) => argvBytes[Number(index)]?.byteLength ?? 0,
|
|
243
|
+
__cl_copy_argv: (pointer, index) => {
|
|
244
|
+
const value = argvBytes[Number(index)];
|
|
245
|
+
if (!value)
|
|
246
|
+
return -1;
|
|
247
|
+
copyIn(Number(pointer), value);
|
|
248
|
+
return 0;
|
|
249
|
+
},
|
|
250
|
+
__get_init_envfile: (pointer, size) => environmentFile
|
|
251
|
+
? fileDescriptors.copyCString(Number(pointer), environmentFile, Number(size)) : 0,
|
|
252
|
+
SYS_write: (fd, pointer, length) => emit(Number(fd), copyOut(Number(pointer), Number(length))),
|
|
253
|
+
SYS_writev: (fd, iovPointer, iovCount) => {
|
|
254
|
+
let written = 0n;
|
|
255
|
+
for (let index = 0; index < Number(iovCount); index += 1) {
|
|
256
|
+
const offset = Number(iovPointer) + index * 8;
|
|
257
|
+
assertMemoryRange(memory(), offset, 8);
|
|
258
|
+
const pointer = view().getUint32(offset, true);
|
|
259
|
+
const length = view().getUint32(offset + 4, true);
|
|
260
|
+
const result = emit(Number(fd), copyOut(pointer, length));
|
|
261
|
+
if (result < 0n)
|
|
262
|
+
return result;
|
|
263
|
+
written += result;
|
|
264
|
+
}
|
|
265
|
+
return written;
|
|
266
|
+
},
|
|
267
|
+
SYS_exit: (status) => exit(Number(status)),
|
|
268
|
+
SYS_exit_group: (status) => exit(Number(status)),
|
|
269
|
+
SYS_getpid: () => BigInt(pid),
|
|
270
|
+
SYS_getppid: () => 1n,
|
|
271
|
+
SYS_gettid: () => BigInt(pid),
|
|
272
|
+
SYS_getuid: () => 1000n,
|
|
273
|
+
SYS_geteuid: () => 1000n,
|
|
274
|
+
SYS_getgid: () => 1000n,
|
|
275
|
+
SYS_getegid: () => 1000n,
|
|
276
|
+
SYS_set_tid_address: () => BigInt(pid),
|
|
277
|
+
SYS_sched_yield: () => 0n,
|
|
278
|
+
SYS_sched_setscheduler: () => 0n,
|
|
279
|
+
SYS_tkill: () => 0n,
|
|
280
|
+
SYS_browser_spawn: (pathname, argvPointer, envPointer, cwdPointer, stdinFd, stdoutFd, stderrFd) => {
|
|
281
|
+
if (!options.browserProcess)
|
|
282
|
+
return -38;
|
|
283
|
+
const executablePath = readCString(Number(pathname));
|
|
284
|
+
const argvValue = readCStringArray(Number(argvPointer));
|
|
285
|
+
if (argvValue.length === 0)
|
|
286
|
+
argvValue.push(executablePath);
|
|
287
|
+
const envValue = {};
|
|
288
|
+
for (const entry of readCStringArray(Number(envPointer))) {
|
|
289
|
+
const separator = entry.indexOf("=");
|
|
290
|
+
if (separator > 0)
|
|
291
|
+
envValue[entry.slice(0, separator)] = entry.slice(separator + 1);
|
|
292
|
+
}
|
|
293
|
+
const childPid = Atomics.add(nextChildPid, 0, 1);
|
|
294
|
+
const process = {
|
|
295
|
+
control: new SharedArrayBuffer(8 * Int32Array.BYTES_PER_ELEMENT),
|
|
296
|
+
response: new SharedArrayBuffer(BROWSER_PROCESS_RESPONSE_BYTES),
|
|
297
|
+
snapshotApplied: false,
|
|
298
|
+
};
|
|
299
|
+
const stdin = exportPipe(Number(stdinFd), "reader");
|
|
300
|
+
const stdout = exportPipe(Number(stdoutFd), "writer");
|
|
301
|
+
const stderr = exportPipe(Number(stderrFd), "writer");
|
|
302
|
+
childProcesses.set(childPid, process);
|
|
303
|
+
try {
|
|
304
|
+
syncFilesystem();
|
|
305
|
+
options.browserProcess.spawn({
|
|
306
|
+
pid: childPid,
|
|
307
|
+
executablePath,
|
|
308
|
+
argv: argvValue,
|
|
309
|
+
env: envValue,
|
|
310
|
+
cwd: Number(cwdPointer) === 0 ? fileDescriptors.currentWorkingDirectory() : readCString(Number(cwdPointer)),
|
|
311
|
+
control: process.control,
|
|
312
|
+
response: process.response,
|
|
313
|
+
...(stdin ? { stdin } : {}),
|
|
314
|
+
...(stdout ? { stdout } : {}),
|
|
315
|
+
...(stderr ? { stderr } : {}),
|
|
316
|
+
});
|
|
317
|
+
return childPid;
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
childProcesses.delete(childPid);
|
|
321
|
+
if (stdin)
|
|
322
|
+
closeSharedPipe(stdin);
|
|
323
|
+
if (stdout)
|
|
324
|
+
closeSharedPipe(stdout);
|
|
325
|
+
if (stderr)
|
|
326
|
+
closeSharedPipe(stderr);
|
|
327
|
+
return -5;
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
SYS_wait4: (childPid, status, optionsValue) => waitForChild(Number(childPid), Number(status), Number(optionsValue)),
|
|
331
|
+
SYS_kill: (childPid, signal) => {
|
|
332
|
+
const normalized = Math.abs(Number(childPid));
|
|
333
|
+
const process = childProcesses.get(normalized);
|
|
334
|
+
if (!process)
|
|
335
|
+
return -3n;
|
|
336
|
+
Atomics.store(new Int32Array(process.control), 3, Number(signal));
|
|
337
|
+
options.browserProcess?.kill?.(normalized, Number(signal));
|
|
338
|
+
return 0n;
|
|
339
|
+
},
|
|
340
|
+
SYS_setpgid: () => 0n,
|
|
341
|
+
SYS_getpgid: (childPid) => BigInt(Number(childPid) === 0 ? pid : Math.abs(Number(childPid))),
|
|
342
|
+
__wasm_thread_spawn: (functionPointer, argumentPointer) => threadPool?.spawn(Number(functionPointer), Number(argumentPointer)) ?? -11,
|
|
343
|
+
SYS_rt_sigaction: (signal, action, previous, setSize) => {
|
|
344
|
+
const signalNumber = Number(signal);
|
|
345
|
+
const actionPointer = Number(action);
|
|
346
|
+
const previousPointer = Number(previous);
|
|
347
|
+
if (signalNumber < 1 || signalNumber > 64 || Number(setSize) !== 8)
|
|
348
|
+
return -EINVAL;
|
|
349
|
+
if (actionPointer !== 0 && (signalNumber === 9 || signalNumber === 19))
|
|
350
|
+
return -EINVAL;
|
|
351
|
+
if (previousPointer !== 0)
|
|
352
|
+
copyIn(previousPointer, signalActions.get(signalNumber) ?? new Uint8Array(20));
|
|
353
|
+
if (actionPointer !== 0)
|
|
354
|
+
signalActions.set(signalNumber, copyOut(actionPointer, 20));
|
|
355
|
+
return 0n;
|
|
356
|
+
},
|
|
357
|
+
SYS_clock_gettime: (clockId, pointer) => {
|
|
358
|
+
const nowNanoseconds = clockNanoseconds(Number(clockId));
|
|
359
|
+
if (nowNanoseconds === undefined)
|
|
360
|
+
return -EINVAL;
|
|
361
|
+
writeTimespec(view(), Number(pointer), nowNanoseconds);
|
|
362
|
+
return 0n;
|
|
363
|
+
},
|
|
364
|
+
SYS_gettimeofday: (pointer) => {
|
|
365
|
+
if (Number(pointer) !== 0) {
|
|
366
|
+
const microseconds = BigInt(Date.now()) * 1000n;
|
|
367
|
+
assertMemoryRange(memory(), Number(pointer), 16);
|
|
368
|
+
view().setBigInt64(Number(pointer), microseconds / 1000000n, true);
|
|
369
|
+
view().setBigInt64(Number(pointer) + 8, microseconds % 1000000n, true);
|
|
370
|
+
}
|
|
371
|
+
return 0n;
|
|
372
|
+
},
|
|
373
|
+
SYS_getrandom: (pointer, length) => {
|
|
374
|
+
const destination = bytes().subarray(Number(pointer), Number(pointer) + Number(length));
|
|
375
|
+
assertMemoryRange(memory(), Number(pointer), Number(length));
|
|
376
|
+
fillRandom(destination);
|
|
377
|
+
return BigInt(destination.byteLength);
|
|
378
|
+
},
|
|
379
|
+
...memoryManager.imports(),
|
|
380
|
+
...systemImports,
|
|
381
|
+
...pipeImports,
|
|
382
|
+
// The relay event worker is also the process-wide descriptor table for
|
|
383
|
+
// epoll, eventfd, and timerfd. Root and pthread instances must share it:
|
|
384
|
+
// Tokio passes waker descriptors across those instance boundaries.
|
|
385
|
+
...(networkHost ? networkHost.imports({ ...pipeImports, ...eventImports }) : eventImports),
|
|
386
|
+
SYS_ioctl: (fd, request, argument) => sharedPipeHost.ioctl(Number(fd), Number(request))
|
|
387
|
+
?? fileDescriptors.ioctl(Number(fd), Number(request))
|
|
388
|
+
?? systemImports.SYS_ioctl(fd, request, argument),
|
|
389
|
+
};
|
|
390
|
+
const handlers = { ...builtins, ...options.imports };
|
|
391
|
+
const wali = {};
|
|
392
|
+
for (const descriptor of waliDescriptors) {
|
|
393
|
+
const handler = handlers[descriptor.name]
|
|
394
|
+
?? (() => { throw new UnsupportedWaliImportError([descriptor.name]); });
|
|
395
|
+
wali[descriptor.name] = (...args) => {
|
|
396
|
+
options.onSyscall?.(descriptor.name, args);
|
|
397
|
+
const result = handler(...args);
|
|
398
|
+
options.onSyscallResult?.(descriptor.name, result);
|
|
399
|
+
return result;
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
const env = {
|
|
403
|
+
...(importedMemory ? { memory: importedMemory } : {}),
|
|
404
|
+
_Unwind_Backtrace: () => 5,
|
|
405
|
+
_Unwind_FindEnclosingFunction: (programCounter) => programCounter,
|
|
406
|
+
_Unwind_GetCFA: () => 0,
|
|
407
|
+
};
|
|
408
|
+
instance = await WebAssembly.instantiate(module, {
|
|
409
|
+
wali,
|
|
410
|
+
env,
|
|
411
|
+
});
|
|
412
|
+
if (threaded) {
|
|
413
|
+
if (!importedMemory) {
|
|
414
|
+
throw new Error("A threaded WALI module must be linked with --import-memory so browser workers can share its process memory.");
|
|
415
|
+
}
|
|
416
|
+
threadPool = new WaliThreadPool({
|
|
417
|
+
module,
|
|
418
|
+
memory: importedMemory,
|
|
419
|
+
mmapCursor: memoryManager.allocatorControl(),
|
|
420
|
+
sharedMmapRegistry,
|
|
421
|
+
fatalState: pthreadFatal.buffer,
|
|
422
|
+
imports: descriptors,
|
|
423
|
+
size: options.threadPoolSize ?? 18,
|
|
424
|
+
pid,
|
|
425
|
+
executablePath,
|
|
426
|
+
argv,
|
|
427
|
+
cwd: fileDescriptors.currentWorkingDirectory(),
|
|
428
|
+
stdioAliasRegistry: stdioAliasRegistry.buffer,
|
|
429
|
+
sharedPipes: sharedPipeState,
|
|
430
|
+
childPidAllocator: nextChildPid.buffer,
|
|
431
|
+
...(options.browserProcessPorts ? { browserProcessPorts: options.browserProcessPorts } : {}),
|
|
432
|
+
...(options.threadOutputPorts ? { outputPorts: options.threadOutputPorts } : {}),
|
|
433
|
+
...(stdin instanceof SharedWaliStdinReader ? { stdin: stdin.buffer } : {}),
|
|
434
|
+
onStdout: (chunk) => { emit(1, chunk); },
|
|
435
|
+
onStderr: (chunk) => { emit(2, chunk); },
|
|
436
|
+
...(networkCoordinator ? { network: networkCoordinator } : {}),
|
|
437
|
+
...(filesystemCoordinator ? { filesystem: filesystemCoordinator } : {}),
|
|
438
|
+
});
|
|
439
|
+
await threadPool.initialize();
|
|
440
|
+
}
|
|
441
|
+
const start = instance.exports._start;
|
|
442
|
+
if (typeof start !== "function")
|
|
443
|
+
throw new Error("WALI module does not export _start.");
|
|
444
|
+
let exitCode = 0;
|
|
445
|
+
try {
|
|
446
|
+
try {
|
|
447
|
+
start();
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
if (error instanceof WaliProcessExit || error instanceof WaliPthreadProcessExit)
|
|
451
|
+
exitCode = error.code;
|
|
452
|
+
else if (error instanceof UnsupportedWaliImportError)
|
|
453
|
+
throw error;
|
|
454
|
+
else {
|
|
455
|
+
const message = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
456
|
+
const fatalSlot = Atomics.load(pthreadFatal, 1);
|
|
457
|
+
const pthreadDiagnostics = threadPool?.diagnostics(fatalSlot >= 0 ? fatalSlot : undefined) ?? [];
|
|
458
|
+
throw new Error(`${message}\nWALI stdout:\n${decoder.decode(concatenate(stdout))}\nWALI stderr:\n${decoder.decode(concatenate(stderr))}`
|
|
459
|
+
+ (pthreadDiagnostics.length > 0 ? `\nWALI pthread diagnostics:\n${pthreadDiagnostics.join("\n")}` : ""), { cause: error });
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
threadPool?.terminate();
|
|
465
|
+
networkCoordinator?.terminate();
|
|
466
|
+
syncFilesystem();
|
|
467
|
+
filesystemCoordinator?.terminate();
|
|
468
|
+
}
|
|
469
|
+
return {
|
|
470
|
+
exitCode,
|
|
471
|
+
stdout: decoder.decode(concatenate(stdout)),
|
|
472
|
+
stderr: decoder.decode(concatenate(stderr)),
|
|
473
|
+
imports: descriptors,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
function normalizePid(pid) {
|
|
478
|
+
if (pid === undefined)
|
|
479
|
+
return 2;
|
|
480
|
+
if (!Number.isSafeInteger(pid) || pid <= 1 || pid > 0x7fff_ffff)
|
|
481
|
+
throw new Error("WALI pid must be an integer between 2 and 2147483647.");
|
|
482
|
+
return pid;
|
|
483
|
+
}
|
|
484
|
+
function assertMemoryRange(memory, pointer, length) {
|
|
485
|
+
if (!Number.isSafeInteger(pointer) || !Number.isSafeInteger(length) || pointer < 0 || length < 0
|
|
486
|
+
|| pointer + length > memory.buffer.byteLength) {
|
|
487
|
+
throw new WebAssembly.RuntimeError(`WALI memory access is out of bounds: ${pointer}+${length}.`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
function concatenate(chunks) {
|
|
491
|
+
const result = new Uint8Array(chunks.reduce((total, chunk) => total + chunk.byteLength, 0));
|
|
492
|
+
let offset = 0;
|
|
493
|
+
for (const chunk of chunks) {
|
|
494
|
+
result.set(chunk, offset);
|
|
495
|
+
offset += chunk.byteLength;
|
|
496
|
+
}
|
|
497
|
+
return result;
|
|
498
|
+
}
|
|
499
|
+
function clockNanoseconds(clockId) {
|
|
500
|
+
if (clockId === 0) {
|
|
501
|
+
const milliseconds = typeof performance === "undefined"
|
|
502
|
+
? Date.now() : performance.timeOrigin + performance.now();
|
|
503
|
+
return BigInt(Math.floor(milliseconds * 1_000_000));
|
|
504
|
+
}
|
|
505
|
+
if (clockId === 1 || clockId === 4) {
|
|
506
|
+
const milliseconds = typeof performance === "undefined" ? Date.now() : performance.now();
|
|
507
|
+
return BigInt(Math.floor(milliseconds * 1_000_000));
|
|
508
|
+
}
|
|
509
|
+
return undefined;
|
|
510
|
+
}
|
|
511
|
+
function writeTimespec(view, pointer, nanoseconds) {
|
|
512
|
+
if (pointer < 0 || pointer + 16 > view.byteLength)
|
|
513
|
+
throw new WebAssembly.RuntimeError("WALI timespec pointer is out of bounds.");
|
|
514
|
+
view.setBigInt64(pointer, nanoseconds / 1000000000n, true);
|
|
515
|
+
view.setBigInt64(pointer + 8, nanoseconds % 1000000000n, true);
|
|
516
|
+
}
|
|
517
|
+
function fillRandom(destination) {
|
|
518
|
+
if (!globalThis.crypto?.getRandomValues)
|
|
519
|
+
throw new Error("Web Crypto is required for SYS_getrandom.");
|
|
520
|
+
for (let offset = 0; offset < destination.byteLength; offset += 65_536) {
|
|
521
|
+
// Web Crypto, like TextDecoder, rejects a view backed by shared memory.
|
|
522
|
+
// Fill an ordinary buffer and copy it into the process snapshot.
|
|
523
|
+
const random = new Uint8Array(Math.min(65_536, destination.byteLength - offset));
|
|
524
|
+
globalThis.crypto.getRandomValues(random);
|
|
525
|
+
destination.set(random, offset);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type BrowserProcessPipeHandle } from "./process-bridge.js";
|
|
2
|
+
import type { WaliImportHandler } from "./types.js";
|
|
3
|
+
export interface WaliSharedPipeState {
|
|
4
|
+
descriptors: SharedArrayBuffer;
|
|
5
|
+
descriptorFlags: SharedArrayBuffer;
|
|
6
|
+
slots: SharedArrayBuffer;
|
|
7
|
+
controls: SharedArrayBuffer;
|
|
8
|
+
payloads: SharedArrayBuffer;
|
|
9
|
+
}
|
|
10
|
+
export declare function createWaliSharedPipeState(): WaliSharedPipeState;
|
|
11
|
+
export declare function pollWaliSharedPipeState(state: WaliSharedPipeState, fd: number, events: number): number | undefined;
|
|
12
|
+
/** Process-wide anonymous pipes shared by the root Wasm instance and every pthread. */
|
|
13
|
+
export declare class WaliSharedPipeHost {
|
|
14
|
+
private readonly memory;
|
|
15
|
+
private readonly state;
|
|
16
|
+
private readonly descriptors;
|
|
17
|
+
private readonly descriptorFlags;
|
|
18
|
+
private readonly slots;
|
|
19
|
+
constructor(memory: () => WebAssembly.Memory, state: WaliSharedPipeState);
|
|
20
|
+
isPipeFd(fd: number): boolean;
|
|
21
|
+
exportBrowserProcessPipe(fd: number): BrowserProcessPipeHandle | undefined;
|
|
22
|
+
pollDescriptor(fd: number, events: number): number | undefined;
|
|
23
|
+
ioctl(fd: number, request: number): bigint | undefined;
|
|
24
|
+
imports(fallback?: Readonly<Record<string, WaliImportHandler>>): Record<string, WaliImportHandler>;
|
|
25
|
+
private pipe;
|
|
26
|
+
private read;
|
|
27
|
+
private write;
|
|
28
|
+
private readv;
|
|
29
|
+
private writev;
|
|
30
|
+
private fstat;
|
|
31
|
+
private fcntl;
|
|
32
|
+
private duplicate;
|
|
33
|
+
private close;
|
|
34
|
+
private poll;
|
|
35
|
+
private allocateSlot;
|
|
36
|
+
private allocateDescriptor;
|
|
37
|
+
private entry;
|
|
38
|
+
private handle;
|
|
39
|
+
private control;
|
|
40
|
+
private bytes;
|
|
41
|
+
private view;
|
|
42
|
+
private validRange;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=shared-pipes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-pipes.d.ts","sourceRoot":"","sources":["../src/shared-pipes.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBpD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,eAAe,EAAE,iBAAiB,CAAC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CAQ/D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,EAC1B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAapB;AAED,uFAAuF;AACvF,qBAAa,kBAAkB;IAM3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAa;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAGhB,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAChC,KAAK,EAAE,mBAAmB;IAO7C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK7B,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAK1E,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9D,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAMtD,OAAO,CAAC,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAM,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAwCtG,OAAO,CAAC,IAAI;IAwBZ,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,KAAK;IAcb,OAAO,CAAC,IAAI;IAiBZ,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;CAInB"}
|