@dbx-tools/model 0.9.32 → 0.9.37

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.
Files changed (52) hide show
  1. package/README.md +3 -3
  2. package/exports.ts +1 -0
  3. package/index.ts +12 -8
  4. package/lib/index.d.ts +12 -8
  5. package/lib/index.js +8 -5
  6. package/lib/scripts/generate-metadata.d.ts +1 -0
  7. package/lib/scripts/generate-metadata.js +65 -0
  8. package/lib/src/_metadata-contract.d.ts +12 -6
  9. package/lib/src/_metadata-contract.js +3 -1
  10. package/lib/src/_metadata-generator.d.ts +3 -1
  11. package/lib/src/_metadata-generator.js +148 -1
  12. package/lib/src/_ranking.js +39 -12
  13. package/lib/src/_selection.d.ts +1 -17
  14. package/lib/src/_selection.js +1 -1
  15. package/lib/src/classify.d.ts +1 -17
  16. package/lib/src/classify.js +1 -1
  17. package/lib/src/generated/model-reasoning.json +147 -0
  18. package/lib/src/invoke.d.ts +8 -0
  19. package/lib/src/invoke.js +13 -1
  20. package/lib/src/metadata-cache.d.ts +84 -0
  21. package/lib/src/metadata-cache.js +234 -0
  22. package/lib/src/metadata.d.ts +52 -17
  23. package/lib/src/metadata.js +251 -18
  24. package/lib/src/model-catalog.d.ts +1 -19
  25. package/lib/src/model-catalog.js +9 -2
  26. package/lib/src/model-client.d.ts +11 -19
  27. package/lib/src/model-client.js +42 -24
  28. package/lib/src/reasoning-translation.d.ts +105 -0
  29. package/lib/src/reasoning-translation.js +444 -0
  30. package/lib/src/resolve.d.ts +2 -4
  31. package/lib/src/resolve.js +2 -2
  32. package/lib/src/serving-wire.d.ts +37 -0
  33. package/lib/src/serving-wire.js +211 -0
  34. package/lib/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +110 -17
  36. package/src/_metadata-contract.ts +17 -7
  37. package/src/_metadata-generator.ts +160 -0
  38. package/src/_ranking.ts +40 -11
  39. package/src/_selection.ts +4 -19
  40. package/src/classify.ts +2 -18
  41. package/src/generated/model-reasoning.json +147 -0
  42. package/src/invoke.ts +16 -0
  43. package/src/metadata-cache.ts +322 -0
  44. package/src/metadata.ts +334 -43
  45. package/src/model-catalog.ts +8 -25
  46. package/src/model-client.ts +67 -44
  47. package/src/reasoning-translation.ts +495 -0
  48. package/src/resolve.ts +10 -11
  49. package/src/serving-wire.ts +231 -0
  50. package/lib/src/python.d.ts +0 -2
  51. package/lib/src/python.js +0 -3
  52. package/src/python.ts +0 -2
