@dbx-tools/appkit-model-gateway 0.9.190 → 0.9.194

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.
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Forgiving model-context normalization for routing and suggestion generation.
3
+ *
4
+ * @module
5
+ */
6
+ import { isRecord } from "@dbx-tools/shared-core";
7
+ import { convertToModelMessages, modelMessageSchema, pruneMessages, safeValidateUIMessages, } from "ai";
8
+ import { Tiktoken } from "js-tiktoken/lite";
9
+ import o200kBase from "js-tiktoken/ranks/o200k_base";
10
+ const CONTEXT_ENCODING = new Tiktoken(o200kBase);
11
+ const DEFAULT_TOKEN_LIMIT = 4_096;
12
+ /**
13
+ * Normalize strings, JSON, AI SDK messages, Responses input, and task-shaped objects.
14
+ *
15
+ * AI SDK UI/model message parsing is preferred. The fallback handles external wire
16
+ * shapes and arbitrary JSON without retaining credentials, metadata, or tool arguments.
17
+ */
18
+ export async function normalizeModelContext(input, options = {}) {
19
+ const tokenLimit = Math.max(0, options.tokenLimit ?? DEFAULT_TOKEN_LIMIT);
20
+ const removeNonUsefulMessages = options.removeNonUsefulMessages ?? true;
21
+ const normalized = parseJsonString(input);
22
+ const conversation = conversationValue(normalized);
23
+ const sdkMessages = await aiSdkModelMessages(conversation);
24
+ const events = sdkMessages
25
+ ? modelMessageEvents(sdkMessages, removeNonUsefulMessages)
26
+ : conversationEvents(conversation, removeNonUsefulMessages);
27
+ const rawEvents = conversationEvents(conversation, false);
28
+ const stateEvents = rawEvents.length > 0 ? rawEvents : events;
29
+ if (events.length > 0)
30
+ return contextFromEvents(events, tokenLimit, stateEvents);
31
+ const values = collectTaskStrings(normalized);
32
+ const task = truncateText(values.join("\n"), tokenLimit, "start");
33
+ return {
34
+ task,
35
+ logicalTurn: task,
36
+ continuation: false,
37
+ events: task ? [{ role: "user", text: task }] : [],
38
+ tokenCount: countTokens(task),
39
+ };
40
+ }
41
+ async function aiSdkModelMessages(input) {
42
+ if (!Array.isArray(input) || input.length === 0)
43
+ return undefined;
44
+ const modelMessages = input.map((value) => modelMessageSchema.safeParse(value));
45
+ if (modelMessages.every((result) => result.success)) {
46
+ return modelMessages.map((result) => result.data);
47
+ }
48
+ const uiMessages = await safeValidateUIMessages({ messages: input });
49
+ if (!uiMessages.success)
50
+ return undefined;
51
+ try {
52
+ return await convertToModelMessages(uiMessages.data, { ignoreIncompleteToolCalls: true });
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function modelMessageEvents(messages, removeNonUsefulMessages) {
59
+ const useful = removeNonUsefulMessages
60
+ ? pruneMessages({ messages, reasoning: "all", toolCalls: "all" })
61
+ : messages;
62
+ return useful.flatMap((message) => {
63
+ const role = message.role;
64
+ if (role === "tool" && removeNonUsefulMessages)
65
+ return [];
66
+ const text = modelContentText(message.content, removeNonUsefulMessages);
67
+ return text ? [{ role, text }] : [];
68
+ });
69
+ }
70
+ function modelContentText(value, removeNonUsefulMessages) {
71
+ if (typeof value === "string")
72
+ return value.trim();
73
+ if (!Array.isArray(value))
74
+ return "";
75
+ return value
76
+ .flatMap((part) => {
77
+ if (!isRecord(part))
78
+ return [];
79
+ if (typeof part.text === "string")
80
+ return [part.text.trim()];
81
+ if (!removeNonUsefulMessages && typeof part.output === "string")
82
+ return [part.output.trim()];
83
+ return [];
84
+ })
85
+ .filter(Boolean)
86
+ .join("\n");
87
+ }
88
+ function conversationValue(input) {
89
+ if (!isRecord(input))
90
+ return input;
91
+ for (const key of ["messages", "input"]) {
92
+ const value = input[key];
93
+ if (Array.isArray(value))
94
+ return value;
95
+ if (typeof value === "string" && value.trim())
96
+ return value;
97
+ }
98
+ return input;
99
+ }
100
+ function contextFromEvents(events, tokenLimit, stateEvents = events) {
101
+ const latestUserIndex = lastEventIndex(events, "user");
102
+ const taskEvent = latestUserIndex >= 0 ? events[latestUserIndex] : events.at(-1);
103
+ const task = truncateText(taskEvent?.text ?? "", tokenLimit, "start");
104
+ let remaining = Math.max(0, tokenLimit - countTokens(task));
105
+ const context = [];
106
+ for (let index = (taskEvent ? events.indexOf(taskEvent) : events.length) - 1; index >= 0; index -= 1) {
107
+ const event = events[index];
108
+ if (!event || !event.text || event.role === "tool")
109
+ continue;
110
+ const value = `${event.role}: ${event.text}`;
111
+ const retained = truncateText(value, remaining, "end");
112
+ if (!retained)
113
+ break;
114
+ context.unshift(retained);
115
+ remaining -= countTokens(retained);
116
+ }
117
+ const combined = [...context, task].filter(Boolean).join("\n");
118
+ const stateLatestUserIndex = lastEventIndex(stateEvents, "user");
119
+ const logicalEvents = stateLatestUserIndex >= 0 ? stateEvents.slice(0, stateLatestUserIndex + 1) : stateEvents;
120
+ return {
121
+ task: combined,
122
+ logicalTurn: logicalEvents.map((event) => `${event.role}:${event.text}`).join("\n"),
123
+ continuation: stateLatestUserIndex >= 0 &&
124
+ stateEvents.slice(stateLatestUserIndex + 1).some((event) => event.role !== "system"),
125
+ events,
126
+ tokenCount: countTokens(combined),
127
+ };
128
+ }
129
+ function conversationEvents(input, removeNonUsefulMessages) {
130
+ if (typeof input === "string")
131
+ return input.trim() ? [{ role: "user", text: input.trim() }] : [];
132
+ if (Array.isArray(input)) {
133
+ return input.flatMap((value) => messageEvent(value, removeNonUsefulMessages));
134
+ }
135
+ if (!isRecord(input))
136
+ return [];
137
+ for (const key of ["messages", "input"]) {
138
+ const value = input[key];
139
+ if (typeof value === "string" && value.trim())
140
+ return [{ role: "user", text: value.trim() }];
141
+ if (Array.isArray(value)) {
142
+ const events = value.flatMap((item) => messageEvent(item, removeNonUsefulMessages));
143
+ if (events.length > 0)
144
+ return events;
145
+ }
146
+ }
147
+ return [];
148
+ }
149
+ function messageEvent(value, removeNonUsefulMessages) {
150
+ if (typeof value === "string")
151
+ return value.trim() ? [{ role: "user", text: value.trim() }] : [];
152
+ if (!isRecord(value))
153
+ return [];
154
+ const role = messageRole(value);
155
+ if (!role || (removeNonUsefulMessages && role === "tool"))
156
+ return [];
157
+ if (removeNonUsefulMessages && (value.type === "function_call" || value.type === "reasoning")) {
158
+ return [];
159
+ }
160
+ const text = contentText(value.content ?? value.text ?? value.input_text ?? value.output_text);
161
+ return text ? [{ role, text }] : [];
162
+ }
163
+ function messageRole(value) {
164
+ if (value.role === "user" || value.role === "assistant" || value.role === "system") {
165
+ return value.role;
166
+ }
167
+ if (value.role === "tool" ||
168
+ value.type === "function_call_output" ||
169
+ value.type === "tool_result") {
170
+ return "tool";
171
+ }
172
+ if (value.type === "function_call" || value.type === "reasoning")
173
+ return "assistant";
174
+ if (value.type === "message" && value.role === undefined)
175
+ return "user";
176
+ return undefined;
177
+ }
178
+ function contentText(value) {
179
+ if (typeof value === "string")
180
+ return value.trim();
181
+ if (Array.isArray(value))
182
+ return value.map(contentText).filter(Boolean).join("\n");
183
+ if (!isRecord(value))
184
+ return "";
185
+ for (const key of ["text", "input_text", "output_text", "content"]) {
186
+ const text = contentText(value[key]);
187
+ if (text)
188
+ return text;
189
+ }
190
+ return "";
191
+ }
192
+ const TASK_KEYS = [
193
+ "prompt",
194
+ "task",
195
+ "query",
196
+ "question",
197
+ "request",
198
+ "description",
199
+ "message",
200
+ "text",
201
+ "input",
202
+ ];
203
+ const IGNORED_KEYS = new Set([
204
+ "api_key",
205
+ "authorization",
206
+ "arguments",
207
+ "credentials",
208
+ "headers",
209
+ "metadata",
210
+ "password",
211
+ "provider_options",
212
+ "raw_input",
213
+ "secret",
214
+ "token",
215
+ "tool_calls",
216
+ "tools",
217
+ ]);
218
+ function collectTaskStrings(input) {
219
+ if (typeof input === "string")
220
+ return input.trim() ? [input.trim()] : [];
221
+ const preferred = [];
222
+ if (isRecord(input)) {
223
+ for (const key of TASK_KEYS)
224
+ preferred.push(...stringLeaves(input[key], key, 0));
225
+ }
226
+ return preferred.length > 0 ? preferred.slice(0, 32) : stringLeaves(input, "", 0).slice(0, 32);
227
+ }
228
+ function stringLeaves(value, key, depth) {
229
+ if (depth > 6 || IGNORED_KEYS.has(key.toLowerCase()))
230
+ return [];
231
+ if (typeof value === "string")
232
+ return value.trim() ? [value.trim()] : [];
233
+ if (Array.isArray(value))
234
+ return value.flatMap((item) => stringLeaves(item, key, depth + 1));
235
+ if (!isRecord(value))
236
+ return [];
237
+ return Object.entries(value).flatMap(([childKey, child]) => stringLeaves(child, childKey, depth + 1));
238
+ }
239
+ function parseJsonString(input) {
240
+ if (typeof input !== "string")
241
+ return input;
242
+ const trimmed = input.trim();
243
+ if (!trimmed || (!trimmed.startsWith("{") && !trimmed.startsWith("[")))
244
+ return input;
245
+ try {
246
+ return JSON.parse(trimmed);
247
+ }
248
+ catch {
249
+ return input;
250
+ }
251
+ }
252
+ function countTokens(text) {
253
+ return CONTEXT_ENCODING.encode(text, [], []).length;
254
+ }
255
+ function truncateText(text, tokenLimit, edge) {
256
+ if (tokenLimit <= 0 || !text)
257
+ return "";
258
+ const tokens = CONTEXT_ENCODING.encode(text, [], []);
259
+ if (tokens.length <= tokenLimit)
260
+ return text;
261
+ return CONTEXT_ENCODING.decode(edge === "start" ? tokens.slice(0, tokenLimit) : tokens.slice(-tokenLimit));
262
+ }
263
+ function lastEventIndex(events, role) {
264
+ for (let index = events.length - 1; index >= 0; index -= 1) {
265
+ if (events[index]?.role === role)
266
+ return index;
267
+ }
268
+ return -1;
269
+ }
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLHNCQUFzQixHQUV2QixNQUFNLElBQUksQ0FBQztBQUNaLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLFNBQVMsTUFBTSw4QkFBOEIsQ0FBQztBQUVyRCxNQUFNLGdCQUFnQixHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBeUJsQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEtBQWMsRUFDZCxVQUF3QyxFQUFFO0lBRTFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsQ0FBQztJQUMxRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUM7SUFDeEUsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sV0FBVyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsV0FBVztRQUN4QixDQUFDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHVCQUF1QixDQUFDO1FBQzFELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsdUJBQXVC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Y2VzQ29udGVudCI6WyIvKipcbiAqIEZvcmdpdmluZyBtb2RlbC1jb250ZXh0IG5vcm1hbGl6YXRpb24gZm9yIHJvdXRpbmcgYW5kIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgY29udmVydFRvTW9kZWxNZXNzYWdlcyxcbiAgbW9kZWxNZXNzYWdlU2NoZW1hLFxuICBwcnVuZU1lc3NhZ2VzLFxuICBzYWZlVmFsaWRhdGVVSU1lc3NhZ2VzLFxuICB0eXBlIE1vZGVsTWVzc2FnZSxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBUaWt0b2tlbiB9IGZyb20gXCJqcy10aWt0b2tlbi9saXRlXCI7XG5pbXBvcnQgbzIwMGtCYXNlIGZyb20gXCJqcy10aWt0b2tlbi9yYW5rcy9vMjAwa19iYXNlXCI7XG5cbmNvbnN0IENPTlRFWFRfRU5DT0RJTkcgPSBuZXcgVGlrdG9rZW4obzIwMGtCYXNlKTtcbmNvbnN0IERFRkFVTFRfVE9LRU5fTElNSVQgPSA0XzA5NjtcblxuLyoqIE9uZSB1c2VmdWwgY29udmVyc2F0aW9uYWwgZXZlbnQgcmV0YWluZWQgZnJvbSBhcmJpdHJhcnkgY2FsbGVyIGlucHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENvbnRleHRFdmVudCB7XG4gIHJlYWRvbmx5IHJvbGU6IFwiYXNzaXN0YW50XCIgfCBcInN5c3RlbVwiIHwgXCJ0b29sXCIgfCBcInVzZXJcIjtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKiogQ29udHJvbHMgZm9yIGNvbnZlcnRpbmcgYXJiaXRyYXJ5IHZhbHVlcyBpbnRvIGJvdW5kZWQgbW9kZWwgY29udGV4dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplTW9kZWxDb250ZXh0T3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIHJldGFpbmVkIHRva2Vucy4gRGVmYXVsdHMgdG8gNDA5Ni4gKi9cbiAgcmVhZG9ubHkgdG9rZW5MaW1pdD86IG51bWJlcjtcbiAgLyoqIFJlbW92ZSByZWFzb25pbmcsIHRvb2wgY2FsbHMvcmVzdWx0cywgbWV0YWRhdGEsIGFuZCBvdGhlciBub24tY29udmVyc2F0aW9uYWwgbm9pc2UuICovXG4gIHJlYWRvbmx5IHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzPzogYm9vbGVhbjtcbn1cblxuLyoqIEJvdW5kZWQgY29udGV4dCBwbHVzIGxvZ2ljYWwtdHVybiBtZXRhZGF0YSB1c2VkIGJ5IG1vZGVsIHJvdXRlcnMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRNb2RlbENvbnRleHQge1xuICByZWFkb25seSBjb250aW51YXRpb246IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXTtcbiAgcmVhZG9ubHkgbG9naWNhbFR1cm46IHN0cmluZztcbiAgcmVhZG9ubHkgdGFzazogc3RyaW5nO1xuICByZWFkb25seSB0b2tlbkNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHN0cmluZ3MsIEpTT04sIEFJIFNESyBtZXNzYWdlcywgUmVzcG9uc2VzIGlucHV0LCBhbmQgdGFzay1zaGFwZWQgb2JqZWN0cy5cbiAqXG4gKiBBSSBTREsgVUkvbW9kZWwgbWVzc2FnZSBwYXJzaW5nIGlzIHByZWZlcnJlZC4gVGhlIGZhbGxiYWNrIGhhbmRsZXMgZXh0ZXJuYWwgd2lyZVxuICogc2hhcGVzIGFuZCBhcmJpdHJhcnkgSlNPTiB3aXRob3V0IHJldGFpbmluZyBjcmVkZW50aWFscywgbWV0YWRhdGEsIG9yIHRvb2wgYXJndW1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplTW9kZWxDb250ZXh0KFxuICBpbnB1dDogdW5rbm93bixcbiAgb3B0aW9uczogTm9ybWFsaXplTW9kZWxDb250ZXh0T3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxOb3JtYWxpemVkTW9kZWxDb250ZXh0PiB7XG4gIGNvbnN0IHRva2VuTGltaXQgPSBNYXRoLm1heCgwLCBvcHRpb25zLnRva2VuTGltaXQgPz8gREVGQVVMVF9UT0tFTl9MSU1JVCk7XG4gIGNvbnN0IHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzID0gb3B0aW9ucy5yZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyA/PyB0cnVlO1xuICBjb25zdCBub3JtYWxpemVkID0gcGFyc2VKc29uU3RyaW5nKGlucHV0KTtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gY29udmVyc2F0aW9uVmFsdWUobm9ybWFsaXplZCk7XG4gIGNvbnN0IHNka01lc3NhZ2VzID0gYXdhaXQgYWlTZGtNb2RlbE1lc3NhZ2VzKGNvbnZlcnNhdGlvbik7XG4gIGNvbnN0IGV2ZW50cyA9IHNka01lc3NhZ2VzXG4gICAgPyBtb2RlbE1lc3NhZ2VFdmVudHMoc2RrTWVzc2FnZXMsIHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzKVxuICAgIDogY29udmVyc2F0aW9uRXZlbnRzKGNvbnZlcnNhdGlvbiwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpO1xuICBjb25zdCByYXdFdmVudHMgPSBjb252ZXJzYXRpb25FdmVudHMoY29udmVyc2F0aW9uLCBmYWxzZSk7XG4gIGNvbnN0IHN0YXRlRXZlbnRzID0gcmF3RXZlbnRzLmxlbmd0aCA+IDAgPyByYXdFdmVudHMgOiBldmVudHM7XG4gIGlmIChldmVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGNvbnRleHRGcm9tRXZlbnRzKGV2ZW50cywgdG9rZW5MaW1pdCwgc3RhdGVFdmVudHMpO1xuXG4gIGNvbnN0IHZhbHVlcyA9IGNvbGxlY3RUYXNrU3RyaW5ncyhub3JtYWxpemVkKTtcbiAgY29uc3QgdGFzayA9IHRydW5jYXRlVGV4dCh2YWx1ZXMuam9pbihcIlxcblwiKSwgdG9rZW5MaW1pdCwgXCJzdGFydFwiKTtcbiAgcmV0dXJuIHtcbiAgICB0YXNrLFxuICAgIGxvZ2ljYWxUdXJuOiB0YXNrLFxuICAgIGNvbnRpbnVhdGlvbjogZmFsc2UsXG4gICAgZXZlbnRzOiB0YXNrID8gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IHRhc2sgfV0gOiBbXSxcbiAgICB0b2tlbkNvdW50OiBjb3VudFRva2Vucyh0YXNrKSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWlTZGtNb2RlbE1lc3NhZ2VzKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxNb2RlbE1lc3NhZ2VbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IGlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxNZXNzYWdlcyA9IGlucHV0Lm1hcCgodmFsdWUpID0+IG1vZGVsTWVzc2FnZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpKTtcbiAgaWYgKG1vZGVsTWVzc2FnZXMuZXZlcnkoKHJlc3VsdCkgPT4gcmVzdWx0LnN1Y2Nlc3MpKSB7XG4gICAgcmV0dXJuIG1vZGVsTWVzc2FnZXMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhKTtcbiAgfVxuXG4gIGNvbnN0IHVpTWVzc2FnZXMgPSBhd2FpdCBzYWZlVmFsaWRhdGVVSU1lc3NhZ2VzKHsgbWVzc2FnZXM6IGlucHV0IH0pO1xuICBpZiAoIXVpTWVzc2FnZXMuc3VjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY29udmVydFRvTW9kZWxNZXNzYWdlcyh1aU1lc3NhZ2VzLmRhdGEsIHsgaWdub3JlSW5jb21wbGV0ZVRvb2xDYWxsczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb2RlbE1lc3NhZ2VFdmVudHMoXG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXSxcbiAgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4sXG4pOiBNb2RlbENvbnRleHRFdmVudFtdIHtcbiAgY29uc3QgdXNlZnVsID0gcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXNcbiAgICA/IHBydW5lTWVzc2FnZXMoeyBtZXNzYWdlcywgcmVhc29uaW5nOiBcImFsbFwiLCB0b29sQ2FsbHM6IFwiYWxsXCIgfSlcbiAgICA6IG1lc3NhZ2VzO1xuICByZXR1cm4gdXNlZnVsLmZsYXRNYXAoKG1lc3NhZ2UpID0+IHtcbiAgICBjb25zdCByb2xlID0gbWVzc2FnZS5yb2xlO1xuICAgIGlmIChyb2xlID09PSBcInRvb2xcIiAmJiByZW1vdmVOb25Vc2VmdWxNZXNzYWdlcykgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHRleHQgPSBtb2RlbENvbnRlbnRUZXh0KG1lc3NhZ2UuY29udGVudCwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpO1xuICAgIHJldHVybiB0ZXh0ID8gW3sgcm9sZSwgdGV4dCB9XSA6IFtdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbW9kZWxDb250ZW50VGV4dCh2YWx1ZTogdW5rbm93biwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLmZsYXRNYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmICghaXNSZWNvcmQocGFydCkpIHJldHVybiBbXTtcbiAgICAgIGlmICh0eXBlb2YgcGFydC50ZXh0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gW3BhcnQudGV4dC50cmltKCldO1xuICAgICAgaWYgKCFyZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyAmJiB0eXBlb2YgcGFydC5vdXRwdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBbcGFydC5vdXRwdXQudHJpbSgpXTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gY29udmVyc2F0aW9uVmFsdWUoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgZm9yIChjb25zdCBrZXkgb2YgW1wibWVzc2FnZXNcIiwgXCJpbnB1dFwiXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRba2V5XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cblxuZnVuY3Rpb24gY29udGV4dEZyb21FdmVudHMoXG4gIGV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXSxcbiAgdG9rZW5MaW1pdDogbnVtYmVyLFxuICBzdGF0ZUV2ZW50czogcmVhZG9ubHkgTW9kZWxDb250ZXh0RXZlbnRbXSA9IGV2ZW50cyxcbik6IE5vcm1hbGl6ZWRNb2RlbENvbnRleHQge1xuICBjb25zdCBsYXRlc3RVc2VySW5kZXggPSBsYXN0RXZlbnRJbmRleChldmVudHMsIFwidXNlclwiKTtcbiAgY29uc3QgdGFza0V2ZW50ID0gbGF0ZXN0VXNlckluZGV4ID49IDAgPyBldmVudHNbbGF0ZXN0VXNlckluZGV4XSA6IGV2ZW50cy5hdCgtMSk7XG4gIGNvbnN0IHRhc2sgPSB0cnVuY2F0ZVRleHQodGFza0V2ZW50Py50ZXh0ID8/IFwiXCIsIHRva2VuTGltaXQsIFwic3RhcnRcIik7XG4gIGxldCByZW1haW5pbmcgPSBNYXRoLm1heCgwLCB0b2tlbkxpbWl0IC0gY291bnRUb2tlbnModGFzaykpO1xuICBjb25zdCBjb250ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKFxuICAgIGxldCBpbmRleCA9ICh0YXNrRXZlbnQgPyBldmVudHMuaW5kZXhPZih0YXNrRXZlbnQpIDogZXZlbnRzLmxlbmd0aCkgLSAxO1xuICAgIGluZGV4ID49IDA7XG4gICAgaW5kZXggLT0gMVxuICApIHtcbiAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpbmRleF07XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGV4dCB8fCBldmVudC5yb2xlID09PSBcInRvb2xcIikgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSBgJHtldmVudC5yb2xlfTogJHtldmVudC50ZXh0fWA7XG4gICAgY29uc3QgcmV0YWluZWQgPSB0cnVuY2F0ZVRleHQodmFsdWUsIHJlbWFpbmluZywgXCJlbmRcIik7XG4gICAgaWYgKCFyZXRhaW5lZCkgYnJlYWs7XG4gICAgY29udGV4dC51bnNoaWZ0KHJldGFpbmVkKTtcbiAgICByZW1haW5pbmcgLT0gY291bnRUb2tlbnMocmV0YWluZWQpO1xuICB9XG4gIGNvbnN0IGNvbWJpbmVkID0gWy4uLmNvbnRleHQsIHRhc2tdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBzdGF0ZUxhdGVzdFVzZXJJbmRleCA9IGxhc3RFdmVudEluZGV4KHN0YXRlRXZlbnRzLCBcInVzZXJcIik7XG4gIGNvbnN0IGxvZ2ljYWxFdmVudHMgPVxuICAgIHN0YXRlTGF0ZXN0VXNlckluZGV4ID49IDAgPyBzdGF0ZUV2ZW50cy5zbGljZSgwLCBzdGF0ZUxhdGVzdFVzZXJJbmRleCArIDEpIDogc3RhdGVFdmVudHM7XG4gIHJldHVybiB7XG4gICAgdGFzazogY29tYmluZWQsXG4gICAgbG9naWNhbFR1cm46IGxvZ2ljYWxFdmVudHMubWFwKChldmVudCkgPT4gYCR7ZXZlbnQucm9sZX06JHtldmVudC50ZXh0fWApLmpvaW4oXCJcXG5cIiksXG4gICAgY29udGludWF0aW9uOlxuICAgICAgc3RhdGVMYXRlc3RVc2VySW5kZXggPj0gMCAmJlxuICAgICAgc3RhdGVFdmVudHMuc2xpY2Uoc3RhdGVMYXRlc3RVc2VySW5kZXggKyAxKS5zb21lKChldmVudCkgPT4gZXZlbnQucm9sZSAhPT0gXCJzeXN0ZW1cIiksXG4gICAgZXZlbnRzLFxuICAgIHRva2VuQ291bnQ6IGNvdW50VG9rZW5zKGNvbWJpbmVkKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVyc2F0aW9uRXZlbnRzKGlucHV0OiB1bmtub3duLCByZW1vdmVOb25Vc2VmdWxNZXNzYWdlczogYm9vbGVhbik6IE1vZGVsQ29udGV4dEV2ZW50W10ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSByZXR1cm4gaW5wdXQudHJpbSgpID8gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IGlucHV0LnRyaW0oKSB9XSA6IFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQuZmxhdE1hcCgodmFsdWUpID0+IG1lc3NhZ2VFdmVudCh2YWx1ZSwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXMpKTtcbiAgfVxuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbXCJtZXNzYWdlc1wiLCBcImlucHV0XCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpKSByZXR1cm4gW3sgcm9sZTogXCJ1c2VyXCIsIHRleHQ6IHZhbHVlLnRyaW0oKSB9XTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHZhbHVlLmZsYXRNYXAoKGl0ZW0pID0+IG1lc3NhZ2VFdmVudChpdGVtLCByZW1vdmVOb25Vc2VmdWxNZXNzYWdlcykpO1xuICAgICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSByZXR1cm4gZXZlbnRzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2VFdmVudCh2YWx1ZTogdW5rbm93biwgcmVtb3ZlTm9uVXNlZnVsTWVzc2FnZXM6IGJvb2xlYW4pOiBNb2RlbENvbnRleHRFdmVudFtdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlLnRyaW0oKSA/IFt7IHJvbGU6IFwidXNlclwiLCB0ZXh0OiB2YWx1ZS50cmltKCkgfV0gOiBbXTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgY29uc3Qgcm9sZSA9IG1lc3NhZ2VSb2xlKHZhbHVlKTtcbiAgaWYgKCFyb2xlIHx8IChyZW1vdmVOb25Vc2VmdWxNZXNzYWdlcyAmJiByb2xlID09PSBcInRvb2xcIikpIHJldHVybiBbXTtcbiAgaWYgKHJlbW92ZU5vblVzZWZ1bE1lc3NhZ2VzICYmICh2YWx1ZS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIiB8fCB2YWx1ZS50eXBlID09PSBcInJlYXNvbmluZ1wiKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gY29udGVudFRleHQodmFsdWUuY29udGVudCA/PyB2YWx1ZS50ZXh0ID8/IHZhbHVlLmlucHV0X3RleHQgPz8gdmFsdWUub3V0cHV0X3RleHQpO1xuICByZXR1cm4gdGV4dCA/IFt7IHJvbGUsIHRleHQgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZVJvbGUoXG4gIHZhbHVlOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBNb2RlbENvbnRleHRFdmVudFtcInJvbGVcIl0gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUucm9sZSA9PT0gXCJ1c2VyXCIgfHwgdmFsdWUucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiB8fCB2YWx1ZS5yb2xlID09PSBcInN5c3RlbVwiKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJvbGU7XG4gIH1cbiAgaWYgKFxuICAgIHZhbHVlLnJvbGUgPT09IFwidG9vbFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiXG4gICkge1xuICAgIHJldHVybiBcInRvb2xcIjtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIgfHwgdmFsdWUudHlwZSA9PT0gXCJyZWFzb25pbmdcIikgcmV0dXJuIFwiYXNzaXN0YW50XCI7XG4gIGlmICh2YWx1ZS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiB2YWx1ZS5yb2xlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVzZXJcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29udGVudFRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoY29udGVudFRleHQpLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFwiXCI7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcInRleHRcIiwgXCJpbnB1dF90ZXh0XCIsIFwib3V0cHV0X3RleHRcIiwgXCJjb250ZW50XCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdGV4dCA9IGNvbnRlbnRUZXh0KHZhbHVlW2tleV0pO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gdGV4dDtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuY29uc3QgVEFTS19LRVlTID0gW1xuICBcInByb21wdFwiLFxuICBcInRhc2tcIixcbiAgXCJxdWVyeVwiLFxuICBcInF1ZXN0aW9uXCIsXG4gIFwicmVxdWVzdFwiLFxuICBcImRlc2NyaXB0aW9uXCIsXG4gIFwibWVzc2FnZVwiLFxuICBcInRleHRcIixcbiAgXCJpbnB1dFwiLFxuXSBhcyBjb25zdDtcbmNvbnN0IElHTk9SRURfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFwaV9rZXlcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiYXJndW1lbnRzXCIsXG4gIFwiY3JlZGVudGlhbHNcIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwibWV0YWRhdGFcIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInByb3ZpZGVyX29wdGlvbnNcIixcbiAgXCJyYXdfaW5wdXRcIixcbiAgXCJzZWNyZXRcIixcbiAgXCJ0b2tlblwiLFxuICBcInRvb2xfY2FsbHNcIixcbiAgXCJ0b29sc1wiLFxuXSk7XG5cbmZ1bmN0aW9uIGNvbGxlY3RUYXNrU3RyaW5ncyhpbnB1dDogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGlucHV0LnRyaW0oKSA/IFtpbnB1dC50cmltKCldIDogW107XG4gIGNvbnN0IHByZWZlcnJlZDogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFRBU0tfS0VZUykgcHJlZmVycmVkLnB1c2goLi4uc3RyaW5nTGVhdmVzKGlucHV0W2tleV0sIGtleSwgMCkpO1xuICB9XG4gIHJldHVybiBwcmVmZXJyZWQubGVuZ3RoID4gMCA/IHByZWZlcnJlZC5zbGljZSgwLCAzMikgOiBzdHJpbmdMZWF2ZXMoaW5wdXQsIFwiXCIsIDApLnNsaWNlKDAsIDMyKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTGVhdmVzKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKGRlcHRoID4gNiB8fCBJR05PUkVEX0tFWVMuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpID8gW3ZhbHVlLnRyaW0oKV0gOiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmxhdE1hcCgoaXRlbSkgPT4gc3RyaW5nTGVhdmVzKGl0ZW0sIGtleSwgZGVwdGggKyAxKSk7XG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmxhdE1hcCgoW2NoaWxkS2V5LCBjaGlsZF0pID0+XG4gICAgc3RyaW5nTGVhdmVzKGNoaWxkLCBjaGlsZEtleSwgZGVwdGggKyAxKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VKc29uU3RyaW5nKGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dDtcbiAgY29uc3QgdHJpbW1lZCA9IGlucHV0LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8ICghdHJpbW1lZC5zdGFydHNXaXRoKFwie1wiKSAmJiAhdHJpbW1lZC5zdGFydHNXaXRoKFwiW1wiKSkpIHJldHVybiBpbnB1dDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY291bnRUb2tlbnModGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIENPTlRFWFRfRU5DT0RJTkcuZW5jb2RlKHRleHQsIFtdLCBbXSkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCB0b2tlbkxpbWl0OiBudW1iZXIsIGVkZ2U6IFwic3RhcnRcIiB8IFwiZW5kXCIpOiBzdHJpbmcge1xuICBpZiAodG9rZW5MaW1pdCA8PSAwIHx8ICF0ZXh0KSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdG9rZW5zID0gQ09OVEVYVF9FTkNPRElORy5lbmNvZGUodGV4dCwgW10sIFtdKTtcbiAgaWYgKHRva2Vucy5sZW5ndGggPD0gdG9rZW5MaW1pdCkgcmV0dXJuIHRleHQ7XG4gIHJldHVybiBDT05URVhUX0VOQ09ESU5HLmRlY29kZShcbiAgICBlZGdlID09PSBcInN0YXJ0XCIgPyB0b2tlbnMuc2xpY2UoMCwgdG9rZW5MaW1pdCkgOiB0b2tlbnMuc2xpY2UoLXRva2VuTGltaXQpLFxuICApO1xufVxuXG5mdW5jdGlvbiBsYXN0RXZlbnRJbmRleChcbiAgZXZlbnRzOiByZWFkb25seSBNb2RlbENvbnRleHRFdmVudFtdLFxuICByb2xlOiBNb2RlbENvbnRleHRFdmVudFtcInJvbGVcIl0sXG4pOiBudW1iZXIge1xuICBmb3IgKGxldCBpbmRleCA9IGV2ZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgaWYgKGV2ZW50c1tpbmRleF0/LnJvbGUgPT09IHJvbGUpIHJldHVybiBpbmRleDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iXX0=
@@ -5,8 +5,8 @@
5
5
  */
6
6
  import type { CodexModelListResponse, ModelListResponse, ModelTarget, OpenAIModelListResponse } from "@dbx-tools/shared-model-gateway";
7
7
  /** Build the combined OpenAI and optional Codex model catalogue. */
8
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): CodexModelListResponse;
9
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): OpenAIModelListResponse;
10
- export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean): ModelListResponse;
8
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: true, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): CodexModelListResponse;
9
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: false, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): OpenAIModelListResponse;
10
+ export declare function listModelsPayload(targets: readonly ModelTarget[], includeCodex: boolean, preserveOrder?: boolean, preferSystemModels?: boolean, includeSmartRouter?: boolean, includeAiDecide?: boolean, includeMetadata?: boolean): ModelListResponse;
11
11
  /** Codex `/v1/models` slug: the `system.ai.*` service when preferred, else the endpoint id. */
