experimental-agent 0.1.3 → 0.2.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/dist/agent-workflow.d.mts +2 -1
- package/dist/agent-workflow.d.ts +2 -1
- package/dist/agent-workflow.js +1382 -552
- package/dist/agent-workflow.mjs +3 -2
- package/dist/chunk-FQ67QZOI.mjs +75 -0
- package/dist/{chunk-RXPVLORL.mjs → chunk-GL7Q3MDU.mjs} +3 -7
- package/dist/{chunk-24UDM5XV.mjs → chunk-NXDVNJRS.mjs} +1 -1
- package/dist/chunk-OCF5I43X.mjs +2367 -0
- package/dist/chunk-OZZVS6L5.mjs +139 -0
- package/dist/{chunk-2ZXHR6T6.mjs → chunk-SJVFFE5D.mjs} +18 -17
- package/dist/chunk-TGNVXSMX.mjs +399 -0
- package/dist/chunk-UCVXI7LW.mjs +1287 -0
- package/dist/chunk-ZIAHPXOJ.mjs +595 -0
- package/dist/{client-SNN3XDKO.mjs → client-BKA7XBGW.mjs} +1 -1
- package/dist/{client-Bkuq-Dfa.d.mts → client-CSTexnLF.d.mts} +158 -122
- package/dist/{client-Bkuq-Dfa.d.ts → client-CSTexnLF.d.ts} +158 -122
- package/dist/{sandbox-IFK5MVRM.mjs → docker-FB2MJTHJ.mjs} +6 -4
- package/dist/{handler-WFNQWR6V.mjs → handler-FRUPZ4LX.mjs} +1 -1
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1555 -596
- package/dist/index.mjs +140 -36
- package/dist/lifecycle-workflow.d.mts +2 -1
- package/dist/lifecycle-workflow.d.ts +2 -1
- package/dist/lifecycle-workflow.js +29 -18
- package/dist/lifecycle-workflow.mjs +1 -1
- package/dist/{local-fs-handlers-ESZBRAWK.mjs → local-fs-handlers-SYOCKTPN.mjs} +10 -2
- package/dist/next/loader.js +16 -12
- package/dist/next/loader.mjs +15 -7
- package/dist/next.d.mts +1 -1
- package/dist/next.d.ts +1 -1
- package/dist/next.js +3 -10
- package/dist/next.mjs +2 -5
- package/dist/{process-manager-ZCET3VD2.mjs → process-manager-JDUJDYGU.mjs} +1 -1
- package/dist/sandbox-HRGGTEHF.mjs +21 -0
- package/dist/{storage-FCSHTDLC.mjs → storage-LSDMRW73.mjs} +2 -2
- package/package.json +2 -6
- package/dist/chunk-4WDKWMVB.mjs +0 -389
- package/dist/chunk-64THY7Y7.mjs +0 -155
- package/dist/chunk-IACG26TC.mjs +0 -2212
- package/dist/chunk-NGLND33F.mjs +0 -1247
package/dist/chunk-64THY7Y7.mjs
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
// src/sandbox/process-manager.ts
|
|
2
|
-
var DEFAULT_WAIT_UNTIL = 2e3;
|
|
3
|
-
var RUN_SCRIPT = `#!/bin/sh
|
|
4
|
-
# Process runner for Agent SDK
|
|
5
|
-
# All parameters passed via environment variables to avoid escaping issues
|
|
6
|
-
# Output is base64 encoded to avoid JSON escaping issues
|
|
7
|
-
|
|
8
|
-
AGENT_DIR="$HOME/.agent"
|
|
9
|
-
CWD_FILE="$AGENT_DIR/cwd/$SESSION_ID"
|
|
10
|
-
|
|
11
|
-
# Get current working directory (per-session)
|
|
12
|
-
if [ -f "$CWD_FILE" ]; then
|
|
13
|
-
CWD=$(cat "$CWD_FILE")
|
|
14
|
-
else
|
|
15
|
-
CWD="$HOME"
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Decode command
|
|
19
|
-
CMD=$(echo "$CMD_BASE64" | base64 -d)
|
|
20
|
-
|
|
21
|
-
# Background mode (waitUntil = 0)
|
|
22
|
-
if [ "$WAIT_UNTIL" = "0" ]; then
|
|
23
|
-
cd "$CWD" || cd "$HOME"
|
|
24
|
-
|
|
25
|
-
# Generate a simple numeric ID for output file
|
|
26
|
-
OUTPUT_ID="$(date +%s)$$"
|
|
27
|
-
OUTPUT_FILE="$AGENT_DIR/outputs/$OUTPUT_ID.log"
|
|
28
|
-
|
|
29
|
-
# Double-fork to fully detach the process
|
|
30
|
-
(
|
|
31
|
-
(
|
|
32
|
-
eval "$CMD"
|
|
33
|
-
pwd > "$CWD_FILE" 2>/dev/null
|
|
34
|
-
) > "$OUTPUT_FILE" 2>&1 < /dev/null &
|
|
35
|
-
echo $! > "$AGENT_DIR/pids/$OUTPUT_ID.pid"
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
# Small delay to ensure PID file is written
|
|
39
|
-
sleep 0.05
|
|
40
|
-
|
|
41
|
-
# Read PID
|
|
42
|
-
if [ -f "$AGENT_DIR/pids/$OUTPUT_ID.pid" ]; then
|
|
43
|
-
PID=$(cat "$AGENT_DIR/pids/$OUTPUT_ID.pid")
|
|
44
|
-
else
|
|
45
|
-
PID=0
|
|
46
|
-
fi
|
|
47
|
-
|
|
48
|
-
# Output JSON result (no output for background, so no encoding needed)
|
|
49
|
-
printf '{"pid":%d,"outputBase64":"","exitCode":-1,"status":"running","outputFile":"%s","cwd":"%s"}\\n' \\
|
|
50
|
-
"$PID" "$OUTPUT_FILE" "$CWD"
|
|
51
|
-
exit 0
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Foreground mode (waitUntil > 0) - run directly and capture output
|
|
55
|
-
cd "$CWD" || cd "$HOME"
|
|
56
|
-
|
|
57
|
-
# Run command, capture output and exit code
|
|
58
|
-
OUTPUT=$(eval "$CMD" 2>&1)
|
|
59
|
-
EXIT_CODE=$?
|
|
60
|
-
|
|
61
|
-
# Update CWD after command
|
|
62
|
-
NEW_CWD=$(pwd)
|
|
63
|
-
echo "$NEW_CWD" > "$CWD_FILE"
|
|
64
|
-
|
|
65
|
-
# Determine status
|
|
66
|
-
if [ $EXIT_CODE -eq 0 ]; then
|
|
67
|
-
STATUS="completed"
|
|
68
|
-
else
|
|
69
|
-
STATUS="failed"
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
# Base64 encode output to avoid ALL escaping issues
|
|
73
|
-
OUTPUT_BASE64=$(printf '%s' "$OUTPUT" | base64 | tr -d '\\n')
|
|
74
|
-
|
|
75
|
-
# Output JSON result with base64-encoded output
|
|
76
|
-
printf '{"pid":0,"outputBase64":"%s","exitCode":%d,"status":"%s","outputFile":"","cwd":"%s"}\\n' \\
|
|
77
|
-
"$OUTPUT_BASE64" "$EXIT_CODE" "$STATUS" "$NEW_CWD"
|
|
78
|
-
`;
|
|
79
|
-
var createProcessManager = (opts) => {
|
|
80
|
-
const { sandbox, sessionId } = opts;
|
|
81
|
-
let initialized = false;
|
|
82
|
-
const init = async () => {
|
|
83
|
-
if (initialized) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const result = await sandbox.exec({
|
|
87
|
-
command: "sh",
|
|
88
|
-
args: [
|
|
89
|
-
"-c",
|
|
90
|
-
`mkdir -p $HOME/.agent/bin $HOME/.agent/pids $HOME/.agent/outputs $HOME/.agent/cwd
|
|
91
|
-
cat > $HOME/.agent/bin/run.sh << 'SCRIPT_EOF'
|
|
92
|
-
${RUN_SCRIPT}
|
|
93
|
-
SCRIPT_EOF
|
|
94
|
-
chmod +x $HOME/.agent/bin/run.sh`
|
|
95
|
-
]
|
|
96
|
-
});
|
|
97
|
-
if (result instanceof Error) {
|
|
98
|
-
throw result;
|
|
99
|
-
}
|
|
100
|
-
await result.result;
|
|
101
|
-
initialized = true;
|
|
102
|
-
};
|
|
103
|
-
const run = async (opts2) => {
|
|
104
|
-
await init();
|
|
105
|
-
const { command, waitUntil = DEFAULT_WAIT_UNTIL } = opts2;
|
|
106
|
-
const cmdBase64 = Buffer.from(command, "utf-8").toString("base64");
|
|
107
|
-
const result = await sandbox.exec({
|
|
108
|
-
command: "sh",
|
|
109
|
-
args: [
|
|
110
|
-
"-c",
|
|
111
|
-
`CMD_BASE64="${cmdBase64}" WAIT_UNTIL="${waitUntil}" SESSION_ID="${sessionId}" $HOME/.agent/bin/run.sh`
|
|
112
|
-
]
|
|
113
|
-
});
|
|
114
|
-
if (result instanceof Error) {
|
|
115
|
-
throw result;
|
|
116
|
-
}
|
|
117
|
-
const { stdout } = await result.result;
|
|
118
|
-
const parsed = JSON.parse(stdout.trim());
|
|
119
|
-
const output = parsed.outputBase64 ? Buffer.from(parsed.outputBase64, "base64").toString("utf-8") : "";
|
|
120
|
-
return {
|
|
121
|
-
pid: parsed.pid,
|
|
122
|
-
output,
|
|
123
|
-
exitCode: parsed.exitCode,
|
|
124
|
-
status: parsed.status,
|
|
125
|
-
cwd: parsed.cwd,
|
|
126
|
-
outputFile: parsed.outputFile
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
|
-
const getCwd = async () => {
|
|
130
|
-
await init();
|
|
131
|
-
const result = await sandbox.exec({
|
|
132
|
-
command: "sh",
|
|
133
|
-
args: [
|
|
134
|
-
"-c",
|
|
135
|
-
`cat $HOME/.agent/cwd/${sessionId} 2>/dev/null || echo "$HOME"`
|
|
136
|
-
]
|
|
137
|
-
});
|
|
138
|
-
if (result instanceof Error) {
|
|
139
|
-
return process.cwd();
|
|
140
|
-
}
|
|
141
|
-
const { stdout } = await result.result;
|
|
142
|
-
return stdout.trim() || process.cwd();
|
|
143
|
-
};
|
|
144
|
-
return {
|
|
145
|
-
init,
|
|
146
|
-
run,
|
|
147
|
-
getCwd
|
|
148
|
-
};
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
export {
|
|
152
|
-
DEFAULT_WAIT_UNTIL,
|
|
153
|
-
createProcessManager
|
|
154
|
-
};
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvcHJvY2Vzcy1tYW5hZ2VyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEJhc2hSZXN1bHQsIFNhbmRib3ggfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1VOVElMID0gMjAwMDtcblxuLyoqXG4gKiBTaGVsbCBzY3JpcHQgdGhhdCBoYW5kbGVzIGFsbCBwcm9jZXNzIGV4ZWN1dGlvbiBsb2dpYy5cbiAqIEluc3RhbGxlZCB0byB+Ly5hZ2VudC9iaW4vcnVuLnNoIGR1cmluZyBpbml0KCkuXG4gKi9cbmNvbnN0IFJVTl9TQ1JJUFQgPSBgIyEvYmluL3NoXG4jIFByb2Nlc3MgcnVubmVyIGZvciBBZ2VudCBTREtcbiMgQWxsIHBhcmFtZXRlcnMgcGFzc2VkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYXZvaWQgZXNjYXBpbmcgaXNzdWVzXG4jIE91dHB1dCBpcyBiYXNlNjQgZW5jb2RlZCB0byBhdm9pZCBKU09OIGVzY2FwaW5nIGlzc3Vlc1xuXG5BR0VOVF9ESVI9XCIkSE9NRS8uYWdlbnRcIlxuQ1dEX0ZJTEU9XCIkQUdFTlRfRElSL2N3ZC8kU0VTU0lPTl9JRFwiXG5cbiMgR2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHBlci1zZXNzaW9uKVxuaWYgWyAtZiBcIiRDV0RfRklMRVwiIF07IHRoZW5cbiAgQ1dEPSQoY2F0IFwiJENXRF9GSUxFXCIpXG5lbHNlXG4gIENXRD1cIiRIT01FXCJcbmZpXG5cbiMgRGVjb2RlIGNvbW1hbmRcbkNNRD0kKGVjaG8gXCIkQ01EX0JBU0U2NFwiIHwgYmFzZTY0IC1kKVxuXG4jIEJhY2tncm91bmQgbW9kZSAod2FpdFVudGlsID0gMClcbmlmIFsgXCIkV0FJVF9VTlRJTFwiID0gXCIwXCIgXTsgdGhlblxuICBjZCBcIiRDV0RcIiB8fCBjZCBcIiRIT01FXCJcblxuICAjIEdlbmVyYXRlIGEgc2ltcGxlIG51bWVyaWMgSUQgZm9yIG91dHB1dCBmaWxlXG4gIE9VVFBVVF9JRD1cIiQoZGF0ZSArJXMpJCRcIlxuICBPVVRQVVRfRklMRT1cIiRBR0VOVF9ESVIvb3V0cHV0cy8kT1VUUFVUX0lELmxvZ1wiXG5cbiAgIyBEb3VibGUtZm9yayB0byBmdWxseSBkZXRhY2ggdGhlIHByb2Nlc3NcbiAgKFxuICAgIChcbiAgICAgIGV2YWwgXCIkQ01EXCJcbiAgICAgIHB3ZCA+IFwiJENXRF9GSUxFXCIgMj4vZGV2L251bGxcbiAgICApID4gXCIkT1VUUFVUX0ZJTEVcIiAyPiYxIDwgL2Rldi9udWxsICZcbiAgICBlY2hvICQhID4gXCIkQUdFTlRfRElSL3BpZHMvJE9VVFBVVF9JRC5waWRcIlxuICApXG5cbiAgIyBTbWFsbCBkZWxheSB0byBlbnN1cmUgUElEIGZpbGUgaXMgd3JpdHRlblxuICBzbGVlcCAwLjA1XG5cbiAgIyBSZWFkIFBJRFxuICBpZiBbIC1mIFwiJEFHRU5UX0RJUi9waWRzLyRPVVRQVVRfSUQucGlkXCIgXTsgdGhlblxuICAgIFBJRD0kKGNhdCBcIiRBR0VOVF9ESVIvcGlkcy8kT1VUUFVUX0lELnBpZFwiKVxuICBlbHNlXG4gICAgUElEPTBcbiAgZmlcblxuICAjIE91dHB1dCBKU09OIHJlc3VsdCAobm8gb3V0cHV0IGZvciBiYWNrZ3JvdW5kLCBzbyBubyBlbmNvZGluZyBuZWVkZWQpXG4gIHByaW50ZiAne1wicGlkXCI6JWQsXCJvdXRwdXRCYXNlNjRcIjpcIlwiLFwiZXhpdENvZGVcIjotMSxcInN0YXR1c1wiOlwicnVubmluZ1wiLFwib3V0cHV0RmlsZVwiOlwiJXNcIixcImN3ZFwiOlwiJXNcIn1cXFxcbicgXFxcXFxuICAgIFwiJFBJRFwiIFwiJE9VVFBVVF9GSUxFXCIgXCIkQ1dEXCJcbiAgZXhpdCAwXG5maVxuXG4jIEZvcmVncm91bmQgbW9kZSAod2FpdFVudGlsID4gMCkgLSBydW4gZGlyZWN0bHkgYW5kIGNhcHR1cmUgb3V0cHV0XG5jZCBcIiRDV0RcIiB8fCBjZCBcIiRIT01FXCJcblxuIyBSdW4gY29tbWFuZCwgY2FwdHVyZSBvdXRwdXQgYW5kIGV4aXQgY29kZVxuT1VUUFVUPSQoZXZhbCBcIiRDTURcIiAyPiYxKVxuRVhJVF9DT0RFPSQ/XG5cbiMgVXBkYXRlIENXRCBhZnRlciBjb21tYW5kXG5ORVdfQ1dEPSQocHdkKVxuZWNobyBcIiRORVdfQ1dEXCIgPiBcIiRDV0RfRklMRVwiXG5cbiMgRGV0ZXJtaW5lIHN0YXR1c1xuaWYgWyAkRVhJVF9DT0RFIC1lcSAwIF07IHRoZW5cbiAgU1RBVFVTPVwiY29tcGxldGVkXCJcbmVsc2VcbiAgU1RBVFVTPVwiZmFpbGVkXCJcbmZpXG5cbiMgQmFzZTY0IGVuY29kZSBvdXRwdXQgdG8gYXZvaWQgQUxMIGVzY2FwaW5nIGlzc3Vlc1xuT1VUUFVUX0JBU0U2ND0kKHByaW50ZiAnJXMnIFwiJE9VVFBVVFwiIHwgYmFzZTY0IHwgdHIgLWQgJ1xcXFxuJylcblxuIyBPdXRwdXQgSlNPTiByZXN1bHQgd2l0aCBiYXNlNjQtZW5jb2RlZCBvdXRwdXRcbnByaW50ZiAne1wicGlkXCI6MCxcIm91dHB1dEJhc2U2NFwiOlwiJXNcIixcImV4aXRDb2RlXCI6JWQsXCJzdGF0dXNcIjpcIiVzXCIsXCJvdXRwdXRGaWxlXCI6XCJcIixcImN3ZFwiOlwiJXNcIn1cXFxcbicgXFxcXFxuICBcIiRPVVRQVVRfQkFTRTY0XCIgXCIkRVhJVF9DT0RFXCIgXCIkU1RBVFVTXCIgXCIkTkVXX0NXRFwiXG5gO1xuXG50eXBlIFJ1bk9wdGlvbnMgPSB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE1heCBtcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLlxuICAgKiAtIDA6IEJhY2tncm91bmQgbW9kZSAtIHJldHVybiBpbW1lZGlhdGVseSB3aXRoIFBJRFxuICAgKiAtID4wOiBGb3JlZ3JvdW5kIG1vZGUgLSB3YWl0IGZvciBjb21wbGV0aW9uIChkZWZhdWx0OiAzMDAwMClcbiAgICovXG4gIHdhaXRVbnRpbD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogUHJvY2VzcyBtYW5hZ2VyIHRoYXQgdXNlcyBhIHNpbmdsZSBzaGVsbCBzY3JpcHQgdG8gaGFuZGxlIGFsbCBleGVjdXRpb24gbG9naWMuXG4gKiBSZWR1Y2VzIHJvdW5kLXRyaXBzIHRvIHRoZSBzYW5kYm94IGJ5IGRvaW5nIGV2ZXJ5dGhpbmcgaW4gb25lIGV4ZWMgY2FsbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVByb2Nlc3NNYW5hZ2VyID0gKG9wdHM6IHtcbiAgc2FuZGJveDogU2FuZGJveDtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59KSA9PiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgc2Vzc2lvbklkIH0gPSBvcHRzO1xuICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBjb25zdCBpbml0ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChpbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYG1rZGlyIC1wICRIT01FLy5hZ2VudC9iaW4gJEhPTUUvLmFnZW50L3BpZHMgJEhPTUUvLmFnZW50L291dHB1dHMgJEhPTUUvLmFnZW50L2N3ZFxuY2F0ID4gJEhPTUUvLmFnZW50L2Jpbi9ydW4uc2ggPDwgJ1NDUklQVF9FT0YnXG4ke1JVTl9TQ1JJUFR9XG5TQ1JJUFRfRU9GXG5jaG1vZCAreCAkSE9NRS8uYWdlbnQvYmluL3J1bi5zaGAsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyByZXN1bHQ7XG4gICAgfVxuICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IHJ1biA9IGFzeW5jIChvcHRzOiBSdW5PcHRpb25zKTogUHJvbWlzZTxCYXNoUmVzdWx0PiA9PiB7XG4gICAgYXdhaXQgaW5pdCgpO1xuXG4gICAgY29uc3QgeyBjb21tYW5kLCB3YWl0VW50aWwgPSBERUZBVUxUX1dBSVRfVU5USUwgfSA9IG9wdHM7XG4gICAgY29uc3QgY21kQmFzZTY0ID0gQnVmZmVyLmZyb20oY29tbWFuZCwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNhbmRib3guZXhlYyh7XG4gICAgICBjb21tYW5kOiBcInNoXCIsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFwiLWNcIixcbiAgICAgICAgYENNRF9CQVNFNjQ9XCIke2NtZEJhc2U2NH1cIiBXQUlUX1VOVElMPVwiJHt3YWl0VW50aWx9XCIgU0VTU0lPTl9JRD1cIiR7c2Vzc2lvbklkfVwiICRIT01FLy5hZ2VudC9iaW4vcnVuLnNoYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgcmVzdWx0LnJlc3VsdDtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dC50cmltKCkpIGFzIHtcbiAgICAgIHBpZDogbnVtYmVyO1xuICAgICAgb3V0cHV0QmFzZTY0OiBzdHJpbmc7XG4gICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIiB8IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xuICAgICAgb3V0cHV0RmlsZTogc3RyaW5nO1xuICAgICAgY3dkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIERlY29kZSBiYXNlNjQgb3V0cHV0XG4gICAgY29uc3Qgb3V0cHV0ID0gcGFyc2VkLm91dHB1dEJhc2U2NFxuICAgICAgPyBCdWZmZXIuZnJvbShwYXJzZWQub3V0cHV0QmFzZTY0LCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0Zi04XCIpXG4gICAgICA6IFwiXCI7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGlkOiBwYXJzZWQucGlkLFxuICAgICAgb3V0cHV0LFxuICAgICAgZXhpdENvZGU6IHBhcnNlZC5leGl0Q29kZSxcbiAgICAgIHN0YXR1czogcGFyc2VkLnN0YXR1cyxcbiAgICAgIGN3ZDogcGFyc2VkLmN3ZCxcbiAgICAgIG91dHB1dEZpbGU6IHBhcnNlZC5vdXRwdXRGaWxlLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q3dkID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgYXdhaXQgaW5pdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwic2hcIixcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgY2F0ICRIT01FLy5hZ2VudC9jd2QvJHtzZXNzaW9uSWR9IDI+L2Rldi9udWxsIHx8IGVjaG8gXCIkSE9NRVwiYCxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCByZXN1bHQucmVzdWx0O1xuICAgIHJldHVybiBzdGRvdXQudHJpbSgpIHx8IHByb2Nlc3MuY3dkKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBpbml0LFxuICAgIHJ1bixcbiAgICBnZXRDd2QsXG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9jZXNzTWFuYWdlciA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVByb2Nlc3NNYW5hZ2VyPjtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLHFCQUFxQjtBQU1sQyxJQUFNLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|