experimental-agent 0.2.3 → 0.3.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 +55 -254
- package/dist/adapter-BigchkkI.d.mts +201 -0
- package/dist/adapter-BigchkkI.d.ts +201 -0
- package/dist/chunk-BFFNCESS.mjs +302 -0
- package/dist/chunk-C4VSUEY2.mjs +72 -0
- package/dist/chunk-DOD4MC5D.mjs +196 -0
- package/dist/chunk-ELWIUJUK.mjs +96 -0
- package/dist/chunk-GKASMIBR.mjs +50 -0
- package/dist/chunk-JO3JDCH5.mjs +107 -0
- package/dist/chunk-MSWINCCM.mjs +128 -0
- package/dist/chunk-RT72C52I.mjs +324 -0
- package/dist/chunk-ZUFJJYC4.mjs +150 -0
- package/dist/{handler-FRUPZ4LX.mjs → docker-QPCLWLYR.mjs} +3 -4
- package/dist/entry-BmQ8FO-5.d.ts +36 -0
- package/dist/entry-CZd9aAwn.d.mts +36 -0
- package/dist/index.d.mts +415 -18
- package/dist/index.d.ts +415 -18
- package/dist/index.js +3036 -5494
- package/dist/index.mjs +3264 -1142
- package/dist/lifecycle-workflow-steps.d.mts +5 -0
- package/dist/lifecycle-workflow-steps.d.ts +5 -0
- package/dist/lifecycle-workflow-steps.js +263 -0
- package/dist/lifecycle-workflow-steps.mjs +9 -0
- package/dist/lifecycle-workflow.d.mts +6 -6
- package/dist/lifecycle-workflow.d.ts +6 -6
- package/dist/lifecycle-workflow.js +192 -905
- package/dist/lifecycle-workflow.mjs +3 -1
- package/dist/local-KJ3BSIFJ.mjs +8 -0
- package/dist/next/loader.js +27 -6
- package/dist/next/loader.mjs +1 -1
- package/dist/next.js +27 -6
- package/dist/next.mjs +1 -1
- package/dist/{process-manager-JDUJDYGU.mjs → process-manager-WQHAIVRB.mjs} +1 -1
- package/dist/sandbox.d.mts +6 -0
- package/dist/sandbox.d.ts +6 -0
- package/dist/sandbox.js +1070 -0
- package/dist/sandbox.mjs +19 -0
- package/dist/steps-BnkRQKlc.d.ts +173 -0
- package/dist/steps-u-mGDbP_.d.mts +173 -0
- package/dist/storage.d.mts +11 -0
- package/dist/storage.d.ts +11 -0
- package/dist/storage.js +234 -0
- package/dist/storage.mjs +12 -0
- package/dist/vercel-QZ6INPMV.mjs +11 -0
- package/package.json +26 -5
- package/dist/agent-workflow.d.mts +0 -30
- package/dist/agent-workflow.d.ts +0 -30
- package/dist/agent-workflow.js +0 -5433
- package/dist/agent-workflow.mjs +0 -14
- package/dist/chunk-7M6UPURS.mjs +0 -75
- package/dist/chunk-AML2VCQS.mjs +0 -1287
- package/dist/chunk-FQ67QZOI.mjs +0 -75
- package/dist/chunk-NO7RHGTH.mjs +0 -2367
- package/dist/chunk-NXDVNJRS.mjs +0 -106
- package/dist/chunk-OZZVS6L5.mjs +0 -139
- package/dist/chunk-SJVFFE5D.mjs +0 -402
- package/dist/chunk-TAXLUVIC.mjs +0 -1
- package/dist/chunk-TGNVXSMX.mjs +0 -399
- package/dist/chunk-YRYXN7W4.mjs +0 -48
- package/dist/chunk-ZIAHPXOJ.mjs +0 -595
- package/dist/client-BKA7XBGW.mjs +0 -15
- package/dist/client-CEeSFGva.d.mts +0 -2376
- package/dist/client-CEeSFGva.d.ts +0 -2376
- package/dist/docker-FB2MJTHJ.mjs +0 -12
- package/dist/local-fs-handlers-SYOCKTPN.mjs +0 -447
- package/dist/sandbox-UENKQV3T.mjs +0 -21
- package/dist/storage-LSDMRW73.mjs +0 -20
- package/dist/vercel-SD3JTECG.mjs +0 -20
- package/dist/vercel-sdk-I6A4MVAN.mjs +0 -8
package/dist/docker-FB2MJTHJ.mjs
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
dockerSandbox,
|
|
3
|
-
isDockerSandboxAvailable
|
|
4
|
-
} from "./chunk-ZIAHPXOJ.mjs";
|
|
5
|
-
import "./chunk-OZZVS6L5.mjs";
|
|
6
|
-
import "./chunk-YRYXN7W4.mjs";
|
|
7
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
8
|
-
export {
|
|
9
|
-
dockerSandbox,
|
|
10
|
-
isDockerSandboxAvailable
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -1,447 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
StorageConflictError
|
|
3
|
-
} from "./chunk-YRYXN7W4.mjs";
|
|
4
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
5
|
-
|
|
6
|
-
// src/storage/bindings/local-fs-handlers.ts
|
|
7
|
-
import {
|
|
8
|
-
mkdir,
|
|
9
|
-
readdir,
|
|
10
|
-
readFile,
|
|
11
|
-
rm,
|
|
12
|
-
unlink,
|
|
13
|
-
writeFile
|
|
14
|
-
} from "fs/promises";
|
|
15
|
-
import { dirname, join, resolve } from "path";
|
|
16
|
-
import equal from "fast-deep-equal";
|
|
17
|
-
|
|
18
|
-
// src/utils/paginate.ts
|
|
19
|
-
function paginate(opts) {
|
|
20
|
-
const { items, cursor, limit } = opts;
|
|
21
|
-
const startIndex = cursor ? items.findIndex((m) => m.id === cursor) + 1 : 0;
|
|
22
|
-
const sliced = limit !== void 0 ? items.slice(startIndex, startIndex + limit) : items.slice(startIndex);
|
|
23
|
-
const nextCursor = limit !== void 0 && startIndex + limit < items.length ? sliced.at(-1)?.id ?? null : null;
|
|
24
|
-
return { items: sliced, nextCursor };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// src/storage/bindings/local-fs-handlers.ts
|
|
28
|
-
function createFilesystemHandlers(basePath) {
|
|
29
|
-
const resolvedBase = resolve(basePath);
|
|
30
|
-
const sessionDir = join(resolvedBase, "session");
|
|
31
|
-
const messageDir = join(resolvedBase, "message");
|
|
32
|
-
const partDir = join(resolvedBase, "part");
|
|
33
|
-
const sandboxDir = join(resolvedBase, "sandbox");
|
|
34
|
-
const commandDir = join(resolvedBase, "command");
|
|
35
|
-
const setupDir = join(resolvedBase, "setup");
|
|
36
|
-
const lockDir = join(resolvedBase, ".locks");
|
|
37
|
-
const LOCK_STALE_MS = 3e4;
|
|
38
|
-
async function ensureDir(dir) {
|
|
39
|
-
await mkdir(dir, { recursive: true });
|
|
40
|
-
}
|
|
41
|
-
async function readJson(filePath) {
|
|
42
|
-
try {
|
|
43
|
-
const content = await readFile(filePath, "utf-8");
|
|
44
|
-
return JSON.parse(content);
|
|
45
|
-
} catch {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
async function writeJsonFile(filePath, data) {
|
|
50
|
-
await ensureDir(dirname(filePath));
|
|
51
|
-
await writeFile(filePath, JSON.stringify(data, null, 2));
|
|
52
|
-
}
|
|
53
|
-
async function withRecordLock(key, fn) {
|
|
54
|
-
const lockName = Buffer.from(key).toString("base64url");
|
|
55
|
-
const lockPath = join(lockDir, `${lockName}.lock`);
|
|
56
|
-
const metadataPath = join(lockPath, "metadata.json");
|
|
57
|
-
await ensureDir(lockDir);
|
|
58
|
-
while (true) {
|
|
59
|
-
try {
|
|
60
|
-
await mkdir(lockPath);
|
|
61
|
-
await writeJsonFile(metadataPath, {
|
|
62
|
-
pid: process.pid,
|
|
63
|
-
createdAt: Date.now()
|
|
64
|
-
});
|
|
65
|
-
break;
|
|
66
|
-
} catch (e) {
|
|
67
|
-
if (!(e instanceof Error) || e.code !== "EEXIST") {
|
|
68
|
-
throw e;
|
|
69
|
-
}
|
|
70
|
-
const metadata = await readJson(metadataPath);
|
|
71
|
-
if (metadata?.createdAt && Date.now() - metadata.createdAt > LOCK_STALE_MS) {
|
|
72
|
-
await rm(lockPath, { recursive: true, force: true });
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
return await fn();
|
|
80
|
-
} finally {
|
|
81
|
-
await rm(lockPath, { recursive: true, force: true });
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
function removeUndefined(input) {
|
|
85
|
-
const result = {};
|
|
86
|
-
for (const [key, value] of Object.entries(input)) {
|
|
87
|
-
if (value !== void 0) {
|
|
88
|
-
result[key] = value;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
async function readAllFromDir(dir) {
|
|
94
|
-
try {
|
|
95
|
-
const files = await readdir(dir);
|
|
96
|
-
const results = await Promise.all(
|
|
97
|
-
files.filter((f) => f.endsWith(".json")).map((f) => readJson(join(dir, f)))
|
|
98
|
-
);
|
|
99
|
-
return results.filter((r) => r !== null);
|
|
100
|
-
} catch {
|
|
101
|
-
return [];
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
"session.get": async ({ id }) => {
|
|
106
|
-
const sessionPath = join(sessionDir, `${id}.json`);
|
|
107
|
-
return await readJson(sessionPath) ?? null;
|
|
108
|
-
},
|
|
109
|
-
"session.set": async (session) => {
|
|
110
|
-
return await withRecordLock(`session:${session.id}`, async () => {
|
|
111
|
-
const now = Date.now();
|
|
112
|
-
const sessionPath = join(sessionDir, `${session.id}.json`);
|
|
113
|
-
const existing = await readJson(sessionPath);
|
|
114
|
-
const newSession = {
|
|
115
|
-
...session,
|
|
116
|
-
tags: session.tags ?? existing?.tags ?? {},
|
|
117
|
-
createdAt: existing?.createdAt ?? session.createdAt ?? now,
|
|
118
|
-
updatedAt: now
|
|
119
|
-
};
|
|
120
|
-
await writeJsonFile(sessionPath, newSession);
|
|
121
|
-
return newSession;
|
|
122
|
-
});
|
|
123
|
-
},
|
|
124
|
-
"session.update": async (opts) => {
|
|
125
|
-
return await withRecordLock(`session:${opts.id}`, async () => {
|
|
126
|
-
const sessionPath = join(sessionDir, `${opts.id}.json`);
|
|
127
|
-
const existing = await readJson(sessionPath);
|
|
128
|
-
if (!existing) {
|
|
129
|
-
throw new Error(`Session ${opts.id} not found`);
|
|
130
|
-
}
|
|
131
|
-
const rawPatch = removeUndefined({
|
|
132
|
-
...opts,
|
|
133
|
-
id: void 0
|
|
134
|
-
});
|
|
135
|
-
if (Object.keys(rawPatch).length === 0) {
|
|
136
|
-
return existing;
|
|
137
|
-
}
|
|
138
|
-
if (Object.hasOwn(rawPatch, "runId")) {
|
|
139
|
-
const nextRunId = rawPatch.runId;
|
|
140
|
-
if (existing.runId !== null && nextRunId === null) {
|
|
141
|
-
throw new StorageConflictError({
|
|
142
|
-
reason: "runId cannot be cleared once set"
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
if (existing.runId !== null && nextRunId !== existing.runId) {
|
|
146
|
-
throw new StorageConflictError({
|
|
147
|
-
reason: `runId is already set to ${existing.runId}`
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
const patch = rawPatch;
|
|
152
|
-
const updatedAt = patch.updatedAt !== void 0 ? patch.updatedAt : Date.now();
|
|
153
|
-
const updatedSession = {
|
|
154
|
-
...existing,
|
|
155
|
-
...patch,
|
|
156
|
-
updatedAt
|
|
157
|
-
};
|
|
158
|
-
await writeJsonFile(sessionPath, updatedSession);
|
|
159
|
-
return updatedSession;
|
|
160
|
-
});
|
|
161
|
-
},
|
|
162
|
-
"session.delete": async ({ id }) => {
|
|
163
|
-
try {
|
|
164
|
-
await unlink(join(sessionDir, `${id}.json`));
|
|
165
|
-
} catch {
|
|
166
|
-
}
|
|
167
|
-
const allMessages = await readAllFromDir(messageDir);
|
|
168
|
-
const sessionMessages = allMessages.filter((m) => m.sessionId === id);
|
|
169
|
-
const allParts = await readAllFromDir(partDir);
|
|
170
|
-
const sessionParts = allParts.filter((p) => p.sessionId === id);
|
|
171
|
-
const allCommands = await readAllFromDir(commandDir);
|
|
172
|
-
const sessionCommands = allCommands.filter((c) => c.sessionId === id);
|
|
173
|
-
const noop = () => void 0;
|
|
174
|
-
await Promise.all([
|
|
175
|
-
...sessionMessages.map(
|
|
176
|
-
(m) => unlink(join(messageDir, `${m.id}.json`)).catch(noop)
|
|
177
|
-
),
|
|
178
|
-
...sessionParts.map(
|
|
179
|
-
(p) => unlink(join(partDir, `${p.id}.json`)).catch(noop)
|
|
180
|
-
),
|
|
181
|
-
...sessionCommands.map(
|
|
182
|
-
(c) => unlink(join(commandDir, `${c.id}.json`)).catch(noop)
|
|
183
|
-
)
|
|
184
|
-
]);
|
|
185
|
-
},
|
|
186
|
-
"session.list": async ({ tags, order, cursor, limit }) => {
|
|
187
|
-
const allSessions = await readAllFromDir(sessionDir);
|
|
188
|
-
let filtered = allSessions;
|
|
189
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
190
|
-
filtered = filtered.filter((s) => {
|
|
191
|
-
const sessionTags = s.tags ?? {};
|
|
192
|
-
return Object.entries(tags).every(
|
|
193
|
-
([key, value]) => equal(sessionTags[key], value)
|
|
194
|
-
);
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
const resolvedOrder = order ?? "updatedAt_desc";
|
|
198
|
-
const sortField = resolvedOrder.startsWith("updatedAt") ? "updatedAt" : "createdAt";
|
|
199
|
-
const sortDir = resolvedOrder.endsWith("_desc") ? -1 : 1;
|
|
200
|
-
filtered.sort((a, b) => sortDir * (a[sortField] - b[sortField]));
|
|
201
|
-
return paginate({ items: filtered, cursor, limit });
|
|
202
|
-
},
|
|
203
|
-
"session.listBySandbox": async ({
|
|
204
|
-
sandboxId,
|
|
205
|
-
tags,
|
|
206
|
-
order,
|
|
207
|
-
cursor,
|
|
208
|
-
limit
|
|
209
|
-
}) => {
|
|
210
|
-
const allSessions = await readAllFromDir(sessionDir);
|
|
211
|
-
let filtered = allSessions.filter((s) => s.sandboxId === sandboxId);
|
|
212
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
213
|
-
filtered = filtered.filter((s) => {
|
|
214
|
-
const sessionTags = s.tags ?? {};
|
|
215
|
-
return Object.entries(tags).every(
|
|
216
|
-
([key, value]) => equal(sessionTags[key], value)
|
|
217
|
-
);
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
const resolvedOrder = order ?? "updatedAt_desc";
|
|
221
|
-
const sortField = resolvedOrder.startsWith("updatedAt") ? "updatedAt" : "createdAt";
|
|
222
|
-
const sortDir = resolvedOrder.endsWith("_desc") ? -1 : 1;
|
|
223
|
-
filtered.sort((a, b) => sortDir * (a[sortField] - b[sortField]));
|
|
224
|
-
return paginate({ items: filtered, cursor, limit });
|
|
225
|
-
},
|
|
226
|
-
"session.tag.set": async ({ sessionId, tags }) => {
|
|
227
|
-
return await withRecordLock(`session:${sessionId}`, async () => {
|
|
228
|
-
const sessionPath = join(sessionDir, `${sessionId}.json`);
|
|
229
|
-
const existing = await readJson(sessionPath);
|
|
230
|
-
if (!existing) {
|
|
231
|
-
throw new Error(`Session ${sessionId} not found`);
|
|
232
|
-
}
|
|
233
|
-
const mergedTags = { ...existing.tags, ...tags };
|
|
234
|
-
const now = Date.now();
|
|
235
|
-
const updatedSession = {
|
|
236
|
-
...existing,
|
|
237
|
-
tags: mergedTags,
|
|
238
|
-
updatedAt: now
|
|
239
|
-
};
|
|
240
|
-
await writeJsonFile(sessionPath, updatedSession);
|
|
241
|
-
return updatedSession;
|
|
242
|
-
});
|
|
243
|
-
},
|
|
244
|
-
"message.get": async ({ id }) => {
|
|
245
|
-
return await readJson(join(messageDir, `${id}.json`));
|
|
246
|
-
},
|
|
247
|
-
"message.set": async (message) => {
|
|
248
|
-
await writeJsonFile(join(messageDir, `${message.id}.json`), message);
|
|
249
|
-
return message;
|
|
250
|
-
},
|
|
251
|
-
"message.list": async ({ sessionId, cursor, limit }) => {
|
|
252
|
-
const allMessages = await readAllFromDir(messageDir);
|
|
253
|
-
const filtered = allMessages.filter((m) => m.sessionId === sessionId).sort((a, b) => a.createdAt - b.createdAt);
|
|
254
|
-
return paginate({ items: filtered, cursor, limit });
|
|
255
|
-
},
|
|
256
|
-
"part.listByMessage": async ({ messageId, cursor, limit }) => {
|
|
257
|
-
const allParts = await readAllFromDir(partDir);
|
|
258
|
-
const filtered = allParts.filter((p) => p.messageId === messageId).sort((a, b) => a.index - b.index);
|
|
259
|
-
return paginate({ items: filtered, cursor, limit });
|
|
260
|
-
},
|
|
261
|
-
"part.listBySession": async ({ sessionId, cursor, limit }) => {
|
|
262
|
-
const allParts = await readAllFromDir(partDir);
|
|
263
|
-
const filtered = allParts.filter((p) => p.sessionId === sessionId).sort((a, b) => {
|
|
264
|
-
if (a.messageId !== b.messageId) {
|
|
265
|
-
return a.messageId.localeCompare(b.messageId);
|
|
266
|
-
}
|
|
267
|
-
return a.index - b.index;
|
|
268
|
-
});
|
|
269
|
-
return paginate({ items: filtered, cursor, limit });
|
|
270
|
-
},
|
|
271
|
-
"part.set": async (part) => {
|
|
272
|
-
await writeJsonFile(join(partDir, `${part.id}.json`), part);
|
|
273
|
-
return part;
|
|
274
|
-
},
|
|
275
|
-
"part.delete": async ({ id }) => {
|
|
276
|
-
try {
|
|
277
|
-
await unlink(join(partDir, `${id}.json`));
|
|
278
|
-
} catch {
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
"sandbox.get": async ({ key }) => {
|
|
282
|
-
const safeName = Buffer.from(key).toString("base64url");
|
|
283
|
-
const sandboxPath = join(sandboxDir, `${safeName}.json`);
|
|
284
|
-
const data = await readJson(sandboxPath);
|
|
285
|
-
if (!data) {
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
return data;
|
|
289
|
-
},
|
|
290
|
-
"sandbox.set": async (record) => {
|
|
291
|
-
await withRecordLock(`sandbox:${record.id}`, async () => {
|
|
292
|
-
const safeName = Buffer.from(record.id).toString("base64url");
|
|
293
|
-
const sandboxPath = join(sandboxDir, `${safeName}.json`);
|
|
294
|
-
const existing = await readJson(sandboxPath);
|
|
295
|
-
const newRecord = {
|
|
296
|
-
...record,
|
|
297
|
-
tags: record.tags ?? existing?.tags ?? null
|
|
298
|
-
};
|
|
299
|
-
await writeJsonFile(sandboxPath, newRecord);
|
|
300
|
-
});
|
|
301
|
-
},
|
|
302
|
-
"sandbox.update": async (opts) => {
|
|
303
|
-
return await withRecordLock(`sandbox:${opts.id}`, async () => {
|
|
304
|
-
const safeName = Buffer.from(opts.id).toString("base64url");
|
|
305
|
-
const sandboxPath = join(sandboxDir, `${safeName}.json`);
|
|
306
|
-
const existing = await readJson(sandboxPath);
|
|
307
|
-
if (!existing) {
|
|
308
|
-
throw new Error(`Sandbox ${opts.id} not found`);
|
|
309
|
-
}
|
|
310
|
-
const patch = removeUndefined({
|
|
311
|
-
...opts,
|
|
312
|
-
id: void 0
|
|
313
|
-
});
|
|
314
|
-
if (Object.keys(patch).length === 0) {
|
|
315
|
-
return existing;
|
|
316
|
-
}
|
|
317
|
-
const updatedSandbox = {
|
|
318
|
-
...existing,
|
|
319
|
-
...patch
|
|
320
|
-
};
|
|
321
|
-
await writeJsonFile(sandboxPath, updatedSandbox);
|
|
322
|
-
return updatedSandbox;
|
|
323
|
-
});
|
|
324
|
-
},
|
|
325
|
-
"sandbox.list": async ({ tags, order, cursor, limit }) => {
|
|
326
|
-
const allSandboxes = await readAllFromDir(sandboxDir);
|
|
327
|
-
let filtered = allSandboxes;
|
|
328
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
329
|
-
filtered = filtered.filter((s) => {
|
|
330
|
-
const sandboxTags = s.tags ?? {};
|
|
331
|
-
return Object.entries(tags).every(
|
|
332
|
-
([key, value]) => equal(sandboxTags[key], value)
|
|
333
|
-
);
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
const sortField = order?.startsWith("lastActivityAt") ? "lastActivityAt" : "createdAt";
|
|
337
|
-
const sortDir = order?.endsWith("_desc") ? -1 : 1;
|
|
338
|
-
filtered.sort(
|
|
339
|
-
(a, b) => sortDir * ((a[sortField] ?? 0) - (b[sortField] ?? 0))
|
|
340
|
-
);
|
|
341
|
-
return paginate({ items: filtered, cursor, limit });
|
|
342
|
-
},
|
|
343
|
-
"sandbox.tag.set": async ({ sandboxId, tags }) => {
|
|
344
|
-
return await withRecordLock(`sandbox:${sandboxId}`, async () => {
|
|
345
|
-
const safeName = Buffer.from(sandboxId).toString("base64url");
|
|
346
|
-
const sandboxPath = join(sandboxDir, `${safeName}.json`);
|
|
347
|
-
const existing = await readJson(sandboxPath);
|
|
348
|
-
if (!existing) {
|
|
349
|
-
throw new Error(`Sandbox ${sandboxId} not found`);
|
|
350
|
-
}
|
|
351
|
-
const mergedTags = { ...existing.tags, ...tags };
|
|
352
|
-
const updatedSandbox = {
|
|
353
|
-
...existing,
|
|
354
|
-
tags: mergedTags
|
|
355
|
-
};
|
|
356
|
-
await writeJsonFile(sandboxPath, updatedSandbox);
|
|
357
|
-
return updatedSandbox;
|
|
358
|
-
});
|
|
359
|
-
},
|
|
360
|
-
"sandbox.getBySession": async ({ sessionId }) => {
|
|
361
|
-
const sessionPath = join(sessionDir, `${sessionId}.json`);
|
|
362
|
-
const session = await readJson(sessionPath);
|
|
363
|
-
if (!session?.sandboxId) {
|
|
364
|
-
return null;
|
|
365
|
-
}
|
|
366
|
-
const safeName = Buffer.from(session.sandboxId).toString("base64url");
|
|
367
|
-
return await readJson(
|
|
368
|
-
join(sandboxDir, `${safeName}.json`)
|
|
369
|
-
);
|
|
370
|
-
},
|
|
371
|
-
"command.get": async ({ id }) => {
|
|
372
|
-
return await readJson(join(commandDir, `${id}.json`));
|
|
373
|
-
},
|
|
374
|
-
"command.set": async (command) => {
|
|
375
|
-
await writeJsonFile(join(commandDir, `${command.id}.json`), command);
|
|
376
|
-
return command;
|
|
377
|
-
},
|
|
378
|
-
"setup.get": async ({ key }) => {
|
|
379
|
-
const safeName = Buffer.from(key).toString("base64url");
|
|
380
|
-
return await readJson(join(setupDir, `${safeName}.json`));
|
|
381
|
-
},
|
|
382
|
-
"setup.delete": async ({ key }) => {
|
|
383
|
-
await withRecordLock(`setup:${key}`, async () => {
|
|
384
|
-
const safeName = Buffer.from(key).toString("base64url");
|
|
385
|
-
await unlink(join(setupDir, `${safeName}.json`)).catch(() => void 0);
|
|
386
|
-
});
|
|
387
|
-
},
|
|
388
|
-
"setup.set": async (snapshot) => {
|
|
389
|
-
await withRecordLock(`setup:${snapshot.key}`, async () => {
|
|
390
|
-
const safeName = Buffer.from(snapshot.key).toString("base64url");
|
|
391
|
-
await writeJsonFile(join(setupDir, `${safeName}.json`), snapshot);
|
|
392
|
-
});
|
|
393
|
-
},
|
|
394
|
-
"setup.acquireLock": async ({ key, lockId, lockTimeoutMs }) => {
|
|
395
|
-
return await withRecordLock(`setup:${key}`, async () => {
|
|
396
|
-
const safeName = Buffer.from(key).toString("base64url");
|
|
397
|
-
const filePath = join(setupDir, `${safeName}.json`);
|
|
398
|
-
const existing = await readJson(filePath);
|
|
399
|
-
if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
|
|
400
|
-
return null;
|
|
401
|
-
}
|
|
402
|
-
const now = Date.now();
|
|
403
|
-
const snapshot = {
|
|
404
|
-
key,
|
|
405
|
-
snapshotId: existing?.snapshotId ?? null,
|
|
406
|
-
createdAt: existing?.createdAt ?? now,
|
|
407
|
-
lastUsedAt: existing?.lastUsedAt ?? null,
|
|
408
|
-
acquiringLockId: lockId,
|
|
409
|
-
acquiringLockAt: now
|
|
410
|
-
};
|
|
411
|
-
await writeJsonFile(filePath, snapshot);
|
|
412
|
-
return snapshot;
|
|
413
|
-
});
|
|
414
|
-
},
|
|
415
|
-
"sandbox.acquireLock": async ({ record, lockTimeoutMs }) => {
|
|
416
|
-
return await withRecordLock(`sandbox:${record.id}`, async () => {
|
|
417
|
-
const safeName = Buffer.from(record.id).toString("base64url");
|
|
418
|
-
const filePath = join(sandboxDir, `${safeName}.json`);
|
|
419
|
-
const existing = await readJson(filePath);
|
|
420
|
-
if (existing?.acquiringLockId && existing.acquiringLockAt && Date.now() - existing.acquiringLockAt < lockTimeoutMs) {
|
|
421
|
-
return null;
|
|
422
|
-
}
|
|
423
|
-
const sameSetupKey = existing?.setupKey != null && existing.setupKey === record.setupKey;
|
|
424
|
-
const newRecord = {
|
|
425
|
-
...record,
|
|
426
|
-
tags: record.tags ?? existing?.tags ?? null,
|
|
427
|
-
setupCompletedAt: sameSetupKey ? existing.setupCompletedAt ?? null : null
|
|
428
|
-
};
|
|
429
|
-
await writeJsonFile(filePath, newRecord);
|
|
430
|
-
return newRecord;
|
|
431
|
-
});
|
|
432
|
-
},
|
|
433
|
-
"command.list": async ({ sessionId, includeFinished, cursor, limit }) => {
|
|
434
|
-
const allCommands = await readAllFromDir(commandDir);
|
|
435
|
-
let filtered = allCommands.filter((c) => c.sessionId === sessionId);
|
|
436
|
-
if (!includeFinished) {
|
|
437
|
-
filtered = filtered.filter((c) => c.status === "running");
|
|
438
|
-
}
|
|
439
|
-
filtered.sort((a, b) => a.startedAt - b.startedAt);
|
|
440
|
-
return paginate({ items: filtered, cursor, limit });
|
|
441
|
-
}
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
export {
|
|
445
|
-
createFilesystemHandlers
|
|
446
|
-
};
|
|
447
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwtZnMtaGFuZGxlcnMudHMiLCAiLi4vc3JjL3V0aWxzL3BhZ2luYXRlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUNvbmZsaWN0RXJyb3IgfSBmcm9tIFwiLi4vLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBwYWdpbmF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wYWdpbmF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBIYW5kbGVycyxcbiAgTWVzc2FnZSxcbiAgUGFydCxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU2V0dXBTbmFwc2hvdCxcbn0gZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoYmFzZVBhdGg6IHN0cmluZyk6IEhhbmRsZXJzIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShiYXNlUGF0aCk7XG4gIGNvbnN0IHNlc3Npb25EaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzZXNzaW9uXCIpO1xuICBjb25zdCBtZXNzYWdlRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwibWVzc2FnZVwiKTtcbiAgY29uc3QgcGFydERpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInBhcnRcIik7XG4gIGNvbnN0IHNhbmRib3hEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzYW5kYm94XCIpO1xuICBjb25zdCBjb21tYW5kRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwiY29tbWFuZFwiKTtcbiAgY29uc3Qgc2V0dXBEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzZXR1cFwiKTtcbiAgY29uc3QgbG9ja0RpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcIi5sb2Nrc1wiKTtcbiAgY29uc3QgTE9DS19TVEFMRV9NUyA9IDMwXzAwMDtcblxuICBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZEpzb248VD4oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlSnNvbkZpbGUoZmlsZVBhdGg6IHN0cmluZywgZGF0YTogdW5rbm93bikge1xuICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3aXRoUmVjb3JkTG9jazxUPihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2NrTmFtZSA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgY29uc3QgbG9ja1BhdGggPSBqb2luKGxvY2tEaXIsIGAke2xvY2tOYW1lfS5sb2NrYCk7XG4gICAgY29uc3QgbWV0YWRhdGFQYXRoID0gam9pbihsb2NrUGF0aCwgXCJtZXRhZGF0YS5qc29uXCIpO1xuICAgIGF3YWl0IGVuc3VyZURpcihsb2NrRGlyKTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBta2Rpcihsb2NrUGF0aCk7XG4gICAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUobWV0YWRhdGFQYXRoLCB7XG4gICAgICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEoZSBpbnN0YW5jZW9mIEVycm9yKSB8fFxuICAgICAgICAgIChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gXCJFRVhJU1RcIlxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcmVhZEpzb248eyBjcmVhdGVkQXQ/OiBudW1iZXIgfT4obWV0YWRhdGFQYXRoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldGFkYXRhPy5jcmVhdGVkQXQgJiZcbiAgICAgICAgICBEYXRlLm5vdygpIC0gbWV0YWRhdGEuY3JlYXRlZEF0ID4gTE9DS19TVEFMRV9NU1xuICAgICAgICApIHtcbiAgICAgICAgICBhd2FpdCBybShsb2NrUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBybShsb2NrUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGlucHV0OiBUXG4gICk6IFBhcnRpYWw8VD4ge1xuICAgIGNvbnN0IHJlc3VsdDogUGFydGlhbDxUPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0W2tleSBhcyBrZXlvZiBUXSA9IHZhbHVlIGFzIFRba2V5b2YgVF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1xuICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIuanNvblwiKSlcbiAgICAgICAgICAubWFwKChmKSA9PiByZWFkSnNvbjxUPihqb2luKGRpciwgZikpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigocik6IHIgaXMgTm9uTnVsbGFibGU8dHlwZW9mIHI+ID0+IHIgIT09IG51bGwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7aWR9Lmpzb25gKTtcbiAgICAgIHJldHVybiAoYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFJlY29yZExvY2soYHNlc3Npb246JHtzZXNzaW9uLmlkfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb24uaWR9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTZXNzaW9uPihzZXNzaW9uUGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld1Nlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgICB0YWdzOiBzZXNzaW9uLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8ge30sXG4gICAgICAgICAgY3JlYXRlZEF0OiBleGlzdGluZz8uY3JlYXRlZEF0ID8/IHNlc3Npb24uY3JlYXRlZEF0ID8/IG5vdyxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzZXNzaW9uUGF0aCwgbmV3U2Vzc2lvbik7XG4gICAgICAgIHJldHVybiBuZXdTZXNzaW9uO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIFwic2Vzc2lvbi51cGRhdGVcIjogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2Vzc2lvbjoke29wdHMuaWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7b3B0cy5pZH0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2Vzc2lvbiAke29wdHMuaWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmF3UGF0Y2ggPSByZW1vdmVVbmRlZmluZWQoe1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhyYXdQYXRjaCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24ocmF3UGF0Y2gsIFwicnVuSWRcIikpIHtcbiAgICAgICAgICBjb25zdCBuZXh0UnVuSWQgPSByYXdQYXRjaC5ydW5JZCBhcyBTZXNzaW9uW1wicnVuSWRcIl0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nLnJ1bklkICE9PSBudWxsICYmIG5leHRSdW5JZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VDb25mbGljdEVycm9yKHtcbiAgICAgICAgICAgICAgcmVhc29uOiBcInJ1bklkIGNhbm5vdCBiZSBjbGVhcmVkIG9uY2Ugc2V0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4aXN0aW5nLnJ1bklkICE9PSBudWxsICYmIG5leHRSdW5JZCAhPT0gZXhpc3RpbmcucnVuSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTdG9yYWdlQ29uZmxpY3RFcnJvcih7XG4gICAgICAgICAgICAgIHJlYXNvbjogYHJ1bklkIGlzIGFscmVhZHkgc2V0IHRvICR7ZXhpc3RpbmcucnVuSWR9YCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGNoID0gcmF3UGF0Y2ggYXMgUGFydGlhbDxPbWl0PFNlc3Npb24sIFwiaWRcIj4+O1xuICAgICAgICBjb25zdCB1cGRhdGVkQXQgPVxuICAgICAgICAgIHBhdGNoLnVwZGF0ZWRBdCAhPT0gdW5kZWZpbmVkID8gcGF0Y2gudXBkYXRlZEF0IDogRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFNlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgdXBkYXRlZEF0LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCB1cGRhdGVkU2Vzc2lvbik7XG4gICAgICAgIHJldHVybiB1cGRhdGVkU2Vzc2lvbjtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uZGVsZXRlXCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHVubGluayhqb2luKHNlc3Npb25EaXIsIGAke2lkfS5qc29uYCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBpZiBmaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICBjb25zdCBzZXNzaW9uTWVzc2FnZXMgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0uc2Vzc2lvbklkID09PSBpZCk7XG4gICAgICBjb25zdCBhbGxQYXJ0cyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFBhcnQ+KHBhcnREaXIpO1xuICAgICAgY29uc3Qgc2Vzc2lvblBhcnRzID0gYWxsUGFydHMuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gaWQpO1xuICAgICAgY29uc3QgYWxsQ29tbWFuZHMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxDb21tYW5kPihjb21tYW5kRGlyKTtcbiAgICAgIGNvbnN0IHNlc3Npb25Db21tYW5kcyA9IGFsbENvbW1hbmRzLmZpbHRlcigoYykgPT4gYy5zZXNzaW9uSWQgPT09IGlkKTtcbiAgICAgIGNvbnN0IG5vb3AgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIC4uLnNlc3Npb25NZXNzYWdlcy5tYXAoKG0pID0+XG4gICAgICAgICAgdW5saW5rKGpvaW4obWVzc2FnZURpciwgYCR7bS5pZH0uanNvbmApKS5jYXRjaChub29wKVxuICAgICAgICApLFxuICAgICAgICAuLi5zZXNzaW9uUGFydHMubWFwKChwKSA9PlxuICAgICAgICAgIHVubGluayhqb2luKHBhcnREaXIsIGAke3AuaWR9Lmpzb25gKSkuY2F0Y2gobm9vcClcbiAgICAgICAgKSxcbiAgICAgICAgLi4uc2Vzc2lvbkNvbW1hbmRzLm1hcCgoYykgPT5cbiAgICAgICAgICB1bmxpbmsoam9pbihjb21tYW5kRGlyLCBgJHtjLmlkfS5qc29uYCkpLmNhdGNoKG5vb3ApXG4gICAgICAgICksXG4gICAgICBdKTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLmxpc3RcIjogYXN5bmMgKHsgdGFncywgb3JkZXIsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2Vzc2lvbnMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTZXNzaW9uPihzZXNzaW9uRGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNlc3Npb25zO1xuICAgICAgaWYgKHRhZ3MgJiYgT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb25UYWdzID0gcy50YWdzID8/IHt9O1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgZXF1YWwoc2Vzc2lvblRhZ3Nba2V5XSwgdmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZE9yZGVyID0gb3JkZXIgPz8gXCJ1cGRhdGVkQXRfZGVzY1wiO1xuICAgICAgY29uc3Qgc29ydEZpZWxkID0gcmVzb2x2ZWRPcmRlci5zdGFydHNXaXRoKFwidXBkYXRlZEF0XCIpXG4gICAgICAgID8gXCJ1cGRhdGVkQXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gcmVzb2x2ZWRPcmRlci5lbmRzV2l0aChcIl9kZXNjXCIpID8gLTEgOiAxO1xuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gc29ydERpciAqIChhW3NvcnRGaWVsZF0gLSBiW3NvcnRGaWVsZF0pKTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLmxpc3RCeVNhbmRib3hcIjogYXN5bmMgKHtcbiAgICAgIHNhbmRib3hJZCxcbiAgICAgIHRhZ3MsXG4gICAgICBvcmRlcixcbiAgICAgIGN1cnNvcixcbiAgICAgIGxpbWl0LFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFNlc3Npb25zID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2Vzc2lvbj4oc2Vzc2lvbkRpcik7XG4gICAgICBsZXQgZmlsdGVyZWQgPSBhbGxTZXNzaW9ucy5maWx0ZXIoKHMpID0+IHMuc2FuZGJveElkID09PSBzYW5kYm94SWQpO1xuICAgICAgaWYgKHRhZ3MgJiYgT2JqZWN0LmtleXModGFncykubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigocykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlc3Npb25UYWdzID0gcy50YWdzID8/IHt9O1xuICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0YWdzKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgZXF1YWwoc2Vzc2lvblRhZ3Nba2V5XSwgdmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZE9yZGVyID0gb3JkZXIgPz8gXCJ1cGRhdGVkQXRfZGVzY1wiO1xuICAgICAgY29uc3Qgc29ydEZpZWxkID0gcmVzb2x2ZWRPcmRlci5zdGFydHNXaXRoKFwidXBkYXRlZEF0XCIpXG4gICAgICAgID8gXCJ1cGRhdGVkQXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gcmVzb2x2ZWRPcmRlci5lbmRzV2l0aChcIl9kZXNjXCIpID8gLTEgOiAxO1xuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gc29ydERpciAqIChhW3NvcnRGaWVsZF0gLSBiW3NvcnRGaWVsZF0pKTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXNzaW9uLnRhZy5zZXRcIjogYXN5bmMgKHsgc2Vzc2lvbklkLCB0YWdzIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoUmVjb3JkTG9jayhgc2Vzc2lvbjoke3Nlc3Npb25JZH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlc3Npb25QYXRoID0gam9pbihzZXNzaW9uRGlyLCBgJHtzZXNzaW9uSWR9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTZXNzaW9uPihzZXNzaW9uUGF0aCk7XG4gICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtzZXNzaW9uSWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lcmdlZFRhZ3MgPSB7IC4uLmV4aXN0aW5nLnRhZ3MsIC4uLnRhZ3MgfTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFNlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgdGFnczogbWVyZ2VkVGFncyxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzZXNzaW9uUGF0aCwgdXBkYXRlZFNlc3Npb24pO1xuICAgICAgICByZXR1cm4gdXBkYXRlZFNlc3Npb247XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVhZEpzb248TWVzc2FnZT4oam9pbihtZXNzYWdlRGlyLCBgJHtpZH0uanNvbmApKTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLnNldFwiOiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKG1lc3NhZ2VEaXIsIGAke21lc3NhZ2UuaWR9Lmpzb25gKSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmxpc3RcIjogYXN5bmMgKHsgc2Vzc2lvbklkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbE1lc3NhZ2VzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IG0uc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmNyZWF0ZWRBdCAtIGIuY3JlYXRlZEF0KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjogYXN5bmMgKHsgbWVzc2FnZUlkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbFBhcnRzXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAubWVzc2FnZUlkID09PSBtZXNzYWdlSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxQYXJ0cyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFBhcnQ+KHBhcnREaXIpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBhbGxQYXJ0c1xuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGlmIChhLm1lc3NhZ2VJZCAhPT0gYi5tZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm1lc3NhZ2VJZC5sb2NhbGVDb21wYXJlKGIubWVzc2FnZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LnNldFwiOiBhc3luYyAocGFydCkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKHBhcnREaXIsIGAke3BhcnQuaWR9Lmpzb25gKSwgcGFydCk7XG4gICAgICByZXR1cm4gcGFydDtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LmRlbGV0ZVwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB1bmxpbmsoam9pbihwYXJ0RGlyLCBgJHtpZH0uanNvbmApKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmUgaWYgZmlsZSBkb2Vzbid0IGV4aXN0XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5nZXRcIjogYXN5bmMgKHsga2V5IH0pID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guc2V0XCI6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhSZWNvcmRMb2NrKGBzYW5kYm94OiR7cmVjb3JkLmlkfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShyZWNvcmQuaWQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBjb25zdCBzYW5kYm94UGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld1JlY29yZDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgICAuLi5yZWNvcmQsXG4gICAgICAgICAgdGFnczogcmVjb3JkLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzYW5kYm94UGF0aCwgbmV3UmVjb3JkKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gudXBkYXRlXCI6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFJlY29yZExvY2soYHNhbmRib3g6JHtvcHRzLmlkfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShvcHRzLmlkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgICAgY29uc3Qgc2FuZGJveFBhdGggPSBqb2luKHNhbmRib3hEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oc2FuZGJveFBhdGgpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTYW5kYm94ICR7b3B0cy5pZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0Y2ggPSByZW1vdmVVbmRlZmluZWQoe1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkgYXMgUGFydGlhbDxPbWl0PFNhbmRib3hSZWNvcmQsIFwiaWRcIj4+O1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkU2FuZGJveDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzYW5kYm94UGF0aCwgdXBkYXRlZFNhbmRib3gpO1xuICAgICAgICByZXR1cm4gdXBkYXRlZFNhbmRib3g7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94Lmxpc3RcIjogYXN5bmMgKHsgdGFncywgb3JkZXIsIGN1cnNvciwgbGltaXQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2FuZGJveGVzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2FuZGJveFJlY29yZD4oc2FuZGJveERpcik7XG4gICAgICBsZXQgZmlsdGVyZWQgPSBhbGxTYW5kYm94ZXM7XG4gICAgICBpZiAodGFncyAmJiBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2FuZGJveFRhZ3MgPSBzLnRhZ3MgPz8ge307XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRhZ3MpLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgICBlcXVhbChzYW5kYm94VGFnc1trZXldLCB2YWx1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IG9yZGVyPy5zdGFydHNXaXRoKFwibGFzdEFjdGl2aXR5QXRcIilcbiAgICAgICAgPyBcImxhc3RBY3Rpdml0eUF0XCJcbiAgICAgICAgOiBcImNyZWF0ZWRBdFwiO1xuICAgICAgY29uc3Qgc29ydERpciA9IG9yZGVyPy5lbmRzV2l0aChcIl9kZXNjXCIpID8gLTEgOiAxO1xuICAgICAgZmlsdGVyZWQuc29ydChcbiAgICAgICAgKGEsIGIpID0+IHNvcnREaXIgKiAoKGFbc29ydEZpZWxkXSA/PyAwKSAtIChiW3NvcnRGaWVsZF0gPz8gMCkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBhZ2luYXRlKHsgaXRlbXM6IGZpbHRlcmVkLCBjdXJzb3IsIGxpbWl0IH0pO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gudGFnLnNldFwiOiBhc3luYyAoeyBzYW5kYm94SWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhSZWNvcmRMb2NrKGBzYW5kYm94OiR7c2FuZGJveElkfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShzYW5kYm94SWQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBjb25zdCBzYW5kYm94UGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhbmRib3ggJHtzYW5kYm94SWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lcmdlZFRhZ3MgPSB7IC4uLmV4aXN0aW5nLnRhZ3MsIC4uLnRhZ3MgfTtcbiAgICAgICAgY29uc3QgdXBkYXRlZFNhbmRib3g6IFNhbmRib3hSZWNvcmQgPSB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgdGFnczogbWVyZ2VkVGFncyxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShzYW5kYm94UGF0aCwgdXBkYXRlZFNhbmRib3gpO1xuICAgICAgICByZXR1cm4gdXBkYXRlZFNhbmRib3g7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb25JZH0uanNvbmApO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgIGlmICghc2Vzc2lvbj8uc2FuZGJveElkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHNlc3Npb24uc2FuZGJveElkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihcbiAgICAgICAgam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxDb21tYW5kPihqb2luKGNvbW1hbmREaXIsIGAke2lkfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuc2V0XCI6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4oY29tbWFuZERpciwgYCR7Y29tbWFuZC5pZH0uanNvbmApLCBjb21tYW5kKTtcbiAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH0sXG5cbiAgICBcInNldHVwLmdldFwiOiBhc3luYyAoeyBrZXkgfSkgPT4ge1xuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlYWRKc29uPFNldHVwU25hcHNob3Q+KGpvaW4oc2V0dXBEaXIsIGAke3NhZmVOYW1lfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcInNldHVwLmRlbGV0ZVwiOiBhc3luYyAoeyBrZXkgfSkgPT4ge1xuICAgICAgYXdhaXQgd2l0aFJlY29yZExvY2soYHNldHVwOiR7a2V5fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBhd2FpdCB1bmxpbmsoam9pbihzZXR1cERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNldHVwLnNldFwiOiBhc3luYyAoc25hcHNob3QpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhSZWNvcmRMb2NrKGBzZXR1cDoke3NuYXBzaG90LmtleX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oc25hcHNob3Qua2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKHNldHVwRGlyLCBgJHtzYWZlTmFtZX0uanNvbmApLCBzbmFwc2hvdCk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJzZXR1cC5hY3F1aXJlTG9ja1wiOiBhc3luYyAoeyBrZXksIGxvY2tJZCwgbG9ja1RpbWVvdXRNcyB9KSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFJlY29yZExvY2soYHNldHVwOiR7a2V5fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oc2V0dXBEaXIsIGAke3NhZmVOYW1lfS5qc29uYCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2V0dXBTbmFwc2hvdD4oZmlsZVBhdGgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhpc3Rpbmc/LmFjcXVpcmluZ0xvY2tJZCAmJlxuICAgICAgICAgIGV4aXN0aW5nLmFjcXVpcmluZ0xvY2tBdCAmJlxuICAgICAgICAgIERhdGUubm93KCkgLSBleGlzdGluZy5hY3F1aXJpbmdMb2NrQXQgPCBsb2NrVGltZW91dE1zXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90OiBTZXR1cFNuYXBzaG90ID0ge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBzbmFwc2hvdElkOiBleGlzdGluZz8uc25hcHNob3RJZCA/PyBudWxsLFxuICAgICAgICAgIGNyZWF0ZWRBdDogZXhpc3Rpbmc/LmNyZWF0ZWRBdCA/PyBub3csXG4gICAgICAgICAgbGFzdFVzZWRBdDogZXhpc3Rpbmc/Lmxhc3RVc2VkQXQgPz8gbnVsbCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IGxvY2tJZCxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG5vdyxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShmaWxlUGF0aCwgc25hcHNob3QpO1xuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IGFzeW5jICh7IHJlY29yZCwgbG9ja1RpbWVvdXRNcyB9KSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgd2l0aFJlY29yZExvY2soYHNhbmRib3g6JHtyZWNvcmQuaWR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHJlY29yZC5pZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV4aXN0aW5nPy5hY3F1aXJpbmdMb2NrSWQgJiZcbiAgICAgICAgICBleGlzdGluZy5hY3F1aXJpbmdMb2NrQXQgJiZcbiAgICAgICAgICBEYXRlLm5vdygpIC0gZXhpc3RpbmcuYWNxdWlyaW5nTG9ja0F0IDwgbG9ja1RpbWVvdXRNc1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYW1lU2V0dXBLZXkgPVxuICAgICAgICAgIGV4aXN0aW5nPy5zZXR1cEtleSAhPSBudWxsICYmIGV4aXN0aW5nLnNldHVwS2V5ID09PSByZWNvcmQuc2V0dXBLZXk7XG4gICAgICAgIGNvbnN0IG5ld1JlY29yZDogU2FuZGJveFJlY29yZCA9IHtcbiAgICAgICAgICAuLi5yZWNvcmQsXG4gICAgICAgICAgdGFnczogcmVjb3JkLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCxcbiAgICAgICAgICBzZXR1cENvbXBsZXRlZEF0OiBzYW1lU2V0dXBLZXlcbiAgICAgICAgICAgID8gKGV4aXN0aW5nLnNldHVwQ29tcGxldGVkQXQgPz8gbnVsbClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShmaWxlUGF0aCwgbmV3UmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIG5ld1JlY29yZDtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGluY2x1ZGVGaW5pc2hlZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPENvbW1hbmQ+KGNvbW1hbmREaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsQ29tbWFuZHMuZmlsdGVyKChjKSA9PiBjLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICAgIGlmICghaW5jbHVkZUZpbmlzaGVkKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5zdGFydGVkQXQgLSBiLnN0YXJ0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFnaW5hdGU8VCBleHRlbmRzIHsgaWQ6IHN0cmluZyB9PihvcHRzOiB7XG4gIGl0ZW1zOiBUW107XG4gIGN1cnNvcj86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogTGlzdFJlc3VsdDxUPiB7XG4gIGNvbnN0IHsgaXRlbXMsIGN1cnNvciwgbGltaXQgfSA9IG9wdHM7XG4gIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJzb3IgPyBpdGVtcy5maW5kSW5kZXgoKG0pID0+IG0uaWQgPT09IGN1cnNvcikgKyAxIDogMDtcbiAgY29uc3Qgc2xpY2VkID1cbiAgICBsaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBsaW1pdClcbiAgICAgIDogaXRlbXMuc2xpY2Uoc3RhcnRJbmRleCk7XG4gIGNvbnN0IG5leHRDdXJzb3IgPVxuICAgIGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgc3RhcnRJbmRleCArIGxpbWl0IDwgaXRlbXMubGVuZ3RoXG4gICAgICA/IChzbGljZWQuYXQoLTEpPy5pZCA/PyBudWxsKVxuICAgICAgOiBudWxsO1xuICByZXR1cm4geyBpdGVtczogc2xpY2VkLCBuZXh0Q3Vyc29yIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7QUFBQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFNBQVMsTUFBTSxlQUFlO0FBQ3ZDLE9BQU8sV0FBVzs7O0FDUFgsU0FBUyxTQUFtQyxNQUlqQztBQUNoQixRQUFNLEVBQUUsT0FBTyxRQUFRLE1BQU0sSUFBSTtBQUNqQyxRQUFNLGFBQWEsU0FBUyxNQUFNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxNQUFNLElBQUksSUFBSTtBQUMxRSxRQUFNLFNBQ0osVUFBVSxTQUNOLE1BQU0sTUFBTSxZQUFZLGFBQWEsS0FBSyxJQUMxQyxNQUFNLE1BQU0sVUFBVTtBQUM1QixRQUFNLGFBQ0osVUFBVSxVQUFhLGFBQWEsUUFBUSxNQUFNLFNBQzdDLE9BQU8sR0FBRyxFQUFFLEdBQUcsTUFBTSxPQUN0QjtBQUNOLFNBQU8sRUFBRSxPQUFPLFFBQVEsV0FBVztBQUNyQzs7O0FESU8sU0FBUyx5QkFBeUIsVUFBNEI7QUFDbkUsUUFBTSxlQUFlLFFBQVEsUUFBUTtBQUNyQyxRQUFNLGFBQWEsS0FBSyxjQUFjLFNBQVM7QUFDL0MsUUFBTSxhQUFhLEtBQUssY0FBYyxTQUFTO0FBQy9DLFFBQU0sVUFBVSxLQUFLLGNBQWMsTUFBTTtBQUN6QyxRQUFNLGFBQWEsS0FBSyxjQUFjLFNBQVM7QUFDL0MsUUFBTSxhQUFhLEtBQUssY0FBYyxTQUFTO0FBQy9DLFFBQU0sV0FBVyxLQUFLLGNBQWMsT0FBTztBQUMzQyxRQUFNLFVBQVUsS0FBSyxjQUFjLFFBQVE7QUFDM0MsUUFBTSxnQkFBZ0I7QUFFdEIsaUJBQWUsVUFBVSxLQUFhO0FBQ3BDLFVBQU0sTUFBTSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxFQUN0QztBQUVBLGlCQUFlLFNBQVksVUFBcUM7QUFDOUQsUUFBSTtBQUNGLFlBQU0sVUFBVSxNQUFNLFNBQVMsVUFBVSxPQUFPO0FBQ2hELGFBQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxJQUMzQixRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsaUJBQWUsY0FBYyxVQUFrQixNQUFlO0FBQzVELFVBQU0sVUFBVSxRQUFRLFFBQVEsQ0FBQztBQUNqQyxVQUFNLFVBQVUsVUFBVSxLQUFLLFVBQVUsTUFBTSxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQ3pEO0FBRUEsaUJBQWUsZUFDYixLQUNBLElBQ1k7QUFDWixVQUFNLFdBQVcsT0FBTyxLQUFLLEdBQUcsRUFBRSxTQUFTLFdBQVc7QUFDdEQsVUFBTSxXQUFXLEtBQUssU0FBUyxHQUFHLFFBQVEsT0FBTztBQUNqRCxVQUFNLGVBQWUsS0FBSyxVQUFVLGVBQWU7QUFDbkQsVUFBTSxVQUFVLE9BQU87QUFFdkIsV0FBTyxNQUFNO0FBQ1gsVUFBSTtBQUNGLGNBQU0sTUFBTSxRQUFRO0FBQ3BCLGNBQU0sY0FBYyxjQUFjO0FBQUEsVUFDaEMsS0FBSyxRQUFRO0FBQUEsVUFDYixXQUFXLEtBQUssSUFBSTtBQUFBLFFBQ3RCLENBQUM7QUFDRDtBQUFBLE1BQ0YsU0FBUyxHQUFHO0FBQ1YsWUFDRSxFQUFFLGFBQWEsVUFDZCxFQUE0QixTQUFTLFVBQ3RDO0FBQ0EsZ0JBQU07QUFBQSxRQUNSO0FBQ0EsY0FBTSxXQUFXLE1BQU0sU0FBaUMsWUFBWTtBQUNwRSxZQUNFLFVBQVUsYUFDVixLQUFLLElBQUksSUFBSSxTQUFTLFlBQVksZUFDbEM7QUFDQSxnQkFBTSxHQUFHLFVBQVUsRUFBRSxXQUFXLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFDbkQ7QUFBQSxRQUNGO0FBQ0EsY0FBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFBQSxNQUM1QztBQUFBLElBQ0Y7QUFFQSxRQUFJO0FBQ0YsYUFBTyxNQUFNLEdBQUc7QUFBQSxJQUNsQixVQUFFO0FBQ0EsWUFBTSxHQUFHLFVBQVUsRUFBRSxXQUFXLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFFQSxXQUFTLGdCQUNQLE9BQ1k7QUFDWixVQUFNLFNBQXFCLENBQUM7QUFDNUIsZUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDaEQsVUFBSSxVQUFVLFFBQVc7QUFDdkIsZUFBTyxHQUFjLElBQUk7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLGlCQUFlLGVBQWtCLEtBQTJCO0FBQzFELFFBQUk7QUFDRixZQUFNLFFBQVEsTUFBTSxRQUFRLEdBQUc7QUFDL0IsWUFBTSxVQUFVLE1BQU0sUUFBUTtBQUFBLFFBQzVCLE1BQ0csT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLE9BQU8sQ0FBQyxFQUNqQyxJQUFJLENBQUMsTUFBTSxTQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztBQUFBLE1BQ3pDO0FBQ0EsYUFBTyxRQUFRLE9BQU8sQ0FBQyxNQUFrQyxNQUFNLElBQUk7QUFBQSxJQUNyRSxRQUFRO0FBQ04sYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxlQUFlLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDL0IsWUFBTSxjQUFjLEtBQUssWUFBWSxHQUFHLEVBQUUsT0FBTztBQUNqRCxhQUFRLE1BQU0sU0FBa0IsV0FBVyxLQUFNO0FBQUEsSUFDbkQ7QUFBQSxJQUVBLGVBQWUsT0FBTyxZQUFZO0FBQ2hDLGFBQU8sTUFBTSxlQUFlLFdBQVcsUUFBUSxFQUFFLElBQUksWUFBWTtBQUMvRCxjQUFNLE1BQU0sS0FBSyxJQUFJO0FBQ3JCLGNBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxRQUFRLEVBQUUsT0FBTztBQUN6RCxjQUFNLFdBQVcsTUFBTSxTQUFrQixXQUFXO0FBQ3BELGNBQU0sYUFBc0I7QUFBQSxVQUMxQixHQUFHO0FBQUEsVUFDSCxNQUFNLFFBQVEsUUFBUSxVQUFVLFFBQVEsQ0FBQztBQUFBLFVBQ3pDLFdBQVcsVUFBVSxhQUFhLFFBQVEsYUFBYTtBQUFBLFVBQ3ZELFdBQVc7QUFBQSxRQUNiO0FBQ0EsY0FBTSxjQUFjLGFBQWEsVUFBVTtBQUMzQyxlQUFPO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBRUEsa0JBQWtCLE9BQU8sU0FBUztBQUNoQyxhQUFPLE1BQU0sZUFBZSxXQUFXLEtBQUssRUFBRSxJQUFJLFlBQVk7QUFDNUQsY0FBTSxjQUFjLEtBQUssWUFBWSxHQUFHLEtBQUssRUFBRSxPQUFPO0FBQ3RELGNBQU0sV0FBVyxNQUFNLFNBQWtCLFdBQVc7QUFDcEQsWUFBSSxDQUFDLFVBQVU7QUFDYixnQkFBTSxJQUFJLE1BQU0sV0FBVyxLQUFLLEVBQUUsWUFBWTtBQUFBLFFBQ2hEO0FBRUEsY0FBTSxXQUFXLGdCQUFnQjtBQUFBLFVBQy9CLEdBQUc7QUFBQSxVQUNILElBQUk7QUFBQSxRQUNOLENBQUM7QUFDRCxZQUFJLE9BQU8sS0FBSyxRQUFRLEVBQUUsV0FBVyxHQUFHO0FBQ3RDLGlCQUFPO0FBQUEsUUFDVDtBQUVBLFlBQUksT0FBTyxPQUFPLFVBQVUsT0FBTyxHQUFHO0FBQ3BDLGdCQUFNLFlBQVksU0FBUztBQUMzQixjQUFJLFNBQVMsVUFBVSxRQUFRLGNBQWMsTUFBTTtBQUNqRCxrQkFBTSxJQUFJLHFCQUFxQjtBQUFBLGNBQzdCLFFBQVE7QUFBQSxZQUNWLENBQUM7QUFBQSxVQUNIO0FBQ0EsY0FBSSxTQUFTLFVBQVUsUUFBUSxjQUFjLFNBQVMsT0FBTztBQUMzRCxrQkFBTSxJQUFJLHFCQUFxQjtBQUFBLGNBQzdCLFFBQVEsMkJBQTJCLFNBQVMsS0FBSztBQUFBLFlBQ25ELENBQUM7QUFBQSxVQUNIO0FBQUEsUUFDRjtBQUVBLGNBQU0sUUFBUTtBQUNkLGNBQU0sWUFDSixNQUFNLGNBQWMsU0FBWSxNQUFNLFlBQVksS0FBSyxJQUFJO0FBQzdELGNBQU0saUJBQTBCO0FBQUEsVUFDOUIsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFVBQ0g7QUFBQSxRQUNGO0FBQ0EsY0FBTSxjQUFjLGFBQWEsY0FBYztBQUMvQyxlQUFPO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBRUEsa0JBQWtCLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDbEMsVUFBSTtBQUNGLGNBQU0sT0FBTyxLQUFLLFlBQVksR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQzdDLFFBQVE7QUFBQSxNQUVSO0FBQ0EsWUFBTSxjQUFjLE1BQU0sZUFBd0IsVUFBVTtBQUM1RCxZQUFNLGtCQUFrQixZQUFZLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO0FBQ3BFLFlBQU0sV0FBVyxNQUFNLGVBQXFCLE9BQU87QUFDbkQsWUFBTSxlQUFlLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUU7QUFDOUQsWUFBTSxjQUFjLE1BQU0sZUFBd0IsVUFBVTtBQUM1RCxZQUFNLGtCQUFrQixZQUFZLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO0FBQ3BFLFlBQU0sT0FBTyxNQUFNO0FBQ25CLFlBQU0sUUFBUSxJQUFJO0FBQUEsUUFDaEIsR0FBRyxnQkFBZ0I7QUFBQSxVQUFJLENBQUMsTUFDdEIsT0FBTyxLQUFLLFlBQVksR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJO0FBQUEsUUFDckQ7QUFBQSxRQUNBLEdBQUcsYUFBYTtBQUFBLFVBQUksQ0FBQyxNQUNuQixPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxNQUFNLElBQUk7QUFBQSxRQUNsRDtBQUFBLFFBQ0EsR0FBRyxnQkFBZ0I7QUFBQSxVQUFJLENBQUMsTUFDdEIsT0FBTyxLQUFLLFlBQVksR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxJQUFJO0FBQUEsUUFDckQ7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxnQkFBZ0IsT0FBTyxFQUFFLE1BQU0sT0FBTyxRQUFRLE1BQU0sTUFBTTtBQUN4RCxZQUFNLGNBQWMsTUFBTSxlQUF3QixVQUFVO0FBQzVELFVBQUksV0FBVztBQUNmLFVBQUksUUFBUSxPQUFPLEtBQUssSUFBSSxFQUFFLFNBQVMsR0FBRztBQUN4QyxtQkFBVyxTQUFTLE9BQU8sQ0FBQyxNQUFNO0FBQ2hDLGdCQUFNLGNBQWMsRUFBRSxRQUFRLENBQUM7QUFDL0IsaUJBQU8sT0FBTyxRQUFRLElBQUksRUFBRTtBQUFBLFlBQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUM1QyxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUs7QUFBQSxVQUMvQjtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFDQSxZQUFNLGdCQUFnQixTQUFTO0FBQy9CLFlBQU0sWUFBWSxjQUFjLFdBQVcsV0FBVyxJQUNsRCxjQUNBO0FBQ0osWUFBTSxVQUFVLGNBQWMsU0FBUyxPQUFPLElBQUksS0FBSztBQUN2RCxlQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMvRCxhQUFPLFNBQVMsRUFBRSxPQUFPLFVBQVUsUUFBUSxNQUFNLENBQUM7QUFBQSxJQUNwRDtBQUFBLElBRUEseUJBQXlCLE9BQU87QUFBQSxNQUM5QjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLE1BQU07QUFDSixZQUFNLGNBQWMsTUFBTSxlQUF3QixVQUFVO0FBQzVELFVBQUksV0FBVyxZQUFZLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxTQUFTO0FBQ2xFLFVBQUksUUFBUSxPQUFPLEtBQUssSUFBSSxFQUFFLFNBQVMsR0FBRztBQUN4QyxtQkFBVyxTQUFTLE9BQU8sQ0FBQyxNQUFNO0FBQ2hDLGdCQUFNLGNBQWMsRUFBRSxRQUFRLENBQUM7QUFDL0IsaUJBQU8sT0FBTyxRQUFRLElBQUksRUFBRTtBQUFBLFlBQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUM1QyxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUs7QUFBQSxVQUMvQjtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFDQSxZQUFNLGdCQUFnQixTQUFTO0FBQy9CLFlBQU0sWUFBWSxjQUFjLFdBQVcsV0FBVyxJQUNsRCxjQUNBO0FBQ0osWUFBTSxVQUFVLGNBQWMsU0FBUyxPQUFPLElBQUksS0FBSztBQUN2RCxlQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sV0FBVyxFQUFFLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMvRCxhQUFPLFNBQVMsRUFBRSxPQUFPLFVBQVUsUUFBUSxNQUFNLENBQUM7QUFBQSxJQUNwRDtBQUFBLElBRUEsbUJBQW1CLE9BQU8sRUFBRSxXQUFXLEtBQUssTUFBTTtBQUNoRCxhQUFPLE1BQU0sZUFBZSxXQUFXLFNBQVMsSUFBSSxZQUFZO0FBQzlELGNBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxTQUFTLE9BQU87QUFDeEQsY0FBTSxXQUFXLE1BQU0sU0FBa0IsV0FBVztBQUNwRCxZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLElBQUksTUFBTSxXQUFXLFNBQVMsWUFBWTtBQUFBLFFBQ2xEO0FBQ0EsY0FBTSxhQUFhLEVBQUUsR0FBRyxTQUFTLE1BQU0sR0FBRyxLQUFLO0FBQy9DLGNBQU0sTUFBTSxLQUFLLElBQUk7QUFDckIsY0FBTSxpQkFBMEI7QUFBQSxVQUM5QixHQUFHO0FBQUEsVUFDSCxNQUFNO0FBQUEsVUFDTixXQUFXO0FBQUEsUUFDYjtBQUNBLGNBQU0sY0FBYyxhQUFhLGNBQWM7QUFDL0MsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVBLGVBQWUsT0FBTyxFQUFFLEdBQUcsTUFBTTtBQUMvQixhQUFPLE1BQU0sU0FBa0IsS0FBSyxZQUFZLEdBQUcsRUFBRSxPQUFPLENBQUM7QUFBQSxJQUMvRDtBQUFBLElBRUEsZUFBZSxPQUFPLFlBQVk7QUFDaEMsWUFBTSxjQUFjLEtBQUssWUFBWSxHQUFHLFFBQVEsRUFBRSxPQUFPLEdBQUcsT0FBTztBQUNuRSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsZ0JBQWdCLE9BQU8sRUFBRSxXQUFXLFFBQVEsTUFBTSxNQUFNO0FBQ3RELFlBQU0sY0FBYyxNQUFNLGVBQXdCLFVBQVU7QUFDNUQsWUFBTSxXQUFXLFlBQ2QsT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLFNBQVMsRUFDdkMsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTO0FBQzNDLGFBQU8sU0FBUyxFQUFFLE9BQU8sVUFBVSxRQUFRLE1BQU0sQ0FBQztBQUFBLElBQ3BEO0FBQUEsSUFFQSxzQkFBc0IsT0FBTyxFQUFFLFdBQVcsUUFBUSxNQUFNLE1BQU07QUFDNUQsWUFBTSxXQUFXLE1BQU0sZUFBcUIsT0FBTztBQUNuRCxZQUFNLFdBQVcsU0FDZCxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsU0FBUyxFQUN2QyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7QUFDbkMsYUFBTyxTQUFTLEVBQUUsT0FBTyxVQUFVLFFBQVEsTUFBTSxDQUFDO0FBQUEsSUFDcEQ7QUFBQSxJQUVBLHNCQUFzQixPQUFPLEVBQUUsV0FBVyxRQUFRLE1BQU0sTUFBTTtBQUM1RCxZQUFNLFdBQVcsTUFBTSxlQUFxQixPQUFPO0FBQ25ELFlBQU0sV0FBVyxTQUNkLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxTQUFTLEVBQ3ZDLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDZCxZQUFJLEVBQUUsY0FBYyxFQUFFLFdBQVc7QUFDL0IsaUJBQU8sRUFBRSxVQUFVLGNBQWMsRUFBRSxTQUFTO0FBQUEsUUFDOUM7QUFDQSxlQUFPLEVBQUUsUUFBUSxFQUFFO0FBQUEsTUFDckIsQ0FBQztBQUNILGFBQU8sU0FBUyxFQUFFLE9BQU8sVUFBVSxRQUFRLE1BQU0sQ0FBQztBQUFBLElBQ3BEO0FBQUEsSUFFQSxZQUFZLE9BQU8sU0FBUztBQUMxQixZQUFNLGNBQWMsS0FBSyxTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxJQUFJO0FBQzFELGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxlQUFlLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDL0IsVUFBSTtBQUNGLGNBQU0sT0FBTyxLQUFLLFNBQVMsR0FBRyxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQzFDLFFBQVE7QUFBQSxNQUVSO0FBQUEsSUFDRjtBQUFBLElBRUEsZUFBZSxPQUFPLEVBQUUsSUFBSSxNQUFNO0FBQ2hDLFlBQU0sV0FBVyxPQUFPLEtBQUssR0FBRyxFQUFFLFNBQVMsV0FBVztBQUN0RCxZQUFNLGNBQWMsS0FBSyxZQUFZLEdBQUcsUUFBUSxPQUFPO0FBQ3ZELFlBQU0sT0FBTyxNQUFNLFNBQXdCLFdBQVc7QUFDdEQsVUFBSSxDQUFDLE1BQU07QUFDVCxlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxlQUFlLE9BQU8sV0FBVztBQUMvQixZQUFNLGVBQWUsV0FBVyxPQUFPLEVBQUUsSUFBSSxZQUFZO0FBQ3ZELGNBQU0sV0FBVyxPQUFPLEtBQUssT0FBTyxFQUFFLEVBQUUsU0FBUyxXQUFXO0FBQzVELGNBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxRQUFRLE9BQU87QUFDdkQsY0FBTSxXQUFXLE1BQU0sU0FBd0IsV0FBVztBQUMxRCxjQUFNLFlBQTJCO0FBQUEsVUFDL0IsR0FBRztBQUFBLFVBQ0gsTUFBTSxPQUFPLFFBQVEsVUFBVSxRQUFRO0FBQUEsUUFDekM7QUFDQSxjQUFNLGNBQWMsYUFBYSxTQUFTO0FBQUEsTUFDNUMsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVBLGtCQUFrQixPQUFPLFNBQVM7QUFDaEMsYUFBTyxNQUFNLGVBQWUsV0FBVyxLQUFLLEVBQUUsSUFBSSxZQUFZO0FBQzVELGNBQU0sV0FBVyxPQUFPLEtBQUssS0FBSyxFQUFFLEVBQUUsU0FBUyxXQUFXO0FBQzFELGNBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxRQUFRLE9BQU87QUFDdkQsY0FBTSxXQUFXLE1BQU0sU0FBd0IsV0FBVztBQUMxRCxZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLElBQUksTUFBTSxXQUFXLEtBQUssRUFBRSxZQUFZO0FBQUEsUUFDaEQ7QUFDQSxjQUFNLFFBQVEsZ0JBQWdCO0FBQUEsVUFDNUIsR0FBRztBQUFBLFVBQ0gsSUFBSTtBQUFBLFFBQ04sQ0FBQztBQUNELFlBQUksT0FBTyxLQUFLLEtBQUssRUFBRSxXQUFXLEdBQUc7QUFDbkMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsY0FBTSxpQkFBZ0M7QUFBQSxVQUNwQyxHQUFHO0FBQUEsVUFDSCxHQUFHO0FBQUEsUUFDTDtBQUNBLGNBQU0sY0FBYyxhQUFhLGNBQWM7QUFDL0MsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVBLGdCQUFnQixPQUFPLEVBQUUsTUFBTSxPQUFPLFFBQVEsTUFBTSxNQUFNO0FBQ3hELFlBQU0sZUFBZSxNQUFNLGVBQThCLFVBQVU7QUFDbkUsVUFBSSxXQUFXO0FBQ2YsVUFBSSxRQUFRLE9BQU8sS0FBSyxJQUFJLEVBQUUsU0FBUyxHQUFHO0FBQ3hDLG1CQUFXLFNBQVMsT0FBTyxDQUFDLE1BQU07QUFDaEMsZ0JBQU0sY0FBYyxFQUFFLFFBQVEsQ0FBQztBQUMvQixpQkFBTyxPQUFPLFFBQVEsSUFBSSxFQUFFO0FBQUEsWUFBTSxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQzVDLE1BQU0sWUFBWSxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQy9CO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUNBLFlBQU0sWUFBWSxPQUFPLFdBQVcsZ0JBQWdCLElBQ2hELG1CQUNBO0FBQ0osWUFBTSxVQUFVLE9BQU8sU0FBUyxPQUFPLElBQUksS0FBSztBQUNoRCxlQUFTO0FBQUEsUUFDUCxDQUFDLEdBQUcsTUFBTSxZQUFZLEVBQUUsU0FBUyxLQUFLLE1BQU0sRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM5RDtBQUNBLGFBQU8sU0FBUyxFQUFFLE9BQU8sVUFBVSxRQUFRLE1BQU0sQ0FBQztBQUFBLElBQ3BEO0FBQUEsSUFFQSxtQkFBbUIsT0FBTyxFQUFFLFdBQVcsS0FBSyxNQUFNO0FBQ2hELGFBQU8sTUFBTSxlQUFlLFdBQVcsU0FBUyxJQUFJLFlBQVk7QUFDOUQsY0FBTSxXQUFXLE9BQU8sS0FBSyxTQUFTLEVBQUUsU0FBUyxXQUFXO0FBQzVELGNBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxRQUFRLE9BQU87QUFDdkQsY0FBTSxXQUFXLE1BQU0sU0FBd0IsV0FBVztBQUMxRCxZQUFJLENBQUMsVUFBVTtBQUNiLGdCQUFNLElBQUksTUFBTSxXQUFXLFNBQVMsWUFBWTtBQUFBLFFBQ2xEO0FBQ0EsY0FBTSxhQUFhLEVBQUUsR0FBRyxTQUFTLE1BQU0sR0FBRyxLQUFLO0FBQy9DLGNBQU0saUJBQWdDO0FBQUEsVUFDcEMsR0FBRztBQUFBLFVBQ0gsTUFBTTtBQUFBLFFBQ1I7QUFDQSxjQUFNLGNBQWMsYUFBYSxjQUFjO0FBQy9DLGVBQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsT0FBTyxFQUFFLFVBQVUsTUFBTTtBQUMvQyxZQUFNLGNBQWMsS0FBSyxZQUFZLEdBQUcsU0FBUyxPQUFPO0FBQ3hELFlBQU0sVUFBVSxNQUFNLFNBQWtCLFdBQVc7QUFDbkQsVUFBSSxDQUFDLFNBQVMsV0FBVztBQUN2QixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sV0FBVyxPQUFPLEtBQUssUUFBUSxTQUFTLEVBQUUsU0FBUyxXQUFXO0FBQ3BFLGFBQU8sTUFBTTtBQUFBLFFBQ1gsS0FBSyxZQUFZLEdBQUcsUUFBUSxPQUFPO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBQUEsSUFFQSxlQUFlLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDL0IsYUFBTyxNQUFNLFNBQWtCLEtBQUssWUFBWSxHQUFHLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxJQUVBLGVBQWUsT0FBTyxZQUFZO0FBQ2hDLFlBQU0sY0FBYyxLQUFLLFlBQVksR0FBRyxRQUFRLEVBQUUsT0FBTyxHQUFHLE9BQU87QUFDbkUsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLGFBQWEsT0FBTyxFQUFFLElBQUksTUFBTTtBQUM5QixZQUFNLFdBQVcsT0FBTyxLQUFLLEdBQUcsRUFBRSxTQUFTLFdBQVc7QUFDdEQsYUFBTyxNQUFNLFNBQXdCLEtBQUssVUFBVSxHQUFHLFFBQVEsT0FBTyxDQUFDO0FBQUEsSUFDekU7QUFBQSxJQUVBLGdCQUFnQixPQUFPLEVBQUUsSUFBSSxNQUFNO0FBQ2pDLFlBQU0sZUFBZSxTQUFTLEdBQUcsSUFBSSxZQUFZO0FBQy9DLGNBQU0sV0FBVyxPQUFPLEtBQUssR0FBRyxFQUFFLFNBQVMsV0FBVztBQUN0RCxjQUFNLE9BQU8sS0FBSyxVQUFVLEdBQUcsUUFBUSxPQUFPLENBQUMsRUFBRSxNQUFNLE1BQU0sTUFBUztBQUFBLE1BQ3hFLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxhQUFhLE9BQU8sYUFBYTtBQUMvQixZQUFNLGVBQWUsU0FBUyxTQUFTLEdBQUcsSUFBSSxZQUFZO0FBQ3hELGNBQU0sV0FBVyxPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsU0FBUyxXQUFXO0FBQy9ELGNBQU0sY0FBYyxLQUFLLFVBQVUsR0FBRyxRQUFRLE9BQU8sR0FBRyxRQUFRO0FBQUEsTUFDbEUsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVBLHFCQUFxQixPQUFPLEVBQUUsS0FBSyxRQUFRLGNBQWMsTUFBTTtBQUM3RCxhQUFPLE1BQU0sZUFBZSxTQUFTLEdBQUcsSUFBSSxZQUFZO0FBQ3RELGNBQU0sV0FBVyxPQUFPLEtBQUssR0FBRyxFQUFFLFNBQVMsV0FBVztBQUN0RCxjQUFNLFdBQVcsS0FBSyxVQUFVLEdBQUcsUUFBUSxPQUFPO0FBQ2xELGNBQU0sV0FBVyxNQUFNLFNBQXdCLFFBQVE7QUFDdkQsWUFDRSxVQUFVLG1CQUNWLFNBQVMsbUJBQ1QsS0FBSyxJQUFJLElBQUksU0FBUyxrQkFBa0IsZUFDeEM7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFDQSxjQUFNLE1BQU0sS0FBSyxJQUFJO0FBQ3JCLGNBQU0sV0FBMEI7QUFBQSxVQUM5QjtBQUFBLFVBQ0EsWUFBWSxVQUFVLGNBQWM7QUFBQSxVQUNwQyxXQUFXLFVBQVUsYUFBYTtBQUFBLFVBQ2xDLFlBQVksVUFBVSxjQUFjO0FBQUEsVUFDcEMsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsUUFDbkI7QUFDQSxjQUFNLGNBQWMsVUFBVSxRQUFRO0FBQ3RDLGVBQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx1QkFBdUIsT0FBTyxFQUFFLFFBQVEsY0FBYyxNQUFNO0FBQzFELGFBQU8sTUFBTSxlQUFlLFdBQVcsT0FBTyxFQUFFLElBQUksWUFBWTtBQUM5RCxjQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sRUFBRSxFQUFFLFNBQVMsV0FBVztBQUM1RCxjQUFNLFdBQVcsS0FBSyxZQUFZLEdBQUcsUUFBUSxPQUFPO0FBQ3BELGNBQU0sV0FBVyxNQUFNLFNBQXdCLFFBQVE7QUFDdkQsWUFDRSxVQUFVLG1CQUNWLFNBQVMsbUJBQ1QsS0FBSyxJQUFJLElBQUksU0FBUyxrQkFBa0IsZUFDeEM7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFDQSxjQUFNLGVBQ0osVUFBVSxZQUFZLFFBQVEsU0FBUyxhQUFhLE9BQU87QUFDN0QsY0FBTSxZQUEyQjtBQUFBLFVBQy9CLEdBQUc7QUFBQSxVQUNILE1BQU0sT0FBTyxRQUFRLFVBQVUsUUFBUTtBQUFBLFVBQ3ZDLGtCQUFrQixlQUNiLFNBQVMsb0JBQW9CLE9BQzlCO0FBQUEsUUFDTjtBQUNBLGNBQU0sY0FBYyxVQUFVLFNBQVM7QUFDdkMsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVBLGdCQUFnQixPQUFPLEVBQUUsV0FBVyxpQkFBaUIsUUFBUSxNQUFNLE1BQU07QUFDdkUsWUFBTSxjQUFjLE1BQU0sZUFBd0IsVUFBVTtBQUM1RCxVQUFJLFdBQVcsWUFBWSxPQUFPLENBQUMsTUFBTSxFQUFFLGNBQWMsU0FBUztBQUNsRSxVQUFJLENBQUMsaUJBQWlCO0FBQ3BCLG1CQUFXLFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLFNBQVM7QUFBQSxNQUMxRDtBQUNBLGVBQVMsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTO0FBQ2pELGFBQU8sU0FBUyxFQUFFLE9BQU8sVUFBVSxRQUFRLE1BQU0sQ0FBQztBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
cacheSandbox,
|
|
3
|
-
createSandbox,
|
|
4
|
-
evictSandbox,
|
|
5
|
-
getSandbox
|
|
6
|
-
} from "./chunk-AML2VCQS.mjs";
|
|
7
|
-
import "./chunk-ZIAHPXOJ.mjs";
|
|
8
|
-
import "./chunk-TAXLUVIC.mjs";
|
|
9
|
-
import "./chunk-SJVFFE5D.mjs";
|
|
10
|
-
import "./chunk-OZZVS6L5.mjs";
|
|
11
|
-
import "./chunk-NXDVNJRS.mjs";
|
|
12
|
-
import "./chunk-TGNVXSMX.mjs";
|
|
13
|
-
import "./chunk-YRYXN7W4.mjs";
|
|
14
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
15
|
-
export {
|
|
16
|
-
cacheSandbox,
|
|
17
|
-
createSandbox,
|
|
18
|
-
evictSandbox,
|
|
19
|
-
getSandbox
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import "./chunk-TAXLUVIC.mjs";
|
|
2
|
-
import {
|
|
3
|
-
STORAGE_RPC_METHODS,
|
|
4
|
-
handleStorageRpc
|
|
5
|
-
} from "./chunk-SJVFFE5D.mjs";
|
|
6
|
-
import {
|
|
7
|
-
DEFAULT_NAMESPACE,
|
|
8
|
-
LOCAL_STORAGE_VERSION,
|
|
9
|
-
getStorage
|
|
10
|
-
} from "./chunk-TGNVXSMX.mjs";
|
|
11
|
-
import "./chunk-YRYXN7W4.mjs";
|
|
12
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
13
|
-
export {
|
|
14
|
-
DEFAULT_NAMESPACE,
|
|
15
|
-
LOCAL_STORAGE_VERSION,
|
|
16
|
-
STORAGE_RPC_METHODS,
|
|
17
|
-
getStorage,
|
|
18
|
-
handleStorageRpc
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
|
package/dist/vercel-SD3JTECG.mjs
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
2
|
-
|
|
3
|
-
// src/storage/bindings/vercel.ts
|
|
4
|
-
var VERCEL_STORAGE_URL = process.env.AGENT_VERCEL_STORAGE_URL ?? "https://agent-sdk-storage-nine.labs.vercel.dev/api/storage";
|
|
5
|
-
async function getVercelStorageConfig() {
|
|
6
|
-
let token = null;
|
|
7
|
-
try {
|
|
8
|
-
const { getVercelOidcToken } = await import("@vercel/oidc");
|
|
9
|
-
token = await getVercelOidcToken();
|
|
10
|
-
} catch {
|
|
11
|
-
}
|
|
12
|
-
return {
|
|
13
|
-
url: VERCEL_STORAGE_URL,
|
|
14
|
-
headers: token ? { Authorization: `Bearer ${token}` } : {}
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export {
|
|
18
|
-
getVercelStorageConfig
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvdmVyY2VsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBWRVJDRUxfU1RPUkFHRV9VUkwgPVxuICBwcm9jZXNzLmVudi5BR0VOVF9WRVJDRUxfU1RPUkFHRV9VUkwgPz9cbiAgXCJodHRwczovL2FnZW50LXNkay1zdG9yYWdlLW5pbmUubGFicy52ZXJjZWwuZGV2L2FwaS9zdG9yYWdlXCI7XG5cbmV4cG9ydCB0eXBlIFZlcmNlbFN0b3JhZ2VDb25maWcgPSB7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTogUHJvbWlzZTxWZXJjZWxTdG9yYWdlQ29uZmlnPiB7XG4gIGxldCB0b2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGdldFZlcmNlbE9pZGNUb2tlbiB9ID0gYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9vaWRjXCIpO1xuICAgIHRva2VuID0gYXdhaXQgZ2V0VmVyY2VsT2lkY1Rva2VuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE9JREMgbm90IGF2YWlsYWJsZSAobG9jYWwgZGV2LCBub24tVmVyY2VsIGVudmlyb25tZW50KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IFZFUkNFTF9TVE9SQUdFX1VSTCxcbiAgICBoZWFkZXJzOiB0b2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAgfSA6IHt9LFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBQUEsSUFBTSxxQkFDSixRQUFRLElBQUksNEJBQ1o7QUFPRixlQUFzQix5QkFBdUQ7QUFDM0UsTUFBSSxRQUF1QjtBQUUzQixNQUFJO0FBQ0YsVUFBTSxFQUFFLG1CQUFtQixJQUFJLE1BQU0sT0FBTyxjQUFjO0FBQzFELFlBQVEsTUFBTSxtQkFBbUI7QUFBQSxFQUNuQyxRQUFRO0FBQUEsRUFFUjtBQUVBLFNBQU87QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLFNBQVMsUUFBUSxFQUFFLGVBQWUsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDM0Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import "./chunk-BJTO5JO5.mjs";
|
|
2
|
-
|
|
3
|
-
// src/sandbox/bindings/vercel-sdk.ts
|
|
4
|
-
import { Sandbox } from "@vercel/sandbox";
|
|
5
|
-
export {
|
|
6
|
-
Sandbox
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLXNkay50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgU2FuZGJveCB9IGZyb20gXCJAdmVyY2VsL3NhbmRib3hcIjtcbiJdLAogICJtYXBwaW5ncyI6ICI7OztBQUFBLFNBQVMsZUFBZTsiLAogICJuYW1lcyI6IFtdCn0K
|