@@ -1,28 +1,22 @@
1
- /**
2
- * Authentication-aware Databricks Model Serving client.
3
- *
4
- * This is the portable entry point used by generated Python bindings. It keeps
5
- * authentication, endpoint discovery, caching, normalization, ranking, route
6
- * selection, and published metadata in Node while exposing one small client.
7
- *
8
- * @module
9
- */
10
- import { type DatabricksAuthOptions, type DatabricksProfileSummary } from "@dbx-tools/auth";
11
- import { type ModelQuery, type RankedModel, type ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
12
- import { type ResolveModelInput, type ResolvedModelSelection } from "./_selection.ts";
13
- import { type ModelMetadata } from "./metadata.ts";
1
+ import type { DatabricksProfileSummary } from "@dbx-tools/shared-auth";
2
+ import { type ModelMetadata, type ModelQuery, type RankedModel, type ResolvedModelSelection, type ResolveModelInput, type ServingEndpointSummary } from "@dbx-tools/shared-model/contracts";
14
3
  /** Default lifetime for one live endpoint catalogue. */
15
4
  export declare const DEFAULT_MODEL_CLIENT_CACHE_TTL_MS: number;
5
+ /** Authentication options exposed by the portable model client. */
6
+ export interface ModelAuthOptions {
7
+ /** Databricks profile name. */
8
+ profile?: string;
9
+ }
16
10
  /** Construction options for {@link createModelClient}. */
17
11
  export interface ModelClientOptions {
18
12
  /** Databricks authentication and profile selection options. */
19
- auth?: DatabricksAuthOptions;
13
+ auth?: ModelAuthOptions;
20
14
  /** In-memory endpoint catalogue TTL in milliseconds. */
21
15
  cacheTtlMs?: number;
22
16
  }
23
17
  /** Secret-free runtime identity and cache configuration. */
24
18
  export interface ModelClientStatus {
25
- readonly profile: string;
19
+ readonly profile?: string;
26
20
  readonly host: string;
27
21
  readonly principal: string;
28
22
  readonly workspaceId?: string;
@@ -55,13 +49,11 @@ export interface ModelRoute {
55
49
  export interface ModelClient {
56
50
  listModels(refresh?: boolean): Promise<ServingEndpointSummary[]>;
57
51
  searchModels(query?: ModelQuery, refresh?: boolean): Promise<RankedModel[]>;
58
- resolveModel(input?: ResolveModelInput, refresh?: boolean): Promise<ResolvedModelSelection>;
59
52
  route(input?: ModelRouteInput): Promise<ModelRoute>;
60
- authenticate(login?: boolean): Promise<Record<string, string>>;
61
53
  metadata(model: string | ServingEndpointSummary): ModelMetadata;
62
54
  status(): ModelClientStatus;
63
- profile(name?: string): DatabricksProfileSummary;
64
- listProfiles(refresh?: boolean): DatabricksProfileSummary[];
65
55
  }
66
56
  /** Create an authentication-aware Databricks model client. */
67
57
  export declare function createModelClient(options?: ModelClientOptions): Promise<ModelClient>;
58
+ /** List configured Databricks profiles outside the model client facade. */
59
+ export declare function listProfiles(refresh?: boolean): DatabricksProfileSummary[];
@@ -7,18 +7,49 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { DatabricksClient, } from "@dbx-tools/auth";
10
+ import { client as authClient, profile as authProfile, } from "@dbx-tools/auth";
11
11
  import * as log from "@dbx-tools/shared-core/log";
12
12
  import * as object from "@dbx-tools/shared-core/object";
13
13
  import { ModelClass, } from "@dbx-tools/shared-model/contracts";
14
14
  import { normalizeEndpoints } from "./_ranking.js";
15
- import { lookupModels, resolveModel, } from "./_selection.js";
15
+ import { lookupModels, resolveModel } from "./_selection.js";
16
16
  import { chatCompletionsUrl, invocationsUrl, responsesUpstreamUrl } from "./invoke.js";
17
17
  import { modelMetadataFor } from "./metadata.js";
18
18
  import { modelServingApi } from "./policy.js";
19
19
  const logger = log.logger("model/client");
20
20
  /** Default lifetime for one live endpoint catalogue. */
21
21
  export const DEFAULT_MODEL_CLIENT_CACHE_TTL_MS = 5 * 60 * 1000;
22
+ class AuthenticatedModelClient {
23
+ auth;
24
+ fetcher;
25
+ constructor(auth, fetcher) {
26
+ this.auth = auth;
27
+ this.fetcher = fetcher;
28
+ }
29
+ host() {
30
+ return this.auth.host;
31
+ }
32
+ principal() {
33
+ return this.auth.principal;
34
+ }
35
+ workspaceId() {
36
+ return this.auth.workspaceId;
37
+ }
38
+ async request(path) {
39
+ const url = new URL(path, `${this.host().replace(/\/$/, "")}/`).toString();
40
+ let headers = await this.auth.headers();
41
+ let response = await this.fetcher(url, { headers });
42
+ if (response.status === 401) {
43
+ headers = await this.auth.headers({ refresh: true });
44
+ response = await this.fetcher(url, { headers });
45
+ }
46
+ const text = await response.text();
47
+ if (!response.ok) {
48
+ throw new Error(`Databricks Model Serving API ${path} returned HTTP ${response.status}: ${text}`);
49
+ }
50
+ return text ? JSON.parse(text) : undefined;
51
+ }
52
+ }
22
53
  const catalogueCache = new Map();
23
54
  class DefaultModelClient {
24
55
  client;
@@ -36,14 +67,6 @@ class DefaultModelClient {
36
67
  endpoint: cloneEndpoint(endpoint),
37
68
  }));
38
69
  }
39
- async resolveModel(input = {}, refresh = false) {
40
- const catalogue = await this.catalogue(refresh);
41
- const resolved = resolveModel(catalogue, input);
42
- if (isUnmatchedExplicit(catalogue, input, resolved)) {
43
- return resolveModel(await this.catalogue(true), input);
44
- }
45
- return resolved;
46
- }
47
70
  async route(input = {}) {
48
71
  const { refresh = false, protocol: requestedProtocol, login, ...selection } = input;
49
72
  const effectiveSelection = requestedProtocol === "embeddings" && selection.modelClass === undefined
@@ -58,7 +81,7 @@ class DefaultModelClient {
58
81
  const protocol = requestedProtocol ?? inferProtocol(endpoint, resolved.modelId);
59
82
  const host = this.client.host();
60
83
  const url = routeUrl(host, resolved.modelId, protocol);
61
- const headers = await this.client.auth.requestHeadersForUrl(url, login);
84
+ const headers = await this.client.auth.headers({ login });
62
85
  return {
63
86
  modelId: resolved.modelId,
64
87
  ...(endpoint ? { endpoint: cloneEndpoint(endpoint) } : {}),
@@ -71,27 +94,18 @@ class DefaultModelClient {
71
94
  metadata: modelMetadataFor(endpoint ?? resolved.modelId),
72
95
  };
73
96
  }
74
- authenticate(login) {
75
- return this.client.auth.authenticate(login);
76
- }
77
97
  metadata(model) {
78
98
  return modelMetadataFor(model);
79
99
  }
80
100
  status() {
81
101
  return {
82
- profile: this.client.auth.status().profile,
102
+ ...(this.client.auth.profile ? { profile: this.client.auth.profile } : {}),
83
103
  host: this.client.host(),
84
104
  principal: this.client.principal(),
85
105
  ...(this.client.workspaceId() ? { workspaceId: this.client.workspaceId() } : {}),
86
106
  cacheTtlMs: this.cacheTtlMs,
87
107
  };
88
108
  }
89
- profile(name) {
90
- return this.client.auth.profile(name);
91
- }
92
- listProfiles(refresh = false) {
93
- return this.client.auth.listProfiles(refresh);
94
- }
95
109
  catalogue(refresh) {
96
110
  const key = catalogueKey(this.client);
97
111
  if (refresh)
@@ -128,7 +142,11 @@ class DefaultModelClient {
128
142
  /** Create an authentication-aware Databricks model client. */
129
143
  export async function createModelClient(options = {}) {
130
144
  const cacheTtlMs = validateCacheTtl(options.cacheTtlMs);
131
- return new DefaultModelClient(await DatabricksClient.create(options.auth), cacheTtlMs);
145
+ return new DefaultModelClient(new AuthenticatedModelClient(await authClient.createAuthClient(options.auth), globalThis.fetch), cacheTtlMs);
146
+ }
147
+ /** List configured Databricks profiles outside the model client facade. */
148
+ export function listProfiles(refresh = false) {
149
+ return authProfile.listProfiles({ refresh });
132
150
  }
133
151
  /** @internal Construct a model client around a test or host-owned Databricks client. */
134
152
  export function createModelClientWithDatabricksClient(client, cacheTtlMs = DEFAULT_MODEL_CLIENT_CACHE_TTL_MS) {
@@ -136,7 +154,7 @@ export function createModelClientWithDatabricksClient(client, cacheTtlMs = DEFAU
136
154
  }
137
155
  /** @internal Create a model client with injectable auth host capabilities. */
138
156
  export async function createModelClientWithDependencies(options, dependencies) {
139
- return new DefaultModelClient(await DatabricksClient.create(options.auth, dependencies), validateCacheTtl(options.cacheTtlMs));
157
+ return new DefaultModelClient(new AuthenticatedModelClient(await authClient.createAuthClient(options.auth, dependencies), dependencies.fetch ?? globalThis.fetch), validateCacheTtl(options.cacheTtlMs));
140
158
  }
141
159
  function validateCacheTtl(value = DEFAULT_MODEL_CLIENT_CACHE_TTL_MS) {
142
160
  if (!Number.isFinite(value) || value <= 0) {
@@ -178,4 +196,4 @@ function cloneEndpoint(endpoint) {
178
196
  ...(endpoint.status ? { status: { ...endpoint.status } } : {}),
179
197
  };
180
198
  }
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFDTCxnQkFBZ0IsR0FLakIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xELE9BQU8sS0FBSyxNQUFNLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUNMLFVBQVUsR0FJWCxNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUdaLFlBQVksR0FDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBdUUvRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztBQUV6RCxNQUFNLGtCQUFrQjtJQUVIO0lBQ0E7SUFGbkIsWUFDbUIsTUFBNkIsRUFDN0IsVUFBa0I7UUFEbEIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDN0IsZUFBVSxHQUFWLFVBQVUsQ0FBUTtJQUNsQyxDQUFDO0lBRUosS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsS0FBSztRQUM5QixPQUFPLGNBQWMsQ0FB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QUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIGNsaWVudC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb3J0YWJsZSBlbnRyeSBwb2ludCB1c2VkIGJ5IGdlbmVyYXRlZCBQeXRob24gYmluZGluZ3MuIEl0IGtlZXBzXG4gKiBhdXRoZW50aWNhdGlvbiwgZW5kcG9pbnQgZGlzY292ZXJ5LCBjYWNoaW5nLCBub3JtYWxpemF0aW9uLCByYW5raW5nLCByb3V0ZVxuICogc2VsZWN0aW9uLCBhbmQgcHVibGlzaGVkIG1ldGFkYXRhIGluIE5vZGUgd2hpbGUgZXhwb3Npbmcgb25lIHNtYWxsIGNsaWVudC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7XG4gIERhdGFicmlja3NDbGllbnQsXG4gIHR5cGUgQXV0aENsaWVudCxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsXG4gIHR5cGUgRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5pbXBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvb2JqZWN0XCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQgeyBub3JtYWxpemVFbmRwb2ludHMgfSBmcm9tIFwiLi9fcmFua2luZy50c1wiO1xuaW1wb3J0IHtcbiAgbG9va3VwTW9kZWxzLFxuICB0eXBlIFJlc29sdmVNb2RlbElucHV0LFxuICB0eXBlIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4gIHJlc29sdmVNb2RlbCxcbn0gZnJvbSBcIi4vX3NlbGVjdGlvbi50c1wiO1xuaW1wb3J0IHsgY2hhdENvbXBsZXRpb25zVXJsLCBpbnZvY2F0aW9uc1VybCwgcmVzcG9uc2VzVXBzdHJlYW1VcmwgfSBmcm9tIFwiLi9pbnZva2UudHNcIjtcbmltcG9ydCB7IHR5cGUgTW9kZWxNZXRhZGF0YSwgbW9kZWxNZXRhZGF0YUZvciB9IGZyb20gXCIuL21ldGFkYXRhLnRzXCI7XG5pbXBvcnQgeyBtb2RlbFNlcnZpbmdBcGkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL2NsaWVudFwiKTtcblxuLyoqIERlZmF1bHQgbGlmZXRpbWUgZm9yIG9uZSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVNb2RlbENsaWVudH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50T3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIGFuZCBwcm9maWxlIHNlbGVjdGlvbiBvcHRpb25zLiAqL1xuICBhdXRoPzogRGF0YWJyaWNrc0F1dGhPcHRpb25zO1xuICAvKiogSW4tbWVtb3J5IGVuZHBvaW50IGNhdGFsb2d1ZSBUVEwgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICBjYWNoZVR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogU2VjcmV0LWZyZWUgcnVudGltZSBpZGVudGl0eSBhbmQgY2FjaGUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnRTdGF0dXMge1xuICByZWFkb25seSBwcm9maWxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXI7XG59XG5cbi8qKiBTZXJ2aW5nIHByb3RvY29sIHNlbGVjdGVkIGZvciBvbmUgcmVzb2x2ZWQgbW9kZWwuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3RvY29sID0gXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHwgXCJlbWJlZGRpbmdzXCI7XG5cbi8qKiBNb2RlbCBzZWxlY3Rpb24gcGx1cyByb3V0ZSBjb250cm9scy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZUlucHV0IGV4dGVuZHMgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKiogRm9yY2UgYSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZSByZWZyZXNoIGJlZm9yZSBzZWxlY3Rpb24uICovXG4gIHJlZnJlc2g/OiBib29sZWFuO1xuICAvKiogUmVxdWVzdGVkIHVwc3RyZWFtIHByb3RvY29sLiBEZWZhdWx0cyBmcm9tIGVuZHBvaW50IHRhc2sgYW5kIG1vZGVsIHBvbGljeS4gKi9cbiAgcHJvdG9jb2w/OiBNb2RlbFByb3RvY29sO1xuICAvKiogV2hldGhlciBhdXRoZW50aWNhdGlvbiBtYXkgcnVuIGFuIGludGVyYWN0aXZlIGxvZ2luLiAqL1xuICBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBGdWxseSByZXNvbHZlZCBEYXRhYnJpY2tzIHJvdXRlIGZvciBhIG1vZGVsIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50PzogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgcmVhZG9ubHkgc291cmNlOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uW1wic291cmNlXCJdO1xuICByZWFkb25seSBwcm90b2NvbDogTW9kZWxQcm90b2NvbDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBhcGlCYXNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGE7XG59XG5cbi8qKiBTdGFibGUgbW9kZWwgZmFjYWRlIHNoYXJlZCBieSBOb2RlIGFuZCBnZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50IHtcbiAgbGlzdE1vZGVscyhyZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgc2VhcmNoTW9kZWxzKHF1ZXJ5PzogTW9kZWxRdWVyeSwgcmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+O1xuICByZXNvbHZlTW9kZWwoaW5wdXQ/OiBSZXNvbHZlTW9kZWxJbnB1dCwgcmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWxTZWxlY3Rpb24+O1xuICByb3V0ZShpbnB1dD86IE1vZGVsUm91dGVJbnB1dCk6IFByb21pc2U8TW9kZWxSb3V0ZT47XG4gIGF1dGhlbnRpY2F0ZShsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICBtZXRhZGF0YShtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGE7XG4gIHN0YXR1cygpOiBNb2RlbENsaWVudFN0YXR1cztcbiAgcHJvZmlsZShuYW1lPzogc3RyaW5nKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5O1xuICBsaXN0UHJvZmlsZXMocmVmcmVzaD86IGJvb2xlYW4pOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXTtcbn1cblxuaW50ZXJmYWNlIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQ7XG4gIGhvc3QoKTogc3RyaW5nO1xuICBwcmluY2lwYWwoKTogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlcXVlc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIENhdGFsb2d1ZUVudHJ5IHtcbiAgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+O1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuY29uc3QgY2F0YWxvZ3VlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2F0YWxvZ3VlRW50cnk+KCk7XG5cbmNsYXNzIERlZmF1bHRNb2RlbENsaWVudCBpbXBsZW1lbnRzIE1vZGVsQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IERhdGFicmlja3NNb2RlbENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlVHRsTXM6IG51bWJlcixcbiAgKSB7fVxuXG4gIGFzeW5jIGxpc3RNb2RlbHMocmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICByZXR1cm4gY2xvbmVFbmRwb2ludHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoTW9kZWxzKHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sIHJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmFua2VkTW9kZWxbXT4ge1xuICAgIHJldHVybiBsb29rdXBNb2RlbHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCksIHF1ZXJ5KS5tYXAoKHsgZW5kcG9pbnQsIC4uLnJhbmtlZCB9KSA9PiAoe1xuICAgICAgLi4ucmFua2VkLFxuICAgICAgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmVNb2RlbChcbiAgICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQgPSB7fSxcbiAgICByZWZyZXNoID0gZmFsc2UsXG4gICk6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFNlbGVjdGlvbj4ge1xuICAgIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpO1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGNhdGFsb2d1ZSwgaW5wdXQpO1xuICAgIGlmIChpc1VubWF0Y2hlZEV4cGxpY2l0KGNhdGFsb2d1ZSwgaW5wdXQsIHJlc29sdmVkKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmVNb2RlbChhd2FpdCB0aGlzLmNhdGFsb2d1ZSh0cnVlKSwgaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICBhc3luYyByb3V0ZShpbnB1dDogTW9kZWxSb3V0ZUlucHV0ID0ge30pOiBQcm9taXNlPE1vZGVsUm91dGU+IHtcbiAgICBjb25zdCB7IHJlZnJlc2ggPSBmYWxzZSwgcHJvdG9jb2w6IHJlcXVlc3RlZFByb3RvY29sLCBsb2dpbiwgLi4uc2VsZWN0aW9uIH0gPSBpbnB1dDtcbiAgICBjb25zdCBlZmZlY3RpdmVTZWxlY3Rpb24gPVxuICAgICAgcmVxdWVzdGVkUHJvdG9jb2wgPT09IFwiZW1iZWRkaW5nc1wiICYmIHNlbGVjdGlvbi5tb2RlbENsYXNzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IC4uLnNlbGVjdGlvbiwgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfVxuICAgICAgICA6IHNlbGVjdGlvbjtcbiAgICBjb25zdCBjYXRhbG9ndWUgPSBhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKTtcbiAgICBsZXQgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwoY2F0YWxvZ3VlLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIGlmIChpc1VubWF0Y2hlZEV4cGxpY2l0KGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uLCByZXNvbHZlZCkpIHtcbiAgICAgIHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHRydWUpLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IChhd2FpdCB0aGlzLmNhdGFsb2d1ZShmYWxzZSkpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcmVzb2x2ZWQubW9kZWxJZCxcbiAgICApO1xuICAgIGNvbnN0IHByb3RvY29sID0gcmVxdWVzdGVkUHJvdG9jb2wgPz8gaW5mZXJQcm90b2NvbChlbmRwb2ludCwgcmVzb2x2ZWQubW9kZWxJZCk7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY2xpZW50Lmhvc3QoKTtcbiAgICBjb25zdCB1cmwgPSByb3V0ZVVybChob3N0LCByZXNvbHZlZC5tb2RlbElkLCBwcm90b2NvbCk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMuY2xpZW50LmF1dGgucmVxdWVzdEhlYWRlcnNGb3JVcmwodXJsLCBsb2dpbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsSWQ6IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgICAuLi4oZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBjbG9uZUVuZHBvaW50KGVuZHBvaW50KSB9IDoge30pLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIGhvc3QsXG4gICAgICBhcGlCYXNlOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHNcIiwgYCR7aG9zdC5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCksXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IG1vZGVsTWV0YWRhdGFGb3IoZW5kcG9pbnQgPz8gcmVzb2x2ZWQubW9kZWxJZCksXG4gICAgfTtcbiAgfVxuXG4gIGF1dGhlbnRpY2F0ZShsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYXV0aC5hdXRoZW50aWNhdGUobG9naW4pO1xuICB9XG5cbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgICByZXR1cm4gbW9kZWxNZXRhZGF0YUZvcihtb2RlbCk7XG4gIH1cblxuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9maWxlOiB0aGlzLmNsaWVudC5hdXRoLnN0YXR1cygpLnByb2ZpbGUsXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBwcmluY2lwYWw6IHRoaXMuY2xpZW50LnByaW5jaXBhbCgpLFxuICAgICAgLi4uKHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgPyB7IHdvcmtzcGFjZUlkOiB0aGlzLmNsaWVudC53b3Jrc3BhY2VJZCgpIH0gOiB7fSksXG4gICAgICBjYWNoZVR0bE1zOiB0aGlzLmNhY2hlVHRsTXMsXG4gICAgfTtcbiAgfVxuXG4gIHByb2ZpbGUobmFtZT86IHN0cmluZyk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmF1dGgucHJvZmlsZShuYW1lKTtcbiAgfVxuXG4gIGxpc3RQcm9maWxlcyhyZWZyZXNoID0gZmFsc2UpOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmF1dGgubGlzdFByb2ZpbGVzKHJlZnJlc2gpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYXRhbG9ndWUocmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qga2V5ID0gY2F0YWxvZ3VlS2V5KHRoaXMuY2xpZW50KTtcbiAgICBpZiAocmVmcmVzaCkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChjdXJyZW50ICYmIERhdGUubm93KCkgPCBjdXJyZW50LmV4cGlyZXNBdCkgcmV0dXJuIGN1cnJlbnQucHJvbWlzZTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5mZXRjaENhdGFsb2d1ZSgpO1xuICAgIGNvbnN0IGVudHJ5OiBDYXRhbG9ndWVFbnRyeSA9IHsgcHJvbWlzZSwgZXhwaXJlc0F0OiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICBjYXRhbG9ndWVDYWNoZS5zZXQoa2V5LCBlbnRyeSk7XG4gICAgdm9pZCBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0aGlzLmNhY2hlVHRsTXM7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSkgPT09IGVudHJ5KSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDYXRhbG9ndWUoKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdChcIi9hcGkvMi4wL3NlcnZpbmctZW5kcG9pbnRzXCIpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlKSB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5lbmRwb2ludHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHNlcnZpbmctZW5kcG9pbnRzIHJlc3BvbnNlIGlzIG1pc3NpbmcgYW4gZW5kcG9pbnRzIGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludHMgPSBub3JtYWxpemVFbmRwb2ludHMocmVzcG9uc2UuZW5kcG9pbnRzKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwge1xuICAgICAgY291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50KG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBjb25zdCBjYWNoZVR0bE1zID0gdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChhd2FpdCBEYXRhYnJpY2tzQ2xpZW50LmNyZWF0ZShvcHRpb25zLmF1dGgpLCBjYWNoZVR0bE1zKTtcbn1cblxuLyoqIEBpbnRlcm5hbCBDb25zdHJ1Y3QgYSBtb2RlbCBjbGllbnQgYXJvdW5kIGEgdGVzdCBvciBob3N0LW93bmVkIERhdGFicmlja3MgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERhdGFicmlja3NDbGllbnQoXG4gIGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICBjYWNoZVR0bE1zID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TLFxuKTogTW9kZWxDbGllbnQge1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChjbGllbnQsIHZhbGlkYXRlQ2FjaGVUdGwoY2FjaGVUdGxNcykpO1xufVxuXG4vKiogQGludGVybmFsIENyZWF0ZSBhIG1vZGVsIGNsaWVudCB3aXRoIGluamVjdGFibGUgYXV0aCBob3N0IGNhcGFiaWxpdGllcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNb2RlbENsaWVudFdpdGhEZXBlbmRlbmNpZXMoXG4gIG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8TW9kZWxDbGllbnQ+IHtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgYXdhaXQgRGF0YWJyaWNrc0NsaWVudC5jcmVhdGUob3B0aW9ucy5hdXRoLCBkZXBlbmRlbmNpZXMpLFxuICAgIHZhbGlkYXRlQ2FjaGVUdGwob3B0aW9ucy5jYWNoZVR0bE1zKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDYWNoZVR0bCh2YWx1ZSA9IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgY2xpZW50IGNhY2hlVHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXkoY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQpOiBzdHJpbmcge1xuICByZXR1cm4gW2NsaWVudC5ob3N0KCksIGNsaWVudC53b3Jrc3BhY2VJZCgpID8/IFwiXCIsIGNsaWVudC5wcmluY2lwYWwoKV0uam9pbihcIlxcdTAwMDBcIik7XG59XG5cbmZ1bmN0aW9uIGluZmVyUHJvdG9jb2woXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHwgdW5kZWZpbmVkLFxuICBtb2RlbElkOiBzdHJpbmcsXG4pOiBNb2RlbFByb3RvY29sIHtcbiAgaWYgKGVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCIpIHJldHVybiBcImVtYmVkZGluZ3NcIjtcbiAgcmV0dXJuIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKTtcbn1cblxuZnVuY3Rpb24gcm91dGVVcmwoaG9zdDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcsIHByb3RvY29sOiBNb2RlbFByb3RvY29sKTogc3RyaW5nIHtcbiAgaWYgKHByb3RvY29sID09PSBcInJlc3BvbnNlc1wiKSByZXR1cm4gcmVzcG9uc2VzVXBzdHJlYW1VcmwoaG9zdCwgbW9kZWxJZCk7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJjaGF0XCIgJiYgbW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpID09PSBcInJlc3BvbnNlc1wiKSB7XG4gICAgcmV0dXJuIGNoYXRDb21wbGV0aW9uc1VybChob3N0KTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbnNVcmwoaG9zdCwgbW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIGlzVW5tYXRjaGVkRXhwbGljaXQoXG4gIGNhdGFsb2d1ZTogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHJlc29sdmVkOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LmZ1enp5ICE9PSBmYWxzZSAmJlxuICAgIHJlc29sdmVkLm1vZGVsSWQgPT09IGlucHV0LmV4cGxpY2l0ICYmXG4gICAgIWNhdGFsb2d1ZS5zb21lKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSA9PT0gaW5wdXQuZXhwbGljaXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgcmV0dXJuIGVuZHBvaW50cy5tYXAoY2xvbmVFbmRwb2ludCk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAuLi4oZW5kcG9pbnQucHJvZmlsZSA/IHsgcHJvZmlsZTogeyAuLi5lbmRwb2ludC5wcm9maWxlIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuc2VydmljZU5hbWVzID8geyBzZXJ2aWNlTmFtZXM6IHsgLi4uZW5kcG9pbnQuc2VydmljZU5hbWVzIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/IHsgcmVhc29uaW5nRWZmb3J0czogWy4uLmVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHNdIH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnN0YXR1cyA/IHsgc3RhdHVzOiB7IC4uLmVuZHBvaW50LnN0YXR1cyB9IH0gOiB7fSksXG4gIH07XG59XG4iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFDTCxNQUFNLElBQUksVUFBVSxFQUNwQixPQUFPLElBQUksV0FBVyxHQUd2QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQW9FL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNQ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R0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGlvbi1hd2FyZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2xpZW50LlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcnRhYmxlIGVudHJ5IHBvaW50IHVzZWQgYnkgZ2VuZXJhdGVkIFB5dGhvbiBiaW5kaW5ncy4gSXQga2VlcHNcbiAqIGF1dGhlbnRpY2F0aW9uLCBlbmRwb2ludCBkaXNjb3ZlcnksIGNhY2hpbmcsIG5vcm1hbGl6YXRpb24sIHJhbmtpbmcsIHJvdXRlXG4gKiBzZWxlY3Rpb24sIGFuZCBwdWJsaXNoZWQgbWV0YWRhdGEgaW4gTm9kZSB3aGlsZSBleHBvc2luZyBvbmUgc21hbGwgY2xpZW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgY2xpZW50IGFzIGF1dGhDbGllbnQsXG4gIHByb2ZpbGUgYXMgYXV0aFByb2ZpbGUsXG4gIHR5cGUgQXV0aENsaWVudCxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL29iamVjdFwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBNb2RlbE1ldGFkYXRhLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUVuZHBvaW50cyB9IGZyb20gXCIuL19yYW5raW5nLnRzXCI7XG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJlc29sdmVNb2RlbCB9IGZyb20gXCIuL19zZWxlY3Rpb24udHNcIjtcbmltcG9ydCB7IGNoYXRDb21wbGV0aW9uc1VybCwgaW52b2NhdGlvbnNVcmwsIHJlc3BvbnNlc1Vwc3RyZWFtVXJsIH0gZnJvbSBcIi4vaW52b2tlLnRzXCI7XG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhRm9yIH0gZnJvbSBcIi4vbWV0YWRhdGEudHNcIjtcbmltcG9ydCB7IG1vZGVsU2VydmluZ0FwaSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvY2xpZW50XCIpO1xuXG4vKiogRGVmYXVsdCBsaWZldGltZSBmb3Igb25lIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBBdXRoZW50aWNhdGlvbiBvcHRpb25zIGV4cG9zZWQgYnkgdGhlIHBvcnRhYmxlIG1vZGVsIGNsaWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBdXRoT3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIHByb2ZpbGUgbmFtZS4gKi9cbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuLyoqIENvbnN0cnVjdGlvbiBvcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBhbmQgcHJvZmlsZSBzZWxlY3Rpb24gb3B0aW9ucy4gKi9cbiAgYXV0aD86IE1vZGVsQXV0aE9wdGlvbnM7XG4gIC8qKiBJbi1tZW1vcnkgZW5kcG9pbnQgY2F0YWxvZ3VlIFRUTCBpbiBtaWxsaXNlY29uZHMuICovXG4gIGNhY2hlVHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBTZWNyZXQtZnJlZSBydW50aW1lIGlkZW50aXR5IGFuZCBjYWNoZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudFN0YXR1cyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXI7XG59XG5cbi8qKiBTZXJ2aW5nIHByb3RvY29sIHNlbGVjdGVkIGZvciBvbmUgcmVzb2x2ZWQgbW9kZWwuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3RvY29sID0gXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHwgXCJlbWJlZGRpbmdzXCI7XG5cbi8qKiBNb2RlbCBzZWxlY3Rpb24gcGx1cyByb3V0ZSBjb250cm9scy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZUlucHV0IGV4dGVuZHMgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKiogRm9yY2UgYSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZSByZWZyZXNoIGJlZm9yZSBzZWxlY3Rpb24uICovXG4gIHJlZnJlc2g/OiBib29sZWFuO1xuICAvKiogUmVxdWVzdGVkIHVwc3RyZWFtIHByb3RvY29sLiBEZWZhdWx0cyBmcm9tIGVuZHBvaW50IHRhc2sgYW5kIG1vZGVsIHBvbGljeS4gKi9cbiAgcHJvdG9jb2w/OiBNb2RlbFByb3RvY29sO1xuICAvKiogV2hldGhlciBhdXRoZW50aWNhdGlvbiBtYXkgcnVuIGFuIGludGVyYWN0aXZlIGxvZ2luLiAqL1xuICBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBGdWxseSByZXNvbHZlZCBEYXRhYnJpY2tzIHJvdXRlIGZvciBhIG1vZGVsIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50PzogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgcmVhZG9ubHkgc291cmNlOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uW1wic291cmNlXCJdO1xuICByZWFkb25seSBwcm90b2NvbDogTW9kZWxQcm90b2NvbDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBhcGlCYXNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGE7XG59XG5cbi8qKiBTdGFibGUgbW9kZWwgZmFjYWRlIHNoYXJlZCBieSBOb2RlIGFuZCBnZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50IHtcbiAgbGlzdE1vZGVscyhyZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgc2VhcmNoTW9kZWxzKHF1ZXJ5PzogTW9kZWxRdWVyeSwgcmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+O1xuICByb3V0ZShpbnB1dD86IE1vZGVsUm91dGVJbnB1dCk6IFByb21pc2U8TW9kZWxSb3V0ZT47XG4gIG1ldGFkYXRhKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YTtcbiAgc3RhdHVzKCk6IE1vZGVsQ2xpZW50U3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJyaWNrc01vZGVsQ2xpZW50IHtcbiAgcmVhZG9ubHkgYXV0aDogQXV0aENsaWVudDtcbiAgaG9zdCgpOiBzdHJpbmc7XG4gIHByaW5jaXBhbCgpOiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVxdWVzdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5jbGFzcyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQgaW1wbGVtZW50cyBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hlcjogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4gICkge31cblxuICBob3N0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5ob3N0O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5wcmluY2lwYWw7XG4gIH1cblxuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGgud29ya3NwYWNlSWQ7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYCR7dGhpcy5ob3N0KCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpO1xuICAgIGxldCBoZWFkZXJzID0gYXdhaXQgdGhpcy5hdXRoLmhlYWRlcnMoKTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoZXIodXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBoZWFkZXJzID0gYXdhaXQgdGhpcy5hdXRoLmhlYWRlcnMoeyByZWZyZXNoOiB0cnVlIH0pO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoZXIodXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIEFQSSAke3BhdGh9IHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3RleHR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0ID8gSlNPTi5wYXJzZSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2F0YWxvZ3VlRW50cnkge1xuICByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT47XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xufVxuXG5jb25zdCBjYXRhbG9ndWVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDYXRhbG9ndWVFbnRyeT4oKTtcblxuY2xhc3MgRGVmYXVsdE1vZGVsQ2xpZW50IGltcGxlbWVudHMgTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVUdGxNczogbnVtYmVyLFxuICApIHt9XG5cbiAgYXN5bmMgbGlzdE1vZGVscyhyZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiBjbG9uZUVuZHBvaW50cyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hNb2RlbHMocXVlcnk6IE1vZGVsUXVlcnkgPSB7fSwgcmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPiB7XG4gICAgcmV0dXJuIGxvb2t1cE1vZGVscyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSwgcXVlcnkpLm1hcCgoeyBlbmRwb2ludCwgLi4ucmFua2VkIH0pID0+ICh7XG4gICAgICAuLi5yYW5rZWQsXG4gICAgICBlbmRwb2ludDogY2xvbmVFbmRwb2ludChlbmRwb2ludCksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcm91dGUoaW5wdXQ6IE1vZGVsUm91dGVJbnB1dCA9IHt9KTogUHJvbWlzZTxNb2RlbFJvdXRlPiB7XG4gICAgY29uc3QgeyByZWZyZXNoID0gZmFsc2UsIHByb3RvY29sOiByZXF1ZXN0ZWRQcm90b2NvbCwgbG9naW4sIC4uLnNlbGVjdGlvbiB9ID0gaW5wdXQ7XG4gICAgY29uc3QgZWZmZWN0aXZlU2VsZWN0aW9uID1cbiAgICAgIHJlcXVlc3RlZFByb3RvY29sID09PSBcImVtYmVkZGluZ3NcIiAmJiBzZWxlY3Rpb24ubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyAuLi5zZWxlY3Rpb24sIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH1cbiAgICAgICAgOiBzZWxlY3Rpb247XG4gICAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCk7XG4gICAgbGV0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICBpZiAoaXNVbm1hdGNoZWRFeHBsaWNpdChjYXRhbG9ndWUsIGVmZmVjdGl2ZVNlbGVjdGlvbiwgcmVzb2x2ZWQpKSB7XG4gICAgICByZXNvbHZlZCA9IHJlc29sdmVNb2RlbChhd2FpdCB0aGlzLmNhdGFsb2d1ZSh0cnVlKSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSAoYXdhaXQgdGhpcy5jYXRhbG9ndWUoZmFsc2UpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgKTtcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlcXVlc3RlZFByb3RvY29sID8/IGluZmVyUHJvdG9jb2woZW5kcG9pbnQsIHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmNsaWVudC5ob3N0KCk7XG4gICAgY29uc3QgdXJsID0gcm91dGVVcmwoaG9zdCwgcmVzb2x2ZWQubW9kZWxJZCwgcHJvdG9jb2wpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLmNsaWVudC5hdXRoLmhlYWRlcnMoeyBsb2dpbiB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxJZDogcmVzb2x2ZWQubW9kZWxJZCxcbiAgICAgIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpIH0gOiB7fSksXG4gICAgICBzb3VyY2U6IHJlc29sdmVkLnNvdXJjZSxcbiAgICAgIHByb3RvY29sLFxuICAgICAgaG9zdCxcbiAgICAgIGFwaUJhc2U6IG5ldyBVUkwoXCJzZXJ2aW5nLWVuZHBvaW50c1wiLCBgJHtob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vYCkudG9TdHJpbmcoKSxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRhZGF0YTogbW9kZWxNZXRhZGF0YUZvcihlbmRwb2ludCA/PyByZXNvbHZlZC5tb2RlbElkKSxcbiAgICB9O1xuICB9XG5cbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgICByZXR1cm4gbW9kZWxNZXRhZGF0YUZvcihtb2RlbCk7XG4gIH1cblxuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5jbGllbnQuYXV0aC5wcm9maWxlID8geyBwcm9maWxlOiB0aGlzLmNsaWVudC5hdXRoLnByb2ZpbGUgfSA6IHt9KSxcbiAgICAgIGhvc3Q6IHRoaXMuY2xpZW50Lmhvc3QoKSxcbiAgICAgIHByaW5jaXBhbDogdGhpcy5jbGllbnQucHJpbmNpcGFsKCksXG4gICAgICAuLi4odGhpcy5jbGllbnQud29ya3NwYWNlSWQoKSA/IHsgd29ya3NwYWNlSWQ6IHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgfSA6IHt9KSxcbiAgICAgIGNhY2hlVHRsTXM6IHRoaXMuY2FjaGVUdGxNcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYXRhbG9ndWUocmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qga2V5ID0gY2F0YWxvZ3VlS2V5KHRoaXMuY2xpZW50KTtcbiAgICBpZiAocmVmcmVzaCkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChjdXJyZW50ICYmIERhdGUubm93KCkgPCBjdXJyZW50LmV4cGlyZXNBdCkgcmV0dXJuIGN1cnJlbnQucHJvbWlzZTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5mZXRjaENhdGFsb2d1ZSgpO1xuICAgIGNvbnN0IGVudHJ5OiBDYXRhbG9ndWVFbnRyeSA9IHsgcHJvbWlzZSwgZXhwaXJlc0F0OiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICBjYXRhbG9ndWVDYWNoZS5zZXQoa2V5LCBlbnRyeSk7XG4gICAgdm9pZCBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0aGlzLmNhY2hlVHRsTXM7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSkgPT09IGVudHJ5KSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDYXRhbG9ndWUoKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdChcIi9hcGkvMi4wL3NlcnZpbmctZW5kcG9pbnRzXCIpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlKSB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5lbmRwb2ludHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHNlcnZpbmctZW5kcG9pbnRzIHJlc3BvbnNlIGlzIG1pc3NpbmcgYW4gZW5kcG9pbnRzIGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludHMgPSBub3JtYWxpemVFbmRwb2ludHMocmVzcG9uc2UuZW5kcG9pbnRzKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwge1xuICAgICAgY291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50KG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBjb25zdCBjYWNoZVR0bE1zID0gdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChcbiAgICBuZXcgQXV0aGVudGljYXRlZE1vZGVsQ2xpZW50KGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zLmF1dGgpLCBnbG9iYWxUaGlzLmZldGNoKSxcbiAgICBjYWNoZVR0bE1zLFxuICApO1xufVxuXG4vKiogTGlzdCBjb25maWd1cmVkIERhdGFicmlja3MgcHJvZmlsZXMgb3V0c2lkZSB0aGUgbW9kZWwgY2xpZW50IGZhY2FkZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0UHJvZmlsZXMocmVmcmVzaCA9IGZhbHNlKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICByZXR1cm4gYXV0aFByb2ZpbGUubGlzdFByb2ZpbGVzKHsgcmVmcmVzaCB9KTtcbn1cblxuLyoqIEBpbnRlcm5hbCBDb25zdHJ1Y3QgYSBtb2RlbCBjbGllbnQgYXJvdW5kIGEgdGVzdCBvciBob3N0LW93bmVkIERhdGFicmlja3MgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERhdGFicmlja3NDbGllbnQoXG4gIGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICBjYWNoZVR0bE1zID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TLFxuKTogTW9kZWxDbGllbnQge1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChjbGllbnQsIHZhbGlkYXRlQ2FjaGVUdGwoY2FjaGVUdGxNcykpO1xufVxuXG4vKiogQGludGVybmFsIENyZWF0ZSBhIG1vZGVsIGNsaWVudCB3aXRoIGluamVjdGFibGUgYXV0aCBob3N0IGNhcGFiaWxpdGllcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNb2RlbENsaWVudFdpdGhEZXBlbmRlbmNpZXMoXG4gIG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8TW9kZWxDbGllbnQ+IHtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChcbiAgICAgIGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zLmF1dGgsIGRlcGVuZGVuY2llcyksXG4gICAgICBkZXBlbmRlbmNpZXMuZmV0Y2ggPz8gZ2xvYmFsVGhpcy5mZXRjaCxcbiAgICApLFxuICAgIHZhbGlkYXRlQ2FjaGVUdGwob3B0aW9ucy5jYWNoZVR0bE1zKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDYWNoZVR0bCh2YWx1ZSA9IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgY2xpZW50IGNhY2hlVHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXkoY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQpOiBzdHJpbmcge1xuICByZXR1cm4gW2NsaWVudC5ob3N0KCksIGNsaWVudC53b3Jrc3BhY2VJZCgpID8/IFwiXCIsIGNsaWVudC5wcmluY2lwYWwoKV0uam9pbihcIlxcdTAwMDBcIik7XG59XG5cbmZ1bmN0aW9uIGluZmVyUHJvdG9jb2woXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHwgdW5kZWZpbmVkLFxuICBtb2RlbElkOiBzdHJpbmcsXG4pOiBNb2RlbFByb3RvY29sIHtcbiAgaWYgKGVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCIpIHJldHVybiBcImVtYmVkZGluZ3NcIjtcbiAgcmV0dXJuIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKTtcbn1cblxuZnVuY3Rpb24gcm91dGVVcmwoaG9zdDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcsIHByb3RvY29sOiBNb2RlbFByb3RvY29sKTogc3RyaW5nIHtcbiAgaWYgKHByb3RvY29sID09PSBcInJlc3BvbnNlc1wiKSByZXR1cm4gcmVzcG9uc2VzVXBzdHJlYW1VcmwoaG9zdCwgbW9kZWxJZCk7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJjaGF0XCIgJiYgbW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpID09PSBcInJlc3BvbnNlc1wiKSB7XG4gICAgcmV0dXJuIGNoYXRDb21wbGV0aW9uc1VybChob3N0KTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbnNVcmwoaG9zdCwgbW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIGlzVW5tYXRjaGVkRXhwbGljaXQoXG4gIGNhdGFsb2d1ZTogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHJlc29sdmVkOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LmZ1enp5ICE9PSBmYWxzZSAmJlxuICAgIHJlc29sdmVkLm1vZGVsSWQgPT09IGlucHV0LmV4cGxpY2l0ICYmXG4gICAgIWNhdGFsb2d1ZS5zb21lKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSA9PT0gaW5wdXQuZXhwbGljaXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgcmV0dXJuIGVuZHBvaW50cy5tYXAoY2xvbmVFbmRwb2ludCk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAuLi4oZW5kcG9pbnQucHJvZmlsZSA/IHsgcHJvZmlsZTogeyAuLi5lbmRwb2ludC5wcm9maWxlIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuc2VydmljZU5hbWVzID8geyBzZXJ2aWNlTmFtZXM6IHsgLi4uZW5kcG9pbnQuc2VydmljZU5hbWVzIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/IHsgcmVhc29uaW5nRWZmb3J0czogWy4uLmVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHNdIH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnN0YXR1cyA/IHsgc3RhdHVzOiB7IC4uLmVuZHBvaW50LnN0YXR1cyB9IH0gOiB7fSksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Generic reasoning-budget translation for Model Serving and gateway callers.
3
+ *
4
+ * Provider wires disagree on effort labels (`xhigh`, `ultra`, `med`, `none`, …).
5
+ * This module owns one industry-shaped ladder and two parsers:
6
+ *
7
+ * - {@link parseReasoning}: fuzzy-match one label onto {@link ReasoningLevel}
8
+ * - {@link parseReasoningLevels}: unwrap nested / double-encoded error bodies
9
+ * - {@link remapReasoning} / {@link adaptRequestReasoning}: map a request onto a
10
+ * supported ladder and rewrite `reasoning_effort` / `reasoning.effort`
11
+ *
12
+ * Documented model ladders come from the committed HTML snapshot refreshed by
13
+ * `bun run --filter '@dbx-tools/model' metadata` (same cache path as
14
+ * capabilities / rate limits). Error-body parsing is never cached; callers
15
+ * persist learned ladders via the metadata module.
16
+ *
17
+ * Error bodies arrive as complete HTTP JSON whether the request asked for
18
+ * streaming or not (Databricks rejects unsupported efforts with 400 before SSE
19
+ * starts), so {@link parseReasoningLevels} applies to both paths.
20
+ *
21
+ * @module
22
+ */
23
+ /** Industry-generic reasoning budget levels, lowest to highest. */
24
+ export type ReasoningLevel = "low" | "medium" | "high" | "extra-high" | "max";
25
+ /** Runtime values for {@link ReasoningLevel}. */
26
+ export declare const ReasoningLevel: {
27
+ readonly Low: "low";
28
+ readonly Medium: "medium";
29
+ readonly High: "high";
30
+ readonly ExtraHigh: "extra-high";
31
+ readonly Max: "max";
32
+ };
33
+ /** Canonical ladder order used when sorting or ranking remaps. */
34
+ export declare const REASONING_LEVELS: readonly ReasoningLevel[];
35
+ /** Model identity → accepted {@link ReasoningLevel} ladder. */
36
+ export type ReasoningModelCatalogue = Readonly<Record<string, readonly ReasoningLevel[]>>;
37
+ /**
38
+ * Fuzzy-match one reasoning label onto {@link ReasoningLevel}.
39
+ *
40
+ * Returns `undefined` when the input is empty or cannot be mapped confidently.
41
+ */
42
+ export declare function parseReasoning(value: unknown): ReasoningLevel | undefined;
43
+ /**
44
+ * Extract supported reasoning levels from an upstream error body.
45
+ *
46
+ * Accepts raw response text, already-parsed JSON, or Databricks envelopes that
47
+ * nest JSON strings several times. Returns `[]` when no supported-values list
48
+ * can be recovered. Results are not cached.
49
+ */
50
+ export declare function parseReasoningLevels(body: unknown): ReasoningLevel[];
51
+ /**
52
+ * Look up documented levels for a model identity inside a catalogue.
53
+ *
54
+ * Matches exact catalogue keys and suffix identities.
55
+ */
56
+ export declare function documentedReasoningLevels(model: string, catalogue: ReasoningModelCatalogue): ReasoningLevel[] | undefined;
57
+ /**
58
+ * Hard-coded family defaults used when documentation has no entry.
59
+ *
60
+ * Unknown families return the standard low/medium/high ladder.
61
+ */
62
+ export declare function defaultReasoningLevels(model: string): ReasoningLevel[];
63
+ /**
64
+ * Prefer a documentation catalogue when provided, otherwise
65
+ * {@link defaultReasoningLevels}.
66
+ */
67
+ export declare function reasoningLevelsFor(model: string, catalogue?: ReasoningModelCatalogue): ReasoningLevel[];
68
+ /**
69
+ * Map a generic level onto the most common provider wire token.
70
+ *
71
+ * `extra-high` becomes `xhigh` because that is what Databricks / OpenAI error
72
+ * messages advertise today.
73
+ */
74
+ export declare function formatReasoning(level: ReasoningLevel): string;
75
+ /**
76
+ * Remap a requested effort onto the nearest supported {@link ReasoningLevel}.
77
+ *
78
+ * `none` / `off` (and disable aliases) are not a low budget: when the model
79
+ * requires reasoning, they snap to the supported level closest to
80
+ * {@link ReasoningLevel.Medium}. Other requests prefer the highest allowed
81
+ * level at or below the request, otherwise the lowest allowed level.
82
+ *
83
+ * Returns `undefined` when the request cannot be parsed or `levels` is empty.
84
+ */
85
+ export declare function remapReasoning(requested: unknown, levels: readonly ReasoningLevel[]): ReasoningLevel | undefined;
86
+ /** Result of adapting reasoning fields on a gateway request body. */
87
+ export interface AdaptedRequestReasoning {
88
+ /** Body with remapped wire tokens (same reference when unchanged). */
89
+ readonly body: Readonly<Record<string, unknown>>;
90
+ /** True when any reasoning field was rewritten. */
91
+ readonly changed: boolean;
92
+ /** Wire token written when a reasoning field was present and remapped. */
93
+ readonly wireEffort?: string;
94
+ }
95
+ /**
96
+ * Rewrite `reasoning_effort` / `reasoning.effort` onto a supported ladder.
97
+ *
98
+ * Model-agnostic: callers supply the allowed levels (learned, documented, or
99
+ * defaults). Bodies without reasoning fields are returned unchanged.
100
+ */
101
+ export declare function adaptRequestReasoning(body: Readonly<Record<string, unknown>>, levels: readonly ReasoningLevel[]): AdaptedRequestReasoning;
102
+ /** Normalize labels for alias lookup (`Extra High` → `extra-high`). */
103
+ export declare function normalizeReasoningToken(value: string): string;
104
+ /** Deduplicate levels while preserving first-seen order. */
105
+ export declare function uniqueReasoningLevels(levels: readonly ReasoningLevel[]): ReasoningLevel[];