experimental-agent 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapter-Cl735Kp4.d.mts → adapter-DmlMKodR.d.mts} +1 -0
- package/dist/{adapter-Cl735Kp4.d.ts → adapter-DmlMKodR.d.ts} +1 -0
- package/dist/{chunk-AB2JYY6A.mjs → chunk-355UN6NT.mjs} +10 -2
- package/dist/chunk-CS2SEUAA.mjs +405 -0
- package/dist/chunk-LZOMFHX3.mjs +38 -0
- package/dist/chunk-PH2FXKOU.mjs +9 -0
- package/dist/client-Cd-79N5B.d.ts +494 -0
- package/dist/client-panIugEx.d.mts +494 -0
- package/dist/client.mjs +1 -1
- package/dist/{docker-OBUQX5ZI.mjs → docker-FCSNVBEQ.mjs} +1 -1
- package/dist/{entry-Bs17QEiq.d.mts → entry-CciSxlDK.d.mts} +1 -1
- package/dist/{entry-QNyd4S1s.d.ts → entry-MCzvxs7U.d.ts} +1 -1
- package/dist/index.d.mts +475 -475
- package/dist/index.d.ts +475 -475
- package/dist/index.js +16539 -186
- package/dist/index.mjs +16335 -43
- package/dist/lifecycle-workflow-steps.d.mts +2 -2
- package/dist/lifecycle-workflow-steps.d.ts +2 -2
- package/dist/lifecycle-workflow-steps.mjs +1 -1
- package/dist/lifecycle-workflow.d.mts +2 -2
- package/dist/lifecycle-workflow.d.ts +2 -2
- package/dist/lifecycle-workflow.mjs +1 -1
- package/dist/{local-4C3V4EFS.mjs → local-NXHIUJTO.mjs} +1 -1
- package/dist/next/loader.js +10 -2
- package/dist/next/loader.mjs +2 -2
- package/dist/next.js +10 -2
- package/dist/next.mjs +2 -2
- package/dist/{process-manager-WQHAIVRB.mjs → process-manager-26NELLRU.mjs} +1 -1
- package/dist/react.d.mts +56 -0
- package/dist/react.d.ts +56 -0
- package/dist/react.js +144 -0
- package/dist/react.mjs +117 -0
- package/dist/sandbox.d.mts +3 -3
- package/dist/sandbox.d.ts +3 -3
- package/dist/sandbox.mjs +1 -1
- package/dist/{steps-eTytqxQb.d.mts → steps-DWQYXexO.d.mts} +2 -2
- package/dist/{steps-XA4wG8W3.d.ts → steps-DnvPkAtl.d.ts} +2 -2
- package/dist/storage.d.mts +2 -2
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +107 -48
- package/dist/storage.mjs +2 -2
- package/dist/{vercel-6ORAC625.mjs → vercel-LJEWLD4T.mjs} +1 -1
- package/package.json +9 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -11
- package/dist/chunk-I5DCB7RU.mjs +0 -346
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// package.json
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "experimental-agent",
|
|
4
|
-
version: "0.
|
|
4
|
+
version: "0.6.0",
|
|
5
5
|
main: "./dist/index.js",
|
|
6
6
|
module: "./dist/index.mjs",
|
|
7
7
|
types: "./dist/index.d.ts",
|
|
@@ -50,6 +50,11 @@ var package_default = {
|
|
|
50
50
|
types: "./dist/lifecycle-workflow-steps.d.ts",
|
|
51
51
|
import: "./dist/lifecycle-workflow-steps.mjs",
|
|
52
52
|
require: "./dist/lifecycle-workflow-steps.js"
|
|
53
|
+
},
|
|
54
|
+
"./react": {
|
|
55
|
+
types: "./dist/react.d.ts",
|
|
56
|
+
import: "./dist/react.mjs",
|
|
57
|
+
require: "./dist/react.js"
|
|
53
58
|
}
|
|
54
59
|
},
|
|
55
60
|
scripts: {
|
|
@@ -63,11 +68,13 @@ var package_default = {
|
|
|
63
68
|
},
|
|
64
69
|
dependencies: {
|
|
65
70
|
"@swc/core": "^1.10.0",
|
|
71
|
+
"@tanstack/react-query": "^5.90.21",
|
|
66
72
|
"@vercel/kv2": "^0.0.18",
|
|
67
73
|
"@vercel/oidc": "^3.1.0",
|
|
68
74
|
"@vercel/sandbox": "1.7.1",
|
|
69
75
|
"@workflow/serde": "4.1.0-beta.2",
|
|
70
76
|
"better-all": "^0.0.5",
|
|
77
|
+
elysia: "^1.4.25",
|
|
71
78
|
errore: "^0.14.0",
|
|
72
79
|
"fast-deep-equal": "^3.1.3",
|
|
73
80
|
ulid: "^3.0.2",
|
|
@@ -77,6 +84,7 @@ var package_default = {
|
|
|
77
84
|
"@agent/tsconfig": "workspace:*",
|
|
78
85
|
"@ai-sdk/react": "^3.0.88",
|
|
79
86
|
"@types/node": "^20.11.24",
|
|
87
|
+
"@types/react": "^19.2.14",
|
|
80
88
|
dotenv: "^17.2.3",
|
|
81
89
|
next: "^16.0.0",
|
|
82
90
|
react: "^19.2.4",
|
|
@@ -96,4 +104,4 @@ var package_default = {
|
|
|
96
104
|
export {
|
|
97
105
|
package_default
|
|
98
106
|
};
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjYuMFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9zdG9yYWdlXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3Qvc3RvcmFnZS5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9zdG9yYWdlLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L3N0b3JhZ2UuanNcIlxuICAgIH0sXG4gICAgXCIuL3NhbmRib3hcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9zYW5kYm94LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L3NhbmRib3gubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3Qvc2FuZGJveC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbmV4dFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9uZXh0LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0L2xvYWRlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9jbGllbnQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2NsaWVudC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbGlmZWN5Y2xlLXdvcmtmbG93XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3cuanNcIlxuICAgIH0sXG4gICAgXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHMubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLmpzXCJcbiAgICB9LFxuICAgIFwiLi9yZWFjdFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L3JlYWN0LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L3JlYWN0Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L3JlYWN0LmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHN3Yy9jb3JlXCI6IFwiXjEuMTAuMFwiLFxuICAgIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI6IFwiXjUuOTAuMjFcIixcbiAgICBcIkB2ZXJjZWwva3YyXCI6IFwiXjAuMC4xOFwiLFxuICAgIFwiQHZlcmNlbC9vaWRjXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJAdmVyY2VsL3NhbmRib3hcIjogXCIxLjcuMVwiLFxuICAgIFwiQHdvcmtmbG93L3NlcmRlXCI6IFwiNC4xLjAtYmV0YS4yXCIsXG4gICAgXCJiZXR0ZXItYWxsXCI6IFwiXjAuMC41XCIsXG4gICAgXCJlbHlzaWFcIjogXCJeMS40LjI1XCIsXG4gICAgXCJlcnJvcmVcIjogXCJeMC4xNC4wXCIsXG4gICAgXCJmYXN0LWRlZXAtZXF1YWxcIjogXCJeMy4xLjNcIixcbiAgICBcInVsaWRcIjogXCJeMy4wLjJcIixcbiAgICBcInpvZFwiOiBcIl40LjMuNlwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBhZ2VudC90c2NvbmZpZ1wiOiBcIndvcmtzcGFjZToqXCIsXG4gICAgXCJAYWktc2RrL3JlYWN0XCI6IFwiXjMuMC44OFwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMTEuMjRcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4yLjE0XCIsXG4gICAgXCJkb3RlbnZcIjogXCJeMTcuMi4zXCIsXG4gICAgXCJuZXh0XCI6IFwiXjE2LjAuMFwiLFxuICAgIFwicmVhY3RcIjogXCJeMTkuMi40XCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMC4yXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiNS41LjRcIixcbiAgICBcInZpdGVzdFwiOiBcIl4zLjAuMFwiLFxuICAgIFwid29ya2Zsb3dcIjogXCJodHRwczovL3dvcmtmbG93LWRvY3MtM3BweW9zM3c0LnZlcmNlbC5zaC93b3JrZmxvdy50Z3pcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYWlcIjogXCJeNi4wLjBcIlxuICB9LFxuICBcInB1Ymxpc2hDb25maWdcIjoge1xuICAgIFwiYWNjZXNzXCI6IFwicHVibGljXCJcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBQUEsRUFDRSxNQUFRO0FBQUEsRUFDUixTQUFXO0FBQUEsRUFDWCxNQUFRO0FBQUEsRUFDUixRQUFVO0FBQUEsRUFDVixPQUFTO0FBQUEsRUFDVCxhQUFlO0FBQUEsRUFDZixTQUFXO0FBQUEsRUFDWCxPQUFTO0FBQUEsSUFDUDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULEtBQUs7QUFBQSxNQUNILE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxhQUFhO0FBQUEsTUFDWCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsYUFBYTtBQUFBLE1BQ1gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxNQUNmLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0Esd0JBQXdCO0FBQUEsTUFDdEIsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLDhCQUE4QjtBQUFBLE1BQzVCLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxXQUFXO0FBQUEsTUFDVCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULE9BQVM7QUFBQSxJQUNULEtBQU87QUFBQSxJQUNQLE9BQVM7QUFBQSxJQUNULFNBQVc7QUFBQSxJQUNYLFdBQWE7QUFBQSxJQUNiLE1BQVE7QUFBQSxJQUNSLGNBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLGFBQWE7QUFBQSxJQUNiLHlCQUF5QjtBQUFBLElBQ3pCLGVBQWU7QUFBQSxJQUNmLGdCQUFnQjtBQUFBLElBQ2hCLG1CQUFtQjtBQUFBLElBQ25CLG1CQUFtQjtBQUFBLElBQ25CLGNBQWM7QUFBQSxJQUNkLFFBQVU7QUFBQSxJQUNWLFFBQVU7QUFBQSxJQUNWLG1CQUFtQjtBQUFBLElBQ25CLE1BQVE7QUFBQSxJQUNSLEtBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxpQkFBbUI7QUFBQSxJQUNqQixtQkFBbUI7QUFBQSxJQUNuQixpQkFBaUI7QUFBQSxJQUNqQixlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixRQUFVO0FBQUEsSUFDVixNQUFRO0FBQUEsSUFDUixPQUFTO0FBQUEsSUFDVCxNQUFRO0FBQUEsSUFDUixZQUFjO0FBQUEsSUFDZCxRQUFVO0FBQUEsSUFDVixVQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0Esa0JBQW9CO0FBQUEsSUFDbEIsSUFBTTtBQUFBLEVBQ1I7QUFBQSxFQUNBLGVBQWlCO0FBQUEsSUFDZixRQUFVO0FBQUEsRUFDWjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
// src/storage/adapter.ts
|
|
2
|
+
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@workflow/serde";
|
|
3
|
+
var StorageStep = class _StorageStep {
|
|
4
|
+
event;
|
|
5
|
+
constructor(event) {
|
|
6
|
+
this.event = event;
|
|
7
|
+
}
|
|
8
|
+
static [WORKFLOW_SERIALIZE](instance) {
|
|
9
|
+
return { event: instance.event };
|
|
10
|
+
}
|
|
11
|
+
static [WORKFLOW_DESERIALIZE](data) {
|
|
12
|
+
return new _StorageStep(data.event);
|
|
13
|
+
}
|
|
14
|
+
// biome-ignore lint/suspicious/noExplicitAny: safe dispatch — event.method selects the matching handler
|
|
15
|
+
on(handlers) {
|
|
16
|
+
return handlers[this.event.method](this.event);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
function isStepFunction(h) {
|
|
20
|
+
return typeof h === "function";
|
|
21
|
+
}
|
|
22
|
+
function fromStepFunction(fn) {
|
|
23
|
+
return {
|
|
24
|
+
session: {
|
|
25
|
+
get: (id) => fn(new StorageStep({ method: "session.get", id })),
|
|
26
|
+
set: (id, value) => fn(new StorageStep({ method: "session.set", id, value })),
|
|
27
|
+
update: (id, updates) => fn(new StorageStep({ method: "session.update", id, updates }))
|
|
28
|
+
},
|
|
29
|
+
message: {
|
|
30
|
+
get: (id) => fn(new StorageStep({ method: "message.get", id })),
|
|
31
|
+
set: (id, value) => fn(new StorageStep({ method: "message.set", id, value })),
|
|
32
|
+
update: (id, updates) => fn(new StorageStep({ method: "message.update", id, updates })),
|
|
33
|
+
listBySession: (sessionId) => fn(new StorageStep({ method: "message.listBySession", sessionId }))
|
|
34
|
+
},
|
|
35
|
+
part: {
|
|
36
|
+
get: (id) => fn(new StorageStep({ method: "part.get", id })),
|
|
37
|
+
set: (id, value) => fn(new StorageStep({ method: "part.set", id, value })),
|
|
38
|
+
listBySession: (sessionId) => fn(new StorageStep({ method: "part.listBySession", sessionId }))
|
|
39
|
+
},
|
|
40
|
+
sandbox: {
|
|
41
|
+
get: (id) => fn(new StorageStep({ method: "sandbox.get", id })),
|
|
42
|
+
set: (id, value) => fn(new StorageStep({ method: "sandbox.set", id, value })),
|
|
43
|
+
update: (id, updates) => fn(new StorageStep({ method: "sandbox.update", id, updates }))
|
|
44
|
+
},
|
|
45
|
+
setup: {
|
|
46
|
+
get: (id) => fn(new StorageStep({ method: "setup.get", id })),
|
|
47
|
+
set: (id, value) => fn(new StorageStep({ method: "setup.set", id, value }))
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function fromHandlers(h) {
|
|
52
|
+
return {
|
|
53
|
+
session: {
|
|
54
|
+
get: (id) => h["session.get"]({ id }),
|
|
55
|
+
set: (id, value) => h["session.set"]({ id, value }),
|
|
56
|
+
update: (id, updates) => h["session.update"]({ id, updates })
|
|
57
|
+
},
|
|
58
|
+
message: {
|
|
59
|
+
get: (id) => h["message.get"]({ id }),
|
|
60
|
+
set: (id, value) => h["message.set"]({ id, value }),
|
|
61
|
+
update: (id, updates) => h["message.update"]({ id, updates }),
|
|
62
|
+
listBySession: (sessionId) => h["message.listBySession"]({ sessionId })
|
|
63
|
+
},
|
|
64
|
+
part: {
|
|
65
|
+
get: (id) => h["part.get"]({ id }),
|
|
66
|
+
set: (id, value) => h["part.set"]({ id, value }),
|
|
67
|
+
listBySession: (sessionId) => h["part.listBySession"]({ sessionId })
|
|
68
|
+
},
|
|
69
|
+
sandbox: {
|
|
70
|
+
get: (id) => h["sandbox.get"]({ id }),
|
|
71
|
+
set: (id, value) => h["sandbox.set"]({ id, value }),
|
|
72
|
+
update: (id, updates) => h["sandbox.update"]({ id, updates })
|
|
73
|
+
},
|
|
74
|
+
setup: {
|
|
75
|
+
get: (id) => h["setup.get"]({ id }),
|
|
76
|
+
set: (id, value) => h["setup.set"]({ id, value })
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function toStorage(h) {
|
|
81
|
+
return isStepFunction(h) ? fromStepFunction(h) : fromHandlers(h);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/storage/bindings/kv-optimistic-update.ts
|
|
85
|
+
var DEFAULT_MAX_RETRIES = 3;
|
|
86
|
+
async function mergeWithKVOptimisticUpdate(opts) {
|
|
87
|
+
const maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
88
|
+
const { KVVersionConflictError } = await import("@vercel/kv2");
|
|
89
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
90
|
+
const entry = await opts.store.get(opts.id);
|
|
91
|
+
if (!entry.exists) {
|
|
92
|
+
throw new Error(opts.notFoundErrorMessage);
|
|
93
|
+
}
|
|
94
|
+
const existing = await entry.value;
|
|
95
|
+
const updated = { ...existing, ...opts.updates };
|
|
96
|
+
try {
|
|
97
|
+
await entry.update(updated);
|
|
98
|
+
return updated;
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (!(error instanceof KVVersionConflictError) && (!(error instanceof Error) || error.name !== "KVVersionConflictError")) {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
if (attempt === maxRetries - 1) {
|
|
104
|
+
throw new Error(opts.conflictErrorMessage, { cause: error });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
throw new Error(opts.conflictErrorMessage);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/storage/bindings/kv.ts
|
|
112
|
+
async function initKvStores(prefix) {
|
|
113
|
+
const { createKV } = await import("@vercel/kv2");
|
|
114
|
+
const kv = createKV({ prefix }).getStore("agent/");
|
|
115
|
+
return {
|
|
116
|
+
sessions: kv.getStore("session/"),
|
|
117
|
+
messages: kv.getStore("message/").withIndexes({
|
|
118
|
+
bySessionId: { key: (m) => m.sessionId }
|
|
119
|
+
}),
|
|
120
|
+
parts: kv.getStore("part/").withIndexes({
|
|
121
|
+
bySessionId: { key: (p) => p.sessionId }
|
|
122
|
+
}),
|
|
123
|
+
sandboxes: kv.getStore("sandbox/"),
|
|
124
|
+
setups: kv.getStore("setup/")
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function kvStorageFallback(opts) {
|
|
128
|
+
let storesPromise;
|
|
129
|
+
function getStores() {
|
|
130
|
+
if (!storesPromise) {
|
|
131
|
+
storesPromise = initKvStores(opts.prefix);
|
|
132
|
+
}
|
|
133
|
+
return storesPromise;
|
|
134
|
+
}
|
|
135
|
+
const tag = `[agent.${opts.prefix}][kv2]`;
|
|
136
|
+
return {
|
|
137
|
+
"session.get": async ({ id }) => {
|
|
138
|
+
const { sessions } = await getStores();
|
|
139
|
+
return await sessions.getValue(id) ?? null;
|
|
140
|
+
},
|
|
141
|
+
"session.set": async ({ id, value }) => {
|
|
142
|
+
const { sessions } = await getStores();
|
|
143
|
+
await sessions.set(id, value);
|
|
144
|
+
},
|
|
145
|
+
"session.update": async ({ id, updates }) => {
|
|
146
|
+
const { sessions } = await getStores();
|
|
147
|
+
return mergeWithKVOptimisticUpdate({
|
|
148
|
+
id,
|
|
149
|
+
updates,
|
|
150
|
+
store: sessions,
|
|
151
|
+
notFoundErrorMessage: `${tag}[session.update] no session found with id "${id}"`,
|
|
152
|
+
conflictErrorMessage: `${tag}[session.update] optimistic update failed after retries for id "${id}"`
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
"message.get": async ({ id }) => {
|
|
156
|
+
const { messages } = await getStores();
|
|
157
|
+
return await messages.getValue(id) ?? null;
|
|
158
|
+
},
|
|
159
|
+
"message.set": async ({ id, value }) => {
|
|
160
|
+
const { messages } = await getStores();
|
|
161
|
+
await messages.set(id, value);
|
|
162
|
+
},
|
|
163
|
+
"message.update": async ({ id, updates }) => {
|
|
164
|
+
const { messages } = await getStores();
|
|
165
|
+
return mergeWithKVOptimisticUpdate({
|
|
166
|
+
id,
|
|
167
|
+
updates,
|
|
168
|
+
store: messages,
|
|
169
|
+
notFoundErrorMessage: `${tag}[message.update] no message found with id "${id}"`,
|
|
170
|
+
conflictErrorMessage: `${tag}[message.update] optimistic update failed after retries for id "${id}"`
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
"message.listBySession": async ({ sessionId }) => {
|
|
174
|
+
const { messages } = await getStores();
|
|
175
|
+
const result = [];
|
|
176
|
+
for await (const [, entry] of messages.entries({
|
|
177
|
+
bySessionId: sessionId
|
|
178
|
+
})) {
|
|
179
|
+
result.push(await entry.value);
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
},
|
|
183
|
+
"part.get": async ({ id }) => {
|
|
184
|
+
const { parts } = await getStores();
|
|
185
|
+
return await parts.getValue(id) ?? null;
|
|
186
|
+
},
|
|
187
|
+
"part.set": async ({ id, value }) => {
|
|
188
|
+
const { parts } = await getStores();
|
|
189
|
+
await parts.set(id, value);
|
|
190
|
+
},
|
|
191
|
+
"part.listBySession": async ({ sessionId }) => {
|
|
192
|
+
const { parts } = await getStores();
|
|
193
|
+
const result = [];
|
|
194
|
+
for await (const [, entry] of parts.entries({
|
|
195
|
+
bySessionId: sessionId
|
|
196
|
+
})) {
|
|
197
|
+
result.push(await entry.value);
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
},
|
|
201
|
+
"sandbox.get": async ({ id }) => {
|
|
202
|
+
const { sandboxes } = await getStores();
|
|
203
|
+
return await sandboxes.getValue(id) ?? null;
|
|
204
|
+
},
|
|
205
|
+
"sandbox.set": async ({ id, value }) => {
|
|
206
|
+
const { sandboxes } = await getStores();
|
|
207
|
+
await sandboxes.set(id, value);
|
|
208
|
+
},
|
|
209
|
+
"sandbox.update": async ({ id, updates }) => {
|
|
210
|
+
const { sandboxes } = await getStores();
|
|
211
|
+
return mergeWithKVOptimisticUpdate({
|
|
212
|
+
id,
|
|
213
|
+
updates,
|
|
214
|
+
store: sandboxes,
|
|
215
|
+
notFoundErrorMessage: `${tag}[sandbox.update] no sandbox found with id "${id}"`,
|
|
216
|
+
conflictErrorMessage: `${tag}[sandbox.update] optimistic update failed after retries for id "${id}"`
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
"setup.get": async ({ id }) => {
|
|
220
|
+
const { setups } = await getStores();
|
|
221
|
+
return await setups.getValue(id) ?? null;
|
|
222
|
+
},
|
|
223
|
+
"setup.set": async ({ id, value }) => {
|
|
224
|
+
const { setups } = await getStores();
|
|
225
|
+
await setups.set(id, value);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// src/storage/bindings/local.ts
|
|
231
|
+
var _fs;
|
|
232
|
+
var _path;
|
|
233
|
+
async function fs() {
|
|
234
|
+
if (!_fs) {
|
|
235
|
+
_fs = await import("fs/promises");
|
|
236
|
+
}
|
|
237
|
+
return _fs;
|
|
238
|
+
}
|
|
239
|
+
async function path() {
|
|
240
|
+
if (!_path) {
|
|
241
|
+
_path = await import("path");
|
|
242
|
+
}
|
|
243
|
+
return _path;
|
|
244
|
+
}
|
|
245
|
+
function createWriteLock() {
|
|
246
|
+
const locks = /* @__PURE__ */ new Map();
|
|
247
|
+
return async function withWriteLock(opts) {
|
|
248
|
+
let state = locks.get(opts.key);
|
|
249
|
+
if (!state) {
|
|
250
|
+
state = { locked: false, waiters: [] };
|
|
251
|
+
locks.set(opts.key, state);
|
|
252
|
+
}
|
|
253
|
+
if (state.locked) {
|
|
254
|
+
await new Promise((resolve) => {
|
|
255
|
+
state.waiters.push(resolve);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
state.locked = true;
|
|
259
|
+
try {
|
|
260
|
+
return await opts.fn();
|
|
261
|
+
} finally {
|
|
262
|
+
const next = state.waiters.shift();
|
|
263
|
+
if (next) {
|
|
264
|
+
next();
|
|
265
|
+
} else {
|
|
266
|
+
state.locked = false;
|
|
267
|
+
locks.delete(opts.key);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function createStore(dir) {
|
|
273
|
+
const filePath = async (key) => (await path()).join(dir, `${key}.json`);
|
|
274
|
+
const withWriteLock = createWriteLock();
|
|
275
|
+
return {
|
|
276
|
+
async get(key) {
|
|
277
|
+
try {
|
|
278
|
+
const data = await (await fs()).readFile(await filePath(key), "utf-8");
|
|
279
|
+
return JSON.parse(data);
|
|
280
|
+
} catch {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
async set(key, value) {
|
|
285
|
+
await withWriteLock({
|
|
286
|
+
key,
|
|
287
|
+
fn: async () => {
|
|
288
|
+
const p = await filePath(key);
|
|
289
|
+
const { mkdir, writeFile } = await fs();
|
|
290
|
+
const { dirname } = await path();
|
|
291
|
+
await mkdir(dirname(p), { recursive: true });
|
|
292
|
+
await writeFile(p, JSON.stringify(value, null, 2));
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
},
|
|
296
|
+
update(key, updates) {
|
|
297
|
+
return withWriteLock({
|
|
298
|
+
key,
|
|
299
|
+
fn: async () => {
|
|
300
|
+
const p = await filePath(key);
|
|
301
|
+
const { readFile, mkdir, writeFile } = await fs();
|
|
302
|
+
const { dirname } = await path();
|
|
303
|
+
let existing;
|
|
304
|
+
try {
|
|
305
|
+
const data = await readFile(p, "utf-8");
|
|
306
|
+
existing = JSON.parse(data);
|
|
307
|
+
} catch {
|
|
308
|
+
throw new Error(`Not found: ${key}`);
|
|
309
|
+
}
|
|
310
|
+
const updated = { ...existing, ...updates };
|
|
311
|
+
await mkdir(dirname(p), { recursive: true });
|
|
312
|
+
await writeFile(p, JSON.stringify(updated, null, 2));
|
|
313
|
+
return updated;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
async function readAllFromDir(dir) {
|
|
320
|
+
const { readdir, readFile } = await fs();
|
|
321
|
+
const { join } = await path();
|
|
322
|
+
let files;
|
|
323
|
+
try {
|
|
324
|
+
files = await readdir(dir);
|
|
325
|
+
} catch {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
const result = [];
|
|
329
|
+
for (const file of files) {
|
|
330
|
+
if (!file.endsWith(".json")) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const data = await readFile(join(dir, file), "utf-8");
|
|
335
|
+
result.push(JSON.parse(data));
|
|
336
|
+
} catch {
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
async function ensureGitignore(dir) {
|
|
342
|
+
const { mkdir, writeFile, readFile } = await fs();
|
|
343
|
+
const { join } = await path();
|
|
344
|
+
const gitignorePath = join(dir, ".gitignore");
|
|
345
|
+
try {
|
|
346
|
+
await readFile(gitignorePath, "utf-8");
|
|
347
|
+
} catch {
|
|
348
|
+
await mkdir(dir, { recursive: true });
|
|
349
|
+
await writeFile(gitignorePath, "*\n");
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function localStorage(opts) {
|
|
353
|
+
const dir = opts?.dir ?? ".agent";
|
|
354
|
+
let gitignorePromise = null;
|
|
355
|
+
const sessionStore = createStore(`${dir}/session`);
|
|
356
|
+
const messageStore = createStore(`${dir}/message`);
|
|
357
|
+
const partStore = createStore(`${dir}/part`);
|
|
358
|
+
const sandboxStore = createStore(`${dir}/sandbox`);
|
|
359
|
+
const setupStore = createStore(`${dir}/setup`);
|
|
360
|
+
const messageDir = `${dir}/message`;
|
|
361
|
+
const partDir = `${dir}/part`;
|
|
362
|
+
function onWrite(fn) {
|
|
363
|
+
if (!gitignorePromise) {
|
|
364
|
+
gitignorePromise = ensureGitignore(dir);
|
|
365
|
+
}
|
|
366
|
+
return gitignorePromise.then(fn);
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
"session.get": ({ id }) => sessionStore.get(id),
|
|
370
|
+
"session.set": ({ id, value }) => onWrite(() => sessionStore.set(id, value)),
|
|
371
|
+
"session.update": ({ id, updates }) => onWrite(() => sessionStore.update(id, updates)),
|
|
372
|
+
"message.get": ({ id }) => messageStore.get(id),
|
|
373
|
+
"message.set": ({ id, value }) => onWrite(() => messageStore.set(id, value)),
|
|
374
|
+
"message.update": ({ id, updates }) => onWrite(() => messageStore.update(id, updates)),
|
|
375
|
+
"message.listBySession": async ({ sessionId }) => {
|
|
376
|
+
const all = await readAllFromDir(messageDir);
|
|
377
|
+
return all.filter((m) => m.sessionId === sessionId);
|
|
378
|
+
},
|
|
379
|
+
"part.get": ({ id }) => partStore.get(id),
|
|
380
|
+
"part.set": ({ id, value }) => onWrite(() => partStore.set(id, value)),
|
|
381
|
+
"part.listBySession": async ({ sessionId }) => {
|
|
382
|
+
const all = await readAllFromDir(partDir);
|
|
383
|
+
return all.filter((p) => p.sessionId === sessionId);
|
|
384
|
+
},
|
|
385
|
+
"sandbox.get": ({ id }) => sandboxStore.get(id),
|
|
386
|
+
"sandbox.set": ({ id, value }) => onWrite(() => sandboxStore.set(id, value)),
|
|
387
|
+
"sandbox.update": ({ id, updates }) => onWrite(() => sandboxStore.update(id, updates)),
|
|
388
|
+
"setup.get": ({ id }) => setupStore.get(id),
|
|
389
|
+
"setup.set": ({ id, value }) => onWrite(() => setupStore.set(id, value))
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// src/storage/should-fallback-kv2.ts
|
|
394
|
+
function shouldFallbackToKV2() {
|
|
395
|
+
return !!process.env.BLOB_READ_WRITE_TOKEN;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export {
|
|
399
|
+
StorageStep,
|
|
400
|
+
toStorage,
|
|
401
|
+
kvStorageFallback,
|
|
402
|
+
localStorage,
|
|
403
|
+
shouldFallbackToKV2
|
|
404
|
+
};
|
|
405
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvYWRhcHRlci50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy9rdi1vcHRpbWlzdGljLXVwZGF0ZS50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy9rdi50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc3RvcmFnZS9zaG91bGQtZmFsbGJhY2sta3YyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0LCBTYW5kYm94LCBTZXNzaW9uLCBTZXR1cCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlSGFuZGxlcnMgKHB1YmxpYywgZmxhdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VIYW5kbGVycyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gIFwic2Vzc2lvbi5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXNzaW9uIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNlc3Npb24udXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTZXNzaW9uPjtcbiAgfSk6IFByb21pc2U8U2Vzc2lvbj47XG5cbiAgXCJtZXNzYWdlLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlIHwgbnVsbD47XG4gIFwibWVzc2FnZS5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBNZXNzYWdlIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcIm1lc3NhZ2UudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPjtcbiAgfSk6IFByb21pc2U8TWVzc2FnZT47XG4gIFwibWVzc2FnZS5saXN0QnlTZXNzaW9uXCIocDogeyBzZXNzaW9uSWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlW10+O1xuXG4gIFwicGFydC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICBcInBhcnQuc2V0XCIocDogeyBpZDogc3RyaW5nOyB2YWx1ZTogUGFydCB9KTogUHJvbWlzZTx2b2lkPjtcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIihwOiB7IHNlc3Npb25JZDogc3RyaW5nIH0pOiBQcm9taXNlPFBhcnRbXT47XG5cbiAgXCJzYW5kYm94LmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTYW5kYm94IHwgbnVsbD47XG4gIFwic2FuZGJveC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTYW5kYm94IH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNhbmRib3gudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTYW5kYm94PjtcbiAgfSk6IFByb21pc2U8U2FuZGJveD47XG5cbiAgXCJzZXR1cC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgXCJzZXR1cC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXR1cCB9KTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlQ2FsbCAoZGVyaXZlZCBmcm9tIFN0b3JhZ2VIYW5kbGVycykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VDYWxsID0ge1xuICBbSyBpbiBrZXlvZiBTdG9yYWdlSGFuZGxlcnNdOiB7IG1ldGhvZDogSyB9ICYgUGFyYW1ldGVyczxcbiAgICBTdG9yYWdlSGFuZGxlcnNbS11cbiAgPlswXTtcbn1ba2V5b2YgU3RvcmFnZUhhbmRsZXJzXTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2VTdGVwIChzZXJpYWxpemFibGUgYWNyb3NzIHdvcmtmbG93IGJvdW5kYXJ5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTdGVwIHtcbiAgZXZlbnQ6IFN0b3JhZ2VDYWxsO1xuXG4gIGNvbnN0cnVjdG9yKGV2ZW50OiBTdG9yYWdlQ2FsbCkge1xuICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogU3RvcmFnZVN0ZXApIHtcbiAgICByZXR1cm4geyBldmVudDogaW5zdGFuY2UuZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHsgZXZlbnQ6IFN0b3JhZ2VDYWxsIH0pIHtcbiAgICByZXR1cm4gbmV3IFN0b3JhZ2VTdGVwKGRhdGEuZXZlbnQpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBzYWZlIGRpc3BhdGNoIFx1MjAxNCBldmVudC5tZXRob2Qgc2VsZWN0cyB0aGUgbWF0Y2hpbmcgaGFuZGxlclxuICBvbihoYW5kbGVyczogU3RvcmFnZUhhbmRsZXJzKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHNlZSBhYm92ZVxuICAgIHJldHVybiAoaGFuZGxlcnNbdGhpcy5ldmVudC5tZXRob2RdIGFzIGFueSkodGhpcy5ldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYWxsIHN0b3JhZ2Ugb3BlcmF0aW9ucy4gSW50ZW5kZWQgdG8gYmVcbiAqIG1hcmtlZCB3aXRoIGBcInVzZSBzdGVwXCJgIHNvIHRoYXQgaXRzIGJvZHkgKGFuZCBOb2RlLmpzLWRlcGVuZGVudFxuICogaW1wb3J0cyBsaWtlIGRhdGFiYXNlIGNsaWVudHMpIGlzIGV4dHJhY3RlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlclxuICogYW5kIHJ1bnMgc2VydmVyLXNpZGUuXG4gKlxuICogVGhlIHN0ZXAgcmVjZWl2ZXMgYSBgU3RvcmFnZVN0ZXBgIGluc3RhbmNlIChzZXJpYWxpemFibGUgdmlhXG4gKiBgQHdvcmtmbG93L3NlcmRlYCkgYW5kIHNob3VsZCBjYWxsIGBzdGVwLmhhbmRsZSh7IC4uLiB9KWAgd2l0aCBhXG4gKiBgU3RvcmFnZUhhbmRsZXJzYCBtYXAuXG4gKi9cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogc3RlcCBmdW5jdGlvbiBpcyBhIGRpc3BhdGNoZXI7IHR5cGUgc2FmZXR5IGlzIGF0IHRoZSBoYW5kbGVycyBsZXZlbFxuZXhwb3J0IHR5cGUgU3RvcmFnZVN0ZXBGdW5jdGlvbiA9IChzdG9yZTogU3RvcmFnZVN0ZXApID0+IFByb21pc2U8YW55PjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2UgKGludGVybmFsLCBuZXN0ZWQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2Uge1xuICBzZXNzaW9uOiB7XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU2Vzc2lvbik6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGtleTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb24+KTogUHJvbWlzZTxTZXNzaW9uPjtcbiAgfTtcbiAgbWVzc2FnZToge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZSB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPik6IFByb21pc2U8TWVzc2FnZT47XG4gICAgbGlzdEJ5U2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZVtdPjtcbiAgfTtcbiAgcGFydDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFBhcnQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGxpc3RCeVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFBhcnRbXT47XG4gIH07XG4gIHNhbmRib3g6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFNhbmRib3ggfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTYW5kYm94KTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8U2FuZGJveD4pOiBQcm9taXNlPFNhbmRib3g+O1xuICB9O1xuICBzZXR1cDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTZXR1cCk6IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VJbnB1dCA9IFN0b3JhZ2VIYW5kbGVycyB8IFN0b3JhZ2VTdGVwRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzU3RlcEZ1bmN0aW9uKGg6IFN0b3JhZ2VJbnB1dCk6IGggaXMgU3RvcmFnZVN0ZXBGdW5jdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgaCA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RlcEZ1bmN0aW9uKGZuOiBTdG9yYWdlU3RlcEZ1bmN0aW9uKTogU3RvcmFnZSB7XG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiAoaWQpID0+IGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLmdldFwiLCBpZCB9KSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnVwZGF0ZVwiLCBpZCwgdXBkYXRlcyB9KSksXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2Uuc2V0XCIsIGlkLCB2YWx1ZSB9KSksXG4gICAgICB1cGRhdGU6IChpZCwgdXBkYXRlcykgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UudXBkYXRlXCIsIGlkLCB1cGRhdGVzIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC51cGRhdGVcIiwgaWQsIHVwZGF0ZXMgfSkpLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2V0dXAuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNldHVwLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyb21IYW5kbGVycyhoOiBTdG9yYWdlSGFuZGxlcnMpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInNlc3Npb24uZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXNzaW9uLnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PiBoW1wic2Vzc2lvbi51cGRhdGVcIl0oeyBpZCwgdXBkYXRlcyB9KSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wibWVzc2FnZS5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcIm1lc3NhZ2Uuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJtZXNzYWdlLnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wicGFydC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInBhcnQuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcInBhcnQubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2FuZGJveC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInNhbmRib3guc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJzYW5kYm94LnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2V0dXAuZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXR1cC5zZXRcIl0oeyBpZCwgdmFsdWUgfSksXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RvcmFnZShoOiBTdG9yYWdlSW5wdXQpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIGlzU3RlcEZ1bmN0aW9uKGgpID8gZnJvbVN0ZXBGdW5jdGlvbihoKSA6IGZyb21IYW5kbGVycyhoKTtcbn1cbiIsICJjb25zdCBERUZBVUxUX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBXZSBpbnRlbnRpb25hbGx5IG1pcnJvciB0aGUgbWluaW1hbCBgZ2V0KClgIHJldHVybiBzaGFwZSB3ZSB1c2UgaGVyZVxuICogaW5zdGVhZCBvZiBpbXBvcnRpbmcgS1YyIHR5cGVzLiBUaGUgd29ya2Zsb3cgYnVuZGxlciBhbmFseXplcyB0eXBlLW9ubHlcbiAqIGltcG9ydHMgYW5kIGZsYWdzIGBAdmVyY2VsL2t2MmAgYXMgYSBOb2RlIG1vZHVsZSBpbiB3b3JrZmxvdyBjb2RlIHBhdGhzLlxuICogS2VlcGluZyB0aGlzIGxvY2FsIGF2b2lkcyB0aGF0IGZhbHNlLXBvc2l0aXZlIHdoaWxlIHByZXNlcnZpbmcgcnVudGltZSBiZWhhdmlvci5cbiAqL1xudHlwZSBLVk9wdGltaXN0aWNHZXRSZXN1bHQ8VD4gPVxuICB8IHtcbiAgICAgIGV4aXN0czogZmFsc2U7XG4gICAgfVxuICB8IHtcbiAgICAgIGV4aXN0czogdHJ1ZTtcbiAgICAgIHZhbHVlOiBQcm9taXNlPFQ+O1xuICAgICAgdXBkYXRlKHZhbHVlOiBUKTogUHJvbWlzZTx1bmtub3duPjtcbiAgICB9O1xuXG50eXBlIEtWT3B0aW1pc3RpY1N0b3JlPFQ+ID0ge1xuICBnZXQoa2V5T3JGaWx0ZXI6IHN0cmluZyk6IFByb21pc2U8S1ZPcHRpbWlzdGljR2V0UmVzdWx0PFQ+Pjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZXJnZVdpdGhLVk9wdGltaXN0aWNVcGRhdGU8VD4ob3B0czoge1xuICBpZDogc3RyaW5nO1xuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+O1xuICBzdG9yZTogS1ZPcHRpbWlzdGljU3RvcmU8VD47XG4gIG5vdEZvdW5kRXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIGNvbmZsaWN0RXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG59KTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG1heFJldHJpZXMgPSBvcHRzLm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUztcbiAgY29uc3QgeyBLVlZlcnNpb25Db25mbGljdEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL2t2MlwiKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgb3B0cy5zdG9yZS5nZXQob3B0cy5pZCk7XG4gICAgaWYgKCFlbnRyeS5leGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihvcHRzLm5vdEZvdW5kRXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGVudHJ5LnZhbHVlO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB7IC4uLmV4aXN0aW5nLCAuLi5vcHRzLnVwZGF0ZXMgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnRyeS51cGRhdGUodXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKFxuICAgICAgICAhKGVycm9yIGluc3RhbmNlb2YgS1ZWZXJzaW9uQ29uZmxpY3RFcnJvcikgJiZcbiAgICAgICAgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgZXJyb3IubmFtZSAhPT0gXCJLVlZlcnNpb25Db25mbGljdEVycm9yXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhSZXRyaWVzIC0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob3B0cy5jb25mbGljdEVycm9yTWVzc2FnZSwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKG9wdHMuY29uZmxpY3RFcnJvck1lc3NhZ2UpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgU3RvcmFnZUhhbmRsZXJzIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCwgU2FuZGJveCwgU2Vzc2lvbiwgU2V0dXAgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG1lcmdlV2l0aEtWT3B0aW1pc3RpY1VwZGF0ZSB9IGZyb20gXCIuL2t2LW9wdGltaXN0aWMtdXBkYXRlXCI7XG5cbnR5cGUgS3ZTdG9yZXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGluaXRLdlN0b3Jlcz4+O1xuXG5hc3luYyBmdW5jdGlvbiBpbml0S3ZTdG9yZXMocHJlZml4OiBzdHJpbmcpIHtcbiAgY29uc3QgeyBjcmVhdGVLViB9ID0gYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9rdjJcIik7XG4gIGNvbnN0IGt2ID0gY3JlYXRlS1YoeyBwcmVmaXggfSkuZ2V0U3RvcmUoXCJhZ2VudC9cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uczoga3YuZ2V0U3RvcmU8U2Vzc2lvbj4oXCJzZXNzaW9uL1wiKSxcbiAgICBtZXNzYWdlczoga3YuZ2V0U3RvcmU8TWVzc2FnZT4oXCJtZXNzYWdlL1wiKS53aXRoSW5kZXhlcyh7XG4gICAgICBieVNlc3Npb25JZDogeyBrZXk6IChtOiBNZXNzYWdlKSA9PiBtLnNlc3Npb25JZCB9LFxuICAgIH0pLFxuICAgIHBhcnRzOiBrdi5nZXRTdG9yZTxQYXJ0PihcInBhcnQvXCIpLndpdGhJbmRleGVzKHtcbiAgICAgIGJ5U2Vzc2lvbklkOiB7IGtleTogKHA6IFBhcnQpID0+IHAuc2Vzc2lvbklkIH0sXG4gICAgfSksXG4gICAgc2FuZGJveGVzOiBrdi5nZXRTdG9yZTxTYW5kYm94PihcInNhbmRib3gvXCIpLFxuICAgIHNldHVwczoga3YuZ2V0U3RvcmU8U2V0dXA+KFwic2V0dXAvXCIpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3ZTdG9yYWdlRmFsbGJhY2sob3B0czogeyBwcmVmaXg6IHN0cmluZyB9KTogU3RvcmFnZUhhbmRsZXJzIHtcbiAgbGV0IHN0b3Jlc1Byb21pc2U6IFByb21pc2U8S3ZTdG9yZXM+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGdldFN0b3JlcygpIHtcbiAgICBpZiAoIXN0b3Jlc1Byb21pc2UpIHtcbiAgICAgIHN0b3Jlc1Byb21pc2UgPSBpbml0S3ZTdG9yZXMob3B0cy5wcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVzUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHRhZyA9IGBbYWdlbnQuJHtvcHRzLnByZWZpeH1dW2t2Ml1gO1xuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgc2Vzc2lvbnMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IHNlc3Npb25zLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24udXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbnMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIG1lcmdlV2l0aEtWT3B0aW1pc3RpY1VwZGF0ZTxTZXNzaW9uPih7XG4gICAgICAgIGlkLFxuICAgICAgICB1cGRhdGVzLFxuICAgICAgICBzdG9yZTogc2Vzc2lvbnMsXG4gICAgICAgIG5vdEZvdW5kRXJyb3JNZXNzYWdlOiBgJHt0YWd9W3Nlc3Npb24udXBkYXRlXSBubyBzZXNzaW9uIGZvdW5kIHdpdGggaWQgXCIke2lkfVwiYCxcbiAgICAgICAgY29uZmxpY3RFcnJvck1lc3NhZ2U6IGAke3RhZ31bc2Vzc2lvbi51cGRhdGVdIG9wdGltaXN0aWMgdXBkYXRlIGZhaWxlZCBhZnRlciByZXRyaWVzIGZvciBpZCBcIiR7aWR9XCJgLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIFwibWVzc2FnZS5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICByZXR1cm4gKGF3YWl0IG1lc3NhZ2VzLmdldFZhbHVlKGlkKSkgPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLnNldFwiOiBhc3luYyAoeyBpZCwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBhd2FpdCBtZXNzYWdlcy5zZXQoaWQsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLnVwZGF0ZVwiOiBhc3luYyAoeyBpZCwgdXBkYXRlcyB9KSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiBtZXJnZVdpdGhLVk9wdGltaXN0aWNVcGRhdGU8TWVzc2FnZT4oe1xuICAgICAgICBpZCxcbiAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgc3RvcmU6IG1lc3NhZ2VzLFxuICAgICAgICBub3RGb3VuZEVycm9yTWVzc2FnZTogYCR7dGFnfVttZXNzYWdlLnVwZGF0ZV0gbm8gbWVzc2FnZSBmb3VuZCB3aXRoIGlkIFwiJHtpZH1cImAsXG4gICAgICAgIGNvbmZsaWN0RXJyb3JNZXNzYWdlOiBgJHt0YWd9W21lc3NhZ2UudXBkYXRlXSBvcHRpbWlzdGljIHVwZGF0ZSBmYWlsZWQgYWZ0ZXIgcmV0cmllcyBmb3IgaWQgXCIke2lkfVwiYCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBjb25zdCByZXN1bHQ6IE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBbLCBlbnRyeV0gb2YgbWVzc2FnZXMuZW50cmllcyh7XG4gICAgICAgIGJ5U2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICB9KSkge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCBlbnRyeS52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBcInBhcnQuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgcGFydHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIChhd2FpdCBwYXJ0cy5nZXRWYWx1ZShpZCkpID8/IG51bGw7XG4gICAgfSxcblxuICAgIFwicGFydC5zZXRcIjogYXN5bmMgKHsgaWQsIHZhbHVlIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgcGFydHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgYXdhaXQgcGFydHMuc2V0KGlkLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcnRzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogUGFydFtdID0gW107XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IFssIGVudHJ5XSBvZiBwYXJ0cy5lbnRyaWVzKHtcbiAgICAgICAgYnlTZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgIH0pKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IGVudHJ5LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzYW5kYm94ZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIChhd2FpdCBzYW5kYm94ZXMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNhbmRib3hlcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBhd2FpdCBzYW5kYm94ZXMuc2V0KGlkLCB2YWx1ZSk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC51cGRhdGVcIjogYXN5bmMgKHsgaWQsIHVwZGF0ZXMgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzYW5kYm94ZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIG1lcmdlV2l0aEtWT3B0aW1pc3RpY1VwZGF0ZTxTYW5kYm94Pih7XG4gICAgICAgIGlkLFxuICAgICAgICB1cGRhdGVzLFxuICAgICAgICBzdG9yZTogc2FuZGJveGVzLFxuICAgICAgICBub3RGb3VuZEVycm9yTWVzc2FnZTogYCR7dGFnfVtzYW5kYm94LnVwZGF0ZV0gbm8gc2FuZGJveCBmb3VuZCB3aXRoIGlkIFwiJHtpZH1cImAsXG4gICAgICAgIGNvbmZsaWN0RXJyb3JNZXNzYWdlOiBgJHt0YWd9W3NhbmRib3gudXBkYXRlXSBvcHRpbWlzdGljIHVwZGF0ZSBmYWlsZWQgYWZ0ZXIgcmV0cmllcyBmb3IgaWQgXCIke2lkfVwiYCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBcInNldHVwLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNldHVwcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICByZXR1cm4gKGF3YWl0IHNldHVwcy5nZXRWYWx1ZShpZCkpID8/IG51bGw7XG4gICAgfSxcblxuICAgIFwic2V0dXAuc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNldHVwcyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBhd2FpdCBzZXR1cHMuc2V0KGlkLCB2YWx1ZSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0b3JhZ2VIYW5kbGVycyB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQsIFNhbmRib3gsIFNlc3Npb24sIFNldHVwIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmxldCBfZnM6IHR5cGVvZiBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpIHwgdW5kZWZpbmVkO1xubGV0IF9wYXRoOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpwYXRoXCIpIHwgdW5kZWZpbmVkO1xuXG5hc3luYyBmdW5jdGlvbiBmcygpIHtcbiAgaWYgKCFfZnMpIHtcbiAgICBfZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICB9XG4gIHJldHVybiBfZnM7XG59XG5hc3luYyBmdW5jdGlvbiBwYXRoKCkge1xuICBpZiAoIV9wYXRoKSB7XG4gICAgX3BhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gIH1cbiAgcmV0dXJuIF9wYXRoO1xufVxuXG50eXBlIFdyaXRlTG9ja1N0YXRlID0ge1xuICBsb2NrZWQ6IGJvb2xlYW47XG4gIHdhaXRlcnM6IEFycmF5PCgpID0+IHZvaWQ+O1xufTtcblxuZnVuY3Rpb24gY3JlYXRlV3JpdGVMb2NrKCkge1xuICBjb25zdCBsb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBXcml0ZUxvY2tTdGF0ZT4oKTtcblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gd2l0aFdyaXRlTG9jazxUPihvcHRzOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgZm46ICgpID0+IFByb21pc2U8VD47XG4gIH0pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgc3RhdGUgPSBsb2Nrcy5nZXQob3B0cy5rZXkpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHN0YXRlID0geyBsb2NrZWQ6IGZhbHNlLCB3YWl0ZXJzOiBbXSB9O1xuICAgICAgbG9ja3Muc2V0KG9wdHMua2V5LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmxvY2tlZCkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgc3RhdGUud2FpdGVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGUubG9ja2VkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgb3B0cy5mbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBuZXh0ID0gc3RhdGUud2FpdGVycy5zaGlmdCgpO1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgbmV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubG9ja2VkID0gZmFsc2U7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShvcHRzLmtleSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZTxUPihkaXI6IHN0cmluZykge1xuICBjb25zdCBmaWxlUGF0aCA9IGFzeW5jIChrZXk6IHN0cmluZykgPT5cbiAgICAoYXdhaXQgcGF0aCgpKS5qb2luKGRpciwgYCR7a2V5fS5qc29uYCk7XG4gIGNvbnN0IHdpdGhXcml0ZUxvY2sgPSBjcmVhdGVXcml0ZUxvY2soKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCAoYXdhaXQgZnMoKSkucmVhZEZpbGUoYXdhaXQgZmlsZVBhdGgoa2V5KSwgXCJ1dGYtOFwiKTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSkgYXMgVDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHdpdGhXcml0ZUxvY2soe1xuICAgICAgICBrZXksXG4gICAgICAgIGZuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcCA9IGF3YWl0IGZpbGVQYXRoKGtleSk7XG4gICAgICAgICAgY29uc3QgeyBta2Rpciwgd3JpdGVGaWxlIH0gPSBhd2FpdCBmcygpO1xuICAgICAgICAgIGNvbnN0IHsgZGlybmFtZSB9ID0gYXdhaXQgcGF0aCgpO1xuICAgICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZShwLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgIHJldHVybiB3aXRoV3JpdGVMb2NrKHtcbiAgICAgICAga2V5LFxuICAgICAgICBmbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHAgPSBhd2FpdCBmaWxlUGF0aChrZXkpO1xuICAgICAgICAgIGNvbnN0IHsgcmVhZEZpbGUsIG1rZGlyLCB3cml0ZUZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gICAgICAgICAgY29uc3QgeyBkaXJuYW1lIH0gPSBhd2FpdCBwYXRoKCk7XG4gICAgICAgICAgbGV0IGV4aXN0aW5nOiBUO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUocCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgICAgIGV4aXN0aW5nID0gSlNPTi5wYXJzZShkYXRhKSBhcyBUO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZm91bmQ6ICR7a2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0geyAuLi5leGlzdGluZywgLi4udXBkYXRlcyB9O1xuICAgICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZShwLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkLCBudWxsLCAyKSk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHsgcmVhZGRpciwgcmVhZEZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgcGF0aCgpO1xuICBsZXQgZmlsZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLCBmaWxlKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKEpTT04ucGFyc2UoZGF0YSkgYXMgVCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBza2lwIGNvcnJ1cHQgZmlsZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlR2l0aWdub3JlKGRpcjogc3RyaW5nKSB7XG4gIGNvbnN0IHsgbWtkaXIsIHdyaXRlRmlsZSwgcmVhZEZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgcGF0aCgpO1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbihkaXIsIFwiLmdpdGlnbm9yZVwiKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShnaXRpZ25vcmVQYXRoLCBcInV0Zi04XCIpO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShnaXRpZ25vcmVQYXRoLCBcIipcXG5cIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZShvcHRzPzogeyBkaXI/OiBzdHJpbmcgfSk6IFN0b3JhZ2VIYW5kbGVycyB7XG4gIGNvbnN0IGRpciA9IG9wdHM/LmRpciA/PyBcIi5hZ2VudFwiO1xuICBsZXQgZ2l0aWdub3JlUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNlc3Npb25TdG9yZSA9IGNyZWF0ZVN0b3JlPFNlc3Npb24+KGAke2Rpcn0vc2Vzc2lvbmApO1xuICBjb25zdCBtZXNzYWdlU3RvcmUgPSBjcmVhdGVTdG9yZTxNZXNzYWdlPihgJHtkaXJ9L21lc3NhZ2VgKTtcbiAgY29uc3QgcGFydFN0b3JlID0gY3JlYXRlU3RvcmU8UGFydD4oYCR7ZGlyfS9wYXJ0YCk7XG4gIGNvbnN0IHNhbmRib3hTdG9yZSA9IGNyZWF0ZVN0b3JlPFNhbmRib3g+KGAke2Rpcn0vc2FuZGJveGApO1xuICBjb25zdCBzZXR1cFN0b3JlID0gY3JlYXRlU3RvcmU8U2V0dXA+KGAke2Rpcn0vc2V0dXBgKTtcbiAgY29uc3QgbWVzc2FnZURpciA9IGAke2Rpcn0vbWVzc2FnZWA7XG4gIGNvbnN0IHBhcnREaXIgPSBgJHtkaXJ9L3BhcnRgO1xuXG4gIGZ1bmN0aW9uIG9uV3JpdGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIWdpdGlnbm9yZVByb21pc2UpIHtcbiAgICAgIGdpdGlnbm9yZVByb21pc2UgPSBlbnN1cmVHaXRpZ25vcmUoZGlyKTtcbiAgICB9XG4gICAgcmV0dXJuIGdpdGlnbm9yZVByb21pc2UudGhlbihmbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFwic2Vzc2lvbi5nZXRcIjogKHsgaWQgfSkgPT4gc2Vzc2lvblN0b3JlLmdldChpZCksXG4gICAgXCJzZXNzaW9uLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gc2Vzc2lvblN0b3JlLnNldChpZCwgdmFsdWUpKSxcbiAgICBcInNlc3Npb24udXBkYXRlXCI6ICh7IGlkLCB1cGRhdGVzIH0pID0+XG4gICAgICBvbldyaXRlKCgpID0+IHNlc3Npb25TdG9yZS51cGRhdGUoaWQsIHVwZGF0ZXMpKSxcblxuICAgIFwibWVzc2FnZS5nZXRcIjogKHsgaWQgfSkgPT4gbWVzc2FnZVN0b3JlLmdldChpZCksXG4gICAgXCJtZXNzYWdlLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gbWVzc2FnZVN0b3JlLnNldChpZCwgdmFsdWUpKSxcbiAgICBcIm1lc3NhZ2UudXBkYXRlXCI6ICh7IGlkLCB1cGRhdGVzIH0pID0+XG4gICAgICBvbldyaXRlKCgpID0+IG1lc3NhZ2VTdG9yZS51cGRhdGUoaWQsIHVwZGF0ZXMpKSxcbiAgICBcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcigobSkgPT4gbS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgfSxcblxuICAgIFwicGFydC5nZXRcIjogKHsgaWQgfSkgPT4gcGFydFN0b3JlLmdldChpZCksXG4gICAgXCJwYXJ0LnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gb25Xcml0ZSgoKSA9PiBwYXJ0U3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGwgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxQYXJ0PihwYXJ0RGlyKTtcbiAgICAgIHJldHVybiBhbGwuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldFwiOiAoeyBpZCB9KSA9PiBzYW5kYm94U3RvcmUuZ2V0KGlkKSxcbiAgICBcInNhbmRib3guc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PlxuICAgICAgb25Xcml0ZSgoKSA9PiBzYW5kYm94U3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICAgIFwic2FuZGJveC51cGRhdGVcIjogKHsgaWQsIHVwZGF0ZXMgfSkgPT5cbiAgICAgIG9uV3JpdGUoKCkgPT4gc2FuZGJveFN0b3JlLnVwZGF0ZShpZCwgdXBkYXRlcykpLFxuXG4gICAgXCJzZXR1cC5nZXRcIjogKHsgaWQgfSkgPT4gc2V0dXBTdG9yZS5nZXQoaWQpLFxuICAgIFwic2V0dXAuc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PiBvbldyaXRlKCgpID0+IHNldHVwU3RvcmUuc2V0KGlkLCB2YWx1ZSkpLFxuICB9O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBzaG91bGRGYWxsYmFja1RvS1YyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9jZXNzLmVudi5CTE9CX1JFQURfV1JJVEVfVE9LRU47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxzQkFBc0IsMEJBQTBCO0FBOENsRCxJQUFNLGNBQU4sTUFBTSxhQUFZO0FBQUEsRUFDdkI7QUFBQSxFQUVBLFlBQVksT0FBb0I7QUFDOUIsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBRUEsUUFBUSxrQkFBa0IsRUFBRSxVQUF1QjtBQUNqRCxXQUFPLEVBQUUsT0FBTyxTQUFTLE1BQU07QUFBQSxFQUNqQztBQUFBLEVBRUEsUUFBUSxvQkFBb0IsRUFBRSxNQUE4QjtBQUMxRCxXQUFPLElBQUksYUFBWSxLQUFLLEtBQUs7QUFBQSxFQUNuQztBQUFBO0FBQUEsRUFHQSxHQUFHLFVBQXlDO0FBRTFDLFdBQVEsU0FBUyxLQUFLLE1BQU0sTUFBTSxFQUFVLEtBQUssS0FBSztBQUFBLEVBQ3hEO0FBQ0Y7QUErQ0EsU0FBUyxlQUFlLEdBQTJDO0FBQ2pFLFNBQU8sT0FBTyxNQUFNO0FBQ3RCO0FBRUEsU0FBUyxpQkFBaUIsSUFBa0M7QUFDMUQsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLE1BQ1AsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFBQSxNQUM5RCxLQUFLLENBQUMsSUFBSSxVQUNSLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxlQUFlLElBQUksTUFBTSxDQUFDLENBQUM7QUFBQSxNQUMxRCxRQUFRLENBQUMsSUFBSSxZQUNYLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxrQkFBa0IsSUFBSSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ2pFO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsZUFBZSxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQzlELEtBQUssQ0FBQyxJQUFJLFVBQ1IsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGVBQWUsSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQzFELFFBQVEsQ0FBQyxJQUFJLFlBQ1gsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFDL0QsZUFBZSxDQUFDLGNBQ2QsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLHlCQUF5QixVQUFVLENBQUMsQ0FBQztBQUFBLElBQ3RFO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQzNELEtBQUssQ0FBQyxJQUFJLFVBQ1IsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLFlBQVksSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQ3ZELGVBQWUsQ0FBQyxjQUNkLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxzQkFBc0IsVUFBVSxDQUFDLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFBQSxNQUM5RCxLQUFLLENBQUMsSUFBSSxVQUNSLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxlQUFlLElBQUksTUFBTSxDQUFDLENBQUM7QUFBQSxNQUMxRCxRQUFRLENBQUMsSUFBSSxZQUNYLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxrQkFBa0IsSUFBSSxRQUFRLENBQUMsQ0FBQztBQUFBLElBQ2pFO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQzVELEtBQUssQ0FBQyxJQUFJLFVBQ1IsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGFBQWEsSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLElBQzFEO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxhQUFhLEdBQTZCO0FBQ2pELFNBQU87QUFBQSxJQUNMLFNBQVM7QUFBQSxNQUNQLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsR0FBRyxDQUFDO0FBQUEsTUFDcEMsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFLGFBQWEsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDO0FBQUEsTUFDbEQsUUFBUSxDQUFDLElBQUksWUFBWSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxRQUFRLENBQUM7QUFBQSxJQUM5RDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxHQUFHLENBQUM7QUFBQSxNQUNwQyxLQUFLLENBQUMsSUFBSSxVQUFVLEVBQUUsYUFBYSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUM7QUFBQSxNQUNsRCxRQUFRLENBQUMsSUFBSSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLFFBQVEsQ0FBQztBQUFBLE1BQzVELGVBQWUsQ0FBQyxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxVQUFVLENBQUM7QUFBQSxJQUN4RTtBQUFBLElBQ0EsTUFBTTtBQUFBLE1BQ0osS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLENBQUM7QUFBQSxNQUNqQyxLQUFLLENBQUMsSUFBSSxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUM7QUFBQSxNQUMvQyxlQUFlLENBQUMsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsVUFBVSxDQUFDO0FBQUEsSUFDckU7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsR0FBRyxDQUFDO0FBQUEsTUFDcEMsS0FBSyxDQUFDLElBQUksVUFBVSxFQUFFLGFBQWEsRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDO0FBQUEsTUFDbEQsUUFBUSxDQUFDLElBQUksWUFBWSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxRQUFRLENBQUM7QUFBQSxJQUM5RDtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxHQUFHLENBQUM7QUFBQSxNQUNsQyxLQUFLLENBQUMsSUFBSSxVQUFVLEVBQUUsV0FBVyxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUM7QUFBQSxJQUNsRDtBQUFBLEVBQ0Y7QUFDRjtBQUVPLFNBQVMsVUFBVSxHQUEwQjtBQUNsRCxTQUFPLGVBQWUsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksYUFBYSxDQUFDO0FBQ2pFOzs7QUM3TEEsSUFBTSxzQkFBc0I7QUFzQjVCLGVBQXNCLDRCQUErQixNQU90QztBQUNiLFFBQU0sYUFBYSxLQUFLLGNBQWM7QUFDdEMsUUFBTSxFQUFFLHVCQUF1QixJQUFJLE1BQU0sT0FBTyxhQUFhO0FBRTdELFdBQVMsVUFBVSxHQUFHLFVBQVUsWUFBWSxXQUFXO0FBQ3JELFVBQU0sUUFBUSxNQUFNLEtBQUssTUFBTSxJQUFJLEtBQUssRUFBRTtBQUMxQyxRQUFJLENBQUMsTUFBTSxRQUFRO0FBQ2pCLFlBQU0sSUFBSSxNQUFNLEtBQUssb0JBQW9CO0FBQUEsSUFDM0M7QUFFQSxVQUFNLFdBQVcsTUFBTSxNQUFNO0FBQzdCLFVBQU0sVUFBVSxFQUFFLEdBQUcsVUFBVSxHQUFHLEtBQUssUUFBUTtBQUUvQyxRQUFJO0FBQ0YsWUFBTSxNQUFNLE9BQU8sT0FBTztBQUMxQixhQUFPO0FBQUEsSUFDVCxTQUFTLE9BQU87QUFDZCxVQUNFLEVBQUUsaUJBQWlCLDRCQUNsQixFQUFFLGlCQUFpQixVQUFVLE1BQU0sU0FBUywyQkFDN0M7QUFDQSxjQUFNO0FBQUEsTUFDUjtBQUVBLFVBQUksWUFBWSxhQUFhLEdBQUc7QUFDOUIsY0FBTSxJQUFJLE1BQU0sS0FBSyxzQkFBc0IsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUFBLE1BQzdEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLElBQUksTUFBTSxLQUFLLG9CQUFvQjtBQUMzQzs7O0FDdERBLGVBQWUsYUFBYSxRQUFnQjtBQUMxQyxRQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sT0FBTyxhQUFhO0FBQy9DLFFBQU0sS0FBSyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxRQUFRO0FBRWpELFNBQU87QUFBQSxJQUNMLFVBQVUsR0FBRyxTQUFrQixVQUFVO0FBQUEsSUFDekMsVUFBVSxHQUFHLFNBQWtCLFVBQVUsRUFBRSxZQUFZO0FBQUEsTUFDckQsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFlLEVBQUUsVUFBVTtBQUFBLElBQ2xELENBQUM7QUFBQSxJQUNELE9BQU8sR0FBRyxTQUFlLE9BQU8sRUFBRSxZQUFZO0FBQUEsTUFDNUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFZLEVBQUUsVUFBVTtBQUFBLElBQy9DLENBQUM7QUFBQSxJQUNELFdBQVcsR0FBRyxTQUFrQixVQUFVO0FBQUEsSUFDMUMsUUFBUSxHQUFHLFNBQWdCLFFBQVE7QUFBQSxFQUNyQztBQUNGO0FBRU8sU0FBUyxrQkFBa0IsTUFBMkM7QUFDM0UsTUFBSTtBQUVKLFdBQVMsWUFBWTtBQUNuQixRQUFJLENBQUMsZUFBZTtBQUNsQixzQkFBZ0IsYUFBYSxLQUFLLE1BQU07QUFBQSxJQUMxQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxNQUFNLFVBQVUsS0FBSyxNQUFNO0FBRWpDLFNBQU87QUFBQSxJQUNMLGVBQWUsT0FBTyxFQUFFLEdBQUcsTUFBTTtBQUMvQixZQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sVUFBVTtBQUNyQyxhQUFRLE1BQU0sU0FBUyxTQUFTLEVBQUUsS0FBTTtBQUFBLElBQzFDO0FBQUEsSUFFQSxlQUFlLE9BQU8sRUFBRSxJQUFJLE1BQU0sTUFBTTtBQUN0QyxZQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sVUFBVTtBQUNyQyxZQUFNLFNBQVMsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUM5QjtBQUFBLElBRUEsa0JBQWtCLE9BQU8sRUFBRSxJQUFJLFFBQVEsTUFBTTtBQUMzQyxZQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sVUFBVTtBQUNyQyxhQUFPLDRCQUFxQztBQUFBLFFBQzFDO0FBQUEsUUFDQTtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1Asc0JBQXNCLEdBQUcsR0FBRyw4Q0FBOEMsRUFBRTtBQUFBLFFBQzVFLHNCQUFzQixHQUFHLEdBQUcsbUVBQW1FLEVBQUU7QUFBQSxNQUNuRyxDQUFDO0FBQUEsSUFDSDtBQUFBLElBRUEsZUFBZSxPQUFPLEVBQUUsR0FBRyxNQUFNO0FBQy9CLFlBQU0sRUFBRSxTQUFTLElBQUksTUFBTSxVQUFVO0FBQ3JDLGFBQVEsTUFBTSxTQUFTLFNBQVMsRUFBRSxLQUFNO0FBQUEsSUFDMUM7QUFBQSxJQUVBLGVBQWUsT0FBTyxFQUFFLElBQUksTUFBTSxNQUFNO0FBQ3RDLFlBQU0sRUFBRSxTQUFTLElBQUksTUFBTSxVQUFVO0FBQ3JDLFlBQU0sU0FBUyxJQUFJLElBQUksS0FBSztBQUFBLElBQzlCO0FBQUEsSUFFQSxrQkFBa0IsT0FBTyxFQUFFLElBQUksUUFBUSxNQUFNO0FBQzNDLFlBQU0sRUFBRSxTQUFTLElBQUksTUFBTSxVQUFVO0FBQ3JDLGFBQU8sNEJBQXFDO0FBQUEsUUFDMUM7QUFBQSxRQUNBO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxzQkFBc0IsR0FBRyxHQUFHLDhDQUE4QyxFQUFFO0FBQUEsUUFDNUUsc0JBQXNCLEdBQUcsR0FBRyxtRUFBbUUsRUFBRTtBQUFBLE1BQ25HLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx5QkFBeUIsT0FBTyxFQUFFLFVBQVUsTUFBTTtBQUNoRCxZQUFNLEVBQUUsU0FBUyxJQUFJLE1BQU0sVUFBVTtBQUNyQyxZQUFNLFNBQW9CLENBQUM7QUFDM0IsdUJBQWlCLENBQUMsRUFBRSxLQUFLLEtBQUssU0FBUyxRQUFRO0FBQUEsUUFDN0MsYUFBYTtBQUFBLE1BQ2YsQ0FBQyxHQUFHO0FBQ0YsZUFBTyxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsTUFDL0I7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsWUFBWSxPQUFPLEVBQUUsR0FBRyxNQUFNO0FBQzVCLFlBQU0sRUFBRSxNQUFNLElBQUksTUFBTSxVQUFVO0FBQ2xDLGFBQVEsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFNO0FBQUEsSUFDdkM7QUFBQSxJQUVBLFlBQVksT0FBTyxFQUFFLElBQUksTUFBTSxNQUFNO0FBQ25DLFlBQU0sRUFBRSxNQUFNLElBQUksTUFBTSxVQUFVO0FBQ2xDLFlBQU0sTUFBTSxJQUFJLElBQUksS0FBSztBQUFBLElBQzNCO0FBQUEsSUFFQSxzQkFBc0IsT0FBTyxFQUFFLFVBQVUsTUFBTTtBQUM3QyxZQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sVUFBVTtBQUNsQyxZQUFNLFNBQWlCLENBQUM7QUFDeEIsdUJBQWlCLENBQUMsRUFBRSxLQUFLLEtBQUssTUFBTSxRQUFRO0FBQUEsUUFDMUMsYUFBYTtBQUFBLE1BQ2YsQ0FBQyxHQUFHO0FBQ0YsZUFBTyxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsTUFDL0I7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsZUFBZSxPQUFPLEVBQUUsR0FBRyxNQUFNO0FBQy9CLFlBQU0sRUFBRSxVQUFVLElBQUksTUFBTSxVQUFVO0FBQ3RDLGFBQVEsTUFBTSxVQUFVLFNBQVMsRUFBRSxLQUFNO0FBQUEsSUFDM0M7QUFBQSxJQUVBLGVBQWUsT0FBTyxFQUFFLElBQUksTUFBTSxNQUFNO0FBQ3RDLFlBQU0sRUFBRSxVQUFVLElBQUksTUFBTSxVQUFVO0FBQ3RDLFlBQU0sVUFBVSxJQUFJLElBQUksS0FBSztBQUFBLElBQy9CO0FBQUEsSUFFQSxrQkFBa0IsT0FBTyxFQUFFLElBQUksUUFBUSxNQUFNO0FBQzNDLFlBQU0sRUFBRSxVQUFVLElBQUksTUFBTSxVQUFVO0FBQ3RDLGFBQU8sNEJBQXFDO0FBQUEsUUFDMUM7QUFBQSxRQUNBO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxzQkFBc0IsR0FBRyxHQUFHLDhDQUE4QyxFQUFFO0FBQUEsUUFDNUUsc0JBQXNCLEdBQUcsR0FBRyxtRUFBbUUsRUFBRTtBQUFBLE1BQ25HLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxhQUFhLE9BQU8sRUFBRSxHQUFHLE1BQU07QUFDN0IsWUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLFVBQVU7QUFDbkMsYUFBUSxNQUFNLE9BQU8sU0FBUyxFQUFFLEtBQU07QUFBQSxJQUN4QztBQUFBLElBRUEsYUFBYSxPQUFPLEVBQUUsSUFBSSxNQUFNLE1BQU07QUFDcEMsWUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLFVBQVU7QUFDbkMsWUFBTSxPQUFPLElBQUksSUFBSSxLQUFLO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQ0Y7OztBQzFJQSxJQUFJO0FBQ0osSUFBSTtBQUVKLGVBQWUsS0FBSztBQUNsQixNQUFJLENBQUMsS0FBSztBQUNSLFVBQU0sTUFBTSxPQUFPLGFBQWtCO0FBQUEsRUFDdkM7QUFDQSxTQUFPO0FBQ1Q7QUFDQSxlQUFlLE9BQU87QUFDcEIsTUFBSSxDQUFDLE9BQU87QUFDVixZQUFRLE1BQU0sT0FBTyxNQUFXO0FBQUEsRUFDbEM7QUFDQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLGtCQUFrQjtBQUN6QixRQUFNLFFBQVEsb0JBQUksSUFBNEI7QUFFOUMsU0FBTyxlQUFlLGNBQWlCLE1BR3hCO0FBQ2IsUUFBSSxRQUFRLE1BQU0sSUFBSSxLQUFLLEdBQUc7QUFDOUIsUUFBSSxDQUFDLE9BQU87QUFDVixjQUFRLEVBQUUsUUFBUSxPQUFPLFNBQVMsQ0FBQyxFQUFFO0FBQ3JDLFlBQU0sSUFBSSxLQUFLLEtBQUssS0FBSztBQUFBLElBQzNCO0FBRUEsUUFBSSxNQUFNLFFBQVE7QUFDaEIsWUFBTSxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ25DLGNBQU0sUUFBUSxLQUFLLE9BQU87QUFBQSxNQUM1QixDQUFDO0FBQUEsSUFDSDtBQUVBLFVBQU0sU0FBUztBQUVmLFFBQUk7QUFDRixhQUFPLE1BQU0sS0FBSyxHQUFHO0FBQUEsSUFDdkIsVUFBRTtBQUNBLFlBQU0sT0FBTyxNQUFNLFFBQVEsTUFBTTtBQUNqQyxVQUFJLE1BQU07QUFDUixhQUFLO0FBQUEsTUFDUCxPQUFPO0FBQ0wsY0FBTSxTQUFTO0FBQ2YsY0FBTSxPQUFPLEtBQUssR0FBRztBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsWUFBZSxLQUFhO0FBQ25DLFFBQU0sV0FBVyxPQUFPLFNBQ3JCLE1BQU0sS0FBSyxHQUFHLEtBQUssS0FBSyxHQUFHLEdBQUcsT0FBTztBQUN4QyxRQUFNLGdCQUFnQixnQkFBZ0I7QUFFdEMsU0FBTztBQUFBLElBQ0wsTUFBTSxJQUFJLEtBQWdDO0FBQ3hDLFVBQUk7QUFDRixjQUFNLE9BQU8sT0FBTyxNQUFNLEdBQUcsR0FBRyxTQUFTLE1BQU0sU0FBUyxHQUFHLEdBQUcsT0FBTztBQUNyRSxlQUFPLEtBQUssTUFBTSxJQUFJO0FBQUEsTUFDeEIsUUFBUTtBQUNOLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTSxJQUFJLEtBQWEsT0FBeUI7QUFDOUMsWUFBTSxjQUFjO0FBQUEsUUFDbEI7QUFBQSxRQUNBLElBQUksWUFBWTtBQUNkLGdCQUFNLElBQUksTUFBTSxTQUFTLEdBQUc7QUFDNUIsZ0JBQU0sRUFBRSxPQUFPLFVBQVUsSUFBSSxNQUFNLEdBQUc7QUFDdEMsZ0JBQU0sRUFBRSxRQUFRLElBQUksTUFBTSxLQUFLO0FBQy9CLGdCQUFNLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUMzQyxnQkFBTSxVQUFVLEdBQUcsS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxRQUNuRDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU8sS0FBYSxTQUFpQztBQUNuRCxhQUFPLGNBQWM7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsSUFBSSxZQUFZO0FBQ2QsZ0JBQU0sSUFBSSxNQUFNLFNBQVMsR0FBRztBQUM1QixnQkFBTSxFQUFFLFVBQVUsT0FBTyxVQUFVLElBQUksTUFBTSxHQUFHO0FBQ2hELGdCQUFNLEVBQUUsUUFBUSxJQUFJLE1BQU0sS0FBSztBQUMvQixjQUFJO0FBQ0osY0FBSTtBQUNGLGtCQUFNLE9BQU8sTUFBTSxTQUFTLEdBQUcsT0FBTztBQUN0Qyx1QkFBVyxLQUFLLE1BQU0sSUFBSTtBQUFBLFVBQzVCLFFBQVE7QUFDTixrQkFBTSxJQUFJLE1BQU0sY0FBYyxHQUFHLEVBQUU7QUFBQSxVQUNyQztBQUNBLGdCQUFNLFVBQVUsRUFBRSxHQUFHLFVBQVUsR0FBRyxRQUFRO0FBQzFDLGdCQUFNLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUMzQyxnQkFBTSxVQUFVLEdBQUcsS0FBSyxVQUFVLFNBQVMsTUFBTSxDQUFDLENBQUM7QUFDbkQsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjtBQUVBLGVBQWUsZUFBa0IsS0FBMkI7QUFDMUQsUUFBTSxFQUFFLFNBQVMsU0FBUyxJQUFJLE1BQU0sR0FBRztBQUN2QyxRQUFNLEVBQUUsS0FBSyxJQUFJLE1BQU0sS0FBSztBQUM1QixNQUFJO0FBQ0osTUFBSTtBQUNGLFlBQVEsTUFBTSxRQUFRLEdBQUc7QUFBQSxFQUMzQixRQUFRO0FBQ04sV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFFBQU0sU0FBYyxDQUFDO0FBQ3JCLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFFBQUksQ0FBQyxLQUFLLFNBQVMsT0FBTyxHQUFHO0FBQzNCO0FBQUEsSUFDRjtBQUNBLFFBQUk7QUFDRixZQUFNLE9BQU8sTUFBTSxTQUFTLEtBQUssS0FBSyxJQUFJLEdBQUcsT0FBTztBQUNwRCxhQUFPLEtBQUssS0FBSyxNQUFNLElBQUksQ0FBTTtBQUFBLElBQ25DLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLGVBQWUsZ0JBQWdCLEtBQWE7QUFDMUMsUUFBTSxFQUFFLE9BQU8sV0FBVyxTQUFTLElBQUksTUFBTSxHQUFHO0FBQ2hELFFBQU0sRUFBRSxLQUFLLElBQUksTUFBTSxLQUFLO0FBQzVCLFFBQU0sZ0JBQWdCLEtBQUssS0FBSyxZQUFZO0FBQzVDLE1BQUk7QUFDRixVQUFNLFNBQVMsZUFBZSxPQUFPO0FBQUEsRUFDdkMsUUFBUTtBQUNOLFVBQU0sTUFBTSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDcEMsVUFBTSxVQUFVLGVBQWUsS0FBSztBQUFBLEVBQ3RDO0FBQ0Y7QUFFTyxTQUFTLGFBQWEsTUFBMEM7QUFDckUsUUFBTSxNQUFNLE1BQU0sT0FBTztBQUN6QixNQUFJLG1CQUF5QztBQUU3QyxRQUFNLGVBQWUsWUFBcUIsR0FBRyxHQUFHLFVBQVU7QUFDMUQsUUFBTSxlQUFlLFlBQXFCLEdBQUcsR0FBRyxVQUFVO0FBQzFELFFBQU0sWUFBWSxZQUFrQixHQUFHLEdBQUcsT0FBTztBQUNqRCxRQUFNLGVBQWUsWUFBcUIsR0FBRyxHQUFHLFVBQVU7QUFDMUQsUUFBTSxhQUFhLFlBQW1CLEdBQUcsR0FBRyxRQUFRO0FBQ3BELFFBQU0sYUFBYSxHQUFHLEdBQUc7QUFDekIsUUFBTSxVQUFVLEdBQUcsR0FBRztBQUV0QixXQUFTLFFBQVcsSUFBa0M7QUFDcEQsUUFBSSxDQUFDLGtCQUFrQjtBQUNyQix5QkFBbUIsZ0JBQWdCLEdBQUc7QUFBQSxJQUN4QztBQUNBLFdBQU8saUJBQWlCLEtBQUssRUFBRTtBQUFBLEVBQ2pDO0FBRUEsU0FBTztBQUFBLElBQ0wsZUFBZSxDQUFDLEVBQUUsR0FBRyxNQUFNLGFBQWEsSUFBSSxFQUFFO0FBQUEsSUFDOUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQzFCLFFBQVEsTUFBTSxhQUFhLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxJQUMzQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksUUFBUSxNQUMvQixRQUFRLE1BQU0sYUFBYSxPQUFPLElBQUksT0FBTyxDQUFDO0FBQUEsSUFFaEQsZUFBZSxDQUFDLEVBQUUsR0FBRyxNQUFNLGFBQWEsSUFBSSxFQUFFO0FBQUEsSUFDOUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQzFCLFFBQVEsTUFBTSxhQUFhLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxJQUMzQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksUUFBUSxNQUMvQixRQUFRLE1BQU0sYUFBYSxPQUFPLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDaEQseUJBQXlCLE9BQU8sRUFBRSxVQUFVLE1BQU07QUFDaEQsWUFBTSxNQUFNLE1BQU0sZUFBd0IsVUFBVTtBQUNwRCxhQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLFNBQVM7QUFBQSxJQUNwRDtBQUFBLElBRUEsWUFBWSxDQUFDLEVBQUUsR0FBRyxNQUFNLFVBQVUsSUFBSSxFQUFFO0FBQUEsSUFDeEMsWUFBWSxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQU0sUUFBUSxNQUFNLFVBQVUsSUFBSSxJQUFJLEtBQUssQ0FBQztBQUFBLElBQ3JFLHNCQUFzQixPQUFPLEVBQUUsVUFBVSxNQUFNO0FBQzdDLFlBQU0sTUFBTSxNQUFNLGVBQXFCLE9BQU87QUFDOUMsYUFBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxTQUFTO0FBQUEsSUFDcEQ7QUFBQSxJQUVBLGVBQWUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxhQUFhLElBQUksRUFBRTtBQUFBLElBQzlDLGVBQWUsQ0FBQyxFQUFFLElBQUksTUFBTSxNQUMxQixRQUFRLE1BQU0sYUFBYSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDM0Msa0JBQWtCLENBQUMsRUFBRSxJQUFJLFFBQVEsTUFDL0IsUUFBUSxNQUFNLGFBQWEsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUFBLElBRWhELGFBQWEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxXQUFXLElBQUksRUFBRTtBQUFBLElBQzFDLGFBQWEsQ0FBQyxFQUFFLElBQUksTUFBTSxNQUFNLFFBQVEsTUFBTSxXQUFXLElBQUksSUFBSSxLQUFLLENBQUM7QUFBQSxFQUN6RTtBQUNGOzs7QUNyTU8sU0FBUyxzQkFBK0I7QUFDN0MsU0FBTyxDQUFDLENBQUMsUUFBUSxJQUFJO0FBQ3ZCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
__require,
|
|
35
|
+
__commonJS,
|
|
36
|
+
__toESM
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/rpc/base-path.ts
|
|
2
|
+
function basePathForAgent(agent) {
|
|
3
|
+
return `/api/agents/${agent}`;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
basePathForAgent
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JwYy9iYXNlLXBhdGgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB0eXBlIEJhc2VQYXRoID0gYC9hcGkvYWdlbnRzL1thZ2VudF1gO1xuZXhwb3J0IHR5cGUgU2Vzc2lvblBhdGggPSBgJHtCYXNlUGF0aCB8IChzdHJpbmcgJiB7fSl9L1tzZXNzaW9uSWRdYDtcbmV4cG9ydCB0eXBlIFJlY29ubmVjdFBhdGggPSBgJHtTZXNzaW9uUGF0aCB8IChzdHJpbmcgJiB7fSl9L3JlY29ubmVjdGA7XG5leHBvcnQgdHlwZSBJbnRlcnJ1cHRQYXRoID0gYCR7U2Vzc2lvblBhdGggfCAoc3RyaW5nICYge30pfS9pbnRlcnJ1cHRgO1xuXG5leHBvcnQgdHlwZSBQYXRoID0gU2Vzc2lvblBhdGggfCBSZWNvbm5lY3RQYXRoIHwgSW50ZXJydXB0UGF0aDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VQYXRoRm9yQWdlbnQoYWdlbnQ6IHN0cmluZykge1xuICByZXR1cm4gYC9hcGkvYWdlbnRzLyR7YWdlbnR9YCBhcyBjb25zdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFPTyxTQUFTLGlCQUFpQixPQUFlO0FBQzlDLFNBQU8sZUFBZSxLQUFLO0FBQzdCOyIsCiAgIm5hbWVzIjogW10KfQo=
|