experimental-agent 0.2.1 → 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.d.mts +1 -0
- package/dist/next/loader.d.ts +1 -0
- package/dist/next/loader.js +44 -18
- package/dist/next/loader.mjs +18 -13
- package/dist/next.js +32 -9
- package/dist/next.mjs +6 -4
- 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-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-QRWGDFFY.mjs +0 -75
- 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
|
@@ -5,9 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __esm = (fn, res) => function __init() {
|
|
9
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
-
};
|
|
11
8
|
var __export = (target, all) => {
|
|
12
9
|
for (var name in all)
|
|
13
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -30,887 +27,142 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
27
|
));
|
|
31
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
29
|
|
|
33
|
-
// src/sandbox/bindings/vercel-
|
|
34
|
-
var
|
|
35
|
-
__export(
|
|
36
|
-
|
|
37
|
-
});
|
|
38
|
-
var import_sandbox;
|
|
39
|
-
var init_vercel_sdk = __esm({
|
|
40
|
-
"src/sandbox/bindings/vercel-sdk.ts"() {
|
|
41
|
-
"use strict";
|
|
42
|
-
import_sandbox = require("@vercel/sandbox");
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// src/errors.ts
|
|
47
|
-
var errore, SessionNotFoundError, SessionError, SandboxNotFoundError, StorageError, StorageConflictError, SandboxError, MessageNotFoundError;
|
|
48
|
-
var init_errors = __esm({
|
|
49
|
-
"src/errors.ts"() {
|
|
50
|
-
"use strict";
|
|
51
|
-
errore = __toESM(require("errore"));
|
|
52
|
-
SessionNotFoundError = class extends errore.createTaggedError({
|
|
53
|
-
name: "SessionNotFoundError",
|
|
54
|
-
message: "Session $id not found"
|
|
55
|
-
}) {
|
|
56
|
-
};
|
|
57
|
-
SessionError = class extends errore.createTaggedError({
|
|
58
|
-
name: "SessionError",
|
|
59
|
-
message: "Session $id failed: $reason"
|
|
60
|
-
}) {
|
|
61
|
-
};
|
|
62
|
-
SandboxNotFoundError = class extends errore.createTaggedError({
|
|
63
|
-
name: "SandboxNotFoundError",
|
|
64
|
-
message: "Sandbox $id not found"
|
|
65
|
-
}) {
|
|
66
|
-
};
|
|
67
|
-
StorageError = class extends errore.createTaggedError({
|
|
68
|
-
name: "StorageError",
|
|
69
|
-
message: "$reason"
|
|
70
|
-
}) {
|
|
71
|
-
};
|
|
72
|
-
StorageConflictError = class extends errore.createTaggedError({
|
|
73
|
-
name: "StorageConflictError",
|
|
74
|
-
message: "$reason"
|
|
75
|
-
}) {
|
|
76
|
-
};
|
|
77
|
-
SandboxError = class extends errore.createTaggedError({
|
|
78
|
-
name: "SandboxError",
|
|
79
|
-
message: "$reason"
|
|
80
|
-
}) {
|
|
81
|
-
};
|
|
82
|
-
MessageNotFoundError = class extends errore.createTaggedError({
|
|
83
|
-
name: "MessageNotFoundError",
|
|
84
|
-
message: "Message $id not found"
|
|
85
|
-
}) {
|
|
86
|
-
};
|
|
87
|
-
}
|
|
30
|
+
// src/sandbox/bindings/vercel-lifecycle/workflow.ts
|
|
31
|
+
var workflow_exports = {};
|
|
32
|
+
__export(workflow_exports, {
|
|
33
|
+
sandboxLifecycleWorkflow: () => sandboxLifecycleWorkflow
|
|
88
34
|
});
|
|
35
|
+
module.exports = __toCommonJS(workflow_exports);
|
|
36
|
+
var import_workflow = require("workflow");
|
|
89
37
|
|
|
90
|
-
// src/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return result.result;
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
session: {
|
|
106
|
-
get: async (id) => {
|
|
107
|
-
try {
|
|
108
|
-
const result = await rpc("session.get", { id });
|
|
109
|
-
if (result === null) {
|
|
110
|
-
return new SessionNotFoundError({ id });
|
|
111
|
-
}
|
|
112
|
-
return result;
|
|
113
|
-
} catch (e) {
|
|
114
|
-
if (e instanceof StorageError) {
|
|
115
|
-
return e;
|
|
116
|
-
}
|
|
117
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
set: async (session) => {
|
|
121
|
-
try {
|
|
122
|
-
return await rpc("session.set", session);
|
|
123
|
-
} catch (e) {
|
|
124
|
-
if (e instanceof StorageError) {
|
|
125
|
-
return e;
|
|
126
|
-
}
|
|
127
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
update: async (opts) => {
|
|
131
|
-
try {
|
|
132
|
-
return await rpc("session.update", opts);
|
|
133
|
-
} catch (e) {
|
|
134
|
-
if (e instanceof StorageConflictError) {
|
|
135
|
-
return e;
|
|
136
|
-
}
|
|
137
|
-
if (e instanceof StorageError) {
|
|
138
|
-
return e;
|
|
139
|
-
}
|
|
140
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
delete: async (id) => {
|
|
144
|
-
try {
|
|
145
|
-
await rpc("session.delete", { id });
|
|
146
|
-
} catch (e) {
|
|
147
|
-
if (e instanceof StorageError) {
|
|
148
|
-
return e;
|
|
149
|
-
}
|
|
150
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
list: async (opts) => {
|
|
154
|
-
try {
|
|
155
|
-
return await rpc("session.list", {
|
|
156
|
-
tags: opts?.tags,
|
|
157
|
-
order: opts?.order,
|
|
158
|
-
cursor: opts?.cursor,
|
|
159
|
-
limit: opts?.limit
|
|
160
|
-
});
|
|
161
|
-
} catch (e) {
|
|
162
|
-
if (e instanceof StorageError) {
|
|
163
|
-
return e;
|
|
164
|
-
}
|
|
165
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
listBySandbox: async (opts) => {
|
|
169
|
-
try {
|
|
170
|
-
return await rpc("session.listBySandbox", {
|
|
171
|
-
sandboxId: opts.sandboxId,
|
|
172
|
-
tags: opts.tags,
|
|
173
|
-
order: opts.order,
|
|
174
|
-
cursor: opts.cursor,
|
|
175
|
-
limit: opts.limit
|
|
176
|
-
});
|
|
177
|
-
} catch (e) {
|
|
178
|
-
if (e instanceof StorageError) {
|
|
179
|
-
return e;
|
|
180
|
-
}
|
|
181
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
tag: {
|
|
185
|
-
set: async ({ sessionId, tags }) => {
|
|
186
|
-
try {
|
|
187
|
-
return await rpc("session.tag.set", { sessionId, tags });
|
|
188
|
-
} catch (e) {
|
|
189
|
-
if (e instanceof StorageError) {
|
|
190
|
-
return e;
|
|
191
|
-
}
|
|
192
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
},
|
|
197
|
-
message: {
|
|
198
|
-
list: async (sessionId, opts) => {
|
|
199
|
-
try {
|
|
200
|
-
return await rpc("message.list", {
|
|
201
|
-
sessionId,
|
|
202
|
-
cursor: opts?.cursor,
|
|
203
|
-
limit: opts?.limit
|
|
204
|
-
});
|
|
205
|
-
} catch (e) {
|
|
206
|
-
if (e instanceof StorageError) {
|
|
207
|
-
return e;
|
|
208
|
-
}
|
|
209
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
get: async (id) => {
|
|
213
|
-
try {
|
|
214
|
-
const result = await rpc("message.get", { id });
|
|
215
|
-
if (result === null) {
|
|
216
|
-
return new MessageNotFoundError({ id });
|
|
217
|
-
}
|
|
218
|
-
return result;
|
|
219
|
-
} catch (e) {
|
|
220
|
-
if (e instanceof StorageError) {
|
|
221
|
-
return e;
|
|
222
|
-
}
|
|
223
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
set: async (message) => {
|
|
227
|
-
try {
|
|
228
|
-
return await rpc("message.set", message);
|
|
229
|
-
} catch (e) {
|
|
230
|
-
if (e instanceof StorageError) {
|
|
231
|
-
return e;
|
|
232
|
-
}
|
|
233
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
part: {
|
|
238
|
-
listByMessage: async (messageId, opts) => {
|
|
239
|
-
try {
|
|
240
|
-
const result = await rpc("part.listByMessage", {
|
|
241
|
-
messageId,
|
|
242
|
-
cursor: opts?.cursor,
|
|
243
|
-
limit: opts?.limit
|
|
244
|
-
});
|
|
245
|
-
return result;
|
|
246
|
-
} catch (e) {
|
|
247
|
-
if (e instanceof StorageError) {
|
|
248
|
-
return e;
|
|
249
|
-
}
|
|
250
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
251
|
-
}
|
|
252
|
-
},
|
|
253
|
-
listBySession: async (sessionId, opts) => {
|
|
254
|
-
try {
|
|
255
|
-
const result = await rpc("part.listBySession", {
|
|
256
|
-
sessionId,
|
|
257
|
-
cursor: opts?.cursor,
|
|
258
|
-
limit: opts?.limit
|
|
259
|
-
});
|
|
260
|
-
return result;
|
|
261
|
-
} catch (e) {
|
|
262
|
-
if (e instanceof StorageError) {
|
|
263
|
-
return e;
|
|
264
|
-
}
|
|
265
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
set: async (part) => {
|
|
269
|
-
try {
|
|
270
|
-
return await rpc("part.set", part);
|
|
271
|
-
} catch (e) {
|
|
272
|
-
if (e instanceof StorageError) {
|
|
273
|
-
return e;
|
|
274
|
-
}
|
|
275
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
276
|
-
}
|
|
277
|
-
},
|
|
278
|
-
delete: async (id) => {
|
|
279
|
-
try {
|
|
280
|
-
await rpc("part.delete", { id });
|
|
281
|
-
} catch (e) {
|
|
282
|
-
if (e instanceof StorageError) {
|
|
283
|
-
return e;
|
|
284
|
-
}
|
|
285
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
},
|
|
289
|
-
sandbox: {
|
|
290
|
-
get: async (key) => {
|
|
291
|
-
try {
|
|
292
|
-
const result = await rpc("sandbox.get", { key });
|
|
293
|
-
if (result === null) {
|
|
294
|
-
return new SandboxNotFoundError({ id: key });
|
|
295
|
-
}
|
|
296
|
-
return result;
|
|
297
|
-
} catch (e) {
|
|
298
|
-
if (e instanceof StorageError) {
|
|
299
|
-
return e;
|
|
300
|
-
}
|
|
301
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
302
|
-
}
|
|
303
|
-
},
|
|
304
|
-
getBySession: async (sessionId) => {
|
|
305
|
-
try {
|
|
306
|
-
const result = await rpc("sandbox.getBySession", { sessionId });
|
|
307
|
-
if (result === null) {
|
|
308
|
-
return new SandboxNotFoundError({ id: sessionId });
|
|
309
|
-
}
|
|
310
|
-
return result;
|
|
311
|
-
} catch (e) {
|
|
312
|
-
if (e instanceof StorageError) {
|
|
313
|
-
return e;
|
|
314
|
-
}
|
|
315
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
316
|
-
}
|
|
317
|
-
},
|
|
318
|
-
set: async (record) => {
|
|
319
|
-
try {
|
|
320
|
-
await rpc("sandbox.set", record);
|
|
321
|
-
return record;
|
|
322
|
-
} catch (e) {
|
|
323
|
-
if (e instanceof StorageError) {
|
|
324
|
-
return e;
|
|
325
|
-
}
|
|
326
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
327
|
-
}
|
|
328
|
-
},
|
|
329
|
-
update: async (opts) => {
|
|
330
|
-
try {
|
|
331
|
-
return await rpc("sandbox.update", opts);
|
|
332
|
-
} catch (e) {
|
|
333
|
-
if (e instanceof StorageError) {
|
|
334
|
-
return e;
|
|
335
|
-
}
|
|
336
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
337
|
-
}
|
|
338
|
-
},
|
|
339
|
-
list: async (opts) => {
|
|
340
|
-
try {
|
|
341
|
-
return await rpc("sandbox.list", {
|
|
342
|
-
tags: opts?.tags,
|
|
343
|
-
order: opts?.order,
|
|
344
|
-
cursor: opts?.cursor,
|
|
345
|
-
limit: opts?.limit
|
|
346
|
-
});
|
|
347
|
-
} catch (e) {
|
|
348
|
-
if (e instanceof StorageError) {
|
|
349
|
-
return e;
|
|
350
|
-
}
|
|
351
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
352
|
-
}
|
|
353
|
-
},
|
|
354
|
-
tag: {
|
|
355
|
-
set: async ({ sandboxId, tags }) => {
|
|
356
|
-
try {
|
|
357
|
-
return await rpc("sandbox.tag.set", { sandboxId, tags });
|
|
358
|
-
} catch (e) {
|
|
359
|
-
if (e instanceof StorageError) {
|
|
360
|
-
return e;
|
|
361
|
-
}
|
|
362
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
acquireLock: async (record, lockTimeoutMs) => {
|
|
367
|
-
try {
|
|
368
|
-
return await rpc("sandbox.acquireLock", {
|
|
369
|
-
record,
|
|
370
|
-
lockTimeoutMs
|
|
371
|
-
});
|
|
372
|
-
} catch (e) {
|
|
373
|
-
if (e instanceof StorageError) {
|
|
374
|
-
return e;
|
|
375
|
-
}
|
|
376
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
setup: {
|
|
381
|
-
get: async (key) => {
|
|
382
|
-
try {
|
|
383
|
-
return await rpc("setup.get", { key });
|
|
384
|
-
} catch (e) {
|
|
385
|
-
if (e instanceof StorageError) {
|
|
386
|
-
return e;
|
|
387
|
-
}
|
|
388
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
389
|
-
}
|
|
390
|
-
},
|
|
391
|
-
set: async (snapshot) => {
|
|
392
|
-
try {
|
|
393
|
-
await rpc("setup.set", snapshot);
|
|
394
|
-
return snapshot;
|
|
395
|
-
} catch (e) {
|
|
396
|
-
if (e instanceof StorageError) {
|
|
397
|
-
return e;
|
|
398
|
-
}
|
|
399
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
400
|
-
}
|
|
401
|
-
},
|
|
402
|
-
delete: async (key) => {
|
|
403
|
-
try {
|
|
404
|
-
await rpc("setup.delete", { key });
|
|
405
|
-
} catch (e) {
|
|
406
|
-
if (e instanceof StorageError) {
|
|
407
|
-
return e;
|
|
408
|
-
}
|
|
409
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
410
|
-
}
|
|
411
|
-
},
|
|
412
|
-
acquireLock: async (key, lockId, lockTimeoutMs) => {
|
|
413
|
-
try {
|
|
414
|
-
return await rpc("setup.acquireLock", {
|
|
415
|
-
key,
|
|
416
|
-
lockId,
|
|
417
|
-
lockTimeoutMs
|
|
418
|
-
});
|
|
419
|
-
} catch (e) {
|
|
420
|
-
if (e instanceof StorageError) {
|
|
421
|
-
return e;
|
|
422
|
-
}
|
|
423
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
},
|
|
427
|
-
command: {
|
|
428
|
-
get: async (id) => {
|
|
429
|
-
try {
|
|
430
|
-
return await rpc("command.get", { id });
|
|
431
|
-
} catch (e) {
|
|
432
|
-
if (e instanceof StorageError) {
|
|
433
|
-
return e;
|
|
434
|
-
}
|
|
435
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
436
|
-
}
|
|
437
|
-
},
|
|
438
|
-
set: async (command) => {
|
|
439
|
-
try {
|
|
440
|
-
return await rpc("command.set", command);
|
|
441
|
-
} catch (e) {
|
|
442
|
-
if (e instanceof StorageError) {
|
|
443
|
-
return e;
|
|
444
|
-
}
|
|
445
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
446
|
-
}
|
|
447
|
-
},
|
|
448
|
-
list: async (sessionId, opts) => {
|
|
449
|
-
try {
|
|
450
|
-
const result = await rpc("command.list", {
|
|
451
|
-
sessionId,
|
|
452
|
-
includeFinished: opts?.includeFinished,
|
|
453
|
-
cursor: opts?.cursor,
|
|
454
|
-
limit: opts?.limit
|
|
455
|
-
});
|
|
456
|
-
return result;
|
|
457
|
-
} catch (e) {
|
|
458
|
-
if (e instanceof StorageError) {
|
|
459
|
-
return e;
|
|
460
|
-
}
|
|
461
|
-
return new StorageError({ reason: String(e), cause: e });
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
};
|
|
38
|
+
// src/utils/logger.ts
|
|
39
|
+
var LOG_LEVEL_PRIORITY = {
|
|
40
|
+
info: 0,
|
|
41
|
+
warn: 1,
|
|
42
|
+
error: 2,
|
|
43
|
+
silent: 3
|
|
44
|
+
};
|
|
45
|
+
function getLevel(config) {
|
|
46
|
+
return config.level ?? "warn";
|
|
47
|
+
}
|
|
48
|
+
function getPrefix(config) {
|
|
49
|
+
return config.prefix ?? "agent";
|
|
466
50
|
}
|
|
467
|
-
function
|
|
468
|
-
|
|
469
|
-
return getStorageClient(opts.rpc, name);
|
|
51
|
+
function shouldLog(config, level) {
|
|
52
|
+
return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[getLevel(config)];
|
|
470
53
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
54
|
+
function formatTag(config, subsystem) {
|
|
55
|
+
return `[${getPrefix(config)}:${config.name}:${subsystem}]`;
|
|
56
|
+
}
|
|
57
|
+
function formatData(context, extra) {
|
|
58
|
+
const merged = { ...context, ...extra };
|
|
59
|
+
const entries = Object.entries(merged).filter(
|
|
60
|
+
([, v]) => v !== void 0 && v !== null
|
|
61
|
+
);
|
|
62
|
+
if (entries.length === 0) {
|
|
63
|
+
return void 0;
|
|
478
64
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
// src/storage/rpc.ts
|
|
482
|
-
function ListResultSchema(itemSchema) {
|
|
483
|
-
return import_zod.z.object({
|
|
484
|
-
items: import_zod.z.array(itemSchema),
|
|
485
|
-
nextCursor: import_zod.z.string().nullable()
|
|
486
|
-
});
|
|
65
|
+
return Object.fromEntries(entries);
|
|
487
66
|
}
|
|
488
|
-
var
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
lifecycle: VercelLifecycleConfigSchema.optional(),
|
|
510
|
-
networkPolicy: NetworkPolicySchema
|
|
511
|
-
}),
|
|
512
|
-
SandboxConfigBase.extend({
|
|
513
|
-
type: import_zod.z.literal("local")
|
|
514
|
-
}),
|
|
515
|
-
SandboxConfigBase.extend({
|
|
516
|
-
type: import_zod.z.literal("docker")
|
|
517
|
-
}),
|
|
518
|
-
SandboxConfigBase.extend({
|
|
519
|
-
type: import_zod.z.literal("custom"),
|
|
520
|
-
url: import_zod.z.string(),
|
|
521
|
-
headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
|
|
522
|
-
})
|
|
523
|
-
]);
|
|
524
|
-
GenerationSchema = import_zod.z.object({
|
|
525
|
-
maxSteps: import_zod.z.number().optional(),
|
|
526
|
-
temperature: import_zod.z.number().optional(),
|
|
527
|
-
topK: import_zod.z.number().optional(),
|
|
528
|
-
topP: import_zod.z.number().optional(),
|
|
529
|
-
frequencyPenalty: import_zod.z.number().optional(),
|
|
530
|
-
presencePenalty: import_zod.z.number().optional(),
|
|
531
|
-
maxOutputTokens: import_zod.z.number().optional(),
|
|
532
|
-
headers: import_zod.z.record(import_zod.z.string(), import_zod.z.string()).optional()
|
|
533
|
-
});
|
|
534
|
-
SessionSchema = import_zod.z.object({
|
|
535
|
-
id: import_zod.z.string(),
|
|
536
|
-
createdAt: import_zod.z.number(),
|
|
537
|
-
updatedAt: import_zod.z.number(),
|
|
538
|
-
runId: import_zod.z.string().nullable(),
|
|
539
|
-
lastMessageId: import_zod.z.string().nullable(),
|
|
540
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).nullable(),
|
|
541
|
-
system: import_zod.z.string().nullable(),
|
|
542
|
-
model: import_zod.z.string().nullable(),
|
|
543
|
-
sandboxId: import_zod.z.string().nullable(),
|
|
544
|
-
skillsDir: import_zod.z.array(import_zod.z.string()).nullable(),
|
|
545
|
-
hookToken: import_zod.z.string().nullable(),
|
|
546
|
-
activeTools: import_zod.z.array(import_zod.z.string()).nullable(),
|
|
547
|
-
generation: GenerationSchema.nullable().default(null)
|
|
548
|
-
});
|
|
549
|
-
StepUsageSchema = import_zod.z.object({
|
|
550
|
-
stepIndex: import_zod.z.number(),
|
|
551
|
-
model: import_zod.z.string(),
|
|
552
|
-
inputTokens: import_zod.z.number(),
|
|
553
|
-
outputTokens: import_zod.z.number(),
|
|
554
|
-
totalTokens: import_zod.z.number(),
|
|
555
|
-
cacheReadTokens: import_zod.z.number(),
|
|
556
|
-
cacheWriteTokens: import_zod.z.number(),
|
|
557
|
-
reasoningTokens: import_zod.z.number()
|
|
558
|
-
});
|
|
559
|
-
UsageSummarySchema = import_zod.z.object({
|
|
560
|
-
model: import_zod.z.string(),
|
|
561
|
-
inputTokens: import_zod.z.number(),
|
|
562
|
-
outputTokens: import_zod.z.number(),
|
|
563
|
-
totalTokens: import_zod.z.number(),
|
|
564
|
-
cacheReadTokens: import_zod.z.number(),
|
|
565
|
-
cacheWriteTokens: import_zod.z.number(),
|
|
566
|
-
reasoningTokens: import_zod.z.number(),
|
|
567
|
-
stepCount: import_zod.z.number()
|
|
568
|
-
});
|
|
569
|
-
MessageUsageSchema = import_zod.z.object({
|
|
570
|
-
steps: import_zod.z.array(StepUsageSchema),
|
|
571
|
-
summary: UsageSummarySchema
|
|
572
|
-
});
|
|
573
|
-
InterruptedLastPartSchema = import_zod.z.object({
|
|
574
|
-
index: import_zod.z.number(),
|
|
575
|
-
part: import_zod.z.unknown()
|
|
576
|
-
});
|
|
577
|
-
MessageSchema = import_zod.z.object({
|
|
578
|
-
id: import_zod.z.string(),
|
|
579
|
-
sessionId: import_zod.z.string(),
|
|
580
|
-
role: import_zod.z.enum(["user", "assistant", "system"]),
|
|
581
|
-
createdAt: import_zod.z.number(),
|
|
582
|
-
startedAt: import_zod.z.number().nullable(),
|
|
583
|
-
completedAt: import_zod.z.number().nullable(),
|
|
584
|
-
interruptedAt: import_zod.z.number().nullable(),
|
|
585
|
-
interruptedLastPart: InterruptedLastPartSchema.nullable().default(null),
|
|
586
|
-
usage: MessageUsageSchema.nullable()
|
|
587
|
-
});
|
|
588
|
-
PartSchema = import_zod.z.object({
|
|
589
|
-
id: import_zod.z.string(),
|
|
590
|
-
messageId: import_zod.z.string(),
|
|
591
|
-
sessionId: import_zod.z.string(),
|
|
592
|
-
index: import_zod.z.number(),
|
|
593
|
-
part: import_zod.z.unknown()
|
|
594
|
-
});
|
|
595
|
-
CommandResultSchema = import_zod.z.object({
|
|
596
|
-
stdout: import_zod.z.string(),
|
|
597
|
-
stderr: import_zod.z.string(),
|
|
598
|
-
exitCode: import_zod.z.number(),
|
|
599
|
-
completedAt: import_zod.z.number()
|
|
600
|
-
});
|
|
601
|
-
SandboxRecordSchema = import_zod.z.object({
|
|
602
|
-
id: import_zod.z.string(),
|
|
603
|
-
config: SandboxConfigSchema,
|
|
604
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).nullable(),
|
|
605
|
-
createdAt: import_zod.z.number().nullable(),
|
|
606
|
-
lastActivityAt: import_zod.z.number().nullable(),
|
|
607
|
-
acquiringLockId: import_zod.z.string().nullable(),
|
|
608
|
-
acquiringLockAt: import_zod.z.number().nullable(),
|
|
609
|
-
setupKey: import_zod.z.string().nullable().optional(),
|
|
610
|
-
setupCompletedAt: import_zod.z.number().nullable().optional(),
|
|
611
|
-
providerMetadata: import_zod.z.discriminatedUnion("provider", [
|
|
612
|
-
import_zod.z.object({
|
|
613
|
-
provider: import_zod.z.literal("vercel"),
|
|
614
|
-
sandboxId: import_zod.z.string().nullable(),
|
|
615
|
-
snapshotId: import_zod.z.string().nullable()
|
|
616
|
-
})
|
|
617
|
-
]).optional()
|
|
618
|
-
});
|
|
619
|
-
SessionUpdateSchema = SessionSchema.omit({
|
|
620
|
-
id: true,
|
|
621
|
-
generation: true
|
|
622
|
-
}).partial().extend({
|
|
623
|
-
id: SessionSchema.shape.id,
|
|
624
|
-
generation: GenerationSchema.nullable().optional()
|
|
625
|
-
}).strict();
|
|
626
|
-
SandboxUpdateSchema = SandboxRecordSchema.omit({ id: true }).partial().extend({
|
|
627
|
-
id: SandboxRecordSchema.shape.id
|
|
628
|
-
}).strict();
|
|
629
|
-
CommandBaseSchema = import_zod.z.object({
|
|
630
|
-
id: import_zod.z.string(),
|
|
631
|
-
sessionId: import_zod.z.string(),
|
|
632
|
-
command: import_zod.z.string(),
|
|
633
|
-
args: import_zod.z.array(import_zod.z.string()).optional(),
|
|
634
|
-
startedAt: import_zod.z.number()
|
|
67
|
+
var Logger = class _Logger {
|
|
68
|
+
subsystem;
|
|
69
|
+
config;
|
|
70
|
+
context;
|
|
71
|
+
constructor({
|
|
72
|
+
subsystem,
|
|
73
|
+
config,
|
|
74
|
+
context
|
|
75
|
+
}) {
|
|
76
|
+
this.subsystem = subsystem;
|
|
77
|
+
this.config = config;
|
|
78
|
+
this.context = context ?? {};
|
|
79
|
+
}
|
|
80
|
+
child({
|
|
81
|
+
subsystem,
|
|
82
|
+
context
|
|
83
|
+
}) {
|
|
84
|
+
return new _Logger({
|
|
85
|
+
config: this.config,
|
|
86
|
+
subsystem: subsystem ? `${this.subsystem}:${subsystem}` : this.subsystem,
|
|
87
|
+
context: { ...this.context, ...context }
|
|
635
88
|
});
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
}
|
|
642
|
-
CommandBaseSchema.extend({
|
|
643
|
-
status: import_zod.z.literal("killed"),
|
|
644
|
-
result: CommandResultSchema.optional()
|
|
645
|
-
}),
|
|
646
|
-
CommandBaseSchema.extend({
|
|
647
|
-
status: import_zod.z.literal("failed"),
|
|
648
|
-
result: CommandResultSchema
|
|
649
|
-
})
|
|
650
|
-
]);
|
|
651
|
-
SetupSnapshotSchema = import_zod.z.object({
|
|
652
|
-
key: import_zod.z.string(),
|
|
653
|
-
snapshotId: import_zod.z.string().nullable(),
|
|
654
|
-
createdAt: import_zod.z.number(),
|
|
655
|
-
lastUsedAt: import_zod.z.number().nullable(),
|
|
656
|
-
acquiringLockId: import_zod.z.string().nullable(),
|
|
657
|
-
acquiringLockAt: import_zod.z.number().nullable()
|
|
89
|
+
}
|
|
90
|
+
withContext(context) {
|
|
91
|
+
return new _Logger({
|
|
92
|
+
config: this.config,
|
|
93
|
+
subsystem: this.subsystem,
|
|
94
|
+
context: { ...this.context, ...context }
|
|
658
95
|
});
|
|
659
|
-
methods = {
|
|
660
|
-
"session.get": {
|
|
661
|
-
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
662
|
-
result: SessionSchema.nullable()
|
|
663
|
-
},
|
|
664
|
-
"session.set": {
|
|
665
|
-
params: SessionSchema,
|
|
666
|
-
result: SessionSchema
|
|
667
|
-
},
|
|
668
|
-
"session.update": {
|
|
669
|
-
params: SessionUpdateSchema,
|
|
670
|
-
result: SessionSchema
|
|
671
|
-
},
|
|
672
|
-
"session.list": {
|
|
673
|
-
params: import_zod.z.object({
|
|
674
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
675
|
-
order: import_zod.z.enum([
|
|
676
|
-
"createdAt_asc",
|
|
677
|
-
"createdAt_desc",
|
|
678
|
-
"updatedAt_asc",
|
|
679
|
-
"updatedAt_desc"
|
|
680
|
-
]).optional(),
|
|
681
|
-
cursor: import_zod.z.string().optional(),
|
|
682
|
-
limit: import_zod.z.number().optional()
|
|
683
|
-
}),
|
|
684
|
-
result: ListResultSchema(SessionSchema)
|
|
685
|
-
},
|
|
686
|
-
"session.listBySandbox": {
|
|
687
|
-
params: import_zod.z.object({
|
|
688
|
-
sandboxId: import_zod.z.string(),
|
|
689
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
690
|
-
order: import_zod.z.enum([
|
|
691
|
-
"createdAt_asc",
|
|
692
|
-
"createdAt_desc",
|
|
693
|
-
"updatedAt_asc",
|
|
694
|
-
"updatedAt_desc"
|
|
695
|
-
]).optional(),
|
|
696
|
-
cursor: import_zod.z.string().optional(),
|
|
697
|
-
limit: import_zod.z.number().optional()
|
|
698
|
-
}),
|
|
699
|
-
result: ListResultSchema(SessionSchema)
|
|
700
|
-
},
|
|
701
|
-
"session.delete": {
|
|
702
|
-
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
703
|
-
result: import_zod.z.void()
|
|
704
|
-
},
|
|
705
|
-
"session.tag.set": {
|
|
706
|
-
params: import_zod.z.object({
|
|
707
|
-
sessionId: import_zod.z.string(),
|
|
708
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown())
|
|
709
|
-
}),
|
|
710
|
-
result: SessionSchema
|
|
711
|
-
},
|
|
712
|
-
"message.get": {
|
|
713
|
-
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
714
|
-
result: MessageSchema.nullable()
|
|
715
|
-
},
|
|
716
|
-
"message.set": {
|
|
717
|
-
params: MessageSchema,
|
|
718
|
-
result: MessageSchema
|
|
719
|
-
},
|
|
720
|
-
"message.list": {
|
|
721
|
-
params: import_zod.z.object({
|
|
722
|
-
sessionId: import_zod.z.string(),
|
|
723
|
-
cursor: import_zod.z.string().optional(),
|
|
724
|
-
limit: import_zod.z.number().optional()
|
|
725
|
-
}),
|
|
726
|
-
result: ListResultSchema(MessageSchema)
|
|
727
|
-
},
|
|
728
|
-
"part.listByMessage": {
|
|
729
|
-
params: import_zod.z.object({
|
|
730
|
-
messageId: import_zod.z.string(),
|
|
731
|
-
cursor: import_zod.z.string().optional(),
|
|
732
|
-
limit: import_zod.z.number().optional()
|
|
733
|
-
}),
|
|
734
|
-
result: ListResultSchema(PartSchema)
|
|
735
|
-
},
|
|
736
|
-
"part.listBySession": {
|
|
737
|
-
params: import_zod.z.object({
|
|
738
|
-
sessionId: import_zod.z.string(),
|
|
739
|
-
cursor: import_zod.z.string().optional(),
|
|
740
|
-
limit: import_zod.z.number().optional()
|
|
741
|
-
}),
|
|
742
|
-
result: ListResultSchema(PartSchema)
|
|
743
|
-
},
|
|
744
|
-
"part.set": {
|
|
745
|
-
params: PartSchema,
|
|
746
|
-
result: PartSchema
|
|
747
|
-
},
|
|
748
|
-
"part.delete": {
|
|
749
|
-
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
750
|
-
result: import_zod.z.void()
|
|
751
|
-
},
|
|
752
|
-
"sandbox.get": {
|
|
753
|
-
params: import_zod.z.object({ key: import_zod.z.string() }),
|
|
754
|
-
result: SandboxRecordSchema.nullable()
|
|
755
|
-
},
|
|
756
|
-
"sandbox.getBySession": {
|
|
757
|
-
params: import_zod.z.object({ sessionId: import_zod.z.string() }),
|
|
758
|
-
result: SandboxRecordSchema.nullable()
|
|
759
|
-
},
|
|
760
|
-
"sandbox.set": {
|
|
761
|
-
params: SandboxRecordSchema,
|
|
762
|
-
result: import_zod.z.void()
|
|
763
|
-
},
|
|
764
|
-
"sandbox.update": {
|
|
765
|
-
params: SandboxUpdateSchema,
|
|
766
|
-
result: SandboxRecordSchema
|
|
767
|
-
},
|
|
768
|
-
"sandbox.list": {
|
|
769
|
-
params: import_zod.z.object({
|
|
770
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
771
|
-
order: import_zod.z.enum([
|
|
772
|
-
"createdAt_asc",
|
|
773
|
-
"createdAt_desc",
|
|
774
|
-
"lastActivityAt_asc",
|
|
775
|
-
"lastActivityAt_desc"
|
|
776
|
-
]).optional(),
|
|
777
|
-
cursor: import_zod.z.string().optional(),
|
|
778
|
-
limit: import_zod.z.number().optional()
|
|
779
|
-
}),
|
|
780
|
-
result: ListResultSchema(SandboxRecordSchema)
|
|
781
|
-
},
|
|
782
|
-
"sandbox.tag.set": {
|
|
783
|
-
params: import_zod.z.object({
|
|
784
|
-
sandboxId: import_zod.z.string(),
|
|
785
|
-
tags: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown())
|
|
786
|
-
}),
|
|
787
|
-
result: SandboxRecordSchema
|
|
788
|
-
},
|
|
789
|
-
"command.get": {
|
|
790
|
-
params: import_zod.z.object({ id: import_zod.z.string() }),
|
|
791
|
-
result: CommandSchema.nullable()
|
|
792
|
-
},
|
|
793
|
-
"command.set": {
|
|
794
|
-
params: CommandSchema,
|
|
795
|
-
result: CommandSchema
|
|
796
|
-
},
|
|
797
|
-
"command.list": {
|
|
798
|
-
params: import_zod.z.object({
|
|
799
|
-
sessionId: import_zod.z.string(),
|
|
800
|
-
includeFinished: import_zod.z.boolean().optional(),
|
|
801
|
-
cursor: import_zod.z.string().optional(),
|
|
802
|
-
limit: import_zod.z.number().optional()
|
|
803
|
-
}),
|
|
804
|
-
result: ListResultSchema(CommandSchema)
|
|
805
|
-
},
|
|
806
|
-
"setup.get": {
|
|
807
|
-
params: import_zod.z.object({ key: import_zod.z.string() }),
|
|
808
|
-
result: SetupSnapshotSchema.nullable()
|
|
809
|
-
},
|
|
810
|
-
"setup.set": {
|
|
811
|
-
params: SetupSnapshotSchema,
|
|
812
|
-
result: import_zod.z.void()
|
|
813
|
-
},
|
|
814
|
-
"setup.delete": {
|
|
815
|
-
params: import_zod.z.object({ key: import_zod.z.string() }),
|
|
816
|
-
result: import_zod.z.void()
|
|
817
|
-
},
|
|
818
|
-
"setup.acquireLock": {
|
|
819
|
-
params: import_zod.z.object({
|
|
820
|
-
key: import_zod.z.string(),
|
|
821
|
-
lockId: import_zod.z.string(),
|
|
822
|
-
lockTimeoutMs: import_zod.z.number()
|
|
823
|
-
}),
|
|
824
|
-
result: SetupSnapshotSchema.nullable()
|
|
825
|
-
},
|
|
826
|
-
"sandbox.acquireLock": {
|
|
827
|
-
params: import_zod.z.object({
|
|
828
|
-
record: SandboxRecordSchema,
|
|
829
|
-
lockTimeoutMs: import_zod.z.number()
|
|
830
|
-
}),
|
|
831
|
-
result: SandboxRecordSchema.nullable()
|
|
832
|
-
}
|
|
833
|
-
};
|
|
834
|
-
STORAGE_RPC_METHODS = Object.keys(methods);
|
|
835
96
|
}
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
97
|
+
info(message, data) {
|
|
98
|
+
if (!shouldLog(this.config, "info")) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const d = formatData(this.context, data);
|
|
102
|
+
if (d) {
|
|
103
|
+
console.info(formatTag(this.config, this.subsystem), message, d);
|
|
104
|
+
} else {
|
|
105
|
+
console.info(formatTag(this.config, this.subsystem), message);
|
|
106
|
+
}
|
|
845
107
|
}
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
}
|
|
108
|
+
warn(message, data) {
|
|
109
|
+
if (!shouldLog(this.config, "warn")) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const d = formatData(this.context, data);
|
|
113
|
+
if (d) {
|
|
114
|
+
console.warn(formatTag(this.config, this.subsystem), message, d);
|
|
115
|
+
} else {
|
|
116
|
+
console.warn(formatTag(this.config, this.subsystem), message);
|
|
117
|
+
}
|
|
856
118
|
}
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
return { result };
|
|
861
|
-
} catch (e) {
|
|
862
|
-
const isConflict = e instanceof StorageConflictError || e instanceof Error && e.name === "StorageConflictError";
|
|
863
|
-
if (isConflict) {
|
|
864
|
-
return {
|
|
865
|
-
error: {
|
|
866
|
-
code: "CONFLICT",
|
|
867
|
-
message: e instanceof Error ? e.message : String(e)
|
|
868
|
-
}
|
|
869
|
-
};
|
|
119
|
+
error(message, data) {
|
|
120
|
+
if (!shouldLog(this.config, "error")) {
|
|
121
|
+
return;
|
|
870
122
|
}
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
123
|
+
const d = formatData(this.context, data);
|
|
124
|
+
if (d) {
|
|
125
|
+
console.error(formatTag(this.config, this.subsystem), message, d);
|
|
126
|
+
} else {
|
|
127
|
+
console.error(formatTag(this.config, this.subsystem), message);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Returns a function that, when called, logs the elapsed time at info level.
|
|
132
|
+
* Pass `logOnStart: true` to also log when the timer begins.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* const done = log.time("sandbox setup", { sandboxId }, { logOnStart: true });
|
|
136
|
+
* await setup();
|
|
137
|
+
* done(); // start: [agent:default:sandbox] sandbox setup { sandboxId: '...' }
|
|
138
|
+
* // end: [agent:default:sandbox] sandbox setup { sandboxId: '...', durationMs: 123 }
|
|
139
|
+
*/
|
|
140
|
+
time(message, data, opts) {
|
|
141
|
+
if (opts?.logOnStart) {
|
|
142
|
+
this.info(`[start] ${message}`, data);
|
|
143
|
+
}
|
|
144
|
+
const t0 = Date.now();
|
|
145
|
+
return (endData) => {
|
|
146
|
+
this.info(opts?.logOnStart ? `[end] ${message}` : message, {
|
|
147
|
+
...data,
|
|
148
|
+
...endData,
|
|
149
|
+
durationMs: Date.now() - t0
|
|
150
|
+
});
|
|
876
151
|
};
|
|
877
152
|
}
|
|
153
|
+
};
|
|
154
|
+
function createLogger({
|
|
155
|
+
config,
|
|
156
|
+
subsystem,
|
|
157
|
+
context
|
|
158
|
+
}) {
|
|
159
|
+
return new Logger({ config, subsystem, context });
|
|
878
160
|
}
|
|
879
|
-
var init_handler = __esm({
|
|
880
|
-
"src/storage/handler.ts"() {
|
|
881
|
-
"use strict";
|
|
882
|
-
init_errors();
|
|
883
|
-
init_rpc();
|
|
884
|
-
}
|
|
885
|
-
});
|
|
886
|
-
|
|
887
|
-
// src/storage/index.ts
|
|
888
|
-
var storage_exports = {};
|
|
889
|
-
__export(storage_exports, {
|
|
890
|
-
DEFAULT_NAMESPACE: () => DEFAULT_NAMESPACE,
|
|
891
|
-
LOCAL_STORAGE_VERSION: () => LOCAL_STORAGE_VERSION,
|
|
892
|
-
STORAGE_RPC_METHODS: () => STORAGE_RPC_METHODS,
|
|
893
|
-
getStorage: () => getStorage,
|
|
894
|
-
handleStorageRpc: () => handleStorageRpc
|
|
895
|
-
});
|
|
896
|
-
var init_storage = __esm({
|
|
897
|
-
"src/storage/index.ts"() {
|
|
898
|
-
"use strict";
|
|
899
|
-
init_client();
|
|
900
|
-
init_handler();
|
|
901
|
-
init_rpc();
|
|
902
|
-
}
|
|
903
|
-
});
|
|
904
161
|
|
|
905
|
-
// src/sandbox/bindings/lifecycle
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
});
|
|
910
|
-
module.exports = __toCommonJS(lifecycle_workflow_exports);
|
|
911
|
-
var import_workflow = require("workflow");
|
|
912
|
-
|
|
913
|
-
// src/sandbox/bindings/lifecycle-workflow-steps.ts
|
|
162
|
+
// src/sandbox/bindings/vercel-lifecycle/steps.ts
|
|
163
|
+
async function loadSandboxSDK() {
|
|
164
|
+
return (await import("@vercel/sandbox")).Sandbox;
|
|
165
|
+
}
|
|
914
166
|
var DEFAULT_POLL_INTERVAL_MS = 2 * 60 * 1e3;
|
|
915
167
|
var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
916
168
|
var SNAPSHOT_BEFORE_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
@@ -921,40 +173,44 @@ var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
|
|
|
921
173
|
} : {};
|
|
922
174
|
async function checkAndSnapshotStep(input) {
|
|
923
175
|
"use step";
|
|
924
|
-
const
|
|
925
|
-
const
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
176
|
+
const storage = input.agent.storage;
|
|
177
|
+
const log = createLogger({
|
|
178
|
+
config: { ...input.agent.options.logging, name: input.agent.name },
|
|
179
|
+
subsystem: "sandbox:lifecycle",
|
|
180
|
+
context: { sandboxId: input.sandboxId }
|
|
181
|
+
});
|
|
182
|
+
log.info("lifecycle check started", {
|
|
183
|
+
vercelSandboxId: input.vercelSandboxId
|
|
932
184
|
});
|
|
933
|
-
const record = await storage.sandbox.get(input.
|
|
934
|
-
if (record
|
|
185
|
+
const record = await storage.sandbox.get(input.sandboxId);
|
|
186
|
+
if (!record) {
|
|
187
|
+
log.warn("sandbox record not found, exiting lifecycle");
|
|
935
188
|
return { action: "exit", reason: "not_found" };
|
|
936
189
|
}
|
|
937
|
-
const
|
|
190
|
+
const metadata = record.setup?.metadata;
|
|
191
|
+
const currentSandboxId = metadata?.sandboxId ?? null;
|
|
938
192
|
if (currentSandboxId !== input.vercelSandboxId) {
|
|
193
|
+
log.info("sandbox ID changed, exiting lifecycle", {
|
|
194
|
+
expected: input.vercelSandboxId,
|
|
195
|
+
actual: currentSandboxId
|
|
196
|
+
});
|
|
939
197
|
return { action: "exit", reason: "sandboxId_changed" };
|
|
940
198
|
}
|
|
941
199
|
if (!currentSandboxId) {
|
|
200
|
+
log.warn("no current sandbox ID in metadata, exiting lifecycle");
|
|
942
201
|
return { action: "exit", reason: "not_found" };
|
|
943
202
|
}
|
|
944
|
-
const
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
}
|
|
948
|
-
const pollIntervalMs = config.lifecycle?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
949
|
-
const idleTimeoutMs = config.lifecycle?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
|
|
950
|
-
const snapshotBeforeTimeoutMs = config.lifecycle?.snapshotBeforeTimeoutMs ?? SNAPSHOT_BEFORE_TIMEOUT_MS;
|
|
203
|
+
const pollIntervalMs = input.config?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
204
|
+
const idleTimeoutMs = input.config?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
|
|
205
|
+
const snapshotBeforeTimeoutMs = input.config?.snapshotBeforeTimeoutMs ?? SNAPSHOT_BEFORE_TIMEOUT_MS;
|
|
951
206
|
const now = Date.now();
|
|
952
|
-
const lastActivity = record.
|
|
207
|
+
const lastActivity = record.lastActiveAt ?? record.createdAt ?? now;
|
|
953
208
|
const idleDuration = now - lastActivity;
|
|
954
209
|
const shouldSnapshotDueToIdle = idleDuration > idleTimeoutMs;
|
|
955
210
|
let shouldSnapshotDueToTimeout = false;
|
|
956
211
|
try {
|
|
957
|
-
const
|
|
212
|
+
const SandboxSDK = await loadSandboxSDK();
|
|
213
|
+
const sandbox = await SandboxSDK.get({
|
|
958
214
|
sandboxId: currentSandboxId,
|
|
959
215
|
...getTestCredentials()
|
|
960
216
|
});
|
|
@@ -962,47 +218,78 @@ async function checkAndSnapshotStep(input) {
|
|
|
962
218
|
shouldSnapshotDueToTimeout = true;
|
|
963
219
|
}
|
|
964
220
|
} catch {
|
|
221
|
+
log.warn("failed to get sandbox from SDK, exiting lifecycle", {
|
|
222
|
+
vercelSandboxId: currentSandboxId
|
|
223
|
+
});
|
|
965
224
|
return { action: "exit", reason: "not_found" };
|
|
966
225
|
}
|
|
967
226
|
if (shouldSnapshotDueToIdle || shouldSnapshotDueToTimeout) {
|
|
227
|
+
const reason = shouldSnapshotDueToIdle ? "idle" : "timeout";
|
|
228
|
+
log.info("snapshotting sandbox before exit", {
|
|
229
|
+
reason,
|
|
230
|
+
idleDurationMs: idleDuration,
|
|
231
|
+
vercelSandboxId: currentSandboxId
|
|
232
|
+
});
|
|
968
233
|
try {
|
|
969
|
-
const
|
|
234
|
+
const SandboxSDK = await loadSandboxSDK();
|
|
235
|
+
const sandbox = await SandboxSDK.get({
|
|
970
236
|
sandboxId: currentSandboxId,
|
|
971
237
|
...getTestCredentials()
|
|
972
238
|
});
|
|
973
239
|
const snapshot = await sandbox.snapshot();
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
provider: "vercel",
|
|
980
|
-
sandboxId: null,
|
|
981
|
-
snapshotId: snapshot.snapshotId
|
|
240
|
+
log.info("snapshot created", { snapshotId: snapshot.snapshotId });
|
|
241
|
+
await storage.sandbox.update(input.sandboxId, {
|
|
242
|
+
setup: {
|
|
243
|
+
...record.setup,
|
|
244
|
+
metadata: { sandboxId: null, snapshotId: snapshot.snapshotId }
|
|
982
245
|
}
|
|
983
246
|
});
|
|
247
|
+
log.info("sandbox record updated with snapshot");
|
|
984
248
|
} catch (e) {
|
|
249
|
+
log.error("failed to snapshot sandbox", { cause: e });
|
|
985
250
|
return e instanceof Error ? e : new Error(String(e));
|
|
986
251
|
}
|
|
987
|
-
return {
|
|
988
|
-
action: "exit",
|
|
989
|
-
reason: shouldSnapshotDueToIdle ? "idle" : "timeout"
|
|
990
|
-
};
|
|
252
|
+
return { action: "exit", reason };
|
|
991
253
|
}
|
|
254
|
+
log.info("sandbox still active, continuing lifecycle", {
|
|
255
|
+
idleDurationMs: idleDuration,
|
|
256
|
+
nextPollMs: pollIntervalMs
|
|
257
|
+
});
|
|
992
258
|
return { action: "continue", nextPollMs: pollIntervalMs };
|
|
993
259
|
}
|
|
994
260
|
|
|
995
|
-
// src/sandbox/bindings/lifecycle
|
|
261
|
+
// src/sandbox/bindings/vercel-lifecycle/workflow.ts
|
|
996
262
|
var DEFAULT_POLL_MS = 2 * 60 * 1e3;
|
|
997
263
|
async function sandboxLifecycleWorkflow({
|
|
998
264
|
input
|
|
999
265
|
}) {
|
|
1000
266
|
"use workflow";
|
|
1001
|
-
let nextPollMs = DEFAULT_POLL_MS;
|
|
267
|
+
let nextPollMs = input.config?.pollIntervalMs ?? DEFAULT_POLL_MS;
|
|
268
|
+
const log = createLogger({
|
|
269
|
+
config: { ...input.agent.options.logging, name: input.agent.name },
|
|
270
|
+
subsystem: "sandbox:lifecycle",
|
|
271
|
+
context: { sandboxId: input.sandboxId }
|
|
272
|
+
});
|
|
273
|
+
log.info("lifecycle workflow started", {
|
|
274
|
+
sandboxId: input.sandboxId,
|
|
275
|
+
vercelSandboxId: input.vercelSandboxId,
|
|
276
|
+
pollMs: nextPollMs
|
|
277
|
+
});
|
|
1002
278
|
while (true) {
|
|
1003
279
|
await (0, import_workflow.sleep)(nextPollMs);
|
|
1004
280
|
const result = await checkAndSnapshotStep(input);
|
|
1005
|
-
if (result instanceof Error
|
|
281
|
+
if (result instanceof Error) {
|
|
282
|
+
log.error("lifecycle step failed", {
|
|
283
|
+
sandboxId: input.sandboxId,
|
|
284
|
+
error: result.message
|
|
285
|
+
});
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
if (result.action === "exit") {
|
|
289
|
+
log.info("lifecycle workflow exiting", {
|
|
290
|
+
sandboxId: input.sandboxId,
|
|
291
|
+
reason: result.reason
|
|
292
|
+
});
|
|
1006
293
|
break;
|
|
1007
294
|
}
|
|
1008
295
|
nextPollMs = result.nextPollMs;
|
|
@@ -1012,4 +299,4 @@ async function sandboxLifecycleWorkflow({
|
|
|
1012
299
|
0 && (module.exports = {
|
|
1013
300
|
sandboxLifecycleWorkflow
|
|
1014
301
|
});
|
|
1015
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLXNkay50cyIsICIuLi9zcmMvZXJyb3JzLnRzIiwgIi4uL3NyYy9zdG9yYWdlL2NsaWVudC50cyIsICIuLi9zcmMvc3RvcmFnZS9ycGMudHMiLCAiLi4vc3JjL3N0b3JhZ2UvaGFuZGxlci50cyIsICIuLi9zcmMvc3RvcmFnZS9pbmRleC50cyIsICIuLi9zcmMvc2FuZGJveC9iaW5kaW5ncy9saWZlY3ljbGUtd29ya2Zsb3cudHMiLCAiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBTYW5kYm94IH0gZnJvbSBcIkB2ZXJjZWwvc2FuZGJveFwiO1xuIiwgImltcG9ydCAqIGFzIGVycm9yZSBmcm9tIFwiZXJyb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU2Vzc2lvbk5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJTZXNzaW9uICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNlc3Npb25FcnJvclwiLFxuICBtZXNzYWdlOiBcIlNlc3Npb24gJGlkIGZhaWxlZDogJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFNhbmRib3hOb3RGb3VuZEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTYW5kYm94Tm90Rm91bmRFcnJvclwiLFxuICBtZXNzYWdlOiBcIlNhbmRib3ggJGlkIG5vdCBmb3VuZFwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiU3RvcmFnZUVycm9yXCIsXG4gIG1lc3NhZ2U6IFwiJHJlYXNvblwiLFxufSkge31cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VDb25mbGljdEVycm9yIGV4dGVuZHMgZXJyb3JlLmNyZWF0ZVRhZ2dlZEVycm9yKHtcbiAgbmFtZTogXCJTdG9yYWdlQ29uZmxpY3RFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94RXJyb3IgZXh0ZW5kcyBlcnJvcmUuY3JlYXRlVGFnZ2VkRXJyb3Ioe1xuICBuYW1lOiBcIlNhbmRib3hFcnJvclwiLFxuICBtZXNzYWdlOiBcIiRyZWFzb25cIixcbn0pIHt9XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlTm90Rm91bmRFcnJvciBleHRlbmRzIGVycm9yZS5jcmVhdGVUYWdnZWRFcnJvcih7XG4gIG5hbWU6IFwiTWVzc2FnZU5vdEZvdW5kRXJyb3JcIixcbiAgbWVzc2FnZTogXCJNZXNzYWdlICRpZCBub3QgZm91bmRcIixcbn0pIHt9XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZU5vdEZvdW5kRXJyb3IsXG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uTm90Rm91bmRFcnJvcixcbiAgU3RvcmFnZUNvbmZsaWN0RXJyb3IsXG4gIFN0b3JhZ2VFcnJvcixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWV0aG9kcyB9IGZyb20gXCIuL3JwY1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBMaXN0UmVzdWx0LFxuICBQYXJ0LFxuICBTZXR1cFNuYXBzaG90LFxuICBTdG9yYWdlLFxuICBTdG9yYWdlQ29uZmlnLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG50eXBlIFJwY1Jlc3BvbnNlPFQ+ID1cbiAgfCB7IHJlc3VsdDogVCB9XG4gIHwgeyBlcnJvcjogeyBjb2RlOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9IH07XG5cbmV4cG9ydCB0eXBlIFJwY0ZuID0gKHBhcmFtczoge1xuICBuYW1lPzogc3RyaW5nO1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGFyYW1zOiB1bmtub3duO1xuICBfcXVpZXQ/OiBib29sZWFuO1xufSkgPT4gUHJvbWlzZTxScGNSZXNwb25zZTx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlQ2xpZW50KHJwY0ZuOiBScGNGbiwgbmFtZT86IHN0cmluZyk6IFN0b3JhZ2Uge1xuICBhc3luYyBmdW5jdGlvbiBycGM8TSBleHRlbmRzIGtleW9mIFN0b3JhZ2VNZXRob2RzPihcbiAgICBtZXRob2Q6IE0sXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicGFyYW1zXCJdPlxuICApOiBQcm9taXNlPHouaW5mZXI8U3RvcmFnZU1ldGhvZHNbTV1bXCJyZXN1bHRcIl0+PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjRm4oeyBuYW1lLCBtZXRob2QsIHBhcmFtcyB9KTtcblxuICAgIGlmIChcImVycm9yXCIgaW4gcmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LmVycm9yLmNvZGUgPT09IFwiQ09ORkxJQ1RcIikge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUNvbmZsaWN0RXJyb3IoeyByZWFzb246IHJlc3VsdC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcih7XG4gICAgICAgIHJlYXNvbjogYFske3Jlc3VsdC5lcnJvci5jb2RlfV0gJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2Vzc2lvbi5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnNldFwiLCBzZXNzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNlc3Npb24udXBkYXRlXCIsIG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlQ29uZmxpY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNlc3Npb24uZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTYW5kYm94OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLmxpc3RCeVNhbmRib3hcIiwge1xuICAgICAgICAgICAgc2FuZGJveElkOiBvcHRzLnNhbmRib3hJZCxcbiAgICAgICAgICAgIHRhZ3M6IG9wdHMudGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzLm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzLmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzLmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNlc3Npb25JZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnRhZy5zZXRcIiwgeyBzZXNzaW9uSWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbWVzc2FnZToge1xuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLmxpc3RcIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0OiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJtZXNzYWdlLmdldFwiLCB7IGlkIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZU5vdEZvdW5kRXJyb3IoeyBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcIm1lc3NhZ2Uuc2V0XCIsIG1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGxpc3RCeU1lc3NhZ2U6IGFzeW5jIChtZXNzYWdlSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3RCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwge1xuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PFBhcnQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHBhcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInBhcnQuc2V0XCIsIHBhcnQpKSBhcyBQYXJ0O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwicGFydC5kZWxldGVcIiwgeyBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYW5kYm94OiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldFwiLCB7IGtleSB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRCeVNlc3Npb246IGFzeW5jIChzZXNzaW9uSWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBycGMoXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhbmRib3hOb3RGb3VuZEVycm9yKHsgaWQ6IHNlc3Npb25JZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzYW5kYm94LnNldFwiLCByZWNvcmQpO1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlOiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94LnVwZGF0ZVwiLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAob3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94Lmxpc3RcIiwge1xuICAgICAgICAgICAgdGFnczogb3B0cz8udGFncyxcbiAgICAgICAgICAgIG9yZGVyOiBvcHRzPy5vcmRlcixcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRhZzoge1xuICAgICAgICBzZXQ6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzYW5kYm94LnRhZy5zZXRcIiwgeyBzYW5kYm94SWQsIHRhZ3MgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWNxdWlyZUxvY2s6IGFzeW5jIChyZWNvcmQsIGxvY2tUaW1lb3V0TXMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNhbmRib3guYWNxdWlyZUxvY2tcIiwge1xuICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgbG9ja1RpbWVvdXRNcyxcbiAgICAgICAgICB9KSkgYXMgaW1wb3J0KFwiLi90eXBlc1wiKS5TYW5kYm94UmVjb3JkIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXR1cDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5nZXRcIiwgeyBrZXkgfSkpIGFzIFNldHVwU25hcHNob3QgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogYXN5bmMgKHNuYXBzaG90KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2V0dXAuc2V0XCIsIHNuYXBzaG90KTtcbiAgICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGVsZXRlOiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2V0dXAuZGVsZXRlXCIsIHsga2V5IH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFjcXVpcmVMb2NrOiBhc3luYyAoa2V5LCBsb2NrSWQsIGxvY2tUaW1lb3V0TXMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNldHVwLmFjcXVpcmVMb2NrXCIsIHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGxvY2tJZCxcbiAgICAgICAgICAgIGxvY2tUaW1lb3V0TXMsXG4gICAgICAgICAgfSkpIGFzIFNldHVwU25hcHNob3QgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbW1hbmQ6IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLmdldFwiLCB7IGlkIH0pKSBhcyBDb21tYW5kIHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJjb21tYW5kLnNldFwiLCBjb21tYW5kKSkgYXMgQ29tbWFuZDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0OiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwiY29tbWFuZC5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGluY2x1ZGVGaW5pc2hlZDogb3B0cz8uaW5jbHVkZUZpbmlzaGVkLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBMaXN0UmVzdWx0PENvbW1hbmQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSBcImRlZmF1bHRcIjtcbmV4cG9ydCBjb25zdCBMT0NBTF9TVE9SQUdFX1ZFUlNJT04gPSBcInYxXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKG9wdHM6IHtcbiAgY29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBycGM6IFJwY0ZuO1xufSk6IFN0b3JhZ2Uge1xuICBjb25zdCBuYW1lID0gb3B0cy5jb25maWcubmFtZSA/PyBERUZBVUxUX05BTUVTUEFDRTtcbiAgcmV0dXJuIGdldFN0b3JhZ2VDbGllbnQob3B0cy5ycGMsIG5hbWUpO1xufVxuIiwgImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFZlcmNlbExpZmVjeWNsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcG9sbEludGVydmFsTXM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgc3RvcEFmdGVySW5hY3RpdmVNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF1dG9TdGFydDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtQb2xpY3kgfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG5cbi8qKlxuICogUGFzc3Rocm91Z2ggc2NoZW1hIFx1MjAxNCB0aGUgU0RLIHZhbGlkYXRlcyB0aGUgYWN0dWFsIHNoYXBlLlxuICogVHlwZWQgdmlhIHouY3VzdG9tIHNvIHRoZSBpbmZlcnJlZCBUUyB0eXBlIG1hdGNoZXMgdGhlIFNESydzIE5ldHdvcmtQb2xpY3kuXG4gKi9cbmNvbnN0IE5ldHdvcmtQb2xpY3lTY2hlbWEgPSB6LmN1c3RvbTxOZXR3b3JrUG9saWN5PigpLm9wdGlvbmFsKCk7XG5cbmV4cG9ydCB0eXBlIHsgTmV0d29ya1BvbGljeSB9O1xuXG5jb25zdCBTYW5kYm94Q29uZmlnQmFzZSA9IHoub2JqZWN0KHtcbiAgY3dkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFNhbmRib3hDb25maWdTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBTYW5kYm94Q29uZmlnQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcInZlcmNlbFwiKSxcbiAgICByZXNvdXJjZXM6IHoub2JqZWN0KHsgdmNwdXM6IHoubnVtYmVyKCkgfSkub3B0aW9uYWwoKSxcbiAgICBwb3J0czogei5hcnJheSh6Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgIGxpZmVjeWNsZTogVmVyY2VsTGlmZWN5Y2xlQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgbmV0d29ya1BvbGljeTogTmV0d29ya1BvbGljeVNjaGVtYSxcbiAgfSksXG4gIFNhbmRib3hDb25maWdCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwibG9jYWxcIiksXG4gIH0pLFxuICBTYW5kYm94Q29uZmlnQmFzZS5leHRlbmQoe1xuICAgIHR5cGU6IHoubGl0ZXJhbChcImRvY2tlclwiKSxcbiAgfSksXG4gIFNhbmRib3hDb25maWdCYXNlLmV4dGVuZCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwiY3VzdG9tXCIpLFxuICAgIHVybDogei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICB9KSxcbl0pO1xuXG5leHBvcnQgdHlwZSBTYW5kYm94Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgU2FuZGJveENvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IEdlbmVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1heFN0ZXBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRlbXBlcmF0dXJlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHRvcEs6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgdG9wUDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBmcmVxdWVuY3lQZW5hbHR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHByZXNlbmNlUGVuYWx0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtYXhPdXRwdXRUb2tlbnM6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgaGVhZGVyczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgU2Vzc2lvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgdXBkYXRlZEF0OiB6Lm51bWJlcigpLFxuICBydW5JZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBsYXN0TWVzc2FnZUlkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5udWxsYWJsZSgpLFxuICBzeXN0ZW06IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgc2FuZGJveElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIHNraWxsc0Rpcjogei5hcnJheSh6LnN0cmluZygpKS5udWxsYWJsZSgpLFxuICBob29rVG9rZW46IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWN0aXZlVG9vbHM6IHouYXJyYXkoei5zdHJpbmcoKSkubnVsbGFibGUoKSxcbiAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuZXhwb3J0IGNvbnN0IFN0ZXBVc2FnZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3RlcEluZGV4OiB6Lm51bWJlcigpLFxuICBtb2RlbDogei5zdHJpbmcoKSxcbiAgaW5wdXRUb2tlbnM6IHoubnVtYmVyKCksXG4gIG91dHB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgdG90YWxUb2tlbnM6IHoubnVtYmVyKCksXG4gIGNhY2hlUmVhZFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVXcml0ZVRva2Vuczogei5udW1iZXIoKSxcbiAgcmVhc29uaW5nVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBVc2FnZVN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG1vZGVsOiB6LnN0cmluZygpLFxuICBpbnB1dFRva2Vuczogei5udW1iZXIoKSxcbiAgb3V0cHV0VG9rZW5zOiB6Lm51bWJlcigpLFxuICB0b3RhbFRva2Vuczogei5udW1iZXIoKSxcbiAgY2FjaGVSZWFkVG9rZW5zOiB6Lm51bWJlcigpLFxuICBjYWNoZVdyaXRlVG9rZW5zOiB6Lm51bWJlcigpLFxuICByZWFzb25pbmdUb2tlbnM6IHoubnVtYmVyKCksXG4gIHN0ZXBDb3VudDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgTWVzc2FnZVVzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGVwczogei5hcnJheShTdGVwVXNhZ2VTY2hlbWEpLFxuICBzdW1tYXJ5OiBVc2FnZVN1bW1hcnlTY2hlbWEsXG59KTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVVzYWdlID0gei5pbmZlcjx0eXBlb2YgTWVzc2FnZVVzYWdlU2NoZW1hPjtcbmV4cG9ydCB0eXBlIFVzYWdlU3VtbWFyeSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlU3VtbWFyeVNjaGVtYT47XG5leHBvcnQgdHlwZSBTdGVwVXNhZ2UgPSB6LmluZmVyPHR5cGVvZiBTdGVwVXNhZ2VTY2hlbWE+O1xuXG5leHBvcnQgY29uc3QgSW50ZXJydXB0ZWRMYXN0UGFydFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBNZXNzYWdlU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICByb2xlOiB6LmVudW0oW1widXNlclwiLCBcImFzc2lzdGFudFwiLCBcInN5c3RlbVwiXSksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGludGVycnVwdGVkQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgaW50ZXJydXB0ZWRMYXN0UGFydDogSW50ZXJydXB0ZWRMYXN0UGFydFNjaGVtYS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHVzYWdlOiBNZXNzYWdlVXNhZ2VTY2hlbWEubnVsbGFibGUoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBgcGFydGAgZmllbGQgY29ycmVzcG9uZHMgdG8gYFVJTWVzc2FnZVtcInBhcnRzXCJdW251bWJlcl1gIGZyb20gdGhlIGBhaWAgcGFja2FnZS5cbiAqIFdlIHVzZSBgei51bmtub3duKClgIGJlY2F1c2UgdGhlIGV4YWN0IHNoYXBlIHZhcmllcyBieSBwYXJ0IHR5cGUgKHRleHQsIHRvb2wtY2FsbCxcbiAqIHRvb2wtcmVzdWx0LCBldGMuKSBhbmQgbWF5IGV2b2x2ZSB3aXRoIHRoZSBBSSBTREsuIFRoZSBSUEMgbGF5ZXIganVzdCBwYXNzZXMgaXQgdGhyb3VnaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCksXG4gIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgaW5kZXg6IHoubnVtYmVyKCksXG4gIHBhcnQ6IHoudW5rbm93bigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kUmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBzdGRvdXQ6IHouc3RyaW5nKCksXG4gIHN0ZGVycjogei5zdHJpbmcoKSxcbiAgZXhpdENvZGU6IHoubnVtYmVyKCksXG4gIGNvbXBsZXRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBTYW5kYm94UmVjb3JkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgY29uZmlnOiBTYW5kYm94Q29uZmlnU2NoZW1hLFxuICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkubnVsbGFibGUoKSxcbiAgY3JlYXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGxhc3RBY3Rpdml0eUF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIGFjcXVpcmluZ0xvY2tJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrQXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgc2V0dXBLZXk6IHouc3RyaW5nKCkubnVsbGFibGUoKS5vcHRpb25hbCgpLFxuICBzZXR1cENvbXBsZXRlZEF0OiB6Lm51bWJlcigpLm51bGxhYmxlKCkub3B0aW9uYWwoKSxcbiAgcHJvdmlkZXJNZXRhZGF0YTogelxuICAgIC5kaXNjcmltaW5hdGVkVW5pb24oXCJwcm92aWRlclwiLCBbXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIHByb3ZpZGVyOiB6LmxpdGVyYWwoXCJ2ZXJjZWxcIiksXG4gICAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICB9KSxcbiAgICBdKVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IFNlc3Npb25VcGRhdGVTY2hlbWEgPSBTZXNzaW9uU2NoZW1hLm9taXQoe1xuICBpZDogdHJ1ZSxcbiAgZ2VuZXJhdGlvbjogdHJ1ZSxcbn0pXG4gIC5wYXJ0aWFsKClcbiAgLmV4dGVuZCh7XG4gICAgaWQ6IFNlc3Npb25TY2hlbWEuc2hhcGUuaWQsXG4gICAgZ2VuZXJhdGlvbjogR2VuZXJhdGlvblNjaGVtYS5udWxsYWJsZSgpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgU2FuZGJveFVwZGF0ZVNjaGVtYSA9IFNhbmRib3hSZWNvcmRTY2hlbWEub21pdCh7IGlkOiB0cnVlIH0pXG4gIC5wYXJ0aWFsKClcbiAgLmV4dGVuZCh7XG4gICAgaWQ6IFNhbmRib3hSZWNvcmRTY2hlbWEuc2hhcGUuaWQsXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQ29tbWFuZEJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICBzZXNzaW9uSWQ6IHouc3RyaW5nKCksXG4gIGNvbW1hbmQ6IHouc3RyaW5nKCksXG4gIGFyZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgc3RhcnRlZEF0OiB6Lm51bWJlcigpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBDb21tYW5kU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJzdGF0dXNcIiwgW1xuICBDb21tYW5kQmFzZVNjaGVtYS5leHRlbmQoeyBzdGF0dXM6IHoubGl0ZXJhbChcInJ1bm5pbmdcIikgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJjb21wbGV0ZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbiAgQ29tbWFuZEJhc2VTY2hlbWEuZXh0ZW5kKHtcbiAgICBzdGF0dXM6IHoubGl0ZXJhbChcImtpbGxlZFwiKSxcbiAgICByZXN1bHQ6IENvbW1hbmRSZXN1bHRTY2hlbWEub3B0aW9uYWwoKSxcbiAgfSksXG4gIENvbW1hbmRCYXNlU2NoZW1hLmV4dGVuZCh7XG4gICAgc3RhdHVzOiB6LmxpdGVyYWwoXCJmYWlsZWRcIiksXG4gICAgcmVzdWx0OiBDb21tYW5kUmVzdWx0U2NoZW1hLFxuICB9KSxcbl0pO1xuXG5mdW5jdGlvbiBMaXN0UmVzdWx0U2NoZW1hPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KGl0ZW1TY2hlbWE6IFQpIHtcbiAgcmV0dXJuIHoub2JqZWN0KHtcbiAgICBpdGVtczogei5hcnJheShpdGVtU2NoZW1hKSxcbiAgICBuZXh0Q3Vyc29yOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgU2V0dXBTbmFwc2hvdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAga2V5OiB6LnN0cmluZygpLFxuICBzbmFwc2hvdElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGNyZWF0ZWRBdDogei5udW1iZXIoKSxcbiAgbGFzdFVzZWRBdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBhY3F1aXJpbmdMb2NrSWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgYWNxdWlyaW5nTG9ja0F0OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG59KTtcblxuY29uc3QgbWV0aG9kcyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2Vzc2lvblNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNlc3Npb24uc2V0XCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25TY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24udXBkYXRlXCI6IHtcbiAgICBwYXJhbXM6IFNlc3Npb25VcGRhdGVTY2hlbWEsXG4gICAgcmVzdWx0OiBTZXNzaW9uU2NoZW1hLFxuICB9LFxuICBcInNlc3Npb24ubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfYXNjXCIsXG4gICAgICAgICAgXCJ1cGRhdGVkQXRfZGVzY1wiLFxuICAgICAgICBdKVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoU2Vzc2lvblNjaGVtYSksXG4gIH0sXG4gIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNhbmRib3hJZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5vcHRpb25hbCgpLFxuICAgICAgb3JkZXI6IHpcbiAgICAgICAgLmVudW0oW1xuICAgICAgICAgIFwiY3JlYXRlZEF0X2FzY1wiLFxuICAgICAgICAgIFwiY3JlYXRlZEF0X2Rlc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcInVwZGF0ZWRBdF9kZXNjXCIsXG4gICAgICAgIF0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShTZXNzaW9uU2NoZW1hKSxcbiAgfSxcbiAgXCJzZXNzaW9uLmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2Vzc2lvbi50YWcuc2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIHRhZ3M6IHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNlc3Npb25TY2hlbWEsXG4gIH0sXG4gIFwibWVzc2FnZS5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBpZDogei5zdHJpbmcoKSB9KSxcbiAgICByZXN1bHQ6IE1lc3NhZ2VTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJtZXNzYWdlLnNldFwiOiB7XG4gICAgcGFyYW1zOiBNZXNzYWdlU2NoZW1hLFxuICAgIHJlc3VsdDogTWVzc2FnZVNjaGVtYSxcbiAgfSxcbiAgXCJtZXNzYWdlLmxpc3RcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShNZXNzYWdlU2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZUlkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxuICAgICAgY3Vyc29yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBsaW1pdDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIHJlc3VsdDogTGlzdFJlc3VsdFNjaGVtYShQYXJ0U2NoZW1hKSxcbiAgfSxcbiAgXCJwYXJ0LnNldFwiOiB7XG4gICAgcGFyYW1zOiBQYXJ0U2NoZW1hLFxuICAgIHJlc3VsdDogUGFydFNjaGVtYSxcbiAgfSxcbiAgXCJwYXJ0LmRlbGV0ZVwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7IGlkOiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRcIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5nZXRCeVNlc3Npb25cIjoge1xuICAgIHBhcmFtczogei5vYmplY3QoeyBzZXNzaW9uSWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwic2FuZGJveC5zZXRcIjoge1xuICAgIHBhcmFtczogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICByZXN1bHQ6IHoudm9pZCgpLFxuICB9LFxuICBcInNhbmRib3gudXBkYXRlXCI6IHtcbiAgICBwYXJhbXM6IFNhbmRib3hVcGRhdGVTY2hlbWEsXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcInNhbmRib3gubGlzdFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkub3B0aW9uYWwoKSxcbiAgICAgIG9yZGVyOiB6XG4gICAgICAgIC5lbnVtKFtcbiAgICAgICAgICBcImNyZWF0ZWRBdF9hc2NcIixcbiAgICAgICAgICBcImNyZWF0ZWRBdF9kZXNjXCIsXG4gICAgICAgICAgXCJsYXN0QWN0aXZpdHlBdF9hc2NcIixcbiAgICAgICAgICBcImxhc3RBY3Rpdml0eUF0X2Rlc2NcIixcbiAgICAgICAgXSlcbiAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICBjdXJzb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGxpbWl0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBMaXN0UmVzdWx0U2NoZW1hKFNhbmRib3hSZWNvcmRTY2hlbWEpLFxuICB9LFxuICBcInNhbmRib3gudGFnLnNldFwiOiB7XG4gICAgcGFyYW1zOiB6Lm9iamVjdCh7XG4gICAgICBzYW5kYm94SWQ6IHouc3RyaW5nKCksXG4gICAgICB0YWdzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLFxuICB9LFxuICBcImNvbW1hbmQuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsgaWQ6IHouc3RyaW5nKCkgfSksXG4gICAgcmVzdWx0OiBDb21tYW5kU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG4gIFwiY29tbWFuZC5zZXRcIjoge1xuICAgIHBhcmFtczogQ29tbWFuZFNjaGVtYSxcbiAgICByZXN1bHQ6IENvbW1hbmRTY2hlbWEsXG4gIH0sXG4gIFwiY29tbWFuZC5saXN0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHNlc3Npb25JZDogei5zdHJpbmcoKSxcbiAgICAgIGluY2x1ZGVGaW5pc2hlZDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGN1cnNvcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbGltaXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IExpc3RSZXN1bHRTY2hlbWEoQ29tbWFuZFNjaGVtYSksXG4gIH0sXG4gIFwic2V0dXAuZ2V0XCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogU2V0dXBTbmFwc2hvdFNjaGVtYS5udWxsYWJsZSgpLFxuICB9LFxuICBcInNldHVwLnNldFwiOiB7XG4gICAgcGFyYW1zOiBTZXR1cFNuYXBzaG90U2NoZW1hLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2V0dXAuZGVsZXRlXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHsga2V5OiB6LnN0cmluZygpIH0pLFxuICAgIHJlc3VsdDogei52b2lkKCksXG4gIH0sXG4gIFwic2V0dXAuYWNxdWlyZUxvY2tcIjoge1xuICAgIHBhcmFtczogei5vYmplY3Qoe1xuICAgICAga2V5OiB6LnN0cmluZygpLFxuICAgICAgbG9ja0lkOiB6LnN0cmluZygpLFxuICAgICAgbG9ja1RpbWVvdXRNczogei5udW1iZXIoKSxcbiAgICB9KSxcbiAgICByZXN1bHQ6IFNldHVwU25hcHNob3RTY2hlbWEubnVsbGFibGUoKSxcbiAgfSxcbiAgXCJzYW5kYm94LmFjcXVpcmVMb2NrXCI6IHtcbiAgICBwYXJhbXM6IHoub2JqZWN0KHtcbiAgICAgIHJlY29yZDogU2FuZGJveFJlY29yZFNjaGVtYSxcbiAgICAgIGxvY2tUaW1lb3V0TXM6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgcmVzdWx0OiBTYW5kYm94UmVjb3JkU2NoZW1hLm51bGxhYmxlKCksXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgeyBtZXRob2RzIH07XG5leHBvcnQgdHlwZSBTdG9yYWdlTWV0aG9kcyA9IHR5cGVvZiBtZXRob2RzO1xuZXhwb3J0IHR5cGUgTWV0aG9kTmFtZSA9IGtleW9mIFN0b3JhZ2VNZXRob2RzO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfUlBDX01FVEhPRFMgPSBPYmplY3Qua2V5cyhtZXRob2RzKSBhcyBNZXRob2ROYW1lW107XG4iLCAiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgU3RvcmFnZUNvbmZsaWN0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB0eXBlIE1ldGhvZE5hbWUsIG1ldGhvZHMsIHR5cGUgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7XG4gIFtLIGluIE1ldGhvZE5hbWVdOiAoXG4gICAgcGFyYW1zOiB6LmluZmVyPFN0b3JhZ2VNZXRob2RzW0tdW1wicGFyYW1zXCJdPlxuICApID0+IFByb21pc2U8ei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tLXVtcInJlc3VsdFwiXT4+O1xufTtcblxuZXhwb3J0IHR5cGUgUnBjUmVxdWVzdCA9IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY1N1Y2Nlc3NSZXNwb25zZTxUID0gdW5rbm93bj4gPSB7XG4gIHJlc3VsdDogVDtcbn07XG5cbmV4cG9ydCB0eXBlIFJwY0Vycm9yUmVzcG9uc2UgPSB7XG4gIGVycm9yOiB7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG59O1xuXG5leHBvcnQgdHlwZSBScGNSZXNwb25zZTxUID0gdW5rbm93bj4gPSBScGNTdWNjZXNzUmVzcG9uc2U8VD4gfCBScGNFcnJvclJlc3BvbnNlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RvcmFnZVJwYyhcbiAgYm9keTogUnBjUmVxdWVzdCxcbiAgaGFuZGxlcnM6IEhhbmRsZXJzXG4pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHsgbWV0aG9kLCBwYXJhbXMgfSA9IGJvZHk7XG5cbiAgaWYgKCEobWV0aG9kIGluIG1ldGhvZHMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6IFwiTUVUSE9EX05PVF9GT1VORFwiLCBtZXNzYWdlOiBgVW5rbm93biBtZXRob2Q6ICR7bWV0aG9kfWAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbWV0aG9kTmFtZSA9IG1ldGhvZCBhcyBNZXRob2ROYW1lO1xuICBjb25zdCBzY2hlbWEgPSBtZXRob2RzW21ldGhvZE5hbWVdLnBhcmFtcztcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShwYXJhbXMpO1xuXG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJJTlZBTElEX1BBUkFNU1wiLFxuICAgICAgICBtZXNzYWdlOiBwYXJzZWQuZXJyb3IuaXNzdWVzXG4gICAgICAgICAgLm1hcCgoaSkgPT4gYCR7aS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpLm1lc3NhZ2V9YClcbiAgICAgICAgICAuam9pbihcIiwgXCIpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbbWV0aG9kTmFtZV0gYXMgKFxuICAgICAgcGFyYW1zOiB1bmtub3duXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocGFyc2VkLmRhdGEpO1xuICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgaXNDb25mbGljdCA9XG4gICAgICBlIGluc3RhbmNlb2YgU3RvcmFnZUNvbmZsaWN0RXJyb3IgfHxcbiAgICAgIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSBcIlN0b3JhZ2VDb25mbGljdEVycm9yXCIpO1xuXG4gICAgaWYgKGlzQ29uZmxpY3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgY29kZTogXCJDT05GTElDVFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIklOVEVSTkFMX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCB7XG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgUnBjRm4sXG59IGZyb20gXCIuL2NsaWVudFwiO1xuZXhwb3J0IHtcbiAgdHlwZSBIYW5kbGVycyxcbiAgaGFuZGxlU3RvcmFnZVJwYyxcbiAgdHlwZSBScGNFcnJvclJlc3BvbnNlLFxuICB0eXBlIFJwY1JlcXVlc3QsXG4gIHR5cGUgUnBjUmVzcG9uc2UsXG4gIHR5cGUgUnBjU3VjY2Vzc1Jlc3BvbnNlLFxufSBmcm9tIFwiLi9oYW5kbGVyXCI7XG5leHBvcnQge1xuICB0eXBlIE1lc3NhZ2VVc2FnZSxcbiAgdHlwZSBNZXRob2ROYW1lLFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIFNUT1JBR0VfUlBDX01FVEhPRFMsXG4gIHR5cGUgU3RlcFVzYWdlLFxuICB0eXBlIFN0b3JhZ2VNZXRob2RzLFxuICB0eXBlIFVzYWdlU3VtbWFyeSxcbn0gZnJvbSBcIi4vcnBjXCI7XG5leHBvcnQgdHlwZSB7XG4gIENvbW1hbmQsXG4gIExpc3RSZXN1bHQsXG4gIE1lc3NhZ2UsXG4gIFBhcnQsXG4gIFJlc29sdmVkU3RvcmFnZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU2V0dXBTbmFwc2hvdCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbiAgVHlwZWRTZXNzaW9uLFxuICBUeXBlZFN0b3JhZ2UsXG59IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjaGVja0FuZFNuYXBzaG90U3RlcCB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiO1xuXG5leHBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9O1xuXG5jb25zdCBERUZBVUxUX1BPTExfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgbGV0IG5leHRQb2xsTXMgPSBERUZBVUxUX1BPTExfTVM7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBhd2FpdCBzbGVlcChuZXh0UG9sbE1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrQW5kU25hcHNob3RTdGVwKGlucHV0KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciB8fCByZXN1bHQuYWN0aW9uID09PSBcImV4aXRcIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dFBvbGxNcyA9IHJlc3VsdC5uZXh0UG9sbE1zO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kU25hcHNob3RTdGVwKFxuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0XG4pOiBQcm9taXNlPEVycm9yIHwgTGlmZWN5Y2xlU3RlcFJlc3VsdD4ge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBTYW5kYm94OiBWZXJjZWxTYW5kYm94U0RLIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3ZlcmNlbC1zZGtcIik7XG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vc3RvcmFnZVwiKTtcbiAgaWYgKCFpbnB1dC5ycGMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSUEMgbm90IGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjOiBpbnB1dC5ycGMsXG4gIH0pO1xuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2FuZGJveElkID1cbiAgICByZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICA6IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHJlY29yZC5jb25maWc7XG4gIGlmIChjb25maWcudHlwZSAhPT0gXCJ2ZXJjZWxcIikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsTXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgY29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90QmVmb3JlVGltZW91dE1zID8/IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGxhc3RBY3Rpdml0eSA9IHJlY29yZC5sYXN0QWN0aXZpdHlBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBpZiAoc2hvdWxkU25hcHNob3REdWVUb0lkbGUgfHwgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3gudXBkYXRlKHtcbiAgICAgICAgaWQ6IHJlY29yZC5pZCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm92aWRlcjogXCJ2ZXJjZWxcIixcbiAgICAgICAgICBzYW5kYm94SWQ6IG51bGwsXG4gICAgICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlIDogbmV3IEVycm9yKFN0cmluZyhlKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZXhpdFwiLFxuICAgICAgcmVhc29uOiBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA/IFwiaWRsZVwiIDogXCJ0aW1lb3V0XCIsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUF3QjtBQUFBO0FBQUE7OztBQ0F4QixZQUVhLHNCQUtBLGNBS0Esc0JBS0EsY0FLQSxzQkFLQSxjQUtBO0FBaENiO0FBQUE7QUFBQTtBQUFBLGFBQXdCO0FBRWpCLElBQU0sdUJBQU4sY0FBMEMseUJBQWtCO0FBQUEsTUFDakUsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1gsQ0FBQyxFQUFFO0FBQUEsSUFBQztBQUVHLElBQU0sZUFBTixjQUFrQyx5QkFBa0I7QUFBQSxNQUN6RCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSx1QkFBTixjQUEwQyx5QkFBa0I7QUFBQSxNQUNqRSxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDLEVBQUU7QUFBQSxJQUFDO0FBRUcsSUFBTSxlQUFOLGNBQWtDLHlCQUFrQjtBQUFBLE1BQ3pELE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYLENBQUMsRUFBRTtBQUFBLElBQUM7QUFFRyxJQUFNLHVCQUFOLGNBQTBDLHlCQUFrQjtBQUFBLE1BQ2pFLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYLENB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
|
|
302
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLWxpZmVjeWNsZS93b3JrZmxvdy50cyIsICIuLi9zcmMvdXRpbHMvbG9nZ2VyLnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL3ZlcmNlbC1saWZlY3ljbGUvc3RlcHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIndvcmtmbG93XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBjaGVja0FuZFNuYXBzaG90U3RlcCwgdHlwZSBMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuL3N0ZXBzXCI7XG5cbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlSW5wdXQgfTtcblxuY29uc3QgREVGQVVMVF9QT0xMX01TID0gMiAqIDYwICogMTAwMDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhbmRib3hMaWZlY3ljbGVXb3JrZmxvdyh7XG4gIGlucHV0LFxufToge1xuICBpbnB1dDogTGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgbGV0IG5leHRQb2xsTXMgPSBpbnB1dC5jb25maWc/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9NUztcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKHtcbiAgICBjb25maWc6IHsgLi4uaW5wdXQuYWdlbnQub3B0aW9ucy5sb2dnaW5nLCBuYW1lOiBpbnB1dC5hZ2VudC5uYW1lIH0sXG4gICAgc3Vic3lzdGVtOiBcInNhbmRib3g6bGlmZWN5Y2xlXCIsXG4gICAgY29udGV4dDogeyBzYW5kYm94SWQ6IGlucHV0LnNhbmRib3hJZCB9LFxuICB9KTtcblxuICBsb2cuaW5mbyhcImxpZmVjeWNsZSB3b3JrZmxvdyBzdGFydGVkXCIsIHtcbiAgICBzYW5kYm94SWQ6IGlucHV0LnNhbmRib3hJZCxcbiAgICB2ZXJjZWxTYW5kYm94SWQ6IGlucHV0LnZlcmNlbFNhbmRib3hJZCxcbiAgICBwb2xsTXM6IG5leHRQb2xsTXMsXG4gIH0pO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgYXdhaXQgc2xlZXAobmV4dFBvbGxNcyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjaGVja0FuZFNuYXBzaG90U3RlcChpbnB1dCk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGxvZy5lcnJvcihcImxpZmVjeWNsZSBzdGVwIGZhaWxlZFwiLCB7XG4gICAgICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuYWN0aW9uID09PSBcImV4aXRcIikge1xuICAgICAgbG9nLmluZm8oXCJsaWZlY3ljbGUgd29ya2Zsb3cgZXhpdGluZ1wiLCB7XG4gICAgICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgICAgICByZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5leHRQb2xsTXMgPSByZXN1bHQubmV4dFBvbGxNcztcbiAgfVxufVxuIiwgImV4cG9ydCB0eXBlIExvZ0xldmVsID0gXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIiB8IFwic2lsZW50XCI7XG5cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBpbmZvOiAwLFxuICB3YXJuOiAxLFxuICBlcnJvcjogMixcbiAgc2lsZW50OiAzLFxufTtcblxuZXhwb3J0IHR5cGUgTG9nQ29udGV4dCA9IHtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBtZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIHNhbmRib3hJZD86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIExvZ2dpbmdDb25maWcgPSB7XG4gIGxldmVsPzogTG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBUb3AtbGV2ZWwgbGFiZWwgZm9yIGFsbCBsb2cgbGluZXMuXG4gICAqIEBkZWZhdWx0IFwiYWdlbnRcIlxuICAgKiBAZXhhbXBsZSBcIm15LWFwcFwiIFx1MjE5MiBbbXktYXBwOmRlZmF1bHQ6d29ya2Zsb3ddXG4gICAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBnZXRMZXZlbChjb25maWc6IExvZ2dpbmdDb25maWcpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBjb25maWcubGV2ZWwgPz8gXCJ3YXJuXCI7XG59XG5cbmZ1bmN0aW9uIGdldFByZWZpeChjb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLnByZWZpeCA/PyBcImFnZW50XCI7XG59XG5cbmZ1bmN0aW9uIHNob3VsZExvZyhjb25maWc6IExvZ2dpbmdDb25maWcsIGxldmVsOiBMb2dMZXZlbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbZ2V0TGV2ZWwoY29uZmlnKV07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRhZyhjb25maWc6IExvZ2dpbmdDb25maWcsIHN1YnN5c3RlbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbJHtnZXRQcmVmaXgoY29uZmlnKX06JHtjb25maWcubmFtZX06JHtzdWJzeXN0ZW19XWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGEoXG4gIGNvbnRleHQ6IExvZ0NvbnRleHQsXG4gIGV4dHJhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVyZ2VkID0geyAuLi5jb250ZXh0LCAuLi5leHRyYSB9O1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobWVyZ2VkKS5maWx0ZXIoXG4gICAgKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbFxuICApO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICByZWFkb25seSBzdWJzeXN0ZW06IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IExvZ2dpbmdDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogTG9nQ29udGV4dDtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgc3Vic3lzdGVtLFxuICAgIGNvbmZpZyxcbiAgICBjb250ZXh0LFxuICB9OiB7XG4gICAgc3Vic3lzdGVtOiBzdHJpbmc7XG4gICAgY29uZmlnOiBMb2dnaW5nQ29uZmlnO1xuICAgIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xuICB9KSB7XG4gICAgdGhpcy5zdWJzeXN0ZW0gPSBzdWJzeXN0ZW07XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCA/PyB7fTtcbiAgfVxuXG4gIGNoaWxkKHtcbiAgICBzdWJzeXN0ZW0sXG4gICAgY29udGV4dCxcbiAgfToge1xuICAgIHN1YnN5c3RlbT86IHN0cmluZztcbiAgICBjb250ZXh0PzogTG9nQ29udGV4dDtcbiAgfSk6IExvZ2dlciB7XG4gICAgcmV0dXJuIG5ldyBMb2dnZXIoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHN1YnN5c3RlbTogc3Vic3lzdGVtID8gYCR7dGhpcy5zdWJzeXN0ZW19OiR7c3Vic3lzdGVtfWAgOiB0aGlzLnN1YnN5c3RlbSxcbiAgICAgIGNvbnRleHQ6IHsgLi4udGhpcy5jb250ZXh0LCAuLi5jb250ZXh0IH0sXG4gICAgfSk7XG4gIH1cblxuICB3aXRoQ29udGV4dChjb250ZXh0OiBMb2dDb250ZXh0KTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3Vic3lzdGVtOiB0aGlzLnN1YnN5c3RlbSxcbiAgICAgIGNvbnRleHQ6IHsgLi4udGhpcy5jb250ZXh0LCAuLi5jb250ZXh0IH0sXG4gICAgfSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCFzaG91bGRMb2codGhpcy5jb25maWcsIFwiaW5mb1wiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gZm9ybWF0RGF0YSh0aGlzLmNvbnRleHQsIGRhdGEpO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UsIGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmluZm8oZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJ3YXJuXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSwgZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2Fybihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJlcnJvclwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gZm9ybWF0RGF0YSh0aGlzLmNvbnRleHQsIGRhdGEpO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlLCBkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgbG9ncyB0aGUgZWxhcHNlZCB0aW1lIGF0IGluZm8gbGV2ZWwuXG4gICAqIFBhc3MgYGxvZ09uU3RhcnQ6IHRydWVgIHRvIGFsc28gbG9nIHdoZW4gdGhlIHRpbWVyIGJlZ2lucy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZG9uZSA9IGxvZy50aW1lKFwic2FuZGJveCBzZXR1cFwiLCB7IHNhbmRib3hJZCB9LCB7IGxvZ09uU3RhcnQ6IHRydWUgfSk7XG4gICAqIGF3YWl0IHNldHVwKCk7XG4gICAqIGRvbmUoKTsgLy8gc3RhcnQ6IFthZ2VudDpkZWZhdWx0OnNhbmRib3hdIHNhbmRib3ggc2V0dXAgeyBzYW5kYm94SWQ6ICcuLi4nIH1cbiAgICogICAgICAgICAvLyBlbmQ6ICAgW2FnZW50OmRlZmF1bHQ6c2FuZGJveF0gc2FuZGJveCBzZXR1cCB7IHNhbmRib3hJZDogJy4uLicsIGR1cmF0aW9uTXM6IDEyMyB9XG4gICAqL1xuICB0aW1lKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgb3B0cz86IHsgbG9nT25TdGFydD86IGJvb2xlYW4gfVxuICApOiAoZW5kRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHtcbiAgICBpZiAob3B0cz8ubG9nT25TdGFydCkge1xuICAgICAgdGhpcy5pbmZvKGBbc3RhcnRdICR7bWVzc2FnZX1gLCBkYXRhKTtcbiAgICB9XG4gICAgY29uc3QgdDAgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiAoZW5kRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICB0aGlzLmluZm8ob3B0cz8ubG9nT25TdGFydCA/IGBbZW5kXSAke21lc3NhZ2V9YCA6IG1lc3NhZ2UsIHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uZW5kRGF0YSxcbiAgICAgICAgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHQwLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKHtcbiAgY29uZmlnLFxuICBzdWJzeXN0ZW0sXG4gIGNvbnRleHQsXG59OiB7XG4gIGNvbmZpZzogTG9nZ2luZ0NvbmZpZztcbiAgc3Vic3lzdGVtOiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xufSk6IExvZ2dlciB7XG4gIHJldHVybiBuZXcgTG9nZ2VyKHsgY29uZmlnLCBzdWJzeXN0ZW0sIGNvbnRleHQgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94IGFzIFZlcmNlbFNhbmRib3hTREsgfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hBZ2VudFJlZiB9IGZyb20gXCIuLi8uLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB9IGZyb20gXCIuLi92ZXJjZWxcIjtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNhbmRib3hTREsoKTogUHJvbWlzZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESz4ge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKSkuU2FuZGJveDtcbn1cblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlQ29uZmlnID0ge1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc3RvcEFmdGVySW5hY3RpdmVNcz86IG51bWJlcjtcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVJbnB1dCA9IHtcbiAgYWdlbnQ6IFNhbmRib3hBZ2VudFJlZjtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIHZlcmNlbFNhbmRib3hJZDogc3RyaW5nO1xuICBjb25maWc/OiBMaWZlY3ljbGVDb25maWc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRTbmFwc2hvdFN0ZXAoXG4gIGlucHV0OiBMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHN0b3JhZ2UgPSBpbnB1dC5hZ2VudC5zdG9yYWdlO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5pbnB1dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGlucHV0LmFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpsaWZlY3ljbGVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGxvZy5pbmZvKFwibGlmZWN5Y2xlIGNoZWNrIHN0YXJ0ZWRcIiwge1xuICAgIHZlcmNlbFNhbmRib3hJZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICB9KTtcblxuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LnNhbmRib3hJZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgbG9nLndhcm4oXCJzYW5kYm94IHJlY29yZCBub3QgZm91bmQsIGV4aXRpbmcgbGlmZWN5Y2xlXCIpO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGEgPSByZWNvcmQuc2V0dXA/Lm1ldGFkYXRhIGFzIFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB8IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRTYW5kYm94SWQgPSBtZXRhZGF0YT8uc2FuZGJveElkID8/IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIGxvZy5pbmZvKFwic2FuZGJveCBJRCBjaGFuZ2VkLCBleGl0aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgICBleHBlY3RlZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICAgICAgYWN0dWFsOiBjdXJyZW50U2FuZGJveElkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICBsb2cud2FybihcIm5vIGN1cnJlbnQgc2FuZGJveCBJRCBpbiBtZXRhZGF0YSwgZXhpdGluZyBsaWZlY3ljbGVcIik7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9XG4gICAgaW5wdXQuY29uZmlnPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPz8gU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVM7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgbGFzdEFjdGl2aXR5ID0gcmVjb3JkLmxhc3RBY3RpdmVBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgbG9nLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHNhbmRib3ggZnJvbSBTREssIGV4aXRpbmcgbGlmZWN5Y2xlXCIsIHtcbiAgICAgIHZlcmNlbFNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGlmIChzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSB8fCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCkge1xuICAgIGNvbnN0IHJlYXNvbiA9IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIjtcbiAgICBsb2cuaW5mbyhcInNuYXBzaG90dGluZyBzYW5kYm94IGJlZm9yZSBleGl0XCIsIHtcbiAgICAgIHJlYXNvbixcbiAgICAgIGlkbGVEdXJhdGlvbk1zOiBpZGxlRHVyYXRpb24sXG4gICAgICB2ZXJjZWxTYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHNhbmRib3guc25hcHNob3QoKTtcbiAgICAgIGxvZy5pbmZvKFwic25hcHNob3QgY3JlYXRlZFwiLCB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfSk7XG5cbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoaW5wdXQuc2FuZGJveElkLCB7XG4gICAgICAgIHNldHVwOiB7XG4gICAgICAgICAgLi4ucmVjb3JkLnNldHVwLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogbnVsbCwgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBsb2cuaW5mbyhcInNhbmRib3ggcmVjb3JkIHVwZGF0ZWQgd2l0aCBzbmFwc2hvdFwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gc25hcHNob3Qgc2FuZGJveFwiLCB7IGNhdXNlOiBlIH0pO1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uIH07XG4gIH1cblxuICBsb2cuaW5mbyhcInNhbmRib3ggc3RpbGwgYWN0aXZlLCBjb250aW51aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgaWRsZUR1cmF0aW9uTXM6IGlkbGVEdXJhdGlvbixcbiAgICBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyxcbiAgfSk7XG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUFzQjs7O0FDRXRCLElBQU0scUJBQStDO0FBQUEsRUFDbkQsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUNWO0FBb0JBLFNBQVMsU0FBUyxRQUFpQztBQUNqRCxTQUFPLE9BQU8sU0FBUztBQUN6QjtBQUVBLFNBQVMsVUFBVSxRQUErQjtBQUNoRCxTQUFPLE9BQU8sVUFBVTtBQUMxQjtBQUVBLFNBQVMsVUFBVSxRQUF1QixPQUEwQjtBQUNsRSxTQUFPLG1CQUFtQixLQUFLLEtBQUssbUJBQW1CLFNBQVMsTUFBTSxDQUFDO0FBQ3pFO0FBRUEsU0FBUyxVQUFVLFFBQXVCLFdBQTJCO0FBQ25FLFNBQU8sSUFBSSxVQUFVLE1BQU0sQ0FBQyxJQUFJLE9BQU8sSUFBSSxJQUFJLFNBQVM7QUFDMUQ7QUFFQSxTQUFTLFdBQ1AsU0FDQSxPQUNxQztBQUNyQyxRQUFNLFNBQVMsRUFBRSxHQUFHLFNBQVMsR0FBRyxNQUFNO0FBQ3RDLFFBQU0sVUFBVSxPQUFPLFFBQVEsTUFBTSxFQUFFO0FBQUEsSUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLE1BQU0sVUFBYSxNQUFNO0FBQUEsRUFDdEM7QUFDQSxNQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxPQUFPLFlBQVksT0FBTztBQUNuQztBQUVPLElBQU0sU0FBTixNQUFNLFFBQU87QUFBQSxFQUNUO0FBQUEsRUFDUTtBQUFBLEVBQ0E7QUFBQSxFQUVqQixZQUFZO0FBQUEsSUFDVjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixHQUlHO0FBQ0QsU0FBSyxZQUFZO0FBQ2pCLFNBQUssU0FBUztBQUNkLFNBQUssVUFBVSxXQUFXLENBQUM7QUFBQSxFQUM3QjtBQUFBLEVBRUEsTUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDRixHQUdXO0FBQ1QsV0FBTyxJQUFJLFFBQU87QUFBQSxNQUNoQixRQUFRLEtBQUs7QUFBQSxNQUNiLFdBQVcsWUFBWSxHQUFHLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQUEsTUFDL0QsU0FBUyxFQUFFLEdBQUcsS0FBSyxTQUFTLEdBQUcsUUFBUTtBQUFBLElBQ3pDLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxZQUFZLFNBQTZCO0FBQ3ZDLFdBQU8sSUFBSSxRQUFPO0FBQUEsTUFDaEIsUUFBUSxLQUFLO0FBQUEsTUFDYixXQUFXLEtBQUs7QUFBQSxNQUNoQixTQUFTLEVBQUUsR0FBRyxLQUFLLFNBQVMsR0FBRyxRQUFRO0FBQUEsSUFDekMsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLEtBQUssU0FBaUIsTUFBc0M7QUFDMUQsUUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLE1BQU0sR0FBRztBQUNuQztBQUFBLElBQ0Y7QUFDQSxVQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSTtBQUN2QyxRQUFJLEdBQUc7QUFDTCxjQUFRLEtBQUssVUFBVSxLQUFLLFFBQVEsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQUEsSUFDakUsT0FBTztBQUNMLGNBQVEsS0FBSyxVQUFVLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRyxPQUFPO0FBQUEsSUFDOUQ7QUFBQSxFQUNGO0FBQUEsRUFFQSxLQUFLLFNBQWlCLE1BQXNDO0FBQzFELFFBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxNQUFNLEdBQUc7QUFDbkM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUk7QUFDdkMsUUFBSSxHQUFHO0FBQ0wsY0FBUSxLQUFLLFVBQVUsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUFBLElBQ2pFLE9BQU87QUFDTCxjQUFRLEtBQUssVUFBVSxLQUFLLFFBQVEsS0FBSyxTQUFTLEdBQUcsT0FBTztBQUFBLElBQzlEO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBTSxTQUFpQixNQUFzQztBQUMzRCxRQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsT0FBTyxHQUFHO0FBQ3BDO0FBQUEsSUFDRjtBQUNBLFVBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJO0FBQ3ZDLFFBQUksR0FBRztBQUNMLGNBQVEsTUFBTSxVQUFVLEtBQUssUUFBUSxLQUFLLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFBQSxJQUNsRSxPQUFPO0FBQ0wsY0FBUSxNQUFNLFVBQVUsS0FBSyxRQUFRLEtBQUssU0FBUyxHQUFHLE9BQU87QUFBQSxJQUMvRDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsS0FDRSxTQUNBLE1BQ0EsTUFDNkM7QUFDN0MsUUFBSSxNQUFNLFlBQVk7QUFDcEIsV0FBSyxLQUFLLFdBQVcsT0FBTyxJQUFJLElBQUk7QUFBQSxJQUN0QztBQUNBLFVBQU0sS0FBSyxLQUFLLElBQUk7QUFDcEIsV0FBTyxDQUFDLFlBQXNDO0FBQzVDLFdBQUssS0FBSyxNQUFNLGFBQWEsU0FBUyxPQUFPLEtBQUssU0FBUztBQUFBLFFBQ3pELEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQSxRQUNILFlBQVksS0FBSyxJQUFJLElBQUk7QUFBQSxNQUMzQixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjtBQUVPLFNBQVMsYUFBYTtBQUFBLEVBQzNCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUlXO0FBQ1QsU0FBTyxJQUFJLE9BQU8sRUFBRSxRQUFRLFdBQVcsUUFBUSxDQUFDO0FBQ2xEOzs7QUN4S0EsZUFBZSxpQkFBbUQ7QUFDaEUsVUFBUSxNQUFNLE9BQU8saUJBQWlCLEdBQUc7QUFDM0M7QUFFQSxJQUFNLDJCQUEyQixJQUFJLEtBQUs7QUFDMUMsSUFBTSwwQkFBMEIsSUFBSSxLQUFLO0FBQ3pDLElBQU0sNkJBQTZCLEtBQUssS0FBSztBQUU3QyxJQUFNLHFCQUFxQixNQUN6QixRQUFRLElBQUksYUFBYSxTQUNyQjtBQUFBLEVBQ0UsT0FBTyxRQUFRLElBQUk7QUFBQSxFQUNuQixRQUFRLFFBQVEsSUFBSTtBQUFBLEVBQ3BCLFdBQVcsUUFBUSxJQUFJO0FBQ3pCLElBQ0EsQ0FBQztBQXNCUCxlQUFzQixxQkFDcEIsT0FDc0M7QUFDdEM7QUFFQSxRQUFNLFVBQVUsTUFBTSxNQUFNO0FBQzVCLFFBQU0sTUFBTSxhQUFhO0FBQUEsSUFDdkIsUUFBUSxFQUFFLEdBQUcsTUFBTSxNQUFNLFFBQVEsU0FBUyxNQUFNLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDakUsV0FBVztBQUFBLElBQ1gsU0FBUyxFQUFFLFdBQVcsTUFBTSxVQUFVO0FBQUEsRUFDeEMsQ0FBQztBQUVELE1BQUksS0FBSywyQkFBMkI7QUFBQSxJQUNsQyxpQkFBaUIsTUFBTTtBQUFBLEVBQ3pCLENBQUM7QUFFRCxRQUFNLFNBQVMsTUFBTSxRQUFRLFFBQVEsSUFBSSxNQUFNLFNBQVM7QUFDeEQsTUFBSSxDQUFDLFFBQVE7QUFDWCxRQUFJLEtBQUssNkNBQTZDO0FBQ3RELFdBQU8sRUFBRSxRQUFRLFFBQVEsUUFBUSxZQUFZO0FBQUEsRUFDL0M7QUFFQSxRQUFNLFdBQVcsT0FBTyxPQUFPO0FBQy9CLFFBQU0sbUJBQW1CLFVBQVUsYUFBYTtBQUVoRCxNQUFJLHFCQUFxQixNQUFNLGlCQUFpQjtBQUM5QyxRQUFJLEtBQUsseUNBQXlDO0FBQUEsTUFDaEQsVUFBVSxNQUFNO0FBQUEsTUFDaEIsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUNELFdBQU8sRUFBRSxRQUFRLFFBQVEsUUFBUSxvQkFBb0I7QUFBQSxFQUN2RDtBQUVBLE1BQUksQ0FBQyxrQkFBa0I7QUFDckIsUUFBSSxLQUFLLHNEQUFzRDtBQUMvRCxXQUFPLEVBQUUsUUFBUSxRQUFRLFFBQVEsWUFBWTtBQUFBLEVBQy9DO0FBRUEsUUFBTSxpQkFDSixNQUFNLFFBQVEsa0JBQWtCO0FBQ2xDLFFBQU0sZ0JBQ0osTUFBTSxRQUFRLHVCQUF1QjtBQUN2QyxRQUFNLDBCQUNKLE1BQU0sUUFBUSwyQkFBMkI7QUFFM0MsUUFBTSxNQUFNLEtBQUssSUFBSTtBQUNyQixRQUFNLGVBQWUsT0FBTyxnQkFBZ0IsT0FBTyxhQUFhO0FBQ2hFLFFBQU0sZUFBZSxNQUFNO0FBQzNCLFFBQU0sMEJBQTBCLGVBQWU7QUFFL0MsTUFBSSw2QkFBNkI7QUFDakMsTUFBSTtBQUNGLFVBQU0sYUFBYSxNQUFNLGVBQWU7QUFDeEMsVUFBTSxVQUFVLE1BQU0sV0FBVyxJQUFJO0FBQUEsTUFDbkMsV0FBVztBQUFBLE1BQ1gsR0FBRyxtQkFBbUI7QUFBQSxJQUN4QixDQUFDO0FBQ0QsUUFBSSxRQUFRLFVBQVUseUJBQXlCO0FBQzdDLG1DQUE2QjtBQUFBLElBQy9CO0FBQUEsRUFDRixRQUFRO0FBQ04sUUFBSSxLQUFLLHFEQUFxRDtBQUFBLE1BQzVELGlCQUFpQjtBQUFBLElBQ25CLENBQUM7QUFDRCxXQUFPLEVBQUUsUUFBUSxRQUFRLFFBQVEsWUFBWTtBQUFBLEVBQy9DO0FBRUEsTUFBSSwyQkFBMkIsNEJBQTRCO0FBQ3pELFVBQU0sU0FBUywwQkFBMEIsU0FBUztBQUNsRCxRQUFJLEtBQUssb0NBQW9DO0FBQUEsTUFDM0M7QUFBQSxNQUNBLGdCQUFnQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLElBQ25CLENBQUM7QUFFRCxRQUFJO0FBQ0YsWUFBTSxhQUFhLE1BQU0sZUFBZTtBQUN4QyxZQUFNLFVBQVUsTUFBTSxXQUFXLElBQUk7QUFBQSxRQUNuQyxXQUFXO0FBQUEsUUFDWCxHQUFHLG1CQUFtQjtBQUFBLE1BQ3hCLENBQUM7QUFDRCxZQUFNLFdBQVcsTUFBTSxRQUFRLFNBQVM7QUFDeEMsVUFBSSxLQUFLLG9CQUFvQixFQUFFLFlBQVksU0FBUyxXQUFXLENBQUM7QUFFaEUsWUFBTSxRQUFRLFFBQVEsT0FBTyxNQUFNLFdBQVc7QUFBQSxRQUM1QyxPQUFPO0FBQUEsVUFDTCxHQUFHLE9BQU87QUFBQSxVQUNWLFVBQVUsRUFBRSxXQUFXLE1BQU0sWUFBWSxTQUFTLFdBQVc7QUFBQSxRQUMvRDtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksS0FBSyxzQ0FBc0M7QUFBQSxJQUNqRCxTQUFTLEdBQUc7QUFDVixVQUFJLE1BQU0sOEJBQThCLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDcEQsYUFBTyxhQUFhLFFBQVEsSUFBSSxJQUFJLE1BQU0sT0FBTyxDQUFDLENBQUM7QUFBQSxJQUNyRDtBQUNBLFdBQU8sRUFBRSxRQUFRLFFBQVEsT0FBTztBQUFBLEVBQ2xDO0FBRUEsTUFBSSxLQUFLLDhDQUE4QztBQUFBLElBQ3JELGdCQUFnQjtBQUFBLElBQ2hCLFlBQVk7QUFBQSxFQUNkLENBQUM7QUFDRCxTQUFPLEVBQUUsUUFBUSxZQUFZLFlBQVksZUFBZTtBQUMxRDs7O0FGM0lBLElBQU0sa0JBQWtCLElBQUksS0FBSztBQUVqQyxlQUFzQix5QkFBeUI7QUFBQSxFQUM3QztBQUNGLEdBRUc7QUFDRDtBQUVBLE1BQUksYUFBYSxNQUFNLFFBQVEsa0JBQWtCO0FBQ2pELFFBQU0sTUFBTSxhQUFhO0FBQUEsSUFDdkIsUUFBUSxFQUFFLEdBQUcsTUFBTSxNQUFNLFFBQVEsU0FBUyxNQUFNLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDakUsV0FBVztBQUFBLElBQ1gsU0FBUyxFQUFFLFdBQVcsTUFBTSxVQUFVO0FBQUEsRUFDeEMsQ0FBQztBQUVELE1BQUksS0FBSyw4QkFBOEI7QUFBQSxJQUNyQyxXQUFXLE1BQU07QUFBQSxJQUNqQixpQkFBaUIsTUFBTTtBQUFBLElBQ3ZCLFFBQVE7QUFBQSxFQUNWLENBQUM7QUFFRCxTQUFPLE1BQU07QUFDWCxjQUFNLHVCQUFNLFVBQVU7QUFFdEIsVUFBTSxTQUFTLE1BQU0scUJBQXFCLEtBQUs7QUFFL0MsUUFBSSxrQkFBa0IsT0FBTztBQUMzQixVQUFJLE1BQU0seUJBQXlCO0FBQUEsUUFDakMsV0FBVyxNQUFNO0FBQUEsUUFDakIsT0FBTyxPQUFPO0FBQUEsTUFDaEIsQ0FBQztBQUNEO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxXQUFXLFFBQVE7QUFDNUIsVUFBSSxLQUFLLDhCQUE4QjtBQUFBLFFBQ3JDLFdBQVcsTUFBTTtBQUFBLFFBQ2pCLFFBQVEsT0FBTztBQUFBLE1BQ2pCLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxpQkFBYSxPQUFPO0FBQUEsRUFDdEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|