12
12
  export declare function codexModelSlug(target: ModelTarget, preferSystemModels: boolean): string;
package/lib/src/models.js CHANGED
@@ -3,11 +3,12 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { CHAT_CLASS_ORDER, compareVersionTuples, isChatClass, isOpenWeightsGpt, ModelFamily, modelFamily, modelFamilyRank, versionTuple, } from "@dbx-tools/model";
6
+ import { CHAT_CLASS_ORDER, compareVersionTuples, isChatClass, isOpenWeightsGpt, ModelFamily, modelFamily, modelFamilyRank, modelMetadataFor, versionTuple, } from "@dbx-tools/model";
7
7
  import { ModelClass, ReasoningEffort } from "@dbx-tools/shared-model";
8
- import { SMART_ROUTER_MODEL_ID } from "@dbx-tools/shared-model-gateway";
8
+ import { AI_DECIDE_MODEL_ID, SMART_ROUTER_MODEL_ID } from "@dbx-tools/shared-model-gateway";
9
9
  const CODEX_BASE_INSTRUCTIONS = "You are a coding agent. Follow the user's instructions and use the available tools to work in the current repository.";
10
10
  const CODEX_SMART_ROUTER_PRIORITY = 9_000;
11
+ const CODEX_AI_DECIDE_PRIORITY = 9_001;
11
12
  const CODEX_MODEL_PRIORITY_BASE = 10_000;
