@dbx-tools/model 0.9.40 → 0.9.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -132,6 +132,23 @@ class ceiling logic as `selectModel()`. Classification, fuzzy scoring,
132
132
  family-version order, and variant preference are implemented directly in this
133
133
  package and require no native binding.
134
134
 
135
+ Filter before ranking when a caller needs a specific runtime shape. For example,
136
+ select the best 1,024-dimensional embedding endpoint:
137
+
138
+ ```ts
139
+ const [embedding] = await resolve.searchModels(client, host, {
140
+ modelClass: "embedding",
141
+ dimension: 1024,
142
+ limit: 1,
143
+ });
144
+ ```
145
+
146
+ Search filters compose: use `name` for an exact endpoint, `search` for fuzzy
147
+ name and label matching, `modelClass` for class-aware ranking, `task` for an
148
+ exact serving task, `dimension` or `minDimension`/`maxDimension` for embedding
149
+ shape, `reasoningEffort` for supported reasoning levels, and `requiresTools`
150
+ for complete tool-call support.
151
+
135
152
  ## Work With A Held Catalogue
136
153
 
137
154
  When you already have endpoint summaries, use the pure resolver functions from
@@ -226,8 +243,8 @@ a property of the model (see `isResponsesOnly()` and `responsesUpstreamUrl()`),
226
243
  so a hard-coded string in one package silently diverges when that routing
227
244
  changes. `isResponsesOnly()` covers Codex and GPT 5.4+ endpoints, which reject
228
245
  tool-bearing Chat Completions, while keeping GPT-OSS on its supported Chat path.
229
- The TypeScript helper owns this policy, so Node consumers and generated Python
230
- bindings share one version threshold without loading a native library.
246
+ The TypeScript helper owns this policy so every Node consumer shares one version
247
+ threshold without loading a native library.
231
248
 
232
249
  ## Read Published Model Metadata
233
250
 
package/index.ts CHANGED
@@ -3,7 +3,8 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
6
- export const PACKAGE_VERSION = "0.9.40";
6
+ export const PACKAGE_VERSION = "0.9.46";
7
+ export * as bindings from "./src/bindings.ts";
7
8
  export * as classes from "./src/classes.ts";
8
9
  export * as classify from "./src/classify.ts";
9
10
  export * as fallback from "./src/fallback.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
2
- export declare const PACKAGE_VERSION = "0.9.40";
2
+ export declare const PACKAGE_VERSION = "0.9.46";
3
+ export * as bindings from "./src/bindings.ts";
3
4
  export * as classes from "./src/classes.ts";
4
5
  export * as classify from "./src/classify.ts";
5
6
  export * as fallback from "./src/fallback.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,8 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
5
- export const PACKAGE_VERSION = "0.9.40";
5
+ export const PACKAGE_VERSION = "0.9.46";
6
+ export * as bindings from "./src/bindings.js";
6
7
  export * as classes from "./src/classes.js";
7
8
  export * as classify from "./src/classify.js";
8
9
  export * as fallback from "./src/fallback.js";
@@ -23,4 +24,4 @@ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model
23
24
  export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
24
25
  export { REASONING_LEVELS } from "./src/reasoning-translation.js";
25
26
  export * from "./exports.js";
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssYUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxvQkFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNLLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSWxFLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9tb2RlbFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjQwXCI7XG5leHBvcnQgKiBhcyBjbGFzc2VzIGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGZhbGxiYWNrIGZyb20gXCIuL3NyYy9mYWxsYmFjay50c1wiO1xuZXhwb3J0ICogYXMgaW52b2tlIGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhIGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0ICogYXMgbWV0YWRhdGFDYWNoZSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2F0YWxvZyBmcm9tIFwiLi9zcmMvbW9kZWwtY2F0YWxvZy50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxDbGllbnQgZnJvbSBcIi4vc3JjL21vZGVsLWNsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgcG9saWN5IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ1RyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHJlc29sdmUgZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmdXaXJlIGZyb20gXCIuL3NyYy9zZXJ2aW5nLXdpcmUudHNcIjtcbmV4cG9ydCB7IENIQVRfQ0xBU1NfT1JERVIsIE1PREVMX0NMQVNTX09SREVSIH0gZnJvbSBcIi4vc3JjL2NsYXNzZXMudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX01PREVMX0lEUyB9IGZyb20gXCIuL3NyYy9mYWxsYmFjay50c1wiO1xuZXhwb3J0IHsgSU5WT0NBVElPTlNfU1VGRklYLCBSRVNQT05TRVNfUEFUSCwgT1BFTl9SRVNQT05TRVNfUEFUSCwgQ0hBVF9DT01QTEVUSU9OU19QQVRILCBBSV9HQVRFV0FZX0NPREVYX1JFU1BPTlNFU19QQVRILCBBTlRIUk9QSUNfTUVTU0FHRVNfUEFUSCB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0aGVudGljYXRpbmdDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2ludm9rZS50c1wiO1xuZXhwb3J0IHsgTU9ERUxfTUVUQURBVEFfVFRMX01TLCBNT0RFTF9SQVRFX0xJTUlUU19VUkwsIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCwgUVVFUllfUkVBU09OX01PREVMU19VUkwsIFJFVElSRURfTU9ERUxTX1VSTCwgV0VCX1NFQVJDSF9NT0RFTFNfVVJMIH0gZnJvbSBcIi4vc3JjL21ldGFkYXRhLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1ldGFkYXRhQ2FjaGVSZWNvcmQsIE1ldGFkYXRhQ2FjaGVPcHRpb25zLCBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dCwgTWV0YWRhdGFDYWNoZSB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS1jYWNoZS50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMsIERFRkFVTFRfRlVaWllfVEhSRVNIT0xEIH0gZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSwgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxBdXRoT3B0aW9ucywgTW9kZWxDbGllbnRPcHRpb25zLCBNb2RlbENsaWVudFN0YXR1cywgTW9kZWxQcm90b2NvbCwgTW9kZWxSb3V0ZUlucHV0LCBNb2RlbFJvdXRlLCBNb2RlbENsaWVudCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlLCBSZXdyaXR0ZW5TZXJ2aW5nUmVxdWVzdCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLXdpcmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0ssT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEwsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJbEUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNDZcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nV2lyZSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfTEVWRUxTIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZWFzb25pbmdMZXZlbCwgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZpbmdDaGF0TWVzc2FnZSwgUmV3cml0dGVuU2VydmluZ1JlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
@@ -0,0 +1,137 @@
1
+ {
2
+ "name": "@dbx-tools/model",
3
+ "description": "Workspace-aware Databricks Model Serving selection",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/reggie-db/dbx-tools.git",
7
+ "directory": "packages/js/node/model"
8
+ },
9
+ "scripts": {
10
+ "build": "projen build",
11
+ "compile": "projen compile",
12
+ "default": "projen default",
13
+ "metadata": "projen metadata",
14
+ "package": "projen package",
15
+ "post-compile": "projen post-compile",
16
+ "pre-compile": "projen pre-compile",
17
+ "prepack": "projen prepack",
18
+ "test": "projen test",
19
+ "watch": "projen watch",
20
+ "projen": "projen"
21
+ },
22
+ "devDependencies": {
23
+ "@types/cacache": "^20.0.1",
24
+ "@types/node": "catalog:",
25
+ "cheerio": "^1.2.0",
26
+ "typescript": "^5.9.3"
27
+ },
28
+ "dependencies": {
29
+ "@databricks/appkit": "catalog:",
30
+ "@dbx-tools/appkit": "workspace:^",
31
+ "@dbx-tools/auth": "workspace:^",
32
+ "@dbx-tools/shared-auth": "workspace:^",
33
+ "@dbx-tools/shared-core": "workspace:^",
34
+ "@dbx-tools/shared-model": "workspace:^",
35
+ "cacache": "catalog:",
36
+ "env-paths": "catalog:",
37
+ "fuse.js": "^7.4.2"
38
+ },
39
+ "main": "index.ts",
40
+ "license": "Apache-2.0",
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "main": "./lib/index.js",
44
+ "types": "./lib/index.d.ts",
45
+ "exports": {
46
+ ".": {
47
+ "types": "./lib/index.d.ts",
48
+ "default": "./lib/index.js"
49
+ },
50
+ "./bindings": {
51
+ "types": "./lib/src/bindings.d.ts",
52
+ "default": "./lib/src/bindings.js"
53
+ },
54
+ "./classes": {
55
+ "types": "./lib/src/classes.d.ts",
56
+ "default": "./lib/src/classes.js"
57
+ },
58
+ "./classify": {
59
+ "types": "./lib/src/classify.d.ts",
60
+ "default": "./lib/src/classify.js"
61
+ },
62
+ "./fallback": {
63
+ "types": "./lib/src/fallback.d.ts",
64
+ "default": "./lib/src/fallback.js"
65
+ },
66
+ "./invoke": {
67
+ "types": "./lib/src/invoke.d.ts",
68
+ "default": "./lib/src/invoke.js"
69
+ },
70
+ "./metadata-cache": {
71
+ "types": "./lib/src/metadata-cache.d.ts",
72
+ "default": "./lib/src/metadata-cache.js"
73
+ },
74
+ "./metadata": {
75
+ "types": "./lib/src/metadata.d.ts",
76
+ "default": "./lib/src/metadata.js"
77
+ },
78
+ "./model-catalog": {
79
+ "types": "./lib/src/model-catalog.d.ts",
80
+ "default": "./lib/src/model-catalog.js"
81
+ },
82
+ "./model-client": {
83
+ "types": "./lib/src/model-client.d.ts",
84
+ "default": "./lib/src/model-client.js"
85
+ },
86
+ "./policy": {
87
+ "types": "./lib/src/policy.d.ts",
88
+ "default": "./lib/src/policy.js"
89
+ },
90
+ "./reasoning-translation": {
91
+ "types": "./lib/src/reasoning-translation.d.ts",
92
+ "default": "./lib/src/reasoning-translation.js"
93
+ },
94
+ "./resolve": {
95
+ "types": "./lib/src/resolve.d.ts",
96
+ "default": "./lib/src/resolve.js"
97
+ },
98
+ "./serving-wire": {
99
+ "types": "./lib/src/serving-wire.d.ts",
100
+ "default": "./lib/src/serving-wire.js"
101
+ },
102
+ "./package.json": "./package.json"
103
+ }
104
+ },
105
+ "version": "0.9.46",
106
+ "types": "index.ts",
107
+ "dbxToolsConfig": {
108
+ "tags": [
109
+ "node"
110
+ ]
111
+ },
112
+ "type": "module",
113
+ "exports": {
114
+ ".": "./index.ts",
115
+ "./bindings": "./src/bindings.ts",
116
+ "./classes": "./src/classes.ts",
117
+ "./classify": "./src/classify.ts",
118
+ "./fallback": "./src/fallback.ts",
119
+ "./invoke": "./src/invoke.ts",
120
+ "./metadata-cache": "./src/metadata-cache.ts",
121
+ "./metadata": "./src/metadata.ts",
122
+ "./model-catalog": "./src/model-catalog.ts",
123
+ "./model-client": "./src/model-client.ts",
124
+ "./policy": "./src/policy.ts",
125
+ "./reasoning-translation": "./src/reasoning-translation.ts",
126
+ "./resolve": "./src/resolve.ts",
127
+ "./serving-wire": "./src/serving-wire.ts",
128
+ "./package.json": "./package.json"
129
+ },
130
+ "files": [
131
+ "index.ts",
132
+ "src",
133
+ "exports.ts",
134
+ "lib"
135
+ ],
136
+ "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"bunx projen\"."
137
+ }
@@ -1,5 +1,5 @@
1
1
  import { load } from "cheerio";
