@dbx-tools/appkit-model-gateway 0.9.201 → 0.9.203
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 +15 -1
- package/index.ts +5 -2
- package/lib/index.d.ts +5 -2
- package/lib/index.js +5 -3
- package/lib/src/gateway.d.ts +4 -0
- package/lib/src/gateway.js +29 -6
- package/lib/src/profile-fallback.d.ts +45 -0
- package/lib/src/profile-fallback.js +212 -0
- package/lib/src/translation.d.ts +5 -1
- package/lib/src/translation.js +5 -5
- package/lib/src/transport.d.ts +4 -0
- package/lib/src/transport.js +23 -20
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/gateway.ts +31 -3
- package/src/profile-fallback.ts +277 -0
- package/src/translation.ts +12 -4
- package/src/transport.ts +30 -20
package/README.md
CHANGED
|
@@ -32,9 +32,23 @@ current-user service management, and standard root compatibility paths.
|
|
|
32
32
|
Use the standalone CLI when a tool expects an OpenAI-compatible base URL:
|
|
33
33
|
|
|
34
34
|
```sh
|
|
35
|
-
dbx model-gateway
|
|
35
|
+
dbx model-gateway \
|
|
36
|
+
--profile PRIMARY-PROFILE \
|
|
37
|
+
--profile FALLBACK-PROFILE \
|
|
38
|
+
--listen tcp://127.0.0.1:4000
|
|
36
39
|
```
|
|
37
40
|
|
|
41
|
+
Profiles are tried in declaration order. Model discovery and routing use the
|
|
42
|
+
first profile. When an inference request receives HTTP 429, the gateway retries
|
|
43
|
+
the same upstream model through the next profile whose workspace is available.
|
|
44
|
+
Cooldowns are shared by workspace and model id, so two profiles for the same
|
|
45
|
+
workspace do not bypass the same limit. After the reported retry interval
|
|
46
|
+
expires, requests return to the first profile automatically.
|
|
47
|
+
|
|
48
|
+
`Retry-After` takes precedence over a JSON `retry_after` value. When Databricks
|
|
49
|
+
reports a workspace tokens-per-minute limit without either value, the gateway
|
|
50
|
+
uses a 60-second cooldown; other 429 responses use 15 seconds.
|
|
51
|
+
|
|
38
52
|
The system-model preference routes non-exact Responses requests, including
|
|
39
53
|
Codex traffic, through `system.ai.*` AI Gateway services instead of workspace
|
|
40
54
|
serving endpoints. Codex model slugs follow the same choice. An exact endpoint
|
package/index.ts
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
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.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.203";
|
|
7
7
|
export * as aIDecide from "./src/ai-decide.ts";
|
|
8
8
|
export * as gateway from "./src/gateway.ts";
|
|
9
9
|
export * as modelContext from "./src/model-context.ts";
|
|
10
10
|
export * as models from "./src/models.ts";
|
|
11
11
|
export * as plugin from "./src/plugin.ts";
|
|
12
|
+
export * as profileFallback from "./src/profile-fallback.ts";
|
|
12
13
|
export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
13
14
|
export * as registry from "./src/registry.ts";
|
|
14
15
|
export * as router from "./src/router.ts";
|
|
@@ -25,6 +26,8 @@ export type { ModelContextEvent, NormalizeModelContextOptions, NormalizedModelCo
|
|
|
25
26
|
export { listModelsPayload, codexModelSlug } from "./src/models.ts";
|
|
26
27
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.ts";
|
|
27
28
|
export type { ModelGatewayPluginConfig } from "./src/plugin.ts";
|
|
29
|
+
export { ProfileFallback, modelGatewayRateLimit } from "./src/profile-fallback.ts";
|
|
30
|
+
export type { ModelGatewayProfile, ModelGatewayRateLimit, ProfileFallbackDependencies } from "./src/profile-fallback.ts";
|
|
28
31
|
export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reasoning-adapt.ts";
|
|
29
32
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
30
33
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
@@ -34,5 +37,5 @@ export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
|
34
37
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
35
38
|
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
|
36
39
|
export { translateGatewayRequest } from "./src/translation.ts";
|
|
37
|
-
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
40
|
+
export { fetchDatabricks, fetchWorkspace, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
38
41
|
export type { DatabricksTransportRequest } from "./src/transport.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.203";
|
|
3
3
|
export * as aIDecide from "./src/ai-decide.ts";
|
|
4
4
|
export * as gateway from "./src/gateway.ts";
|
|
5
5
|
export * as modelContext from "./src/model-context.ts";
|
|
6
6
|
export * as models from "./src/models.ts";
|
|
7
7
|
export * as plugin from "./src/plugin.ts";
|
|
8
|
+
export * as profileFallback from "./src/profile-fallback.ts";
|
|
8
9
|
export * as reasoningAdapt from "./src/reasoning-adapt.ts";
|
|
9
10
|
export * as registry from "./src/registry.ts";
|
|
10
11
|
export * as router from "./src/router.ts";
|
|
@@ -21,6 +22,8 @@ export type { ModelContextEvent, NormalizeModelContextOptions, NormalizedModelCo
|
|
|
21
22
|
export { listModelsPayload, codexModelSlug } from "./src/models.ts";
|
|
22
23
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.ts";
|
|
23
24
|
export type { ModelGatewayPluginConfig } from "./src/plugin.ts";
|
|
25
|
+
export { ProfileFallback, modelGatewayRateLimit } from "./src/profile-fallback.ts";
|
|
26
|
+
export type { ModelGatewayProfile, ModelGatewayRateLimit, ProfileFallbackDependencies } from "./src/profile-fallback.ts";
|
|
24
27
|
export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reasoning-adapt.ts";
|
|
25
28
|
export type { AdaptedInferenceBody } from "./src/reasoning-adapt.ts";
|
|
26
29
|
export { DatabricksModelRegistry } from "./src/registry.ts";
|
|
@@ -30,5 +33,5 @@ export { sendHealth, sendModels, sendInference } from "./src/routes.ts";
|
|
|
30
33
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.ts";
|
|
31
34
|
export type { SmartRouterSettings, SmartRouterCandidate, SmartRouterSelection, SmartRouterStore, SmartRouterProbeRecord, SmartRouterProbeStore, SmartRouterResult, SmartRouterContext, SmartRouterSelectOptions } from "./src/smart-router.ts";
|
|
32
35
|
export { translateGatewayRequest } from "./src/translation.ts";
|
|
33
|
-
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
36
|
+
export { fetchDatabricks, fetchWorkspace, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.ts";
|
|
34
37
|
export type { DatabricksTransportRequest } from "./src/transport.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
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.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.203";
|
|
6
6
|
export * as aIDecide from "./src/ai-decide.js";
|
|
7
7
|
export * as gateway from "./src/gateway.js";
|
|
8
8
|
export * as modelContext from "./src/model-context.js";
|
|
9
9
|
export * as models from "./src/models.js";
|
|
10
10
|
export * as plugin from "./src/plugin.js";
|
|
11
|
+
export * as profileFallback from "./src/profile-fallback.js";
|
|
11
12
|
export * as reasoningAdapt from "./src/reasoning-adapt.js";
|
|
12
13
|
export * as registry from "./src/registry.js";
|
|
13
14
|
export * as router from "./src/router.js";
|
|
@@ -20,11 +21,12 @@ export { ModelGatewayError, ModelGateway, sanitizeInferenceBody, adaptInferenceT
|
|
|
20
21
|
export { normalizeModelContext } from "./src/model-context.js";
|
|
21
22
|
export { listModelsPayload, codexModelSlug } from "./src/models.js";
|
|
22
23
|
export { ModelGatewayPlugin, modelGateway } from "./src/plugin.js";
|
|
24
|
+
export { ProfileFallback, modelGatewayRateLimit } from "./src/profile-fallback.js";
|
|
23
25
|
export { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./src/reasoning-adapt.js";
|
|
24
26
|
export { DatabricksModelRegistry } from "./src/registry.js";
|
|
25
27
|
export { UnsupportedGatewayFeatureError, resolveRoute, requestedFeatures, isCodexOriginator } from "./src/router.js";
|
|
26
28
|
export { sendHealth, sendModels, sendInference } from "./src/routes.js";
|
|
27
29
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.js";
|
|
28
30
|
export { translateGatewayRequest } from "./src/translation.js";
|
|
29
|
-
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
export { fetchDatabricks, fetchWorkspace, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssWUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssZUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2UixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjIwM1wiO1xuZXhwb3J0ICogYXMgYUlEZWNpZGUgZnJvbSBcIi4vc3JjL2FpLWRlY2lkZS50c1wiO1xuZXhwb3J0ICogYXMgZ2F0ZXdheSBmcm9tIFwiLi9zcmMvZ2F0ZXdheS50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxDb250ZXh0IGZyb20gXCIuL3NyYy9tb2RlbC1jb250ZXh0LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbHMgZnJvbSBcIi4vc3JjL21vZGVscy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGVGYWxsYmFjayBmcm9tIFwiLi9zcmMvcHJvZmlsZS1mYWxsYmFjay50c1wiO1xuZXhwb3J0ICogYXMgcmVhc29uaW5nQWRhcHQgZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0ICogYXMgcmVnaXN0cnkgZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXIgZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVzIGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNtYXJ0Um91dGVyIGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNwb3J0IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbmV4cG9ydCB7IEFpRGVjaWRlUm91dGVyU2VydmljZSwgQWlEZWNpZGVSb3V0ZXJFcnJvciB9IGZyb20gXCIuL3NyYy9haS1kZWNpZGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlEZWNpZGVTZWxlY3Rpb25PcHRpb25zLCBBaURlY2lkZVNlbGVjdGlvbiB9IGZyb20gXCIuL3NyYy9haS1kZWNpZGUudHNcIjtcbmV4cG9ydCB7IE1vZGVsR2F0ZXdheUVycm9yLCBNb2RlbEdhdGV3YXksIHNhbml0aXplSW5mZXJlbmNlQm9keSwgYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZSwgZ2F0ZXdheU1vZGVsU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBub3JtYWxpemVNb2RlbENvbnRleHQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY29udGV4dC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbENvbnRleHRFdmVudCwgTm9ybWFsaXplTW9kZWxDb250ZXh0T3B0aW9ucywgTm9ybWFsaXplZE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jb250ZXh0LnRzXCI7XG5leHBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCwgY29kZXhNb2RlbFNsdWcgfSBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgUHJvZmlsZUZhbGxiYWNrLCBtb2RlbEdhdGV3YXlSYXRlTGltaXQgfSBmcm9tIFwiLi9zcmMvcHJvZmlsZS1mYWxsYmFjay50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbEdhdGV3YXlQcm9maWxlLCBNb2RlbEdhdGV3YXlSYXRlTGltaXQsIFByb2ZpbGVGYWxsYmFja0RlcGVuZGVuY2llcyB9IGZyb20gXCIuL3NyYy9wcm9maWxlLWZhbGxiYWNrLnRzXCI7XG5leHBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZGFwdGVkSW5mZXJlbmNlQm9keSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUmVnaXN0cnlSZXNvbHZlT3B0aW9ucywgTW9kZWxSZWdpc3RyeSwgTW9kZWxSZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcmVnaXN0cnkudHNcIjtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkR2F0ZXdheUZlYXR1cmVFcnJvciwgcmVzb2x2ZVJvdXRlLCByZXF1ZXN0ZWRGZWF0dXJlcywgaXNDb2RleE9yaWdpbmF0b3IgfSBmcm9tIFwiLi9zcmMvcm91dGVyLnRzXCI7XG5leHBvcnQgeyBzZW5kSGVhbHRoLCBzZW5kTW9kZWxzLCBzZW5kSW5mZXJlbmNlIH0gZnJvbSBcIi4vc3JjL3JvdXRlcy50c1wiO1xuZXhwb3J0IHsgU01BUlRfUk9VVEVSX0RFRkFVTFRfU0VUVElOR1MsIFNtYXJ0Um91dGVyUHJvYmVSZWNvcmRTY2hlbWEsIFNtYXJ0Um91dGVyRXJyb3IsIEFwcEtpdFNtYXJ0Um91dGVyU3RvcmUsIEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSwgU21hcnRSb3V0ZXJTZXJ2aWNlLCBzbWFydFJvdXRlckNhbmRpZGF0ZXMsIFNtYXJ0Um91dGVyQ29udGV4dEJ1aWxkZXIsIFNtYXJ0TW9kZWxSb3V0ZXIsIHNtYXJ0Um91dGVyVHVybktleSB9IGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCB0eXBlIHsgU21hcnRSb3V0ZXJTZXR0aW5ncywgU21hcnRSb3V0ZXJDYW5kaWRhdGUsIFNtYXJ0Um91dGVyU2VsZWN0aW9uLCBTbWFydFJvdXRlclN0b3JlLCBTbWFydFJvdXRlclByb2JlUmVjb3JkLCBTbWFydFJvdXRlclByb2JlU3RvcmUsIFNtYXJ0Um91dGVyUmVzdWx0LCBTbWFydFJvdXRlckNvbnRleHQsIFNtYXJ0Um91dGVyU2VsZWN0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgeyBmZXRjaERhdGFicmlja3MsIGZldGNoV29ya3NwYWNlLCBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHksIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuIl19
|
package/lib/src/gateway.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { type ModelSource, type ServingEndpointSummary, type ModelClass as ModelClassType } from "@dbx-tools/shared-model";
|
|
7
7
|
import type { ClientProtocol, ModelCapabilityOverride, ModelListResponse, SmartRouterMode } from "@dbx-tools/shared-model-gateway";
|
|
8
8
|
import { AiDecideRouterService } from "./ai-decide.ts";
|
|
9
|
+
import { type ModelGatewayProfile } from "./profile-fallback.ts";
|
|
9
10
|
import { type ModelRegistry } from "./registry.ts";
|
|
10
11
|
import { type SmartRouterService, type SmartRouterStore } from "./smart-router.ts";
|
|
11
12
|
/** Model gateway runtime configuration. */
|
|
@@ -24,6 +25,7 @@ export interface ModelGatewayOptions {
|
|
|
24
25
|
readonly model?: string;
|
|
25
26
|
readonly modelClass?: ModelClassType;
|
|
26
27
|
readonly preferSystemModels?: boolean;
|
|
28
|
+
readonly profiles?: readonly ModelGatewayProfile[];
|
|
27
29
|
}
|
|
28
30
|
/** Error carrying an HTTP status and protocol-safe message. */
|
|
29
31
|
export declare class ModelGatewayError extends Error {
|
|
@@ -39,6 +41,8 @@ export declare class ModelGateway {
|
|
|
39
41
|
private readonly model?;
|
|
40
42
|
private readonly modelClass?;
|
|
41
43
|
private readonly preferSystemModels;
|
|
44
|
+
private readonly profileFallback?;
|
|
45
|
+
private readonly primaryProfile?;
|
|
42
46
|
constructor(options?: ModelGatewayOptions, registry?: ModelRegistry);
|
|
43
47
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
44
48
|
models(originator?: string, search?: string, modelSource?: ModelSource | "all", includeMetadata?: boolean): Promise<ModelListResponse>;
|
package/lib/src/gateway.js
CHANGED
|
@@ -9,6 +9,7 @@ import { ModelClass, ModelClassSchema, } from "@dbx-tools/shared-model";
|
|
|
9
9
|
import { AI_DECIDE_CONFIDENCE_HEADER, AI_DECIDE_MODEL_ID, AI_DECIDE_SELECTED_MODEL_HEADER, AI_DECIDE_STRATEGY_HEADER, AiDecideStrategySchema, 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, isAiDecideModelId, isSmartRouterModelId, } from "@dbx-tools/shared-model-gateway";
|
|
10
10
|
import { AiDecideRouterService } from "./ai-decide.js";
|
|
11
11
|
import { listModelsPayload } from "./models.js";
|
|
12
|
+
import { ProfileFallback } from "./profile-fallback.js";
|
|
12
13
|
import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
|
|
13
14
|
import { DatabricksModelRegistry, } from "./registry.js";
|
|
14
15
|
import { isCodexOriginator, requestedFeatures, resolveRoute } from "./router.js";
|
|
@@ -36,13 +37,21 @@ export class ModelGateway {
|
|
|
36
37
|
model;
|
|
37
38
|
modelClass;
|
|
38
39
|
preferSystemModels;
|
|
40
|
+
profileFallback;
|
|
41
|
+
primaryProfile;
|
|
39
42
|
constructor(options = {}, registry) {
|
|
43
|
+
this.primaryProfile = options.profiles?.[0];
|
|
44
|
+
this.profileFallback =
|
|
45
|
+
options.profiles && options.profiles.length > 1
|
|
46
|
+
? new ProfileFallback(options.profiles)
|
|
47
|
+
: undefined;
|
|
40
48
|
const registryOptions = {
|
|
41
49
|
...(options.cacheTtlMs !== undefined ? { ttlMs: options.cacheTtlMs } : {}),
|
|
42
50
|
...(options.overrides ? { overrides: options.overrides } : {}),
|
|
43
51
|
...(options.preferSystemModels !== undefined
|
|
44
52
|
? { preferSystemModels: options.preferSystemModels }
|
|
45
53
|
: {}),
|
|
54
|
+
...(this.primaryProfile ? { client: this.primaryProfile.client } : {}),
|
|
46
55
|
};
|
|
47
56
|
this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
|
|
48
57
|
this.aiDecide = options.aiDecideService ?? new AiDecideRouterService();
|
|
@@ -57,7 +66,7 @@ export class ModelGateway {
|
|
|
57
66
|
routeTtlSeconds: options.smartRouterRouteTtlSeconds ?? MODEL_GATEWAY_DEFAULTS.smartRouterRouteTtlSeconds,
|
|
58
67
|
routerName: "task_v3",
|
|
59
68
|
timeoutMs: options.smartRouterTimeoutMs ?? MODEL_GATEWAY_DEFAULTS.smartRouterTimeoutMs,
|
|
60
|
-
}, options.smartRouterService, options.smartRouterStore);
|
|
69
|
+
}, options.smartRouterService, options.smartRouterStore, this.primaryProfile?.client);
|
|
61
70
|
}
|
|
62
71
|
this.model = options.model;
|
|
63
72
|
this.modelClass = options.modelClass;
|
|
@@ -85,7 +94,7 @@ export class ModelGateway {
|
|
|
85
94
|
const aiDecideEnabled = (!query || aiDecideSearch) &&
|
|
86
95
|
(await this.aiDecide.isEnabled(targets
|
|
87
96
|
.map((target) => target.endpoint)
|
|
88
|
-
.filter((endpoint) => endpoint !== undefined)));
|
|
97
|
+
.filter((endpoint) => endpoint !== undefined), this.primaryProfile?.client));
|
|
89
98
|
if (this.smartRouterMode === "true" && !smartRouterEnabled) {
|
|
90
99
|
throw new ModelGatewayError(503, "Databricks Smart Router is required but unavailable for the active workspace identity");
|
|
91
100
|
}
|
|
@@ -133,7 +142,7 @@ export class ModelGateway {
|
|
|
133
142
|
const aiDecide = selection.aiDecide
|
|
134
143
|
? await this.aiDecide.select(sanitizedBody, (registryTargets ?? [])
|
|
135
144
|
.map((candidate) => candidate.endpoint)
|
|
136
|
-
.filter((endpoint) => endpoint !== undefined),
|
|
145
|
+
.filter((endpoint) => endpoint !== undefined), this.primaryProfile?.client, {
|
|
137
146
|
strategy: aiDecideStrategy(headers),
|
|
138
147
|
filters: {
|
|
139
148
|
...(features.tools ? { requiresTools: true } : {}),
|
|
@@ -211,9 +220,23 @@ export class ModelGateway {
|
|
|
211
220
|
}
|
|
212
221
|
async forward(route, body, headers, signal) {
|
|
213
222
|
if (route.upstreamProtocol === "ai-sdk") {
|
|
214
|
-
return translateGatewayRequest(route, body, signal
|
|
223
|
+
return translateGatewayRequest(route, body, signal, {
|
|
224
|
+
...(this.primaryProfile ? { client: this.primaryProfile.client } : {}),
|
|
225
|
+
...(this.profileFallback
|
|
226
|
+
? { fetch: this.profileFallback.createFetch(route.upstreamModel) }
|
|
227
|
+
: {}),
|
|
228
|
+
});
|
|
215
229
|
}
|
|
216
|
-
|
|
230
|
+
if (this.profileFallback) {
|
|
231
|
+
return this.profileFallback.request(route.upstreamModel, signal, ({ client }) => fetchDatabricks({ route, body, headers, signal, client }));
|
|
232
|
+
}
|
|
233
|
+
return fetchDatabricks({
|
|
234
|
+
route,
|
|
235
|
+
body,
|
|
236
|
+
headers,
|
|
237
|
+
signal,
|
|
238
|
+
...(this.primaryProfile ? { client: this.primaryProfile.client } : {}),
|
|
239
|
+
});
|
|
217
240
|
}
|
|
218
241
|
}
|
|
219
242
|
/** Remove null temperature and reject explicit nonnumeric values. */
|
|
@@ -331,4 +354,4 @@ function logResponse(upstreamProtocol, model, response) {
|
|
|
331
354
|
else
|
|
332
355
|
logger.warn("upstream request failed", details);
|
|
333
356
|
}
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FJakIsTUFBTSx5QkFBeUIsQ0FBQztBQVVqQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3QixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVGLE9BQU8sRUFDTCx1QkFBdUIsR0FHeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixD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ZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgTW9kZWxTb3VyY2UsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWlEZWNpZGVPYnNlcnZhdGlvbixcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsXG4gIEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgQUlfREVDSURFX1NFTEVDVEVEX01PREVMX0hFQURFUixcbiAgQUlfREVDSURFX1NUUkFURUdZX0hFQURFUixcbiAgQWlEZWNpZGVTdHJhdGVneVNjaGVtYSxcbiAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUyxcbiAgU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gIFNNQVJUX1JPVVRFUl9QUk9GSUxFUl9TVEFUVVNfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU09VUkNFX0hFQURFUixcbiAgU01BUlRfUk9VVEVSX1RBU0tfVElFUl9IRUFERVIsXG4gIGlzQWlEZWNpZGVNb2RlbElkLFxuICBpc1NtYXJ0Um91dGVyTW9kZWxJZCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYWktZGVjaWRlLnRzXCI7XG5pbXBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCB9IGZyb20gXCIuL21vZGVscy50c1wiO1xuaW1wb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuaW1wb3J0IHtcbiAgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyxcbn0gZnJvbSBcIi4vcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7IGlzQ29kZXhPcmlnaW5hdG9yLCByZXF1ZXN0ZWRGZWF0dXJlcywgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5pbXBvcnQge1xuICBTbWFydE1vZGVsUm91dGVyLFxuICB0eXBlIFNtYXJ0Um91dGVyU2VydmljZSxcbiAgdHlwZSBTbWFydFJvdXRlclN0b3JlLFxufSBmcm9tIFwiLi9zbWFydC1yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiA9IDA7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCA9IDI7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogU21hcnRSb3V0ZXJNb2RlO1xuICByZWFkb25seSBzbWFydFJvdXRlckNvbnRleHRUb2tlbkJ1ZGdldD86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclRpbWVvdXRNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJTZXJ2aWNlPzogU21hcnRSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBzbWFydFJvdXRlclN0b3JlPzogU21hcnRSb3V0ZXJTdG9yZTtcbiAgcmVhZG9ubHkgYWlEZWNpZGVTZXJ2aWNlPzogQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFpRGVjaWRlOiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXJNb2RlOiBTbWFydFJvdXRlck1vZGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30sIHJlZ2lzdHJ5PzogTW9kZWxSZWdpc3RyeSkge1xuICAgIGNvbnN0IHJlZ2lzdHJ5T3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBvcHRpb25zLmNhY2hlVHRsTXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBvcHRpb25zLm92ZXJyaWRlcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHByZWZlclN5c3RlbU1vZGVsczogb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLmFpRGVjaWRlID0gb3B0aW9ucy5haURlY2lkZVNlcnZpY2UgPz8gbmV3IEFpRGVjaWRlUm91dGVyU2VydmljZSgpO1xuICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID0gb3B0aW9ucy5zbWFydFJvdXRlciA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyO1xuICAgIGlmICh0aGlzLnNtYXJ0Um91dGVyTW9kZSAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyID0gbmV3IFNtYXJ0TW9kZWxSb3V0ZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZXh0VG9rZW5CdWRnZXQ6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0ID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0LFxuICAgICAgICAgIHByb2JlUmVmcmVzaEludGVydmFsTXM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyA/P1xuICAgICAgICAgICAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgICAgcHJvYmVUdGxNczogb3B0aW9ucy5zbWFydFJvdXRlclByb2JlVHRsTXMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgICAgICAgcm91dGVUdGxTZWNvbmRzOlxuICAgICAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclJvdXRlVHRsU2Vjb25kcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzLFxuICAgICAgICAgIHJvdXRlck5hbWU6IFwidGFza192M1wiLFxuICAgICAgICAgIHRpbWVvdXRNczogb3B0aW9ucy5zbWFydFJvdXRlclRpbWVvdXRNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyVGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU2VydmljZSxcbiAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclN0b3JlLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gICAgdGhpcy5tb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzO1xuICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzID1cbiAgICAgIG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMucHJlZmVyU3lzdGVtTW9kZWxzO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSBPcGVuQUkgbW9kZWwgbGlzdCwgaW5jbHVkaW5nIENvZGV4IG1ldGFkYXRhIHdoZW4gcmVxdWVzdGVkLiAqL1xuICBhc3luYyBtb2RlbHMoXG4gICAgb3JpZ2luYXRvcj86IHN0cmluZyxcbiAgICBzZWFyY2g/OiBzdHJpbmcsXG4gICAgbW9kZWxTb3VyY2U6IE1vZGVsU291cmNlIHwgXCJhbGxcIiA9IFwiZm91bmRhdGlvblwiLFxuICAgIGluY2x1ZGVNZXRhZGF0YSA9IGZhbHNlLFxuICApOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCBzbWFydFJvdXRlclNlYXJjaCA9XG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIFNNQVJUX1JPVVRFUl9NT0RFTF9JRC5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBhaURlY2lkZVNlYXJjaCA9IHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgQUlfREVDSURFX01PREVMX0lELmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoICYmICFhaURlY2lkZVNlYXJjaFxuICAgICAgICA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHF1ZXJ5KVxuICAgICAgICA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgbW9kZWxTb3VyY2UgPT09IFwiYWxsXCJcbiAgICAgICAgPyBkaXNjb3ZlcmVkXG4gICAgICAgIDogZGlzY292ZXJlZC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50Py5tb2RlbFNvdXJjZSA9PT0gbW9kZWxTb3VyY2UpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyVGFyZ2V0cyA9XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyTW9kZSA9PT0gXCJ0cnVlXCIgJiYgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoXG4gICAgICAgID8gKGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpKS5maWx0ZXIoXG4gICAgICAgICAgICAodGFyZ2V0KSA9PiBtb2RlbFNvdXJjZSA9PT0gXCJhbGxcIiB8fCB0YXJnZXQuZW5kcG9pbnQ/Lm1vZGVsU291cmNlID09PSBtb2RlbFNvdXJjZSxcbiAgICAgICAgICApXG4gICAgICAgIDogdGFyZ2V0cztcbiAgICBjb25zdCBzaG91bGRQcm9iZVNtYXJ0Um91dGVyID1cbiAgICAgIEJvb2xlYW4odGhpcy5zbWFydFJvdXRlcikgJiYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiB8fCAhcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyRW5hYmxlZCA9XG4gICAgICBzaG91bGRQcm9iZVNtYXJ0Um91dGVyICYmIChhd2FpdCB0aGlzLnNtYXJ0Um91dGVyIS5pc0VuYWJsZWQoc21hcnRSb3V0ZXJUYXJnZXRzKSk7XG4gICAgY29uc3QgYWlEZWNpZGVFbmFibGVkID1cbiAgICAgICghcXVlcnkgfHwgYWlEZWNpZGVTZWFyY2gpICYmXG4gICAgICAoYXdhaXQgdGhpcy5haURlY2lkZS5pc0VuYWJsZWQoXG4gICAgICAgIHRhcmdldHNcbiAgICAgICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCksXG4gICAgICApKTtcbiAgICBpZiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiICYmICFzbWFydFJvdXRlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNTAzLFxuICAgICAgICBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIHJlcXVpcmVkIGJ1dCB1bmF2YWlsYWJsZSBmb3IgdGhlIGFjdGl2ZSB3b3Jrc3BhY2UgaWRlbnRpdHlcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIGNvbnN0IHBheWxvYWQgPSBsaXN0TW9kZWxzUGF5bG9hZChcbiAgICAgIHRhcmdldHMsXG4gICAgICBjb2RleCxcbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCxcbiAgICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgc21hcnRSb3V0ZXJFbmFibGVkICYmICghcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpLFxuICAgICAgYWlEZWNpZGVFbmFibGVkICYmICghcXVlcnkgfHwgYWlEZWNpZGVTZWFyY2gpLFxuICAgICAgaW5jbHVkZU1ldGFkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIHNtYXJ0Um91dGVyU2VhcmNoIHx8IGFpRGVjaWRlU2VhcmNoXG4gICAgICA/IG9ubHlWaXJ0dWFsTW9kZWwocGF5bG9hZCwgc21hcnRSb3V0ZXJTZWFyY2ggPyBTTUFSVF9ST1VURVJfTU9ERUxfSUQgOiBBSV9ERUNJREVfTU9ERUxfSUQpXG4gICAgICA6IHBheWxvYWQ7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbmQgZXhlY3V0ZSBvbmUgaW5mZXJlbmNlIHJlcXVlc3QuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoYm9keSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICB9LFxuICAgICAgcHJvdG9jb2wsXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcmVxdWVzdFwiLCB7XG4gICAgICBzbWFydFJvdXRlcjogc2VsZWN0aW9uLnNtYXJ0Um91dGVyID09PSB0cnVlLFxuICAgICAgYWlEZWNpZGU6IHNlbGVjdGlvbi5haURlY2lkZSA9PT0gdHJ1ZSxcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiBzZWxlY3Rpb24ubW9kZWwsXG4gICAgICBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBzdHJlYW06IHNhbml0aXplZEJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVxdWVzdGVkRmVhdHVyZXMoc2FuaXRpemVkQm9keSk7XG4gICAgaWYgKChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgfHwgc2VsZWN0aW9uLmFpRGVjaWRlKSAmJiBwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwMCxcbiAgICAgICAgXCJWaXJ0dWFsIG1vZGVsIHJvdXRlcnMgYXJlIGF2YWlsYWJsZSBvbmx5IGZvciBjaGF0IHJlcXVlc3RzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzbWFydFJvdXRlciA9XG4gICAgICBzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgdGhpcy5zbWFydFJvdXRlclxuICAgICAgICA/IGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIucmVzb2x2ZSh7XG4gICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wgYXMgRXhjbHVkZTxDbGllbnRQcm90b2NvbCwgXCJvcGVuYWktZW1iZWRkaW5nc1wiPixcbiAgICAgICAgICAgIGJvZHk6IHNhbml0aXplZEJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgZmVhdHVyZXMsXG4gICAgICAgICAgICB0YXJnZXRzOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKSxcbiAgICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlbGVjdGlvbi5zbWFydFJvdXRlciAmJiAhc21hcnRSb3V0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDQsIFwiRGF0YWJyaWNrcyBTbWFydCBSb3V0ZXIgaXMgZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5VGFyZ2V0cyA9IHNtYXJ0Um91dGVyID8gdW5kZWZpbmVkIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgY29uc3QgYWlEZWNpZGUgPSBzZWxlY3Rpb24uYWlEZWNpZGVcbiAgICAgID8gYXdhaXQgdGhpcy5haURlY2lkZS5zZWxlY3QoXG4gICAgICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgICAgICAocmVnaXN0cnlUYXJnZXRzID8/IFtdKVxuICAgICAgICAgICAgLm1hcCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZW5kcG9pbnQpXG4gICAgICAgICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5OiBhaURlY2lkZVN0cmF0ZWd5KGhlYWRlcnMpLFxuICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKGZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgPyB7IHJlcXVpcmVzU3RydWN0dXJlZE91dHB1dDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgc21hcnRSb3V0ZXI/LnRhcmdldCA/P1xuICAgICAgKGFpRGVjaWRlXG4gICAgICAgID8gcmVnaXN0cnlUYXJnZXRzPy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gYWlEZWNpZGUuZW5kcG9pbnQubmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgICAoYXdhaXQgdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHNlbGVjdGlvbi5tb2RlbCwge1xuICAgICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyB9IDoge30pLFxuICAgICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDQsXG4gICAgICAgIHNlbGVjdGlvbi5tb2RlbFxuICAgICAgICAgID8gYE1vZGVsIG5vdCBmb3VuZDogJHtzZWxlY3Rpb24ubW9kZWx9YFxuICAgICAgICAgIDogXCJObyBtb2RlbCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgY2xhc3NcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIC4uLighc21hcnRSb3V0ZXIgJiYgIWFpRGVjaWRlICYmIHNlbGVjdGlvbi5tb2RlbCA/IHsgcmVxdWVzdGVkTW9kZWw6IHNlbGVjdGlvbi5tb2RlbCB9IDoge30pLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJyb3V0ZWRcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wZXJhdHVyZUJvZHkgPSBhZGFwdEluZmVyZW5jZVRlbXBlcmF0dXJlKFxuICAgICAgdGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCxcbiAgICAgIHNtYXJ0Um91dGVyPy5ib2R5ID8/IHNhbml0aXplZEJvZHksXG4gICAgKTtcbiAgICBjb25zdCBhZGFwdGVkID0gYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcodGFyZ2V0LmlkLCB0ZW1wZXJhdHVyZUJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keTogdGVtcGVyYXR1cmVCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIGlmIChzbWFydFJvdXRlcikge1xuICAgICAgICBhcHBseVNtYXJ0Um91dGVyT2JzZXJ2YXRpb25IZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChhaURlY2lkZSkgYXBwbHlBaURlY2lkZU9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBhaURlY2lkZS5vYnNlcnZhdGlvbik7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIGlmIChzbWFydFJvdXRlcikgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhmb3J3YXJkZWQsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICBpZiAoYWlEZWNpZGUpIGFwcGx5QWlEZWNpZGVPYnNlcnZhdGlvbkhlYWRlcnMoZm9yd2FyZGVkLCBhaURlY2lkZS5vYnNlcnZhdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKToge1xuICByZWFkb25seSBzbWFydFJvdXRlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVjaWRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHtcbiAgICBpZiAoaXNTbWFydFJvdXRlck1vZGVsSWQobW9kZWwpKSByZXR1cm4geyBzbWFydFJvdXRlcjogdHJ1ZSB9O1xuICAgIGlmIChpc0FpRGVjaWRlTW9kZWxJZChtb2RlbCkpIHJldHVybiB7IGFpRGVjaWRlOiB0cnVlIH07XG4gICAgcmV0dXJuIHsgbW9kZWwgfTtcbiAgfVxuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSB7XG4gICAgaWYgKGlzU21hcnRSb3V0ZXJNb2RlbElkKGRlZmF1bHRzLm1vZGVsKSkgcmV0dXJuIHsgc21hcnRSb3V0ZXI6IHRydWUgfTtcbiAgICBpZiAoaXNBaURlY2lkZU1vZGVsSWQoZGVmYXVsdHMubW9kZWwpKSByZXR1cm4geyBhaURlY2lkZTogdHJ1ZSB9O1xuICAgIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICB9XG4gIGlmIChkZWZhdWx0cy5tb2RlbENsYXNzKSByZXR1cm4geyBtb2RlbENsYXNzOiBkZWZhdWx0cy5tb2RlbENsYXNzIH07XG4gIGlmIChwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSByZXR1cm4geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9O1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLCBvYnNlcnZhdGlvbi5oYXJuZXNzKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NPVVJDRV9IRUFERVIsIG9ic2VydmF0aW9uLnNvdXJjZSk7XG4gIGNvbnN0IHRhc2tUaWVyID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInRhc2tfdGllclwiKTtcbiAgY29uc3Qgc2VydmVkVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJzZXJ2ZWRfdGllclwiKTtcbiAgY29uc3QgcHJvZmlsZXJTdGF0dXMgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwicHJvZmlsZXJfc3RhdHVzXCIpO1xuICBpZiAodGFza1RpZXIpIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9UQVNLX1RJRVJfSEVBREVSLCB0YXNrVGllcik7XG4gIGlmIChzZXJ2ZWRUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLCBzZXJ2ZWRUaWVyKTtcbiAgaWYgKHByb2ZpbGVyU3RhdHVzKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUFJPRklMRVJfU1RBVFVTX0hFQURFUiwgcHJvZmlsZXJTdGF0dXMpO1xufVxuXG5mdW5jdGlvbiBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIG9ic2VydmF0aW9uOiBBaURlY2lkZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KEFJX0RFQ0lERV9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLCBvYnNlcnZhdGlvbi5zdHJhdGVneSk7XG4gIGlmIChvYnNlcnZhdGlvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBoZWFkZXJzLnNldChBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsIFN0cmluZyhvYnNlcnZhdGlvbi5jb25maWRlbmNlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoQUlfREVDSURFX1NUUkFURUdZX0hFQURFUik/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdmFsdWUgPyBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLnBhcnNlKHZhbHVlKSA6IFwiYmFsYW5jZWRcIjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQ6IE1vZGVsTGlzdFJlc3BvbnNlLCBtb2RlbElkOiBzdHJpbmcpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke21vZGVsSWR9YCkpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IFwibGlzdFwiLFxuICAgIGRhdGE6IHBheWxvYWQuZGF0YS5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gbW9kZWxJZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvZ1Jlc3BvbnNlKHVwc3RyZWFtUHJvdG9jb2w6IHN0cmluZywgbW9kZWw6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gIH07XG4gIGlmIChyZXNwb25zZS5vaykgbG9nZ2VyLmRlYnVnKFwidXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gIGVsc2UgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXF1ZXN0IGZhaWxlZFwiLCBkZXRhaWxzKTtcbn1cbiJdfQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FJakIsTUFBTSx5QkFBeUIsQ0FBQztBQVVqQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3QixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUYsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sRUFDTCxnQkFBZ0IsR0FHakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBcUJyQywrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLGlCQUFrQixTQUFRLEtBQUs7SUFFL0I7SUFEWCxZQUNXLE1BQWMsRUFDdkIsT0FBZTtRQUVmLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUhOLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJdkIsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLFlBQVk7SUFDTixRQUFRLENBQWdCO0lBQ3hCLFdBQVcsQ0FBb0I7SUFDL0IsUUFBUSxDQUF3QjtJQUNoQyxlQUFlLENBQWtCO0lBQ2pDLEtBQUssQ0FBVTtJQUNmLFVBQVUsQ0FBa0I7SUFDNUIsa0JBQWtCLENBQVU7SUFDNUIsZUFBZSxDQUFtQjtJQUNsQyxjQUFjLENBQXVCO0lBRXRELFlBQVksVUFBK0IsRUFBRSxFQUFFLFFBQXdCO1FBQ3JFLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlO1lBQ2xCLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsTUFBTSxlQUFlLEdBQXlCO1lBQzVDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEtBQUssU0FBUztnQkFDMUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixFQUFFO2dCQUNwRCxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN2RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDckM7Z0JBQ0Usa0JBQWtCLEVBQ2hCLE9BQU8sQ0FBQyw2QkFBNkI7b0JBQ3JDLHNCQUFzQixDQUFDLDZCQUE2QjtnQkFDdEQsc0JBQXNCLEVBQ3BCLE9BQU8sQ0FBQyxpQ0FBaUM7b0JBQ3pDLHNCQUFzQixDQUFDLGlDQUFpQztnQkFDMUQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxzQkFBc0IsQ0FBQyxxQkFBcUI7Z0JBQ3pGLGVBQWUsRUFDYixPQUFPLENBQUMsMEJBQTBCLElBQUksc0JBQXNCLENBQUMsMEJBQTBCO2dCQUN6RixVQUFVLEVBQUUsU0FBUztnQkFDckIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxzQkFBc0IsQ0FBQyxvQkFBb0I7YUFDdkYsRUFDRCxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFDeEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQzVCLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCO1lBQ3JCLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQztJQUM1RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLEtBQUssQ0FBQyxNQUFNLENBQ1YsVUFBbUIsRUFDbkIsTUFBZSxFQUNmLGNBQW1DLFlBQVksRUFDL0MsZUFBZSxHQUFHLEtBQUs7UUFFdkIsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QixNQUFNLGlCQUFpQixHQUNyQixLQUFLLEtBQUssU0FBUyxJQUFJLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM3RSxNQUFNLGNBQWMsR0FBRyxLQUFLLEtBQUssU0FBUyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUMvRixNQUFNLFVBQVUsR0FDZCxLQUFLLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGNBQWM7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQ1gsV0FBVyxLQUFLLEtBQUs7WUFDbkIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUM7UUFDbEYsTUFBTSxrQkFBa0IsR0FDdEIsSUFBSSxDQUFDLGVBQWUsS0FBSyxNQUFNLElBQUksS0FBSyxJQUFJLENBQUMsaUJBQWlCO1lBQzVELENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDakMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssV0FBVyxDQUNsRjtZQUNILENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDZCxNQUFNLHNCQUFzQixHQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxNQUFNLElBQUksQ0FBQyxLQUFLLElBQUksaUJBQWlCLENBQUMsQ0FBQztRQUNoRyxNQUFNLGtCQUFrQixHQUN0QixzQkFBc0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZUFBZSxHQUNuQixDQUFDLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQztZQUMxQixDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQzVCLE9BQU87aUJBQ0osR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQXNDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQ25GLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUM1QixDQUFDLENBQUM7UUFDTCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksaUJBQWlCLENBQ3pCLEdBQUcsRUFDSCx1RkFBdUYsQ0FDeEYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQy9CLE9BQU8sRUFDUCxLQUFLLEVBQ0wsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdkMsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixrQkFBa0IsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLGlCQUFpQixDQUFDLEVBQ25ELGVBQWUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQyxFQUM3QyxlQUFlLENBQ2hCLENBQUM7UUFDRixPQUFPLGlCQUFpQixJQUFJLGNBQWM7WUFDeEMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1lBQzNGLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDZCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELEtBQUssQ0FBQyxTQUFTLENBQ2IsUUFBd0IsRUFDeEIsSUFBdUMsRUFDdkMsT0FBZ0IsRUFDaEIsTUFBbUI7UUFFbkIsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQ3JDLGFBQWEsRUFDYixPQUFPLEVBQ1A7WUFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLEVBQ0QsUUFBUSxDQUNULENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFO1lBQ2hDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxLQUFLLElBQUk7WUFDM0MsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUNyQyxjQUFjLEVBQUUsUUFBUTtZQUN4QixLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7WUFDdEIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFNBQVM7WUFDbEQsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEtBQUssSUFBSTtTQUN0QyxDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDdEYsTUFBTSxJQUFJLGlCQUFpQixDQUN6QixHQUFHLEVBQ0gsNERBQTRELENBQzdELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQ2YsU0FBUyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVztZQUN2QyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztnQkFDN0IsUUFBUSxFQUFFLFFBQXdEO2dCQUNsRSxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsT0FBTztnQkFDUCxRQUFRO2dCQUNSLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQyxNQUFNO2FBQ1AsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxTQUFTLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRO1lBQ2pDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUN4QixhQUFhLEVBQ2IsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO2lCQUNwQixHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7aUJBQ3RDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBc0MsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsRUFDbkYsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQzNCO2dCQUNFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7Z0JBQ25DLE9BQU8sRUFBRTtvQkFDUCxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUN6RTtnQkFDRCxNQUFNO2FBQ1AsQ0FDRjtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLE1BQU0sR0FDVixXQUFXLEVBQUUsTUFBTTtZQUNuQixDQUFDLFFBQVE7Z0JBQ1AsQ0FBQyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQy9FLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDNUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pGLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDTixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksaUJBQWlCLENBQ3pCLEdBQUcsRUFDSCxTQUFTLENBQUMsS0FBSztnQkFDYixDQUFDLENBQUMsb0JBQW9CLFNBQVMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3ZDLENBQUMsQ0FBQyxzQ0FBc0MsQ0FDM0MsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7WUFDekIsY0FBYyxFQUFFLFFBQVE7WUFDeEIsR0FBRyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVGLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFNBQVM7WUFDbEQsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxRQUFRO1lBQ1IsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ3JCLGNBQWMsRUFBRSxRQUFRO1lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNoQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUMsQ0FBQztRQUVILE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUMvQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQzVCLFdBQVcsRUFBRSxJQUFJLElBQUksYUFBYSxDQUNuQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRSxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sMkJBQTJCLENBQUM7WUFDbEQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2hCLElBQUksRUFBRSxlQUFlO1lBQ3JCLFFBQVE7WUFDUixrQkFBa0IsRUFBRSxPQUFPLENBQUMsVUFBVTtTQUN2QyxDQUFDLENBQUM7UUFDSCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsa0NBQWtDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELElBQUksUUFBUTtnQkFBRSwrQkFBK0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDOUQsSUFBSSxXQUFXO1lBQUUsa0NBQWtDLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RixJQUFJLFFBQVE7WUFBRSwrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNqQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLE9BQU8sRUFBRSxTQUFTO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsT0FBTztRQUNMLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQ25CLEtBQW1CLEVBQ25CLElBQXVDLEVBQ3ZDLE9BQWdCLEVBQ2hCLE1BQW1CO1FBRW5CLElBQUksS0FBSyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQ2xELEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZTtvQkFDdEIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRTtvQkFDbEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQzlFLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDO1lBQ3JCLEtBQUs7WUFDTCxJQUFJO1lBQ0osT0FBTztZQUNQLE1BQU07WUFDTixHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQXVDO0lBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNyRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvRSxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLHVEQUF1RCxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUM5QixPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDN0IsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLEtBQXNDLEVBQ3RDLElBQXVDO0lBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdGLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUksU0FBUyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMxQiwwQkFBMEIsRUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQ3ZELENBQUM7SUFDRixPQUFPLFdBQVcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDNUUsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQXVDLEVBQ3ZDLE9BQWdCLEVBQ2hCLFdBQThFLEVBQUUsRUFDaEYsUUFBeUI7SUFPekIsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEcsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDNUUsSUFBSSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLEdBQUcsRUFBRSx3QkFBd0IsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsOENBQThDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxJQUFJLFdBQVcsRUFBRSxJQUFJO1FBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2RSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVO1FBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEUsSUFBSSxRQUFRLEtBQUssbUJBQW1CO1FBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEYsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsU0FBUyxrQ0FBa0MsQ0FDekMsT0FBZ0IsRUFDaEIsV0FBbUM7SUFFbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0UsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMxRSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25FLElBQUksVUFBVTtRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekUsSUFBSSxjQUFjO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsU0FBUywrQkFBK0IsQ0FBQyxPQUFnQixFQUFFLFdBQWdDO0lBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdELElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsT0FBZ0I7SUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLE1BQXFELEVBQ3JELEdBQVc7SUFFWCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQTBCLEVBQUUsT0FBZTtJQUNuRSxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDM0YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE1BQU07UUFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLFFBQWtCO0lBQzlFLE1BQU0sT0FBTyxHQUFHO1FBQ2QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUNqRCxLQUFLO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgTW9kZWxTb3VyY2UsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWlEZWNpZGVPYnNlcnZhdGlvbixcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsXG4gIEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgQUlfREVDSURFX1NFTEVDVEVEX01PREVMX0hFQURFUixcbiAgQUlfREVDSURFX1NUUkFURUdZX0hFQURFUixcbiAgQWlEZWNpZGVTdHJhdGVneVNjaGVtYSxcbiAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUyxcbiAgU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gIFNNQVJUX1JPVVRFUl9QUk9GSUxFUl9TVEFUVVNfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU09VUkNFX0hFQURFUixcbiAgU01BUlRfUk9VVEVSX1RBU0tfVElFUl9IRUFERVIsXG4gIGlzQWlEZWNpZGVNb2RlbElkLFxuICBpc1NtYXJ0Um91dGVyTW9kZWxJZCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYWktZGVjaWRlLnRzXCI7XG5pbXBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCB9IGZyb20gXCIuL21vZGVscy50c1wiO1xuaW1wb3J0IHsgUHJvZmlsZUZhbGxiYWNrLCB0eXBlIE1vZGVsR2F0ZXdheVByb2ZpbGUgfSBmcm9tIFwiLi9wcm9maWxlLWZhbGxiYWNrLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7XG4gIFNtYXJ0TW9kZWxSb3V0ZXIsXG4gIHR5cGUgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICB0eXBlIFNtYXJ0Um91dGVyU3RvcmUsXG59IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydFJvdXRlck1vZGU7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0PzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUHJvYmVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclNlcnZpY2U/OiBTbWFydFJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyU3RvcmU/OiBTbWFydFJvdXRlclN0b3JlO1xuICByZWFkb25seSBhaURlY2lkZVNlcnZpY2U/OiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IHJlYWRvbmx5IE1vZGVsQ2FwYWJpbGl0eU92ZXJyaWRlW107XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGU7XG4gIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHByb2ZpbGVzPzogcmVhZG9ubHkgTW9kZWxHYXRld2F5UHJvZmlsZVtdO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFpRGVjaWRlOiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXJNb2RlOiBTbWFydFJvdXRlck1vZGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlRmFsbGJhY2s/OiBQcm9maWxlRmFsbGJhY2s7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJpbWFyeVByb2ZpbGU/OiBNb2RlbEdhdGV3YXlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsR2F0ZXdheU9wdGlvbnMgPSB7fSwgcmVnaXN0cnk/OiBNb2RlbFJlZ2lzdHJ5KSB7XG4gICAgdGhpcy5wcmltYXJ5UHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZXM/LlswXTtcbiAgICB0aGlzLnByb2ZpbGVGYWxsYmFjayA9XG4gICAgICBvcHRpb25zLnByb2ZpbGVzICYmIG9wdGlvbnMucHJvZmlsZXMubGVuZ3RoID4gMVxuICAgICAgICA/IG5ldyBQcm9maWxlRmFsbGJhY2sob3B0aW9ucy5wcm9maWxlcylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlVHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IG9wdGlvbnMuY2FjaGVUdGxNcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMub3ZlcnJpZGVzID8geyBvdmVycmlkZXM6IG9wdGlvbnMub3ZlcnJpZGVzIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcHJlZmVyU3lzdGVtTW9kZWxzOiBvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHRoaXMucHJpbWFyeVByb2ZpbGUgPyB7IGNsaWVudDogdGhpcy5wcmltYXJ5UHJvZmlsZS5jbGllbnQgfSA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLmFpRGVjaWRlID0gb3B0aW9ucy5haURlY2lkZVNlcnZpY2UgPz8gbmV3IEFpRGVjaWRlUm91dGVyU2VydmljZSgpO1xuICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID0gb3B0aW9ucy5zbWFydFJvdXRlciA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyO1xuICAgIGlmICh0aGlzLnNtYXJ0Um91dGVyTW9kZSAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyID0gbmV3IFNtYXJ0TW9kZWxSb3V0ZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZXh0VG9rZW5CdWRnZXQ6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0ID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0LFxuICAgICAgICAgIHByb2JlUmVmcmVzaEludGVydmFsTXM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyA/P1xuICAgICAgICAgICAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgICAgcHJvYmVUdGxNczogb3B0aW9ucy5zbWFydFJvdXRlclByb2JlVHRsTXMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgICAgICAgcm91dGVUdGxTZWNvbmRzOlxuICAgICAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclJvdXRlVHRsU2Vjb25kcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzLFxuICAgICAgICAgIHJvdXRlck5hbWU6IFwidGFza192M1wiLFxuICAgICAgICAgIHRpbWVvdXRNczogb3B0aW9ucy5zbWFydFJvdXRlclRpbWVvdXRNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyVGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU2VydmljZSxcbiAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclN0b3JlLFxuICAgICAgICB0aGlzLnByaW1hcnlQcm9maWxlPy5jbGllbnQsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPVxuICAgICAgb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5wcmVmZXJTeXN0ZW1Nb2RlbHM7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhcbiAgICBvcmlnaW5hdG9yPzogc3RyaW5nLFxuICAgIHNlYXJjaD86IHN0cmluZyxcbiAgICBtb2RlbFNvdXJjZTogTW9kZWxTb3VyY2UgfCBcImFsbFwiID0gXCJmb3VuZGF0aW9uXCIsXG4gICAgaW5jbHVkZU1ldGFkYXRhID0gZmFsc2UsXG4gICk6IFByb21pc2U8TW9kZWxMaXN0UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjb2RleCA9IGlzQ29kZXhPcmlnaW5hdG9yKG9yaWdpbmF0b3IpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RpbmcgbW9kZWxzXCIsIHsgY29kZXgsIHNlYXJjaCB9KTtcbiAgICBjb25zdCBxdWVyeSA9IHNlYXJjaD8udHJpbSgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyU2VhcmNoID1cbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgU01BUlRfUk9VVEVSX01PREVMX0lELmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGFpRGVjaWRlU2VhcmNoID0gcXVlcnkgIT09IHVuZGVmaW5lZCAmJiBBSV9ERUNJREVfTU9ERUxfSUQuaW5jbHVkZXMocXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2ggJiYgIWFpRGVjaWRlU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5zZWFyY2gocXVlcnkpXG4gICAgICAgIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9XG4gICAgICBtb2RlbFNvdXJjZSA9PT0gXCJhbGxcIlxuICAgICAgICA/IGRpc2NvdmVyZWRcbiAgICAgICAgOiBkaXNjb3ZlcmVkLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/Lm1vZGVsU291cmNlID09PSBtb2RlbFNvdXJjZSk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJUYXJnZXRzID1cbiAgICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiBxdWVyeSAmJiAhc21hcnRSb3V0ZXJTZWFyY2hcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCkpLmZpbHRlcihcbiAgICAgICAgICAgICh0YXJnZXQpID0+IG1vZGVsU291cmNlID09PSBcImFsbFwiIHx8IHRhcmdldC5lbmRwb2ludD8ubW9kZWxTb3VyY2UgPT09IG1vZGVsU291cmNlLFxuICAgICAgICAgIClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBjb25zdCBhaURlY2lkZUVuYWJsZWQgPVxuICAgICAgKCFxdWVyeSB8fCBhaURlY2lkZVNlYXJjaCkgJiZcbiAgICAgIChhd2FpdCB0aGlzLmFpRGVjaWRlLmlzRW5hYmxlZChcbiAgICAgICAgdGFyZ2V0c1xuICAgICAgICAgIC5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50KVxuICAgICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KTogZW5kcG9pbnQgaXMgU2VydmluZ0VuZHBvaW50U3VtbWFyeSA9PiBlbmRwb2ludCAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICAgdGhpcy5wcmltYXJ5UHJvZmlsZT8uY2xpZW50LFxuICAgICAgKSk7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiAmJiAhc21hcnRSb3V0ZXJFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDUwMyxcbiAgICAgICAgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyByZXF1aXJlZCBidXQgdW5hdmFpbGFibGUgZm9yIHRoZSBhY3RpdmUgd29ya3NwYWNlIGlkZW50aXR5XCIsXG4gICAgICApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWQgbW9kZWxzXCIsIHsgY29kZXgsIGNvdW50OiB0YXJnZXRzLmxlbmd0aCB9KTtcbiAgICBjb25zdCBwYXlsb2FkID0gbGlzdE1vZGVsc1BheWxvYWQoXG4gICAgICB0YXJnZXRzLFxuICAgICAgY29kZXgsXG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5Lmxlbmd0aCA+IDAsXG4gICAgICB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIHNtYXJ0Um91dGVyRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IHNtYXJ0Um91dGVyU2VhcmNoKSxcbiAgICAgIGFpRGVjaWRlRW5hYmxlZCAmJiAoIXF1ZXJ5IHx8IGFpRGVjaWRlU2VhcmNoKSxcbiAgICAgIGluY2x1ZGVNZXRhZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBzbWFydFJvdXRlclNlYXJjaCB8fCBhaURlY2lkZVNlYXJjaFxuICAgICAgPyBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQsIHNtYXJ0Um91dGVyU2VhcmNoID8gU01BUlRfUk9VVEVSX01PREVMX0lEIDogQUlfREVDSURFX01PREVMX0lEKVxuICAgICAgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgYW5kIGV4ZWN1dGUgb25lIGluZmVyZW5jZSByZXF1ZXN0LiAqL1xuICBhc3luYyBpbmZlcmVuY2UoXG4gICAgcHJvdG9jb2w6IENsaWVudFByb3RvY29sLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRCb2R5ID0gc2FuaXRpemVJbmZlcmVuY2VCb2R5KGJvZHkpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdhdGV3YXlNb2RlbFNlbGVjdGlvbihcbiAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgbW9kZWxDbGFzczogdGhpcy5tb2RlbENsYXNzLFxuICAgICAgfSxcbiAgICAgIHByb3RvY29sLFxuICAgICk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHJlcXVlc3RcIiwge1xuICAgICAgc21hcnRSb3V0ZXI6IHNlbGVjdGlvbi5zbWFydFJvdXRlciA9PT0gdHJ1ZSxcbiAgICAgIGFpRGVjaWRlOiBzZWxlY3Rpb24uYWlEZWNpZGUgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmICgoc2VsZWN0aW9uLnNtYXJ0Um91dGVyIHx8IHNlbGVjdGlvbi5haURlY2lkZSkgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDAsXG4gICAgICAgIFwiVmlydHVhbCBtb2RlbCByb3V0ZXJzIGFyZSBhdmFpbGFibGUgb25seSBmb3IgY2hhdCByZXF1ZXN0c1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc21hcnRSb3V0ZXIgPVxuICAgICAgc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmIHRoaXMuc21hcnRSb3V0ZXJcbiAgICAgICAgPyBhd2FpdCB0aGlzLnNtYXJ0Um91dGVyLnJlc29sdmUoe1xuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sIGFzIEV4Y2x1ZGU8Q2xpZW50UHJvdG9jb2wsIFwib3BlbmFpLWVtYmVkZGluZ3NcIj4sXG4gICAgICAgICAgICBib2R5OiBzYW5pdGl6ZWRCb2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGZlYXR1cmVzLFxuICAgICAgICAgICAgdGFyZ2V0czogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCksXG4gICAgICAgICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgIXNtYXJ0Um91dGVyKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDA0LCBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIGRpc2FibGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCByZWdpc3RyeVRhcmdldHMgPSBzbWFydFJvdXRlciA/IHVuZGVmaW5lZCA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IGFpRGVjaWRlID0gc2VsZWN0aW9uLmFpRGVjaWRlXG4gICAgICA/IGF3YWl0IHRoaXMuYWlEZWNpZGUuc2VsZWN0KFxuICAgICAgICAgIHNhbml0aXplZEJvZHksXG4gICAgICAgICAgKHJlZ2lzdHJ5VGFyZ2V0cyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50KVxuICAgICAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpOiBlbmRwb2ludCBpcyBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0+IGVuZHBvaW50ICE9PSB1bmRlZmluZWQpLFxuICAgICAgICAgIHRoaXMucHJpbWFyeVByb2ZpbGU/LmNsaWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJhdGVneTogYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzKSxcbiAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihmZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0ID8geyByZXF1aXJlc1N0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhaURlY2lkZVxuICAgICAgICA/IHJlZ2lzdHJ5VGFyZ2V0cz8uZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGFpRGVjaWRlLmVuZHBvaW50Lm5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgICAgKGF3YWl0IHRoaXMucmVnaXN0cnkucmVzb2x2ZShzZWxlY3Rpb24ubW9kZWwsIHtcbiAgICAgICAgLi4uKHByb3RvY29sID09PSBcIm9wZW5haS1lbWJlZGRpbmdzXCIgPyB7IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH0gOiB7fSksXG4gICAgICAgIC4uLihzZWxlY3Rpb24ubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAgICAgLi4uKGZlYXR1cmVzLnRvb2xzID8geyByZXF1aXJlc1Rvb2xzOiB0cnVlIH0gOiB7fSksXG4gICAgICB9KSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNDA0LFxuICAgICAgICBzZWxlY3Rpb24ubW9kZWxcbiAgICAgICAgICA/IGBNb2RlbCBub3QgZm91bmQ6ICR7c2VsZWN0aW9uLm1vZGVsfWBcbiAgICAgICAgICA6IFwiTm8gbW9kZWwgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIGNsYXNzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByb3V0ZSA9IHJlc29sdmVSb3V0ZSh7XG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAuLi4oIXNtYXJ0Um91dGVyICYmICFhaURlY2lkZSAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYWlEZWNpZGUpIGFwcGx5QWlEZWNpZGVPYnNlcnZhdGlvbkhlYWRlcnMocmVzcG9uc2UuaGVhZGVycywgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBnYXRld2F5UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuICAgIGZvcndhcmRlZC5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICBpZiAoc21hcnRSb3V0ZXIpIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoZm9yd2FyZGVkLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgaWYgKGFpRGVjaWRlKSBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGZvcndhcmRlZCwgYWlEZWNpZGUub2JzZXJ2YXRpb24pO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSwge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgaGVhZGVyczogZm9yd2FyZGVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZnJlc2ggdGhlIGFjdGl2ZSBwcmluY2lwYWwncyBtb2RlbCBjYXRhbG9ndWUuICovXG4gIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVmcmVzaGluZyBtb2RlbCBjYXRhbG9ndWVcIik7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmb3J3YXJkKFxuICAgIHJvdXRlOiBHYXRld2F5Um91dGUsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChyb3V0ZS51cHN0cmVhbVByb3RvY29sID09PSBcImFpLXNka1wiKSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3Qocm91dGUsIGJvZHksIHNpZ25hbCwge1xuICAgICAgICAuLi4odGhpcy5wcmltYXJ5UHJvZmlsZSA/IHsgY2xpZW50OiB0aGlzLnByaW1hcnlQcm9maWxlLmNsaWVudCB9IDoge30pLFxuICAgICAgICAuLi4odGhpcy5wcm9maWxlRmFsbGJhY2tcbiAgICAgICAgICA/IHsgZmV0Y2g6IHRoaXMucHJvZmlsZUZhbGxiYWNrLmNyZWF0ZUZldGNoKHJvdXRlLnVwc3RyZWFtTW9kZWwpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9maWxlRmFsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2ZpbGVGYWxsYmFjay5yZXF1ZXN0KHJvdXRlLnVwc3RyZWFtTW9kZWwsIHNpZ25hbCwgKHsgY2xpZW50IH0pID0+XG4gICAgICAgIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwsIGNsaWVudCB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaERhdGFicmlja3Moe1xuICAgICAgcm91dGUsXG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHNpZ25hbCxcbiAgICAgIC4uLih0aGlzLnByaW1hcnlQcm9maWxlID8geyBjbGllbnQ6IHRoaXMucHJpbWFyeVByb2ZpbGUuY2xpZW50IH0gOiB7fSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKToge1xuICByZWFkb25seSBzbWFydFJvdXRlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVjaWRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHtcbiAgICBpZiAoaXNTbWFydFJvdXRlck1vZGVsSWQobW9kZWwpKSByZXR1cm4geyBzbWFydFJvdXRlcjogdHJ1ZSB9O1xuICAgIGlmIChpc0FpRGVjaWRlTW9kZWxJZChtb2RlbCkpIHJldHVybiB7IGFpRGVjaWRlOiB0cnVlIH07XG4gICAgcmV0dXJuIHsgbW9kZWwgfTtcbiAgfVxuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSB7XG4gICAgaWYgKGlzU21hcnRSb3V0ZXJNb2RlbElkKGRlZmF1bHRzLm1vZGVsKSkgcmV0dXJuIHsgc21hcnRSb3V0ZXI6IHRydWUgfTtcbiAgICBpZiAoaXNBaURlY2lkZU1vZGVsSWQoZGVmYXVsdHMubW9kZWwpKSByZXR1cm4geyBhaURlY2lkZTogdHJ1ZSB9O1xuICAgIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICB9XG4gIGlmIChkZWZhdWx0cy5tb2RlbENsYXNzKSByZXR1cm4geyBtb2RlbENsYXNzOiBkZWZhdWx0cy5tb2RlbENsYXNzIH07XG4gIGlmIChwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSByZXR1cm4geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9O1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLCBvYnNlcnZhdGlvbi5oYXJuZXNzKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NPVVJDRV9IRUFERVIsIG9ic2VydmF0aW9uLnNvdXJjZSk7XG4gIGNvbnN0IHRhc2tUaWVyID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInRhc2tfdGllclwiKTtcbiAgY29uc3Qgc2VydmVkVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJzZXJ2ZWRfdGllclwiKTtcbiAgY29uc3QgcHJvZmlsZXJTdGF0dXMgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwicHJvZmlsZXJfc3RhdHVzXCIpO1xuICBpZiAodGFza1RpZXIpIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9UQVNLX1RJRVJfSEVBREVSLCB0YXNrVGllcik7XG4gIGlmIChzZXJ2ZWRUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLCBzZXJ2ZWRUaWVyKTtcbiAgaWYgKHByb2ZpbGVyU3RhdHVzKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUFJPRklMRVJfU1RBVFVTX0hFQURFUiwgcHJvZmlsZXJTdGF0dXMpO1xufVxuXG5mdW5jdGlvbiBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIG9ic2VydmF0aW9uOiBBaURlY2lkZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KEFJX0RFQ0lERV9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLCBvYnNlcnZhdGlvbi5zdHJhdGVneSk7XG4gIGlmIChvYnNlcnZhdGlvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBoZWFkZXJzLnNldChBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsIFN0cmluZyhvYnNlcnZhdGlvbi5jb25maWRlbmNlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoQUlfREVDSURFX1NUUkFURUdZX0hFQURFUik/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdmFsdWUgPyBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLnBhcnNlKHZhbHVlKSA6IFwiYmFsYW5jZWRcIjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQ6IE1vZGVsTGlzdFJlc3BvbnNlLCBtb2RlbElkOiBzdHJpbmcpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke21vZGVsSWR9YCkpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IFwibGlzdFwiLFxuICAgIGRhdGE6IHBheWxvYWQuZGF0YS5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gbW9kZWxJZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvZ1Jlc3BvbnNlKHVwc3RyZWFtUHJvdG9jb2w6IHN0cmluZywgbW9kZWw6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gIH07XG4gIGlmIChyZXNwb25zZS5vaykgbG9nZ2VyLmRlYnVnKFwidXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gIGVsc2UgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXF1ZXN0IGZhaWxlZFwiLCBkZXRhaWxzKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered Databricks profile fallback for rate-limited model requests.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { WorkspaceClient } from "@databricks/appkit";
|
|
7
|
+
/** One configured workspace identity in fallback order. */
|
|
8
|
+
export interface ModelGatewayProfile {
|
|
9
|
+
readonly profile?: string;
|
|
10
|
+
readonly workspace: string;
|
|
11
|
+
readonly client: WorkspaceClient;
|
|
12
|
+
}
|
|
13
|
+
/** Parsed upstream rate-limit timing and diagnostic fields. */
|
|
14
|
+
export interface ModelGatewayRateLimit {
|
|
15
|
+
readonly retryAfterMs: number;
|
|
16
|
+
readonly source: "header" | "body" | "workspace-token-window" | "default";
|
|
17
|
+
readonly errorCode?: string;
|
|
18
|
+
readonly message?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Injectable time and transport boundaries for profile-fallback tests. */
|
|
21
|
+
export interface ProfileFallbackDependencies {
|
|
22
|
+
readonly now?: () => number;
|
|
23
|
+
readonly sleep?: (delayMs: number, signal: AbortSignal) => Promise<void>;
|
|
24
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
25
|
+
}
|
|
26
|
+
/** Process-local ordered profile cooldowns keyed by workspace and model. */
|
|
27
|
+
export declare class ProfileFallback {
|
|
28
|
+
readonly profiles: readonly ModelGatewayProfile[];
|
|
29
|
+
private readonly cooldowns;
|
|
30
|
+
private readonly now;
|
|
31
|
+
private readonly sleep;
|
|
32
|
+
private readonly fetcher;
|
|
33
|
+
constructor(profiles: readonly ModelGatewayProfile[], dependencies?: ProfileFallbackDependencies);
|
|
34
|
+
/** Primary profile used for discovery and workspace-scoped routing. */
|
|
35
|
+
get primary(): ModelGatewayProfile;
|
|
36
|
+
/** Execute against the first available profile and cool down HTTP 429 responders. */
|
|
37
|
+
request(model: string, signal: AbortSignal, send: (profile: ModelGatewayProfile) => Promise<Response>): Promise<Response>;
|
|
38
|
+
/** Build an AI SDK fetch that replays a request through the ordered profile pool. */
|
|
39
|
+
createFetch(model: string): typeof globalThis.fetch;
|
|
40
|
+
private availableProfile;
|
|
41
|
+
private nextCooldownDelay;
|
|
42
|
+
private key;
|
|
43
|
+
}
|
|
44
|
+
/** Parse HTTP and Databricks JSON retry timing for a 429 response. */
|
|
45
|
+
export declare function modelGatewayRateLimit(response: Response, now?: number): Promise<ModelGatewayRateLimit>;
|