12
13
  const CODEX_FAMILY_ORDER = [
13
14
  ModelFamily.Gpt,
@@ -22,7 +23,7 @@ const REASONING_DESCRIPTIONS = {
22
23
  xhigh: "Use an extra-high reasoning budget",
23
24
  max: "Use the largest available reasoning budget",
24
25
  };
25
- export function listModelsPayload(targets, includeCodex, preserveOrder = false, preferSystemModels = false, includeSmartRouter = false) {
26
+ export function listModelsPayload(targets, includeCodex, preserveOrder = false, preferSystemModels = false, includeSmartRouter = false, includeAiDecide = false, includeMetadata = false) {
26
27
  const available = targets
27
28
  .filter((target) => target.endpoint?.status?.deprecated !== true)
28
29
  .filter((target) => !includeCodex || hasChatClass(target));
@@ -32,6 +33,9 @@ export function listModelsPayload(targets, includeCodex, preserveOrder = false,
32
33
  : (left, right) => compareCatalogueTargets(left, right, (target) => target.displayName));
33
34
  }
34
35
  const smartRouterCandidates = available.filter((target) => target.capabilities.chat);
36
+ if (includeAiDecide && smartRouterCandidates.length > 0) {
37
+ available.unshift(aiDecideModelTarget(smartRouterCandidates));
38
+ }
35
39
  if (includeSmartRouter && smartRouterCandidates.length > 0) {
36
40
  available.unshift(smartRouterModelTarget(smartRouterCandidates));
37
41
  }
@@ -40,25 +44,30 @@ export function listModelsPayload(targets, includeCodex, preserveOrder = false,
40
44
  return {
41
45
  models: available.map((target) => codexModel(target, target.id === SMART_ROUTER_MODEL_ID
42
46
  ? CODEX_SMART_ROUTER_PRIORITY
43
- : CODEX_MODEL_PRIORITY_BASE + modelIndex++, preferSystemModels)),
47
+ : target.id === AI_DECIDE_MODEL_ID
48
+ ? CODEX_AI_DECIDE_PRIORITY
49
+ : CODEX_MODEL_PRIORITY_BASE + modelIndex++, preferSystemModels, includeMetadata)),
44
50
  };
45
51
  }
