semantifold 0.3.0 → 0.4.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/README.md +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +154 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2158 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +167 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/architecture.md +45 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +231 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +160 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +141 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1407 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2304 -124
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +520 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +172 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +765 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { protectedEntryName } from "../semantic/stdlib.js";
|
|
3
|
+
const task037Modules = new Set([
|
|
4
|
+
"semantifold.output", "semantifold.resource", "semantifold.socket-client", "semantifold.text-stream"
|
|
5
|
+
]);
|
|
6
|
+
/** @typedef {{close?: string, connect?: string, eof?: string, read?: string, setup?: string, write?: string}} PhpNativeSeam */
|
|
7
|
+
/**
|
|
8
|
+
* Generates one isolated PHP provider artifact for the Task 037 canonical module.
|
|
9
|
+
* The optional native seam is generator-internal and exists only for real-runtime provider tests.
|
|
10
|
+
* @param {string} module - Exact canonical module identity.
|
|
11
|
+
* @param {readonly string[]} operations - Reachable operations for this provider.
|
|
12
|
+
* @param {PhpNativeSeam} [seam] - Protected test-owned native call names.
|
|
13
|
+
* @returns {string} Complete PHP provider source.
|
|
14
|
+
*/
|
|
15
|
+
export function generateTask037PhpProviderContent(module, operations, seam = {}) {
|
|
16
|
+
if (!task037Modules.has(module))
|
|
17
|
+
throw new RangeError(`Unknown Task 037 PHP provider module '${module}'.`);
|
|
18
|
+
const used = new Set(operations);
|
|
19
|
+
const supported = module == "semantifold.resource" ? "v1_close" : module == "semantifold.socket-client" ? "v1_connect" :
|
|
20
|
+
module == "semantifold.text-stream" ? "v1_read_line" : "v1_write_line";
|
|
21
|
+
if ([...used].some((operation) => operation != supported)) {
|
|
22
|
+
throw new RangeError(`Unknown operation selected for Task 037 PHP provider module '${module}'.`);
|
|
23
|
+
}
|
|
24
|
+
const body = module == "semantifold.resource" ? resourceProvider(used, seam) :
|
|
25
|
+
module == "semantifold.socket-client" ? socketClientProvider(used, seam) :
|
|
26
|
+
module == "semantifold.text-stream" ? textStreamProvider(used, seam) : outputProvider(used, seam);
|
|
27
|
+
return `<?php\ndeclare(strict_types=1);\n/* semantifold-task037-protected-provider */\n${body}` +
|
|
28
|
+
"/* semantifold-task037-protected-provider-end */\n";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generates the canonical resource carrier and optional close operation.
|
|
32
|
+
* @param {Set<string>} used - Reachable operations.
|
|
33
|
+
* @param {PhpNativeSeam} seam - Native seam.
|
|
34
|
+
* @returns {string} Provider body.
|
|
35
|
+
*/
|
|
36
|
+
function resourceProvider(used, seam) {
|
|
37
|
+
const entry = protectedEntryName("php", "semantifold.resource", "v1_close");
|
|
38
|
+
const nativeClose = seam.close ? `${seam.close}($handle)` : "fclose($handle)";
|
|
39
|
+
const closeFunction = used.has("v1_close") ? `
|
|
40
|
+
function ${entry}(ByteStream $resource): void {
|
|
41
|
+
$handle = $resource->__semantifoldClaimForClose();
|
|
42
|
+
$warning = null;
|
|
43
|
+
set_error_handler(static function(int $severity, string $message) use (&$warning): bool {
|
|
44
|
+
$warning = substr($message, 0, 256); return true;
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
try { $closed = ${nativeClose}; } catch (Throwable $error) {
|
|
48
|
+
throw new CloseFailure("CloseFailure", 0, $error);
|
|
49
|
+
}
|
|
50
|
+
} finally { restore_error_handler(); }
|
|
51
|
+
if ($warning !== null || $closed !== true) throw new CloseFailure("CloseFailure");
|
|
52
|
+
}
|
|
53
|
+
` : "";
|
|
54
|
+
return `final class CloseFailure extends RuntimeException {}
|
|
55
|
+
final class ResourceClosed extends RuntimeException {}
|
|
56
|
+
final class ByteStream {
|
|
57
|
+
private mixed $handle;
|
|
58
|
+
private bool $closed = false;
|
|
59
|
+
private function __construct(mixed $handle) { $this->handle = $handle; }
|
|
60
|
+
public static function __semantifoldFromNative(mixed $handle): self {
|
|
61
|
+
if (!is_resource($handle)) throw new RuntimeException("invalid private stream");
|
|
62
|
+
return new self($handle);
|
|
63
|
+
}
|
|
64
|
+
public function __semantifoldClaimForRead(): mixed {
|
|
65
|
+
if ($this->closed) throw new ResourceClosed("ResourceClosed");
|
|
66
|
+
return $this->handle;
|
|
67
|
+
}
|
|
68
|
+
public function __semantifoldClaimForClose(): mixed {
|
|
69
|
+
if ($this->closed) throw new ResourceClosed("ResourceClosed");
|
|
70
|
+
$this->closed = true;
|
|
71
|
+
return $this->handle;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
${closeFunction}`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generates exact validation and transactional blocking stream acquisition.
|
|
78
|
+
* @param {Set<string>} used - Reachable operations.
|
|
79
|
+
* @param {PhpNativeSeam} seam - Native seam.
|
|
80
|
+
* @returns {string} Provider body.
|
|
81
|
+
*/
|
|
82
|
+
function socketClientProvider(used, seam) {
|
|
83
|
+
const entry = protectedEntryName("php", "semantifold.socket-client", "v1_connect");
|
|
84
|
+
if (!used.has("v1_connect"))
|
|
85
|
+
return "final class InvalidHost extends RuntimeException {}\n" +
|
|
86
|
+
"final class InvalidPort extends RuntimeException {}\nfinal class ConnectionFailure extends RuntimeException {}\n";
|
|
87
|
+
const nativeConnect = seam.connect
|
|
88
|
+
? `${seam.connect}($host, $port, $errno, $errorMessage)`
|
|
89
|
+
: "fsockopen($host, $port, $errno, $errorMessage)";
|
|
90
|
+
const nativeClose = seam.close ? `${seam.close}($handle)` : "fclose($handle)";
|
|
91
|
+
const setup = seam.setup ? `${seam.setup}($handle);` : "";
|
|
92
|
+
return `final class InvalidHost extends RuntimeException {}
|
|
93
|
+
final class InvalidPort extends RuntimeException {}
|
|
94
|
+
final class ConnectionFailure extends RuntimeException {}
|
|
95
|
+
function ${entry}(string $host, int $port): ByteStream {
|
|
96
|
+
if ($host === "" || preg_match("//u", $host) !== 1 || str_contains($host, "://")) {
|
|
97
|
+
throw new InvalidHost("InvalidHost");
|
|
98
|
+
}
|
|
99
|
+
if ($port < 1 || $port > 65535) throw new InvalidPort("InvalidPort");
|
|
100
|
+
$errno = 0; $errorMessage = ""; $warning = null;
|
|
101
|
+
set_error_handler(static function(int $severity, string $message) use (&$warning): bool {
|
|
102
|
+
$warning = substr($message, 0, 256); return true;
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
try { $handle = ${nativeConnect}; } catch (Throwable $error) {
|
|
106
|
+
throw new ConnectionFailure("ConnectionFailure", 0, $error);
|
|
107
|
+
}
|
|
108
|
+
} finally { restore_error_handler(); }
|
|
109
|
+
if ($warning !== null || !is_resource($handle)) throw new ConnectionFailure("ConnectionFailure");
|
|
110
|
+
try {
|
|
111
|
+
${setup}
|
|
112
|
+
return ByteStream::__semantifoldFromNative($handle);
|
|
113
|
+
} catch (Throwable $error) {
|
|
114
|
+
$cleanupWarning = null;
|
|
115
|
+
set_error_handler(static function(int $severity, string $message) use (&$cleanupWarning): bool {
|
|
116
|
+
$cleanupWarning = substr($message, 0, 256); return true;
|
|
117
|
+
});
|
|
118
|
+
try { try { ${nativeClose}; } catch (Throwable) {} } finally { restore_error_handler(); }
|
|
119
|
+
throw new ConnectionFailure("ConnectionFailure", 0, $error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generates blocking line reads with explicit EOF and incremental UTF-8 validation.
|
|
126
|
+
* @param {Set<string>} used - Reachable operations.
|
|
127
|
+
* @param {PhpNativeSeam} seam - Native seam.
|
|
128
|
+
* @returns {string} Provider body.
|
|
129
|
+
*/
|
|
130
|
+
function textStreamProvider(used, seam) {
|
|
131
|
+
const entry = protectedEntryName("php", "semantifold.text-stream", "v1_read_line");
|
|
132
|
+
if (!used.has("v1_read_line"))
|
|
133
|
+
return "final class ReadFailure extends RuntimeException {}\n" +
|
|
134
|
+
"final class DecodeFailure extends RuntimeException {}\n";
|
|
135
|
+
const nativeRead = seam.read ? `${seam.read}($handle, 8192)` : "fgets($handle, 8192)";
|
|
136
|
+
const nativeEof = seam.eof ? `${seam.eof}($handle)` : "feof($handle)";
|
|
137
|
+
const validator = `${entry}__validate_utf8`;
|
|
138
|
+
return `final class ReadFailure extends RuntimeException {}
|
|
139
|
+
final class DecodeFailure extends RuntimeException {}
|
|
140
|
+
function ${validator}(string $chunk, int &$remaining, int &$codepoint, int &$minimum): void {
|
|
141
|
+
$length = strlen($chunk);
|
|
142
|
+
for ($index = 0; $index < $length; $index++) {
|
|
143
|
+
$byte = ord($chunk[$index]);
|
|
144
|
+
if ($remaining === 0) {
|
|
145
|
+
if ($byte <= 0x7f) continue;
|
|
146
|
+
if ($byte >= 0xc2 && $byte <= 0xdf) { $remaining = 1; $codepoint = $byte & 0x1f; $minimum = 0x80; continue; }
|
|
147
|
+
if ($byte >= 0xe0 && $byte <= 0xef) { $remaining = 2; $codepoint = $byte & 0x0f; $minimum = 0x800; continue; }
|
|
148
|
+
if ($byte >= 0xf0 && $byte <= 0xf4) { $remaining = 3; $codepoint = $byte & 0x07; $minimum = 0x10000; continue; }
|
|
149
|
+
throw new DecodeFailure("DecodeFailure");
|
|
150
|
+
}
|
|
151
|
+
if ($byte < 0x80 || $byte > 0xbf) throw new DecodeFailure("DecodeFailure");
|
|
152
|
+
$codepoint = ($codepoint << 6) | ($byte & 0x3f); $remaining--;
|
|
153
|
+
if ($remaining === 0 && ($codepoint < $minimum || $codepoint > 0x10ffff ||
|
|
154
|
+
($codepoint >= 0xd800 && $codepoint <= 0xdfff))) throw new DecodeFailure("DecodeFailure");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function ${entry}(ByteStream $resource): ?string {
|
|
158
|
+
$handle = $resource->__semantifoldClaimForRead();
|
|
159
|
+
$buffer = ""; $remaining = 0; $codepoint = 0; $minimum = 0;
|
|
160
|
+
while (true) {
|
|
161
|
+
$warning = null;
|
|
162
|
+
set_error_handler(static function(int $severity, string $message) use (&$warning): bool {
|
|
163
|
+
$warning = substr($message, 0, 256); return true;
|
|
164
|
+
});
|
|
165
|
+
try {
|
|
166
|
+
try { $chunk = ${nativeRead}; } catch (Throwable $error) {
|
|
167
|
+
throw new ReadFailure("ReadFailure", 0, $error);
|
|
168
|
+
}
|
|
169
|
+
} finally { restore_error_handler(); }
|
|
170
|
+
if ($warning !== null) throw new ReadFailure("ReadFailure");
|
|
171
|
+
if ($chunk !== false) {
|
|
172
|
+
if (!is_string($chunk) || $chunk === "") throw new ReadFailure("ReadFailure");
|
|
173
|
+
${validator}($chunk, $remaining, $codepoint, $minimum);
|
|
174
|
+
$buffer .= $chunk;
|
|
175
|
+
if (str_ends_with($buffer, "\\n")) return $buffer;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
$eofWarning = null;
|
|
179
|
+
set_error_handler(static function(int $severity, string $message) use (&$eofWarning): bool {
|
|
180
|
+
$eofWarning = substr($message, 0, 256); return true;
|
|
181
|
+
});
|
|
182
|
+
try {
|
|
183
|
+
try { $eof = ${nativeEof}; } catch (Throwable $error) {
|
|
184
|
+
throw new ReadFailure("ReadFailure", 0, $error);
|
|
185
|
+
}
|
|
186
|
+
} finally { restore_error_handler(); }
|
|
187
|
+
if ($eofWarning !== null || $eof !== true) throw new ReadFailure("ReadFailure");
|
|
188
|
+
if ($remaining !== 0) throw new DecodeFailure("DecodeFailure");
|
|
189
|
+
return $buffer === "" ? null : $buffer;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Generates complete UTF-8 stdout writes through positive-progress native calls.
|
|
196
|
+
* @param {Set<string>} used - Reachable operations.
|
|
197
|
+
* @param {PhpNativeSeam} seam - Native seam.
|
|
198
|
+
* @returns {string} Provider body.
|
|
199
|
+
*/
|
|
200
|
+
function outputProvider(used, seam) {
|
|
201
|
+
const entry = protectedEntryName("php", "semantifold.output", "v1_write_line");
|
|
202
|
+
if (!used.has("v1_write_line"))
|
|
203
|
+
return "final class WriteFailure extends RuntimeException {}\n";
|
|
204
|
+
const nativeWrite = seam.write ? `${seam.write}($remainingBytes)` : "fwrite(STDOUT, $remainingBytes)";
|
|
205
|
+
return `final class WriteFailure extends RuntimeException {}
|
|
206
|
+
function ${entry}(string $text): void {
|
|
207
|
+
$bytes = str_ends_with($text, "\\n") ? $text : $text . "\\n";
|
|
208
|
+
$length = strlen($bytes); $offset = 0;
|
|
209
|
+
while ($offset < $length) {
|
|
210
|
+
$remainingBytes = substr($bytes, $offset); $warning = null;
|
|
211
|
+
set_error_handler(static function(int $severity, string $message) use (&$warning): bool {
|
|
212
|
+
$warning = substr($message, 0, 256); return true;
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
try { $written = ${nativeWrite}; } catch (Throwable $error) {
|
|
216
|
+
throw new WriteFailure("WriteFailure", 0, $error);
|
|
217
|
+
}
|
|
218
|
+
} finally { restore_error_handler(); }
|
|
219
|
+
if ($warning !== null || !is_int($written) || $written <= 0 || $written > strlen($remainingBytes)) {
|
|
220
|
+
throw new WriteFailure("WriteFailure");
|
|
221
|
+
}
|
|
222
|
+
$offset += $written;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
`;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhwLXN0ZGxpYi1zdXBwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3BocC1zdGRsaWItc3VwcG9ydC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUE7QUFFeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDN0Isb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCLEVBQUUseUJBQXlCO0NBQ3JHLENBQUMsQ0FBQTtBQUVGLCtIQUErSDtBQUUvSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxHQUFHLEVBQUU7SUFDN0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5Q0FBeUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtJQUMxRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0SCxNQUFNLElBQUkseUJBQXlCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO0lBRXhFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxJQUFJLFVBQVUsQ0FBQyxnRUFBZ0UsTUFBTSxJQUFJLENBQUMsQ0FBQTtJQUNsRyxDQUFDO0lBQ0QsTUFBTSxJ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RyxLQUFLLGlCQUFpQixDQUFBO0lBRTNDLE9BQU87O1dBRUUsU0FBUzs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FpQlQsS0FBSzs7Ozs7Ozs7O3VCQVNPLFVBQVU7Ozs7Ozs7UUFPekIsU0FBUzs7Ozs7Ozs7OztxQkFVSSxTQUFTOzs7Ozs7Ozs7Q0FTN0IsQ0FBQTtBQUNELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUU5RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFBRSxPQUFPLHdEQUF3RCxDQUFBO0lBQy9GLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFBO0lBRXJHLE9BQU87V0FDRSxLQUFLOzs7Ozs7Ozs7eUJBU1MsV0FBVzs7Ozs7Ozs7OztDQVVuQyxDQUFBO0FBQ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3Byb3RlY3RlZEVudHJ5TmFtZX0gZnJvbSBcIi4uL3NlbWFudGljL3N0ZGxpYi5qc1wiXG5cbmNvbnN0IHRhc2swMzdNb2R1bGVzID0gbmV3IFNldChbXG4gIFwic2VtYW50aWZvbGQub3V0cHV0XCIsIFwic2VtYW50aWZvbGQucmVzb3VyY2VcIiwgXCJzZW1hbnRpZm9sZC5zb2NrZXQtY2xpZW50XCIsIFwic2VtYW50aWZvbGQudGV4dC1zdHJlYW1cIlxuXSlcblxuLyoqIEB0eXBlZGVmIHt7Y2xvc2U/OiBzdHJpbmcsIGNvbm5lY3Q/OiBzdHJpbmcsIGVvZj86IHN0cmluZywgcmVhZD86IHN0cmluZywgc2V0dXA/OiBzdHJpbmcsIHdyaXRlPzogc3RyaW5nfX0gUGhwTmF0aXZlU2VhbSAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBvbmUgaXNvbGF0ZWQgUEhQIHByb3ZpZGVyIGFydGlmYWN0IGZvciB0aGUgVGFzayAwMzcgY2Fub25pY2FsIG1vZHVsZS5cbiAqIFRoZSBvcHRpb25hbCBuYXRpdmUgc2VhbSBpcyBnZW5lcmF0b3ItaW50ZXJuYWwgYW5kIGV4aXN0cyBvbmx5IGZvciByZWFsLXJ1bnRpbWUgcHJvdmlkZXIgdGVzdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlIC0gRXhhY3QgY2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IG9wZXJhdGlvbnMgLSBSZWFjaGFibGUgb3BlcmF0aW9ucyBmb3IgdGhpcyBwcm92aWRlci5cbiAqIEBwYXJhbSB7UGhwTmF0aXZlU2VhbX0gW3NlYW1dIC0gUHJvdGVjdGVkIHRlc3Qtb3duZWQgbmF0aXZlIGNhbGwgbmFtZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21wbGV0ZSBQSFAgcHJvdmlkZXIgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrMDM3UGhwUHJvdmlkZXJDb250ZW50KG1vZHVsZSwgb3BlcmF0aW9ucywgc2VhbSA9IHt9KSB7XG4gIGlmICghdGFzazAzN01vZHVsZXMuaGFzKG1vZHVsZSkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIFRhc2sgMDM3IFBIUCBwcm92aWRlciBtb2R1bGUgJyR7bW9kdWxlfScuYClcbiAgY29uc3QgdXNlZCA9IG5ldyBTZXQob3BlcmF0aW9ucylcbiAgY29uc3Qgc3VwcG9ydGVkID0gbW9kdWxlID09IFwic2VtYW50aWZvbGQucmVzb3VyY2VcIiA/IFwidjFfY2xvc2VcIiA6IG1vZHVsZSA9PSBcInNlbWFudGlmb2xkLnNvY2tldC1jbGllbnRcIiA/IFwidjFfY29ubmVjdFwiIDpcbiAgICBtb2R1bGUgPT0gXCJzZW1hbnRpZm9sZC50ZXh0LXN0cmVhbVwiID8gXCJ2MV9yZWFkX2xpbmVcIiA6IFwidjFfd3JpdGVfbGluZVwiXG5cbiAgaWYgKFsuLi51c2VkXS5zb21lKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbiAhPSBzdXBwb3J0ZWQpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gb3BlcmF0aW9uIHNlbGVjdGVkIGZvciBUYXNrIDAzNyBQSFAgcHJvdmlkZXIgbW9kdWxlICcke21vZHVsZX0nLmApXG4gIH1cbiAgY29uc3QgYm9keSA9IG1vZHVsZSA9PSBcInNlbWFudGlmb2xkLnJlc291cmNlXCIgPyByZXNvdXJjZVByb3ZpZGVyKHVzZWQsIHNlYW0pIDpcbiAgICBtb2R1bGUgPT0gXCJzZW1hbnRpZm9sZC5zb2NrZXQtY2xpZW50XCIgPyBzb2NrZXRDbGllbnRQcm92aWRlcih1c2VkLCBzZWFtKSA6XG4gICAgICBtb2R1bGUgPT0gXCJzZW1hbnRpZm9sZC50ZXh0LXN0cmVhbVwiID8gdGV4dFN0cmVhbVByb3ZpZGVyKHVzZWQsIHNlYW0pIDogb3V0cHV0UHJvdmlkZXIodXNlZCwgc2VhbSlcblxuICByZXR1cm4gYDw/cGhwXFxuZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7XFxuLyogc2VtYW50aWZvbGQtdGFzazAzNy1wcm90ZWN0ZWQtcHJvdmlkZXIgKi9cXG4ke2JvZHl9YCArXG4gICAgXCIvKiBzZW1hbnRpZm9sZC10YXNrMDM3LXByb3RlY3RlZC1wcm92aWRlci1lbmQgKi9cXG5cIlxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgY2Fub25pY2FsIHJlc291cmNlIGNhcnJpZXIgYW5kIG9wdGlvbmFsIGNsb3NlIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHVzZWQgLSBSZWFjaGFibGUgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7UGhwTmF0aXZlU2VhbX0gc2VhbSAtIE5hdGl2ZSBzZWFtLlxuICogQHJldHVybnMge3N0cmluZ30gUHJvdmlkZXIgYm9keS5cbiAqL1xuZnVuY3Rpb24gcmVzb3VyY2VQcm92aWRlcih1c2VkLCBzZWFtKSB7XG4gIGNvbnN0IGVudHJ5ID0gcHJvdGVjdGVkRW50cnlOYW1lKFwicGhwXCIsIFwic2VtYW50aWZvbGQucmVzb3VyY2VcIiwgXCJ2MV9jbG9zZVwiKVxuICBjb25zdCBuYXRpdmVDbG9zZSA9IHNlYW0uY2xvc2UgPyBgJHtzZWFtLmNsb3NlfSgkaGFuZGxlKWAgOiBcImZjbG9zZSgkaGFuZGxlKVwiXG4gIGNvbnN0IGNsb3NlRnVuY3Rpb24gPSB1c2VkLmhhcyhcInYxX2Nsb3NlXCIpID8gYFxuZnVuY3Rpb24gJHtlbnRyeX0oQnl0ZVN0cmVhbSAkcmVzb3VyY2UpOiB2b2lkIHtcbiAgJGhhbmRsZSA9ICRyZXNvdXJjZS0+X19zZW1hbnRpZm9sZENsYWltRm9yQ2xvc2UoKTtcbiAgJHdhcm5pbmcgPSBudWxsO1xuICBzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24oaW50ICRzZXZlcml0eSwgc3RyaW5nICRtZXNzYWdlKSB1c2UgKCYkd2FybmluZyk6IGJvb2wge1xuICAgICR3YXJuaW5nID0gc3Vic3RyKCRtZXNzYWdlLCAwLCAyNTYpOyByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgdHJ5IHsgJGNsb3NlZCA9ICR7bmF0aXZlQ2xvc2V9OyB9IGNhdGNoIChUaHJvd2FibGUgJGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQ2xvc2VGYWlsdXJlKFwiQ2xvc2VGYWlsdXJlXCIsIDAsICRlcnJvcik7XG4gICAgfVxuICB9IGZpbmFsbHkgeyByZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsgfVxuICBpZiAoJHdhcm5pbmcgIT09IG51bGwgfHwgJGNsb3NlZCAhPT0gdHJ1ZSkgdGhyb3cgbmV3IENsb3NlRmFpbHVyZShcIkNsb3NlRmFpbHVyZVwiKTtcbn1cbmAgOiBcIlwiXG5cbiAgcmV0dXJuIGBmaW5hbCBjbGFzcyBDbG9zZUZhaWx1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XG5maW5hbCBjbGFzcyBSZXNvdXJjZUNsb3NlZCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge31cbmZpbmFsIGNsYXNzIEJ5dGVTdHJlYW0ge1xuICBwcml2YXRlIG1peGVkICRoYW5kbGU7XG4gIHByaXZhdGUgYm9vbCAkY2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QobWl4ZWQgJGhhbmRsZSkgeyAkdGhpcy0+aGFuZGxlID0gJGhhbmRsZTsgfVxuICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9fc2VtYW50aWZvbGRGcm9tTmF0aXZlKG1peGVkICRoYW5kbGUpOiBzZWxmIHtcbiAgICBpZiAoIWlzX3Jlc291cmNlKCRoYW5kbGUpKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcImludmFsaWQgcHJpdmF0ZSBzdHJlYW1cIik7XG4gICAgcmV0dXJuIG5ldyBzZWxmKCRoYW5kbGUpO1xuICB9XG4gIHB1YmxpYyBmdW5jdGlvbiBfX3NlbWFudGlmb2xkQ2xhaW1Gb3JSZWFkKCk6IG1peGVkIHtcbiAgICBpZiAoJHRoaXMtPmNsb3NlZCkgdGhyb3cgbmV3IFJlc291cmNlQ2xvc2VkKFwiUmVzb3VyY2VDbG9zZWRcIik7XG4gICAgcmV0dXJuICR0aGlzLT5oYW5kbGU7XG4gIH1cbiAgcHVibGljIGZ1bmN0aW9uIF9fc2VtYW50aWZvbGRDbGFpbUZvckNsb3NlKCk6IG1peGVkIHtcbiAgICBpZiAoJHRoaXMtPmNsb3NlZCkgdGhyb3cgbmV3IFJlc291cmNlQ2xvc2VkKFwiUmVzb3VyY2VDbG9zZWRcIik7XG4gICAgJHRoaXMtPmNsb3NlZCA9IHRydWU7XG4gICAgcmV0dXJuICR0aGlzLT5oYW5kbGU7XG4gIH1cbn1cbiR7Y2xvc2VGdW5jdGlvbn1gXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGV4YWN0IHZhbGlkYXRpb24gYW5kIHRyYW5zYWN0aW9uYWwgYmxvY2tpbmcgc3RyZWFtIGFjcXVpc2l0aW9uLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdXNlZCAtIFJlYWNoYWJsZSBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtQaHBOYXRpdmVTZWFtfSBzZWFtIC0gTmF0aXZlIHNlYW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQcm92aWRlciBib2R5LlxuICovXG5mdW5jdGlvbiBzb2NrZXRDbGllbnRQcm92aWRlcih1c2VkLCBzZWFtKSB7XG4gIGNvbnN0IGVudHJ5ID0gcHJvdGVjdGVkRW50cnlOYW1lKFwicGhwXCIsIFwic2VtYW50aWZvbGQuc29ja2V0LWNsaWVudFwiLCBcInYxX2Nvbm5lY3RcIilcblxuICBpZiAoIXVzZWQuaGFzKFwidjFfY29ubmVjdFwiKSkgcmV0dXJuIFwiZmluYWwgY2xhc3MgSW52YWxpZEhvc3QgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XFxuXCIgK1xuICAgIFwiZmluYWwgY2xhc3MgSW52YWxpZFBvcnQgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XFxuZmluYWwgY2xhc3MgQ29ubmVjdGlvbkZhaWx1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XFxuXCJcbiAgY29uc3QgbmF0aXZlQ29ubmVjdCA9IHNlYW0uY29ubmVjdFxuICAgID8gYCR7c2VhbS5jb25uZWN0fSgkaG9zdCwgJHBvcnQsICRlcnJubywgJGVycm9yTWVzc2FnZSlgXG4gICAgOiBcImZzb2Nrb3BlbigkaG9zdCwgJHBvcnQsICRlcnJubywgJGVycm9yTWVzc2FnZSlcIlxuICBjb25zdCBuYXRpdmVDbG9zZSA9IHNlYW0uY2xvc2UgPyBgJHtzZWFtLmNsb3NlfSgkaGFuZGxlKWAgOiBcImZjbG9zZSgkaGFuZGxlKVwiXG4gIGNvbnN0IHNldHVwID0gc2VhbS5zZXR1cCA/IGAke3NlYW0uc2V0dXB9KCRoYW5kbGUpO2AgOiBcIlwiXG5cbiAgcmV0dXJuIGBmaW5hbCBjbGFzcyBJbnZhbGlkSG9zdCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge31cbmZpbmFsIGNsYXNzIEludmFsaWRQb3J0IGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7fVxuZmluYWwgY2xhc3MgQ29ubmVjdGlvbkZhaWx1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XG5mdW5jdGlvbiAke2VudHJ5fShzdHJpbmcgJGhvc3QsIGludCAkcG9ydCk6IEJ5dGVTdHJlYW0ge1xuICBpZiAoJGhvc3QgPT09IFwiXCIgfHwgcHJlZ19tYXRjaChcIi8vdVwiLCAkaG9zdCkgIT09IDEgfHwgc3RyX2NvbnRhaW5zKCRob3N0LCBcIjovL1wiKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkSG9zdChcIkludmFsaWRIb3N0XCIpO1xuICB9XG4gIGlmICgkcG9ydCA8IDEgfHwgJHBvcnQgPiA2NTUzNSkgdGhyb3cgbmV3IEludmFsaWRQb3J0KFwiSW52YWxpZFBvcnRcIik7XG4gICRlcnJubyA9IDA7ICRlcnJvck1lc3NhZ2UgPSBcIlwiOyAkd2FybmluZyA9IG51bGw7XG4gIHNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbihpbnQgJHNldmVyaXR5LCBzdHJpbmcgJG1lc3NhZ2UpIHVzZSAoJiR3YXJuaW5nKTogYm9vbCB7XG4gICAgJHdhcm5pbmcgPSBzdWJzdHIoJG1lc3NhZ2UsIDAsIDI1Nik7IHJldHVybiB0cnVlO1xuICB9KTtcbiAgdHJ5IHtcbiAgICB0cnkgeyAkaGFuZGxlID0gJHtuYXRpdmVDb25uZWN0fTsgfSBjYXRjaCAoVGhyb3dhYmxlICRlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25GYWlsdXJlKFwiQ29ubmVjdGlvbkZhaWx1cmVcIiwgMCwgJGVycm9yKTtcbiAgICB9XG4gIH0gZmluYWxseSB7IHJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOyB9XG4gIGlmICgkd2FybmluZyAhPT0gbnVsbCB8fCAhaXNfcmVzb3VyY2UoJGhhbmRsZSkpIHRocm93IG5ldyBDb25uZWN0aW9uRmFpbHVyZShcIkNvbm5lY3Rpb25GYWlsdXJlXCIpO1xuICB0cnkge1xuICAgICR7c2V0dXB9XG4gICAgcmV0dXJuIEJ5dGVTdHJlYW06Ol9fc2VtYW50aWZvbGRGcm9tTmF0aXZlKCRoYW5kbGUpO1xuICB9IGNhdGNoIChUaHJvd2FibGUgJGVycm9yKSB7XG4gICAgJGNsZWFudXBXYXJuaW5nID0gbnVsbDtcbiAgICBzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24oaW50ICRzZXZlcml0eSwgc3RyaW5nICRtZXNzYWdlKSB1c2UgKCYkY2xlYW51cFdhcm5pbmcpOiBib29sIHtcbiAgICAgICRjbGVhbnVwV2FybmluZyA9IHN1YnN0cigkbWVzc2FnZSwgMCwgMjU2KTsgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgdHJ5IHsgdHJ5IHsgJHtuYXRpdmVDbG9zZX07IH0gY2F0Y2ggKFRocm93YWJsZSkge30gfSBmaW5hbGx5IHsgcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7IH1cbiAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkZhaWx1cmUoXCJDb25uZWN0aW9uRmFpbHVyZVwiLCAwLCAkZXJyb3IpO1xuICB9XG59XG5gXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGJsb2NraW5nIGxpbmUgcmVhZHMgd2l0aCBleHBsaWNpdCBFT0YgYW5kIGluY3JlbWVudGFsIFVURi04IHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB1c2VkIC0gUmVhY2hhYmxlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge1BocE5hdGl2ZVNlYW19IHNlYW0gLSBOYXRpdmUgc2VhbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb3ZpZGVyIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIHRleHRTdHJlYW1Qcm92aWRlcih1c2VkLCBzZWFtKSB7XG4gIGNvbnN0IGVudHJ5ID0gcHJvdGVjdGVkRW50cnlOYW1lKFwicGhwXCIsIFwic2VtYW50aWZvbGQudGV4dC1zdHJlYW1cIiwgXCJ2MV9yZWFkX2xpbmVcIilcblxuICBpZiAoIXVzZWQuaGFzKFwidjFfcmVhZF9saW5lXCIpKSByZXR1cm4gXCJmaW5hbCBjbGFzcyBSZWFkRmFpbHVyZSBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge31cXG5cIiArXG4gICAgXCJmaW5hbCBjbGFzcyBEZWNvZGVGYWlsdXJlIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7fVxcblwiXG4gIGNvbnN0IG5hdGl2ZVJlYWQgPSBzZWFtLnJlYWQgPyBgJHtzZWFtLnJlYWR9KCRoYW5kbGUsIDgxOTIpYCA6IFwiZmdldHMoJGhhbmRsZSwgODE5MilcIlxuICBjb25zdCBuYXRpdmVFb2YgPSBzZWFtLmVvZiA/IGAke3NlYW0uZW9mfSgkaGFuZGxlKWAgOiBcImZlb2YoJGhhbmRsZSlcIlxuICBjb25zdCB2YWxpZGF0b3IgPSBgJHtlbnRyeX1fX3ZhbGlkYXRlX3V0ZjhgXG5cbiAgcmV0dXJuIGBmaW5hbCBjbGFzcyBSZWFkRmFpbHVyZSBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge31cbmZpbmFsIGNsYXNzIERlY29kZUZhaWx1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XG5mdW5jdGlvbiAke3ZhbGlkYXRvcn0oc3RyaW5nICRjaHVuaywgaW50ICYkcmVtYWluaW5nLCBpbnQgJiRjb2RlcG9pbnQsIGludCAmJG1pbmltdW0pOiB2b2lkIHtcbiAgJGxlbmd0aCA9IHN0cmxlbigkY2h1bmspO1xuICBmb3IgKCRpbmRleCA9IDA7ICRpbmRleCA8ICRsZW5ndGg7ICRpbmRleCsrKSB7XG4gICAgJGJ5dGUgPSBvcmQoJGNodW5rWyRpbmRleF0pO1xuICAgIGlmICgkcmVtYWluaW5nID09PSAwKSB7XG4gICAgICBpZiAoJGJ5dGUgPD0gMHg3ZikgY29udGludWU7XG4gICAgICBpZiAoJGJ5dGUgPj0gMHhjMiAmJiAkYnl0ZSA8PSAweGRmKSB7ICRyZW1haW5pbmcgPSAxOyAkY29kZXBvaW50ID0gJGJ5dGUgJiAweDFmOyAkbWluaW11bSA9IDB4ODA7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoJGJ5dGUgPj0gMHhlMCAmJiAkYnl0ZSA8PSAweGVmKSB7ICRyZW1haW5pbmcgPSAyOyAkY29kZXBvaW50ID0gJGJ5dGUgJiAweDBmOyAkbWluaW11bSA9IDB4ODAwOyBjb250aW51ZTsgfVxuICAgICAgaWYgKCRieXRlID49IDB4ZjAgJiYgJGJ5dGUgPD0gMHhmNCkgeyAkcmVtYWluaW5nID0gMzsgJGNvZGVwb2ludCA9ICRieXRlICYgMHgwNzsgJG1pbmltdW0gPSAweDEwMDAwOyBjb250aW51ZTsgfVxuICAgICAgdGhyb3cgbmV3IERlY29kZUZhaWx1cmUoXCJEZWNvZGVGYWlsdXJlXCIpO1xuICAgIH1cbiAgICBpZiAoJGJ5dGUgPCAweDgwIHx8ICRieXRlID4gMHhiZikgdGhyb3cgbmV3IERlY29kZUZhaWx1cmUoXCJEZWNvZGVGYWlsdXJlXCIpO1xuICAgICRjb2RlcG9pbnQgPSAoJGNvZGVwb2ludCA8PCA2KSB8ICgkYnl0ZSAmIDB4M2YpOyAkcmVtYWluaW5nLS07XG4gICAgaWYgKCRyZW1haW5pbmcgPT09IDAgJiYgKCRjb2RlcG9pbnQgPCAkbWluaW11bSB8fCAkY29kZXBvaW50ID4gMHgxMGZmZmYgfHxcbiAgICAgICgkY29kZXBvaW50ID49IDB4ZDgwMCAmJiAkY29kZXBvaW50IDw9IDB4ZGZmZikpKSB0aHJvdyBuZXcgRGVjb2RlRmFpbHVyZShcIkRlY29kZUZhaWx1cmVcIik7XG4gIH1cbn1cbmZ1bmN0aW9uICR7ZW50cnl9KEJ5dGVTdHJlYW0gJHJlc291cmNlKTogP3N0cmluZyB7XG4gICRoYW5kbGUgPSAkcmVzb3VyY2UtPl9fc2VtYW50aWZvbGRDbGFpbUZvclJlYWQoKTtcbiAgJGJ1ZmZlciA9IFwiXCI7ICRyZW1haW5pbmcgPSAwOyAkY29kZXBvaW50ID0gMDsgJG1pbmltdW0gPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgICR3YXJuaW5nID0gbnVsbDtcbiAgICBzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24oaW50ICRzZXZlcml0eSwgc3RyaW5nICRtZXNzYWdlKSB1c2UgKCYkd2FybmluZyk6IGJvb2wge1xuICAgICAgJHdhcm5pbmcgPSBzdWJzdHIoJG1lc3NhZ2UsIDAsIDI1Nik7IHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICB0cnkgeyAkY2h1bmsgPSAke25hdGl2ZVJlYWR9OyB9IGNhdGNoIChUaHJvd2FibGUgJGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWFkRmFpbHVyZShcIlJlYWRGYWlsdXJlXCIsIDAsICRlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHsgcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7IH1cbiAgICBpZiAoJHdhcm5pbmcgIT09IG51bGwpIHRocm93IG5ldyBSZWFkRmFpbHVyZShcIlJlYWRGYWlsdXJlXCIpO1xuICAgIGlmICgkY2h1bmsgIT09IGZhbHNlKSB7XG4gICAgICBpZiAoIWlzX3N0cmluZygkY2h1bmspIHx8ICRjaHVuayA9PT0gXCJcIikgdGhyb3cgbmV3IFJlYWRGYWlsdXJlKFwiUmVhZEZhaWx1cmVcIik7XG4gICAgICAke3ZhbGlkYXRvcn0oJGNodW5rLCAkcmVtYWluaW5nLCAkY29kZXBvaW50LCAkbWluaW11bSk7XG4gICAgICAkYnVmZmVyIC49ICRjaHVuaztcbiAgICAgIGlmIChzdHJfZW5kc193aXRoKCRidWZmZXIsIFwiXFxcXG5cIikpIHJldHVybiAkYnVmZmVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICRlb2ZXYXJuaW5nID0gbnVsbDtcbiAgICBzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24oaW50ICRzZXZlcml0eSwgc3RyaW5nICRtZXNzYWdlKSB1c2UgKCYkZW9mV2FybmluZyk6IGJvb2wge1xuICAgICAgJGVvZldhcm5pbmcgPSBzdWJzdHIoJG1lc3NhZ2UsIDAsIDI1Nik7IHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICB0cnkgeyAkZW9mID0gJHtuYXRpdmVFb2Z9OyB9IGNhdGNoIChUaHJvd2FibGUgJGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWFkRmFpbHVyZShcIlJlYWRGYWlsdXJlXCIsIDAsICRlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHsgcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7IH1cbiAgICBpZiAoJGVvZldhcm5pbmcgIT09IG51bGwgfHwgJGVvZiAhPT0gdHJ1ZSkgdGhyb3cgbmV3IFJlYWRGYWlsdXJlKFwiUmVhZEZhaWx1cmVcIik7XG4gICAgaWYgKCRyZW1haW5pbmcgIT09IDApIHRocm93IG5ldyBEZWNvZGVGYWlsdXJlKFwiRGVjb2RlRmFpbHVyZVwiKTtcbiAgICByZXR1cm4gJGJ1ZmZlciA9PT0gXCJcIiA/IG51bGwgOiAkYnVmZmVyO1xuICB9XG59XG5gXG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGNvbXBsZXRlIFVURi04IHN0ZG91dCB3cml0ZXMgdGhyb3VnaCBwb3NpdGl2ZS1wcm9ncmVzcyBuYXRpdmUgY2FsbHMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB1c2VkIC0gUmVhY2hhYmxlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge1BocE5hdGl2ZVNlYW19IHNlYW0gLSBOYXRpdmUgc2VhbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFByb3ZpZGVyIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIG91dHB1dFByb3ZpZGVyKHVzZWQsIHNlYW0pIHtcbiAgY29uc3QgZW50cnkgPSBwcm90ZWN0ZWRFbnRyeU5hbWUoXCJwaHBcIiwgXCJzZW1hbnRpZm9sZC5vdXRwdXRcIiwgXCJ2MV93cml0ZV9saW5lXCIpXG5cbiAgaWYgKCF1c2VkLmhhcyhcInYxX3dyaXRlX2xpbmVcIikpIHJldHVybiBcImZpbmFsIGNsYXNzIFdyaXRlRmFpbHVyZSBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge31cXG5cIlxuICBjb25zdCBuYXRpdmVXcml0ZSA9IHNlYW0ud3JpdGUgPyBgJHtzZWFtLndyaXRlfSgkcmVtYWluaW5nQnl0ZXMpYCA6IFwiZndyaXRlKFNURE9VVCwgJHJlbWFpbmluZ0J5dGVzKVwiXG5cbiAgcmV0dXJuIGBmaW5hbCBjbGFzcyBXcml0ZUZhaWx1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9XG5mdW5jdGlvbiAke2VudHJ5fShzdHJpbmcgJHRleHQpOiB2b2lkIHtcbiAgJGJ5dGVzID0gc3RyX2VuZHNfd2l0aCgkdGV4dCwgXCJcXFxcblwiKSA/ICR0ZXh0IDogJHRleHQgLiBcIlxcXFxuXCI7XG4gICRsZW5ndGggPSBzdHJsZW4oJGJ5dGVzKTsgJG9mZnNldCA9IDA7XG4gIHdoaWxlICgkb2Zmc2V0IDwgJGxlbmd0aCkge1xuICAgICRyZW1haW5pbmdCeXRlcyA9IHN1YnN0cigkYnl0ZXMsICRvZmZzZXQpOyAkd2FybmluZyA9IG51bGw7XG4gICAgc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uKGludCAkc2V2ZXJpdHksIHN0cmluZyAkbWVzc2FnZSkgdXNlICgmJHdhcm5pbmcpOiBib29sIHtcbiAgICAgICR3YXJuaW5nID0gc3Vic3RyKCRtZXNzYWdlLCAwLCAyNTYpOyByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgdHJ5IHsgJHdyaXR0ZW4gPSAke25hdGl2ZVdyaXRlfTsgfSBjYXRjaCAoVGhyb3dhYmxlICRlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgV3JpdGVGYWlsdXJlKFwiV3JpdGVGYWlsdXJlXCIsIDAsICRlcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHsgcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7IH1cbiAgICBpZiAoJHdhcm5pbmcgIT09IG51bGwgfHwgIWlzX2ludCgkd3JpdHRlbikgfHwgJHdyaXR0ZW4gPD0gMCB8fCAkd3JpdHRlbiA+IHN0cmxlbigkcmVtYWluaW5nQnl0ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgV3JpdGVGYWlsdXJlKFwiV3JpdGVGYWlsdXJlXCIpO1xuICAgIH1cbiAgICAkb2Zmc2V0ICs9ICR3cml0dGVuO1xuICB9XG59XG5gXG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/backends/php.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAJvB,OAAO,sBAAsB,EAAE,cAIR,EAAE,MAAM,EAH/B,OAAO,aAAa,EAAE,YAGS,GAF7B,IAAI,
|
|
1
|
+
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/backends/php.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAJvB,OAAO,sBAAsB,EAAE,cAIR,EAAE,MAAM,EAH/B,OAAO,aAAa,EAAE,YAGS,GAF7B,IAAI,CAsIhB"}
|