@dbx-tools/appkit-model-gateway 0.9.174 → 0.9.176

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
@@ -51,6 +51,62 @@ The gateway supports:
51
51
  - OpenAI-compatible embeddings.
52
52
  - Codex model discovery and Responses traffic.
53
53
 
54
+ ## Use Smart Router
55
+
56
+ Select the virtual `smart-router` model from any supported chat protocol:
57
+
58
+ ```json
59
+ {
60
+ "model": "smart-router",
61
+ "input": "Refactor the authorization layer across the repository"
62
+ }
63
+ ```
64
+
65
+ Before returning `GET /v1/models`, the gateway makes one memoized
66
+ `task_v3` capability request to Databricks
67
+ `/ai-gateway/routing/v1/routes:select`. The virtual model is listed only when
68
+ that request succeeds for the active identity and live `system.ai.*`
69
+ candidates. Positive probes are shared for five minutes and concurrent probes
70
+ coalesce into one request.
71
+
72
+ For inference, the gateway extracts bounded task context from Responses input,
73
+ Chat Completions or Anthropic messages, plain text, or generic JSON objects. It
74
+ excludes credentials, tool schemas, and tool arguments. OpenAI-shaped requests
75
+ use the `codex` Smart Router harness policy; Anthropic Messages uses `claude`.
76
+ The selected route must match one of the offered, protocol-compatible live
77
+ models. There is no local tier classifier or fallback selector.
78
+
79
+ The same `smart-router` id works with Responses, Chat Completions, Anthropic
80
+ Messages, and Codex-compatible Responses traffic. Embeddings require an
81
+ explicit model. Explicit concrete models and model-class headers continue to
82
+ win.
83
+
84
+ Smart Router selections are pinned for the logical user turn. The default store
85
+ uses AppKit `CacheManager`, so configured Lakebase/PostgreSQL persistence is
86
+ reused across app replicas. Supply `smartRouterStore` to use another storage
87
+ implementation with the same `get`/`set` contract, including a SQLite-backed
88
+ adapter. Only the selected model and bounded route metadata are stored; prompts
89
+ and responses are not.
90
+
91
+ This state is a TTL route pin, not conversation history. The gateway does not
92
+ read Mastra `PostgresStore`: supported chat requests already carry the portable
93
+ transcript, and coupling routing to Mastra would exclude other chat clients.
94
+ AppKit cache persistence is also preferable to a gateway-owned file or a second
95
+ expiring table because it already handles process-local reuse, project-scoped
96
+ disk fallback, and configured Lakebase/PostgreSQL storage. A consumer can still
97
+ inject a different store when its deployment needs another backend.
98
+
99
+ Response headers expose the selected concrete model, returned route model,
100
+ harness, cache source, and any `task_v3` task tier, served tier, or profiler
101
+ status without rewriting the upstream response body's model identity.
102
+
103
+ Select a model without starting the server by passing a JSON or text file, or
104
+ `-` for standard input:
105
+
106
+ ```sh
107
+ dbx model-gateway --profile PROFILE --select-model-from request.json
108
+ ```
109
+
54
110
  ## Discover models
55
111
 
56
112
  ```ts
@@ -92,6 +148,13 @@ discovered value.
92
148
  `Originator: codex`. Codex slugs prefer fully qualified Databricks model service
93
149
  names.
94
150
 
151
+ Codex merges provider models with its bundled catalogue. The gateway reserves a
152
+ separate provider priority range so bundled recommendations remain together,
153
+ then places Smart Router before the Databricks model list. Codex-specific model
154
+ ordering puts GPT models first and newer family versions before older versions.
155
+ Databricks GPT labels include the `Databricks` prefix so they remain distinct
156
+ from bundled GPT models after Codex applies its compact label formatting.
157
+
95
158
  Point a Codex provider at:
96
159
 
97
160
  ```text
@@ -106,6 +169,16 @@ Use `wire_api = "responses"` and `supports_websockets = false`.
106
169
  `system.ai.*` AI Gateway services for non-exact eligible requests. An exact
107
170
  serving endpoint or `system.ai.*` name still wins.
108
171
 
172
+ Smart Router defaults to `smartRouter: "auto"` and is advertised only after its
173
+ capability probe succeeds. Set `smartRouter: "true"` to make model discovery
174
+ fail when the router is unavailable, or `smartRouter: "false"` to disable it.
175
+ Configure `smartRouterTimeoutMs`,
176
+ `smartRouterContextTokenBudget`, `smartRouterProbeTtlMs`,
177
+ `smartRouterProbeRefreshIntervalMs`, and `smartRouterRouteTtlSeconds` to tune
178
+ transport, context, request-driven probe expiry, background probe refresh, and
179
+ turn-pinning behavior. A failed real selection immediately invalidates the
180
+ positive probe.
181
+
109
182
  Use `overrides` when workspace metadata must be corrected for a specific model.
110
183
  For example, disable an advertised capability that the selected gateway route
111
184
  cannot use:
@@ -131,4 +204,5 @@ Overrides affect routing and the OpenAI and Codex model catalogues.
131
204
  - `gateway` handles protocol-neutral gateway requests.
132
205
  - `registry` discovers and resolves workspace models.
133
206
  - `router` selects a compatible route from model capabilities.
207
+ - `smartRouter` builds task context, probes availability, and calls `task_v3`.
134
208
  - `transport` sends requests to Databricks model APIs.
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-model-gateway";
6
- export const PACKAGE_VERSION = "0.9.174";
6
+ export const PACKAGE_VERSION = "0.9.176";
7
7
  export * as gateway from "./src/gateway.ts";
8
8
  export * as models from "./src/models.ts";
9
9
  export * as plugin from "./src/plugin.ts";
@@ -11,6 +11,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.ts";
11
11
  export * as registry from "./src/registry.ts";
12
12
  export * as router from "./src/router.ts";
13
13
  export * as routes from "./src/routes.ts";
14
+ export * as smartRouter from "./src/smart-router.ts";
14
15
  export * as translation from "./src/translation.ts";