46
52
  return {
47
53
  object: "list",
48
- data: available.map(openAiModel),
54
+ data: available.map((target) => openAiModel(target, includeMetadata)),
49
55
  };
50
56
  }
51
- function openAiModel(target) {
57
+ function openAiModel(target, includeMetadata) {
52
58
  return {
53
59
  id: target.id,
54
60
  object: "model",
55
61
  created: 0,
56
62
  owned_by: "databricks",
57
63
  name: target.displayName,
64
+ model_source: target.endpoint?.modelSource ?? "custom",
58
65
  task: target.endpoint?.task,
59
66
  status: target.endpoint?.status ?? { deprecated: false },
67
+ ...(includeMetadata ? { metadata: modelMetadataFor(target.endpoint ?? target.id) } : {}),
60
68
  capabilities: {
61
69
  smart_router: target.id === SMART_ROUTER_MODEL_ID,
70
+ ai_decide: target.id === AI_DECIDE_MODEL_ID,
62
71
  tools: target.capabilities.tools,
63
72
  reasoning: target.reasoningEfforts,
64
73
  responses: target.capabilities.responses,
@@ -73,6 +82,42 @@ function openAiModel(target) {
73
82
  },
74
83
  };
75
84
  }
85
+ function aiDecideModelTarget(candidates) {
86
+ const has = (capability) => candidates.some((target) => target.capabilities[capability]);
87
+ const reasoningEfforts = Object.values(ReasoningEffort).filter((effort) => candidates.some((target) => target.reasoningEfforts.includes(effort)));
88
+ return {
89
+ id: AI_DECIDE_MODEL_ID,
90
+ aliases: [AI_DECIDE_MODEL_ID],
91
+ displayName: "AI Decide",
92
+ endpoint: {
93
+ name: AI_DECIDE_MODEL_ID,
94
+ displayName: "AI Decide",
95
+ description: "Uses Databricks ai_decide to choose a sufficient foundation model.",
96
+ task: "llm/v1/chat",
97
+ class: ModelClass.ChatBalanced,
98
+ modelSource: "foundation",
99
+ status: { deprecated: false },
100
+ },
101
+ capabilities: {
102
+ responses: true,
103
+ openResponses: true,
104
+ chat: true,
105
+ anthropic: true,
106
+ embeddings: false,
107
+ aiGatewayCodex: true,
108
+ tools: has("tools"),
109
+ reasoning: reasoningEfforts.length > 0,
110
+ streaming: true,
111
+ parallelTools: has("parallelTools"),
112
+ customTools: has("customTools"),
113
+ structuredOutput: has("structuredOutput"),
114
+ webSearch: has("webSearch"),
115
+ imageInput: has("imageInput"),
116
+ applyPatch: has("applyPatch"),
117
+ },
118
+ reasoningEfforts,
119
+ };
120
+ }
76
121
  function smartRouterModelTarget(candidates) {
77
122
  const has = (capability) => candidates.some((target) => target.capabilities[capability]);
78
123
  const reasoningEfforts = Object.values(ReasoningEffort).filter((effort) => candidates.some((target) => target.reasoningEfforts.includes(effort)));
@@ -86,6 +131,7 @@ function smartRouterModelTarget(candidates) {
86
131
  description: "Uses Databricks task_v3 Smart Router to select a compatible system model for each turn.",
87
132
  task: "llm/v1/chat",
88
133
  class: ModelClass.ChatBalanced,
134
+ modelSource: "foundation",
89
135
  status: { deprecated: false },
90
136
  },
91
137
  capabilities: {
@@ -115,7 +161,7 @@ export function codexModelSlug(target, preferSystemModels) {
115
161
  : target.id;
116
162
  return `databricks/${model}`;
117
163
  }
118
- function codexModel(target, priority, preferSystemModels) {
164
+ function codexModel(target, priority, preferSystemModels, includeMetadata) {
119
165
  const efforts = target.reasoningEfforts;
120
166
  return {
121
167
  slug: codexModelSlug(target, preferSystemModels),
@@ -123,6 +169,7 @@ function codexModel(target, priority, preferSystemModels) {
123
169
  description: target.endpoint?.description ?? "Databricks model service",
124
170
  base_instructions: CODEX_BASE_INSTRUCTIONS,
125
171
  status: target.endpoint?.status ?? { deprecated: false },
172
+ ...(includeMetadata ? { metadata: modelMetadataFor(target.endpoint ?? target.id) } : {}),
126
173
  supported_reasoning_levels: efforts.map((effort) => ({
127
174
  effort,
128
175
  description: REASONING_DESCRIPTIONS[effort] ?? `Use the ${effort} reasoning budget`,
@@ -253,4 +300,4 @@ function hasChatClass(target) {
253
300
  const modelClass = target.endpoint?.class;
254
301
  return modelClass !== undefined && isChatClass(modelClass);
255
302
  }
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBV3hFLE1BQU0sdUJBQXVCLEdBQzNCLHVIQUF1SCxDQUFDO0FBQzFILE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0FBQzFDLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDO0FBQ3pDLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsV0FBVyxDQUFDLEdBQUc7SUFDZixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FBQztDQUNwRSxDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBcUM7SUFDL0QsSUFBSSxFQUFFLDRCQUE0QjtJQUNsQyxPQUFPLEVBQUUsNkNBQTZDO0lBQ3RELEdBQUcsRUFBRSw0QkFBNEI7SUFDakMsTUFBTSxFQUFFLCtCQUErQjtJQUN2QyxJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLEtBQUssRUFBRSxvQ0FBb0M7SUFDM0MsR0FBRyxFQUFFLDRDQUE0QztDQUNsRCxDQUFDO0FBd0JGLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBK0IsRUFDL0IsWUFBcUIsRUFDckIsYUFBYSxHQUFHLEtBQUssRUFDckIsa0JBQWtCLEdBQUcsS0FBSyxFQUMxQixrQkFB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QUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIGFuZCBDb2RleCBtb2RlbC1saXN0IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9DTEFTU19PUkRFUixcbiAgY29tcGFyZVZlcnNpb25UdXBsZXMsXG4gIGlzQ2hhdENsYXNzLFxuICBpc09wZW5XZWlnaHRzR3B0LFxuICBNb2RlbEZhbWlseSxcbiAgbW9kZWxGYW1pbHksXG4gIG1vZGVsRmFtaWx5UmFuayxcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcywgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBTTUFSVF9ST1VURVJfTU9ERUxfSUQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb2RleE1vZGVsLFxuICBDb2RleE1vZGVsTGlzdFJlc3BvbnNlLFxuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsVGFyZ2V0LFxuICBPcGVuQUlNb2RlbCxcbiAgT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2UsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmNvbnN0IENPREVYX0JBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgY29kaW5nIGFnZW50LiBGb2xsb3cgdGhlIHVzZXIncyBpbnN0cnVjdGlvbnMgYW5kIHVzZSB0aGUgYXZhaWxhYmxlIHRvb2xzIHRvIHdvcmsgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeS5cIjtcbmNvbnN0IENPREVYX1NNQVJUX1JPVVRFUl9QUklPUklUWSA9IDlfMDAwO1xuY29uc3QgQ09ERVhfTU9ERUxfUFJJT1JJVFlfQkFTRSA9IDEwXzAwMDtcbmNvbnN0IENPREVYX0ZBTUlMWV9PUkRFUiA9IFtcbiAgTW9kZWxGYW1pbHkuR3B0LFxuICAuLi5PYmplY3QudmFsdWVzKE1vZGVsRmFtaWx5KS5maWx0ZXIoKGZhbWlseSkgPT4gZmFtaWx5ICE9PSBNb2RlbEZhbWlseS5HcHQpLFxuXSBhcyBjb25zdDtcblxuY29uc3QgUkVBU09OSU5HX0RFU0NSSVBUSU9OUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gIG5vbmU6IFwiRGlzYWJsZSBleHBsaWNpdCByZWFzb25pbmdcIixcbiAgbWluaW1hbDogXCJVc2UgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGxvdzogXCJVc2UgYSBsb3cgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBtZWRpdW06IFwiVXNlIGEgbWVkaXVtIHJlYXNvbmluZyBidWRnZXRcIixcbiAgaGlnaDogXCJVc2UgYSBoaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgeGhpZ2g6IFwiVXNlIGFuIGV4dHJhLWhpZ2ggcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBtYXg6IFwiVXNlIHRoZSBsYXJnZXN0IGF2YWlsYWJsZSByZWFzb25pbmcgYnVkZ2V0XCIsXG59O1xuXG4vKiogQnVpbGQgdGhlIGNvbWJpbmVkIE9wZW5BSSBhbmQgb3B0aW9uYWwgQ29kZXggbW9kZWwgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IHRydWUsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuICBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuLFxuICBpbmNsdWRlU21hcnRSb3V0ZXI/OiBib29sZWFuLFxuKTogQ29kZXhNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBmYWxzZSxcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4gIHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW4sXG4gIGluY2x1ZGVTbWFydFJvdXRlcj86IGJvb2xlYW4sXG4pOiBPcGVuQUlNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbixcbiAgaW5jbHVkZVNtYXJ0Um91dGVyPzogYm9vbGVhbixcbik6IE1vZGVsTGlzdFJlc3BvbnNlO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RNb2RlbHNQYXlsb2FkKFxuICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICBpbmNsdWRlQ29kZXg6IGJvb2xlYW4sXG4gIHByZXNlcnZlT3JkZXIgPSBmYWxzZSxcbiAgcHJlZmVyU3lzdGVtTW9kZWxzID0gZmFsc2UsXG4gIGluY2x1ZGVTbWFydFJvdXRlciA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydChcbiAgICAgIGluY2x1ZGVDb2RleFxuICAgICAgICA/IGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHNcbiAgICAgICAgOiAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKGxlZnQsIHJpZ2h0LCAodGFyZ2V0KSA9PiB0YXJnZXQuZGlzcGxheU5hbWUpLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc21hcnRSb3V0ZXJDYW5kaWRhdGVzID0gYXZhaWxhYmxlLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQpO1xuICBpZiAoaW5jbHVkZVNtYXJ0Um91dGVyICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoc21hcnRSb3V0ZXJNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZUNvZGV4KSB7XG4gICAgbGV0IG1vZGVsSW5kZXggPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IGF2YWlsYWJsZS5tYXAoKHRhcmdldCkgPT5cbiAgICAgICAgY29kZXhNb2RlbChcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSURcbiAgICAgICAgICAgID8gQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZXG4gICAgICAgICAgICA6IENPREVYX01PREVMX1BSSU9SSVRZX0JBU0UgKyBtb2RlbEluZGV4KyssXG4gICAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKG9wZW5BaU1vZGVsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gb3BlbkFpTW9kZWwodGFyZ2V0OiBNb2RlbFRhcmdldCk6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBzbWFydF9yb3V0ZXI6IHRhcmdldC5pZCA9PT0gU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICAgIGltYWdlX2lucHV0OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQsXG4gICAgICBhcHBseV9wYXRjaDogdGFyZ2V0LmNhcGFiaWxpdGllcy5hcHBseVBhdGNoLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNtYXJ0Um91dGVyTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbU01BUlRfUk9VVEVSX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJTbWFydCBSb3V0ZXJcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiU21hcnQgUm91dGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2VzIERhdGFicmlja3MgdGFza192MyBTbWFydCBSb3V0ZXIgdG8gc2VsZWN0IGEgY29tcGF0aWJsZSBzeXN0ZW0gbW9kZWwgZm9yIGVhY2ggdHVybi5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbi8qKiBDb2RleCBgL3YxL21vZGVsc2Agc2x1ZzogdGhlIGBzeXN0ZW0uYWkuKmAgc2VydmljZSB3aGVuIHByZWZlcnJlZCwgZWxzZSB0aGUgZW5kcG9pbnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHByZWZlclN5c3RlbU1vZGVscyAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgcHJpb3JpdHk6IG51bWJlcixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuKTogQ29kZXhNb2RlbCB7XG4gIGNvbnN0IGVmZm9ydHMgPSB0YXJnZXQucmVhc29uaW5nRWZmb3J0cztcbiAgcmV0dXJuIHtcbiAgICBzbHVnOiBjb2RleE1vZGVsU2x1Zyh0YXJnZXQsIHByZWZlclN5c3RlbU1vZGVscyksXG4gICAgZGlzcGxheV9uYW1lOiBjb2RleERpc3BsYXlOYW1lKHRhcmdldCksXG4gICAgZGVzY3JpcHRpb246IHRhcmdldC5lbmRwb2ludD8uZGVzY3JpcHRpb24gPz8gXCJEYXRhYnJpY2tzIG1vZGVsIHNlcnZpY2VcIixcbiAgICBiYXNlX2luc3RydWN0aW9uczogQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHM6IGVmZm9ydHMubWFwKChlZmZvcnQpID0+ICh7XG4gICAgICBlZmZvcnQsXG4gICAgICBkZXNjcmlwdGlvbjogUkVBU09OSU5HX0RFU0NSSVBUSU9OU1tlZmZvcnRdID8/IGBVc2UgdGhlICR7ZWZmb3J0fSByZWFzb25pbmcgYnVkZ2V0YCxcbiAgICB9KSksXG4gICAgLi4uKGVmZm9ydHMubGVuZ3RoID4gMFxuICAgICAgPyB7IGRlZmF1bHRfcmVhc29uaW5nX2xldmVsOiBlZmZvcnRzLmluY2x1ZGVzKFwibWVkaXVtXCIpID8gXCJtZWRpdW1cIiA6IGVmZm9ydHNbMF0gfVxuICAgICAgOiB7fSksXG4gICAgc2hlbGxfdHlwZTogXCJ1bmlmaWVkX2V4ZWNcIixcbiAgICB2aXNpYmlsaXR5OiBcImxpc3RcIixcbiAgICBzdXBwb3J0ZWRfaW5fYXBpOiB0cnVlLFxuICAgIHByaW9yaXR5LFxuICAgIGF2YWlsYWJpbGl0eV9udXg6IG51bGwsXG4gICAgdXBncmFkZTogbnVsbCxcbiAgICBzdXBwb3J0X3ZlcmJvc2l0eTogZmFsc2UsXG4gICAgZGVmYXVsdF92ZXJib3NpdHk6IG51bGwsXG4gICAgYXBwbHlfcGF0Y2hfdG9vbF90eXBlOiB0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzID8gXCJmcmVlZm9ybVwiIDogbnVsbCxcbiAgICB0cnVuY2F0aW9uX3BvbGljeTogeyBtb2RlOiBcInRva2Vuc1wiLCBsaW1pdDogMTI4XzAwMCB9LFxuICAgIGNvbnRleHRfd2luZG93OiBudWxsLFxuICAgIGV4cGVyaW1lbnRhbF9zdXBwb3J0ZWRfdG9vbHM6IFtdLFxuICAgIGlucHV0X21vZGFsaXRpZXM6IFtcInRleHRcIl0sXG4gICAgd2ViX3NlYXJjaF90b29sX3R5cGU6IFwidGV4dFwiLFxuICAgIHN1cHBvcnRzX3NlYXJjaF90b29sOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICBzdXBwb3J0c19pbWFnZV9kZXRhaWxfb3JpZ2luYWw6IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb2RleERpc3BsYXlOYW1lKHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcge1xuICBpZiAoY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgIT09IE1vZGVsRmFtaWx5LkdwdCkgcmV0dXJuIHRhcmdldC5kaXNwbGF5TmFtZTtcbiAgY29uc3QgZGlzcGxheU5hbWUgPSB0YXJnZXQuZGlzcGxheU5hbWUucmVwbGFjZSgvXmdwdCg/PVtcXHMuXy1dKS9pLCBcIkdQVFwiKTtcbiAgcmV0dXJuIGBEYXRhYnJpY2tzICR7ZGlzcGxheU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNvZGV4Q2F0YWxvZ3VlVGFyZ2V0cyhsZWZ0OiBNb2RlbFRhcmdldCwgcmlnaHQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgY29uc3QgZmFtaWx5T3JkZXIgPSBjb2RleEZhbWlseVJhbmsobGVmdCkgLSBjb2RleEZhbWlseVJhbmsocmlnaHQpO1xuICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgY29uc3QgbW9kZWxLaW5kT3JkZXIgPSBjb2RleE1vZGVsS2luZFJhbmsobGVmdCkgLSBjb2RleE1vZGVsS2luZFJhbmsocmlnaHQpO1xuICBpZiAobW9kZWxLaW5kT3JkZXIgIT09IDApIHJldHVybiBtb2RlbEtpbmRPcmRlcjtcbiAgY29uc3QgdmVyc2lvbk9yZGVyID0gY29tcGFyZVZlcnNpb25UdXBsZXMoY29kZXhWZXJzaW9uKHJpZ2h0KSwgY29kZXhWZXJzaW9uKGxlZnQpKTtcbiAgaWYgKHZlcnNpb25PcmRlciAhPT0gMCkgcmV0dXJuIHZlcnNpb25PcmRlcjtcbiAgY29uc3QgY2xhc3NPcmRlciA9IGNvZGV4Q2xhc3NSYW5rKGxlZnQpIC0gY29kZXhDbGFzc1JhbmsocmlnaHQpO1xuICBpZiAoY2xhc3NPcmRlciAhPT0gMCkgcmV0dXJuIGNsYXNzT3JkZXI7XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGVmdC5kaXNwbGF5TmFtZSwgcmlnaHQuZGlzcGxheU5hbWUpO1xufVxuXG5mdW5jdGlvbiBjb2RleE1vZGVsS2luZFJhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIHJldHVybiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXS5zb21lKFxuICAgIChpZGVudGl0eSkgPT4gaWRlbnRpdHkgJiYgaXNPcGVuV2VpZ2h0c0dwdChpZGVudGl0eSksXG4gIClcbiAgICA/IDFcbiAgICA6IDA7XG59XG5cbmZ1bmN0aW9uIGNvZGV4RmFtaWx5UmFuayh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgY29uc3QgZmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCk7XG4gIGNvbnN0IGluZGV4ID0gZmFtaWx5ID8gQ09ERVhfRkFNSUxZX09SREVSLmluZGV4T2YoZmFtaWx5IGFzIE1vZGVsRmFtaWx5KSA6IC0xO1xuICByZXR1cm4gaW5kZXggPj0gMCA/IGluZGV4IDogQ09ERVhfRkFNSUxZX09SREVSLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gY29kZXhWZXJzaW9uKHRhcmdldDogTW9kZWxUYXJnZXQpOiByZWFkb25seSBudW1iZXJbXSB7XG4gIHJldHVybiB2ZXJzaW9uVHVwbGUodGFyZ2V0LmRpc3BsYXlOYW1lKTtcbn1cblxuZnVuY3Rpb24gY29kZXhDbGFzc1JhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICBjb25zdCBpbmRleCA9IG1vZGVsQ2xhc3MgPyBDSEFUX0NMQVNTX09SREVSLmluZGV4T2YobW9kZWxDbGFzcykgOiAtMTtcbiAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IENIQVRfQ0xBU1NfT1JERVIubGVuZ3RoO1xufVxuXG4vKipcbiAqIE9yZGVyIGxpc3RlZCBtb2RlbHMgaW4gdGhyZWUgZ3JvdXBzOiBtYWpvci1wcm92aWRlciBjaGF0IGZhbWlsaWVzLCB0aGVcbiAqIHJlbWFpbmluZyBjaGF0IG1vZGVscywgdGhlbiBlbWJlZGRpbmdzLiBGYW1pbGllcyBrZWVwIGEgZml4ZWQgcHJvdmlkZXJcbiAqIG9yZGVyOyBlYWNoIGZhbWlseSBhbmQgdGhlIGxhdGVyIGdyb3VwcyBzb3J0IGJ5IHRoZSBwdWJsaXNoZWQgbGFiZWxcbiAqIChgZGlzcGxheV9uYW1lYCBmb3IgQ29kZXgsIGBuYW1lYCBvdGhlcndpc2UpLiBOdW1lcmljIHNlZ21lbnRzIHNvcnRcbiAqIG5hdHVyYWxseSBzbyBcIlZlbyAzLjFcIiBwcmVjZWRlcyBcIlZlbyAzLjEwXCIuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKFxuICBsZWZ0OiBNb2RlbFRhcmdldCxcbiAgcmlnaHQ6IE1vZGVsVGFyZ2V0LFxuICBsYWJlbDogKHRhcmdldDogTW9kZWxUYXJnZXQpID0+IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGdyb3VwID0gY2F0YWxvZ3VlR3JvdXAobGVmdCkgLSBjYXRhbG9ndWVHcm91cChyaWdodCk7XG4gIGlmIChncm91cCAhPT0gMCkgcmV0dXJuIGdyb3VwO1xuICBjb25zdCBsZWZ0RmFtaWx5ID0gY2F0YWxvZ3VlRmFtaWx5KGxlZnQpO1xuICBjb25zdCByaWdodEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShyaWdodCk7XG4gIGlmIChsZWZ0RmFtaWx5ICYmIHJpZ2h0RmFtaWx5KSB7XG4gICAgY29uc3QgZmFtaWx5T3JkZXIgPSBtb2RlbEZhbWlseVJhbmsobGVmdEZhbWlseSkgLSBtb2RlbEZhbWlseVJhbmsocmlnaHRGYW1pbHkpO1xuICAgIGlmIChmYW1pbHlPcmRlciAhPT0gMCkgcmV0dXJuIGZhbWlseU9yZGVyO1xuICB9XG4gIHJldHVybiBjb21wYXJlQ2F0YWxvZ3VlTGFiZWwobGFiZWwobGVmdCksIGxhYmVsKHJpZ2h0KSk7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUdyb3VwKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIDI7XG4gIHJldHVybiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0KSA/IDAgOiAxO1xufVxuXG5jb25zdCBJREVOVElUWV9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImRhdGFicmlja3NcIixcbiAgXCJzeXN0ZW1cIixcbiAgXCJhaVwiLFxuICBcIm1ldGFcIixcbiAgXCJnb29nbGVcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJhbnRocm9waWNcIixcbl0pO1xuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHkodGFyZ2V0OiBNb2RlbFRhcmdldCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIFt0YXJnZXQuZGlzcGxheU5hbWUsIHRhcmdldC5pZCwgdGFyZ2V0LmVuZHBvaW50Py5uYW1lXSkge1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseUZyb21JZGVudGl0eShpZGVudGl0eSk7XG4gICAgaWYgKGZhbWlseSkgcmV0dXJuIGZhbWlseTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IGlkZW50aXR5LnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgY29uc3Qgc3RhcnQgPSB0b2tlbnMuZmluZCgodG9rZW4pID0+ICFJREVOVElUWV9QUkVGSVhFUy5oYXModG9rZW4pKTtcbiAgaWYgKCFzdGFydCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHN0YXJ0ID09PSBcInZlb1wiKSByZXR1cm4gXCJnZW1pbmlcIjtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkoaWRlbnRpdHkpO1xuICByZXR1cm4gZmFtaWx5ICYmIHN0YXJ0ID09PSBmYW1pbHkgPyBmYW1pbHkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldDogTW9kZWxUYXJnZXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldC5jYXBhYmlsaXRpZXMuZW1iZWRkaW5ncyA9PT0gdHJ1ZSB8fCB0YXJnZXQuZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogXCJiYXNlXCIgfSk7XG59XG5cbmZ1bmN0aW9uIGhhc0NoYXRDbGFzcyh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSB0YXJnZXQuZW5kcG9pbnQ/LmNsYXNzO1xuICByZXR1cm4gbW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkICYmIGlzQ2hhdENsYXNzKG1vZGVsQ2xhc3MpO1xufVxuIl19
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsWUFBWSxHQUNiLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVc1RixNQUFNLHVCQUF1QixHQUMzQix1SEFBdUgsQ0FBQztBQUMxSCxNQUFNLDJCQUEyQixHQUFHLEtBQUssQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQztBQUN2QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLFdBQVcsQ0FBQyxHQUFHO0lBQ2YsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQUM7Q0FDcEUsQ0FBQztBQUVYLE1BQU0sc0JBQXNCLEdBQXFDO0lBQy9ELElBQUksRUFBRSw0QkFBNEI7SUFDbEMsT0FBTyxFQUFFLDZDQUE2QztJQUN0RCxHQUFHLEVBQUUsNEJBQTRCO0lBQ2pDLE1BQU0sRUFBRSwrQkFBK0I7SUFDdkMsSUFBSSxFQUFFLDZCQUE2QjtJQUNuQyxLQUFLLEVBQUUsb0NBQW9DO0lBQzNDLEdBQUcsRUFBRSw0Q0FBNEM7Q0FDbEQsQ0FBQztBQThCRixNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQStCLEVBQy9CLFlB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dEYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQW1CO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIGFuZCBDb2RleCBtb2RlbC1saXN0IHBheWxvYWRzIGRlcml2ZWQgZnJvbSB0aGUgbGl2ZSByZWdpc3RyeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9DTEFTU19PUkRFUixcbiAgY29tcGFyZVZlcnNpb25UdXBsZXMsXG4gIGlzQ2hhdENsYXNzLFxuICBpc09wZW5XZWlnaHRzR3B0LFxuICBNb2RlbEZhbWlseSxcbiAgbW9kZWxGYW1pbHksXG4gIG1vZGVsRmFtaWx5UmFuayxcbiAgbW9kZWxNZXRhZGF0YUZvcixcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcywgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBSV9ERUNJREVfTU9ERUxfSUQsIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvZGV4TW9kZWwsXG4gIENvZGV4TW9kZWxMaXN0UmVzcG9uc2UsXG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbExpc3RSZXNwb25zZSxcbiAgTW9kZWxUYXJnZXQsXG4gIE9wZW5BSU1vZGVsLFxuICBPcGVuQUlNb2RlbExpc3RSZXNwb25zZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuY29uc3QgQ09ERVhfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBjb2RpbmcgYWdlbnQuIEZvbGxvdyB0aGUgdXNlcidzIGluc3RydWN0aW9ucyBhbmQgdXNlIHRoZSBhdmFpbGFibGUgdG9vbHMgdG8gd29yayBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5LlwiO1xuY29uc3QgQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZID0gOV8wMDA7XG5jb25zdCBDT0RFWF9BSV9ERUNJREVfUFJJT1JJVFkgPSA5XzAwMTtcbmNvbnN0IENPREVYX01PREVMX1BSSU9SSVRZX0JBU0UgPSAxMF8wMDA7XG5jb25zdCBDT0RFWF9GQU1JTFlfT1JERVIgPSBbXG4gIE1vZGVsRmFtaWx5LkdwdCxcbiAgLi4uT2JqZWN0LnZhbHVlcyhNb2RlbEZhbWlseSkuZmlsdGVyKChmYW1pbHkpID0+IGZhbWlseSAhPT0gTW9kZWxGYW1pbHkuR3B0KSxcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFJFQVNPTklOR19ERVNDUklQVElPTlM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICBub25lOiBcIkRpc2FibGUgZXhwbGljaXQgcmVhc29uaW5nXCIsXG4gIG1pbmltYWw6IFwiVXNlIHRoZSBzbWFsbGVzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxuICBsb3c6IFwiVXNlIGEgbG93IHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWVkaXVtOiBcIlVzZSBhIG1lZGl1bSByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIGhpZ2g6IFwiVXNlIGEgaGlnaCByZWFzb25pbmcgYnVkZ2V0XCIsXG4gIHhoaWdoOiBcIlVzZSBhbiBleHRyYS1oaWdoIHJlYXNvbmluZyBidWRnZXRcIixcbiAgbWF4OiBcIlVzZSB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgcmVhc29uaW5nIGJ1ZGdldFwiLFxufTtcblxuLyoqIEJ1aWxkIHRoZSBjb21iaW5lZCBPcGVuQUkgYW5kIG9wdGlvbmFsIENvZGV4IG1vZGVsIGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiB0cnVlLFxuICBwcmVzZXJ2ZU9yZGVyPzogYm9vbGVhbixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbixcbiAgaW5jbHVkZVNtYXJ0Um91dGVyPzogYm9vbGVhbixcbiAgaW5jbHVkZUFpRGVjaWRlPzogYm9vbGVhbixcbiAgaW5jbHVkZU1ldGFkYXRhPzogYm9vbGVhbixcbik6IENvZGV4TW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogZmFsc2UsXG4gIHByZXNlcnZlT3JkZXI/OiBib29sZWFuLFxuICBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuLFxuICBpbmNsdWRlU21hcnRSb3V0ZXI/OiBib29sZWFuLFxuICBpbmNsdWRlQWlEZWNpZGU/OiBib29sZWFuLFxuICBpbmNsdWRlTWV0YWRhdGE/OiBib29sZWFuLFxuKTogT3BlbkFJTW9kZWxMaXN0UmVzcG9uc2U7XG5leHBvcnQgZnVuY3Rpb24gbGlzdE1vZGVsc1BheWxvYWQoXG4gIHRhcmdldHM6IHJlYWRvbmx5IE1vZGVsVGFyZ2V0W10sXG4gIGluY2x1ZGVDb2RleDogYm9vbGVhbixcbiAgcHJlc2VydmVPcmRlcj86IGJvb2xlYW4sXG4gIHByZWZlclN5c3RlbU1vZGVscz86IGJvb2xlYW4sXG4gIGluY2x1ZGVTbWFydFJvdXRlcj86IGJvb2xlYW4sXG4gIGluY2x1ZGVBaURlY2lkZT86IGJvb2xlYW4sXG4gIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW4sXG4pOiBNb2RlbExpc3RSZXNwb25zZTtcbmV4cG9ydCBmdW5jdGlvbiBsaXN0TW9kZWxzUGF5bG9hZChcbiAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgaW5jbHVkZUNvZGV4OiBib29sZWFuLFxuICBwcmVzZXJ2ZU9yZGVyID0gZmFsc2UsXG4gIHByZWZlclN5c3RlbU1vZGVscyA9IGZhbHNlLFxuICBpbmNsdWRlU21hcnRSb3V0ZXIgPSBmYWxzZSxcbiAgaW5jbHVkZUFpRGVjaWRlID0gZmFsc2UsXG4gIGluY2x1ZGVNZXRhZGF0YSA9IGZhbHNlLFxuKTogTW9kZWxMaXN0UmVzcG9uc2Uge1xuICBjb25zdCBhdmFpbGFibGUgPSB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cz8uZGVwcmVjYXRlZCAhPT0gdHJ1ZSlcbiAgICAuZmlsdGVyKCh0YXJnZXQpID0+ICFpbmNsdWRlQ29kZXggfHwgaGFzQ2hhdENsYXNzKHRhcmdldCkpO1xuICBpZiAoIXByZXNlcnZlT3JkZXIpIHtcbiAgICBhdmFpbGFibGUuc29ydChcbiAgICAgIGluY2x1ZGVDb2RleFxuICAgICAgICA/IGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHNcbiAgICAgICAgOiAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVDYXRhbG9ndWVUYXJnZXRzKGxlZnQsIHJpZ2h0LCAodGFyZ2V0KSA9PiB0YXJnZXQuZGlzcGxheU5hbWUpLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc21hcnRSb3V0ZXJDYW5kaWRhdGVzID0gYXZhaWxhYmxlLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQpO1xuICBpZiAoaW5jbHVkZUFpRGVjaWRlICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoYWlEZWNpZGVNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZVNtYXJ0Um91dGVyICYmIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXZhaWxhYmxlLnVuc2hpZnQoc21hcnRSb3V0ZXJNb2RlbFRhcmdldChzbWFydFJvdXRlckNhbmRpZGF0ZXMpKTtcbiAgfVxuICBpZiAoaW5jbHVkZUNvZGV4KSB7XG4gICAgbGV0IG1vZGVsSW5kZXggPSAwO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbHM6IGF2YWlsYWJsZS5tYXAoKHRhcmdldCkgPT5cbiAgICAgICAgY29kZXhNb2RlbChcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSURcbiAgICAgICAgICAgID8gQ09ERVhfU01BUlRfUk9VVEVSX1BSSU9SSVRZXG4gICAgICAgICAgICA6IHRhcmdldC5pZCA9PT0gQUlfREVDSURFX01PREVMX0lEXG4gICAgICAgICAgICAgID8gQ09ERVhfQUlfREVDSURFX1BSSU9SSVRZXG4gICAgICAgICAgICAgIDogQ09ERVhfTU9ERUxfUFJJT1JJVFlfQkFTRSArIG1vZGVsSW5kZXgrKyxcbiAgICAgICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgICAgaW5jbHVkZU1ldGFkYXRhLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgb2JqZWN0OiBcImxpc3RcIixcbiAgICBkYXRhOiBhdmFpbGFibGUubWFwKCh0YXJnZXQpID0+IG9wZW5BaU1vZGVsKHRhcmdldCwgaW5jbHVkZU1ldGFkYXRhKSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9wZW5BaU1vZGVsKHRhcmdldDogTW9kZWxUYXJnZXQsIGluY2x1ZGVNZXRhZGF0YTogYm9vbGVhbik6IE9wZW5BSU1vZGVsIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdGFyZ2V0LmlkLFxuICAgIG9iamVjdDogXCJtb2RlbFwiLFxuICAgIGNyZWF0ZWQ6IDAsXG4gICAgb3duZWRfYnk6IFwiZGF0YWJyaWNrc1wiLFxuICAgIG5hbWU6IHRhcmdldC5kaXNwbGF5TmFtZSxcbiAgICBtb2RlbF9zb3VyY2U6IHRhcmdldC5lbmRwb2ludD8ubW9kZWxTb3VyY2UgPz8gXCJjdXN0b21cIixcbiAgICB0YXNrOiB0YXJnZXQuZW5kcG9pbnQ/LnRhc2ssXG4gICAgc3RhdHVzOiB0YXJnZXQuZW5kcG9pbnQ/LnN0YXR1cyA/PyB7IGRlcHJlY2F0ZWQ6IGZhbHNlIH0sXG4gICAgLi4uKGluY2x1ZGVNZXRhZGF0YSA/IHsgbWV0YWRhdGE6IG1vZGVsTWV0YWRhdGFGb3IodGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCkgfSA6IHt9KSxcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHNtYXJ0X3JvdXRlcjogdGFyZ2V0LmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gICAgICBhaV9kZWNpZGU6IHRhcmdldC5pZCA9PT0gQUlfREVDSURFX01PREVMX0lELFxuICAgICAgdG9vbHM6IHRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMsXG4gICAgICByZWFzb25pbmc6IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzLFxuICAgICAgcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyxcbiAgICAgIG9wZW5fcmVzcG9uc2VzOiB0YXJnZXQuY2FwYWJpbGl0aWVzLm9wZW5SZXNwb25zZXMsXG4gICAgICBhbnRocm9waWM6IHRhcmdldC5jYXBhYmlsaXRpZXMuYW50aHJvcGljLFxuICAgICAgZW1iZWRkaW5nczogdGFyZ2V0LmNhcGFiaWxpdGllcy5lbWJlZGRpbmdzLFxuICAgICAgYWlfZ2F0ZXdheV9jb2RleDogdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCxcbiAgICAgIHN0cmVhbWluZzogdGFyZ2V0LmNhcGFiaWxpdGllcy5zdHJlYW1pbmcsXG4gICAgICB3ZWJfc2VhcmNoOiB0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCxcbiAgICAgIGltYWdlX2lucHV0OiB0YXJnZXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQsXG4gICAgICBhcHBseV9wYXRjaDogdGFyZ2V0LmNhcGFiaWxpdGllcy5hcHBseVBhdGNoLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFpRGVjaWRlTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbQUlfREVDSURFX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJBSSBEZWNpZGVcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogQUlfREVDSURFX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiQUkgRGVjaWRlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVc2VzIERhdGFicmlja3MgYWlfZGVjaWRlIHRvIGNob29zZSBhIHN1ZmZpY2llbnQgZm91bmRhdGlvbiBtb2RlbC5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIG1vZGVsU291cmNlOiBcImZvdW5kYXRpb25cIixcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNtYXJ0Um91dGVyTW9kZWxUYXJnZXQoY2FuZGlkYXRlczogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IE1vZGVsVGFyZ2V0IHtcbiAgY29uc3QgaGFzID0gKGNhcGFiaWxpdHk6IGtleW9mIE1vZGVsQ2FwYWJpbGl0aWVzKSA9PlxuICAgIGNhbmRpZGF0ZXMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzW2NhcGFiaWxpdHldKTtcbiAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9IE9iamVjdC52YWx1ZXMoUmVhc29uaW5nRWZmb3J0KS5maWx0ZXIoKGVmZm9ydCkgPT5cbiAgICBjYW5kaWRhdGVzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnJlYXNvbmluZ0VmZm9ydHMuaW5jbHVkZXMoZWZmb3J0KSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgaWQ6IFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgICBhbGlhc2VzOiBbU01BUlRfUk9VVEVSX01PREVMX0lEXSxcbiAgICBkaXNwbGF5TmFtZTogXCJTbWFydCBSb3V0ZXJcIixcbiAgICBlbmRwb2ludDoge1xuICAgICAgbmFtZTogU01BUlRfUk9VVEVSX01PREVMX0lELFxuICAgICAgZGlzcGxheU5hbWU6IFwiU21hcnQgUm91dGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVc2VzIERhdGFicmlja3MgdGFza192MyBTbWFydCBSb3V0ZXIgdG8gc2VsZWN0IGEgY29tcGF0aWJsZSBzeXN0ZW0gbW9kZWwgZm9yIGVhY2ggdHVybi5cIixcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICAgIGNsYXNzOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIG1vZGVsU291cmNlOiBcImZvdW5kYXRpb25cIixcbiAgICAgIHN0YXR1czogeyBkZXByZWNhdGVkOiBmYWxzZSB9LFxuICAgIH0sXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IHRydWUsXG4gICAgICBvcGVuUmVzcG9uc2VzOiB0cnVlLFxuICAgICAgY2hhdDogdHJ1ZSxcbiAgICAgIGFudGhyb3BpYzogdHJ1ZSxcbiAgICAgIGVtYmVkZGluZ3M6IGZhbHNlLFxuICAgICAgYWlHYXRld2F5Q29kZXg6IHRydWUsXG4gICAgICB0b29sczogaGFzKFwidG9vbHNcIiksXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMCxcbiAgICAgIHN0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsVG9vbHM6IGhhcyhcInBhcmFsbGVsVG9vbHNcIiksXG4gICAgICBjdXN0b21Ub29sczogaGFzKFwiY3VzdG9tVG9vbHNcIiksXG4gICAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBoYXMoXCJzdHJ1Y3R1cmVkT3V0cHV0XCIpLFxuICAgICAgd2ViU2VhcmNoOiBoYXMoXCJ3ZWJTZWFyY2hcIiksXG4gICAgICBpbWFnZUlucHV0OiBoYXMoXCJpbWFnZUlucHV0XCIpLFxuICAgICAgYXBwbHlQYXRjaDogaGFzKFwiYXBwbHlQYXRjaFwiKSxcbiAgICB9LFxuICAgIHJlYXNvbmluZ0VmZm9ydHMsXG4gIH07XG59XG5cbi8qKiBDb2RleCBgL3YxL21vZGVsc2Agc2x1ZzogdGhlIGBzeXN0ZW0uYWkuKmAgc2VydmljZSB3aGVuIHByZWZlcnJlZCwgZWxzZSB0aGUgZW5kcG9pbnQgaWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhNb2RlbFNsdWcodGFyZ2V0OiBNb2RlbFRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kZWwgPVxuICAgIHByZWZlclN5c3RlbU1vZGVscyAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4ICYmIHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA/IHRhcmdldC5tb2RlbFNlcnZpY2VOYW1lXG4gICAgICA6IHRhcmdldC5pZDtcbiAgcmV0dXJuIGBkYXRhYnJpY2tzLyR7bW9kZWx9YDtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgcHJpb3JpdHk6IG51bWJlcixcbiAgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuLFxuICBpbmNsdWRlTWV0YWRhdGE6IGJvb2xlYW4sXG4pOiBDb2RleE1vZGVsIHtcbiAgY29uc3QgZWZmb3J0cyA9IHRhcmdldC5yZWFzb25pbmdFZmZvcnRzO1xuICByZXR1cm4ge1xuICAgIHNsdWc6IGNvZGV4TW9kZWxTbHVnKHRhcmdldCwgcHJlZmVyU3lzdGVtTW9kZWxzKSxcbiAgICBkaXNwbGF5X25hbWU6IGNvZGV4RGlzcGxheU5hbWUodGFyZ2V0KSxcbiAgICBkZXNjcmlwdGlvbjogdGFyZ2V0LmVuZHBvaW50Py5kZXNjcmlwdGlvbiA/PyBcIkRhdGFicmlja3MgbW9kZWwgc2VydmljZVwiLFxuICAgIGJhc2VfaW5zdHJ1Y3Rpb25zOiBDT0RFWF9CQVNFX0lOU1RSVUNUSU9OUyxcbiAgICBzdGF0dXM6IHRhcmdldC5lbmRwb2ludD8uc3RhdHVzID8/IHsgZGVwcmVjYXRlZDogZmFsc2UgfSxcbiAgICAuLi4oaW5jbHVkZU1ldGFkYXRhID8geyBtZXRhZGF0YTogbW9kZWxNZXRhZGF0YUZvcih0YXJnZXQuZW5kcG9pbnQgPz8gdGFyZ2V0LmlkKSB9IDoge30pLFxuICAgIHN1cHBvcnRlZF9yZWFzb25pbmdfbGV2ZWxzOiBlZmZvcnRzLm1hcCgoZWZmb3J0KSA9PiAoe1xuICAgICAgZWZmb3J0LFxuICAgICAgZGVzY3JpcHRpb246IFJFQVNPTklOR19ERVNDUklQVElPTlNbZWZmb3J0XSA/PyBgVXNlIHRoZSAke2VmZm9ydH0gcmVhc29uaW5nIGJ1ZGdldGAsXG4gICAgfSkpLFxuICAgIC4uLihlZmZvcnRzLmxlbmd0aCA+IDBcbiAgICAgID8geyBkZWZhdWx0X3JlYXNvbmluZ19sZXZlbDogZWZmb3J0cy5pbmNsdWRlcyhcIm1lZGl1bVwiKSA/IFwibWVkaXVtXCIgOiBlZmZvcnRzWzBdIH1cbiAgICAgIDoge30pLFxuICAgIHNoZWxsX3R5cGU6IFwidW5pZmllZF9leGVjXCIsXG4gICAgdmlzaWJpbGl0eTogXCJsaXN0XCIsXG4gICAgc3VwcG9ydGVkX2luX2FwaTogdHJ1ZSxcbiAgICBwcmlvcml0eSxcbiAgICBhdmFpbGFiaWxpdHlfbnV4OiBudWxsLFxuICAgIHVwZ3JhZGU6IG51bGwsXG4gICAgc3VwcG9ydF92ZXJib3NpdHk6IGZhbHNlLFxuICAgIGRlZmF1bHRfdmVyYm9zaXR5OiBudWxsLFxuICAgIGFwcGx5X3BhdGNoX3Rvb2xfdHlwZTogdGFyZ2V0LmNhcGFiaWxpdGllcy5jdXN0b21Ub29scyA/IFwiZnJlZWZvcm1cIiA6IG51bGwsXG4gICAgdHJ1bmNhdGlvbl9wb2xpY3k6IHsgbW9kZTogXCJ0b2tlbnNcIiwgbGltaXQ6IDEyOF8wMDAgfSxcbiAgICBjb250ZXh0X3dpbmRvdzogbnVsbCxcbiAgICBleHBlcmltZW50YWxfc3VwcG9ydGVkX3Rvb2xzOiBbXSxcbiAgICBpbnB1dF9tb2RhbGl0aWVzOiBbXCJ0ZXh0XCJdLFxuICAgIHdlYl9zZWFyY2hfdG9vbF90eXBlOiBcInRleHRcIixcbiAgICBzdXBwb3J0c19zZWFyY2hfdG9vbDogdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gsXG4gICAgc3VwcG9ydHNfaW1hZ2VfZGV0YWlsX29yaWdpbmFsOiBmYWxzZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29kZXhEaXNwbGF5TmFtZSh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogc3RyaW5nIHtcbiAgaWYgKGNhdGFsb2d1ZUZhbWlseSh0YXJnZXQpICE9PSBNb2RlbEZhbWlseS5HcHQpIHJldHVybiB0YXJnZXQuZGlzcGxheU5hbWU7XG4gIGNvbnN0IGRpc3BsYXlOYW1lID0gdGFyZ2V0LmRpc3BsYXlOYW1lLnJlcGxhY2UoL15ncHQoPz1bXFxzLl8tXSkvaSwgXCJHUFRcIik7XG4gIHJldHVybiBgRGF0YWJyaWNrcyAke2Rpc3BsYXlOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDb2RleENhdGFsb2d1ZVRhcmdldHMobGVmdDogTW9kZWxUYXJnZXQsIHJpZ2h0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IGZhbWlseU9yZGVyID0gY29kZXhGYW1pbHlSYW5rKGxlZnQpIC0gY29kZXhGYW1pbHlSYW5rKHJpZ2h0KTtcbiAgaWYgKGZhbWlseU9yZGVyICE9PSAwKSByZXR1cm4gZmFtaWx5T3JkZXI7XG4gIGNvbnN0IG1vZGVsS2luZE9yZGVyID0gY29kZXhNb2RlbEtpbmRSYW5rKGxlZnQpIC0gY29kZXhNb2RlbEtpbmRSYW5rKHJpZ2h0KTtcbiAgaWYgKG1vZGVsS2luZE9yZGVyICE9PSAwKSByZXR1cm4gbW9kZWxLaW5kT3JkZXI7XG4gIGNvbnN0IHZlcnNpb25PcmRlciA9IGNvbXBhcmVWZXJzaW9uVHVwbGVzKGNvZGV4VmVyc2lvbihyaWdodCksIGNvZGV4VmVyc2lvbihsZWZ0KSk7XG4gIGlmICh2ZXJzaW9uT3JkZXIgIT09IDApIHJldHVybiB2ZXJzaW9uT3JkZXI7XG4gIGNvbnN0IGNsYXNzT3JkZXIgPSBjb2RleENsYXNzUmFuayhsZWZ0KSAtIGNvZGV4Q2xhc3NSYW5rKHJpZ2h0KTtcbiAgaWYgKGNsYXNzT3JkZXIgIT09IDApIHJldHVybiBjbGFzc09yZGVyO1xuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxlZnQuZGlzcGxheU5hbWUsIHJpZ2h0LmRpc3BsYXlOYW1lKTtcbn1cblxuZnVuY3Rpb24gY29kZXhNb2RlbEtpbmRSYW5rKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICByZXR1cm4gW3RhcmdldC5kaXNwbGF5TmFtZSwgdGFyZ2V0LmlkLCB0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZV0uc29tZShcbiAgICAoaWRlbnRpdHkpID0+IGlkZW50aXR5ICYmIGlzT3BlbldlaWdodHNHcHQoaWRlbnRpdHkpLFxuICApXG4gICAgPyAxXG4gICAgOiAwO1xufVxuXG5mdW5jdGlvbiBjb2RleEZhbWlseVJhbmsodGFyZ2V0OiBNb2RlbFRhcmdldCk6IG51bWJlciB7XG4gIGNvbnN0IGZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseSh0YXJnZXQpO1xuICBjb25zdCBpbmRleCA9IGZhbWlseSA/IENPREVYX0ZBTUlMWV9PUkRFUi5pbmRleE9mKGZhbWlseSBhcyBNb2RlbEZhbWlseSkgOiAtMTtcbiAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IENPREVYX0ZBTUlMWV9PUkRFUi5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGNvZGV4VmVyc2lvbih0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICByZXR1cm4gdmVyc2lvblR1cGxlKHRhcmdldC5kaXNwbGF5TmFtZSk7XG59XG5cbmZ1bmN0aW9uIGNvZGV4Q2xhc3NSYW5rKHRhcmdldDogTW9kZWxUYXJnZXQpOiBudW1iZXIge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgY29uc3QgaW5kZXggPSBtb2RlbENsYXNzID8gQ0hBVF9DTEFTU19PUkRFUi5pbmRleE9mKG1vZGVsQ2xhc3MpIDogLTE7XG4gIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiBDSEFUX0NMQVNTX09SREVSLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBPcmRlciBsaXN0ZWQgbW9kZWxzIGluIHRocmVlIGdyb3VwczogbWFqb3ItcHJvdmlkZXIgY2hhdCBmYW1pbGllcywgdGhlXG4gKiByZW1haW5pbmcgY2hhdCBtb2RlbHMsIHRoZW4gZW1iZWRkaW5ncy4gRmFtaWxpZXMga2VlcCBhIGZpeGVkIHByb3ZpZGVyXG4gKiBvcmRlcjsgZWFjaCBmYW1pbHkgYW5kIHRoZSBsYXRlciBncm91cHMgc29ydCBieSB0aGUgcHVibGlzaGVkIGxhYmVsXG4gKiAoYGRpc3BsYXlfbmFtZWAgZm9yIENvZGV4LCBgbmFtZWAgb3RoZXJ3aXNlKS4gTnVtZXJpYyBzZWdtZW50cyBzb3J0XG4gKiBuYXR1cmFsbHkgc28gXCJWZW8gMy4xXCIgcHJlY2VkZXMgXCJWZW8gMy4xMFwiLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQ2F0YWxvZ3VlVGFyZ2V0cyhcbiAgbGVmdDogTW9kZWxUYXJnZXQsXG4gIHJpZ2h0OiBNb2RlbFRhcmdldCxcbiAgbGFiZWw6ICh0YXJnZXQ6IE1vZGVsVGFyZ2V0KSA9PiBzdHJpbmcsXG4pOiBudW1iZXIge1xuICBjb25zdCBncm91cCA9IGNhdGFsb2d1ZUdyb3VwKGxlZnQpIC0gY2F0YWxvZ3VlR3JvdXAocmlnaHQpO1xuICBpZiAoZ3JvdXAgIT09IDApIHJldHVybiBncm91cDtcbiAgY29uc3QgbGVmdEZhbWlseSA9IGNhdGFsb2d1ZUZhbWlseShsZWZ0KTtcbiAgY29uc3QgcmlnaHRGYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHkocmlnaHQpO1xuICBpZiAobGVmdEZhbWlseSAmJiByaWdodEZhbWlseSkge1xuICAgIGNvbnN0IGZhbWlseU9yZGVyID0gbW9kZWxGYW1pbHlSYW5rKGxlZnRGYW1pbHkpIC0gbW9kZWxGYW1pbHlSYW5rKHJpZ2h0RmFtaWx5KTtcbiAgICBpZiAoZmFtaWx5T3JkZXIgIT09IDApIHJldHVybiBmYW1pbHlPcmRlcjtcbiAgfVxuICByZXR1cm4gY29tcGFyZUNhdGFsb2d1ZUxhYmVsKGxhYmVsKGxlZnQpLCBsYWJlbChyaWdodCkpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVHcm91cCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogbnVtYmVyIHtcbiAgaWYgKGlzRW1iZWRkaW5nVGFyZ2V0KHRhcmdldCkpIHJldHVybiAyO1xuICByZXR1cm4gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldCkgPyAwIDogMTtcbn1cblxuY29uc3QgSURFTlRJVFlfUFJFRklYRVMgPSBuZXcgU2V0KFtcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwic3lzdGVtXCIsXG4gIFwiYWlcIixcbiAgXCJtZXRhXCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwib3BlbmFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG5dKTtcblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5KHRhcmdldDogTW9kZWxUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbWJlZGRpbmdUYXJnZXQodGFyZ2V0KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBbdGFyZ2V0LmRpc3BsYXlOYW1lLCB0YXJnZXQuaWQsIHRhcmdldC5lbmRwb2ludD8ubmFtZV0pIHtcbiAgICBpZiAoIWlkZW50aXR5KSBjb250aW51ZTtcbiAgICBjb25zdCBmYW1pbHkgPSBjYXRhbG9ndWVGYW1pbHlGcm9tSWRlbnRpdHkoaWRlbnRpdHkpO1xuICAgIGlmIChmYW1pbHkpIHJldHVybiBmYW1pbHk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlRmFtaWx5RnJvbUlkZW50aXR5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBpZGVudGl0eS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IHN0YXJ0ID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiAhSURFTlRJVFlfUFJFRklYRVMuaGFzKHRva2VuKSk7XG4gIGlmICghc3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChzdGFydCA9PT0gXCJ2ZW9cIikgcmV0dXJuIFwiZ2VtaW5pXCI7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KGlkZW50aXR5KTtcbiAgcmV0dXJuIGZhbWlseSAmJiBzdGFydCA9PT0gZmFtaWx5ID8gZmFtaWx5IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0VtYmVkZGluZ1RhcmdldCh0YXJnZXQ6IE1vZGVsVGFyZ2V0KTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXQuY2FwYWJpbGl0aWVzLmVtYmVkZGluZ3MgPT09IHRydWUgfHwgdGFyZ2V0LmVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVDYXRhbG9ndWVMYWJlbChsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNDaGF0Q2xhc3ModGFyZ2V0OiBNb2RlbFRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBtb2RlbENsYXNzID0gdGFyZ2V0LmVuZHBvaW50Py5jbGFzcztcbiAgcmV0dXJuIG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiBpc0NoYXRDbGFzcyhtb2RlbENsYXNzKTtcbn1cbiJdfQ==