2
- import { modelSearchQuery } from "./policy.js";
2
+ import { inheritsNativeWebSearch, modelSearchQuery } from "./policy.js";
3
3
  import { parseReasoning, REASONING_LEVELS, uniqueReasoningLevels, } from "./reasoning-translation.js";
4
4
  const ACCEPTED_VALUES_PATTERN = /(?:accepted values(?:\s+are|\s+vary)?|accepts(?:\s+values?(?:\s+of)?)?)\s*:?\s*([^.]+)/gi;
5
5
  const FOR_MODEL_PATTERN = /For\s+([^,]+?),\s+(?:this parameter accepts(?:\s+values?\s+of)?|the (?:`?reasoning_effort`?|effort) parameter accepts(?:\s+values?\s+of)?)\s*([^.]+)/gi;
@@ -121,7 +121,10 @@ export function parseReasoningModels(html, generatedAt) {
121
121
  if (!headers.some((header) => header.includes("parameter")))
122
122
  return;
123
123
  rows.slice(1).each((__, row) => {
124
- const cells = $(row).find("th, td").toArray().map((cell) => $(cell));
124
+ const cells = $(row)
125
+ .find("th, td")
126
+ .toArray()
127
+ .map((cell) => $(cell));
125
128
  if (cells.length < 2)
126
129
  return;
127
130
  const modelNames = reasoningModelNamesFromCell(cells[0], $);
@@ -238,7 +241,6 @@ function modelsAfterHeading($, headingId) {
238
241
  ].sort();
239
242
  }
240
243
  function nativeWebSearchModels($, responses) {
241
- const families = new Set();
242
244
  const models = new Set();
243
245
  let nativeSection = false;
244
246
  for (const element of sectionElements($, "supported-models")) {
@@ -257,11 +259,10 @@ function nativeWebSearchModels($, responses) {
257
259
  if (!model)
258
260
  continue;
259
261
  models.add(model);
260
- families.add(model.split("-", 1)[0]);
261
262
  }
262
263
  }
263
264
  for (const model of responses) {
264
- if (families.has(model.split("-", 1)[0]))
265
+ if (inheritsNativeWebSearch(model, models))
265
266
  models.add(model);
266
267
  }
267
268
  return [...models].sort();
@@ -279,11 +280,13 @@ function codeValuesAfterHeading($, headingId) {
279
280
  }
280
281
  function sectionElements($, headingId) {
281
282
  const heading = $(`#${headingId}`).first();
282
- if (heading.length === 0)
283
+ if (heading.length === 0) {
283
284
  throw new Error(`Databricks capability page is missing section ${headingId}`);
285
+ }
284
286
  const level = headingLevel(nodeTagName(heading.get(0)));
285
- if (level === undefined)
287
+ if (level === undefined) {
286
288
  throw new Error(`Databricks capability section ${headingId} is not a heading`);
289
+ }
287
290
  const elements = [];
288
291
  let sibling = heading.next();
289
292
  while (sibling.length > 0) {
@@ -326,4 +329,4 @@ function number(value) {
326
329
  function sortRecord(record) {
327
330
  return Object.fromEntries(Object.entries(record).sort(([left], [right]) => left.localeCompare(right)));
328
331
  }
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBU2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxNQUFNLHVCQUF1QixHQUMzQiwwRkFBMEYsQ0FBQztBQUM3RixNQUFNLGlCQUFpQixHQUNyQix3SkFBd0osQ0FBQztBQUMzSixNQUFNLGFBQWEsR0FBRyx3REFBd0QsQ0FBQztBQUMvRSxNQUFNLGtCQUFrQixHQUFHLHFDQUFxQyxDQUFDO0FBQ2pFLHNGQUFzRjtBQUN0RixNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLE1BQU07SUFDTixTQUFTO0lBQ1QsS0FBSztJQUNMLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFlBQVk7SUFDWixXQUFXO0lBQ1gsT0FBTztJQUNQLFlBQVk7SUFDWixLQUFLO0lBQ0wsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxXQUFtQjtJQUNsRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNqQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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Q0FBQyxNQUFNLENBQUM7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBeUI7SUFDdkMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDckUsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFJLE1BQW1DO0lBQ3hELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDNUUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkLCB0eXBlIENoZWVyaW9BUEkgfSBmcm9tIFwiY2hlZXJpb1wiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlLFxuICBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCxcbiAgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG4gIFJldGlyZWRNb2RlbHNTbmFwc2hvdCxcbn0gZnJvbSBcIi4vX21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQgeyBtb2RlbFNlYXJjaFF1ZXJ5IH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZVJlYXNvbmluZyxcbiAgUkVBU09OSU5HX0xFVkVMUyxcbiAgdHlwZSBSZWFzb25pbmdMZXZlbCxcbiAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzLFxufSBmcm9tIFwiLi9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcblxudHlwZSBTZWxlY3Rpb24gPSBSZXR1cm5UeXBlPENoZWVyaW9BUEk+O1xuXG5jb25zdCBBQ0NFUFRFRF9WQUxVRVNfUEFUVEVSTiA9XG4gIC8oPzphY2NlcHRlZCB2YWx1ZXMoPzpcXHMrYXJlfFxccyt2YXJ5KT98YWNjZXB0cyg/Olxccyt2YWx1ZXM/KD86XFxzK29mKT8pPylcXHMqOj9cXHMqKFteLl0rKS9naTtcbmNvbnN0IEZPUl9NT0RFTF9QQVRURVJOID1cbiAgL0ZvclxccysoW14sXSs/KSxcXHMrKD86dGhpcyBwYXJhbWV0ZXIgYWNjZXB0cyg/Olxccyt2YWx1ZXM/XFxzK29mKT98dGhlICg/OmA/cmVhc29uaW5nX2VmZm9ydGA/fGVmZm9ydCkgcGFyYW1ldGVyIGFjY2VwdHMoPzpcXHMrdmFsdWVzP1xccytvZik/KVxccyooW14uXSspL2dpO1xuY29uc3QgVE9LRU5fUEFUVEVSTiA9IC8nKFteJ10rKSd8XCIoW15cIl0rKVwifGAoW15gXSspYHxcXGIoW2Etel1bYS16MC05Xy1dKilcXGIvZ2k7XG5jb25zdCBNT0RFTF9DT0RFX1BBVFRFUk4gPSAvXFxiZGF0YWJyaWNrcy1bYS16MC05XVthLXowLTkuXy1dKi9naTtcbi8qKiBXaXJlIHRva2VucyBhZHZlcnRpc2VkIGluIERhdGFicmlja3MgZG9jczsgZXhjbHVkZXMgcHJvc2Ugd29yZHMgbGlrZSBgZGVmYXVsdGAuICovXG5jb25zdCBET0NVTUVOVEFUSU9OX0VGRk9SVF9UT0tFTlMgPSBuZXcgU2V0KFtcbiAgXCJub25lXCIsXG4gIFwibWluaW1hbFwiLFxuICBcImxvd1wiLFxuICBcIm1lZGl1bVwiLFxuICBcImhpZ2hcIixcbiAgXCJ4aGlnaFwiLFxuICBcImV4dHJhLWhpZ2hcIixcbiAgXCJleHRyYWhpZ2hcIixcbiAgXCJ1bHRyYVwiLFxuICBcInVsdHJhLWhpZ2hcIixcbiAgXCJtYXhcIixcbiAgXCJtYXhpbXVtXCIsXG4gIFwiZGlzYWJsZWRcIixcbl0pO1xuXG4vKiogUGFyc2UgcmV0aXJlZCBtb2RlbCBuYW1lcyBmcm9tIERhdGFicmlja3MgcmV0aXJlbWVudC1wb2xpY3kgSFRNTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldGlyZWRNb2RlbHMoaHRtbDogc3RyaW5nLCBnZW5lcmF0ZWRBdDogbnVtYmVyKTogUmV0aXJlZE1vZGVsc1NuYXBzaG90IHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IG1vZGVscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAkKFwidGFibGVcIikuZWFjaCgoXywgdGFibGUpID0+IHtcbiAgICBjb25zdCByb3dzID0gJCh0YWJsZSkuZmluZChcInRyXCIpO1xuICAgIGNvbnN0IGhlYWRlciA9IGNvbGxhcHNlVGV4dCgkKHJvd3MuZ2V0KDApKS5maW5kKFwidGgsIHRkXCIpLmZpcnN0KCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhlYWRlciAhPT0gXCJvcGVuIG1vZGVsXCIgJiYgaGVhZGVyICE9PSBcInBhcnRuZXIgbW9kZWxcIikgcmV0dXJuO1xuICAgIHJvd3Muc2xpY2UoMSkuZWFjaCgoX18sIHJvdykgPT4ge1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGNvbGxhcHNlVGV4dCgkKHJvdykuZmluZChcInRoLCB0ZFwiKS5maXJzdCgpKS5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IG5hbWUudHJpbSgpO1xuICAgICAgICBpZiAodHJpbW1lZCkgbW9kZWxzLmFkZCh0cmltbWVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChtb2RlbHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyByZXRpcmVtZW50IHRhYmxlcyBjb250YWluZWQgbm8gbW9kZWwgbmFtZXNcIik7XG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGVkQXQsXG4gICAgbW9kZWxzOiBbLi4ubW9kZWxzXS5zb3J0KChsZWZ0LCByaWdodCkgPT5cbiAgICAgIGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCwgXCJlblwiLCB7IHNlbnNpdGl2aXR5OiBcImJhc2VcIiB9KSxcbiAgICApLFxuICB9O1xufVxuXG4vKiogUGFyc2UgUmVzcG9uc2VzIGFuZCB3ZWItc2VhcmNoIGRvY3VtZW50YXRpb24gaW50byBtb2RlbCBjYXBhYmlsaXR5IHNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNb2RlbENhcGFiaWxpdGllcyhcbiAgcmVzcG9uc2VzSHRtbDogc3RyaW5nLFxuICB3ZWJTZWFyY2hIdG1sOiBzdHJpbmcsXG4gIGdlbmVyYXRlZEF0OiBudW1iZXIsXG4pOiBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90IHtcbiAgY29uc3QgcmVzcG9uc2VzRG9jdW1lbnQgPSBsb2FkKHJlc3BvbnNlc0h0bWwpO1xuICBjb25zdCByZXNwb25zZXMgPSBtb2RlbHNBZnRlckhlYWRpbmcocmVzcG9uc2VzRG9jdW1lbnQsIFwiZGF0YWJyaWNrcy1ob3N0ZWQtZm91bmRhdGlvbi1tb2RlbHNcIik7XG4gIGlmIChyZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBPcGVuQUkgUmVzcG9uc2VzIG1vZGVsc1wiKTtcbiAgfVxuICBjb25zdCBpbnB1dFR5cGVzID0gc2VjdGlvbkVsZW1lbnRzKHJlc3BvbnNlc0RvY3VtZW50LCBcInN1cHBvcnRlZC1pbnB1dC10eXBlc1wiKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGNvbGxhcHNlVGV4dChlbGVtZW50KSlcbiAgICAuam9pbihcIiBcIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaW5wdXRUeXBlV29yZHMgPSBuZXcgU2V0KGlucHV0VHlwZXMuc3BsaXQoL1teYS16MC05XSsvKS5maWx0ZXIoQm9vbGVhbikpO1xuICBjb25zdCBpbWFnZUlucHV0ID0gaW5wdXRUeXBlV29yZHMuaGFzKFwidGV4dFwiKSAmJiBpbnB1dFR5cGVXb3Jkcy5oYXMoXCJpbWFnZVwiKSA/IHJlc3BvbnNlcyA6IFtdO1xuICBjb25zdCBhcHBseVBhdGNoID0gY29kZVZhbHVlc0FmdGVySGVhZGluZyhyZXNwb25zZXNEb2N1bWVudCwgXCJsaW1pdGF0aW9uc1wiKS5pbmNsdWRlcyhcbiAgICBcImFwcGx5X3BhdGNoXCIsXG4gIClcbiAgICA/IHJlc3BvbnNlc1xuICAgIDogW107XG4gIGNvbnN0IHdlYlNlYXJjaCA9IG5hdGl2ZVdlYlNlYXJjaE1vZGVscyhsb2FkKHdlYlNlYXJjaEh0bWwpLCByZXNwb25zZXMpO1xuICBpZiAod2ViU2VhcmNoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbmF0aXZlIHdlYi1zZWFyY2ggbW9kZWxzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGVkQXQsXG4gICAgY2FwYWJpbGl0aWVzOiB7IHJlc3BvbnNlcywgaW1hZ2VJbnB1dCwgYXBwbHlQYXRjaCwgd2ViU2VhcmNoIH0sXG4gIH07XG59XG5cbi8qKiBQYXJzZSBwYXktcGVyLXRva2VuIGxpbWl0cyBmcm9tIERhdGFicmlja3MgRm91bmRhdGlvbiBNb2RlbCBBUEkgSFRNTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsUmF0ZUxpbWl0cyhodG1sOiBzdHJpbmcsIGdlbmVyYXRlZEF0OiBudW1iZXIpOiBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCB7XG4gIGNvbnN0ICQgPSBsb2FkKGh0bWwpO1xuICBjb25zdCBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlW1wibW9kZWxzXCJdW3N0cmluZ10+ID0ge307XG4gICQoXCJ0YWJsZVwiKS5lYWNoKChfLCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSAkKHRhYmxlKS5maW5kKFwidHJcIik7XG4gICAgY29uc3QgaGVhZGVycyA9ICQocm93cy5nZXQoMCkpXG4gICAgICAuZmluZChcInRoLCB0ZFwiKVxuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoY2VsbCkgPT4gY29sbGFwc2VUZXh0KCQoY2VsbCkpLnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IG1vZGVsSW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwibW9kZWxcIikpO1xuICAgIGNvbnN0IGlucHV0SW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwiaXRwbVwiKSk7XG4gICAgY29uc3Qgb3V0cHV0SW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwib3RwbVwiKSk7XG4gICAgY29uc3QgcXVlcnlJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJxcGhcIikpO1xuICAgIGlmIChtb2RlbEluZGV4IDwgMCB8fCBpbnB1dEluZGV4IDwgMCB8fCBvdXRwdXRJbmRleCA8IDApIHJldHVybjtcbiAgICByb3dzLnNsaWNlKDEpLmVhY2goKF9fLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IGNlbGxzID0gJChyb3cpXG4gICAgICAgIC5maW5kKFwidGgsIHRkXCIpXG4gICAgICAgIC50b0FycmF5KClcbiAgICAgICAgLm1hcCgoY2VsbCkgPT4gY29sbGFwc2VUZXh0KCQoY2VsbCkpKTtcbiAgICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KGNlbGxzW21vZGVsSW5kZXhdKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgICBtb2RlbHNba2V5XSA9IHtcbiAgICAgICAgaW5wdXRUb2tlbnNQZXJNaW51dGU6IG51bWJlcihjZWxsc1tpbnB1dEluZGV4XSksXG4gICAgICAgIG91dHB1dFRva2Vuc1Blck1pbnV0ZTogbnVtYmVyKGNlbGxzW291dHB1dEluZGV4XSksXG4gICAgICAgIHF1ZXJpZXNQZXJIb3VyOiBxdWVyeUluZGV4IDwgMCA/IG51bGwgOiBudW1iZXIoY2VsbHNbcXVlcnlJbmRleF0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIGlmIChPYmplY3Qua2V5cyhtb2RlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgbW9kZWwtbGltaXQgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbW9kZWxzXCIpO1xuICB9XG4gIHJldHVybiB7IGdlbmVyYXRlZEF0LCBjYXRhbG9ndWU6IHsgbW9kZWxzOiBzb3J0UmVjb3JkKG1vZGVscykgfSB9O1xufVxuXG4vKiogUGFyc2UgcmVhc29uaW5nLWVmZm9ydCBsYWRkZXJzIGZyb20gdGhlIFF1ZXJ5IHJlYXNvbmluZyBtb2RlbHMgSFRNTCB0YWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZ01vZGVscyhcbiAgaHRtbDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBdDogbnVtYmVyLFxuKTogUmVhc29uaW5nTW9kZWxzU25hcHNob3Qge1xuICBjb25zdCAkID0gbG9hZChodG1sKTtcbiAgY29uc3QgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBSZWFzb25pbmdMZXZlbFtdPiA9IHt9O1xuICAkKFwidGFibGVcIikuZWFjaCgoXywgdGFibGUpID0+IHtcbiAgICBjb25zdCByb3dzID0gJCh0YWJsZSkuZmluZChcInRyXCIpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSAkKHJvd3MuZ2V0KDApKVxuICAgICAgLmZpbmQoXCJ0aCwgdGRcIilcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXAoKGNlbGwpID0+IGNvbGxhcHNlVGV4dCgkKGNlbGwpKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoIWhlYWRlcnMuc29tZSgoaGVhZGVyKSA9PiBoZWFkZXIuaW5jbHVkZXMoXCJtb2RlbFwiKSkpIHJldHVybjtcbiAgICBpZiAoIWhlYWRlcnMuc29tZSgoaGVhZGVyKSA9PiBoZWFkZXIuaW5jbHVkZXMoXCJwYXJhbWV0ZXJcIikpKSByZXR1cm47XG4gICAgcm93cy5zbGljZSgxKS5lYWNoKChfXywgcm93KSA9PiB7XG4gICAgICBjb25zdCBjZWxscyA9ICQocm93KS5maW5kKFwidGgsIHRkXCIpLnRvQXJyYXkoKS5tYXAoKGNlbGwpID0+ICQoY2VsbCkpO1xuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZXMgPSByZWFzb25pbmdNb2RlbE5hbWVzRnJvbUNlbGwoY2VsbHNbMF0hLCAkKTtcbiAgICAgIGlmIChtb2RlbE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyYW1ldGVyc1RleHQgPSBjb2xsYXBzZVRleHQoY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV0hKTtcbiAgICAgIGNvbnN0IHBlck1vZGVsID0gcmVhc29uaW5nTGV2ZWxzQnlNb2RlbFNlY3Rpb24ocGFyYW1ldGVyc1RleHQsIG1vZGVsTmFtZXMpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBlck1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgbGV2ZWxzXSBvZiBPYmplY3QuZW50cmllcyhwZXJNb2RlbCkpIHtcbiAgICAgICAgICBpZiAobGV2ZWxzLmxlbmd0aCA+IDApIG1vZGVsc1trZXldID0gc29ydFJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlZCA9IHNvcnRSZWFzb25pbmdMZXZlbHMoZXh0cmFjdEFjY2VwdGVkUmVhc29uaW5nTGV2ZWxzKHBhcmFtZXRlcnNUZXh0KSk7XG4gICAgICBpZiAoc2hhcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG1vZGVsTmFtZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbW9kZWxLZXkobmFtZSk7XG4gICAgICAgIGlmIChrZXkpIG1vZGVsc1trZXldID0gc2hhcmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKG1vZGVscykubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyByZWFzb25pbmcgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbW9kZWwgZWZmb3J0IGxhZGRlcnNcIik7XG4gIH1cbiAgcmV0dXJuIHsgZ2VuZXJhdGVkQXQsIGNhdGFsb2d1ZTogeyBtb2RlbHM6IHNvcnRSZWNvcmQobW9kZWxzKSB9IH07XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsTmFtZXNGcm9tQ2VsbChjZWxsOiBTZWxlY3Rpb24sICQ6IENoZWVyaW9BUEkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNlbGwuZmluZChcImNvZGVcIikuZWFjaCgoXywgY29kZSkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBjb2xsYXBzZVRleHQoJChjb2RlKSk7XG4gICAgaWYgKHRleHQuc3RhcnRzV2l0aChcImRhdGFicmlja3MtXCIpKSBuYW1lcy5hZGQodGV4dCk7XG4gIH0pO1xuICBpZiAobmFtZXMuc2l6ZSA9PT0gMCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgY29sbGFwc2VUZXh0KGNlbGwpLm1hdGNoQWxsKE1PREVMX0NPREVfUEFUVEVSTikpIHtcbiAgICAgIG5hbWVzLmFkZChtYXRjaFswXSEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5hbWVzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFjY2VwdGVkUmVhc29uaW5nTGV2ZWxzKHRleHQ6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBsZXZlbHM6IFJlYXNvbmluZ0xldmVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKEFDQ0VQVEVEX1ZBTFVFU19QQVRURVJOKSkge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gbWF0Y2hbMV07XG4gICAgaWYgKCFmcmFnbWVudCB8fCAvdmFyeSBieSBtb2RlbC9pLnRlc3QoZnJhZ21lbnQpKSBjb250aW51ZTtcbiAgICBsZXZlbHMucHVzaCguLi5kb2N1bWVudGF0aW9uRWZmb3J0TGV2ZWxzKGZyYWdtZW50KSk7XG4gIH1cbiAgcmV0dXJuIGxldmVscztcbn1cblxuZnVuY3Rpb24gcmVhc29uaW5nTGV2ZWxzQnlNb2RlbFNlY3Rpb24oXG4gIHBhcmFtZXRlcnNUZXh0OiBzdHJpbmcsXG4gIHJvd01vZGVsczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWxbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBwYXJhbWV0ZXJzVGV4dC5tYXRjaEFsbChGT1JfTU9ERUxfUEFUVEVSTikpIHtcbiAgICBjb25zdCBsYWJlbCA9IG1hdGNoWzFdPy50cmltKCk7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBtYXRjaFsyXTtcbiAgICBpZiAoIWxhYmVsIHx8ICFmcmFnbWVudCkgY29udGludWU7XG4gICAgY29uc3QgbGV2ZWxzID0gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGRvY3VtZW50YXRpb25FZmZvcnRMZXZlbHMoZnJhZ21lbnQpKTtcbiAgICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHJvd01vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiByZWFzb25pbmdNb2RlbExhYmVsTWF0Y2hlcyhsYWJlbCwgbW9kZWwpKTtcbiAgICAvLyBPbmx5IGF0dGFjaCBleHBsaWNpdCBcIkZvciA8bW9kZWw+XCIgY2xhdXNlcyB0byBtb2RlbHMgbGlzdGVkIGluIHRoZSByb3cuXG4gICAgaWYgKG1hdGNoZWQubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBtYXRjaGVkKSB7XG4gICAgICBjb25zdCBrZXkgPSBtb2RlbEtleSh0YXJnZXQpO1xuICAgICAgaWYgKGtleSkgcmVzdWx0W2tleV0gPSBzb3J0UmVhc29uaW5nTGV2ZWxzKGxldmVscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRvY3VtZW50YXRpb25FZmZvcnRMZXZlbHMoZnJhZ21lbnQ6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICByZXR1cm4gcmVhc29uaW5nVG9rZW5zRnJvbUZyYWdtZW50KGZyYWdtZW50KS5mbGF0TWFwKCh0b2tlbikgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0b2tlbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpO1xuICAgIGlmIChcbiAgICAgICFET0NVTUVOVEFUSU9OX0VGRk9SVF9UT0tFTlMuaGFzKG5vcm1hbGl6ZWQpICYmXG4gICAgICAhRE9DVU1FTlRBVElPTl9FRkZPUlRfVE9LRU5TLmhhcyh0b2tlbi50b0xvd2VyQ2FzZSgpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBsZXZlbCA9IHBhcnNlUmVhc29uaW5nKHRva2VuKTtcbiAgICByZXR1cm4gbGV2ZWwgPyBbbGV2ZWxdIDogW107XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzb3J0UmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICByZXR1cm4gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscykuc29ydChcbiAgICAobGVmdCwgcmlnaHQpID0+IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihsZWZ0KSAtIFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihyaWdodCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsTGFiZWxNYXRjaGVzKGxhYmVsOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbGVmdCA9IGxhYmVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIlwiKTtcbiAgY29uc3QgcmlnaHQgPSBtb2RlbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzLS8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCJcIik7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCByaWdodC5pbmNsdWRlcyhsZWZ0KSB8fCBsZWZ0LmluY2x1ZGVzKHJpZ2h0KTtcbn1cblxuZnVuY3Rpb24gcmVhc29uaW5nVG9rZW5zRnJvbUZyYWdtZW50KGZyYWdtZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGZyYWdtZW50Lm1hdGNoQWxsKFRPS0VOX1BBVFRFUk4pKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXJ0WzFdID8/IHBhcnRbMl0gPz8gcGFydFszXSA/PyBwYXJ0WzRdO1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4gPT09IFwiYW5kXCIgfHwgdG9rZW4gPT09IFwib3JcIiB8fCB0b2tlbiA9PT0gXCJvZlwiKSBjb250aW51ZTtcbiAgICB0b2tlbnMucHVzaCh0b2tlbi5yZXBsYWNlKC9eW1wiJ2BdK3xbXCInYF0rJC9nLCBcIlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gbW9kZWxzQWZ0ZXJIZWFkaW5nKCQ6IENoZWVyaW9BUEksIGhlYWRpbmdJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoY29kZVZhbHVlc0FmdGVySGVhZGluZygkLCBoZWFkaW5nSWQpLmZsYXRNYXAoKHZhbHVlKSA9PiBtb2RlbEtleSh2YWx1ZSkgPz8gW10pKSxcbiAgXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5hdGl2ZVdlYlNlYXJjaE1vZGVscygkOiBDaGVlcmlvQVBJLCByZXNwb25zZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBmYW1pbGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtb2RlbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IG5hdGl2ZVNlY3Rpb24gPSBmYWxzZTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHNlY3Rpb25FbGVtZW50cygkLCBcInN1cHBvcnRlZC1tb2RlbHNcIikpIHtcbiAgICBpZiAoaGVhZGluZ0xldmVsKG5vZGVUYWdOYW1lKGVsZW1lbnQuZ2V0KDApKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmF0aXZlU2VjdGlvbiA9ICFjb2xsYXBzZVRleHQoZWxlbWVudCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInZpYSBtY3BcIik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFuYXRpdmVTZWN0aW9uKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZXMgPSBub2RlVGFnTmFtZShlbGVtZW50LmdldCgwKSkgPT09IFwiY29kZVwiID8gW2NvbGxhcHNlVGV4dChlbGVtZW50KV0gOiBbXTtcbiAgICBlbGVtZW50LmZpbmQoXCJjb2RlXCIpLmVhY2goKF8sIGNvZGUpID0+IHtcbiAgICAgIHZhbHVlcy5wdXNoKGNvbGxhcHNlVGV4dCgkKGNvZGUpKSk7XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gbW9kZWxLZXkodmFsdWUpO1xuICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICBtb2RlbHMuYWRkKG1vZGVsKTtcbiAgICAgIGZhbWlsaWVzLmFkZChtb2RlbC5zcGxpdChcIi1cIiwgMSlbMF0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJlc3BvbnNlcykge1xuICAgIGlmIChmYW1pbGllcy5oYXMobW9kZWwuc3BsaXQoXCItXCIsIDEpWzBdKSkgbW9kZWxzLmFkZChtb2RlbCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5tb2RlbHNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29kZVZhbHVlc0FmdGVySGVhZGluZygkOiBDaGVlcmlvQVBJLCBoZWFkaW5nSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc2VjdGlvbkVsZW1lbnRzKCQsIGhlYWRpbmdJZCkpIHtcbiAgICBpZiAobm9kZVRhZ05hbWUoZWxlbWVudC5nZXQoMCkpID09PSBcImNvZGVcIikgdmFsdWVzLnB1c2goY29sbGFwc2VUZXh0KGVsZW1lbnQpKTtcbiAgICBlbGVtZW50LmZpbmQoXCJjb2RlXCIpLmVhY2goKF8sIGNvZGUpID0+IHtcbiAgICAgIHZhbHVlcy5wdXNoKGNvbGxhcHNlVGV4dCgkKGNvZGUpKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gc2VjdGlvbkVsZW1lbnRzKCQ6IENoZWVyaW9BUEksIGhlYWRpbmdJZDogc3RyaW5nKTogU2VsZWN0aW9uW10ge1xuICBjb25zdCBoZWFkaW5nID0gJChgIyR7aGVhZGluZ0lkfWApLmZpcnN0KCk7XG4gIGlmIChoZWFkaW5nLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgY2FwYWJpbGl0eSBwYWdlIGlzIG1pc3Npbmcgc2VjdGlvbiAke2hlYWRpbmdJZH1gKTtcbiAgY29uc3QgbGV2ZWwgPSBoZWFkaW5nTGV2ZWwobm9kZVRhZ05hbWUoaGVhZGluZy5nZXQoMCkpKTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGNhcGFiaWxpdHkgc2VjdGlvbiAke2hlYWRpbmdJZH0gaXMgbm90IGEgaGVhZGluZ2ApO1xuICBjb25zdCBlbGVtZW50czogU2VsZWN0aW9uW10gPSBbXTtcbiAgbGV0IHNpYmxpbmcgPSBoZWFkaW5nLm5leHQoKTtcbiAgd2hpbGUgKHNpYmxpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNpYmxpbmdMZXZlbCA9IGhlYWRpbmdMZXZlbChub2RlVGFnTmFtZShzaWJsaW5nLmdldCgwKSkpO1xuICAgIGlmIChzaWJsaW5nTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBzaWJsaW5nTGV2ZWwgPD0gbGV2ZWwpIGJyZWFrO1xuICAgIGVsZW1lbnRzLnB1c2goc2libGluZyk7XG4gICAgc2libGluZyA9IHNpYmxpbmcubmV4dCgpO1xuICB9XG4gIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gaGVhZGluZ0xldmVsKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL15oKFsxLTZdKSQvLmV4ZWMobmFtZSA/PyBcIlwiKTtcbiAgcmV0dXJuIG1hdGNoID8gTnVtYmVyKG1hdGNoWzFdKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29sbGFwc2VUZXh0KGVsZW1lbnQ6IFNlbGVjdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBlbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbn1cblxuZnVuY3Rpb24gbm9kZVRhZ05hbWUobm9kZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIiB8fCAhKFwidGFnTmFtZVwiIGluIG5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIG5vZGUudGFnTmFtZSA9PT0gXCJzdHJpbmdcIiA/IG5vZGUudGFnTmFtZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbW9kZWxLZXkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBuYW1lID0gdmFsdWUudHJpbSgpLnJlcGxhY2UoL1xcKiskLywgXCJcIikudHJpbSgpO1xuICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBbXCIoUHVibGljIFByZXZpZXcpXCIsIFwiKEJldGEpXCIsIFwiKFByZXZpZXcpXCJdKSB7XG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoc3VmZml4KSkgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeShuYW1lKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlLnJlcGxhY2VBbGwoXCIsXCIsIFwiXCIpLnRyaW0oKSk7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJzZWQpICYmIHBhcnNlZCA+PSAwID8gcGFyc2VkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gc29ydFJlY29yZDxUPihyZWNvcmQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFQ+Pik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLnNvcnQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSksXG4gICk7XG59XG4iXX0=
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBU2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsY0FBYyxFQUNkLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxNQUFNLHVCQUF1QixHQUMzQiwwRkFBMEYsQ0FBQztBQUM3RixNQUFNLGlCQUFpQixHQUNyQix3SkFBd0osQ0FBQztBQUMzSixNQUFNLGFBQWEsR0FBRyx3REFBd0QsQ0FBQztBQUMvRSxNQUFNLGtCQUFrQixHQUFHLHFDQUFxQyxDQUFDO0FBQ2pFLHNGQUFzRjtBQUN0RixNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLE1BQU07SUFDTixTQUFTO0lBQ1QsS0FBSztJQUNMLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFlBQVk7SUFDWixXQUFXO0lBQ1gsT0FBTztJQUNQLFlBQVk7SUFDWixLQUFLO0lBQ0wsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxXQUFtQjtJQUNsRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNqQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENB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LGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQXlCO0lBQ3ZDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3JFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxNQUFtQztJQUN4RCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzVFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9hZCwgdHlwZSBDaGVlcmlvQVBJIH0gZnJvbSBcImNoZWVyaW9cIjtcblxuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90LFxuICBNb2RlbFJhdGVMaW1pdENhdGFsb2d1ZSxcbiAgTW9kZWxSYXRlTGltaXRzU25hcHNob3QsXG4gIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90LFxuICBSZXRpcmVkTW9kZWxzU25hcHNob3QsXG59IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuaW1wb3J0IHsgaW5oZXJpdHNOYXRpdmVXZWJTZWFyY2gsIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlUmVhc29uaW5nLFxuICBSRUFTT05JTkdfTEVWRUxTLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuXG50eXBlIFNlbGVjdGlvbiA9IFJldHVyblR5cGU8Q2hlZXJpb0FQST47XG5cbmNvbnN0IEFDQ0VQVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgLyg/OmFjY2VwdGVkIHZhbHVlcyg/OlxccythcmV8XFxzK3ZhcnkpP3xhY2NlcHRzKD86XFxzK3ZhbHVlcz8oPzpcXHMrb2YpPyk/KVxccyo6P1xccyooW14uXSspL2dpO1xuY29uc3QgRk9SX01PREVMX1BBVFRFUk4gPVxuICAvRm9yXFxzKyhbXixdKz8pLFxccysoPzp0aGlzIHBhcmFtZXRlciBhY2NlcHRzKD86XFxzK3ZhbHVlcz9cXHMrb2YpP3x0aGUgKD86YD9yZWFzb25pbmdfZWZmb3J0YD98ZWZmb3J0KSBwYXJhbWV0ZXIgYWNjZXB0cyg/Olxccyt2YWx1ZXM/XFxzK29mKT8pXFxzKihbXi5dKykvZ2k7XG5jb25zdCBUT0tFTl9QQVRURVJOID0gLycoW14nXSspJ3xcIihbXlwiXSspXCJ8YChbXmBdKylgfFxcYihbYS16XVthLXowLTlfLV0qKVxcYi9naTtcbmNvbnN0IE1PREVMX0NPREVfUEFUVEVSTiA9IC9cXGJkYXRhYnJpY2tzLVthLXowLTldW2EtejAtOS5fLV0qL2dpO1xuLyoqIFdpcmUgdG9rZW5zIGFkdmVydGlzZWQgaW4gRGF0YWJyaWNrcyBkb2NzOyBleGNsdWRlcyBwcm9zZSB3b3JkcyBsaWtlIGBkZWZhdWx0YC4gKi9cbmNvbnN0IERPQ1VNRU5UQVRJT05fRUZGT1JUX1RPS0VOUyA9IG5ldyBTZXQoW1xuICBcIm5vbmVcIixcbiAgXCJtaW5pbWFsXCIsXG4gIFwibG93XCIsXG4gIFwibWVkaXVtXCIsXG4gIFwiaGlnaFwiLFxuICBcInhoaWdoXCIsXG4gIFwiZXh0cmEtaGlnaFwiLFxuICBcImV4dHJhaGlnaFwiLFxuICBcInVsdHJhXCIsXG4gIFwidWx0cmEtaGlnaFwiLFxuICBcIm1heFwiLFxuICBcIm1heGltdW1cIixcbiAgXCJkaXNhYmxlZFwiLFxuXSk7XG5cbi8qKiBQYXJzZSByZXRpcmVkIG1vZGVsIG5hbWVzIGZyb20gRGF0YWJyaWNrcyByZXRpcmVtZW50LXBvbGljeSBIVE1MLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0aXJlZE1vZGVscyhodG1sOiBzdHJpbmcsIGdlbmVyYXRlZEF0OiBudW1iZXIpOiBSZXRpcmVkTW9kZWxzU25hcHNob3Qge1xuICBjb25zdCAkID0gbG9hZChodG1sKTtcbiAgY29uc3QgbW9kZWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICQoXCJ0YWJsZVwiKS5lYWNoKChfLCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSAkKHRhYmxlKS5maW5kKFwidHJcIik7XG4gICAgY29uc3QgaGVhZGVyID0gY29sbGFwc2VUZXh0KCQocm93cy5nZXQoMCkpLmZpbmQoXCJ0aCwgdGRcIikuZmlyc3QoKSkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaGVhZGVyICE9PSBcIm9wZW4gbW9kZWxcIiAmJiBoZWFkZXIgIT09IFwicGFydG5lciBtb2RlbFwiKSByZXR1cm47XG4gICAgcm93cy5zbGljZSgxKS5lYWNoKChfXywgcm93KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29sbGFwc2VUZXh0KCQocm93KS5maW5kKFwidGgsIHRkXCIpLmZpcnN0KCkpLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCk7XG4gICAgICAgIGlmICh0cmltbWVkKSBtb2RlbHMuYWRkKHRyaW1tZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKG1vZGVscy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHJldGlyZW1lbnQgdGFibGVzIGNvbnRhaW5lZCBubyBtb2RlbCBuYW1lc1wiKTtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRBdCxcbiAgICBtb2RlbHM6IFsuLi5tb2RlbHNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PlxuICAgICAgbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCBcImVuXCIsIHsgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pLFxuICAgICksXG4gIH07XG59XG5cbi8qKiBQYXJzZSBSZXNwb25zZXMgYW5kIHdlYi1zZWFyY2ggZG9jdW1lbnRhdGlvbiBpbnRvIG1vZGVsIGNhcGFiaWxpdHkgc2V0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKFxuICByZXNwb25zZXNIdG1sOiBzdHJpbmcsXG4gIHdlYlNlYXJjaEh0bWw6IHN0cmluZyxcbiAgZ2VuZXJhdGVkQXQ6IG51bWJlcixcbik6IE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Qge1xuICBjb25zdCByZXNwb25zZXNEb2N1bWVudCA9IGxvYWQocmVzcG9uc2VzSHRtbCk7XG4gIGNvbnN0IHJlc3BvbnNlcyA9IG1vZGVsc0FmdGVySGVhZGluZyhyZXNwb25zZXNEb2N1bWVudCwgXCJkYXRhYnJpY2tzLWhvc3RlZC1mb3VuZGF0aW9uLW1vZGVsc1wiKTtcbiAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gY29udGFpbmVkIG5vIE9wZW5BSSBSZXNwb25zZXMgbW9kZWxzXCIpO1xuICB9XG4gIGNvbnN0IGlucHV0VHlwZXMgPSBzZWN0aW9uRWxlbWVudHMocmVzcG9uc2VzRG9jdW1lbnQsIFwic3VwcG9ydGVkLWlucHV0LXR5cGVzXCIpXG4gICAgLm1hcCgoZWxlbWVudCkgPT4gY29sbGFwc2VUZXh0KGVsZW1lbnQpKVxuICAgIC5qb2luKFwiIFwiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpbnB1dFR5cGVXb3JkcyA9IG5ldyBTZXQoaW5wdXRUeXBlcy5zcGxpdCgvW15hLXowLTldKy8pLmZpbHRlcihCb29sZWFuKSk7XG4gIGNvbnN0IGltYWdlSW5wdXQgPSBpbnB1dFR5cGVXb3Jkcy5oYXMoXCJ0ZXh0XCIpICYmIGlucHV0VHlwZVdvcmRzLmhhcyhcImltYWdlXCIpID8gcmVzcG9uc2VzIDogW107XG4gIGNvbnN0IGFwcGx5UGF0Y2ggPSBjb2RlVmFsdWVzQWZ0ZXJIZWFkaW5nKHJlc3BvbnNlc0RvY3VtZW50LCBcImxpbWl0YXRpb25zXCIpLmluY2x1ZGVzKFxuICAgIFwiYXBwbHlfcGF0Y2hcIixcbiAgKVxuICAgID8gcmVzcG9uc2VzXG4gICAgOiBbXTtcbiAgY29uc3Qgd2ViU2VhcmNoID0gbmF0aXZlV2ViU2VhcmNoTW9kZWxzKGxvYWQod2ViU2VhcmNoSHRtbCksIHJlc3BvbnNlcyk7XG4gIGlmICh3ZWJTZWFyY2gubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbHNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRBdCxcbiAgICBjYXBhYmlsaXRpZXM6IHsgcmVzcG9uc2VzLCBpbWFnZUlucHV0LCBhcHBseVBhdGNoLCB3ZWJTZWFyY2ggfSxcbiAgfTtcbn1cblxuLyoqIFBhcnNlIHBheS1wZXItdG9rZW4gbGltaXRzIGZyb20gRGF0YWJyaWNrcyBGb3VuZGF0aW9uIE1vZGVsIEFQSSBIVE1MLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTW9kZWxSYXRlTGltaXRzKGh0bWw6IHN0cmluZywgZ2VuZXJhdGVkQXQ6IG51bWJlcik6IE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90IHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IG1vZGVsczogUmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRDYXRhbG9ndWVbXCJtb2RlbHNcIl1bc3RyaW5nXT4gPSB7fTtcbiAgJChcInRhYmxlXCIpLmVhY2goKF8sIHRhYmxlKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9ICQodGFibGUpLmZpbmQoXCJ0clwiKTtcbiAgICBjb25zdCBoZWFkZXJzID0gJChyb3dzLmdldCgwKSlcbiAgICAgIC5maW5kKFwidGgsIHRkXCIpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKChjZWxsKSA9PiBjb2xsYXBzZVRleHQoJChjZWxsKSkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgbW9kZWxJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJtb2RlbFwiKSk7XG4gICAgY29uc3QgaW5wdXRJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJpdHBtXCIpKTtcbiAgICBjb25zdCBvdXRwdXRJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJvdHBtXCIpKTtcbiAgICBjb25zdCBxdWVyeUluZGV4ID0gaGVhZGVycy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZS5pbmNsdWRlcyhcInFwaFwiKSk7XG4gICAgaWYgKG1vZGVsSW5kZXggPCAwIHx8IGlucHV0SW5kZXggPCAwIHx8IG91dHB1dEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIHJvd3Muc2xpY2UoMSkuZWFjaCgoX18sIHJvdykgPT4ge1xuICAgICAgY29uc3QgY2VsbHMgPSAkKHJvdylcbiAgICAgICAgLmZpbmQoXCJ0aCwgdGRcIilcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAubWFwKChjZWxsKSA9PiBjb2xsYXBzZVRleHQoJChjZWxsKSkpO1xuICAgICAgY29uc3Qga2V5ID0gbW9kZWxLZXkoY2VsbHNbbW9kZWxJbmRleF0pO1xuICAgICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICAgIG1vZGVsc1trZXldID0ge1xuICAgICAgICBpbnB1dFRva2Vuc1Blck1pbnV0ZTogbnVtYmVyKGNlbGxzW2lucHV0SW5kZXhdKSxcbiAgICAgICAgb3V0cHV0VG9rZW5zUGVyTWludXRlOiBudW1iZXIoY2VsbHNbb3V0cHV0SW5kZXhdKSxcbiAgICAgICAgcXVlcmllc1BlckhvdXI6IHF1ZXJ5SW5kZXggPCAwID8gbnVsbCA6IG51bWJlcihjZWxsc1txdWVyeUluZGV4XSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKG1vZGVscykubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBtb2RlbC1saW1pdCBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBtb2RlbHNcIik7XG4gIH1cbiAgcmV0dXJuIHsgZ2VuZXJhdGVkQXQsIGNhdGFsb2d1ZTogeyBtb2RlbHM6IHNvcnRSZWNvcmQobW9kZWxzKSB9IH07XG59XG5cbi8qKiBQYXJzZSByZWFzb25pbmctZWZmb3J0IGxhZGRlcnMgZnJvbSB0aGUgUXVlcnkgcmVhc29uaW5nIG1vZGVscyBIVE1MIHRhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nTW9kZWxzKGh0bWw6IHN0cmluZywgZ2VuZXJhdGVkQXQ6IG51bWJlcik6IFJlYXNvbmluZ01vZGVsc1NuYXBzaG90IHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IG1vZGVsczogUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWxbXT4gPSB7fTtcbiAgJChcInRhYmxlXCIpLmVhY2goKF8sIHRhYmxlKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9ICQodGFibGUpLmZpbmQoXCJ0clwiKTtcbiAgICBjb25zdCBoZWFkZXJzID0gJChyb3dzLmdldCgwKSlcbiAgICAgIC5maW5kKFwidGgsIHRkXCIpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKChjZWxsKSA9PiBjb2xsYXBzZVRleHQoJChjZWxsKSkudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKCFoZWFkZXJzLnNvbWUoKGhlYWRlcikgPT4gaGVhZGVyLmluY2x1ZGVzKFwibW9kZWxcIikpKSByZXR1cm47XG4gICAgaWYgKCFoZWFkZXJzLnNvbWUoKGhlYWRlcikgPT4gaGVhZGVyLmluY2x1ZGVzKFwicGFyYW1ldGVyXCIpKSkgcmV0dXJuO1xuICAgIHJvd3Muc2xpY2UoMSkuZWFjaCgoX18sIHJvdykgPT4ge1xuICAgICAgY29uc3QgY2VsbHMgPSAkKHJvdylcbiAgICAgICAgLmZpbmQoXCJ0aCwgdGRcIilcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAubWFwKChjZWxsKSA9PiAkKGNlbGwpKTtcbiAgICAgIGlmIChjZWxscy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgICBjb25zdCBtb2RlbE5hbWVzID0gcmVhc29uaW5nTW9kZWxOYW1lc0Zyb21DZWxsKGNlbGxzWzBdISwgJCk7XG4gICAgICBpZiAobW9kZWxOYW1lcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnNUZXh0ID0gY29sbGFwc2VUZXh0KGNlbGxzW2NlbGxzLmxlbmd0aCAtIDFdISk7XG4gICAgICBjb25zdCBwZXJNb2RlbCA9IHJlYXNvbmluZ0xldmVsc0J5TW9kZWxTZWN0aW9uKHBhcmFtZXRlcnNUZXh0LCBtb2RlbE5hbWVzKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwZXJNb2RlbCkubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGxldmVsc10gb2YgT2JqZWN0LmVudHJpZXMocGVyTW9kZWwpKSB7XG4gICAgICAgICAgaWYgKGxldmVscy5sZW5ndGggPiAwKSBtb2RlbHNba2V5XSA9IHNvcnRSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzaGFyZWQgPSBzb3J0UmVhc29uaW5nTGV2ZWxzKGV4dHJhY3RBY2NlcHRlZFJlYXNvbmluZ0xldmVscyhwYXJhbWV0ZXJzVGV4dCkpO1xuICAgICAgaWYgKHNoYXJlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBtb2RlbE5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KG5hbWUpO1xuICAgICAgICBpZiAoa2V5KSBtb2RlbHNba2V5XSA9IHNoYXJlZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChPYmplY3Qua2V5cyhtb2RlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgcmVhc29uaW5nIGRvY3VtZW50YXRpb24gY29udGFpbmVkIG5vIG1vZGVsIGVmZm9ydCBsYWRkZXJzXCIpO1xuICB9XG4gIHJldHVybiB7IGdlbmVyYXRlZEF0LCBjYXRhbG9ndWU6IHsgbW9kZWxzOiBzb3J0UmVjb3JkKG1vZGVscykgfSB9O1xufVxuXG5mdW5jdGlvbiByZWFzb25pbmdNb2RlbE5hbWVzRnJvbUNlbGwoY2VsbDogU2VsZWN0aW9uLCAkOiBDaGVlcmlvQVBJKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjZWxsLmZpbmQoXCJjb2RlXCIpLmVhY2goKF8sIGNvZGUpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gY29sbGFwc2VUZXh0KCQoY29kZSkpO1xuICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoXCJkYXRhYnJpY2tzLVwiKSkgbmFtZXMuYWRkKHRleHQpO1xuICB9KTtcbiAgaWYgKG5hbWVzLnNpemUgPT09IDApIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbGxhcHNlVGV4dChjZWxsKS5tYXRjaEFsbChNT0RFTF9DT0RFX1BBVFRFUk4pKSB7XG4gICAgICBuYW1lcy5hZGQobWF0Y2hbMF0hKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uYW1lc107XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBY2NlcHRlZFJlYXNvbmluZ0xldmVscyh0ZXh0OiBzdHJpbmcpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgbGV2ZWxzOiBSZWFzb25pbmdMZXZlbFtdID0gW107XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdGV4dC5tYXRjaEFsbChBQ0NFUFRFRF9WQUxVRVNfUEFUVEVSTikpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IG1hdGNoWzFdO1xuICAgIGlmICghZnJhZ21lbnQgfHwgL3ZhcnkgYnkgbW9kZWwvaS50ZXN0KGZyYWdtZW50KSkgY29udGludWU7XG4gICAgbGV2ZWxzLnB1c2goLi4uZG9jdW1lbnRhdGlvbkVmZm9ydExldmVscyhmcmFnbWVudCkpO1xuICB9XG4gIHJldHVybiBsZXZlbHM7XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ0xldmVsc0J5TW9kZWxTZWN0aW9uKFxuICBwYXJhbWV0ZXJzVGV4dDogc3RyaW5nLFxuICByb3dNb2RlbHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlYXNvbmluZ0xldmVsW10+ID0ge307XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgcGFyYW1ldGVyc1RleHQubWF0Y2hBbGwoRk9SX01PREVMX1BBVFRFUk4pKSB7XG4gICAgY29uc3QgbGFiZWwgPSBtYXRjaFsxXT8udHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gbWF0Y2hbMl07XG4gICAgaWYgKCFsYWJlbCB8fCAhZnJhZ21lbnQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxldmVscyA9IHVuaXF1ZVJlYXNvbmluZ0xldmVscyhkb2N1bWVudGF0aW9uRWZmb3J0TGV2ZWxzKGZyYWdtZW50KSk7XG4gICAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1hdGNoZWQgPSByb3dNb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gcmVhc29uaW5nTW9kZWxMYWJlbE1hdGNoZXMobGFiZWwsIG1vZGVsKSk7XG4gICAgLy8gT25seSBhdHRhY2ggZXhwbGljaXQgXCJGb3IgPG1vZGVsPlwiIGNsYXVzZXMgdG8gbW9kZWxzIGxpc3RlZCBpbiB0aGUgcm93LlxuICAgIGlmIChtYXRjaGVkLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbWF0Y2hlZCkge1xuICAgICAgY29uc3Qga2V5ID0gbW9kZWxLZXkodGFyZ2V0KTtcbiAgICAgIGlmIChrZXkpIHJlc3VsdFtrZXldID0gc29ydFJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkb2N1bWVudGF0aW9uRWZmb3J0TGV2ZWxzKGZyYWdtZW50OiBzdHJpbmcpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgcmV0dXJuIHJlYXNvbmluZ1Rva2Vuc0Zyb21GcmFnbWVudChmcmFnbWVudCkuZmxhdE1hcCgodG9rZW4pID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdG9rZW4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bX1xcc10rL2csIFwiLVwiKTtcbiAgICBpZiAoXG4gICAgICAhRE9DVU1FTlRBVElPTl9FRkZPUlRfVE9LRU5TLmhhcyhub3JtYWxpemVkKSAmJlxuICAgICAgIURPQ1VNRU5UQVRJT05fRUZGT1JUX1RPS0VOUy5oYXModG9rZW4udG9Mb3dlckNhc2UoKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgbGV2ZWwgPSBwYXJzZVJlYXNvbmluZyh0b2tlbik7XG4gICAgcmV0dXJuIGxldmVsID8gW2xldmVsXSA6IFtdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc29ydFJlYXNvbmluZ0xldmVscyhsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgcmV0dXJuIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpLnNvcnQoXG4gICAgKGxlZnQsIHJpZ2h0KSA9PiBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGVmdCkgLSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YocmlnaHQpLFxuICApO1xufVxuXG5mdW5jdGlvbiByZWFzb25pbmdNb2RlbExhYmVsTWF0Y2hlcyhsYWJlbDogc3RyaW5nLCBtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxlZnQgPSBsYWJlbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzLS8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCJcIik7XG4gIGNvbnN0IHJpZ2h0ID0gbW9kZWxcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiXCIpO1xuICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgcmlnaHQuaW5jbHVkZXMobGVmdCkgfHwgbGVmdC5pbmNsdWRlcyhyaWdodCk7XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ1Rva2Vuc0Zyb21GcmFnbWVudChmcmFnbWVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiBmcmFnbWVudC5tYXRjaEFsbChUT0tFTl9QQVRURVJOKSkge1xuICAgIGNvbnN0IHRva2VuID0gcGFydFsxXSA/PyBwYXJ0WzJdID8/IHBhcnRbM10gPz8gcGFydFs0XTtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuID09PSBcImFuZFwiIHx8IHRva2VuID09PSBcIm9yXCIgfHwgdG9rZW4gPT09IFwib2ZcIikgY29udGludWU7XG4gICAgdG9rZW5zLnB1c2godG9rZW4ucmVwbGFjZSgvXltcIidgXSt8W1wiJ2BdKyQvZywgXCJcIikpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmZ1bmN0aW9uIG1vZGVsc0FmdGVySGVhZGluZygkOiBDaGVlcmlvQVBJLCBoZWFkaW5nSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KGNvZGVWYWx1ZXNBZnRlckhlYWRpbmcoJCwgaGVhZGluZ0lkKS5mbGF0TWFwKCh2YWx1ZSkgPT4gbW9kZWxLZXkodmFsdWUpID8/IFtdKSksXG4gIF0uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBuYXRpdmVXZWJTZWFyY2hNb2RlbHMoJDogQ2hlZXJpb0FQSSwgcmVzcG9uc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbW9kZWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGxldCBuYXRpdmVTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBzZWN0aW9uRWxlbWVudHMoJCwgXCJzdXBwb3J0ZWQtbW9kZWxzXCIpKSB7XG4gICAgaWYgKGhlYWRpbmdMZXZlbChub2RlVGFnTmFtZShlbGVtZW50LmdldCgwKSkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hdGl2ZVNlY3Rpb24gPSAhY29sbGFwc2VUZXh0KGVsZW1lbnQpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJ2aWEgbWNwXCIpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghbmF0aXZlU2VjdGlvbikgY29udGludWU7XG4gICAgY29uc3QgdmFsdWVzID0gbm9kZVRhZ05hbWUoZWxlbWVudC5nZXQoMCkpID09PSBcImNvZGVcIiA/IFtjb2xsYXBzZVRleHQoZWxlbWVudCldIDogW107XG4gICAgZWxlbWVudC5maW5kKFwiY29kZVwiKS5lYWNoKChfLCBjb2RlKSA9PiB7XG4gICAgICB2YWx1ZXMucHVzaChjb2xsYXBzZVRleHQoJChjb2RlKSkpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IG1vZGVsS2V5KHZhbHVlKTtcbiAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgbW9kZWxzLmFkZChtb2RlbCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgbW9kZWwgb2YgcmVzcG9uc2VzKSB7XG4gICAgaWYgKGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKG1vZGVsLCBtb2RlbHMpKSBtb2RlbHMuYWRkKG1vZGVsKTtcbiAgfVxuICByZXR1cm4gWy4uLm1vZGVsc10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2RlVmFsdWVzQWZ0ZXJIZWFkaW5nKCQ6IENoZWVyaW9BUEksIGhlYWRpbmdJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBzZWN0aW9uRWxlbWVudHMoJCwgaGVhZGluZ0lkKSkge1xuICAgIGlmIChub2RlVGFnTmFtZShlbGVtZW50LmdldCgwKSkgPT09IFwiY29kZVwiKSB2YWx1ZXMucHVzaChjb2xsYXBzZVRleHQoZWxlbWVudCkpO1xuICAgIGVsZW1lbnQuZmluZChcImNvZGVcIikuZWFjaCgoXywgY29kZSkgPT4ge1xuICAgICAgdmFsdWVzLnB1c2goY29sbGFwc2VUZXh0KCQoY29kZSkpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBzZWN0aW9uRWxlbWVudHMoJDogQ2hlZXJpb0FQSSwgaGVhZGluZ0lkOiBzdHJpbmcpOiBTZWxlY3Rpb25bXSB7XG4gIGNvbnN0IGhlYWRpbmcgPSAkKGAjJHtoZWFkaW5nSWR9YCkuZmlyc3QoKTtcbiAgaWYgKGhlYWRpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGNhcGFiaWxpdHkgcGFnZSBpcyBtaXNzaW5nIHNlY3Rpb24gJHtoZWFkaW5nSWR9YCk7XG4gIH1cbiAgY29uc3QgbGV2ZWwgPSBoZWFkaW5nTGV2ZWwobm9kZVRhZ05hbWUoaGVhZGluZy5nZXQoMCkpKTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgY2FwYWJpbGl0eSBzZWN0aW9uICR7aGVhZGluZ0lkfSBpcyBub3QgYSBoZWFkaW5nYCk7XG4gIH1cbiAgY29uc3QgZWxlbWVudHM6IFNlbGVjdGlvbltdID0gW107XG4gIGxldCBzaWJsaW5nID0gaGVhZGluZy5uZXh0KCk7XG4gIHdoaWxlIChzaWJsaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzaWJsaW5nTGV2ZWwgPSBoZWFkaW5nTGV2ZWwobm9kZVRhZ05hbWUoc2libGluZy5nZXQoMCkpKTtcbiAgICBpZiAoc2libGluZ0xldmVsICE9PSB1bmRlZmluZWQgJiYgc2libGluZ0xldmVsIDw9IGxldmVsKSBicmVhaztcbiAgICBlbGVtZW50cy5wdXNoKHNpYmxpbmcpO1xuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHQoKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIGhlYWRpbmdMZXZlbChuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eaChbMS02XSkkLy5leGVjKG5hbWUgPz8gXCJcIik7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxhcHNlVGV4dChlbGVtZW50OiBTZWxlY3Rpb24pOiBzdHJpbmcge1xuICByZXR1cm4gZWxlbWVudC50ZXh0KCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG59XG5cbmZ1bmN0aW9uIG5vZGVUYWdOYW1lKG5vZGU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIgfHwgIShcInRhZ05hbWVcIiBpbiBub2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBub2RlLnRhZ05hbWUgPT09IFwic3RyaW5nXCIgPyBub2RlLnRhZ05hbWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgbmFtZSA9IHZhbHVlLnRyaW0oKS5yZXBsYWNlKC9cXCorJC8sIFwiXCIpLnRyaW0oKTtcbiAgZm9yIChjb25zdCBzdWZmaXggb2YgW1wiKFB1YmxpYyBQcmV2aWV3KVwiLCBcIihCZXRhKVwiLCBcIihQcmV2aWV3KVwiXSkge1xuICAgIGlmIChuYW1lLmVuZHNXaXRoKHN1ZmZpeCkpIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG1vZGVsU2VhcmNoUXVlcnkobmFtZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZS5yZXBsYWNlQWxsKFwiLFwiLCBcIlwiKS50cmltKCkpO1xuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIocGFyc2VkKSAmJiBwYXJzZWQgPj0gMCA/IHBhcnNlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNvcnRSZWNvcmQ8VD4ocmVjb3JkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpLFxuICApO1xufVxuIl19