experimental-agent 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +13 -2
  2. package/dist/agent-workflow.d.mts +11 -3
  3. package/dist/agent-workflow.d.ts +11 -3
  4. package/dist/agent-workflow.js +1921 -1144
  5. package/dist/agent-workflow.mjs +7 -3
  6. package/dist/chunk-3ODWQVIA.mjs +12 -0
  7. package/dist/chunk-64THY7Y7.mjs +155 -0
  8. package/dist/chunk-GSRJYPWF.mjs +284 -0
  9. package/dist/chunk-HJGPUEFC.mjs +42 -0
  10. package/dist/chunk-JEE2FQ4O.mjs +844 -0
  11. package/dist/chunk-TQRCSTCF.mjs +103 -0
  12. package/dist/chunk-UFVWOC5L.mjs +79 -0
  13. package/dist/chunk-VBLZWXVE.mjs +318 -0
  14. package/dist/chunk-ZASQBPOI.mjs +2057 -0
  15. package/dist/{types-DPXFq_r6.d.ts → client-BlSrVoPI.d.mts} +868 -31
  16. package/dist/{types-DPXFq_r6.d.mts → client-BlSrVoPI.d.ts} +868 -31
  17. package/dist/client-SREKHM6I.mjs +15 -0
  18. package/dist/client.d.mts +37 -0
  19. package/dist/client.d.ts +37 -0
  20. package/dist/client.js +58 -0
  21. package/dist/client.mjs +30 -0
  22. package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
  23. package/dist/index.d.mts +3 -4
  24. package/dist/index.d.ts +3 -4
  25. package/dist/index.js +3102 -1438
  26. package/dist/index.mjs +720 -147
  27. package/dist/lifecycle-workflow.d.mts +3 -10
  28. package/dist/lifecycle-workflow.d.ts +3 -10
  29. package/dist/lifecycle-workflow.js +170 -1246
  30. package/dist/lifecycle-workflow.mjs +5 -41
  31. package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
  32. package/dist/next/loader.d.mts +14 -0
  33. package/dist/next/loader.d.ts +14 -0
  34. package/dist/next/loader.js +206 -0
  35. package/dist/next/loader.mjs +103 -0
  36. package/dist/next.d.mts +34 -0
  37. package/dist/next.d.ts +34 -0
  38. package/dist/next.js +329 -0
  39. package/dist/next.mjs +224 -0
  40. package/dist/process-manager-JAKAXROL.mjs +10 -0
  41. package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
  42. package/dist/storage-Q376OZH3.mjs +20 -0
  43. package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
  44. package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
  45. package/package.json +32 -19
  46. package/dist/chunk-24DJSI7C.mjs +0 -374
  47. package/dist/chunk-4RGMKC2M.mjs +0 -755
  48. package/dist/chunk-6ICYKNCC.mjs +0 -284
  49. package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
  50. package/dist/client-BBpD9kKL.d.ts +0 -193
  51. package/dist/client-BGJViybU.d.mts +0 -193
  52. package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
  53. package/dist/local-BYPFRMLZ.mjs +0 -282
  54. package/dist/process-manager-H2HF6G4G.mjs +0 -153
  55. package/dist/sandbox-BFA4ECEQ.mjs +0 -10
  56. package/dist/storage-2U2QFNWI.mjs +0 -27
  57. /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
