@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
@@ -0,0 +1,444 @@
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
+ import { json } from "@dbx-tools/shared-core";
24
+ import { isRecord } from "@dbx-tools/shared-core/object";
25
+ import * as stringUtils from "@dbx-tools/shared-core/string-utils";
26
+ import Fuse from "fuse.js";
27
+ import { modelFamily, modelSearchQuery } from "./policy.js";
28
+ /** Runtime values for {@link ReasoningLevel}. */
29
+ export const ReasoningLevel = {
30
+ Low: "low",
31
+ Medium: "medium",
32
+ High: "high",
33
+ ExtraHigh: "extra-high",
34
+ Max: "max",
35
+ };
36
+ /** Canonical ladder order used when sorting or ranking remaps. */
37
+ export const REASONING_LEVELS = [
38
+ ReasoningLevel.Low,
39
+ ReasoningLevel.Medium,
40
+ ReasoningLevel.High,
41
+ ReasoningLevel.ExtraHigh,
42
+ ReasoningLevel.Max,
43
+ ];
44
+ const STANDARD = [
45
+ ReasoningLevel.Low,
46
+ ReasoningLevel.Medium,
47
+ ReasoningLevel.High,
48
+ ];
49
+ const WITH_EXTRA_HIGH = [
50
+ ReasoningLevel.Low,
51
+ ReasoningLevel.Medium,
52
+ ReasoningLevel.High,
53
+ ReasoningLevel.ExtraHigh,
54
+ ];
55
+ const WITH_MAX = [
56
+ ReasoningLevel.Low,
57
+ ReasoningLevel.Medium,
58
+ ReasoningLevel.High,
59
+ ReasoningLevel.ExtraHigh,
60
+ ReasoningLevel.Max,
61
+ ];
62
+ const GPT_5_5_PRO = [
63
+ ReasoningLevel.Medium,
64
+ ReasoningLevel.High,
65
+ ReasoningLevel.ExtraHigh,
66
+ ];
67
+ /**
68
+ * Alias table for exact / near-exact labels. Keys are {@link normalizeReasoningToken}
69
+ * results. Provider wires (`xhigh`) and plain English (`ultra`, `med`) both land
70
+ * on the generic ladder.
71
+ */
72
+ const ALIASES = {
73
+ low: ReasoningLevel.Low,
74
+ l: ReasoningLevel.Low,
75
+ none: ReasoningLevel.Low,
76
+ off: ReasoningLevel.Low,
77
+ disable: ReasoningLevel.Low,
78
+ disabled: ReasoningLevel.Low,
79
+ zero: ReasoningLevel.Low,
80
+ minimal: ReasoningLevel.Low,
81
+ min: ReasoningLevel.Low,
82
+ tiny: ReasoningLevel.Low,
83
+ light: ReasoningLevel.Low,
84
+ medium: ReasoningLevel.Medium,
85
+ med: ReasoningLevel.Medium,
86
+ mid: ReasoningLevel.Medium,
87
+ moderate: ReasoningLevel.Medium,
88
+ default: ReasoningLevel.Medium,
89
+ normal: ReasoningLevel.Medium,
90
+ balanced: ReasoningLevel.Medium,
91
+ high: ReasoningLevel.High,
92
+ hi: ReasoningLevel.High,
93
+ heavy: ReasoningLevel.High,
94
+ "extra-high": ReasoningLevel.ExtraHigh,
95
+ extrahigh: ReasoningLevel.ExtraHigh,
96
+ xhigh: ReasoningLevel.ExtraHigh,
97
+ xh: ReasoningLevel.ExtraHigh,
98
+ ultra: ReasoningLevel.ExtraHigh,
99
+ "ultra-high": ReasoningLevel.ExtraHigh,
100
+ ultrahigh: ReasoningLevel.ExtraHigh,
101
+ max: ReasoningLevel.Max,
102
+ maximum: ReasoningLevel.Max,
103
+ highest: ReasoningLevel.Max,
104
+ full: ReasoningLevel.Max,
105
+ };
106
+ const SUPPORTED_VALUES_PATTERN = /supported\s+values?\s+are\s*:?\s*(.+?)(?:\.?\s*(?:param|type|code)\b|$)/is;
107
+ const TOKEN_PATTERN = /'([^']+)'|"([^"]+)"|`([^`]+)`|\b([a-z][a-z0-9_-]*)\b/gi;
108
+ const MAX_JSON_UNWRAP_DEPTH = 8;
109
+ const aliasDocuments = Object.entries(ALIASES).map(([token, level]) => ({ token, level }));
110
+ const aliasFuse = new Fuse(aliasDocuments, {
111
+ keys: ["token"],
112
+ includeScore: true,
113
+ threshold: 0.35,
114
+ ignoreLocation: true,
115
+ });
116
+ /**
117
+ * Fuzzy-match one reasoning label onto {@link ReasoningLevel}.
118
+ *
119
+ * Returns `undefined` when the input is empty or cannot be mapped confidently.
120
+ */
121
+ export function parseReasoning(value) {
122
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
123
+ return undefined;
124
+ }
125
+ const normalized = normalizeReasoningToken(String(value));
126
+ if (!normalized)
127
+ return undefined;
128
+ const exact = ALIASES[normalized] ?? ALIASES[normalized.replace(/-/g, "")];
129
+ if (exact)
130
+ return exact;
131
+ const [match] = aliasFuse.search(normalized);
132
+ if (!match || (match.score ?? 1) > 0.35)
133
+ return undefined;
134
+ return match.item.level;
135
+ }
136
+ /**
137
+ * Extract supported reasoning levels from an upstream error body.
138
+ *
139
+ * Accepts raw response text, already-parsed JSON, or Databricks envelopes that
140
+ * nest JSON strings several times. Returns `[]` when no supported-values list
141
+ * can be recovered. Results are not cached.
142
+ */
143
+ export function parseReasoningLevels(body) {
144
+ const levels = [];
145
+ const seen = new Set();
146
+ for (const text of collectTextLeaves(body)) {
147
+ for (const token of extractSupportedTokens(text)) {
148
+ const level = parseReasoning(token);
149
+ if (!level || seen.has(level))
150
+ continue;
151
+ seen.add(level);
152
+ levels.push(level);
153
+ }
154
+ }
155
+ return levels;
156
+ }
157
+ /**
158
+ * Look up documented levels for a model identity inside a catalogue.
159
+ *
160
+ * Matches exact catalogue keys and suffix identities.
161
+ */
162
+ export function documentedReasoningLevels(model, catalogue) {
163
+ const keys = catalogueKeysFor(model);
164
+ for (const key of keys) {
165
+ const levels = catalogue[key];
166
+ if (levels?.length)
167
+ return [...levels];
168
+ }
169
+ for (const [key, levels] of Object.entries(catalogue)) {
170
+ if (keys.some((candidate) => key.endsWith(candidate) || candidate.endsWith(key))) {
171
+ return [...levels];
172
+ }
173
+ }
174
+ return undefined;
175
+ }
176
+ /**
177
+ * Hard-coded family defaults used when documentation has no entry.
178
+ *
179
+ * Unknown families return the standard low/medium/high ladder.
180
+ */
181
+ export function defaultReasoningLevels(model) {
182
+ const family = modelFamily(model)?.toLowerCase();
183
+ const normalized = model.toLowerCase();
184
+ if (family === "grok" || normalized.includes("grok"))
185
+ return [...WITH_EXTRA_HIGH];
186
+ if (family === "gemini" || normalized.includes("gemini"))
187
+ return [...STANDARD];
188
+ if (family === "claude" || normalized.includes("claude"))
189
+ return [...WITH_MAX];
190
+ if (family === "glm" || normalized.includes("glm")) {
191
+ return [ReasoningLevel.High, ReasoningLevel.Max];
192
+ }
193
+ if (family === "deepseek" ||
194
+ normalized.includes("deepseek") ||
195
+ family === "kimi" ||
196
+ normalized.includes("kimi")) {
197
+ return [ReasoningLevel.Low, ReasoningLevel.High, ReasoningLevel.Max];
198
+ }
199
+ if (family === "inkling" || normalized.includes("inkling"))
200
+ return [...WITH_MAX];
201
+ if (family === "gpt" || normalized.includes("gpt") || normalized.includes("codex")) {
202
+ if (normalized.includes("oss"))
203
+ return [...STANDARD];
204
+ if (/(?:^|[-_.])5[-_.]?5(?:[-_.]|$)/.test(normalized) && normalized.includes("pro")) {
205
+ return [...GPT_5_5_PRO];
206
+ }
207
+ if (/(?:^|[-_.])5[-_.]?6(?:[-_.]|$)/.test(normalized) ||
208
+ /(?:^|[-_.])6(?:[-_.]|$)/.test(normalized)) {
209
+ return [...WITH_MAX];
210
+ }
211
+ return [...STANDARD];
212
+ }
213
+ if (/(?:^|[-_./])o(?:1|3|4)(?:[-_./]|$)/.test(model) || normalized.includes("codex")) {
214
+ return [...STANDARD];
215
+ }
216
+ return [...STANDARD];
217
+ }
218
+ /**
219
+ * Prefer a documentation catalogue when provided, otherwise
220
+ * {@link defaultReasoningLevels}.
221
+ */
222
+ export function reasoningLevelsFor(model, catalogue) {
223
+ if (catalogue) {
224
+ const documented = documentedReasoningLevels(model, catalogue);
225
+ if (documented?.length)
226
+ return documented;
227
+ }
228
+ return defaultReasoningLevels(model);
229
+ }
230
+ /**
231
+ * Map a generic level onto the most common provider wire token.
232
+ *
233
+ * `extra-high` becomes `xhigh` because that is what Databricks / OpenAI error
234
+ * messages advertise today.
235
+ */
236
+ export function formatReasoning(level) {
237
+ return level === ReasoningLevel.ExtraHigh ? "xhigh" : level;
238
+ }
239
+ /** Wire tokens that mean "do not reason" rather than "use a low budget". */
240
+ const DISABLED_REASONING_TOKENS = new Set(["none", "off", "disable", "disabled"]);
241
+ /**
242
+ * Remap a requested effort onto the nearest supported {@link ReasoningLevel}.
243
+ *
244
+ * `none` / `off` (and disable aliases) are not a low budget: when the model
245
+ * requires reasoning, they snap to the supported level closest to
246
+ * {@link ReasoningLevel.Medium}. Other requests prefer the highest allowed
247
+ * level at or below the request, otherwise the lowest allowed level.
248
+ *
249
+ * Returns `undefined` when the request cannot be parsed or `levels` is empty.
250
+ */
251
+ export function remapReasoning(requested, levels) {
252
+ if (levels.length === 0)
253
+ return undefined;
254
+ if (isDisabledReasoningToken(requested)) {
255
+ return nearestReasoning(ReasoningLevel.Medium, levels);
256
+ }
257
+ const parsed = parseReasoning(requested);
258
+ if (!parsed)
259
+ return undefined;
260
+ if (levels.includes(parsed))
261
+ return parsed;
262
+ const requestedIndex = REASONING_LEVELS.indexOf(parsed);
263
+ let best;
264
+ let bestIndex = Number.NEGATIVE_INFINITY;
265
+ for (const level of levels) {
266
+ const index = REASONING_LEVELS.indexOf(level);
267
+ if (index <= requestedIndex && index > bestIndex) {
268
+ best = level;
269
+ bestIndex = index;
270
+ }
271
+ }
272
+ return best ?? levels[0];
273
+ }
274
+ function isDisabledReasoningToken(value) {
275
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
276
+ return false;
277
+ }
278
+ return DISABLED_REASONING_TOKENS.has(normalizeReasoningToken(String(value)));
279
+ }
280
+ /** Closest supported level to `target`; ties prefer the higher budget. */
281
+ function nearestReasoning(target, levels) {
282
+ if (levels.length === 0)
283
+ return undefined;
284
+ if (levels.includes(target))
285
+ return target;
286
+ const targetIndex = REASONING_LEVELS.indexOf(target);
287
+ let best;
288
+ let bestDistance = Number.POSITIVE_INFINITY;
289
+ for (const level of levels) {
290
+ const distance = Math.abs(REASONING_LEVELS.indexOf(level) - targetIndex);
291
+ if (distance < bestDistance ||
292
+ (distance === bestDistance &&
293
+ REASONING_LEVELS.indexOf(level) > REASONING_LEVELS.indexOf(best ?? level))) {
294
+ best = level;
295
+ bestDistance = distance;
296
+ }
297
+ }
298
+ return best;
299
+ }
300
+ /**
301
+ * Rewrite `reasoning_effort` / `reasoning.effort` onto a supported ladder.
302
+ *
303
+ * Model-agnostic: callers supply the allowed levels (learned, documented, or
304
+ * defaults). Bodies without reasoning fields are returned unchanged.
305
+ */
306
+ export function adaptRequestReasoning(body, levels) {
307
+ if (levels.length === 0)
308
+ return { body, changed: false };
309
+ const topLevel = body.reasoning_effort;
310
+ const reasoning = isRecord(body.reasoning) ? body.reasoning : undefined;
311
+ const nested = reasoning?.effort;
312
+ const requested = topLevel ?? nested;
313
+ if (requested === undefined)
314
+ return { body, changed: false };
315
+ const remapped = remapReasoning(requested, levels);
316
+ if (!remapped)
317
+ return { body, changed: false };
318
+ const wire = formatReasoning(remapped);
319
+ let changed = false;
320
+ let next = { ...body };
321
+ if (typeof topLevel === "string" || typeof topLevel === "number") {
322
+ if (String(topLevel) !== wire) {
323
+ next = { ...next, reasoning_effort: wire };
324
+ changed = true;
325
+ }
326
+ }
327
+ if (reasoning && (typeof nested === "string" || typeof nested === "number")) {
328
+ if (String(nested) !== wire) {
329
+ next = { ...next, reasoning: { ...reasoning, effort: wire } };
330
+ changed = true;
331
+ }
332
+ }
333
+ return changed ? { body: next, changed: true, wireEffort: wire } : { body, changed: false, wireEffort: wire };
334
+ }
335
+ /** Normalize labels for alias lookup (`Extra High` → `extra-high`). */
336
+ export function normalizeReasoningToken(value) {
337
+ return (stringUtils
338
+ .trimToNull(value)
339
+ ?.toLowerCase()
340
+ .replace(/[_\s]+/g, "-")
341
+ .replace(/[^a-z0-9-]/g, "")
342
+ .replace(/-+/g, "-")
343
+ .replace(/^-|-$/g, "") ?? "");
344
+ }
345
+ /** Deduplicate levels while preserving first-seen order. */
346
+ export function uniqueReasoningLevels(levels) {
347
+ const seen = new Set();
348
+ const ordered = [];
349
+ for (const level of levels) {
350
+ if (seen.has(level))
351
+ continue;
352
+ seen.add(level);
353
+ ordered.push(level);
354
+ }
355
+ return ordered;
356
+ }
357
+ function extractSupportedTokens(text) {
358
+ const match = SUPPORTED_VALUES_PATTERN.exec(text);
359
+ if (!match?.[1])
360
+ return [];
361
+ return tokensFromFragment(match[1]);
362
+ }
363
+ function catalogueKeysFor(model) {
364
+ const keys = new Set();
365
+ const direct = modelCatalogueKey(model);
366
+ if (direct)
367
+ keys.add(direct);
368
+ const stripped = model
369
+ .toLowerCase()
370
+ .replace(/^databricks\//, "")
371
+ .replace(/^system\.ai\./, "")
372
+ .replace(/^databricks-/, "");
373
+ const strippedKey = modelCatalogueKey(stripped);
374
+ if (strippedKey)
375
+ keys.add(strippedKey);
376
+ const withPrefix = modelCatalogueKey(`databricks-${stripped}`);
377
+ if (withPrefix)
378
+ keys.add(withPrefix);
379
+ return [...keys];
380
+ }
381
+ function modelCatalogueKey(name) {
382
+ const trimmed = stringUtils.trimToNull(name);
383
+ if (!trimmed)
384
+ return undefined;
385
+ return (modelSearchQuery(trimmed)?.replaceAll(" ", "-") ??
386
+ trimmed
387
+ .toLowerCase()
388
+ .replace(/^databricks-/, "")
389
+ .replace(/[^a-z0-9._-]+/g, "-"));
390
+ }
391
+ function tokensFromFragment(fragment) {
392
+ const tokens = [];
393
+ for (const part of fragment.matchAll(TOKEN_PATTERN)) {
394
+ const token = part[1] ?? part[2] ?? part[3] ?? part[4];
395
+ if (!token || token === "and" || token === "or" || token === "of")
396
+ continue;
397
+ tokens.push(token.replace(/^["'`]+|["'`]+$/g, ""));
398
+ }
399
+ return tokens;
400
+ }
401
+ /**
402
+ * Walk a value tree, unwrapping nested JSON strings, and collect text leaves
403
+ * that may contain a supported-values sentence.
404
+ */
405
+ function collectTextLeaves(value, depth = 0) {
406
+ if (value == null || depth > MAX_JSON_UNWRAP_DEPTH)
407
+ return [];
408
+ if (typeof value === "string") {
409
+ const trimmed = value.trim();
410
+ if (!trimmed)
411
+ return [];
412
+ const parsed = tryUnwrapJson(trimmed);
413
+ if (parsed !== undefined && parsed !== trimmed) {
414
+ return collectTextLeaves(parsed, depth + 1);
415
+ }
416
+ return [trimmed];
417
+ }
418
+ if (typeof value === "number" || typeof value === "boolean")
419
+ return [String(value)];
420
+ if (Array.isArray(value)) {
421
+ return value.flatMap((entry) => collectTextLeaves(entry, depth + 1));
422
+ }
423
+ if (!isRecord(value))
424
+ return [];
425
+ return Object.values(value).flatMap((entry) => collectTextLeaves(entry, depth + 1));
426
+ }
427
+ function tryUnwrapJson(text) {
428
+ const asRecord = json.parseRecord(text);
429
+ if (asRecord)
430
+ return asRecord;
431
+ const parsed = json.parse(text);
432
+ if (parsed !== undefined)
433
+ return parsed;
434
+ if (text.includes('\\"') || text.includes("\\n")) {
435
+ const unescaped = text.replace(/\\"/g, '"').replace(/\\n/g, "\n").replace(/\\\\/g, "\\");
436
+ if (unescaped !== text) {
437
+ const nested = json.parse(unescaped);
438
+ if (nested !== undefined)
439
+ return nested;
440
+ }
441
+ }
442
+ return undefined;
443
+ }
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIs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QUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGpzb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoXG4gIChbdG9rZW4sIGxldmVsXSkgPT4gKHsgdG9rZW4sIGxldmVsIH0pLFxuKTtcblxuY29uc3QgYWxpYXNGdXNlID0gbmV3IEZ1c2UoYWxpYXNEb2N1bWVudHMsIHtcbiAga2V5czogW1widG9rZW5cIl0sXG4gIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgdGhyZXNob2xkOiAwLjM1LFxuICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIEZ1enp5LW1hdGNoIG9uZSByZWFzb25pbmcgbGFiZWwgb250byB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkgb3IgY2Fubm90IGJlIG1hcHBlZCBjb25maWRlbnRseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nKHZhbHVlOiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSk7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXhhY3QgPSBBTElBU0VTW25vcm1hbGl6ZWRdID8/IEFMSUFTRVNbbm9ybWFsaXplZC5yZXBsYWNlKC8tL2csIFwiXCIpXTtcbiAgaWYgKGV4YWN0KSByZXR1cm4gZXhhY3Q7XG4gIGNvbnN0IFttYXRjaF0gPSBhbGlhc0Z1c2Uuc2VhcmNoKG5vcm1hbGl6ZWQpO1xuICBpZiAoIW1hdGNoIHx8IChtYXRjaC5zY29yZSA/PyAxKSA+IDAuMzUpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtYXRjaC5pdGVtLmxldmVsO1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgc3VwcG9ydGVkIHJlYXNvbmluZyBsZXZlbHMgZnJvbSBhbiB1cHN0cmVhbSBlcnJvciBib2R5LlxuICpcbiAqIEFjY2VwdHMgcmF3IHJlc3BvbnNlIHRleHQsIGFscmVhZHktcGFyc2VkIEpTT04sIG9yIERhdGFicmlja3MgZW52ZWxvcGVzIHRoYXRcbiAqIG5lc3QgSlNPTiBzdHJpbmdzIHNldmVyYWwgdGltZXMuIFJldHVybnMgYFtdYCB3aGVuIG5vIHN1cHBvcnRlZC12YWx1ZXMgbGlzdFxuICogY2FuIGJlIHJlY292ZXJlZC4gUmVzdWx0cyBhcmUgbm90IGNhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nTGV2ZWxzKGJvZHk6IHVua25vd24pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgbGV2ZWxzOiBSZWFzb25pbmdMZXZlbFtdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFJlYXNvbmluZ0xldmVsPigpO1xuICBmb3IgKGNvbnN0IHRleHQgb2YgY29sbGVjdFRleHRMZWF2ZXMoYm9keSkpIHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGV4dHJhY3RTdXBwb3J0ZWRUb2tlbnModGV4dCkpIHtcbiAgICAgIGNvbnN0IGxldmVsID0gcGFyc2VSZWFzb25pbmcodG9rZW4pO1xuICAgICAgaWYgKCFsZXZlbCB8fCBzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobGV2ZWwpO1xuICAgICAgbGV2ZWxzLnB1c2gobGV2ZWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGV2ZWxzO1xufVxuXG4vKipcbiAqIExvb2sgdXAgZG9jdW1lbnRlZCBsZXZlbHMgZm9yIGEgbW9kZWwgaWRlbnRpdHkgaW5zaWRlIGEgY2F0YWxvZ3VlLlxuICpcbiAqIE1hdGNoZXMgZXhhY3QgY2F0YWxvZ3VlIGtleXMgYW5kIHN1ZmZpeCBpZGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gY2F0YWxvZ3VlS2V5c0Zvcihtb2RlbCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBsZXZlbHMgPSBjYXRhbG9ndWVba2V5XTtcbiAgICBpZiAobGV2ZWxzPy5sZW5ndGgpIHJldHVybiBbLi4ubGV2ZWxzXTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIGxldmVsc10gb2YgT2JqZWN0LmVudHJpZXMoY2F0YWxvZ3VlKSkge1xuICAgIGlmIChrZXlzLnNvbWUoKGNhbmRpZGF0ZSkgPT4ga2V5LmVuZHNXaXRoKGNhbmRpZGF0ZSkgfHwgY2FuZGlkYXRlLmVuZHNXaXRoKGtleSkpKSB7XG4gICAgICByZXR1cm4gWy4uLmxldmVsc107XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGFyZC1jb2RlZCBmYW1pbHkgZGVmYXVsdHMgdXNlZCB3aGVuIGRvY3VtZW50YXRpb24gaGFzIG5vIGVudHJ5LlxuICpcbiAqIFVua25vd24gZmFtaWxpZXMgcmV0dXJuIHRoZSBzdGFuZGFyZCBsb3cvbWVkaXVtL2hpZ2ggbGFkZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFJlYXNvbmluZ0xldmVscyhtb2RlbDogc3RyaW5nKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KG1vZGVsKT8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1vZGVsLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmYW1pbHkgPT09IFwiZ3Jva1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncm9rXCIpKSByZXR1cm4gWy4uLldJVEhfRVhUUkFfSElHSF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2VtaW5pXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdlbWluaVwiKSkgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIGlmIChmYW1pbHkgPT09IFwiY2xhdWRlXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNsYXVkZVwiKSkgcmV0dXJuIFsuLi5XSVRIX01BWF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2xtXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdsbVwiKSkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuSGlnaCwgUmVhc29uaW5nTGV2ZWwuTWF4XTtcbiAgfVxuICBpZiAoXG4gICAgZmFtaWx5ID09PSBcImRlZXBzZWVrXCIgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKFwiZGVlcHNlZWtcIikgfHxcbiAgICBmYW1pbHkgPT09IFwia2ltaVwiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImtpbWlcIilcbiAgKSB7XG4gICAgcmV0dXJuIFtSZWFzb25pbmdMZXZlbC5Mb3csIFJlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKGZhbWlseSA9PT0gXCJpbmtsaW5nXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImlua2xpbmdcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdwdFwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncHRcIikgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNvZGV4XCIpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJvc3NcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICAgIGlmICgvKD86XnxbLV8uXSk1Wy1fLl0/NSg/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpICYmIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJwcm9cIikpIHtcbiAgICAgIHJldHVybiBbLi4uR1BUXzVfNV9QUk9dO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAvKD86XnxbLV8uXSk1Wy1fLl0/Nig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpIHx8XG4gICAgICAvKD86XnxbLV8uXSk2KD86Wy1fLl18JCkvLnRlc3Qobm9ybWFsaXplZClcbiAgICApIHtcbiAgICAgIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICBpZiAoLyg/Ol58Wy1fLi9dKW8oPzoxfDN8NCkoPzpbLV8uL118JCkvLnRlc3QobW9kZWwpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICB9XG4gIHJldHVybiBbLi4uU1RBTkRBUkRdO1xufVxuXG4vKipcbiAqIFByZWZlciBhIGRvY3VtZW50YXRpb24gY2F0YWxvZ3VlIHdoZW4gcHJvdmlkZWQsIG90aGVyd2lzZVxuICoge0BsaW5rIGRlZmF1bHRSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTGV2ZWxzRm9yKFxuICBtb2RlbDogc3RyaW5nLFxuICBjYXRhbG9ndWU/OiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10ge1xuICBpZiAoY2F0YWxvZ3VlKSB7XG4gICAgY29uc3QgZG9jdW1lbnRlZCA9IGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMobW9kZWwsIGNhdGFsb2d1ZSk7XG4gICAgaWYgKGRvY3VtZW50ZWQ/Lmxlbmd0aCkgcmV0dXJuIGRvY3VtZW50ZWQ7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWwpO1xufVxuXG4vKipcbiAqIE1hcCBhIGdlbmVyaWMgbGV2ZWwgb250byB0aGUgbW9zdCBjb21tb24gcHJvdmlkZXIgd2lyZSB0b2tlbi5cbiAqXG4gKiBgZXh0cmEtaGlnaGAgYmVjb21lcyBgeGhpZ2hgIGJlY2F1c2UgdGhhdCBpcyB3aGF0IERhdGFicmlja3MgLyBPcGVuQUkgZXJyb3JcbiAqIG1lc3NhZ2VzIGFkdmVydGlzZSB0b2RheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlYXNvbmluZyhsZXZlbDogUmVhc29uaW5nTGV2ZWwpOiBzdHJpbmcge1xuICByZXR1cm4gbGV2ZWwgPT09IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCA/IFwieGhpZ2hcIiA6IGxldmVsO1xufVxuXG4vKiogV2lyZSB0b2tlbnMgdGhhdCBtZWFuIFwiZG8gbm90IHJlYXNvblwiIHJhdGhlciB0aGFuIFwidXNlIGEgbG93IGJ1ZGdldFwiLiAqL1xuY29uc3QgRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUyA9IG5ldyBTZXQoW1wibm9uZVwiLCBcIm9mZlwiLCBcImRpc2FibGVcIiwgXCJkaXNhYmxlZFwiXSk7XG5cbi8qKlxuICogUmVtYXAgYSByZXF1ZXN0ZWQgZWZmb3J0IG9udG8gdGhlIG5lYXJlc3Qgc3VwcG9ydGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0uXG4gKlxuICogYG5vbmVgIC8gYG9mZmAgKGFuZCBkaXNhYmxlIGFsaWFzZXMpIGFyZSBub3QgYSBsb3cgYnVkZ2V0OiB3aGVuIHRoZSBtb2RlbFxuICogcmVxdWlyZXMgcmVhc29uaW5nLCB0aGV5IHNuYXAgdG8gdGhlIHN1cHBvcnRlZCBsZXZlbCBjbG9zZXN0IHRvXG4gKiB7QGxpbmsgUmVhc29uaW5nTGV2ZWwuTWVkaXVtfS4gT3RoZXIgcmVxdWVzdHMgcHJlZmVyIHRoZSBoaWdoZXN0IGFsbG93ZWRcbiAqIGxldmVsIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0LCBvdGhlcndpc2UgdGhlIGxvd2VzdCBhbGxvd2VkIGxldmVsLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgcGFyc2VkIG9yIGBsZXZlbHNgIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBSZWFzb25pbmcoXG4gIHJlcXVlc3RlZDogdW5rbm93bixcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzRGlzYWJsZWRSZWFzb25pbmdUb2tlbihyZXF1ZXN0ZWQpKSB7XG4gICAgcmV0dXJuIG5lYXJlc3RSZWFzb25pbmcoUmVhc29uaW5nTGV2ZWwuTWVkaXVtLCBsZXZlbHMpO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUmVhc29uaW5nKHJlcXVlc3RlZCk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobGV2ZWxzLmluY2x1ZGVzKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG4gIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKHBhcnNlZCk7XG4gIGxldCBiZXN0OiBSZWFzb25pbmdMZXZlbCB8IHVuZGVmaW5lZDtcbiAgbGV0IGJlc3RJbmRleCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsZXZlbHMpIHtcbiAgICBjb25zdCBpbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihsZXZlbCk7XG4gICAgaWYgKGluZGV4IDw9IHJlcXVlc3RlZEluZGV4ICYmIGluZGV4ID4gYmVzdEluZGV4KSB7XG4gICAgICBiZXN0ID0gbGV2ZWw7XG4gICAgICBiZXN0SW5kZXggPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3QgPz8gbGV2ZWxzWzBdO1xufVxuXG5mdW5jdGlvbiBpc0Rpc2FibGVkUmVhc29uaW5nVG9rZW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUy5oYXMobm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSkpO1xufVxuXG4vKiogQ2xvc2VzdCBzdXBwb3J0ZWQgbGV2ZWwgdG8gYHRhcmdldGA7IHRpZXMgcHJlZmVyIHRoZSBoaWdoZXIgYnVkZ2V0LiAqL1xuZnVuY3Rpb24gbmVhcmVzdFJlYXNvbmluZyhcbiAgdGFyZ2V0OiBSZWFzb25pbmdMZXZlbCxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICBjb25zdCB0YXJnZXRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZih0YXJnZXQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpIC0gdGFyZ2V0SW5kZXgpO1xuICAgIGlmIChcbiAgICAgIGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlIHx8XG4gICAgICAoZGlzdGFuY2UgPT09IGJlc3REaXN0YW5jZSAmJlxuICAgICAgICBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpID4gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGJlc3QgPz8gbGV2ZWwpKVxuICAgICkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKiogUmVzdWx0IG9mIGFkYXB0aW5nIHJlYXNvbmluZyBmaWVsZHMgb24gYSBnYXRld2F5IHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcge1xuICAvKiogQm9keSB3aXRoIHJlbWFwcGVkIHdpcmUgdG9rZW5zIChzYW1lIHJlZmVyZW5jZSB3aGVuIHVuY2hhbmdlZCkuICovXG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFRydWUgd2hlbiBhbnkgcmVhc29uaW5nIGZpZWxkIHdhcyByZXdyaXR0ZW4uICovXG4gIHJlYWRvbmx5IGNoYW5nZWQ6IGJvb2xlYW47XG4gIC8qKiBXaXJlIHRva2VuIHdyaXR0ZW4gd2hlbiBhIHJlYXNvbmluZyBmaWVsZCB3YXMgcHJlc2VudCBhbmQgcmVtYXBwZWQuICovXG4gIHJlYWRvbmx5IHdpcmVFZmZvcnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGAgb250byBhIHN1cHBvcnRlZCBsYWRkZXIuXG4gKlxuICogTW9kZWwtYWdub3N0aWM6IGNhbGxlcnMgc3VwcGx5IHRoZSBhbGxvd2VkIGxldmVscyAobGVhcm5lZCwgZG9jdW1lbnRlZCwgb3JcbiAqIGRlZmF1bHRzKS4gQm9kaWVzIHdpdGhvdXQgcmVhc29uaW5nIGZpZWxkcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRSZXF1ZXN0UmVhc29uaW5nKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgdG9wTGV2ZWwgPSBib2R5LnJlYXNvbmluZ19lZmZvcnQ7XG4gIGNvbnN0IHJlYXNvbmluZyA9IGlzUmVjb3JkKGJvZHkucmVhc29uaW5nKSA/IGJvZHkucmVhc29uaW5nIDogdW5kZWZpbmVkO1xuICBjb25zdCBuZXN0ZWQgPSByZWFzb25pbmc/LmVmZm9ydDtcbiAgY29uc3QgcmVxdWVzdGVkID0gdG9wTGV2ZWwgPz8gbmVzdGVkO1xuICBpZiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgcmVtYXBwZWQgPSByZW1hcFJlYXNvbmluZyhyZXF1ZXN0ZWQsIGxldmVscyk7XG4gIGlmICghcmVtYXBwZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG4gIGNvbnN0IHdpcmUgPSBmb3JtYXRSZWFzb25pbmcocmVtYXBwZWQpO1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuXG4gIGlmICh0eXBlb2YgdG9wTGV2ZWwgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHRvcExldmVsID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKFN0cmluZyh0b3BMZXZlbCkgIT09IHdpcmUpIHtcbiAgICAgIG5leHQgPSB7IC4uLm5leHQsIHJlYXNvbmluZ19lZmZvcnQ6IHdpcmUgfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAocmVhc29uaW5nICYmICh0eXBlb2YgbmVzdGVkID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBuZXN0ZWQgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgaWYgKFN0cmluZyhuZXN0ZWQpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmc6IHsgLi4ucmVhc29uaW5nLCBlZmZvcnQ6IHdpcmUgfSB9O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IGJvZHk6IG5leHQsIGNoYW5nZWQ6IHRydWUsIHdpcmVFZmZvcnQ6IHdpcmUgfSA6IHsgYm9keSwgY2hhbmdlZDogZmFsc2UsIHdpcmVFZmZvcnQ6IHdpcmUgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBsYWJlbHMgZm9yIGFsaWFzIGxvb2t1cCAoYEV4dHJhIEhpZ2hgIOKGkiBgZXh0cmEtaGlnaGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHN0cmluZ1V0aWxzXG4gICAgICAudHJpbVRvTnVsbCh2YWx1ZSlcbiAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpID8/IFwiXCJcbiAgKTtcbn1cblxuLyoqIERlZHVwbGljYXRlIGxldmVscyB3aGlsZSBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgY29uc3Qgb3JkZXJlZDogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGlmIChzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICBvcmRlcmVkLnB1c2gobGV2ZWwpO1xuICB9XG4gIHJldHVybiBvcmRlcmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2ggPSBTVVBQT1JURURfVkFMVUVTX1BBVFRFUk4uZXhlYyh0ZXh0KTtcbiAgaWYgKCFtYXRjaD8uWzFdKSByZXR1cm4gW107XG4gIHJldHVybiB0b2tlbnNGcm9tRnJhZ21lbnQobWF0Y2hbMV0pO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXlzRm9yKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGlyZWN0ID0gbW9kZWxDYXRhbG9ndWVLZXkobW9kZWwpO1xuICBpZiAoZGlyZWN0KSBrZXlzLmFkZChkaXJlY3QpO1xuICBjb25zdCBzdHJpcHBlZCA9IG1vZGVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9ec3lzdGVtXFwuYWlcXC4vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKTtcbiAgY29uc3Qgc3RyaXBwZWRLZXkgPSBtb2RlbENhdGFsb2d1ZUtleShzdHJpcHBlZCk7XG4gIGlmIChzdHJpcHBlZEtleSkga2V5cy5hZGQoc3RyaXBwZWRLZXkpO1xuICBjb25zdCB3aXRoUHJlZml4ID0gbW9kZWxDYXRhbG9ndWVLZXkoYGRhdGFicmlja3MtJHtzdHJpcHBlZH1gKTtcbiAgaWYgKHdpdGhQcmVmaXgpIGtleXMuYWRkKHdpdGhQcmVmaXgpO1xuICByZXR1cm4gWy4uLmtleXNdO1xufVxuXG5mdW5jdGlvbiBtb2RlbENhdGFsb2d1ZUtleShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChuYW1lKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIG1vZGVsU2VhcmNoUXVlcnkodHJpbW1lZCk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKSA/P1xuICAgIHRyaW1tZWRcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0rL2csIFwiLVwiKVxuICApO1xufVxuXG5mdW5jdGlvbiB0b2tlbnNGcm9tRnJhZ21lbnQoZnJhZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgZnJhZ21lbnQubWF0Y2hBbGwoVE9LRU5fUEFUVEVSTikpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhcnRbMV0gPz8gcGFydFsyXSA/PyBwYXJ0WzNdID8/IHBhcnRbNF07XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gXCJhbmRcIiB8fCB0b2tlbiA9PT0gXCJvclwiIHx8IHRva2VuID09PSBcIm9mXCIpIGNvbnRpbnVlO1xuICAgIHRva2Vucy5wdXNoKHRva2VuLnJlcGxhY2UoL15bXCInYF0rfFtcIidgXSskL2csIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKipcbiAqIFdhbGsgYSB2YWx1ZSB0cmVlLCB1bndyYXBwaW5nIG5lc3RlZCBKU09OIHN0cmluZ3MsIGFuZCBjb2xsZWN0IHRleHQgbGVhdmVzXG4gKiB0aGF0IG1heSBjb250YWluIGEgc3VwcG9ydGVkLXZhbHVlcyBzZW50ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRleHRMZWF2ZXModmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgZGVwdGggPiBNQVhfSlNPTl9VTldSQVBfREVQVEgpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgY29uc3QgcGFyc2VkID0gdHJ5VW53cmFwSnNvbih0cmltbWVkKTtcbiAgICBpZiAocGFyc2VkICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkICE9PSB0cmltbWVkKSB7XG4gICAgICByZXR1cm4gY29sbGVjdFRleHRMZWF2ZXMocGFyc2VkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gW3RyaW1tZWRdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFtTdHJpbmcodmFsdWUpXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG4gIH1cbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG59XG5cbmZ1bmN0aW9uIHRyeVVud3JhcEpzb24odGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGFzUmVjb3JkID0ganNvbi5wYXJzZVJlY29yZCh0ZXh0KTtcbiAgaWYgKGFzUmVjb3JkKSByZXR1cm4gYXNSZWNvcmQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UodGV4dCk7XG4gIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhcnNlZDtcbiAgaWYgKHRleHQuaW5jbHVkZXMoJ1xcXFxcIicpIHx8IHRleHQuaW5jbHVkZXMoXCJcXFxcblwiKSkge1xuICAgIGNvbnN0IHVuZXNjYXBlZCA9IHRleHQucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiXFxcXFwiKTtcbiAgICBpZiAodW5lc2NhcGVkICE9PSB0ZXh0KSB7XG4gICAgICBjb25zdCBuZXN0ZWQgPSBqc29uLnBhcnNlKHVuZXNjYXBlZCk7XG4gICAgICBpZiAobmVzdGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBuZXN0ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -3,11 +3,9 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import type { ModelQuery, RankedModel, ServingEndpointSummary } from "@dbx-tools/shared-model";
7
- import { type ResolveModelInput, type ResolvedModelSelection } from "./_selection.ts";
8
- import { type ResolvedModel, type ResolveModelOptions, type WorkspaceClientLike } from "./model-catalog.ts";
6
+ import type { ModelQuery, RankedModel, ResolvedModel, ResolvedModelSelection, ResolveModelInput, ResolveModelOptions, ServingEndpointSummary } from "@dbx-tools/shared-model";
7
+ import { type WorkspaceClientLike } from "./model-catalog.ts";
9
8
  export { lookupModels, rankModelId, resolveModel } from "./_selection.ts";
10
- export type { ResolveModelInput, ResolvedModelSelection } from "./_selection.ts";
11
9
  /** Intent plus catalogue cache controls passed to {@link selectModel}. */
12
10
  export interface SelectModelInput extends ResolveModelInput {
13
11
  ttlMs?: number;
@@ -1,4 +1,4 @@
1
- import { lookupModels, rankModelId, resolveModel, } from "./_selection.js";
1
+ import { lookupModels, rankModelId, resolveModel } from "./_selection.js";
2
2
  import { listServingEndpoints, } from "./model-catalog.js";
3
3
  export { lookupModels, rankModelId, resolveModel } from "./_selection.js";
4
4
  /** Resolve against a potentially stale catalogue, refreshing once on a miss. */
@@ -27,4 +27,4 @@ function catalogueOptions(input) {
27
27
  ...(input.cacheIdentity !== undefined ? { cacheIdentity: input.cacheIdentity } : {}),
28
28
  };
29
29
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFDTCxZQUFZLEVBQ1osV0FBVyxFQUdYLFlBQVksR0FDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxvQkFBb0IsR0FLckIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWUxRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLElBQW9FLEVBQ3BFLE1BQWMsRUFDZCxVQUErQixFQUFFO0lBRWpDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxRQUFRLENBQUMsT0FBTztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3RDLE9BQU8sV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUEyQixFQUMzQixJQUFZLEVBQ1osUUFBMkIsRUFBRTtJQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsTUFBMkIsRUFDM0IsSUFBWSxFQUNaLFFBQTBCLEVBQUU7SUFFNUIsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FHekI7SUFDQyxPQUFPO1FBQ0wsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3JGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXb3Jrc3BhY2UtYXdhcmUgbW9kZWwgc2VsZWN0aW9uIHdyYXBwZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHR5cGUgeyBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQge1xuICBsb29rdXBNb2RlbHMsXG4gIHJhbmtNb2RlbElkLFxuICB0eXBlIFJlc29sdmVNb2RlbElucHV0LFxuICB0eXBlIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4gIHJlc29sdmVNb2RlbCxcbn0gZnJvbSBcIi4vX3NlbGVjdGlvbi50c1wiO1xuaW1wb3J0IHtcbiAgbGlzdFNlcnZpbmdFbmRwb2ludHMsXG4gIHR5cGUgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlLFxufSBmcm9tIFwiLi9tb2RlbC1jYXRhbG9nLnRzXCI7XG5cbmV4cG9ydCB7IGxvb2t1cE1vZGVscywgcmFua01vZGVsSWQsIHJlc29sdmVNb2RlbCB9IGZyb20gXCIuL19zZWxlY3Rpb24udHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZU1vZGVsSW5wdXQsIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24gfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5cbi8qKiBJbnRlbnQgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIHR0bE1zPzogbnVtYmVyO1xuICBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogUXVlcnkgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWFyY2hNb2RlbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNb2RlbHNJbnB1dCBleHRlbmRzIE1vZGVsUXVlcnkge1xuICB0dGxNcz86IG51bWJlcjtcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmUgYWdhaW5zdCBhIHBvdGVudGlhbGx5IHN0YWxlIGNhdGFsb2d1ZSwgcmVmcmVzaGluZyBvbmNlIG9uIGEgbWlzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5rTW9kZWxJZExpdmUoXG4gIGxvYWQ6IChmb3JjZTogYm9vbGVhbikgPT4gUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+LFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmFua01vZGVsSWQoYXdhaXQgbG9hZChmYWxzZSksIHNlYXJjaCwgb3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZC5tYXRjaGVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiByYW5rTW9kZWxJZChhd2FpdCBsb2FkKHRydWUpLCBzZWFyY2gsIG9wdGlvbnMpO1xufVxuXG4vKiogTGlzdCBhbmQgcmFuayBhIHdvcmtzcGFjZSBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTW9kZWxzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlYXJjaE1vZGVsc0lucHV0ID0ge30sXG4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCBjYXRhbG9ndWVPcHRpb25zKGlucHV0KSk7XG4gIHJldHVybiBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKiBMaXN0IGEgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2ZSBvbmUgbW9kZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0TW9kZWwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VsZWN0TW9kZWxJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsU2VsZWN0aW9uPiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmZ1enp5ID09PSBmYWxzZSAmJiAhaW5wdXQucmVxdWlyZXNUb29scykge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICB9XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwgY2F0YWxvZ3VlT3B0aW9ucyhpbnB1dCkpO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVPcHRpb25zKGlucHV0OiB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufSk6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgLi4uKGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5jYWNoZUlkZW50aXR5ICE9PSB1bmRlZmluZWQgPyB7IGNhY2hlSWRlbnRpdHk6IGlucHV0LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFFLE9BQU8sRUFDTCxvQkFBb0IsR0FHckIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWMxRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLElBQW9FLEVBQ3BFLE1BQWMsRUFDZCxVQUErQixFQUFFO0lBRWpDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxRQUFRLENBQUMsT0FBTztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3RDLE9BQU8sV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUEyQixFQUMzQixJQUFZLEVBQ1osUUFBMkIsRUFBRTtJQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsTUFBMkIsRUFDM0IsSUFBWSxFQUNaLFFBQTBCLEVBQUU7SUFFNUIsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FHekI7SUFDQyxPQUFPO1FBQ0wsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3JGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXb3Jrc3BhY2UtYXdhcmUgbW9kZWwgc2VsZWN0aW9uIHdyYXBwZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbFF1ZXJ5LFxuICBSYW5rZWRNb2RlbCxcbiAgUmVzb2x2ZWRNb2RlbCxcbiAgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIFJlc29sdmVNb2RlbE9wdGlvbnMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJhbmtNb2RlbElkLCByZXNvbHZlTW9kZWwgfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5pbXBvcnQge1xuICBsaXN0U2VydmluZ0VuZHBvaW50cyxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG4gIHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSxcbn0gZnJvbSBcIi4vbW9kZWwtY2F0YWxvZy50c1wiO1xuXG5leHBvcnQgeyBsb29rdXBNb2RlbHMsIHJhbmtNb2RlbElkLCByZXNvbHZlTW9kZWwgfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5cbi8qKiBJbnRlbnQgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIHR0bE1zPzogbnVtYmVyO1xuICBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogUXVlcnkgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWFyY2hNb2RlbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNb2RlbHNJbnB1dCBleHRlbmRzIE1vZGVsUXVlcnkge1xuICB0dGxNcz86IG51bWJlcjtcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmUgYWdhaW5zdCBhIHBvdGVudGlhbGx5IHN0YWxlIGNhdGFsb2d1ZSwgcmVmcmVzaGluZyBvbmNlIG9uIGEgbWlzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5rTW9kZWxJZExpdmUoXG4gIGxvYWQ6IChmb3JjZTogYm9vbGVhbikgPT4gUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+LFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmFua01vZGVsSWQoYXdhaXQgbG9hZChmYWxzZSksIHNlYXJjaCwgb3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZC5tYXRjaGVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiByYW5rTW9kZWxJZChhd2FpdCBsb2FkKHRydWUpLCBzZWFyY2gsIG9wdGlvbnMpO1xufVxuXG4vKiogTGlzdCBhbmQgcmFuayBhIHdvcmtzcGFjZSBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTW9kZWxzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlYXJjaE1vZGVsc0lucHV0ID0ge30sXG4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCBjYXRhbG9ndWVPcHRpb25zKGlucHV0KSk7XG4gIHJldHVybiBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKiBMaXN0IGEgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2ZSBvbmUgbW9kZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0TW9kZWwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VsZWN0TW9kZWxJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsU2VsZWN0aW9uPiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmZ1enp5ID09PSBmYWxzZSAmJiAhaW5wdXQucmVxdWlyZXNUb29scykge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICB9XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwgY2F0YWxvZ3VlT3B0aW9ucyhpbnB1dCkpO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVPcHRpb25zKGlucHV0OiB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufSk6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgLi4uKGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5jYWNoZUlkZW50aXR5ICE9PSB1bmRlZmluZWQgPyB7IGNhY2hlSWRlbnRpdHk6IGlucHV0LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Framework-neutral repairs for OpenAI Chat traffic sent through Databricks
3
+ * Model Serving.
4
+ *
5
+ * @module
6
+ */
7
+ import { type ChatMessage, type ChatRole } from "@dbx-tools/shared-model";
8
+ /** Chat message plus provider reasoning fields emitted by Databricks models. */
9
+ export interface ServingChatMessage extends ChatMessage {
10
+ role: ChatRole | "reasoning";
11
+ reasoning?: unknown;
12
+ reasoning_content?: unknown;
13
+ }
14
+ /** Prepared fetch arguments and the sanitized request body. */
15
+ export interface RewrittenServingRequest {
16
+ input: Parameters<typeof fetch>[0];
17
+ init: Parameters<typeof fetch>[1];
18
+ body: string;
19
+ }
20
+ /** Sanitize a serialized Chat Completions request when provider quirks require it. */
21
+ export declare function rewriteServingBody(body: string): string;
22
+ /** Read and sanitize a Chat Completions request without retaining stale byte headers. */
23
+ export declare function rewriteServingRequest(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<RewrittenServingRequest>;
24
+ /** Normalize Chat Completions reasoning for GPT tool calls. */
25
+ export declare function applyToolReasoningCompatibility(body: Record<string, unknown>): boolean;
26
+ /** Remove provider reasoning blocks that cannot be replayed safely. */
27
+ export declare function stripReasoningFromServingMessages(messages: ServingChatMessage[]): boolean;
28
+ /** Fold a trailing assistant prefill back into its preceding tool-call turn. */
29
+ export declare function repairAssistantPrefill(messages: ServingChatMessage[]): boolean;
30
+ /** Normalize array-valued content in a non-streaming Chat Completions response. */
31
+ export declare function rewriteServingResponseBody(body: string): string;
32
+ /** Normalize array-valued content in an SSE stream without buffering the stream. */
33
+ export declare function rewriteServingResponseStream(body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array>;
34
+ /** Flatten Chat Completions `choices[].message.content` arrays to strings. */
35
+ export declare function flattenChoiceMessageContent(payload: Record<string, unknown>): boolean;
36
+ /** Flatten Chat Completions `choices[].delta.content` arrays to strings. */
37
+ export declare function flattenChoiceDeltaContent(payload: Record<string, unknown>): boolean;