15
16
  export * as transport from "./src/transport.ts";
16
17
  export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.ts";
@@ -24,6 +25,8 @@ export { DatabricksModelRegistry } from "./src/registry.ts";
24
25
  export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
25
26
  export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.ts";
26
27
  export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
28
+ export { SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey, SMART_ROUTER_DEFAULT_SETTINGS } from "./src/smart-router.ts";
29
+ export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
27
30
  export { translateGatewayRequest } from "./src/translation.ts";
28
31
  export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
29
32
  export type { DatabricksTransportRequest } from "./src/transport.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
2
- export declare const PACKAGE_VERSION = "0.9.174";
2
+ export declare const PACKAGE_VERSION = "0.9.176";
3
3
  export * as gateway from "./src/gateway.ts";
4
4
  export * as models from "./src/models.ts";
5
5
  export * as plugin from "./src/plugin.ts";
@@ -7,6 +7,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.ts";
7
7
  export * as registry from "./src/registry.ts";
8
8
  export * as router from "./src/router.ts";
9
9
  export * as routes from "./src/routes.ts";
10
+ export * as smartRouter from "./src/smart-router.ts";
10
11
  export * as translation from "./src/translation.ts";
11
12
  export * as transport from "./src/transport.ts";
12
13
  export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.ts";
@@ -20,6 +21,8 @@ export { DatabricksModelRegistry } from "./src/registry.ts";
20
21
  export type { ModelRegistryResolveOptions, ModelRegistry, ModelRegistryOptions } from "./src/registry.ts";
21
22
  export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.ts";
22
23
  export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
24
+ export { SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey, SMART_ROUTER_DEFAULT_SETTINGS } from "./src/smart-router.ts";
25
+ export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
23
26
  export { translateGatewayRequest } from "./src/translation.ts";
24
27
  export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
25
28
  export type { DatabricksTransportRequest } from "./src/transport.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-model-gateway";
5
- export const PACKAGE_VERSION = "0.9.174";
5
+ export const PACKAGE_VERSION = "0.9.176";
6
6
  export * as gateway from "./src/gateway.js";
7
7
  export * as models from "./src/models.js";
8
8
  export * as plugin from "./src/plugin.js";
@@ -10,6 +10,7 @@ export * as reasoningAdapt from "./src/reasoning-adapt.js";
10
10
  export * as registry from "./src/registry.js";
11
11
  export * as router from "./src/router.js";
12
12
  export * as routes from "./src/routes.js";
13
+ export * as smartRouter from "./src/smart-router.js";
13
14
  export * as translation from "./src/translation.js";
14
15
  export * as transport from "./src/transport.js";
15
16
  export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceTemperature, gatewayModelSelection } from "./src/gateway.js";
@@ -19,6 +20,7 @@ export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reas
19
20
  export { DatabricksModelRegistry } from "./src/registry.js";
20
21
  export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.js";
21
22
  export { sendHealth, sendModels, sendInference } from "./src/routes.js";
23
+ export { SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey, SMART_ROUTER_DEFAULT_SETTINGS } from "./src/smart-router.js";
22
24
  export { translateGatewayRequest } from "./src/translation.js";
23
25
  export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1SSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTc0XCI7XG5leHBvcnQgKiBhcyBnYXRld2F5IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ0FkYXB0IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCAqIGFzIHJlZ2lzdHJ5IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVyIGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyB0cmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zcG9ydCBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlFcnJvciwgTW9kZWxHYXRld2F5LCBzYW5pdGl6ZUluZmVyZW5jZUJvZHksIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUsIGdhdGV3YXlNb2RlbFNlbGVjdGlvbiB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0IHsgbGlzdE1vZGVsc1BheWxvYWQsIGNvZGV4TW9kZWxTbHVnIH0gZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0IHsgTW9kZWxHYXRld2F5UGx1Z2luLCBtb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsR2F0ZXdheVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB7IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nLCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgdHlwZSB7IEFkYXB0ZWRJbmZlcmVuY2VCb2R5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxSZWdpc3RyeVJlc29sdmVPcHRpb25zLCBNb2RlbFJlZ2lzdHJ5LCBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHsgVW5zdXBwb3J0ZWRHYXRld2F5RmVhdHVyZUVycm9yLCByZXNvbHZlUm91dGUsIHJlcXVlc3RlZEZlYXR1cmVzLCBpc0NvZGV4T3JpZ2luYXRvciB9IGZyb20gXCIuL3NyYy9yb3V0ZXIudHNcIjtcbmV4cG9ydCB7IHNlbmRIZWFsdGgsIHNlbmRNb2RlbHMsIHNlbmRJbmZlcmVuY2UgfSBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHksIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZSLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1vZGVsLWdhdGV3YXlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xNzZcIjtcbmV4cG9ydCAqIGFzIGdhdGV3YXkgZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVscyBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcmVhc29uaW5nQWRhcHQgZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0ICogYXMgcmVnaXN0cnkgZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXIgZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVzIGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNtYXJ0Um91dGVyIGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNwb3J0IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbmV4cG9ydCB7IE1vZGVsR2F0ZXdheUVycm9yLCBNb2RlbEdhdGV3YXksIHNhbml0aXplSW5mZXJlbmNlQm9keSwgYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZSwgZ2F0ZXdheU1vZGVsU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCwgY29kZXhNb2RlbFNsdWcgfSBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWRhcHRlZEluZmVyZW5jZUJvZHkgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMsIE1vZGVsUmVnaXN0cnksIE1vZGVsUmVnaXN0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IsIHJlc29sdmVSb3V0ZSwgcmVxdWVzdGVkRmVhdHVyZXMsIGlzQ29kZXhPcmlnaW5hdG9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHsgc2VuZEhlYWx0aCwgc2VuZE1vZGVscywgc2VuZEluZmVyZW5jZSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB7IFNtYXJ0Um91dGVyUHJvYmVSZWNvcmRTY2hlbWEsIFNtYXJ0Um91dGVyRXJyb3IsIEFwcEtpdFNtYXJ0Um91dGVyU3RvcmUsIEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSwgU21hcnRSb3V0ZXJTZXJ2aWNlLCBzbWFydFJvdXRlckNhbmRpZGF0ZXMsIFNtYXJ0Um91dGVyQ29udGV4dEJ1aWxkZXIsIFNtYXJ0TW9kZWxSb3V0ZXIsIHNtYXJ0Um91dGVyVHVybktleSwgU01BUlRfUk9VVEVSX0RFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNtYXJ0Um91dGVyU2V0dGluZ3MsIFNtYXJ0Um91dGVyQ2FuZGlkYXRlLCBTbWFydFJvdXRlclNlbGVjdGlvbiwgU21hcnRSb3V0ZXJTdG9yZSwgU21hcnRSb3V0ZXJQcm9iZVJlY29yZCwgU21hcnRSb3V0ZXJQcm9iZVN0b3JlLCBTbWFydFJvdXRlclJlc3VsdCwgU21hcnRSb3V0ZXJDb250ZXh0LCBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHksIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuIl19