@@ -1,755 +0,0 @@
1
- import {
2
- SandboxError,
3
- SandboxNotFoundError,
4
- getStorage
5
- } from "./chunk-24DJSI7C.mjs";
6
-
7
- // src/sandbox/bindings/local.ts
8
- import { spawn } from "node:child_process";
9
- import * as errore from "errore";
10
- import { ulid } from "ulid";
11
-
12
- // src/sandbox/write-files.ts
13
- import * as path from "node:path";
14
- async function writeFiles(opts) {
15
- const { sandbox, files, destPath } = opts;
16
- if (files.length === 0) {
17
- return;
18
- }
19
- const filePaths = files.map(
20
- (file) => path.posix.join(destPath, file.path)
21
- );
22
- const parentDirs = Array.from(
23
- new Set(filePaths.map((p) => path.posix.dirname(p)))
24
- );
25
- const shellScripts = filePaths.filter((p) => p.endsWith(".sh"));
26
- const mkdirResult = await sandbox.exec({
27
- command: "mkdir",
28
- args: ["-p", ...parentDirs]
29
- });
30
- if (mkdirResult instanceof Error) {
31
- throw mkdirResult;
32
- }
33
- await mkdirResult.result;
34
- const CHUNK_SIZE = 5e4;
35
- for (let i = 0; i < files.length; i++) {
36
- const file = files[i];
37
- const fullPath = filePaths[i];
38
- const base64Content = toBase64(file.content);
39
- if (base64Content.length < CHUNK_SIZE) {
40
- const marker = `EOF_${i}`;
41
- const execResult = await sandbox.exec({
42
- command: "bash",
43
- args: [
44
- "-c",
45
- `base64 -d > ${quote(fullPath)} << '${marker}'
46
- ${base64Content}
47
- ${marker}`
48
- ]
49
- });
50
- if (execResult instanceof Error) {
51
- throw execResult;
52
- }
53
- const { exitCode, stderr } = await execResult.result;
54
- if (exitCode !== 0) {
55
- throw new Error(
56
- `writeFiles failed with exit code ${exitCode}: ${stderr}`
57
- );
58
- }
59
- } else {
60
- const tempB64 = `/tmp/chunk-${Date.now()}-${i}.b64`;
61
- const clearResult = await sandbox.exec({
62
- command: "bash",
63
- args: ["-c", `> ${quote(tempB64)}`]
64
- });
65
- if (clearResult instanceof Error) {
66
- throw clearResult;
67
- }
68
- await clearResult.result;
69
- for (let offset = 0; offset < base64Content.length; offset += CHUNK_SIZE) {
70
- const chunk = base64Content.slice(offset, offset + CHUNK_SIZE);
71
- const marker = `CHUNK_${offset}`;
72
- const appendResult = await sandbox.exec({
73
- command: "bash",
74
- args: [
75
- "-c",
76
- `cat >> ${quote(tempB64)} << '${marker}'
77
- ${chunk}
78
- ${marker}`
79
- ]
80
- });
81
- if (appendResult instanceof Error) {
82
- throw appendResult;
83
- }
84
- const { exitCode: exitCode2, stderr: stderr2 } = await appendResult.result;
85
- if (exitCode2 !== 0) {
86
- throw new Error(
87
- `writeFiles chunk failed with exit code ${exitCode2}: ${stderr2}`
88
- );
89
- }
90
- }
91
- const decodeResult = await sandbox.exec({
92
- command: "bash",
93
- args: [
94
- "-c",
95
- `base64 -d < ${quote(tempB64)} > ${quote(fullPath)} && rm -f ${quote(tempB64)}`
96
- ]
97
- });
98
- if (decodeResult instanceof Error) {
99
- throw decodeResult;
100
- }
101
- const { exitCode, stderr } = await decodeResult.result;
102
- if (exitCode !== 0) {
103
- throw new Error(
104
- `writeFiles decode failed with exit code ${exitCode}: ${stderr}`
105
- );
106
- }
107
- }
108
- }
109
- if (shellScripts.length > 0) {
110
- const chmodResult = await sandbox.exec({
111
- command: "chmod",
112
- args: ["+x", ...shellScripts]
113
- });
114
- if (chmodResult instanceof Error) {
115
- throw chmodResult;
116
- }
117
- await chmodResult.result;
118
- }
119
- }
120
- function toBase64(content) {
121
- if (typeof content === "string") {
122
- return Buffer.from(content).toString("base64");
123
- }
124
- return content.toString("base64");
125
- }
126
- function quote(s) {
127
- return `'${s.replace(/'/g, "'\\''")}'`;
128
- }
129
-
130
- // src/sandbox/bindings/local.ts
131
- var localSandbox = ({
132
- sandboxRecord,
133
- storageConfig
134
- }) => {
135
- const config = sandboxRecord.config;
136
- const basePath = config.path ?? process.cwd();
137
- const processes = /* @__PURE__ */ new Map();
138
- const storage = getStorage(storageConfig);
139
- const sandbox = {
140
- id: sandboxRecord.id,
141
- config: sandboxRecord.config,
142
- exec: ({ command, args, signal }) => {
143
- return errore.tryAsync({
144
- try: () => {
145
- const commandId = `command_${ulid()}`;
146
- const child = spawn(command, args, {
147
- cwd: basePath,
148
- signal
149
- });
150
- processes.set(commandId, child);
151
- let stdout = "";
152
- let stderr = "";
153
- const logQueue = [];
154
- let logResolve = null;
155
- let closed = false;
156
- child.stdout.on("data", (data) => {
157
- const str = String(data);
158
- stdout += str;
159
- logQueue.push({ stream: "stdout", data: str });
160
- logResolve?.();
161
- });
162
- child.stderr.on("data", (data) => {
163
- const str = String(data);
164
- stderr += str;
165
- logQueue.push({ stream: "stderr", data: str });
166
- logResolve?.();
167
- });
168
- const result = new Promise((resolve, reject) => {
169
- child.on("error", (err) => {
170
- processes.delete(commandId);
171
- closed = true;
172
- logResolve?.();
173
- reject(err);
174
- });
175
- child.on("close", (code) => {
176
- processes.delete(commandId);
177
- closed = true;
178
- logResolve?.();
179
- resolve({ stdout, stderr, exitCode: code ?? 0 });
180
- });
181
- });
182
- async function* logs() {
183
- while (!closed || logQueue.length > 0) {
184
- const entry = logQueue.shift();
185
- if (entry) {
186
- yield entry;
187
- } else if (!closed) {
188
- await new Promise((resolve) => {
189
- logResolve = resolve;
190
- });
191
- logResolve = null;
192
- }
193
- }
194
- }
195
- return Promise.resolve({ commandId, logs, result });
196
- },
197
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
198
- });
199
- },
200
- getDomain: (port) => {
201
- return Promise.resolve(`http://localhost:${port}`);
202
- },
203
- kill: async ({ commandId, storage: storage2 }) => {
204
- const child = processes.get(commandId);
205
- if (!child) {
206
- return new SandboxError({
207
- reason: `Command ${commandId} not found or already finished`
208
- });
209
- }
210
- child.kill("SIGTERM");
211
- const cmd = await storage2.command.get(commandId);
212
- if (cmd instanceof Error) {
213
- return new SandboxError({ reason: cmd.message, cause: cmd });
214
- }
215
- if (cmd && cmd.status === "running") {
216
- const result = await storage2.command.set({
217
- ...cmd,
218
- status: "killed"
219
- });
220
- if (result instanceof Error) {
221
- return new SandboxError({ reason: result.message, cause: result });
222
- }
223
- }
224
- },
225
- writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
226
- tag: {
227
- list: async () => {
228
- const sandboxRecord2 = await storage.sandbox.get(sandbox.id);
229
- if (sandboxRecord2 instanceof Error) {
230
- return sandboxRecord2;
231
- }
232
- return sandboxRecord2.tags ?? {};
233
- },
234
- get: async (key) => {
235
- const sandboxRecord2 = await storage.sandbox.get(sandbox.id);
236
- if (sandboxRecord2 instanceof Error) {
237
- return sandboxRecord2;
238
- }
239
- return sandboxRecord2.tags?.[key];
240
- },
241
- set: async (key, value) => {
242
- const result = await storage.sandbox.tag.set({
243
- sandboxId: sandbox.id,
244
- tags: { [key]: value }
245
- });
246
- if (result instanceof Error) {
247
- return result;
248
- }
249
- return void 0;
250
- },
251
- setMany: async (tags) => {
252
- const result = await storage.sandbox.tag.set({
253
- sandboxId: sandbox.id,
254
- tags
255
- });
256
- if (result instanceof Error) {
257
- return result;
258
- }
259
- return void 0;
260
- }
261
- }
262
- };
263
- return sandbox;
264
- };
265
-
266
- // src/sandbox/bindings/vercel.ts
267
- import * as errore2 from "errore";
268
- import { Sandbox as VercelSandboxSDK } from "sandbox";
269
- var VERCEL_MAX_TIMEOUT_MS = 5 * 60 * 60 * 1e3;
270
- var LOCK_TIMEOUT_MS = 2 * 60 * 1e3;
271
- var LOCK_POLL_INTERVAL_MS = 200;
272
- var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
273
- token: process.env.TEST_VERCEL_TOKEN,
274
- teamId: process.env.TEST_VERCEL_TEAM_ID,
275
- projectId: process.env.TEST_VERCEL_PROJECT_ID
276
- } : {};
277
- var createPromises = /* @__PURE__ */ new Map();
278
- var ACTIVITY_THROTTLE_MS = 1e4;
279
- var lastActivitySent = /* @__PURE__ */ new Map();
280
- var DEFAULT_VCPUS = 2;
281
- var vercelSandbox = ({
282
- sandboxRecord,
283
- storageConfig,
284
- enableLifecycleWorkflow = true,
285
- storage: storageOverride
286
- }) => {
287
- const { id, config } = sandboxRecord;
288
- const vcpus = config.resources?.vcpus ?? DEFAULT_VCPUS;
289
- const ports = config.ports;
290
- const storage = storageOverride ?? getStorage(storageConfig);
291
- const initialVercel = sandboxRecord.providerMetadata?.provider === "vercel" ? sandboxRecord.providerMetadata : null;
292
- let sandboxPromise = null;
293
- const HOME_DIR = "/home/vercel-sandbox";
294
- async function pollForSandboxId() {
295
- const deadline = Date.now() + LOCK_TIMEOUT_MS;
296
- while (Date.now() < deadline) {
297
- await new Promise((r) => setTimeout(r, LOCK_POLL_INTERVAL_MS));
298
- const record = await storage.sandbox.get(id);
299
- if (record instanceof Error) {
300
- return new SandboxError({ reason: record.message, cause: record });
301
- }
302
- const vercelSandboxId = record?.providerMetadata?.provider === "vercel" ? record.providerMetadata.sandboxId : null;
303
- if (vercelSandboxId) {
304
- return vercelSandboxId;
305
- }
306
- if (!record?.acquiringLockAt) {
307
- const finalCheck = await storage.sandbox.get(id);
308
- if (finalCheck instanceof Error) {
309
- return new SandboxError({
310
- reason: finalCheck.message,
311
- cause: finalCheck
312
- });
313
- }
314
- const finalVercelSandboxId = finalCheck?.providerMetadata?.provider === "vercel" ? finalCheck.providerMetadata.sandboxId : null;
315
- if (finalVercelSandboxId) {
316
- return finalVercelSandboxId;
317
- }
318
- return doGetOrCreateSandboxId();
319
- }
320
- }
321
- return new SandboxError({
322
- reason: "Timed out waiting for sandbox creation by another process"
323
- });
324
- }
325
- async function createSandboxFromSnapshot(snapshotId) {
326
- return await errore2.tryAsync({
327
- try: async () => {
328
- const sandbox2 = await VercelSandboxSDK.create({
329
- source: { type: "snapshot", snapshotId },
330
- resources: { vcpus },
331
- timeout: VERCEL_MAX_TIMEOUT_MS,
332
- ports,
333
- ...getTestCredentials()
334
- });
335
- const now = Date.now();
336
- await storage.sandbox.set({
337
- id,
338
- config,
339
- tags: sandboxRecord.tags,
340
- createdAt: now,
341
- lastActivityAt: now,
342
- acquiringLockId: null,
343
- acquiringLockAt: null,
344
- providerMetadata: {
345
- provider: "vercel",
346
- sandboxId: sandbox2.sandboxId,
347
- snapshotId
348
- }
349
- });
350
- return sandbox2.sandboxId;
351
- },
352
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
353
- });
354
- }
355
- async function createFreshSandbox() {
356
- return await errore2.tryAsync({
357
- try: async () => {
358
- const sandbox2 = await VercelSandboxSDK.create({
359
- resources: { vcpus },
360
- timeout: VERCEL_MAX_TIMEOUT_MS,
361
- ports,
362
- ...getTestCredentials()
363
- });
364
- const now = Date.now();
365
- await storage.sandbox.set({
366
- id,
367
- config,
368
- tags: sandboxRecord.tags,
369
- createdAt: now,
370
- lastActivityAt: now,
371
- acquiringLockId: null,
372
- acquiringLockAt: null,
373
- providerMetadata: {
374
- provider: "vercel",
375
- sandboxId: sandbox2.sandboxId,
376
- snapshotId: null
377
- }
378
- });
379
- return sandbox2.sandboxId;
380
- },
381
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
382
- });
383
- }
384
- async function doGetOrCreateSandboxId() {
385
- if (initialVercel?.sandboxId) {
386
- return initialVercel.sandboxId;
387
- }
388
- const existing = await storage.sandbox.get(id);
389
- if (existing instanceof Error) {
390
- if (existing instanceof SandboxNotFoundError) {
391
- } else {
392
- return new SandboxError({ reason: existing.message, cause: existing });
393
- }
394
- }
395
- const existingRecord = existing instanceof SandboxNotFoundError ? null : existing;
396
- const existingVercel = existingRecord?.providerMetadata?.provider === "vercel" ? existingRecord.providerMetadata : null;
397
- if (existingVercel?.sandboxId) {
398
- return existingVercel.sandboxId;
399
- }
400
- const hasActiveLock = existingRecord?.acquiringLockId && existingRecord.acquiringLockAt && Date.now() - existingRecord.acquiringLockAt < LOCK_TIMEOUT_MS;
401
- if (hasActiveLock) {
402
- return pollForSandboxId();
403
- }
404
- const lockId = crypto.randomUUID();
405
- const now = Date.now();
406
- await storage.sandbox.set({
407
- id,
408
- config,
409
- tags: existingRecord?.tags ?? sandboxRecord.tags,
410
- createdAt: existingRecord?.createdAt ?? sandboxRecord.createdAt,
411
- lastActivityAt: existingRecord?.lastActivityAt ?? sandboxRecord.lastActivityAt,
412
- acquiringLockId: lockId,
413
- acquiringLockAt: now,
414
- providerMetadata: {
415
- provider: "vercel",
416
- sandboxId: null,
417
- snapshotId: existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? null
418
- }
419
- });
420
- const afterLock = await storage.sandbox.get(id);
421
- if (afterLock instanceof Error) {
422
- return new SandboxError({ reason: afterLock.message, cause: afterLock });
423
- }
424
- if (afterLock?.acquiringLockId !== lockId) {
425
- return pollForSandboxId();
426
- }
427
- const snapshotId = existingVercel?.snapshotId ?? initialVercel?.snapshotId ?? config.lifecycle?.snapshotId;
428
- if (snapshotId) {
429
- const result = await createSandboxFromSnapshot(snapshotId);
430
- if (!(result instanceof Error)) {
431
- return result;
432
- }
433
- }
434
- return createFreshSandbox();
435
- }
436
- function getOrCreateSandboxId() {
437
- const cached = createPromises.get(id);
438
- if (cached) {
439
- return cached;
440
- }
441
- const promise = doGetOrCreateSandboxId().finally(() => {
442
- createPromises.delete(id);
443
- });
444
- createPromises.set(id, promise);
445
- return promise;
446
- }
447
- async function doGetSandbox() {
448
- const vercelSandboxId = await getOrCreateSandboxId();
449
- if (vercelSandboxId instanceof Error) {
450
- return vercelSandboxId;
451
- }
452
- return errore2.tryAsync({
453
- try: () => VercelSandboxSDK.get({
454
- sandboxId: vercelSandboxId,
455
- ...getTestCredentials()
456
- }),
457
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
458
- });
459
- }
460
- function getSandbox2() {
461
- if (!sandboxPromise) {
462
- sandboxPromise = doGetSandbox();
463
- }
464
- return sandboxPromise;
465
- }
466
- async function updateLastActivity() {
467
- const now = Date.now();
468
- const lastSent = lastActivitySent.get(id);
469
- if (lastSent && now - lastSent < ACTIVITY_THROTTLE_MS) {
470
- return;
471
- }
472
- lastActivitySent.set(id, now);
473
- const existing = await storage.sandbox.get(id);
474
- if (existing instanceof Error || !existing) {
475
- return;
476
- }
477
- const existingVercel = existing.providerMetadata?.provider === "vercel" ? existing.providerMetadata : null;
478
- await storage.sandbox.set({
479
- id: existing.id,
480
- config: existing.config,
481
- tags: existing.tags,
482
- createdAt: existing.createdAt,
483
- lastActivityAt: now,
484
- acquiringLockId: null,
485
- acquiringLockAt: null,
486
- providerMetadata: existingVercel ?? {
487
- provider: "vercel",
488
- sandboxId: null,
489
- snapshotId: null
490
- }
491
- });
492
- if (enableLifecycleWorkflow) {
493
- }
494
- }
495
- const lifecycle = {
496
- start: async () => {
497
- const sandbox2 = await getSandbox2();
498
- if (sandbox2 instanceof Error) {
499
- return sandbox2;
500
- }
501
- await updateLastActivity();
502
- return sandbox2.status;
503
- },
504
- snapshot: async () => {
505
- const sandbox2 = await getSandbox2();
506
- if (sandbox2 instanceof Error) {
507
- return sandbox2;
508
- }
509
- return errore2.tryAsync({
510
- try: async () => {
511
- const existing = await storage.sandbox.get(id);
512
- const snapshot = await sandbox2.snapshot();
513
- await storage.sandbox.set({
514
- id,
515
- config,
516
- tags: existing instanceof Error ? null : existing?.tags ?? null,
517
- createdAt: existing instanceof Error ? null : existing?.createdAt ?? null,
518
- lastActivityAt: existing instanceof Error ? null : existing?.lastActivityAt ?? null,
519
- acquiringLockId: null,
520
- acquiringLockAt: null,
521
- providerMetadata: {
522
- provider: "vercel",
523
- sandboxId: null,
524
- snapshotId: snapshot.snapshotId
525
- }
526
- });
527
- return { snapshotId: snapshot.snapshotId };
528
- },
529
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
530
- });
531
- },
532
- stop: async () => {
533
- const sandbox2 = await getSandbox2();
534
- if (sandbox2 instanceof Error) {
535
- return sandbox2;
536
- }
537
- return errore2.tryAsync({
538
- try: async () => {
539
- await sandbox2.stop();
540
- const existing = await storage.sandbox.get(id);
541
- if (existing instanceof Error || !existing) {
542
- return void 0;
543
- }
544
- await storage.sandbox.set({
545
- id: existing.id,
546
- config: existing.config,
547
- tags: existing.tags,
548
- createdAt: existing.createdAt,
549
- lastActivityAt: existing.lastActivityAt,
550
- acquiringLockId: null,
551
- acquiringLockAt: null,
552
- providerMetadata: {
553
- provider: "vercel",
554
- sandboxId: null,
555
- snapshotId: null
556
- }
557
- });
558
- return void 0;
559
- },
560
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
561
- });
562
- },
563
- getStatus: async () => {
564
- const sandbox2 = await getSandbox2();
565
- if (sandbox2 instanceof Error) {
566
- return sandbox2;
567
- }
568
- return sandbox2.status;
569
- },
570
- getCreatedAt: async () => {
571
- const sandbox2 = await getSandbox2();
572
- if (sandbox2 instanceof Error) {
573
- return sandbox2;
574
- }
575
- return sandbox2.createdAt;
576
- },
577
- getRemainingTimeout: async () => {
578
- const sandbox2 = await getSandbox2();
579
- if (sandbox2 instanceof Error) {
580
- return sandbox2;
581
- }
582
- return sandbox2.timeout;
583
- }
584
- };
585
- const sandbox = {
586
- id,
587
- config,
588
- exec: async ({ command, args, signal }) => {
589
- const instance = await getSandbox2();
590
- if (instance instanceof Error) {
591
- return instance;
592
- }
593
- const updatePromise = updateLastActivity();
594
- const execResult = await errore2.tryAsync({
595
- try: async () => {
596
- const output = await instance.runCommand({
597
- cwd: HOME_DIR,
598
- args,
599
- cmd: command,
600
- signal
601
- });
602
- let stdout = "";
603
- let stderr = "";
604
- const logBuffer = [];
605
- const state = {
606
- resolve: null,
607
- consumed: false
608
- };
609
- const consumeLogs = (async () => {
610
- for await (const log of output.logs()) {
611
- const entry = log.stream === "stdout" ? { stream: "stdout", data: log.data } : { stream: "stderr", data: log.data };
612
- if (log.stream === "stdout") {
613
- stdout += log.data;
614
- } else {
615
- stderr += log.data;
616
- }
617
- logBuffer.push(entry);
618
- state.resolve?.();
619
- }
620
- state.consumed = true;
621
- state.resolve?.();
622
- })();
623
- async function* logs() {
624
- let index = 0;
625
- while (!state.consumed || index < logBuffer.length) {
626
- if (index < logBuffer.length) {
627
- yield logBuffer[index++];
628
- } else {
629
- await new Promise((resolve) => {
630
- state.resolve = resolve;
631
- });
632
- state.resolve = null;
633
- }
634
- }
635
- }
636
- const result = consumeLogs.then(() => ({
637
- stdout,
638
- stderr,
639
- exitCode: output.exitCode
640
- }));
641
- return { commandId: output.cmdId, logs, result };
642
- },
643
- catch: (e) => new SandboxError({ reason: String(e), cause: e })
644
- });
645
- await updatePromise;
646
- return execResult;
647
- },
648
- getDomain: async (port) => {
649
- const sandbox2 = await getSandbox2();
650
- if (sandbox2 instanceof Error) {
651
- return sandbox2;
652
- }
653
- try {
654
- return sandbox2.domain(port);
655
- } catch (e) {
656
- return new SandboxError({ reason: String(e), cause: e });
657
- }
658
- },
659
- kill: async ({ commandId, storage: cmdStorage }) => {
660
- const instance = await getSandbox2();
661
- if (instance instanceof Error) {
662
- return instance;
663
- }
664
- const cmd = await cmdStorage.command.get(commandId);
665
- if (cmd instanceof Error) {
666
- return new SandboxError({ reason: cmd.message, cause: cmd });
667
- }
668
- if (cmd && cmd.status === "running") {
669
- const result = await cmdStorage.command.set({
670
- ...cmd,
671
- status: "killed"
672
- });
673
- if (result instanceof Error) {
674
- return new SandboxError({ reason: result.message, cause: result });
675
- }
676
- }
677
- return void 0;
678
- },
679
- writeFiles: (opts) => writeFiles({ sandbox, ...opts }),
680
- lifecycle,
681
- tag: {
682
- list: async () => {
683
- const sandboxRecord2 = await storage.sandbox.get(id);
684
- if (sandboxRecord2 instanceof Error) {
685
- return sandboxRecord2;
686
- }
687
- return sandboxRecord2.tags ?? {};
688
- },
689
- get: async (key) => {
690
- const sandboxRecord2 = await storage.sandbox.get(id);
691
- if (sandboxRecord2 instanceof Error) {
692
- return sandboxRecord2;
693
- }
694
- return sandboxRecord2.tags?.[key];
695
- },
696
- set: async (key, value) => {
697
- const result = await storage.sandbox.tag.set({
698
- sandboxId: id,
699
- tags: { [key]: value }
700
- });
701
- if (result instanceof Error) {
702
- return result;
703
- }
704
- return void 0;
705
- },
706
- setMany: async (tags) => {
707
- const result = await storage.sandbox.tag.set({
708
- sandboxId: id,
709
- tags
710
- });
711
- if (result instanceof Error) {
712
- return result;
713
- }
714
- return void 0;
715
- }
716
- }
717
- };
718
- if (config.lifecycle?.autoStart !== false) {
719
- sandboxPromise = doGetSandbox();
720
- }
721
- return sandbox;
722
- };
723
-
724
- // src/sandbox/client.ts
725
- function getSandbox({
726
- sandboxRecord,
727
- storageConfig
728
- }) {
729
- const { config } = sandboxRecord;
730
- switch (config.type) {
731
- case "local":
732
- return localSandbox({
733
- sandboxRecord,
734
- storageConfig
735
- });
736
- case "vercel":
737
- return vercelSandbox({
738
- sandboxRecord,
739
- storageConfig
740
- });
741
- case "custom":
742
- throw new Error("Custom sandboxes are not supported");
743
- default:
744
- config;
745
- throw new Error(
746
- `Unknown sandbox type: ${// biome-ignore lint/suspicious/noExplicitAny: .
747
- config.type}`
748
- );
749
- }
750
- }
751
-
752
- export {
753
- getSandbox
754
- };
755
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbG9jYWwudHMiLCAiLi4vc3JjL3NhbmRib3gvd3JpdGUtZmlsZXMudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIiwgIi4uL3NyYy9zYW5kYm94L2NsaWVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IFNhbmRib3hFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgVGFnc1NjaGVtYSB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHtcbiAgZ2V0U3RvcmFnZSxcbiAgdHlwZSBTYW5kYm94UmVjb3JkLFxuICB0eXBlIFN0b3JhZ2VDb25maWcsXG59IGZyb20gXCIuLi8uLi9zdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSB7IExvZ0VudHJ5LCBTYW5kYm94IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4uL3dyaXRlLWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBsb2NhbFNhbmRib3ggPSA8VFRhZ3MgZXh0ZW5kcyBUYWdzU2NoZW1hID0gVGFnc1NjaGVtYT4oe1xuICBzYW5kYm94UmVjb3JkLFxuICBzdG9yYWdlQ29uZmlnLFxufToge1xuICBzYW5kYm94UmVjb3JkOiBTYW5kYm94UmVjb3JkICYgeyBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH0gfTtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbn0pOiBTYW5kYm94PFRUYWdzPiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IHNhbmRib3hSZWNvcmQuY29uZmlnO1xuICBjb25zdCBiYXNlUGF0aCA9IGNvbmZpZy5wYXRoID8/IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHByb2Nlc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBDaGlsZFByb2Nlc3M+KCk7XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VDb25maWcpO1xuXG4gIGNvbnN0IHNhbmRib3g6IFNhbmRib3g8VFRhZ3M+ID0ge1xuICAgIGlkOiBzYW5kYm94UmVjb3JkLmlkLFxuICAgIGNvbmZpZzogc2FuZGJveFJlY29yZC5jb25maWcsXG4gICAgZXhlYzogKHsgY29tbWFuZCwgYXJncywgc2lnbmFsIH0pID0+IHtcbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kSWQgPSBgY29tbWFuZF8ke3VsaWQoKX1gO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgICBjd2Q6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGxvZ1F1ZXVlOiBMb2dFbnRyeVtdID0gW107XG4gICAgICAgICAgbGV0IGxvZ1Jlc29sdmU6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0cjtcbiAgICAgICAgICAgIGxvZ1F1ZXVlLnB1c2goeyBzdHJlYW06IFwic3Rkb3V0XCIsIGRhdGE6IHN0ciB9KTtcbiAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RyO1xuICAgICAgICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUHJvbWlzZTx7XG4gICAgICAgICAgICBzdGRvdXQ6IHN0cmluZztcbiAgICAgICAgICAgIHN0ZGVycjogc3RyaW5nO1xuICAgICAgICAgICAgZXhpdENvZGU6IG51bWJlcjtcbiAgICAgICAgICB9PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VzLmRlbGV0ZShjb21tYW5kSWQpO1xuICAgICAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICBwcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICAgIHdoaWxlICghY2xvc2VkIHx8IGxvZ1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsb2dRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBlbnRyeTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvZ1Jlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGU6IHVua25vd24pID0+XG4gICAgICAgICAgbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcHJvY2Vzc2VzLmdldChjb21tYW5kSWQpO1xuICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgcmVhc29uOiBgQ29tbWFuZCAke2NvbW1hbmRJZH0gbm90IGZvdW5kIG9yIGFscmVhZHkgZmluaXNoZWRgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cbiAgICAgIGNvbnN0IGNtZCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5nZXQoY29tbWFuZElkKTtcbiAgICAgIGlmIChjbWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogY21kLm1lc3NhZ2UsIGNhdXNlOiBjbWQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY21kICYmIGNtZC5zdGF0dXMgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UuY29tbWFuZC5zZXQoe1xuICAgICAgICAgIC4uLmNtZCxcbiAgICAgICAgICBzdGF0dXM6IFwia2lsbGVkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogcmVzdWx0Lm1lc3NhZ2UsIGNhdXNlOiByZXN1bHQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVGaWxlczogKG9wdHMpID0+IHdyaXRlRmlsZXMoeyBzYW5kYm94LCAuLi5vcHRzIH0pLFxuXG4gICAgdGFnOiB7XG4gICAgICBsaXN0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KHNhbmRib3guaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQudGFncz8uW2tleSBhcyBzdHJpbmddIGFzXG4gICAgICAgICAgfCBUVGFnc1t0eXBlb2Yga2V5XVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3gudGFnLnNldCh7XG4gICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LmlkLFxuICAgICAgICAgIHRhZ3M6IHsgW2tleV06IHZhbHVlIH0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICAgc2V0TWFueTogYXN5bmMgKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC50YWcuc2V0KHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHNhbmRib3guaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gc2FuZGJveDtcbn07XG4iLCAiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFVwbG9hZGFibGVGaWxlIH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBXcml0ZXMgZmlsZXMgdG8gYSBzYW5kYm94IGF0IHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gcGF0aC5cbiAqIFNoZWxsIHNjcmlwdHMgKC5zaCBmaWxlcykgYXJlIGF1dG9tYXRpY2FsbHkgbWFkZSBleGVjdXRhYmxlLlxuICpcbiAqIEZvciBzbWFsbCBmaWxlcyAoPDEwMEtCIHRvdGFsKSwgdXNlcyBzaW5nbGUgZXhlYyB3aXRoIGhlcmVkb2MuXG4gKiBGb3IgbGFyZ2UgZmlsZXMsIHdyaXRlcyBiYXNlNjQgY2h1bmtzIHRoZW4gZGVjb2RlcyB0byBhdm9pZCBBUkdfTUFYIGxpbWl0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZXMob3B0czoge1xuICBzYW5kYm94OiBQaWNrPFNhbmRib3gsIFwiZXhlY1wiPjtcbiAgZmlsZXM6IFVwbG9hZGFibGVGaWxlW107XG4gIGRlc3RQYXRoOiBzdHJpbmc7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2FuZGJveCwgZmlsZXMsIGRlc3RQYXRoIH0gPSBvcHRzO1xuXG4gIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aHMgPSBmaWxlcy5tYXAoKGZpbGUpID0+XG4gICAgcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpXG4gICk7XG4gIGNvbnN0IHBhcmVudERpcnMgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoZmlsZVBhdGhzLm1hcCgocCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHApKSlcbiAgKTtcbiAgY29uc3Qgc2hlbGxTY3JpcHRzID0gZmlsZVBhdGhzLmZpbHRlcigocCkgPT4gcC5lbmRzV2l0aChcIi5zaFwiKSk7XG5cbiAgY29uc3QgbWtkaXJSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgIGNvbW1hbmQ6IFwibWtkaXJcIixcbiAgICBhcmdzOiBbXCItcFwiLCAuLi5wYXJlbnREaXJzXSxcbiAgfSk7XG4gIGlmIChta2RpclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgdGhyb3cgbWtkaXJSZXN1bHQ7XG4gIH1cbiAgYXdhaXQgbWtkaXJSZXN1bHQucmVzdWx0O1xuXG4gIGNvbnN0IENIVU5LX1NJWkUgPSA1MF8wMDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGZpbGUgPSBmaWxlc1tpXTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoc1tpXTtcbiAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gdG9CYXNlNjQoZmlsZS5jb250ZW50KTtcblxuICAgIGlmIChiYXNlNjRDb250ZW50Lmxlbmd0aCA8IENIVU5LX1NJWkUpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IGBFT0ZfJHtpfWA7XG4gICAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgYGJhc2U2NCAtZCA+ICR7cXVvdGUoZnVsbFBhdGgpfSA8PCAnJHttYXJrZXJ9J1xuJHtiYXNlNjRDb250ZW50fVxuJHttYXJrZXJ9YCxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXhlY1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGV4ZWNSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZXhpdENvZGUsIHN0ZGVyciB9ID0gYXdhaXQgZXhlY1Jlc3VsdC5yZXN1bHQ7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB3cml0ZUZpbGVzIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfTogJHtzdGRlcnJ9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wQjY0ID0gYC90bXAvY2h1bmstJHtEYXRlLm5vdygpfS0ke2l9LmI2NGA7XG5cbiAgICAgIGNvbnN0IGNsZWFyUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgICAgY29tbWFuZDogXCJiYXNoXCIsXG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIGA+ICR7cXVvdGUodGVtcEI2NCl9YF0sXG4gICAgICB9KTtcbiAgICAgIGlmIChjbGVhclJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGNsZWFyUmVzdWx0O1xuICAgICAgfVxuICAgICAgYXdhaXQgY2xlYXJSZXN1bHQucmVzdWx0O1xuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgb2Zmc2V0IDwgYmFzZTY0Q29udGVudC5sZW5ndGg7XG4gICAgICAgIG9mZnNldCArPSBDSFVOS19TSVpFXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBiYXNlNjRDb250ZW50LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgQ0hVTktfU0laRSk7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IGBDSFVOS18ke29mZnNldH1gO1xuICAgICAgICBjb25zdCBhcHBlbmRSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICAgIGNvbW1hbmQ6IFwiYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICAgIGBjYXQgPj4gJHtxdW90ZSh0ZW1wQjY0KX0gPDwgJyR7bWFya2VyfSdcbiR7Y2h1bmt9XG4ke21hcmtlcn1gLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhcHBlbmRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRocm93IGFwcGVuZFJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZXhpdENvZGUsIHN0ZGVyciB9ID0gYXdhaXQgYXBwZW5kUmVzdWx0LnJlc3VsdDtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHdyaXRlRmlsZXMgY2h1bmsgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9OiAke3N0ZGVycn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvZGVSZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWMoe1xuICAgICAgICBjb21tYW5kOiBcImJhc2hcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWNcIixcbiAgICAgICAgICBgYmFzZTY0IC1kIDwgJHtxdW90ZSh0ZW1wQjY0KX0gPiAke3F1b3RlKGZ1bGxQYXRoKX0gJiYgcm0gLWYgJHtxdW90ZSh0ZW1wQjY0KX1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvZGVSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBkZWNvZGVSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZXhpdENvZGUsIHN0ZGVyciB9ID0gYXdhaXQgZGVjb2RlUmVzdWx0LnJlc3VsdDtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHdyaXRlRmlsZXMgZGVjb2RlIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfTogJHtzdGRlcnJ9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzaGVsbFNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNobW9kUmVzdWx0ID0gYXdhaXQgc2FuZGJveC5leGVjKHtcbiAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgIGFyZ3M6IFtcIit4XCIsIC4uLnNoZWxsU2NyaXB0c10sXG4gICAgfSk7XG4gICAgaWYgKGNobW9kUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGNobW9kUmVzdWx0O1xuICAgIH1cbiAgICBhd2FpdCBjaG1vZFJlc3VsdC5yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CYXNlNjQoY29udGVudDogc3RyaW5nIHwgQnVmZmVyKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNvbnRlbnQpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICB9XG4gIHJldHVybiBjb250ZW50LnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuXG5mdW5jdGlvbiBxdW90ZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3MucmVwbGFjZSgvJy9nLCBcIidcXFxcJydcIil9J2A7XG59XG4iLCAiaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCB7IFNhbmRib3ggYXMgVmVyY2VsU2FuZGJveFNESyB9IGZyb20gXCJzYW5kYm94XCI7XG5pbXBvcnQgeyBTYW5kYm94RXJyb3IsIFNhbmRib3hOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5pbXBvcnQge1xuICBnZXRTdG9yYWdlLFxuICB0eXBlIFNhbmRib3hSZWNvcmQsXG4gIHR5cGUgU3RvcmFnZSxcbiAgdHlwZSBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi4vLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHR5cGUge1xuICBMb2dFbnRyeSxcbiAgU2FuZGJveCxcbiAgU2FuZGJveExpZmVjeWNsZSxcbiAgU2FuZGJveFN0YXR1cyxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGVzIH0gZnJvbSBcIi4uL3dyaXRlLWZpbGVzXCI7XG5cbmV4cG9ydCB0eXBlIFZlcmNlbFNhbmRib3hDcmVhdGVPcHRpb25zID0gRXh0cmFjdDxcbiAgUGFyYW1ldGVyczx0eXBlb2YgVmVyY2VsU2FuZGJveFNESy5jcmVhdGU+WzBdLFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IC5cbiAge31cbj47XG5cbmV4cG9ydCBjb25zdCBWRVJDRUxfTUFYX1RJTUVPVVRfTVMgPSA1ICogNjAgKiA2MCAqIDEwMDA7IC8vIDUgaG91cnNcbmNvbnN0IExPQ0tfVElNRU9VVF9NUyA9IDIgKiA2MCAqIDEwMDA7IC8vIDIgbWludXRlcyAtIGlmIGxvY2sgb2xkZXIgdGhhbiB0aGlzLCBjb25zaWRlciBpdCBzdGFsZVxuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX01TID0gMjAwO1xuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG4vKipcbiAqIE1vZHVsZS1sZXZlbCBjYWNoZSBmb3IgaW4tZmxpZ2h0IHNhbmRib3ggY3JlYXRpb24gcHJvbWlzZXMuXG4gKiBQcmV2ZW50cyBwYXJhbGxlbCByZXF1ZXN0cyB3aXRoaW4gdGhlIHNhbWUgcHJvY2VzcyBmcm9tIGNyZWF0aW5nIGR1cGxpY2F0ZSBzYW5kYm94ZXMuXG4gKi9cbmNvbnN0IGNyZWF0ZVByb21pc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPj4oKTtcblxuY29uc3QgQUNUSVZJVFlfVEhST1RUTEVfTVMgPSAxMF8wMDA7XG5jb25zdCBsYXN0QWN0aXZpdHlTZW50ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuY29uc3QgREVGQVVMVF9WQ1BVUyA9IDI7XG5cbmV4cG9ydCBjb25zdCB2ZXJjZWxTYW5kYm94ID0gPFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3cgPSB0cnVlLFxuICBzdG9yYWdlOiBzdG9yYWdlT3ZlcnJpZGUsXG59OiB7XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQgJiB7IGNvbmZpZzogeyB0eXBlOiBcInZlcmNlbFwiIH0gfTtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgZW5hYmxlTGlmZWN5Y2xlV29ya2Zsb3c/OiBib29sZWFuO1xuICBzdG9yYWdlPzogU3RvcmFnZTtcbn0pOiBTYW5kYm94PFRUYWdzPiA9PiB7XG4gIGNvbnN0IHsgaWQsIGNvbmZpZyB9ID0gc2FuZGJveFJlY29yZDtcbiAgY29uc3QgdmNwdXMgPSBjb25maWcucmVzb3VyY2VzPy52Y3B1cyA/PyBERUZBVUxUX1ZDUFVTO1xuICBjb25zdCBwb3J0cyA9IGNvbmZpZy5wb3J0cztcbiAgY29uc3Qgc3RvcmFnZSA9IHN0b3JhZ2VPdmVycmlkZSA/PyBnZXRTdG9yYWdlKHN0b3JhZ2VDb25maWcpO1xuICBjb25zdCBpbml0aWFsVmVyY2VsID1cbiAgICBzYW5kYm94UmVjb3JkLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICA/IHNhbmRib3hSZWNvcmQucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgOiBudWxsO1xuXG4gIHR5cGUgU2FuZGJveEluc3RhbmNlID0gQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBWZXJjZWxTYW5kYm94U0RLLmdldD4+O1xuICBsZXQgc2FuZGJveFByb21pc2U6IFByb21pc2U8U2FuZGJveEVycm9yIHwgU2FuZGJveEluc3RhbmNlPiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBIT01FX0RJUiA9IFwiL2hvbWUvdmVyY2VsLXNhbmRib3hcIjtcblxuICBhc3luYyBmdW5jdGlvbiBwb2xsRm9yU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTE9DS19USU1FT1VUX01TO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUykpO1xuICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICBpZiAocmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlY29yZC5tZXNzYWdlLCBjYXVzZTogcmVjb3JkIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgcmVjb3JkPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKHZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICByZXR1cm4gdmVyY2VsU2FuZGJveElkO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQ/LmFjcXVpcmluZ0xvY2tBdCkge1xuICAgICAgICBjb25zdCBmaW5hbENoZWNrID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgICAgIGlmIChmaW5hbENoZWNrIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICAgICAgICByZWFzb246IGZpbmFsQ2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlOiBmaW5hbENoZWNrLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmFsVmVyY2VsU2FuZGJveElkID1cbiAgICAgICAgICBmaW5hbENoZWNrPy5wcm92aWRlck1ldGFkYXRhPy5wcm92aWRlciA9PT0gXCJ2ZXJjZWxcIlxuICAgICAgICAgICAgPyBmaW5hbENoZWNrLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChmaW5hbFZlcmNlbFNhbmRib3hJZCkge1xuICAgICAgICAgIHJldHVybiBmaW5hbFZlcmNlbFNhbmRib3hJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9HZXRPckNyZWF0ZVNhbmRib3hJZCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7XG4gICAgICByZWFzb246IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHNhbmRib3ggY3JlYXRpb24gYnkgYW5vdGhlciBwcm9jZXNzXCIsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTYW5kYm94RnJvbVNuYXBzaG90KFxuICAgIHNuYXBzaG90SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFNhbmRib3hFcnJvciB8IHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBWZXJjZWxTYW5kYm94U0RLLmNyZWF0ZSh7XG4gICAgICAgICAgc291cmNlOiB7IHR5cGU6IFwic25hcHNob3RcIiwgc25hcHNob3RJZCB9LFxuICAgICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgICBwb3J0cyxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzYW5kYm94LnNhbmRib3hJZDtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVGcmVzaFNhbmRib3goKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgVmVyY2VsU2FuZGJveFNESy5jcmVhdGUoe1xuICAgICAgICAgIHJlc291cmNlczogeyB2Y3B1cyB9LFxuICAgICAgICAgIHRpbWVvdXQ6IFZFUkNFTF9NQVhfVElNRU9VVF9NUyxcbiAgICAgICAgICBwb3J0cyxcbiAgICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICB0YWdzOiBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgbGFzdEFjdGl2aXR5QXQ6IG5vdyxcbiAgICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgICAgYWNxdWlyaW5nTG9ja0F0OiBudWxsLFxuICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgICAgc2FuZGJveElkOiBzYW5kYm94LnNhbmRib3hJZCxcbiAgICAgICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzYW5kYm94LnNhbmRib3hJZDtcbiAgICAgIH0sXG4gICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgaWYgKGluaXRpYWxWZXJjZWw/LnNhbmRib3hJZCkge1xuICAgICAgcmV0dXJuIGluaXRpYWxWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIFNhbmRib3hOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIC8vIFNhbmRib3ggZG9lc24ndCBleGlzdCB5ZXQsIGNvbnRpbnVlIHdpdGggY3JlYXRpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBleGlzdGluZy5tZXNzYWdlLCBjYXVzZTogZXhpc3RpbmcgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPVxuICAgICAgZXhpc3RpbmcgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvciA/IG51bGwgOiBleGlzdGluZztcbiAgICBjb25zdCBleGlzdGluZ1ZlcmNlbCA9XG4gICAgICBleGlzdGluZ1JlY29yZD8ucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgICAgPyBleGlzdGluZ1JlY29yZC5wcm92aWRlck1ldGFkYXRhXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChleGlzdGluZ1ZlcmNlbD8uc2FuZGJveElkKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdWZXJjZWwuc2FuZGJveElkO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0FjdGl2ZUxvY2sgPVxuICAgICAgZXhpc3RpbmdSZWNvcmQ/LmFjcXVpcmluZ0xvY2tJZCAmJlxuICAgICAgZXhpc3RpbmdSZWNvcmQuYWNxdWlyaW5nTG9ja0F0ICYmXG4gICAgICBEYXRlLm5vdygpIC0gZXhpc3RpbmdSZWNvcmQuYWNxdWlyaW5nTG9ja0F0IDwgTE9DS19USU1FT1VUX01TO1xuXG4gICAgaWYgKGhhc0FjdGl2ZUxvY2spIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9ja0lkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5zZXQoe1xuICAgICAgaWQsXG4gICAgICBjb25maWcsXG4gICAgICB0YWdzOiBleGlzdGluZ1JlY29yZD8udGFncyA/PyBzYW5kYm94UmVjb3JkLnRhZ3MsXG4gICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nUmVjb3JkPy5jcmVhdGVkQXQgPz8gc2FuZGJveFJlY29yZC5jcmVhdGVkQXQsXG4gICAgICBsYXN0QWN0aXZpdHlBdDpcbiAgICAgICAgZXhpc3RpbmdSZWNvcmQ/Lmxhc3RBY3Rpdml0eUF0ID8/IHNhbmRib3hSZWNvcmQubGFzdEFjdGl2aXR5QXQsXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IGxvY2tJZCxcbiAgICAgIGFjcXVpcmluZ0xvY2tBdDogbm93LFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgc2FuZGJveElkOiBudWxsLFxuICAgICAgICBzbmFwc2hvdElkOlxuICAgICAgICAgIGV4aXN0aW5nVmVyY2VsPy5zbmFwc2hvdElkID8/IGluaXRpYWxWZXJjZWw/LnNuYXBzaG90SWQgPz8gbnVsbCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZnRlckxvY2sgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICBpZiAoYWZ0ZXJMb2NrIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBhZnRlckxvY2subWVzc2FnZSwgY2F1c2U6IGFmdGVyTG9jayB9KTtcbiAgICB9XG4gICAgaWYgKGFmdGVyTG9jaz8uYWNxdWlyaW5nTG9ja0lkICE9PSBsb2NrSWQpIHtcbiAgICAgIHJldHVybiBwb2xsRm9yU2FuZGJveElkKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3RJZCA9XG4gICAgICBleGlzdGluZ1ZlcmNlbD8uc25hcHNob3RJZCA/P1xuICAgICAgaW5pdGlhbFZlcmNlbD8uc25hcHNob3RJZCA/P1xuICAgICAgY29uZmlnLmxpZmVjeWNsZT8uc25hcHNob3RJZDtcbiAgICBpZiAoc25hcHNob3RJZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlU2FuZGJveEZyb21TbmFwc2hvdChzbmFwc2hvdElkKTtcbiAgICAgIGlmICghKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmVzaFNhbmRib3goKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE9yQ3JlYXRlU2FuZGJveElkKCk6IFByb21pc2U8U2FuZGJveEVycm9yIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgY2FjaGVkID0gY3JlYXRlUHJvbWlzZXMuZ2V0KGlkKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSBkb0dldE9yQ3JlYXRlU2FuZGJveElkKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBjcmVhdGVQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgIH0pO1xuICAgIGNyZWF0ZVByb21pc2VzLnNldChpZCwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkb0dldFNhbmRib3goKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHtcbiAgICBjb25zdCB2ZXJjZWxTYW5kYm94SWQgPSBhd2FpdCBnZXRPckNyZWF0ZVNhbmRib3hJZCgpO1xuICAgIGlmICh2ZXJjZWxTYW5kYm94SWQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIHZlcmNlbFNhbmRib3hJZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgIHRyeTogKCkgPT5cbiAgICAgICAgVmVyY2VsU2FuZGJveFNESy5nZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogdmVyY2VsU2FuZGJveElkLFxuICAgICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgICB9KSxcbiAgICAgIGNhdGNoOiAoZSkgPT4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNhbmRib3goKTogUHJvbWlzZTxTYW5kYm94RXJyb3IgfCBTYW5kYm94SW5zdGFuY2U+IHtcbiAgICBpZiAoIXNhbmRib3hQcm9taXNlKSB7XG4gICAgICBzYW5kYm94UHJvbWlzZSA9IGRvR2V0U2FuZGJveCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2FuZGJveFByb21pc2U7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVMYXN0QWN0aXZpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VudCA9IGxhc3RBY3Rpdml0eVNlbnQuZ2V0KGlkKTtcbiAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBBQ1RJVklUWV9USFJPVFRMRV9NUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QWN0aXZpdHlTZW50LnNldChpZCwgbm93KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LmdldChpZCk7XG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgfHwgIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nVmVyY2VsID1cbiAgICAgIGV4aXN0aW5nLnByb3ZpZGVyTWV0YWRhdGE/LnByb3ZpZGVyID09PSBcInZlcmNlbFwiXG4gICAgICAgID8gZXhpc3RpbmcucHJvdmlkZXJNZXRhZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICBjb25maWc6IGV4aXN0aW5nLmNvbmZpZyxcbiAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgIGxhc3RBY3Rpdml0eUF0OiBub3csXG4gICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICBwcm92aWRlck1ldGFkYXRhOiBleGlzdGluZ1ZlcmNlbCA/PyB7XG4gICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgIHNuYXBzaG90SWQ6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKGVuYWJsZUxpZmVjeWNsZVdvcmtmbG93KSB7XG4gICAgICAvLyB0b2RvIHJlLWVuYWJsZSBvbmNlIHdlIGZpZ3VyZSBvdXQgd2h5IHdvcmtmbG93IHRocm93cyBhIGJ1bmNoIG9mIGVycm9ycyBpbiBkZXZcbiAgICAgIC8vIGNvbnN0IGxpZmVjeWNsZUlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgPSB7XG4gICAgICAvLyAgIGlkLFxuICAgICAgLy8gICBzdG9yYWdlQ29uZmlnLFxuICAgICAgLy8gICBpbml0aWFsQ29uZmlnOiBjb25maWcsXG4gICAgICAvLyB9O1xuICAgICAgLy8gdHJ5IHtcbiAgICAgIC8vICAgYXdhaXQgc2FuZGJveEFjdGl2aXR5SG9vay5yZXN1bWUoaWQsIHtcbiAgICAgIC8vICAgICB0eXBlOiBcImFjdGl2aXR5XCIsXG4gICAgICAvLyAgICAgbmV3Q29uZmlnOiBjb25maWcsXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfSBjYXRjaCB7XG4gICAgICAvLyAgIGF3YWl0IHN0YXJ0KHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdywgW3sgaW5wdXQ6IGxpZmVjeWNsZUlucHV0IH1dKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsaWZlY3ljbGU6IFNhbmRib3hMaWZlY3ljbGUgPSB7XG4gICAgc3RhcnQ6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuICAgICAgYXdhaXQgdXBkYXRlTGFzdEFjdGl2aXR5KCk7XG4gICAgICByZXR1cm4gc2FuZGJveC5zdGF0dXMgYXMgU2FuZGJveFN0YXR1cztcbiAgICB9LFxuXG4gICAgc25hcHNob3Q6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCBnZXRTYW5kYm94KCk7XG4gICAgICBpZiAoc2FuZGJveCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHNhbmRib3guc25hcHNob3QoKTtcbiAgICAgICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGFnczogZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiAoZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCksXG4gICAgICAgICAgICBjcmVhdGVkQXQ6XG4gICAgICAgICAgICAgIGV4aXN0aW5nIGluc3RhbmNlb2YgRXJyb3IgPyBudWxsIDogKGV4aXN0aW5nPy5jcmVhdGVkQXQgPz8gbnVsbCksXG4gICAgICAgICAgICBsYXN0QWN0aXZpdHlBdDpcbiAgICAgICAgICAgICAgZXhpc3RpbmcgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogKGV4aXN0aW5nPy5sYXN0QWN0aXZpdHlBdCA/PyBudWxsKSxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCB9O1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgc3RvcDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlcnJvcmUudHJ5QXN5bmMoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBzYW5kYm94LnN0b3AoKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEVycm9yIHx8ICFleGlzdGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zYW5kYm94LnNldCh7XG4gICAgICAgICAgICBpZDogZXhpc3RpbmcuaWQsXG4gICAgICAgICAgICBjb25maWc6IGV4aXN0aW5nLmNvbmZpZyxcbiAgICAgICAgICAgIHRhZ3M6IGV4aXN0aW5nLnRhZ3MsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIGxhc3RBY3Rpdml0eUF0OiBleGlzdGluZy5sYXN0QWN0aXZpdHlBdCxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IFwidmVyY2VsXCIsXG4gICAgICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICAgICAgc25hcHNob3RJZDogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgY2F0Y2g6IChlKSA9PiBuZXcgU2FuZGJveEVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldFN0YXR1czogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC5zdGF0dXMgYXMgU2FuZGJveFN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0Q3JlYXRlZEF0OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzYW5kYm94LmNyZWF0ZWRBdDtcbiAgICB9LFxuXG4gICAgZ2V0UmVtYWluaW5nVGltZW91dDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChzYW5kYm94IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2FuZGJveC50aW1lb3V0O1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3Qgc2FuZGJveDogU2FuZGJveDxUVGFncz4gPSB7XG4gICAgaWQsXG4gICAgY29uZmlnLFxuICAgIGV4ZWM6IGFzeW5jICh7IGNvbW1hbmQsIGFyZ3MsIHNpZ25hbCB9KSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGdldFNhbmRib3goKTtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlUHJvbWlzZSA9IHVwZGF0ZUxhc3RBY3Rpdml0eSgpO1xuXG4gICAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgZXJyb3JlLnRyeUFzeW5jKHtcbiAgICAgICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgaW5zdGFuY2UucnVuQ29tbWFuZCh7XG4gICAgICAgICAgICBjd2Q6IEhPTUVfRElSLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGNtZDogY29tbWFuZCxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgICAgICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGxvZ0J1ZmZlcjogTG9nRW50cnlbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgcmVzb2x2ZTogbnVsbCBhcyAoKCkgPT4gdm9pZCkgfCBudWxsLFxuICAgICAgICAgICAgY29uc3VtZWQ6IGZhbHNlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb25zdW1lTG9ncyA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGxvZyBvZiBvdXRwdXQubG9ncygpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5OiBMb2dFbnRyeSA9XG4gICAgICAgICAgICAgICAgbG9nLnN0cmVhbSA9PT0gXCJzdGRvdXRcIlxuICAgICAgICAgICAgICAgICAgPyB7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogbG9nLmRhdGEgfVxuICAgICAgICAgICAgICAgICAgOiB7IHN0cmVhbTogXCJzdGRlcnJcIiwgZGF0YTogbG9nLmRhdGEgfTtcblxuICAgICAgICAgICAgICBpZiAobG9nLnN0cmVhbSA9PT0gXCJzdGRvdXRcIikge1xuICAgICAgICAgICAgICAgIHN0ZG91dCArPSBsb2cuZGF0YTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGRlcnIgKz0gbG9nLmRhdGE7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsb2dCdWZmZXIucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgIHN0YXRlLnJlc29sdmU/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhdGUucmVzb2x2ZT8uKCk7XG4gICAgICAgICAgfSkoKTtcblxuICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8TG9nRW50cnk+IHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoIXN0YXRlLmNvbnN1bWVkIHx8IGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgbG9nQnVmZmVyW2luZGV4KytdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN1bWVMb2dzLnRoZW4oKCkgPT4gKHtcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIGV4aXRDb2RlOiBvdXRwdXQuZXhpdENvZGUsXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgY29tbWFuZElkOiBvdXRwdXQuY21kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGUpID0+IG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdXBkYXRlUHJvbWlzZTtcbiAgICAgIHJldHVybiBleGVjUmVzdWx0O1xuICAgIH0sXG5cbiAgICBnZXREb21haW46IGFzeW5jIChwb3J0KSA9PiB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKHNhbmRib3ggaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNhbmRib3guZG9tYWluKHBvcnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAga2lsbDogYXN5bmMgKHsgY29tbWFuZElkLCBzdG9yYWdlOiBjbWRTdG9yYWdlIH0pID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgZ2V0U2FuZGJveCgpO1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbWQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuZ2V0KGNvbW1hbmRJZCk7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IGNtZC5tZXNzYWdlLCBjYXVzZTogY21kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNtZCAmJiBjbWQuc3RhdHVzID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbWRTdG9yYWdlLmNvbW1hbmQuc2V0KHtcbiAgICAgICAgICAuLi5jbWQsXG4gICAgICAgICAgc3RhdHVzOiBcImtpbGxlZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94RXJyb3IoeyByZWFzb246IHJlc3VsdC5tZXNzYWdlLCBjYXVzZTogcmVzdWx0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpbGVzOiAob3B0cykgPT4gd3JpdGVGaWxlcyh7IHNhbmRib3gsIC4uLm9wdHMgfSksXG5cbiAgICBsaWZlY3ljbGUsXG5cbiAgICB0YWc6IHtcbiAgICAgIGxpc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC5nZXQoaWQpO1xuICAgICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHNhbmRib3hSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzYW5kYm94UmVjb3JkLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNhbmRib3hSZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlkKTtcbiAgICAgICAgaWYgKHNhbmRib3hSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYW5kYm94UmVjb3JkLnRhZ3M/LltrZXkgYXMgc3RyaW5nXSBhc1xuICAgICAgICAgIHwgVFRhZ3NbdHlwZW9mIGtleV1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS5zYW5kYm94LnRhZy5zZXQoe1xuICAgICAgICAgIHNhbmRib3hJZDogaWQsXG4gICAgICAgICAgdGFnczogdGFncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBpZiAoY29uZmlnLmxpZmVjeWNsZT8uYXV0b1N0YXJ0ICE9PSBmYWxzZSkge1xuICAgIHNhbmRib3hQcm9taXNlID0gZG9HZXRTYW5kYm94KCk7XG4gIH1cblxuICByZXR1cm4gc2FuZGJveDtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBUYWdzU2NoZW1hIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hSZWNvcmQsIFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgbG9jYWxTYW5kYm94IH0gZnJvbSBcIi4vYmluZGluZ3MvbG9jYWxcIjtcbmltcG9ydCB7IHZlcmNlbFNhbmRib3ggfSBmcm9tIFwiLi9iaW5kaW5ncy92ZXJjZWxcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYW5kYm94PFRUYWdzIGV4dGVuZHMgVGFnc1NjaGVtYSA9IFRhZ3NTY2hlbWE+KHtcbiAgc2FuZGJveFJlY29yZCxcbiAgc3RvcmFnZUNvbmZpZyxcbn06IHtcbiAgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgc2FuZGJveFJlY29yZDogU2FuZGJveFJlY29yZDtcbn0pOiBTYW5kYm94PFRUYWdzPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBzYW5kYm94UmVjb3JkO1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6XG4gICAgICByZXR1cm4gbG9jYWxTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHNhbmRib3hSZWNvcmQ6IHNhbmRib3hSZWNvcmQgYXMgU2FuZGJveFJlY29yZCAmIHtcbiAgICAgICAgICBjb25maWc6IHsgdHlwZTogXCJsb2NhbFwiIH07XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICB9KTtcbiAgICBjYXNlIFwidmVyY2VsXCI6XG4gICAgICByZXR1cm4gdmVyY2VsU2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzYW5kYm94UmVjb3JkOiBzYW5kYm94UmVjb3JkIGFzIFNhbmRib3hSZWNvcmQgJiB7XG4gICAgICAgICAgY29uZmlnOiB7IHR5cGU6IFwidmVyY2VsXCIgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkN1c3RvbSBzYW5kYm94ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHNhbmRib3ggdHlwZTogJHtcbiAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IC5cbiAgICAgICAgICAoY29uZmlnIGFzIGFueSkudHlwZVxuICAgICAgICB9YFxuICAgICAgKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQUNBLFNBQVMsYUFBYTtBQUN0QixZQUFZLFlBQVk7QUFDeEIsU0FBUyxZQUFZOzs7QUNIckIsWUFBWSxVQUFVO0FBV3RCLGVBQXNCLFdBQVcsTUFJZjtBQUNoQixRQUFNLEVBQUUsU0FBUyxPQUFPLFNBQVMsSUFBSTtBQUVyQyxNQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCO0FBQUEsRUFDRjtBQUVBLFFBQU0sWUFBWSxNQUFNO0FBQUEsSUFBSSxDQUFDLFNBQ3RCLFdBQU0sS0FBSyxVQUFVLEtBQUssSUFBSTtBQUFBLEVBQ3JDO0FBQ0EsUUFBTSxhQUFhLE1BQU07QUFBQSxJQUN2QixJQUFJLElBQUksVUFBVSxJQUFJLENBQUMsTUFBVyxXQUFNLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFBQSxFQUNyRDtBQUNBLFFBQU0sZUFBZSxVQUFVLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFOUQsUUFBTSxjQUFjLE1BQU0sUUFBUSxLQUFLO0FBQUEsSUFDckMsU0FBUztBQUFBLElBQ1QsTUFBTSxDQUFDLE1BQU0sR0FBRyxVQUFVO0FBQUEsRUFDNUIsQ0FBQztBQUNELE1BQUksdUJBQXVCLE9BQU87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VUFDM0MsV0FBVztBQUFBLFVBQ1g7QUFBQSxRQUNGLENBQUM7QUFDRCxZQUFJLGtCQUFrQixPQUFPO0FBQzNCLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sV0FBVyxjQUFjLE9BQU87QUFDekMscUJBQWlCLGFBQWE7QUFBQSxFQUNoQztBQUVBLFNBQU87QUFDVDs7O0FDOWtCTyxTQUFTLFdBQWtEO0FBQUEsRUFDaEU7QUFBQSxFQUNBO0FBQ0YsR0FHbUI7QUFDakIsUUFBTSxFQUFFLE9BQU8sSUFBSTtBQUNuQixVQUFRLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUs7QUFDSCxhQUFPLGFBQW9CO0FBQUEsUUFDekI7QUFBQSxRQUdBO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSCxLQUFLO0FBQ0gsYUFBTyxjQUFxQjtBQUFBLFFBQzFCO0FBQUEsUUFHQTtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0gsS0FBSztBQUNILFlBQU0sSUFBSSxNQUFNLG9DQUFvQztBQUFBLElBQ3REO0FBQ0U7QUFDQSxZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsUUFFRyxPQUFlLElBQ2xCO0FBQUEsTUFDRjtBQUFBLEVBQ0o7QUFDRjsiLAogICJuYW1lcyI6IFsiZXhpdENvZGUiLCAic3RkZXJyIiwgInN0b3JhZ2UiLCAic2FuZGJveFJlY29yZCIsICJlcnJvcmUiLCAic2FuZGJveCIsICJnZXRTYW5kYm94IiwgInNhbmRib3hSZWNvcmQiXQp9Cg==