@dbx-tools/appkit-mastra 0.9.79 → 0.9.93

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 CHANGED
@@ -348,14 +348,11 @@ skips that gate for local iteration.
348
348
 
349
349
  Auto-created agent workspaces use the Node `@pydantic/monty` runtime by default,
350
350
  so Python command tools work without a workspace preview or remote API.
351
- Monty loads a platform optional native package (`@pydantic/monty-darwin-arm64`,
352
- `@pydantic/monty-linux-x64-gnu`, and the other published triples). npm can skip
353
- those nested optionalDependencies; on first start this package checks for the
354
- current platform package and, if it is missing, runs `npm install <pkg>@<monty
355
- version> --no-save` in the process working directory (or `bun add --no-save`
356
- when npm is not on PATH). Databricks App deploys should still declare the
357
- Linux GNU package as a direct dependency so the container install does not rely
358
- on that recovery.
351
+ Monty's native subprocess worker is preferred because Bun's Linux
352
+ `worker_threads` support cannot reliably host the WASM worker. The WASM entry is
353
+ loaded only when native import fails. Databricks App staging declares the Linux
354
+ native package directly so deployment does not depend on transitive optional
355
+ dependency installation.
359
356
 
360
357
  Opt into the Beta
361
358
  [Databricks Sandbox](https://docs.databricks.com/aws/en/compute/serverless/sandbox)
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
6
- export const PACKAGE_VERSION = "0.9.79";
6
+ export const PACKAGE_VERSION = "0.9.93";
7
7
  export * as agents from "./src/agents.ts";
8
8
  export * as chart from "./src/chart.ts";
9
9
  export * as chat from "./src/chat.ts";
@@ -17,7 +17,6 @@ export * as mcp from "./src/mcp.ts";
17
17
  export * as memory from "./src/memory.ts";
18
18
  export * as mlflow from "./src/mlflow.ts";
19
19
  export * as model from "./src/model.ts";
20
- export * as montyNative from "./src/monty-native.ts";
21
20
  export * as montySandbox from "./src/monty-sandbox.ts";
22
21
  export * as observability from "./src/observability.ts";
23
22
  export * as openapiTool from "./src/openapi-tool.ts";
@@ -61,7 +60,6 @@ export { AgentTraceSpanProcessor } from "./src/mlflow.ts";
61
60
  export type { AppMlflowTraceInfo, LogFeedbackParams } from "./src/mlflow.ts";
62
61
  export { RESPONSES_PROVIDER_OPTIONS } from "./src/model.ts";
63
62
  export type { BuildModelOverrides } from "./src/model.ts";
64
- export type { MontyNativeInstallResult, MontyNativeInstaller, EnsureMontyNativeBindingOptions } from "./src/monty-native.ts";
65
63
  export { MontySandbox } from "./src/monty-sandbox.ts";
66
64
  export type { MontySandboxOptions } from "./src/monty-sandbox.ts";
67
65
  export type { BuildObservabilityOptions } from "./src/observability.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
2
- export declare const PACKAGE_VERSION = "0.9.79";
2
+ export declare const PACKAGE_VERSION = "0.9.93";
3
3
  export * as agents from "./src/agents.ts";
4
4
  export * as chart from "./src/chart.ts";
5
5
  export * as chat from "./src/chat.ts";
@@ -13,7 +13,6 @@ export * as mcp from "./src/mcp.ts";
13
13
  export * as memory from "./src/memory.ts";
14
14
  export * as mlflow from "./src/mlflow.ts";
15
15
  export * as model from "./src/model.ts";
16
- export * as montyNative from "./src/monty-native.ts";
17
16
  export * as montySandbox from "./src/monty-sandbox.ts";
18
17
  export * as observability from "./src/observability.ts";
19
18
  export * as openapiTool from "./src/openapi-tool.ts";
@@ -57,7 +56,6 @@ export { AgentTraceSpanProcessor } from "./src/mlflow.ts";
57
56
  export type { AppMlflowTraceInfo, LogFeedbackParams } from "./src/mlflow.ts";
58
57
  export { RESPONSES_PROVIDER_OPTIONS } from "./src/model.ts";
59
58
  export type { BuildModelOverrides } from "./src/model.ts";
60
- export type { MontyNativeInstallResult, MontyNativeInstaller, EnsureMontyNativeBindingOptions } from "./src/monty-native.ts";
61
59
  export { MontySandbox } from "./src/monty-sandbox.ts";
62
60
  export type { MontySandboxOptions } from "./src/monty-sandbox.ts";
63
61
  export type { BuildObservabilityOptions } from "./src/observability.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
5
- export const PACKAGE_VERSION = "0.9.79";
5
+ export const PACKAGE_VERSION = "0.9.93";
6
6
  export * as agents from "./src/agents.js";
7
7
  export * as chart from "./src/chart.js";
8
8
  export * as chat from "./src/chat.js";
@@ -16,7 +16,6 @@ export * as mcp from "./src/mcp.js";
16
16
  export * as memory from "./src/memory.js";
17
17
  export * as mlflow from "./src/mlflow.js";
18
18
  export * as model from "./src/model.js";
19
- export * as montyNative from "./src/monty-native.js";
20
19
  export * as montySandbox from "./src/monty-sandbox.js";
21
20
  export * as observability from "./src/observability.js";
22
21
  export * as openapiTool from "./src/openapi-tool.js";
@@ -67,4 +66,4 @@ export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR, CHAT
67
66
  export { MLFLOW_TRACE_TAG_PREFIX, MLFLOW_AGENT_TAG, MLFLOW_GENIE_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_LOCAL_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG_ATTR, APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_LOCAL_TAG_ATTR } from "./src/trace-attributes.js";
68
67
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.js";
69
68
  export * from "./exports.js";
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7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LENBQUM7QUFFckcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhELE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuVSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6VCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45Ljc5XCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjaGF0IGZyb20gXCIuL3NyYy9jaGF0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBldmFsdWF0aW9uIGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG1vbnR5TmF0aXZlIGZyb20gXCIuL3NyYy9tb250eS1uYXRpdmUudHNcIjtcbmV4cG9ydCAqIGFzIG1vbnR5U2FuZGJveCBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0ICogYXMgb2JzZXJ2YWJpbGl0eSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFwaVRvb2wgZnJvbSBcIi4vc3JjL29wZW5hcGktdG9vbC50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb2Nlc3NvcnMgZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCAqIGFzIHJlbW90ZVNraWxscyBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0ICogYXMgcmVzdCBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0ICogYXMgc2FuZGJveCBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0ICogYXMgc2VydmVyIGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmcgZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmdTYW5pdGl6ZSBmcm9tIFwiLi9zcmMvc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxDYWNoZSBmcm9tIFwiLi9zcmMvc2tpbGwtY2FjaGUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsUGF0aHMgZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgKiBhcyBza2lsbFNlYXJjaCBmcm9tIFwiLi9zcmMvc2tpbGwtc2VhcmNoLnRzXCI7XG5leHBvcnQgKiBhcyBzdGF0ZW1lbnQgZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZVNjaGVtYSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHN0eWxlIGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRlbGVtZXRyeSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgKiBhcyB0cmFjZUF0dHJpYnV0ZXMgZnJvbSBcIi4vc3JjL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcbmV4cG9ydCAqIGFzIHZhbGlkYXRpb24gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHdvcmtzcGFjZXMgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCAqIGFzIHdyaXRlciBmcm9tIFwiLi9zcmMvd3JpdGVyLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19BR0VOVF9JRCwgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFUb29scywgQXBwS2l0VG9vbE9wdGlvbnMsIFRvb2xraXRPcHRpb25zLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIsIE1hc3RyYVBsdWdpbnMsIE1hc3RyYVRvb2xzRm4sIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIsIE1hc3RyYUFnZW50RGVmaW5pdGlvbiwgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGUsIE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlLCBBZ2VudERlZmF1bHRNb2RlbCwgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9zcmMvYWdlbnRzLnRzXCI7XG5leHBvcnQgeyBjaGFydFBsYW5TY2hlbWEsIGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIGNoYXJ0VG9vbE91dHB1dFNjaGVtYSB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGFydFBsYW5uZXJSZXF1ZXN0LCBDaGFydFRvb2xPdXRwdXQsIFByZXBhcmVDaGFydE9wdGlvbnMsIEZldGNoQ2hhcnRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIE1BU1RSQV9VU0VSX05BTUVfS0VZLCBNQVNUUkFfVVNFUl9FTUFJTF9LRVksIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSwgTUFTVFJBX1NDT1BFU19LRVksIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTLCBNQVNUUkFfQ09ORklHX1NDSEVNQSB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB0eXBlIHsgVXNlciwgTWFzdHJhTWVtb3J5Q29uZmlnLCBNYXN0cmFTa2lsbFNlYXJjaENvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFFdmFsRHJpdmVyT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9ldmFsdWF0aW9uLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlciB9IGZyb20gXCIuL3NyYy9maWxlc3lzdGVtcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfR0VOSUVfQUxJQVMsIEdFTklFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZW5pZVNwYWNlQ29uZmlnLCBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0IHsgSURFTlRJVFlfRU5WLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFLCBVU0VSX0lEX0hFQURFUiwgVVNFUl9FTUFJTF9IRUFERVIsIHJlcXVlc3RVc2VySWQsIHJlcXVlc3RVc2VyRW1haWwsIHVzZVNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhSWRlbnRpdHlNb2RlIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVkTWNwIH0gZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0IHsgTWVtb3J5QnVpbGRlciB9IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCB7IEFnZW50VHJhY2VTcGFuUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBcHBNbGZsb3dUcmFjZUluZm8sIExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHsgUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVpbGRNb2RlbE92ZXJyaWRlcyB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb250eU5hdGl2ZUluc3RhbGxSZXN1bHQsIE1vbnR5TmF0aXZlSW5zdGFsbGVyLCBFbnN1cmVNb250eU5hdGl2ZUJpbmRpbmdPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21vbnR5LW5hdGl2ZS50c1wiO1xuZXhwb3J0IHsgTW9udHlTYW5kYm94IH0gZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9udHlTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBPcGVuQXBpSHR0cE1ldGhvZCwgT3BlbkFwaVRvb2wsIE9wZW5BcGlUb29sc09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3BlbmFwaS10b29sLnRzXCI7XG5leHBvcnQgeyBNYXN0cmFQbHVnaW4sIG1hc3RyYSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9zcmMvcHJvY2Vzc29ycy50c1wiO1xuZXhwb3J0IHsgQUlUT09MU19TT1VSQ0UgfSBmcm9tIFwiLi9zcmMvcmVtb3RlLXNraWxscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBaVRvb2xzU291cmNlLCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFJlbW90ZVNraWxsU291cmNlLCBSZW1vdGVTa2lsbHNPcHRpb24sIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsIFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzLCBSZW1vdGVTa2lsbENhY2hlRW50cnksIFJlbW90ZVNraWxsc01ldGFkYXRhIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0ZldGNoSW5pdCB9IGZyb20gXCIuL3NyYy9yZXN0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NTYW5kYm94T3B0aW9ucywgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NhbmRib3gudHNcIjtcbmV4cG9ydCB7IE1hc3RyYVNlcnZlciB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXR0cmlidXRlZElkZW50aXR5LCBNYXN0cmFBcGlHYXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB7IE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbE92ZXJyaWRlUmVxdWVzdCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX1dPUktTUEFDRV9TS0lMTF9DQUNIRV9UVExfTVMsIFdvcmtzcGFjZVNraWxsQ2F0YWxvZ3VlIH0gZnJvbSBcIi4vc3JjL3NraWxsLWNhY2hlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNraWxsQ2F0YWxvZ3VlRW50cnksIFNraWxsQ2F0YWxvZ3VlLCBTa2lsbENhdGFsb2d1ZVNvdXJjZSwgU2tpbGxDYXRhbG9ndWVGaWxlRW50cnksIFdvcmtzcGFjZVNraWxsQ2F0YWxvZ3VlT3B0aW9ucywgU2tpbGxDYXRhbG9ndWVSZXNvbHZlQ29udGV4dCwgU2tpbGxDYXRhbG9ndWVSZXNvbHZlciB9IGZyb20gXCIuL3NyYy9za2lsbC1jYWNoZS50c1wiO1xuZXhwb3J0IHsgQVNTSVNUQU5UX1NIQVJFRF9TS0lMTFNfUEFUSCB9IGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0IHsgQ2F0YWxvZ3VlU2tpbGxTZWFyY2hQcm9jZXNzb3IgfSBmcm9tIFwiLi9zcmMvc2tpbGwtc2VhcmNoLnRzXCI7XG5leHBvcnQgdHlwZSB7IENhdGFsb2d1ZVNraWxsU2VhcmNoUHJvY2Vzc29yT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9za2lsbC1zZWFyY2gudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiwgQ0hBVF9NRVNTQUdFU19BVFRSLCBDSEFUX1JFU1BPTlNFX0FUVFIsIENIQVRfSURFTlRJVFlfQVRUUiwgQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIE1MRkxPV19VU0VSX0FUVFIsIE1MRkxPV19TRVNTSU9OX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucywgQ2hhdFRyYWNlVGFnVmFsdWUgfSBmcm9tIFwiLi9zcmMvdGVsZW1ldHJ5LnRzXCI7XG5leHBvcnQgeyBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCwgTUxGTE9XX0FHRU5UX1RBRywgTUxGTE9XX0dFTklFX1RBRywgTUxGTE9XX09CT19BVVRIX1RBRywgTUxGTE9XX1NQX0FVVEhfVEFHLCBNTEZMT1dfTE9DQUxfVEFHLCBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUiwgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLCBNTEZMT1dfU1BfQVVUSF9UQUdfQVRUUiwgTUxGTE9XX0xPQ0FMX1RBR19BVFRSIH0gZnJvbSBcIi4vc3JjL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2NoZW1hSXNzdWVzIH0gZnJvbSBcIi4vc3JjL3ZhbGlkYXRpb24udHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfU0tJTExfRk9MREVSUyB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZU1vdW50Q29udGV4dCwgU2tpbGxGb2xkZXJWYWx1ZSwgU2tpbGxGb2xkZXJPcHRpb25zLCBXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbiwgV29ya3NwYWNlTW91bnRSZXNvbHZlciwgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSwgV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiwgQ3JlYXRlV29ya3NwYWNlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7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LHNCQUFzQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFblUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFelQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFNUQsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS45M1wiO1xuZXhwb3J0ICogYXMgYWdlbnRzIGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCAqIGFzIGNoYXJ0IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0ICogYXMgY2hhdCBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0ICogYXMgZXZhbHVhdGlvbiBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgZmlsZXN5c3RlbXMgZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgKiBhcyBnZW5pZSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgbWNwIGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCAqIGFzIG1lbW9yeSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgKiBhcyBtbGZsb3cgZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWwgZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgKiBhcyBtb250eVNhbmRib3ggZnJvbSBcIi4vc3JjL21vbnR5LXNhbmRib3gudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5hcGlUb29sIGZyb20gXCIuL3NyYy9vcGVuYXBpLXRvb2wudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNhbmRib3ggZnJvbSBcIi4vc3JjL3NhbmRib3gudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsQ2FjaGUgZnJvbSBcIi4vc3JjL3NraWxsLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBza2lsbFBhdGhzIGZyb20gXCIuL3NyYy9za2lsbC1wYXRocy50c1wiO1xuZXhwb3J0ICogYXMgc2tpbGxTZWFyY2ggZnJvbSBcIi4vc3JjL3NraWxsLXNlYXJjaC50c1wiO1xuZXhwb3J0ICogYXMgc3RhdGVtZW50IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCAqIGFzIHN0b3JhZ2VTY2hlbWEgZnJvbSBcIi4vc3JjL3N0b3JhZ2Utc2NoZW1hLnRzXCI7XG5leHBvcnQgKiBhcyBzdHlsZSBmcm9tIFwiLi9zcmMvc3R5bGUudHNcIjtcbmV4cG9ydCAqIGFzIHN1bW1hcml6ZSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgKiBhcyB0ZWxlbWV0cnkgZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0ICogYXMgdHJhY2VBdHRyaWJ1dGVzIGZyb20gXCIuL3NyYy90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB2YWxpZGF0aW9uIGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VzIGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBhcyB3cml0ZXIgZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlLCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSwgQWdlbnREZWZhdWx0TW9kZWwsIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhcnRQbGFubmVyUmVxdWVzdCwgQ2hhcnRUb29sT3V0cHV0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhU2tpbGxTZWFyY2hDb25maWcsIE1hc3RyYU1jcENvbmZpZywgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cywgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsIHN0YXRlbWVudERhdGFEZWZhdWx0cywgY2hhcnRGZXRjaERlZmF1bHRzLCBmZWVkYmFja1dyaXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9zcmMvZGVmYXVsdHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRXZhbERyaXZlck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZXZhbHVhdGlvbi50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgeyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvciB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXBwTWxmbG93VHJhY2VJbmZvLCBMb2dGZWVkYmFja1BhcmFtcyB9IGZyb20gXCIuL3NyYy9tbGZsb3cudHNcIjtcbmV4cG9ydCB7IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkTW9kZWxPdmVycmlkZXMgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL3NyYy9tb250eS1zYW5kYm94LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vbnR5U2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbW9udHktc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE9ic2VydmFiaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCB0eXBlIHsgT3BlbkFwaUh0dHBNZXRob2QsIE9wZW5BcGlUb29sLCBPcGVuQXBpVG9vbHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZW5hcGktdG9vbC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhUGx1Z2luLCBtYXN0cmEgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NhbmRib3ggfSBmcm9tIFwiLi9zcmMvc2FuZGJveC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnMsIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zYW5kYm94LnRzXCI7XG5leHBvcnQgeyBNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF0dHJpYnV0ZWRJZGVudGl0eSwgTWFzdHJhQXBpR2F0ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgeyBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxPdmVycmlkZVJlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9XT1JLU1BBQ0VfU0tJTExfQ0FDSEVfVFRMX01TLCBXb3Jrc3BhY2VTa2lsbENhdGFsb2d1ZSB9IGZyb20gXCIuL3NyYy9za2lsbC1jYWNoZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTa2lsbENhdGFsb2d1ZUVudHJ5LCBTa2lsbENhdGFsb2d1ZSwgU2tpbGxDYXRhbG9ndWVTb3VyY2UsIFNraWxsQ2F0YWxvZ3VlRmlsZUVudHJ5LCBXb3Jrc3BhY2VTa2lsbENhdGFsb2d1ZU9wdGlvbnMsIFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZUNvbnRleHQsIFNraWxsQ2F0YWxvZ3VlUmVzb2x2ZXIgfSBmcm9tIFwiLi9zcmMvc2tpbGwtY2FjaGUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IENhdGFsb2d1ZVNraWxsU2VhcmNoUHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3NraWxsLXNlYXJjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDYXRhbG9ndWVTa2lsbFNlYXJjaFByb2Nlc3Nvck9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2tpbGwtc2VhcmNoLnRzXCI7XG5leHBvcnQgeyBTVEFURU1FTlRfUk9XX0NBUCB9IGZyb20gXCIuL3NyYy9zdGF0ZW1lbnQudHNcIjtcbmV4cG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0IHsgVElUTEVfSU5TVFJVQ1RJT05TIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTdW1tYXJpemVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3N1bW1hcml6ZS50c1wiO1xuZXhwb3J0IHsgVFJBQ0VfSU9fTElNSVQsIE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCBNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIENIQVRfTUVTU0FHRVNfQVRUUiwgQ0hBVF9SRVNQT05TRV9BVFRSLCBDSEFUX0lERU5USVRZX0FUVFIsIENIQVRfR0VOSUVfVVNFRF9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBNTEZMT1dfVVNFUl9BVFRSLCBNTEZMT1dfU0VTU0lPTl9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFIH0gZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMsIENoYXRUcmFjZVRhZ1ZhbHVlIH0gZnJvbSBcIi4vc3JjL3RlbGVtZXRyeS50c1wiO1xuZXhwb3J0IHsgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsIE1MRkxPV19BR0VOVF9UQUcsIE1MRkxPV19HRU5JRV9UQUcsIE1MRkxPV19PQk9fQVVUSF9UQUcsIE1MRkxPV19TUF9BVVRIX1RBRywgTUxGTE9XX0xPQ0FMX1RBRywgTUxGTE9XX0FHRU5UX1RBR19BVFRSLCBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIsIE1MRkxPV19PQk9fQVVUSF9UQUdfQVRUUiwgTUxGTE9XX1NQX0FVVEhfVEFHX0FUVFIsIE1MRkxPV19MT0NBTF9UQUdfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNjaGVtYUlzc3VlcyB9IGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX1NLSUxMX0ZPTERFUlMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VNb3VudENvbnRleHQsIFNraWxsRm9sZGVyVmFsdWUsIFNraWxsRm9sZGVyT3B0aW9ucywgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24sIFdvcmtzcGFjZU1vdW50UmVzb2x2ZXIsIERlZmF1bHRTa2lsbEZvbGRlck5hbWUsIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24sIENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlcy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Pydantic Monty fallback for Mastra command execution.
3
3
  *
4
- * Uses the Node subprocess-worker build of Monty. It executes Python source
4
+ * Prefers Monty's native Node subprocess workers and falls back to its WASM
5
+ * workers when the native package is unavailable. It executes Python source
5
6
  * with no host filesystem, network, environment, shell, or third-party package
6
- * access unless a future caller explicitly adds those capabilities.
7
+ * access.
7
8
  *
8
9
  * @module
9
10
  */
@@ -21,7 +22,7 @@ export interface MontySandboxOptions {
21
22
  /** Type-check each Python snippet before running it. Defaults to false. */
22
23
  typeCheck?: boolean;
23
24
  }
24
- /** Python-only, deny-by-default sandbox backed by Monty's Node worker pool. */
25
+ /** Python-only, deny-by-default sandbox backed by Monty's selected worker pool. */
25
26
  export declare class MontySandbox implements WorkspaceSandbox {
26
27
  readonly id: string;
27
28
  readonly name: string;
@@ -1,29 +1,56 @@
1
1
  /**
2
2
  * Pydantic Monty fallback for Mastra command execution.
3
3
  *
4
- * Uses the Node subprocess-worker build of Monty. It executes Python source
4
+ * Prefers Monty's native Node subprocess workers and falls back to its WASM
5
+ * workers when the native package is unavailable. It executes Python source
5
6
  * with no host filesystem, network, environment, shell, or third-party package
6
- * access unless a future caller explicitly adds those capabilities.
7
+ * access.
7
8
  *
8
9
  * @module
9
10
  */
10
- import { errorUtils, functionUtils } from "@dbx-tools/shared-core";
11
- import { ensureMontyNativeBinding } from "./monty-native.js";
11
+ import { configUtils } from "@dbx-tools/core";
12
+ import { errorUtils, functionUtils, log } from "@dbx-tools/shared-core";
12
13
  const DEFAULT_COMMAND_TIMEOUT_MS = 30_000;
13
14
  const DEFAULT_MAX_MEMORY_BYTES = 10_000_000;
14
- const montyModule = functionUtils.memoize(async () => {
15
- await ensureMontyNativeBinding();
16
- return import("@pydantic/monty/node");
17
- });
18
- const montyPool = functionUtils.memoize(async () => {
19
- const { Monty } = await montyModule();
20
- return Monty.create({
21
- minProcesses: 1,
22
- maxProcesses: 4,
23
- requestTimeout: 35,
24
- });
15
+ const NATIVE_MONTY_TARGET = {
16
+ name: "native Monty",
17
+ load: () => import("@pydantic/monty/node"),
18
+ };
19
+ const WASM_MONTY_TARGET = {
20
+ name: "WASM Monty",
21
+ load: () => import("@pydantic/monty/wasm"),
22
+ };
23
+ const logger = log.logger("mastra/monty");
24
+ const montyContext = functionUtils.memoize(async () => {
25
+ const errors = [];
26
+ const targets = configUtils.boolean(undefined, "MONTY_FORCE_WASM")
27
+ ? [WASM_MONTY_TARGET]
28
+ : [NATIVE_MONTY_TARGET, WASM_MONTY_TARGET];
29
+ for (const target of targets) {
30
+ try {
31
+ const module = await target.load();
32
+ logger.debug(`${target.name} module available`);
33
+ const pool = await module.Monty.create({
34
+ minProcesses: 1,
35
+ maxProcesses: 4,
36
+ requestTimeout: 35,
37
+ });
38
+ logger.debug(`${target.name} pool created`);
39
+ return {
40
+ crashedError: module.MontyCrashedError,
41
+ pool,
42
+ };
43
+ }
44
+ catch (error) {
45
+ errors.push(errorUtils.toError(error));
46
+ logger.debug(`${target.name} unavailable`, {
47
+ error: errorUtils.errorMessage(error),
48
+ });
49
+ }
50
+ }
51
+ throw new AggregateError(errors, "Failed to create Monty pool");
25
52
  });
26
- /** Python-only, deny-by-default sandbox backed by Monty's Node worker pool. */
53
+ /** Python-only, deny-by-default sandbox backed by Monty's selected worker pool. */
27
54
  export class MontySandbox {
28
55
  id;
29
56
  name;
@@ -49,7 +76,7 @@ export class MontySandbox {
49
76
  this.status = "starting";
50
77
  this.error = undefined;
51
78
  try {
52
- await montyPool();
79
+ await montyContext();
53
80
  this.status = "running";
54
81
  }
55
82
  catch (caught) {
@@ -87,7 +114,7 @@ export class MontySandbox {
87
114
  throw options.abortSignal.reason;
88
115
  await this.start();
89
116
  const timeout = options.timeout ?? this.commandTimeoutMs;
90
- const pool = await montyPool();
117
+ const pool = (await montyContext()).pool;
91
118
  const session = await checkoutSession(pool, {
92
119
  limits: {
93
120
  maxFeedDurationSecs: Math.max(0.001, timeout / 1_000),
@@ -134,8 +161,8 @@ export class MontySandbox {
134
161
  }
135
162
  const message = errorUtils.errorMessage(caught);
136
163
  output.emit("stderr", output.stderr.value ? `\n${message}` : message);
137
- const { MontyCrashedError } = await montyModule();
138
- const timedOut = caught instanceof MontyCrashedError && caught.timedOut;
164
+ const { crashedError } = await montyContext();
165
+ const timedOut = caught instanceof crashedError && caught.timedOut;
139
166
  return {
140
167
  command,
141
168
  args,
@@ -332,4 +359,10 @@ function failedResult(command, args, started, stderr) {
332
359
  executionTimeMs: performance.now() - started,
333
360
  };
334
361
  }
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3RCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUU1QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ25ELE1BQU0sd0JBQXdCLEVBQUUsQ0FBQztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQXdCLEVBQUU7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ2xCLFlBQVksRUFBRSxDQUFDO1FBQ2YsWUFBWSxFQUFFLENBQUM7UUFDZixjQUFjLEVBQUUsRUFBRTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQWdCSCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLFlBQVk7SUFDZCxFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLE1BQU0sR0FBK0IsU0FBUyxDQUFDO0lBQy9DLEtBQUssQ0FBVTtJQUVFLGdCQUFnQixDQUFTO0lBQ3pCLGNBQWMsQ0FBUztJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMs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LE1BQWUsRUFBRSxFQUFFO1lBQ2xCLElBQUksT0FBTztnQkFBRSxPQUFPO1lBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQStCO0lBQ2xELE9BQU8sTUFBTSxFQUFFLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE9BQWUsRUFDZixJQUFjLEVBQ2QsT0FBZSxFQUNmLE1BQWM7SUFFZCxPQUFPO1FBQ0wsT0FBTztRQUNQLElBQUk7UUFDSixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNO1FBQ04sZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO0tBQzdDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQeWRhbnRpYyBNb250eSBmYWxsYmFjayBmb3IgTWFzdHJhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIFVzZXMgdGhlIE5vZGUgc3VicHJvY2Vzcy13b3JrZXIgYnVpbGQgb2YgTW9udHkuIEl0IGV4ZWN1dGVzIFB5dGhvbiBzb3VyY2VcbiAqIHdpdGggbm8gaG9zdCBmaWxlc3lzdGVtLCBuZXR3b3JrLCBlbnZpcm9ubWVudCwgc2hlbGwsIG9yIHRoaXJkLXBhcnR5IHBhY2thZ2VcbiAqIGFjY2VzcyB1bmxlc3MgYSBmdXR1cmUgY2FsbGVyIGV4cGxpY2l0bHkgYWRkcyB0aG9zZSBjYXBhYmlsaXRpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGVycm9yVXRpbHMsIGZ1bmN0aW9uVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0LFxuICBFeGVjdXRlQ29tbWFuZE9wdGlvbnMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGVja291dE9wdGlvbnMsIE1vbnR5IGFzIE1vbnR5UG9vbCwgTW9udHlTZXNzaW9uIH0gZnJvbSBcIkBweWRhbnRpYy9tb250eS9ub2RlXCI7XG5cbmltcG9ydCB7IGVuc3VyZU1vbnR5TmF0aXZlQmluZGluZyB9IGZyb20gXCIuL21vbnR5LW5hdGl2ZS50c1wiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5cbmNvbnN0IG1vbnR5TW9kdWxlID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZW5zdXJlTW9udHlOYXRpdmVCaW5kaW5nKCk7XG4gIHJldHVybiBpbXBvcnQoXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiKTtcbn0pO1xuY29uc3QgbW9udHlQb29sID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPE1vbnR5UG9vbD4gPT4ge1xuICBjb25zdCB7IE1vbnR5IH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICByZXR1cm4gTW9udHkuY3JlYXRlKHtcbiAgICBtaW5Qcm9jZXNzZXM6IDEsXG4gICAgbWF4UHJvY2Vzc2VzOiA0LFxuICAgIHJlcXVlc3RUaW1lb3V0OiAzNSxcbiAgfSk7XG59KTtcblxuLyoqIFJlc291cmNlIGNvbnRyb2xzIGZvciB0aGUgTW9udHkgUHl0aG9uIGZhbGxiYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb250eVNhbmRib3hPcHRpb25zIHtcbiAgLyoqIE1hc3RyYSBwcm92aWRlciBpZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGV4ZWN1dGlvbiB0aW1lb3V0LiBQZXItY2FsbCBgb3B0aW9ucy50aW1lb3V0YCB3aW5zLiAqL1xuICBjb21tYW5kVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBNb250eSBoZWFwIGJ5dGVzIGZvciBvbmUgY2hlY2tvdXQuICovXG4gIG1heE1lbW9yeUJ5dGVzPzogbnVtYmVyO1xuICAvKiogVHlwZS1jaGVjayBlYWNoIFB5dGhvbiBzbmlwcGV0IGJlZm9yZSBydW5uaW5nIGl0LiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgdHlwZUNoZWNrPzogYm9vbGVhbjtcbn1cblxuLyoqIFB5dGhvbi1vbmx5LCBkZW55LWJ5LWRlZmF1bHQgc2FuZGJveCBiYWNrZWQgYnkgTW9udHkncyBOb2RlIHdvcmtlciBwb29sLiAqL1xuZXhwb3J0IGNsYXNzIE1vbnR5U2FuZGJveCBpbXBsZW1lbnRzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyID0gXCJtb250eVwiO1xuICBzdGF0dXM6IFdvcmtzcGFjZVNhbmRib3hbXCJzdGF0dXNcIl0gPSBcInBlbmRpbmdcIjtcbiAgZXJyb3I/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4TWVtb3J5Qnl0ZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlQ2hlY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSBsYXN0VXNlZEF0PzogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb250eVNhbmRib3hPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBcIm1vbnR5XCI7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lID8/IFwiUHlkYW50aWMgTW9udHlcIjtcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0TXMgPSBvcHRpb25zLmNvbW1hbmRUaW1lb3V0TXMgPz8gREVGQVVMVF9DT01NQU5EX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5tYXhNZW1vcnlCeXRlcyA9IG9wdGlvbnMubWF4TWVtb3J5Qnl0ZXMgPz8gREVGQVVMVF9NQVhfTUVNT1JZX0JZVEVTO1xuICAgIHRoaXMudHlwZUNoZWNrID0gb3B0aW9ucy50eXBlQ2hlY2sgPz8gZmFsc2U7XG4gIH1cblxuICAvKiogV2FybSB0aGUgc2hhcmVkIGNyYXNoLWlzb2xhdGVkIHdvcmtlciBwb29sLiAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwicnVubmluZ1wiKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0YXJ0aW5nXCI7XG4gICAgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9udHlQb29sKCk7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwicnVubmluZ1wiO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1Z2h0KTtcbiAgICAgIHRocm93IGNhdWdodDtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHByb2Nlc3Mtd2lkZSBwb29sIHN0YXlzIHdhcm07IHRoaXMgaW5zdGFuY2UgY2FycmllcyBubyBvcGVuIHNlc3Npb24uICovXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgfVxuXG4gIC8qKiBUaGUgcHJvY2Vzcy13aWRlIHBvb2wgc3RheXMgd2FybTsgZWFjaCBjb21tYW5kIGNsb3NlcyBpdHMgb3duIGNoZWNrb3V0LiAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95ZWRcIjtcbiAgfVxuXG4gIC8qKiBNb250eSBzZXNzaW9ucyBhcmUgZXBoZW1lcmFsIGFuZCBkbyBub3QgcHJvdmlkZSBwZXJzaXN0ZW50IGNoZWNrcG9pbnRzLiAqL1xuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgcmVhZG9ubHkgc3VwcG9ydHNDaGVja3BvaW50cyA9IGZhbHNlO1xuXG4gIC8qKiBFeGVjdXRlIFB5dGhvbiBzb3VyY2UgYW5kIG1hcCBNb250eSBvdXRwdXQgdG8gTWFzdHJhJ3MgY29tbWFuZCByZXN1bHQuICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICAgIG9wdGlvbnM6IEV4ZWN1dGVDb21tYW5kT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydGVkID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgY29kZSA9IG1vbnR5Q29kZShjb21tYW5kLCBhcmdzKTtcbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGFjY2VwdHMgUHl0aG9uIHNvdXJjZSBkaXJlY3RseSwgb3IgcHl0aG9uL3B5dGhvbjMgd2l0aCBhIHNpbmdsZSAtYyBzY3JpcHQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZW52ID8/IHt9KS5maWx0ZXIoXG4gICAgICAoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgaWYgKGVudmlyb25tZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgZG9lcyBub3QgZXhwb3NlIGhvc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICByZXR1cm4gZmFpbGVkUmVzdWx0KFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdGFydGVkLFxuICAgICAgICBcIk1vbnR5IGZhbGxiYWNrIGRvZXMgbm90IGV4cG9zZSBhIGhvc3Qgd29ya2luZyBkaXJlY3RvcnkuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgb3B0aW9ucy5hYm9ydFNpZ25hbC5yZWFzb247XG5cbiAgICBhd2FpdCB0aGlzLnN0YXJ0KCk7XG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3QgcG9vbCA9IGF3YWl0IG1vbnR5UG9vbCgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjaGVja291dFNlc3Npb24oXG4gICAgICBwb29sLFxuICAgICAge1xuICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICBtYXhGZWVkRHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IE1vbnR5Q3Jhc2hlZEVycm9yIH0gPSBhd2FpdCBtb250eU1vZHVsZSgpO1xuICAgICAgY29uc3QgdGltZWRPdXQgPSBjYXVnaHQgaW5zdGFuY2VvZiBNb250eUNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG4iXX0=
362
+ if (import.meta.main) {
363
+ const sandbox = new MontySandbox();
364
+ await sandbox.start();
365
+ console.log(await sandbox.executeCommand("print('Hello, world!')"));
366
+ await sandbox.stop();
367
+ }
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktc2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb250eS1zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVN4RSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUM1QyxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLElBQUksRUFBRSxjQUFjO0lBQ3BCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUM7Q0FDbEMsQ0FBQztBQUNYLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsSUFBSSxFQUFFLFlBQVk7SUFDbEIsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztDQUNsQyxDQUFDO0FBQ1gsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQVMxQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBMkIsRUFBRTtJQUMzRSxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ3JDLFlBQVksRUFBRSxDQUFDO2dCQUNmLFlBQVksRUFBRSxDQUFDO2dCQUNmLGNBQWMsRUFBRSxFQUFFO2FBQ25CLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLFlBQVksRUFBRSxNQUFNLENBQUMsaUJBQWlCO2dCQUN0QyxJQUFJO2FBQ0wsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRTtnQkFDekMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2FBQ3RDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUMsQ0FBQztBQWdCSCxtRkFBbUY7QUFDbkYsTUFBTSxPQUFPLFlBQVk7SUFDZCxFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzVCLE1BQU0sR0FBK0IsU0FBUyxDQUFDO0lBQy9DLEtBQUssQ0FBVTtJQUVFLGdCQUFnQixDQUFTO0lBQ3pCLGNBQWMsQ0FBUztJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsVUFBVSxDQUFRO0lBRTFCLFlBQVksVUFBK0IsRUFBRTtRQUMzQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLDBCQUEwQixDQUFDO1FBQy9FLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSx3QkFBd0IsQ0FBQztRQUN6RSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU87UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsTUFBTSxNQUFNLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsS0FBSyxDQUFDLE9BQU87UUFDWCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLEtBQUssQ0FBQyxRQUFRLEtBQW1CLENBQUM7SUFFekIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLDZFQUE2RTtJQUM3RSxLQUFLLENBQUMsY0FBYyxDQUNsQixPQUFlLEVBQ2YsT0FBaUIsRUFBRSxFQUNuQixVQUFpQyxFQUFFO1FBRW5DLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sWUFBWSxDQUNqQixPQUFPLEVBQ1AsSUFBSSxFQUNKLE9BQU8sRUFDUCwyRkFBMkYsQ0FDNUYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUMxRCxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FDbkMsQ0FBQztRQUNGLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLFlBQVksQ0FDakIsT0FBTyxFQUNQLElBQUksRUFDSixPQUFPLEVBQ1AsNERBQTRELENBQzdELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEIsT0FBTyxZQUFZLENBQ2pCLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUNQLDBEQUEwRCxDQUMzRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPO1lBQUUsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUVuRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQ25DLElBQUksRUFDSjtZQUNFLE1BQU0sRUFBRTtnQkFDTixtQkFBbUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyRCxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWM7YUFDL0I7WUFDRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsRUFDRCxPQUFPLENBQUMsV0FBVyxDQUNwQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNwQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxPQUFPLEdBQUcsR0FBUyxFQUFFO1lBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFDSCxJQUFJLE9BQU87Z0JBQUUsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUQsYUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO2FBQzNELENBQUMsQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQztnQkFDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsSUFBSTtnQkFDSixPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUMzQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUMzQixlQUFlLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU87Z0JBQzVDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRTthQUNyQixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksWUFBWSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDbkUsT0FBTztnQkFDTCxPQUFPO2dCQUNQLElBQUk7Z0JBQ0osT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQzNCLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTztnQkFDNUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7YUFDckIsQ0FBQztRQUNKLENBQUM7Z0JBQVMsQ0FBQztZQUNULE9BQU8sQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxRQUFRLEVBQUU7Z0JBQ1IsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFVBQVUsRUFBRSxLQUFLO2FBQ2xCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTztZQUNMLCtEQUErRDtZQUMvRCxxREFBcUQ7WUFDckQsMEZBQTBGO1NBQzNGLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQsU0FBUyxTQUFTLENBQUMsT0FBZSxFQUFFLElBQXVCO0lBQ3pELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdEMsSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM3RixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsMENBQTBDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3JELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVDLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLGNBQWM7SUFDVCxNQUFNLENBQWU7SUFDckIsTUFBTSxDQUFlO0lBRWIsUUFBUSxDQUFvQztJQUM1QyxRQUFRLENBQW9DO0lBRTdELFlBQVksT0FBOEI7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUEyQixFQUFFLElBQVk7UUFDNUMsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUlOLE9BQU87WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDO29CQUNFLGVBQWUsRUFBRSxJQUFJO29CQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7aUJBQzdDO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDO29CQUNFLGVBQWUsRUFBRSxJQUFJO29CQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7aUJBQzdDO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZO0lBQ2hCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRUEsUUFBUSxDQUFTO0lBQ2pCLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQzVCLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTdDLFlBQVksUUFBNEI7UUFDdEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RCxJQUNFLFFBQVEsS0FBSyxNQUFNLENBQUMsaUJBQWlCO1lBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFDakQsQ0FBQztZQUNELE1BQU0sSUFBSSxTQUFTLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hELElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUMsT0FBTyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQUUsS0FBSyxFQUFFLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQUVELFNBQVMsZUFBZSxDQUFDLFNBQTZCO0lBQ3BELElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPO0lBQ3BDLElBQUksQ0FBQztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCx1RUFBdUU7SUFDekUsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsZUFBZSxDQUM1QixJQUFlLEVBQ2YsT0FBd0IsRUFDeEIsTUFBK0I7SUFFL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzdCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLElBQUksT0FBTyxDQUFlLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25ELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxHQUFTLEVBQUU7WUFDekIsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM1QixLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELFFBQVEsQ0FBQyxJQUFJLENBQ1gsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNWLElBQUksT0FBTztnQkFBRSxPQUFPO1lBQ3BCLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQ0QsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUNsQixJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUErQjtJQUNsRCxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksSUFBSSxZQUFZLENBQUMseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUNuQixPQUFlLEVBQ2YsSUFBYyxFQUNkLE9BQWUsRUFDZixNQUFjO0lBRWQsT0FBTztRQUNMLE9BQU87UUFDUCxJQUFJO1FBQ0osT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsQ0FBQztRQUNYLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTTtRQUNOLGVBQWUsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTztLQUM3QyxDQUFDO0FBQ0osQ0FBQztBQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ25DLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQeWRhbnRpYyBNb250eSBmYWxsYmFjayBmb3IgTWFzdHJhIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIFByZWZlcnMgTW9udHkncyBuYXRpdmUgTm9kZSBzdWJwcm9jZXNzIHdvcmtlcnMgYW5kIGZhbGxzIGJhY2sgdG8gaXRzIFdBU01cbiAqIHdvcmtlcnMgd2hlbiB0aGUgbmF0aXZlIHBhY2thZ2UgaXMgdW5hdmFpbGFibGUuIEl0IGV4ZWN1dGVzIFB5dGhvbiBzb3VyY2VcbiAqIHdpdGggbm8gaG9zdCBmaWxlc3lzdGVtLCBuZXR3b3JrLCBlbnZpcm9ubWVudCwgc2hlbGwsIG9yIHRoaXJkLXBhcnR5IHBhY2thZ2VcbiAqIGFjY2Vzcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY29uZmlnVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBmdW5jdGlvblV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kUmVzdWx0LFxuICBFeGVjdXRlQ29tbWFuZE9wdGlvbnMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBDaGVja291dE9wdGlvbnMsIE1vbnR5LCBNb250eUNyYXNoZWRFcnJvciwgTW9udHlTZXNzaW9uIH0gZnJvbSBcIkBweWRhbnRpYy9tb250eVwiO1xuXG5jb25zdCBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUyA9IDMwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX01FTU9SWV9CWVRFUyA9IDEwXzAwMF8wMDA7XG5jb25zdCBOQVRJVkVfTU9OVFlfVEFSR0VUID0ge1xuICBuYW1lOiBcIm5hdGl2ZSBNb250eVwiLFxuICBsb2FkOiAoKSA9PiBpbXBvcnQoXCJAcHlkYW50aWMvbW9udHkvbm9kZVwiKSxcbn0gYXMgY29uc3Q7XG5jb25zdCBXQVNNX01PTlRZX1RBUkdFVCA9IHtcbiAgbmFtZTogXCJXQVNNIE1vbnR5XCIsXG4gIGxvYWQ6ICgpID0+IGltcG9ydChcIkBweWRhbnRpYy9tb250eS93YXNtXCIpLFxufSBhcyBjb25zdDtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbW9udHlcIik7XG5cbnR5cGUgTW9udHlQb29sID0gUGljazxNb250eSwgXCJjaGVja291dFwiPjtcblxuaW50ZXJmYWNlIE1vbnR5Q29udGV4dCB7XG4gIGNyYXNoZWRFcnJvcjogdHlwZW9mIE1vbnR5Q3Jhc2hlZEVycm9yO1xuICBwb29sOiBNb250eVBvb2w7XG59XG5cbmNvbnN0IG1vbnR5Q29udGV4dCA9IGZ1bmN0aW9uVXRpbHMubWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxNb250eUNvbnRleHQ+ID0+IHtcbiAgY29uc3QgZXJyb3JzOiBFcnJvcltdID0gW107XG4gIGNvbnN0IHRhcmdldHMgPSBjb25maWdVdGlscy5ib29sZWFuKHVuZGVmaW5lZCwgXCJNT05UWV9GT1JDRV9XQVNNXCIpXG4gICAgPyBbV0FTTV9NT05UWV9UQVJHRVRdXG4gICAgOiBbTkFUSVZFX01PTlRZX1RBUkdFVCwgV0FTTV9NT05UWV9UQVJHRVRdO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IHRhcmdldC5sb2FkKCk7XG4gICAgICBsb2dnZXIuZGVidWcoYCR7dGFyZ2V0Lm5hbWV9IG1vZHVsZSBhdmFpbGFibGVgKTtcbiAgICAgIGNvbnN0IHBvb2wgPSBhd2FpdCBtb2R1bGUuTW9udHkuY3JlYXRlKHtcbiAgICAgICAgbWluUHJvY2Vzc2VzOiAxLFxuICAgICAgICBtYXhQcm9jZXNzZXM6IDQsXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0OiAzNSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmRlYnVnKGAke3RhcmdldC5uYW1lfSBwb29sIGNyZWF0ZWRgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNyYXNoZWRFcnJvcjogbW9kdWxlLk1vbnR5Q3Jhc2hlZEVycm9yLFxuICAgICAgICBwb29sLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYCR7dGFyZ2V0Lm5hbWV9IHVuYXZhaWxhYmxlYCwge1xuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFwiRmFpbGVkIHRvIGNyZWF0ZSBNb250eSBwb29sXCIpO1xufSk7XG5cbi8qKiBSZXNvdXJjZSBjb250cm9scyBmb3IgdGhlIE1vbnR5IFB5dGhvbiBmYWxsYmFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9udHlTYW5kYm94T3B0aW9ucyB7XG4gIC8qKiBNYXN0cmEgcHJvdmlkZXIgaWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBleGVjdXRpb24gdGltZW91dC4gUGVyLWNhbGwgYG9wdGlvbnMudGltZW91dGAgd2lucy4gKi9cbiAgY29tbWFuZFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gTW9udHkgaGVhcCBieXRlcyBmb3Igb25lIGNoZWNrb3V0LiAqL1xuICBtYXhNZW1vcnlCeXRlcz86IG51bWJlcjtcbiAgLyoqIFR5cGUtY2hlY2sgZWFjaCBQeXRob24gc25pcHBldCBiZWZvcmUgcnVubmluZyBpdC4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHR5cGVDaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKiBQeXRob24tb25seSwgZGVueS1ieS1kZWZhdWx0IHNhbmRib3ggYmFja2VkIGJ5IE1vbnR5J3Mgc2VsZWN0ZWQgd29ya2VyIHBvb2wuICovXG5leHBvcnQgY2xhc3MgTW9udHlTYW5kYm94IGltcGxlbWVudHMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvdmlkZXIgPSBcIm1vbnR5XCI7XG4gIHN0YXR1czogV29ya3NwYWNlU2FuZGJveFtcInN0YXR1c1wiXSA9IFwicGVuZGluZ1wiO1xuICBlcnJvcj86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhNZW1vcnlCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVDaGVjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICBwcml2YXRlIGxhc3RVc2VkQXQ/OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vbnR5U2FuZGJveE9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IFwibW9udHlcIjtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWUgPz8gXCJQeWRhbnRpYyBNb250eVwiO1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRNcyA9IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRNcyA/PyBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUztcbiAgICB0aGlzLm1heE1lbW9yeUJ5dGVzID0gb3B0aW9ucy5tYXhNZW1vcnlCeXRlcyA/PyBERUZBVUxUX01BWF9NRU1PUllfQllURVM7XG4gICAgdGhpcy50eXBlQ2hlY2sgPSBvcHRpb25zLnR5cGVDaGVjayA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKiBXYXJtIHRoZSBzaGFyZWQgY3Jhc2gtaXNvbGF0ZWQgd29ya2VyIHBvb2wuICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHJldHVybjtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RhcnRpbmdcIjtcbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb250eUNvbnRleHQoKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gXCJydW5uaW5nXCI7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwiZXJyb3JcIjtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVnaHQpO1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcHJvY2Vzcy13aWRlIHBvb2wgc3RheXMgd2FybTsgdGhpcyBpbnN0YW5jZSBjYXJyaWVzIG5vIG9wZW4gc2Vzc2lvbi4gKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RvcHBlZFwiO1xuICB9XG5cbiAgLyoqIFRoZSBwcm9jZXNzLXdpZGUgcG9vbCBzdGF5cyB3YXJtOyBlYWNoIGNvbW1hbmQgY2xvc2VzIGl0cyBvd24gY2hlY2tvdXQuICovXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGF0dXMgPSBcImRlc3Ryb3llZFwiO1xuICB9XG5cbiAgLyoqIE1vbnR5IHNlc3Npb25zIGFyZSBlcGhlbWVyYWwgYW5kIGRvIG5vdCBwcm92aWRlIHBlcnNpc3RlbnQgY2hlY2twb2ludHMuICovXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge31cblxuICByZWFkb25seSBzdXBwb3J0c0NoZWNrcG9pbnRzID0gZmFsc2U7XG5cbiAgLyoqIEV4ZWN1dGUgUHl0aG9uIHNvdXJjZSBhbmQgbWFwIE1vbnR5IG91dHB1dCB0byBNYXN0cmEncyBjb21tYW5kIHJlc3VsdC4gKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICAgIGFyZ3M6IHN0cmluZ1tdID0gW10sXG4gICAgb3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBjb2RlID0gbW9udHlDb2RlKGNvbW1hbmQsIGFyZ3MpO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgYWNjZXB0cyBQeXRob24gc291cmNlIGRpcmVjdGx5LCBvciBweXRob24vcHl0aG9uMyB3aXRoIGEgc2luZ2xlIC1jIHNjcmlwdC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbnYgPz8ge30pLmZpbHRlcihcbiAgICAgIChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBpZiAoZW52aXJvbm1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhaWxlZFJlc3VsdChcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRlZCxcbiAgICAgICAgXCJNb250eSBmYWxsYmFjayBkb2VzIG5vdCBleHBvc2UgaG9zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jd2QpIHtcbiAgICAgIHJldHVybiBmYWlsZWRSZXN1bHQoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIFwiTW9udHkgZmFsbGJhY2sgZG9lcyBub3QgZXhwb3NlIGEgaG9zdCB3b3JraW5nIGRpcmVjdG9yeS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBvcHRpb25zLmFib3J0U2lnbmFsLnJlYXNvbjtcblxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMuY29tbWFuZFRpbWVvdXRNcztcbiAgICBjb25zdCBwb29sID0gKGF3YWl0IG1vbnR5Q29udGV4dCgpKS5wb29sO1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBjaGVja291dFNlc3Npb24oXG4gICAgICBwb29sLFxuICAgICAge1xuICAgICAgICBsaW1pdHM6IHtcbiAgICAgICAgICBtYXhGZWVkRHVyYXRpb25TZWNzOiBNYXRoLm1heCgwLjAwMSwgdGltZW91dCAvIDFfMDAwKSxcbiAgICAgICAgICBtYXhNZW1vcnk6IHRoaXMubWF4TWVtb3J5Qnl0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVDaGVjazogdGhpcy50eXBlQ2hlY2ssXG4gICAgICB9LFxuICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSZXRhaW5lZE91dHB1dChvcHRpb25zKTtcbiAgICBjb25zdCB3b3JrZXJQaWQgPSBzZXNzaW9uLndvcmtlclBpZDtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRlcm1pbmF0ZVdvcmtlcih3b3JrZXJQaWQpO1xuICAgIH07XG4gICAgb3B0aW9ucy5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgb25BYm9ydCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWJvcnRlZCkgdGhyb3cgYWJvcnRSZWFzb24ob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHNlc3Npb24uZmVlZFJ1bihzdHJpcFB5dGhvbkZlbmNlKGNvZGUpLCB7XG4gICAgICAgIHByaW50Q2FsbGJhY2s6IChzdHJlYW0sIHRleHQpID0+IG91dHB1dC5lbWl0KHN0cmVhbSwgdGV4dCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJldHVybmVkID0gZm9ybWF0UmVzdWx0KHZhbHVlKTtcbiAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICBjb25zdCBzdWZmaXggPSByZXR1cm5lZC5lbmRzV2l0aChcIlxcblwiKSA/IHJldHVybmVkIDogYCR7cmV0dXJuZWR9XFxuYDtcbiAgICAgICAgb3V0cHV0LmVtaXQoXCJzdGRvdXRcIiwgc3VmZml4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgc3Rkb3V0OiBvdXRwdXQuc3Rkb3V0LnZhbHVlLFxuICAgICAgICBzdGRlcnI6IG91dHB1dC5zdGRlcnIudmFsdWUsXG4gICAgICAgIGV4ZWN1dGlvblRpbWVNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoYWJvcnRlZCB8fCBvcHRpb25zLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IGFib3J0UmVhc29uKG9wdGlvbnMuYWJvcnRTaWduYWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICBvdXRwdXQuZW1pdChcInN0ZGVyclwiLCBvdXRwdXQuc3RkZXJyLnZhbHVlID8gYFxcbiR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgICBjb25zdCB7IGNyYXNoZWRFcnJvciB9ID0gYXdhaXQgbW9udHlDb250ZXh0KCk7XG4gICAgICBjb25zdCB0aW1lZE91dCA9IGNhdWdodCBpbnN0YW5jZW9mIGNyYXNoZWRFcnJvciAmJiBjYXVnaHQudGltZWRPdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXhpdENvZGU6IHRpbWVkT3V0ID8gLTEgOiAxLFxuICAgICAgICBzdGRvdXQ6IG91dHB1dC5zdGRvdXQudmFsdWUsXG4gICAgICAgIHN0ZGVycjogb3V0cHV0LnN0ZGVyci52YWx1ZSxcbiAgICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAuLi5vdXRwdXQubWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gIH1cblxuICBnZXRJbmZvKCk6IFNhbmRib3hJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBsYW5ndWFnZTogXCJweXRob25cIixcbiAgICAgICAgaG9zdEFjY2VzczogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBnZXRJbnN0cnVjdGlvbnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJDb21tYW5kcyBydW4gYXMgUHl0aG9uIHNvdXJjZSBpbiB0aGUgUHlkYW50aWMgTW9udHkgZmFsbGJhY2suXCIsXG4gICAgICBcIlBhc3MgUHl0aG9uIGNvZGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gc2hlbGwgc3ludGF4LlwiLFxuICAgICAgXCJUaGVyZSBpcyBubyBob3N0IGZpbGVzeXN0ZW0sIG5ldHdvcmssIGVudmlyb25tZW50LCBzaGVsbCwgb3IgdGhpcmQtcGFydHkgcGFja2FnZSBhY2Nlc3MuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eUNvZGUoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQ7XG4gIGlmICgoY29tbWFuZCA9PT0gXCJweXRob25cIiB8fCBjb21tYW5kID09PSBcInB5dGhvbjNcIikgJiYgYXJncy5sZW5ndGggPT09IDIgJiYgYXJnc1swXSA9PT0gXCItY1wiKSB7XG4gICAgcmV0dXJuIGFyZ3NbMV07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaXBQeXRob25GZW5jZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gY29kZS50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL15gYGAoPzpweXRob258cHkpP1xccypcXG4oW1xcc1xcU10qPylcXG5gYGAkL2kuZXhlYyh0cmltbWVkKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gY29kZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBcIlwiO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZE91dHB1dCB7XG4gIHJlYWRvbmx5IHN0ZG91dDogUmV0YWluZWRUZXh0O1xuICByZWFkb25seSBzdGRlcnI6IFJldGFpbmVkVGV4dDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uU3Rkb3V0OiBFeGVjdXRlQ29tbWFuZE9wdGlvbnNbXCJvblN0ZG91dFwiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblN0ZGVycjogRXhlY3V0ZUNvbW1hbmRPcHRpb25zW1wib25TdGRlcnJcIl07XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRXhlY3V0ZUNvbW1hbmRPcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXQgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5zdGRlcnIgPSBuZXcgUmV0YWluZWRUZXh0KG9wdGlvbnMubWF4UmV0YWluZWRCeXRlcyk7XG4gICAgdGhpcy5vblN0ZG91dCA9IG9wdGlvbnMub25TdGRvdXQ7XG4gICAgdGhpcy5vblN0ZGVyciA9IG9wdGlvbnMub25TdGRlcnI7XG4gIH1cblxuICBlbWl0KHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChzdHJlYW0gPT09IFwic3Rkb3V0XCIpIHtcbiAgICAgIHRoaXMub25TdGRvdXQ/Lih0ZXh0KTtcbiAgICAgIHRoaXMuc3Rkb3V0LmFwcGVuZCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblN0ZGVycj8uKHRleHQpO1xuICAgICAgdGhpcy5zdGRlcnIuYXBwZW5kKHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCk6IFBpY2s8XG4gICAgQ29tbWFuZFJlc3VsdCxcbiAgICBcInN0ZG91dFRydW5jYXRlZFwiIHwgXCJzdGRlcnJUcnVuY2F0ZWRcIiB8IFwic3Rkb3V0RHJvcHBlZEJ5dGVzXCIgfCBcInN0ZGVyckRyb3BwZWRCeXRlc1wiXG4gID4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZG91dERyb3BwZWRCeXRlczogdGhpcy5zdGRvdXQuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4odGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyckRyb3BwZWRCeXRlczogdGhpcy5zdGRlcnIuZHJvcHBlZEJ5dGVzLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBSZXRhaW5lZFRleHQge1xuICB2YWx1ZSA9IFwiXCI7XG4gIGRyb3BwZWRCeXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgY29uc3RydWN0b3IobWF4Qnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gbWF4Qnl0ZXMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiZcbiAgICAgICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzb2x2ZWQpIHx8IHJlc29sdmVkIDwgMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtYXhSZXRhaW5lZEJ5dGVzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyIG9yIEluZmluaXR5XCIpO1xuICAgIH1cbiAgICB0aGlzLm1heEJ5dGVzID0gcmVzb2x2ZWQ7XG4gIH1cblxuICBhcHBlbmQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMubWF4Qnl0ZXMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21iaW5lZCA9IHRoaXMuZW5jb2Rlci5lbmNvZGUodGhpcy52YWx1ZSArIHRleHQpO1xuICAgIGlmIChjb21iaW5lZC5sZW5ndGggPD0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgdGhpcy52YWx1ZSArPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSBjb21iaW5lZC5sZW5ndGggLSB0aGlzLm1heEJ5dGVzO1xuICAgIHdoaWxlIChzdGFydCA8IGNvbWJpbmVkLmxlbmd0aCAmJiAoY29tYmluZWRbc3RhcnRdISAmIDB4YzApID09PSAweDgwKSBzdGFydCsrO1xuICAgIGNvbnN0IHJldGFpbmVkID0gY29tYmluZWQuc3ViYXJyYXkoc3RhcnQpO1xuICAgIHRoaXMuZHJvcHBlZEJ5dGVzICs9IGNvbWJpbmVkLmxlbmd0aCAtIHJldGFpbmVkLmxlbmd0aDtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWNvZGVyLmRlY29kZShyZXRhaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVybWluYXRlV29ya2VyKHdvcmtlclBpZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh3b3JrZXJQaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCh3b3JrZXJQaWQsIFwiU0lHS0lMTFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIGNvbW1hbmQgY2FuIGZpbmlzaCBiZXR3ZWVuIHRoZSBhYm9ydCBldmVudCBhbmQgdGhlIGtpbGwgcmVxdWVzdC5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja291dFNlc3Npb24oXG4gIHBvb2w6IE1vbnR5UG9vbCxcbiAgb3B0aW9uczogQ2hlY2tvdXRPcHRpb25zLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxNb250eVNlc3Npb24+IHtcbiAgY29uc3QgY2hlY2tvdXQgPSBwb29sLmNoZWNrb3V0KG9wdGlvbnMpO1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGNoZWNrb3V0O1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB2b2lkIGNoZWNrb3V0LnRoZW4oKHNlc3Npb24pID0+IHNlc3Npb24uY2xvc2UoKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBhYm9ydFJlYXNvbihzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE1vbnR5U2Vzc2lvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChhYm9ydFJlYXNvbihzaWduYWwpKTtcbiAgICAgIHZvaWQgY2hlY2tvdXQudGhlbigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5jbG9zZSgpKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY2hlY2tvdXQudGhlbihcbiAgICAgIChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpO1xuICAgICAgICByZXNvbHZlKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIChjYXVnaHQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICAgIHJlamVjdChjYXVnaHQpO1xuICAgICAgfSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYWJvcnRSZWFzb24oc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBjb21tYW5kIHdhcyBhYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuZnVuY3Rpb24gZmFpbGVkUmVzdWx0KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBzdGFydGVkOiBudW1iZXIsXG4gIHN0ZGVycjogc3RyaW5nLFxuKTogQ29tbWFuZFJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgIGV4aXRDb2RlOiAxLFxuICAgIHN0ZG91dDogXCJcIixcbiAgICBzdGRlcnIsXG4gICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gIH07XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IHNhbmRib3ggPSBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGF3YWl0IHNhbmRib3guc3RhcnQoKTtcbiAgY29uc29sZS5sb2coYXdhaXQgc2FuZGJveC5leGVjdXRlQ29tbWFuZChcInByaW50KCdIZWxsbywgd29ybGQhJylcIikpO1xuICBhd2FpdCBzYW5kYm94LnN0b3AoKTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-native.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/openapi-tool.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-cache.ts","../src/skill-paths.ts","../src/skill-search.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/trace-attributes.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
1
+ {"root":["../src/agents.ts","../src/chart.ts","../src/chat.ts","../src/config.ts","../src/defaults.ts","../src/evaluation.ts","../src/filesystems.ts","../src/genie.ts","../src/identity.ts","../src/mcp.ts","../src/memory.ts","../src/mlflow.ts","../src/model.ts","../src/monty-sandbox.ts","../src/observability.ts","../src/openapi-tool.ts","../src/plugin.ts","../src/processors.ts","../src/remote-skills.ts","../src/rest.ts","../src/sandbox.ts","../src/server.ts","../src/serving-sanitize.ts","../src/serving.ts","../src/skill-cache.ts","../src/skill-paths.ts","../src/skill-search.ts","../src/statement.ts","../src/storage-schema.ts","../src/style.ts","../src/summarize.ts","../src/telemetry.ts","../src/trace-attributes.ts","../src/validation.ts","../src/workspaces.ts","../src/writer.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -34,19 +34,19 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@databricks/appkit": "0.81.0",
37
- "@dbx-tools/appkit": "^0.9.79",
38
- "@dbx-tools/core": "^0.9.79",
39
- "@dbx-tools/databricks": "^0.9.79",
40
- "@dbx-tools/fs": "^0.9.79",
41
- "@dbx-tools/genie": "^0.9.79",
42
- "@dbx-tools/model": "^0.9.79",
43
- "@dbx-tools/path": "^0.9.79",
44
- "@dbx-tools/postgres": "^0.9.79",
45
- "@dbx-tools/shared-core": "^0.9.79",
46
- "@dbx-tools/shared-fs": "^0.9.79",
47
- "@dbx-tools/shared-genie": "^0.9.79",
48
- "@dbx-tools/shared-mastra": "^0.9.79",
49
- "@dbx-tools/shared-model": "^0.9.79",
37
+ "@dbx-tools/appkit": "^0.9.93",
38
+ "@dbx-tools/core": "^0.9.93",
39
+ "@dbx-tools/databricks": "^0.9.93",
40
+ "@dbx-tools/fs": "^0.9.93",
41
+ "@dbx-tools/genie": "^0.9.93",
42
+ "@dbx-tools/model": "^0.9.93",
43
+ "@dbx-tools/path": "^0.9.93",
44
+ "@dbx-tools/postgres": "^0.9.93",
45
+ "@dbx-tools/shared-core": "^0.9.93",
46
+ "@dbx-tools/shared-fs": "^0.9.93",
47
+ "@dbx-tools/shared-genie": "^0.9.93",
48
+ "@dbx-tools/shared-mastra": "^0.9.93",
49
+ "@dbx-tools/shared-model": "^0.9.93",
50
50
  "@mastra/ai-sdk": "1.10.5",
51
51
  "@mastra/core": "1.71.0",
52
52
  "@mastra/express": "1.5.15",
@@ -132,10 +132,6 @@
132
132
  "types": "./lib/src/model.d.ts",
133
133
  "default": "./lib/src/model.js"
134
134
  },
135
- "./monty-native": {
136
- "types": "./lib/src/monty-native.d.ts",
137
- "default": "./lib/src/monty-native.js"
138
- },
139
135
  "./monty-sandbox": {
140
136
  "types": "./lib/src/monty-sandbox.d.ts",
141
137
  "default": "./lib/src/monty-sandbox.js"
@@ -231,7 +227,7 @@
231
227
  "./package.json": "./package.json"
232
228
  }
233
229
  },
234
- "version": "0.9.79",
230
+ "version": "0.9.93",
235
231
  "types": "./lib/index.d.ts",
236
232
  "dbxToolsConfig": {
237
233
  "tags": [
@@ -296,10 +292,6 @@
296
292
  "types": "./lib/src/model.d.ts",
297
293
  "default": "./lib/src/model.js"
298
294
  },
299
- "./monty-native": {
300
- "types": "./lib/src/monty-native.d.ts",
301
- "default": "./lib/src/monty-native.js"
302
- },
303
295
  "./monty-sandbox": {
304
296
  "types": "./lib/src/monty-sandbox.d.ts",
305
297
  "default": "./lib/src/monty-sandbox.js"
@@ -1,38 +1,70 @@
1
1
  /**
2
2
  * Pydantic Monty fallback for Mastra command execution.
3
3
  *
4
- * Uses the Node subprocess-worker build of Monty. It executes Python source
4
+ * Prefers Monty's native Node subprocess workers and falls back to its WASM
5
+ * workers when the native package is unavailable. It executes Python source
5
6
  * with no host filesystem, network, environment, shell, or third-party package
6
- * access unless a future caller explicitly adds those capabilities.
7
+ * access.
7
8
  *
8
9
  * @module
9
10
  */
10
11
 
11
- import { errorUtils, functionUtils } from "@dbx-tools/shared-core";
12
+ import { configUtils } from "@dbx-tools/core";
13
+ import { errorUtils, functionUtils, log } from "@dbx-tools/shared-core";
12
14
  import type {
13
15
  CommandResult,
14
16
  ExecuteCommandOptions,
15
17
  SandboxInfo,
16
18
  WorkspaceSandbox,
17
19
  } from "@mastra/core/workspace";
18
- import type { CheckoutOptions, Monty as MontyPool, MontySession } from "@pydantic/monty/node";
19
-
20
- import { ensureMontyNativeBinding } from "./monty-native.ts";
20
+ import type { CheckoutOptions, Monty, MontyCrashedError, MontySession } from "@pydantic/monty";
21
21
 
22
22
  const DEFAULT_COMMAND_TIMEOUT_MS = 30_000;
23
23
  const DEFAULT_MAX_MEMORY_BYTES = 10_000_000;
24
+ const NATIVE_MONTY_TARGET = {
25
+ name: "native Monty",
26
+ load: () => import("@pydantic/monty/node"),
27
+ } as const;
28
+ const WASM_MONTY_TARGET = {
29
+ name: "WASM Monty",
30
+ load: () => import("@pydantic/monty/wasm"),
31
+ } as const;
32
+ const logger = log.logger("mastra/monty");
33
+
34
+ type MontyPool = Pick<Monty, "checkout">;
35
+
36
+ interface MontyContext {
37
+ crashedError: typeof MontyCrashedError;
38
+ pool: MontyPool;
39
+ }
24
40
 
25
- const montyModule = functionUtils.memoize(async () => {
26
- await ensureMontyNativeBinding();
27
- return import("@pydantic/monty/node");
28
- });
29
- const montyPool = functionUtils.memoize(async (): Promise<MontyPool> => {
30
- const { Monty } = await montyModule();
31
- return Monty.create({
32
- minProcesses: 1,
33
- maxProcesses: 4,
34
- requestTimeout: 35,
35
- });
41
+ const montyContext = functionUtils.memoize(async (): Promise<MontyContext> => {
42
+ const errors: Error[] = [];
43
+ const targets = configUtils.boolean(undefined, "MONTY_FORCE_WASM")
44
+ ? [WASM_MONTY_TARGET]
45
+ : [NATIVE_MONTY_TARGET, WASM_MONTY_TARGET];
46
+ for (const target of targets) {
47
+ try {
48
+ const module = await target.load();
49
+ logger.debug(`${target.name} module available`);
50
+ const pool = await module.Monty.create({
51
+ minProcesses: 1,
52
+ maxProcesses: 4,
53
+ requestTimeout: 35,
54
+ });
55
+ logger.debug(`${target.name} pool created`);
56
+ return {
57
+ crashedError: module.MontyCrashedError,
58
+ pool,
59
+ };
60
+ } catch (error) {
61
+ errors.push(errorUtils.toError(error));
62
+ logger.debug(`${target.name} unavailable`, {
63
+ error: errorUtils.errorMessage(error),
64
+ });
65
+ }
66
+ }
67
+ throw new AggregateError(errors, "Failed to create Monty pool");
36
68
  });
37
69
 
38
70
  /** Resource controls for the Monty Python fallback. */
@@ -49,7 +81,7 @@ export interface MontySandboxOptions {
49
81
  typeCheck?: boolean;
50
82
  }
51
83
 
52
- /** Python-only, deny-by-default sandbox backed by Monty's Node worker pool. */
84
+ /** Python-only, deny-by-default sandbox backed by Monty's selected worker pool. */
53
85
  export class MontySandbox implements WorkspaceSandbox {
54
86
  readonly id: string;
55
87
  readonly name: string;
@@ -77,7 +109,7 @@ export class MontySandbox implements WorkspaceSandbox {
77
109
  this.status = "starting";
78
110
  this.error = undefined;
79
111
  try {
80
- await montyPool();
112
+ await montyContext();
81
113
  this.status = "running";
82
114
  } catch (caught) {
83
115
  this.status = "error";
@@ -140,7 +172,7 @@ export class MontySandbox implements WorkspaceSandbox {
140
172
 
141
173
  await this.start();
142
174
  const timeout = options.timeout ?? this.commandTimeoutMs;
143
- const pool = await montyPool();
175
+ const pool = (await montyContext()).pool;
144
176
  const session = await checkoutSession(
145
177
  pool,
146
178
  {
@@ -188,8 +220,8 @@ export class MontySandbox implements WorkspaceSandbox {
188
220
  }
189
221
  const message = errorUtils.errorMessage(caught);
190
222
  output.emit("stderr", output.stderr.value ? `\n${message}` : message);
191
- const { MontyCrashedError } = await montyModule();
192
- const timedOut = caught instanceof MontyCrashedError && caught.timedOut;
223
+ const { crashedError } = await montyContext();
224
+ const timedOut = caught instanceof crashedError && caught.timedOut;
193
225
  return {
194
226
  command,
195
227
  args,
@@ -409,3 +441,10 @@ function failedResult(
409
441
  executionTimeMs: performance.now() - started,
410
442
  };
411
443
  }
444
+
445
+ if (import.meta.main) {
446
+ const sandbox = new MontySandbox();
447
+ await sandbox.start();
448
+ console.log(await sandbox.executeCommand("print('Hello, world!')"));
449
+ await sandbox.stop();
450
+ }
@@ -1,40 +0,0 @@
1
- /**
2
- * Ensures Monty's platform native package is present before the Node addon loads.
3
- *
4
- * `@pydantic/monty` ships `@pydantic/monty-<platform>` as optionalDependencies.
5
- * npm can skip those (https://github.com/npm/cli/issues/4828), which surfaces as
6
- * "Cannot find native binding". This module installs only the current platform
7
- * package, at the already-installed `@pydantic/monty` version, without rewriting
8
- * package.json.
9
- *
10
- * @module
11
- */
12
- /** Result of spawning the package installer. */
13
- export interface MontyNativeInstallResult {
14
- exitCode: number | null;
15
- stdout: string;
16
- stderr: string;
17
- }
18
- /** Installer used by {@link ensureMontyNativeBinding}. */
19
- export type MontyNativeInstaller = (command: string, args: readonly string[], options: {
20
- cwd: string;
21
- }) => Promise<MontyNativeInstallResult>;
22
- /** Overrides for {@link ensureMontyNativeBinding} (tests inject resolve/install). */
23
- export interface EnsureMontyNativeBindingOptions {
24
- /** Working directory for the in-place install. Defaults to `process.cwd()`. */
25
- cwd?: string;
26
- /** Module resolver; defaults to `createRequire(import.meta.url).resolve`. */
27
- resolve?: (specifier: string) => string;
28
- /** Package installer; defaults to npm, then bun when npm is missing. */
29
- install?: MontyNativeInstaller;
30
- }
31
- /**
32
- * npm package that ships Monty's `.node` addon and `monty` binary for this
33
- * process. Matches `@pydantic/monty`'s `platformTriple()` / optionalDependencies.
34
- */
35
- export declare function montyNativeBindingPackage(platform?: NodeJS.Platform, arch?: string): string | undefined;
36
- /**
37
- * Resolve the current platform's Monty native package, installing it in place
38
- * when npm omitted the optional dependency.
39
- */
40
- export declare function ensureMontyNativeBinding(options?: EnsureMontyNativeBindingOptions): Promise<void>;
@@ -1,100 +0,0 @@
1
- /**
2
- * Ensures Monty's platform native package is present before the Node addon loads.
3
- *
4
- * `@pydantic/monty` ships `@pydantic/monty-<platform>` as optionalDependencies.
5
- * npm can skip those (https://github.com/npm/cli/issues/4828), which surfaces as
6
- * "Cannot find native binding". This module installs only the current platform
7
- * package, at the already-installed `@pydantic/monty` version, without rewriting
8
- * package.json.
9
- *
10
- * @module
11
- */
12
- import { createRequire } from "node:module";
13
- import { COMMAND_NOT_FOUND_EXIT_CODE, exec } from "@dbx-tools/core";
14
- import { errorUtils, log } from "@dbx-tools/shared-core";
15
- const logger = log.logger("mastra/monty-native");
16
- const requireFromHere = createRequire(import.meta.url);
17
- /**
18
- * npm package that ships Monty's `.node` addon and `monty` binary for this
19
- * process. Matches `@pydantic/monty`'s `platformTriple()` / optionalDependencies.
20
- */
21
- export function montyNativeBindingPackage(platform = process.platform, arch = process.arch) {
22
- if (platform === "darwin" && (arch === "x64" || arch === "arm64")) {
23
- return `@pydantic/monty-darwin-${arch}`;
24
- }
25
- if (platform === "linux" && (arch === "x64" || arch === "arm64")) {
26
- return `@pydantic/monty-linux-${arch}-gnu`;
27
- }
28
- if (platform === "win32" && arch === "x64") {
29
- return "@pydantic/monty-win32-x64-msvc";
30
- }
31
- return undefined;
32
- }
33
- /**
34
- * Resolve the current platform's Monty native package, installing it in place
35
- * when npm omitted the optional dependency.
36
- */
37
- export async function ensureMontyNativeBinding(options = {}) {
38
- const pkg = montyNativeBindingPackage();
39
- if (!pkg)
40
- return;
41
- const resolve = options.resolve ?? ((specifier) => requireFromHere.resolve(specifier));
42
- if (isResolvable(pkg, resolve))
43
- return;
44
- const version = montyPackageVersion(resolve);
45
- const spec = `${pkg}@${version}`;
46
- const cwd = options.cwd ?? process.cwd();
47
- logger.warn("native-binding:missing", { package: spec, cwd });
48
- const install = options.install ?? defaultInstaller;
49
- const output = await installNativePackage(spec, cwd, install);
50
- if (!isResolvable(pkg, resolve)) {
51
- throw new Error(`Monty native binding ${spec} is still missing after ${output.command}. ${output.detail}`);
52
- }
53
- logger.info("native-binding:installed", { package: spec, command: output.command });
54
- }
55
- function isResolvable(specifier, resolve) {
56
- try {
57
- resolve(`${specifier}/package.json`);
58
- return true;
59
- }
60
- catch {
61
- return false;
62
- }
63
- }
64
- function montyPackageVersion(resolve) {
65
- const pkg = requireFromHere(resolve("@pydantic/monty/package.json"));
66
- const version = pkg.version?.trim();
67
- if (!version)
68
- throw new Error("Installed @pydantic/monty has no version");
69
- return version;
70
- }
71
- async function installNativePackage(spec, cwd, install) {
72
- const npm = await install("npm", ["install", spec, "--no-save", "--no-package-lock"], { cwd });
73
- if (npm.exitCode === 0)
74
- return { command: `npm install ${spec}`, detail: npm.stdout };
75
- if (npm.exitCode !== COMMAND_NOT_FOUND_EXIT_CODE) {
76
- throw new Error(`Failed to install ${spec} with npm (exit ${npm.exitCode}): ${installDetail(npm)}`);
77
- }
78
- const bun = await install("bun", ["add", spec, "--no-save"], { cwd });
79
- if (bun.exitCode === 0)
80
- return { command: `bun add ${spec}`, detail: bun.stdout };
81
- throw new Error(`Failed to install ${spec}: npm was not found, bun add exited ${bun.exitCode}: ${installDetail(bun)}`);
82
- }
83
- async function defaultInstaller(command, args, options) {
84
- const result = await exec.spawn(command, [...args], {
85
- cwd: options.cwd,
86
- stdout: "capture",
87
- stderr: "capture",
88
- stdin: "ignore",
89
- check: false,
90
- });
91
- return {
92
- exitCode: result.exitCode,
93
- stdout: result.stdout,
94
- stderr: result.stderr,
95
- };
96
- }
97
- function installDetail(result) {
98
- return errorUtils.errorMessage(result.stderr || result.stdout || `exit ${result.exitCode}`);
99
- }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udHktbmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbnR5LW5hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDakQsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUEwQnZEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsV0FBNEIsT0FBTyxDQUFDLFFBQVEsRUFDNUMsT0FBZSxPQUFPLENBQUMsSUFBSTtJQUUzQixJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2xFLE9BQU8sMEJBQTBCLElBQUksRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8seUJBQXlCLElBQUksTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzNDLE9BQU8sZ0NBQWdDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENB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dHkncyBwbGF0Zm9ybSBuYXRpdmUgcGFja2FnZSBpcyBwcmVzZW50IGJlZm9yZSB0aGUgTm9kZSBhZGRvbiBsb2Fkcy5cbiAqXG4gKiBgQHB5ZGFudGljL21vbnR5YCBzaGlwcyBgQHB5ZGFudGljL21vbnR5LTxwbGF0Zm9ybT5gIGFzIG9wdGlvbmFsRGVwZW5kZW5jaWVzLlxuICogbnBtIGNhbiBza2lwIHRob3NlIChodHRwczovL2dpdGh1Yi5jb20vbnBtL2NsaS9pc3N1ZXMvNDgyOCksIHdoaWNoIHN1cmZhY2VzIGFzXG4gKiBcIkNhbm5vdCBmaW5kIG5hdGl2ZSBiaW5kaW5nXCIuIFRoaXMgbW9kdWxlIGluc3RhbGxzIG9ubHkgdGhlIGN1cnJlbnQgcGxhdGZvcm1cbiAqIHBhY2thZ2UsIGF0IHRoZSBhbHJlYWR5LWluc3RhbGxlZCBgQHB5ZGFudGljL21vbnR5YCB2ZXJzaW9uLCB3aXRob3V0IHJld3JpdGluZ1xuICogcGFja2FnZS5qc29uLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUsIGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL21vbnR5LW5hdGl2ZVwiKTtcbmNvbnN0IHJlcXVpcmVGcm9tSGVyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuLyoqIFJlc3VsdCBvZiBzcGF3bmluZyB0aGUgcGFja2FnZSBpbnN0YWxsZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbnR5TmF0aXZlSW5zdGFsbFJlc3VsdCB7XG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsO1xuICBzdGRvdXQ6IHN0cmluZztcbiAgc3RkZXJyOiBzdHJpbmc7XG59XG5cbi8qKiBJbnN0YWxsZXIgdXNlZCBieSB7QGxpbmsgZW5zdXJlTW9udHlOYXRpdmVCaW5kaW5nfS4gKi9cbmV4cG9ydCB0eXBlIE1vbnR5TmF0aXZlSW5zdGFsbGVyID0gKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nIH0sXG4pID0+IFByb21pc2U8TW9udHlOYXRpdmVJbnN0YWxsUmVzdWx0PjtcblxuLyoqIE92ZXJyaWRlcyBmb3Ige0BsaW5rIGVuc3VyZU1vbnR5TmF0aXZlQmluZGluZ30gKHRlc3RzIGluamVjdCByZXNvbHZlL2luc3RhbGwpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVNb250eU5hdGl2ZUJpbmRpbmdPcHRpb25zIHtcbiAgLyoqIFdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgaW4tcGxhY2UgaW5zdGFsbC4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLiAqL1xuICBjd2Q/OiBzdHJpbmc7XG4gIC8qKiBNb2R1bGUgcmVzb2x2ZXI7IGRlZmF1bHRzIHRvIGBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZWAuICovXG4gIHJlc29sdmU/OiAoc3BlY2lmaWVyOiBzdHJpbmcpID0+IHN0cmluZztcbiAgLyoqIFBhY2thZ2UgaW5zdGFsbGVyOyBkZWZhdWx0cyB0byBucG0sIHRoZW4gYnVuIHdoZW4gbnBtIGlzIG1pc3NpbmcuICovXG4gIGluc3RhbGw/OiBNb250eU5hdGl2ZUluc3RhbGxlcjtcbn1cblxuLyoqXG4gKiBucG0gcGFja2FnZSB0aGF0IHNoaXBzIE1vbnR5J3MgYC5ub2RlYCBhZGRvbiBhbmQgYG1vbnR5YCBiaW5hcnkgZm9yIHRoaXNcbiAqIHByb2Nlc3MuIE1hdGNoZXMgYEBweWRhbnRpYy9tb250eWAncyBgcGxhdGZvcm1UcmlwbGUoKWAgLyBvcHRpb25hbERlcGVuZGVuY2llcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbnR5TmF0aXZlQmluZGluZ1BhY2thZ2UoXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtLFxuICBhcmNoOiBzdHJpbmcgPSBwcm9jZXNzLmFyY2gsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocGxhdGZvcm0gPT09IFwiZGFyd2luXCIgJiYgKGFyY2ggPT09IFwieDY0XCIgfHwgYXJjaCA9PT0gXCJhcm02NFwiKSkge1xuICAgIHJldHVybiBgQHB5ZGFudGljL21vbnR5LWRhcndpbi0ke2FyY2h9YDtcbiAgfVxuICBpZiAocGxhdGZvcm0gPT09IFwibGludXhcIiAmJiAoYXJjaCA9PT0gXCJ4NjRcIiB8fCBhcmNoID09PSBcImFybTY0XCIpKSB7XG4gICAgcmV0dXJuIGBAcHlkYW50aWMvbW9udHktbGludXgtJHthcmNofS1nbnVgO1xuICB9XG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiICYmIGFyY2ggPT09IFwieDY0XCIpIHtcbiAgICByZXR1cm4gXCJAcHlkYW50aWMvbW9udHktd2luMzIteDY0LW1zdmNcIjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBNb250eSBuYXRpdmUgcGFja2FnZSwgaW5zdGFsbGluZyBpdCBpbiBwbGFjZVxuICogd2hlbiBucG0gb21pdHRlZCB0aGUgb3B0aW9uYWwgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vbnR5TmF0aXZlQmluZGluZyhcbiAgb3B0aW9uczogRW5zdXJlTW9udHlOYXRpdmVCaW5kaW5nT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBrZyA9IG1vbnR5TmF0aXZlQmluZGluZ1BhY2thZ2UoKTtcbiAgaWYgKCFwa2cpIHJldHVybjtcblxuICBjb25zdCByZXNvbHZlID0gb3B0aW9ucy5yZXNvbHZlID8/ICgoc3BlY2lmaWVyOiBzdHJpbmcpID0+IHJlcXVpcmVGcm9tSGVyZS5yZXNvbHZlKHNwZWNpZmllcikpO1xuICBpZiAoaXNSZXNvbHZhYmxlKHBrZywgcmVzb2x2ZSkpIHJldHVybjtcblxuICBjb25zdCB2ZXJzaW9uID0gbW9udHlQYWNrYWdlVmVyc2lvbihyZXNvbHZlKTtcbiAgY29uc3Qgc3BlYyA9IGAke3BrZ31AJHt2ZXJzaW9ufWA7XG4gIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkID8/IHByb2Nlc3MuY3dkKCk7XG4gIGxvZ2dlci53YXJuKFwibmF0aXZlLWJpbmRpbmc6bWlzc2luZ1wiLCB7IHBhY2thZ2U6IHNwZWMsIGN3ZCB9KTtcblxuICBjb25zdCBpbnN0YWxsID0gb3B0aW9ucy5pbnN0YWxsID8/IGRlZmF1bHRJbnN0YWxsZXI7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGluc3RhbGxOYXRpdmVQYWNrYWdlKHNwZWMsIGN3ZCwgaW5zdGFsbCk7XG4gIGlmICghaXNSZXNvbHZhYmxlKHBrZywgcmVzb2x2ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9udHkgbmF0aXZlIGJpbmRpbmcgJHtzcGVjfSBpcyBzdGlsbCBtaXNzaW5nIGFmdGVyICR7b3V0cHV0LmNvbW1hbmR9LiAke291dHB1dC5kZXRhaWx9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5pbmZvKFwibmF0aXZlLWJpbmRpbmc6aW5zdGFsbGVkXCIsIHsgcGFja2FnZTogc3BlYywgY29tbWFuZDogb3V0cHV0LmNvbW1hbmQgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZShzcGVjaWZpZXI6IHN0cmluZywgcmVzb2x2ZTogKHNwZWNpZmllcjogc3RyaW5nKSA9PiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXNvbHZlKGAke3NwZWNpZmllcn0vcGFja2FnZS5qc29uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb250eVBhY2thZ2VWZXJzaW9uKHJlc29sdmU6IChzcGVjaWZpZXI6IHN0cmluZykgPT4gc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGtnID0gcmVxdWlyZUZyb21IZXJlKHJlc29sdmUoXCJAcHlkYW50aWMvbW9udHkvcGFja2FnZS5qc29uXCIpKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgY29uc3QgdmVyc2lvbiA9IHBrZy52ZXJzaW9uPy50cmltKCk7XG4gIGlmICghdmVyc2lvbikgdGhyb3cgbmV3IEVycm9yKFwiSW5zdGFsbGVkIEBweWRhbnRpYy9tb250eSBoYXMgbm8gdmVyc2lvblwiKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxOYXRpdmVQYWNrYWdlKFxuICBzcGVjOiBzdHJpbmcsXG4gIGN3ZDogc3RyaW5nLFxuICBpbnN0YWxsOiBNb250eU5hdGl2ZUluc3RhbGxlcixcbik6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGRldGFpbDogc3RyaW5nIH0+IHtcbiAgY29uc3QgbnBtID0gYXdhaXQgaW5zdGFsbChcIm5wbVwiLCBbXCJpbnN0YWxsXCIsIHNwZWMsIFwiLS1uby1zYXZlXCIsIFwiLS1uby1wYWNrYWdlLWxvY2tcIl0sIHsgY3dkIH0pO1xuICBpZiAobnBtLmV4aXRDb2RlID09PSAwKSByZXR1cm4geyBjb21tYW5kOiBgbnBtIGluc3RhbGwgJHtzcGVjfWAsIGRldGFpbDogbnBtLnN0ZG91dCB9O1xuICBpZiAobnBtLmV4aXRDb2RlICE9PSBDT01NQU5EX05PVF9GT1VORF9FWElUX0NPREUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbGwgJHtzcGVjfSB3aXRoIG5wbSAoZXhpdCAke25wbS5leGl0Q29kZX0pOiAke2luc3RhbGxEZXRhaWwobnBtKX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBidW4gPSBhd2FpdCBpbnN0YWxsKFwiYnVuXCIsIFtcImFkZFwiLCBzcGVjLCBcIi0tbm8tc2F2ZVwiXSwgeyBjd2QgfSk7XG4gIGlmIChidW4uZXhpdENvZGUgPT09IDApIHJldHVybiB7IGNvbW1hbmQ6IGBidW4gYWRkICR7c3BlY31gLCBkZXRhaWw6IGJ1bi5zdGRvdXQgfTtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBGYWlsZWQgdG8gaW5zdGFsbCAke3NwZWN9OiBucG0gd2FzIG5vdCBmb3VuZCwgYnVuIGFkZCBleGl0ZWQgJHtidW4uZXhpdENvZGV9OiAke2luc3RhbGxEZXRhaWwoYnVuKX1gLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0SW5zdGFsbGVyKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nIH0sXG4pOiBQcm9taXNlPE1vbnR5TmF0aXZlSW5zdGFsbFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjLnNwYXduKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIGNoZWNrOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgZXhpdENvZGU6IHJlc3VsdC5leGl0Q29kZSxcbiAgICBzdGRvdXQ6IHJlc3VsdC5zdGRvdXQsXG4gICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGV0YWlsKHJlc3VsdDogTW9udHlOYXRpdmVJbnN0YWxsUmVzdWx0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCBgZXhpdCAke3Jlc3VsdC5leGl0Q29kZX1gKTtcbn1cbiJdfQ==
@@ -1,149 +0,0 @@
1
- /**
2
- * Ensures Monty's platform native package is present before the Node addon loads.
3
- *
4
- * `@pydantic/monty` ships `@pydantic/monty-<platform>` as optionalDependencies.
5
- * npm can skip those (https://github.com/npm/cli/issues/4828), which surfaces as
6
- * "Cannot find native binding". This module installs only the current platform
7
- * package, at the already-installed `@pydantic/monty` version, without rewriting
8
- * package.json.
9
- *
10
- * @module
11
- */
12
-
13
- import { createRequire } from "node:module";
14
- import { COMMAND_NOT_FOUND_EXIT_CODE, exec } from "@dbx-tools/core";
15
- import { errorUtils, log } from "@dbx-tools/shared-core";
16
-
17
- const logger = log.logger("mastra/monty-native");
18
- const requireFromHere = createRequire(import.meta.url);
19
-
20
- /** Result of spawning the package installer. */
21
- export interface MontyNativeInstallResult {
22
- exitCode: number | null;
23
- stdout: string;
24
- stderr: string;
25
- }
26
-
27
- /** Installer used by {@link ensureMontyNativeBinding}. */
28
- export type MontyNativeInstaller = (
29
- command: string,
30
- args: readonly string[],
31
- options: { cwd: string },
32
- ) => Promise<MontyNativeInstallResult>;
33
-
34
- /** Overrides for {@link ensureMontyNativeBinding} (tests inject resolve/install). */
35
- export interface EnsureMontyNativeBindingOptions {
36
- /** Working directory for the in-place install. Defaults to `process.cwd()`. */
37
- cwd?: string;
38
- /** Module resolver; defaults to `createRequire(import.meta.url).resolve`. */
39
- resolve?: (specifier: string) => string;
40
- /** Package installer; defaults to npm, then bun when npm is missing. */
41
- install?: MontyNativeInstaller;
42
- }
43
-
44
- /**
45
- * npm package that ships Monty's `.node` addon and `monty` binary for this
46
- * process. Matches `@pydantic/monty`'s `platformTriple()` / optionalDependencies.
47
- */
48
- export function montyNativeBindingPackage(
49
- platform: NodeJS.Platform = process.platform,
50
- arch: string = process.arch,
51
- ): string | undefined {
52
- if (platform === "darwin" && (arch === "x64" || arch === "arm64")) {
53
- return `@pydantic/monty-darwin-${arch}`;
54
- }
55
- if (platform === "linux" && (arch === "x64" || arch === "arm64")) {
56
- return `@pydantic/monty-linux-${arch}-gnu`;
57
- }
58
- if (platform === "win32" && arch === "x64") {
59
- return "@pydantic/monty-win32-x64-msvc";
60
- }
61
- return undefined;
62
- }
63
-
64
- /**
65
- * Resolve the current platform's Monty native package, installing it in place
66
- * when npm omitted the optional dependency.
67
- */
68
- export async function ensureMontyNativeBinding(
69
- options: EnsureMontyNativeBindingOptions = {},
70
- ): Promise<void> {
71
- const pkg = montyNativeBindingPackage();
72
- if (!pkg) return;
73
-
74
- const resolve = options.resolve ?? ((specifier: string) => requireFromHere.resolve(specifier));
75
- if (isResolvable(pkg, resolve)) return;
76
-
77
- const version = montyPackageVersion(resolve);
78
- const spec = `${pkg}@${version}`;
79
- const cwd = options.cwd ?? process.cwd();
80
- logger.warn("native-binding:missing", { package: spec, cwd });
81
-
82
- const install = options.install ?? defaultInstaller;
83
- const output = await installNativePackage(spec, cwd, install);
84
- if (!isResolvable(pkg, resolve)) {
85
- throw new Error(
86
- `Monty native binding ${spec} is still missing after ${output.command}. ${output.detail}`,
87
- );
88
- }
89
- logger.info("native-binding:installed", { package: spec, command: output.command });
90
- }
91
-
92
- function isResolvable(specifier: string, resolve: (specifier: string) => string): boolean {
93
- try {
94
- resolve(`${specifier}/package.json`);
95
- return true;
96
- } catch {
97
- return false;
98
- }
99
- }
100
-
101
- function montyPackageVersion(resolve: (specifier: string) => string): string {
102
- const pkg = requireFromHere(resolve("@pydantic/monty/package.json")) as { version?: string };
103
- const version = pkg.version?.trim();
104
- if (!version) throw new Error("Installed @pydantic/monty has no version");
105
- return version;
106
- }
107
-
108
- async function installNativePackage(
109
- spec: string,
110
- cwd: string,
111
- install: MontyNativeInstaller,
112
- ): Promise<{ command: string; detail: string }> {
113
- const npm = await install("npm", ["install", spec, "--no-save", "--no-package-lock"], { cwd });
114
- if (npm.exitCode === 0) return { command: `npm install ${spec}`, detail: npm.stdout };
115
- if (npm.exitCode !== COMMAND_NOT_FOUND_EXIT_CODE) {
116
- throw new Error(
117
- `Failed to install ${spec} with npm (exit ${npm.exitCode}): ${installDetail(npm)}`,
118
- );
119
- }
120
-
121
- const bun = await install("bun", ["add", spec, "--no-save"], { cwd });
122
- if (bun.exitCode === 0) return { command: `bun add ${spec}`, detail: bun.stdout };
123
- throw new Error(
124
- `Failed to install ${spec}: npm was not found, bun add exited ${bun.exitCode}: ${installDetail(bun)}`,
125
- );
126
- }
127
-
128
- async function defaultInstaller(
129
- command: string,
130
- args: readonly string[],
131
- options: { cwd: string },
132
- ): Promise<MontyNativeInstallResult> {
133
- const result = await exec.spawn(command, [...args], {
134
- cwd: options.cwd,
135
- stdout: "capture",
136
- stderr: "capture",
137
- stdin: "ignore",
138
- check: false,
139
- });
140
- return {
141
- exitCode: result.exitCode,
142
- stdout: result.stdout,
143
- stderr: result.stderr,
144
- };
145
- }
146
-
147
- function installDetail(result: MontyNativeInstallResult): string {
148
- return errorUtils.errorMessage(result.stderr || result.stdout || `exit ${result.exitCode}`);
149
- }