@@ -4,11 +4,20 @@
4
4
  * @module
5
5
  */
6
6
  import { type ServingEndpointSummary, type ModelClass as ModelClassType } from "@dbx-tools/shared-model";
7
- import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse } from "@dbx-tools/shared-model-gateway";
7
+ import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse, SmartRouterMode } from "@dbx-tools/shared-model-gateway";
8
8
  import { type ModelRegistry } from "./registry.ts";
9
+ import { type SmartRouterService, type SmartRouterStore } from "./smart-router.ts";
9
10
  /** Model gateway runtime configuration. */
10
11
  export interface ModelGatewayOptions {
11
12
  readonly cacheTtlMs?: number;
13
+ readonly smartRouter?: SmartRouterMode;
14
+ readonly smartRouterContextTokenBudget?: number;
15
+ readonly smartRouterProbeRefreshIntervalMs?: number;
16
+ readonly smartRouterProbeTtlMs?: number;
17
+ readonly smartRouterRouteTtlSeconds?: number;
18
+ readonly smartRouterTimeoutMs?: number;
19
+ readonly smartRouterService?: SmartRouterService;
20
+ readonly smartRouterStore?: SmartRouterStore;
12
21
  readonly overrides?: readonly ModelCapabilityOverride[];
13
22
  readonly model?: string;
14
23
  readonly modelClass?: ModelClassType;
@@ -22,6 +31,8 @@ export declare class ModelGatewayError extends Error {
22
31
  /** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
23
32
  export declare class ModelGateway {
24
33
  private readonly registry;
34
+ private readonly smartRouter?;
35
+ private readonly smartRouterMode;
25
36
  private readonly model?;
26
37
  private readonly modelClass?;
27
38
  private readonly preferSystemModels;
@@ -43,6 +54,7 @@ export declare function gatewayModelSelection(body: Readonly<Record<string, unkn
43
54
  readonly model?: string;
44
55
  readonly modelClass?: ModelClassType;
45
56
  }, protocol?: ClientProtocol): {
57
+ readonly smartRouter?: boolean;
46
58
  readonly model?: string;
47
59
  readonly modelClass?: ModelClassType;
48
60
  };
@@ -3,13 +3,15 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { log } from "@dbx-tools/shared-core";
7
6
  import { modelTemperatureSupportFor } from "@dbx-tools/model";
7
+ import { log } from "@dbx-tools/shared-core";
8
8
  import { ModelClass, ModelClassSchema, } from "@dbx-tools/shared-model";
9
+ import { MODEL_GATEWAY_DEFAULTS, SMART_ROUTER_HARNESS_HEADER, SMART_ROUTER_MODEL_ID, SMART_ROUTER_PROFILER_STATUS_HEADER, SMART_ROUTER_ROUTE_MODEL_HEADER, SMART_ROUTER_SELECTED_MODEL_HEADER, SMART_ROUTER_SERVED_TIER_HEADER, SMART_ROUTER_SOURCE_HEADER, SMART_ROUTER_TASK_TIER_HEADER, isSmartRouterModelId, } from "@dbx-tools/shared-model-gateway";
9
10
  import { listModelsPayload } from "./models.js";
10
11
  import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
11
12
  import { DatabricksModelRegistry, } from "./registry.js";
12
13
  import { isCodexOriginator, requestedFeatures, resolveRoute } from "./router.js";
14
+ import { SmartModelRouter, } from "./smart-router.js";
13
15
  import { translateGatewayRequest } from "./translation.js";
14
16
  import { fetchDatabricks, gatewayResponseHeaders } from "./transport.js";
15
17
  const logger = log.logger("appkit/model-gateway");
@@ -27,6 +29,8 @@ export class ModelGatewayError extends Error {
27
29
  /** AppKit-scoped model gateway with dynamic model discovery and streaming inference. */
28
30
  export class ModelGateway {
29
31
  registry;
32
+ smartRouter;
33
+ smartRouterMode;
30
34
  model;
31
35
  modelClass;
32
36
  preferSystemModels;
@@ -39,18 +43,42 @@ export class ModelGateway {
39
43
  : {}),
40
44
  };
41
45
  this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
46
+ this.smartRouterMode = options.smartRouter ?? MODEL_GATEWAY_DEFAULTS.smartRouter;
47
+ if (this.smartRouterMode !== "false") {
48
+ this.smartRouter = new SmartModelRouter({
49
+ contextTokenBudget: options.smartRouterContextTokenBudget ??
50
+ MODEL_GATEWAY_DEFAULTS.smartRouterContextTokenBudget,
51
+ probeRefreshIntervalMs: options.smartRouterProbeRefreshIntervalMs ??
52
+ MODEL_GATEWAY_DEFAULTS.smartRouterProbeRefreshIntervalMs,
53
+ probeTtlMs: options.smartRouterProbeTtlMs ?? MODEL_GATEWAY_DEFAULTS.smartRouterProbeTtlMs,
54
+ routeTtlSeconds: options.smartRouterRouteTtlSeconds ?? MODEL_GATEWAY_DEFAULTS.smartRouterRouteTtlSeconds,
55
+ routerName: "task_v3",
56
+ timeoutMs: options.smartRouterTimeoutMs ?? MODEL_GATEWAY_DEFAULTS.smartRouterTimeoutMs,
57
+ }, options.smartRouterService, options.smartRouterStore);
58
+ }
42
59
  this.model = options.model;
43
60
  this.modelClass = options.modelClass;
44
- this.preferSystemModels = options.preferSystemModels ?? false;
61
+ this.preferSystemModels =
62
+ options.preferSystemModels ?? MODEL_GATEWAY_DEFAULTS.preferSystemModels;
45
63
  }
46
64
  /** Return the live OpenAI model list, including Codex metadata when requested. */
47
65
  async models(originator, search) {
48
66
  const codex = isCodexOriginator(originator);
49
67
  logger.debug("listing models", { codex, search });
50
68
  const query = search?.trim();
51
- const targets = query ? await this.registry.search(query) : await this.registry.list();
69
+ const smartRouterSearch = query !== undefined && SMART_ROUTER_MODEL_ID.includes(query.toLowerCase());
70
+ const targets = query && !smartRouterSearch ? await this.registry.search(query) : await this.registry.list();
71
+ const smartRouterTargets = this.smartRouterMode === "true" && query && !smartRouterSearch
72
+ ? await this.registry.list()
73
+ : targets;
74
+ const shouldProbeSmartRouter = Boolean(this.smartRouter) && (this.smartRouterMode === "true" || !query || smartRouterSearch);
75
+ const smartRouterEnabled = shouldProbeSmartRouter && (await this.smartRouter.isEnabled(smartRouterTargets));
76
+ if (this.smartRouterMode === "true" && !smartRouterEnabled) {
77
+ throw new ModelGatewayError(503, "Databricks Smart Router is required but unavailable for the active workspace identity");
78
+ }
52
79
  logger.debug("listed models", { codex, count: targets.length });
53
- return listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels);
80
+ const payload = listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels, smartRouterEnabled && (!query || smartRouterSearch));
81
+ return smartRouterSearch ? onlySmartRouter(payload) : payload;
54
82
  }
55
83
  /** Resolve and execute one inference request. */
56
84
  async inference(protocol, body, headers, signal) {
@@ -60,6 +88,7 @@ export class ModelGateway {
60
88
  modelClass: this.modelClass,
61
89
  }, protocol);
62
90
  logger.debug("resolving request", {
91
+ smartRouter: selection.smartRouter === true,
63
92
  clientProtocol: protocol,
64
93
  model: selection.model,
65
94
  modelClass: selection.modelClass,
@@ -67,11 +96,29 @@ export class ModelGateway {
67
96
  stream: sanitizedBody.stream === true,
68
97
  });
69
98
  const features = requestedFeatures(sanitizedBody);
70
- const target = await this.registry.resolve(selection.model, {
71
- ...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
72
- ...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
73
- ...(features.tools ? { requiresTools: true } : {}),
74
- });
99
+ if (selection.smartRouter && protocol === "openai-embeddings") {
100
+ throw new ModelGatewayError(400, "Model smart-router is available only for chat requests");
101
+ }
102
+ const smartRouter = selection.smartRouter && this.smartRouter
103
+ ? await this.smartRouter.resolve({
104
+ protocol: protocol,
105
+ body: sanitizedBody,
106
+ headers,
107
+ features,
108
+ targets: await this.registry.list(),
109
+ preferSystemModels: this.preferSystemModels,
110
+ signal,
111
+ })
112
+ : undefined;
113
+ if (selection.smartRouter && !smartRouter) {
114
+ throw new ModelGatewayError(404, "Databricks Smart Router is disabled");
115
+ }
116
+ const target = smartRouter?.target ??
117
+ (await this.registry.resolve(selection.model, {
118
+ ...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
119
+ ...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
120
+ ...(features.tools ? { requiresTools: true } : {}),
121
+ }));
75
122
  if (!target) {
76
123
  throw new ModelGatewayError(404, selection.model
77
124
  ? `Model not found: ${selection.model}`
@@ -79,7 +126,7 @@ export class ModelGateway {
79
126
  }
80
127
  const route = resolveRoute({
81
128
  clientProtocol: protocol,
82
- ...(selection.model ? { requestedModel: selection.model } : {}),
129
+ ...(!smartRouter && selection.model ? { requestedModel: selection.model } : {}),
83
130
  originator: headers.get("originator") ?? undefined,
84
131
  preferSystemModels: this.preferSystemModels,
85
132
  features,
@@ -90,7 +137,7 @@ export class ModelGateway {
90
137
  model: target.id,
91
138
  upstreamProtocol: route.upstreamProtocol,
92
139
  });
93
- const temperatureBody = adaptInferenceTemperature(target.endpoint ?? target.id, sanitizedBody);
140
+ const temperatureBody = adaptInferenceTemperature(target.endpoint ?? target.id, smartRouter?.body ?? sanitizedBody);
94
141
  const adapted = adaptInferenceReasoning(target.id, temperatureBody);
95
142
  let response = await this.forward(route, adapted.body, headers, signal);
96
143
  const retryBody = await learnAndAdaptReasoningRetry({
@@ -106,10 +153,15 @@ export class ModelGateway {
106
153
  logResponse(route.upstreamProtocol, target.id, response);
107
154
  if (route.upstreamProtocol === "ai-sdk") {
108
155
  response.headers.set("x-dbx-tools-upstream", route.upstreamProtocol);
156
+ if (smartRouter) {
157
+ applySmartRouterObservationHeaders(response.headers, smartRouter.observation);
158
+ }
109
159
  return response;
110
160
  }
111
161
  const forwarded = gatewayResponseHeaders(response.headers);
112
162
  forwarded.set("x-dbx-tools-upstream", route.upstreamProtocol);
163
+ if (smartRouter)
164
+ applySmartRouterObservationHeaders(forwarded, smartRouter.observation);
113
165
  return new Response(response.body, {
114
166
  status: response.status,
115
167
  statusText: response.statusText,
@@ -169,17 +221,48 @@ export function gatewayModelSelection(body, headers, defaults = {}, protocol) {
169
221
  throw new ModelGatewayError(400, "Model and model class are mutually exclusive");
170
222
  }
171
223
  if (model)
172
- return { model };
224
+ return isSmartRouterModelId(model) ? { smartRouter: true } : { model };
173
225
  if (parsedClass?.data)
174
226
  return { modelClass: parsedClass.data };
175
- if (defaults.model)
176
- return { model: defaults.model };
227
+ if (defaults.model) {
228
+ return isSmartRouterModelId(defaults.model) ? { smartRouter: true } : { model: defaults.model };
229
+ }
177
230
  if (defaults.modelClass)
178
231
  return { modelClass: defaults.modelClass };
179
232
  if (protocol === "openai-embeddings")
180
233
  return { modelClass: ModelClass.Embedding };
181
234
  return {};
182
235
  }
236
+ function applySmartRouterObservationHeaders(headers, observation) {
237
+ headers.set(SMART_ROUTER_SELECTED_MODEL_HEADER, observation.selectedModel);
238
+ headers.set(SMART_ROUTER_ROUTE_MODEL_HEADER, observation.routeModel);
239
+ headers.set(SMART_ROUTER_HARNESS_HEADER, observation.harness);
240
+ headers.set(SMART_ROUTER_SOURCE_HEADER, observation.source);
241
+ const taskTier = stringParam(observation.params, "task_tier");
242
+ const servedTier = stringParam(observation.params, "served_tier");
243
+ const profilerStatus = stringParam(observation.params, "profiler_status");
244
+ if (taskTier)
245
+ headers.set(SMART_ROUTER_TASK_TIER_HEADER, taskTier);
246
+ if (servedTier)
247
+ headers.set(SMART_ROUTER_SERVED_TIER_HEADER, servedTier);
248
+ if (profilerStatus)
249
+ headers.set(SMART_ROUTER_PROFILER_STATUS_HEADER, profilerStatus);
250
+ }
251
+ function stringParam(params, key) {
252
+ const value = params?.[key];
253
+ return typeof value === "string" && value ? value : undefined;
254
+ }
255
+ function onlySmartRouter(payload) {
256
+ if ("models" in payload) {
257
+ return {
258
+ models: payload.models.filter((model) => model.slug.toLowerCase().endsWith(`/${SMART_ROUTER_MODEL_ID}`)),
259
+ };
260
+ }
261
+ return {
262
+ object: "list",
263
+ data: payload.data.filter((model) => model.id === SMART_ROUTER_MODEL_ID),
264
+ };
265
+ }
183
266
  function logResponse(upstreamProtocol, model, response) {
184
267
  const details = {
185
268
  contentType: response.headers.get("content-type"),
@@ -192,4 +275,4 @@ function logResponse(upstreamProtocol, model, response) {
192
275
  else
193
276
  logger.warn("upstream request failed", details);
194
277
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FHakIsTUFBTSx5QkFBeUIsQ0FBQztBQVFqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDbEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFXckMsK0RBQStEO0FBQy9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBRS9CO0lBRFgsWUFDVyxNQUFjLEVBQ3ZCLE9BQWU7UUFFZixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFITixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBSXZCLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sT0FBTyxZQUFZO0lBQ04sUUFBUSxDQUFnQjtJQUN4QixLQUFLLENBQVU7SUFDZixVQUFVLENBQWtCO0lBQzVCLGtCQUFrQixDQUFVO0lBRTdDLFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLE1BQU0sZUFBZSxHQUF5QjtZQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixLQUFLLFNBQVM7Z0JBQzFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUM7SUFDaEUsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixLQUFLLENBQUMsTUFBTSxDQUFDLFVBQW1CLEVBQUUsTUFBZTtRQUMvQyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRSxPQUFPLGlCQUFpQixDQUN0QixPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCxpREFBaUQ7SUFDakQsS0FBSyxDQUFDLFNBQVMsQ0FDYixRQUF3QixFQUN4QixJQUF1QyxFQUN2QyxPQUFnQixFQUNoQixNQUFtQjtRQUVuQixNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FDckMsYUFBYSxFQUNiLE9BQU8sRUFDUDtZQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDNUIsRUFDRCxRQUFRLENBQ1QsQ0FBQztRQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7WUFDaEMsY0FBYyxFQUFFLFFBQVE7WUFDeEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1lBQ3RCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtZQUNoQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxTQUFTO1lBQ2xELE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxLQUFLLElBQUk7U0FDdEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQzFELEdBQUcsQ0FBQyxRQUFRLEtBQUssbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNuRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksaUJBQWlCLENBQ3pCLEdBQUcsRUFDSCxTQUFTLENBQUMsS0FBSztnQkFDYixDQUFDLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZDLENBQUMsQ0FBQyxzQ0FBc0MsQ0FDM0MsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDekIsY0FBYyxFQUFFLFFBQVE7WUFDeEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9ELFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFNBQVM7WUFDbEQsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxRQUFRO1lBQ1IsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ3JCLGNBQWMsRUFBRSxRQUFRO1lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNoQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUMsQ0FBQztRQUVILE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUMvQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQzVCLGFBQWEsQ0FDZCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRSxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sMkJBQTJCLENBQUM7WUFDbEQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2hCLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVE7WUFDUixrQkFBa0IsRUFBRSxPQUFPLENBQUMsVUFBVTtTQUN2QyxDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckUsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRCxTQUFTLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlELE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNqQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLE9BQU8sRUFBRSxTQUFTO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsT0FBTztRQUNMLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQ25CLEtBQW1CLEVBQ25CLElBQXVDLEVBQ3ZDLE9BQWdCLEVBQ2hCLE1BQW1CO1FBRW5CLElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQUVELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQXVDO0lBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvRSxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLHVEQUF1RCxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUM5QixPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDN0IsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXNDLEVBQ3RDLElBQXVDO0lBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdGLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMxQiwwQkFBMEIsRUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3ZELENBQUM7SUFDRixPQUFPLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDNUUsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQXVDLEVBQ3ZDLE9BQWdCLEVBQ2hCLFdBQThFLEVBQUUsRUFDaEYsUUFBeUI7SUFFekIsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEcsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUUsSUFBSSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRSx3QkFBd0IsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsOENBQThDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzVCLElBQUksV0FBVyxFQUFFLElBQUk7UUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLFFBQVEsQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckQsSUFBSSxRQUFRLENBQUMsVUFBVTtRQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BFLElBQUksUUFBUSxLQUFLLG1CQUFtQjtRQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xGLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGdCQUF3QixFQUFFLEtBQWEsRUFBRSxRQUFrQjtJQUM5RSxNQUFNLE9BQU8sR0FBRztRQUNkLFdBQVcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDakQsS0FBSztRQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixnQkFBZ0I7S0FDakIsQ0FBQztJQUNGLElBQUksUUFBUSxDQUFDLEVBQUU7UUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3RvY29sLWluZGVwZW5kZW50IGdhdGV3YXkgc2VydmljZSB1c2VkIGJ5IHBsdWdpbiBhbmQgc3RhbmRhbG9uZSByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbFRlbXBlcmF0dXJlU3VwcG9ydEZvciB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICBNb2RlbENsYXNzU2NoZW1hLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudFByb3RvY29sLFxuICBHYXRld2F5Um91dGUsXG4gIE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgbGlzdE1vZGVsc1BheWxvYWQgfSBmcm9tIFwiLi9tb2RlbHMudHNcIjtcbmltcG9ydCB7IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nLCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkgfSBmcm9tIFwiLi9yZWFzb25pbmctYWRhcHQudHNcIjtcbmltcG9ydCB7XG4gIERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeU9wdGlvbnMsXG59IGZyb20gXCIuL3JlZ2lzdHJ5LnRzXCI7XG5pbXBvcnQgeyBpc0NvZGV4T3JpZ2luYXRvciwgcmVxdWVzdGVkRmVhdHVyZXMsIHJlc29sdmVSb3V0ZSB9IGZyb20gXCIuL3JvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogcmVhZG9ubHkgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGVbXTtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbjtcbn1cblxuLyoqIEVycm9yIGNhcnJ5aW5nIGFuIEhUVFAgc3RhdHVzIGFuZCBwcm90b2NvbC1zYWZlIG1lc3NhZ2UuICovXG5leHBvcnQgY2xhc3MgTW9kZWxHYXRld2F5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJNb2RlbEdhdGV3YXlFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQtc2NvcGVkIG1vZGVsIGdhdGV3YXkgd2l0aCBkeW5hbWljIG1vZGVsIGRpc2NvdmVyeSBhbmQgc3RyZWFtaW5nIGluZmVyZW5jZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXkge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBNb2RlbFJlZ2lzdHJ5O1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwcmVmZXJTeXN0ZW1Nb2RlbHM6IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gICAgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gICAgdGhpcy5tb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzO1xuICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzID0gb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCB0YXJnZXRzID0gcXVlcnkgPyBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnNlYXJjaChxdWVyeSkgOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gbGlzdE1vZGVsc1BheWxvYWQoXG4gICAgICB0YXJnZXRzLFxuICAgICAgY29kZXgsXG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDAsXG4gICAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICApO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgfSxcbiAgICAgIHByb3RvY29sLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHJlcXVlc3RcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHNlbGVjdGlvbi5tb2RlbCxcbiAgICAgIG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHN0cmVhbTogc2FuaXRpemVkQm9keS5zdHJlYW0gPT09IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZmVhdHVyZXMgPSByZXF1ZXN0ZWRGZWF0dXJlcyhzYW5pdGl6ZWRCb2R5KTtcbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoc2VsZWN0aW9uLm1vZGVsLCB7XG4gICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgIH0pO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwNCxcbiAgICAgICAgc2VsZWN0aW9uLm1vZGVsXG4gICAgICAgICAgPyBgTW9kZWwgbm90IGZvdW5kOiAke3NlbGVjdGlvbi5tb2RlbH1gXG4gICAgICAgICAgOiBcIk5vIG1vZGVsIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjbGFzc1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbCA/IHsgcmVxdWVzdGVkTW9kZWw6IHNlbGVjdGlvbi5tb2RlbCB9IDoge30pLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJyb3V0ZWRcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wZXJhdHVyZUJvZHkgPSBhZGFwdEluZmVyZW5jZVRlbXBlcmF0dXJlKFxuICAgICAgdGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCxcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgKTtcbiAgICBjb25zdCBhZGFwdGVkID0gYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcodGFyZ2V0LmlkLCB0ZW1wZXJhdHVyZUJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keTogdGVtcGVyYXR1cmVCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgY29uc3QgZm9yd2FyZGVkID0gZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgICBmb3J3YXJkZWQuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKTogeyByZWFkb25seSBtb2RlbD86IHN0cmluZzsgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlIH0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHJldHVybiB7IG1vZGVsIH07XG4gIGlmIChwYXJzZWRDbGFzcz8uZGF0YSkgcmV0dXJuIHsgbW9kZWxDbGFzczogcGFyc2VkQ2xhc3MuZGF0YSB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWwpIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWxDbGFzcykgcmV0dXJuIHsgbW9kZWxDbGFzczogZGVmYXVsdHMubW9kZWxDbGFzcyB9O1xuICBpZiAocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikgcmV0dXJuIHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfTtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FHakIsTUFBTSx5QkFBeUIsQ0FBQztBQVNqQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0Isb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVGLE9BQU8sRUFDTCx1QkFBdUIsR0FHeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNsRCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLDBCQUEwQixHQUFHLENBQUMs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QUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBMEI7SUFDakQsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUMvRDtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLHFCQUFxQixDQUFDO0tBQ3pFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLFFBQWtCO0lBQzlFLE1BQU0sT0FBTyxHQUFHO1FBQ2QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUNqRCxLQUFLO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLFxuICBTTUFSVF9ST1VURVJfSEFSTkVTU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9ST1VURV9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRVJWRURfVElFUl9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUixcbiAgaXNTbWFydFJvdXRlck1vZGVsSWQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7XG4gIFNtYXJ0TW9kZWxSb3V0ZXIsXG4gIHR5cGUgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICB0eXBlIFNtYXJ0Um91dGVyU3RvcmUsXG59IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydFJvdXRlck1vZGU7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0PzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUHJvYmVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclNlcnZpY2U/OiBTbWFydFJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyU3RvcmU/OiBTbWFydFJvdXRlclN0b3JlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNtYXJ0Um91dGVyTW9kZTogU21hcnRSb3V0ZXJNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwcmVmZXJTeXN0ZW1Nb2RlbHM6IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gICAgdGhpcy5zbWFydFJvdXRlck1vZGUgPSBvcHRpb25zLnNtYXJ0Um91dGVyID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXI7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlICE9PSBcImZhbHNlXCIpIHtcbiAgICAgIHRoaXMuc21hcnRSb3V0ZXIgPSBuZXcgU21hcnRNb2RlbFJvdXRlcihcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRleHRUb2tlbkJ1ZGdldDpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQgPz9cbiAgICAgICAgICAgIE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQsXG4gICAgICAgICAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgICBwcm9iZVR0bE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyxcbiAgICAgICAgICByb3V0ZVR0bFNlY29uZHM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHMsXG4gICAgICAgICAgcm91dGVyTmFtZTogXCJ0YXNrX3YzXCIsXG4gICAgICAgICAgdGltZW91dE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyVGltZW91dE1zID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJUaW1lb3V0TXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJTZXJ2aWNlLFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU3RvcmUsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPVxuICAgICAgb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5wcmVmZXJTeXN0ZW1Nb2RlbHM7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCBzbWFydFJvdXRlclNlYXJjaCA9XG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIFNNQVJUX1JPVVRFUl9NT0RFTF9JRC5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgIHF1ZXJ5ICYmICFzbWFydFJvdXRlclNlYXJjaCA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHF1ZXJ5KSA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyVGFyZ2V0cyA9XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyTW9kZSA9PT0gXCJ0cnVlXCIgJiYgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBpZiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiICYmICFzbWFydFJvdXRlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNTAzLFxuICAgICAgICBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIHJlcXVpcmVkIGJ1dCB1bmF2YWlsYWJsZSBmb3IgdGhlIGFjdGl2ZSB3b3Jrc3BhY2UgaWRlbnRpdHlcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIGNvbnN0IHBheWxvYWQgPSBsaXN0TW9kZWxzUGF5bG9hZChcbiAgICAgIHRhcmdldHMsXG4gICAgICBjb2RleCxcbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCxcbiAgICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgc21hcnRSb3V0ZXJFbmFibGVkICYmICghcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpLFxuICAgICk7XG4gICAgcmV0dXJuIHNtYXJ0Um91dGVyU2VhcmNoID8gb25seVNtYXJ0Um91dGVyKHBheWxvYWQpIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuZCBleGVjdXRlIG9uZSBpbmZlcmVuY2UgcmVxdWVzdC4gKi9cbiAgYXN5bmMgaW5mZXJlbmNlKFxuICAgIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQm9keSA9IHNhbml0aXplSW5mZXJlbmNlQm9keShib2R5KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gICAgICBzYW5pdGl6ZWRCb2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIH0sXG4gICAgICBwcm90b2NvbCxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIHNtYXJ0Um91dGVyOiBzZWxlY3Rpb24uc21hcnRSb3V0ZXIgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBzbWFydC1yb3V0ZXIgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGNoYXQgcmVxdWVzdHNcIik7XG4gICAgfVxuICAgIGNvbnN0IHNtYXJ0Um91dGVyID1cbiAgICAgIHNlbGVjdGlvbi5zbWFydFJvdXRlciAmJiB0aGlzLnNtYXJ0Um91dGVyXG4gICAgICAgID8gYXdhaXQgdGhpcy5zbWFydFJvdXRlci5yZXNvbHZlKHtcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCBhcyBFeGNsdWRlPENsaWVudFByb3RvY29sLCBcIm9wZW5haS1lbWJlZGRpbmdzXCI+LFxuICAgICAgICAgICAgYm9keTogc2FuaXRpemVkQm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgICAgIHRhcmdldHM6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpLFxuICAgICAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmICFzbWFydFJvdXRlcikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwNCwgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyBkaXNhYmxlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhd2FpdCB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoc2VsZWN0aW9uLm1vZGVsLCB7XG4gICAgICAgIC4uLihwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiID8geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9IDoge30pLFxuICAgICAgICAuLi4oc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwNCxcbiAgICAgICAgc2VsZWN0aW9uLm1vZGVsXG4gICAgICAgICAgPyBgTW9kZWwgbm90IGZvdW5kOiAke3NlbGVjdGlvbi5tb2RlbH1gXG4gICAgICAgICAgOiBcIk5vIG1vZGVsIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjbGFzc1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgLi4uKCFzbWFydFJvdXRlciAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIGlmIChzbWFydFJvdXRlcikgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhmb3J3YXJkZWQsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IGZvcndhcmRlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hpbmcgbW9kZWwgY2F0YWxvZ3VlXCIpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZm9yd2FyZChcbiAgICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KHJvdXRlLCBib2R5LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hEYXRhYnJpY2tzKHsgcm91dGUsIGJvZHksIGhlYWRlcnMsIHNpZ25hbCB9KTtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIG51bGwgdGVtcGVyYXR1cmUgYW5kIHJlamVjdCBleHBsaWNpdCBub25udW1lcmljIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpKSByZXR1cm4gYm9keTtcbiAgaWYgKGJvZHkudGVtcGVyYXR1cmUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGJvZHkudGVtcGVyYXR1cmUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShib2R5LnRlbXBlcmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJ0ZW1wZXJhdHVyZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciwgbnVsbCwgb3Igb21pdHRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgY29uc3Qgc2FuaXRpemVkID0geyAuLi5ib2R5IH07XG4gIGRlbGV0ZSBzYW5pdGl6ZWQudGVtcGVyYXR1cmU7XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBBcHBseSBwdWJsaXNoZWQgRGF0YWJyaWNrcyB0ZW1wZXJhdHVyZSBzdXBwb3J0IGFuZCByYW5nZSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpIHx8IHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiKSByZXR1cm4gYm9keTtcbiAgY29uc3Qgc3VwcG9ydGVkID0gbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IobW9kZWwpO1xuICBpZiAoc3VwcG9ydGVkID09PSB1bmRlZmluZWQpIHJldHVybiBib2R5O1xuICBpZiAoIXN1cHBvcnRlZCkge1xuICAgIGNvbnN0IGFkYXB0ZWQgPSB7IC4uLmJvZHkgfTtcbiAgICBkZWxldGUgYWRhcHRlZC50ZW1wZXJhdHVyZTtcbiAgICByZXR1cm4gYWRhcHRlZDtcbiAgfVxuICBjb25zdCB0ZW1wZXJhdHVyZSA9IE1hdGgubWluKFxuICAgIERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYLFxuICAgIE1hdGgubWF4KERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOLCBib2R5LnRlbXBlcmF0dXJlKSxcbiAgKTtcbiAgcmV0dXJuIHRlbXBlcmF0dXJlID09PSBib2R5LnRlbXBlcmF0dXJlID8gYm9keSA6IHsgLi4uYm9keSwgdGVtcGVyYXR1cmUgfTtcbn1cblxuLyoqIFJlc29sdmUgcmVxdWVzdCwgaGVhZGVyLCBjb25maWd1cmVkLCBhbmQgcHJvdG9jb2wgbW9kZWwtc2VsZWN0aW9uIGlucHV0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgaGVhZGVyczogSGVhZGVycyxcbiAgZGVmYXVsdHM6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9ID0ge30sXG4gIHByb3RvY29sPzogQ2xpZW50UHJvdG9jb2wsXG4pOiB7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHJldHVybiBpc1NtYXJ0Um91dGVyTW9kZWxJZChtb2RlbCkgPyB7IHNtYXJ0Um91dGVyOiB0cnVlIH0gOiB7IG1vZGVsIH07XG4gIGlmIChwYXJzZWRDbGFzcz8uZGF0YSkgcmV0dXJuIHsgbW9kZWxDbGFzczogcGFyc2VkQ2xhc3MuZGF0YSB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWwpIHtcbiAgICByZXR1cm4gaXNTbWFydFJvdXRlck1vZGVsSWQoZGVmYXVsdHMubW9kZWwpID8geyBzbWFydFJvdXRlcjogdHJ1ZSB9IDogeyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgfVxuICBpZiAoZGVmYXVsdHMubW9kZWxDbGFzcykgcmV0dXJuIHsgbW9kZWxDbGFzczogZGVmYXVsdHMubW9kZWxDbGFzcyB9O1xuICBpZiAocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikgcmV0dXJuIHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfTtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBhcHBseVNtYXJ0Um91dGVyT2JzZXJ2YXRpb25IZWFkZXJzKFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBvYnNlcnZhdGlvbjogU21hcnRSb3V0ZXJPYnNlcnZhdGlvbixcbik6IHZvaWQge1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5zZWxlY3RlZE1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1JPVVRFX01PREVMX0hFQURFUiwgb2JzZXJ2YXRpb24ucm91dGVNb2RlbCk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9IQVJORVNTX0hFQURFUiwgb2JzZXJ2YXRpb24uaGFybmVzcyk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLCBvYnNlcnZhdGlvbi5zb3VyY2UpO1xuICBjb25zdCB0YXNrVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJ0YXNrX3RpZXJcIik7XG4gIGNvbnN0IHNlcnZlZFRpZXIgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwic2VydmVkX3RpZXJcIik7XG4gIGNvbnN0IHByb2ZpbGVyU3RhdHVzID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInByb2ZpbGVyX3N0YXR1c1wiKTtcbiAgaWYgKHRhc2tUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUiwgdGFza1RpZXIpO1xuICBpZiAoc2VydmVkVGllcikgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NFUlZFRF9USUVSX0hFQURFUiwgc2VydmVkVGllcik7XG4gIGlmIChwcm9maWxlclN0YXR1cykgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsIHByb2ZpbGVyU3RhdHVzKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5U21hcnRSb3V0ZXIocGF5bG9hZDogTW9kZWxMaXN0UmVzcG9uc2UpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke1NNQVJUX1JPVVRFUl9NT0RFTF9JRH1gKSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9iamVjdDogXCJsaXN0XCIsXG4gICAgZGF0YTogcGF5bG9hZC5kYXRhLmZpbHRlcigobW9kZWwpID0+IG1vZGVsLmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSUQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
@@ -5,8 +5,8 @@
5
5
  */
6
6
  import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIModelListResponse } from "@dbx-tools/shared-model-gateway";
7
7
  /** Build the combined OpenAI and optional Codex model catalogue. */
8
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean): CodexModelListResponse;
9
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean): OpenAIModelListResponse;
10
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean): ModelListResponse;
8
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): CodexModelListResponse;
9
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): OpenAIModelListResponse;
10
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): ModelListResponse;
11
11
  /** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
12
12
  export declare function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string;