@dbx-tools/model 0.9.54 → 0.9.60

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/index.ts CHANGED
@@ -3,7 +3,7 @@
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.54";
6
+ export const PACKAGE_VERSION = "0.9.60";
7
7
  export * as bindings from "./src/bindings.ts";
8
8
  export * as classes from "./src/classes.ts";
9
9
  export * as classify from "./src/classify.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
2
- export declare const PACKAGE_VERSION = "0.9.54";
2
+ export declare const PACKAGE_VERSION = "0.9.60";
3
3
  export * as bindings from "./src/bindings.ts";
4
4
  export * as classes from "./src/classes.ts";
5
5
  export * as classify from "./src/classify.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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.54";
5
+ export const PACKAGE_VERSION = "0.9.60";
6
6
  export * as bindings from "./src/bindings.js";
7
7
  export * as classes from "./src/classes.js";
8
8
  export * as classify from "./src/classify.js";
@@ -24,4 +24,4 @@ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model
24
24
  export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
25
25
  export { REASONING_LEVELS } from "./src/reasoning-translation.js";
26
26
  export * from "./exports.js";
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0ssT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEwsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJbEUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNTRcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nV2lyZSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfTEVWRUxTIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZWFzb25pbmdMZXZlbCwgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZpbmdDaGF0TWVzc2FnZSwgUmV3cml0dGVuU2VydmluZ1JlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0ssT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEwsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJbEUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNjBcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nV2lyZSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfTEVWRUxTIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZWFzb25pbmdMZXZlbCwgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZpbmdDaGF0TWVzc2FnZSwgUmV3cml0dGVuU2VydmluZ1JlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
package/lib/package.json CHANGED
@@ -102,7 +102,7 @@
102
102
  "./package.json": "./package.json"
103
103
  }
104
104
  },
105
- "version": "0.9.54",
105
+ "version": "0.9.60",
106
106
  "types": "index.ts",
107
107
  "dbxToolsConfig": {
108
108
  "tags": [
@@ -1,12 +1,32 @@
1
+ import { object, stringUtils } from "@dbx-tools/shared-core";
1
2
  import { ModelClass as ModelClassValues, } from "@dbx-tools/shared-model/contracts";
2
3
  import { toModelDisplayName } from "@dbx-tools/shared-model/display";
3
4
  import Fuse from "fuse.js";
4
5
  import { modelStatusFor } from "./_retirement.js";
5
- import { classesAtOrBelow, CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./classes.js";
6
+ import { classesAtOrBelow, CHAT_CLASS_ORDER, isChatClass, MODEL_CLASS_ORDER } from "./classes.js";
6
7
  import { classifyEndpoints, endpointCapabilities, supportsToolsByFamily, versionTuple, } from "./classify.js";
7
8
  import { modelFamily, modelReasoningEfforts, modelServiceNames } from "./policy.js";
8
9
  const ModelClass = ModelClassValues;
9
10
  const DEFAULT_FUZZY_THRESHOLD = 0.4;
11
+ const SEARCH_INTENT_FILLERS = new Set(["a", "best", "for", "model", "models", "the"]);
12
+ const CHAT_SEARCH_INTENTS = new Set([
13
+ "chat",
14
+ "completion",
15
+ "completions",
16
+ "summarize",
17
+ "summarise",
18
+ "summarization",
19
+ "summarisation",
20
+ "summary",
21
+ ]);
22
+ const EMBEDDING_SEARCH_INTENTS = new Set([
23
+ "embed",
24
+ "embedding",
25
+ "embeddings",
26
+ "vector",
27
+ "vectorize",
28
+ "vectorise",
29
+ ]);
10
30
  /** Rank endpoint records through the TypeScript-owned model policy. */
11
31
  export function rankEndpoints(endpoints, query = {}, options = {}) {
12
32
  const filtered = endpoints.filter((endpoint) => matchesModelQuery(endpoint, query));
@@ -25,12 +45,21 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
25
45
  [options.modelClass]: normalized,
26
46
  }
27
47
  : classifyEndpoints(normalized);
28
- const requestedClass = options.modelClass ?? query.modelClass;
48
+ const search = query.search?.trim();
49
+ const searchPlan = search ? modelSearchPlan(search) : undefined;
50
+ const rankedSearch = searchPlan ? searchPlan.search : search;
51
+ const searchIntent = searchPlan?.modelClass;
52
+ const requestedClass = options.modelClass ?? query.modelClass ?? searchIntent;
29
53
  const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
30
54
  const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
31
55
  const candidates = [];
32
- const search = query.search?.trim();
33
- if (search && requestedClass === undefined) {
56
+ const explicitClass = options.modelClass ?? query.modelClass;
57
+ if (searchIntent !== undefined &&
58
+ explicitClass !== undefined &&
59
+ isChatClass(searchIntent) !== isChatClass(explicitClass)) {
60
+ return [];
61
+ }
62
+ if (rankedSearch && requestedClass === undefined) {
34
63
  const classByName = classifyEndpointClasses(normalized);
35
64
  for (const endpoint of normalized) {
36
65
  if (!includeDeprecated && endpoint.status?.deprecated)
@@ -56,14 +85,14 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
56
85
  }
57
86
  }
58
87
  let ranked = candidates;
59
- if (search) {
60
- const exact = candidates.find((candidate) => candidate.endpoint.name === search);
88
+ if (rankedSearch) {
89
+ const exact = candidates.find((candidate) => candidate.endpoint.name === rankedSearch);
61
90
  if (exact) {
62
91
  ranked = [{ ...exact, score: 0 }];
63
92
  }
64
93
  else {
65
94
  const threshold = query.threshold ?? DEFAULT_FUZZY_THRESHOLD;
66
- const searchTokens = tokenize(search);
95
+ const searchTokens = tokenize(rankedSearch);
67
96
  const tokenMatches = candidates
68
97
  .filter((candidate) => {
69
98
  const candidateTokens = new Set(searchableValues(candidate.endpoint).flatMap(tokenize));
@@ -88,7 +117,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
88
117
  useExtendedSearch: true,
89
118
  isCaseSensitive: false,
90
119
  });
91
- const normalizedSearch = tokenize(search).join(" ");
120
+ const normalizedSearch = tokenize(rankedSearch).join(" ");
92
121
  ranked = normalizedSearch
93
122
  ? fuse
94
123
  .search(normalizedSearch)
@@ -142,39 +171,43 @@ export function classifyEndpointClasses(endpoints) {
142
171
  export function normalizeEndpoints(endpoints) {
143
172
  const summaries = endpoints.flatMap((value) => {
144
173
  const endpoint = record(value);
145
- const name = stringValue(endpoint.name);
174
+ const name = stringUtils.trimToUndefined(endpoint.name);
146
175
  if (!name)
147
176
  return [];
148
177
  const entities = arrayValue(record(endpoint.config).served_entities).map(record);
149
178
  const identities = [
150
179
  name,
151
180
  ...entities.flatMap((entity) => [
152
- stringValue(entity.entity_name),
153
- stringValue(record(entity.foundation_model).name),
154
- stringValue(record(entity.external_model).name),
181
+ stringUtils.trimToUndefined(entity.entity_name),
182
+ stringUtils.trimToUndefined(record(entity.foundation_model).name),
183
+ stringUtils.trimToUndefined(record(entity.external_model).name),
155
184
  ].filter((identity) => Boolean(identity))),
156
185
  ];
157
186
  const modelServiceName = entities
158
- .map((entity) => stringValue(record(entity.foundation_model).name) ?? stringValue(entity.entity_name))
187
+ .map((entity) => stringUtils.trimToUndefined(record(entity.foundation_model).name) ??
188
+ stringUtils.trimToUndefined(entity.entity_name))
159
189
  .find(Boolean);
160
190
  const foundationModels = entities.map((entity) => record(entity.foundation_model));
161
- const family = foundationModels.map((model) => stringValue(model.model_class)).find(Boolean) ??
162
- identities.map(modelFamily).find(Boolean);
191
+ const family = foundationModels
192
+ .map((model) => stringUtils.trimToUndefined(model.model_class))
193
+ .find(Boolean) ?? identities.map(modelFamily).find(Boolean);
163
194
  const reasoningEfforts = identities.map(modelReasoningEfforts).sort((left, right) => right.length - left.length)[0] ??
164
195
  [];
165
196
  const profile = entities.map(modelProfile).find(Boolean);
166
197
  const capabilitiesRecord = record(endpoint.capabilities);
167
198
  const foundationDescription = foundationModels
168
- .map((model) => stringValue(model.description))
199
+ .map((model) => stringUtils.trimToUndefined(model.description))
169
200
  .find(Boolean);
170
- const description = stringValue(endpoint.description) ?? foundationDescription;
201
+ const description = stringUtils.trimToUndefined(endpoint.description) ?? foundationDescription;
171
202
  const summary = {
172
203
  name,
173
204
  displayName: toModelDisplayName(name, providedDisplayName(endpoint, entities)),
174
205
  ...(family ? { family } : {}),
175
- ...(stringValue(endpoint.task) ? { task: stringValue(endpoint.task) } : {}),
176
- ...(stringValue(record(endpoint.state).ready)
177
- ? { state: stringValue(record(endpoint.state).ready) }
206
+ ...(stringUtils.trimToUndefined(endpoint.task)
207
+ ? { task: stringUtils.trimToUndefined(endpoint.task) }
208
+ : {}),
209
+ ...(stringUtils.trimToUndefined(record(endpoint.state).ready)
210
+ ? { state: stringUtils.trimToUndefined(record(endpoint.state).ready) }
178
211
  : {}),
179
212
  ...(description ? { description } : {}),
180
213
  supportsTools: booleanValue(capabilitiesRecord.function_calling) ?? identities.some(supportsToolsByFamily),
@@ -217,6 +250,28 @@ function modelVariantRank(name) {
217
250
  return 1;
218
251
  return 2;
219
252
  }
253
+ /**
254
+ * Resolve generic job searches to the capability class that owns the work.
255
+ *
256
+ * A pure intent such as "summarize" ranks that capability directly. Mixed
257
+ * queries remove the intent word but retain the model identity, so "gpt chat"
258
+ * still uses the historical version and variant preference for GPT.
259
+ */
260
+ function modelSearchPlan(search) {
261
+ const tokens = tokenize(search).filter((token) => !SEARCH_INTENT_FILLERS.has(token));
262
+ if (tokens.length === 0)
263
+ return undefined;
264
+ const chat = tokens.some((token) => CHAT_SEARCH_INTENTS.has(token));
265
+ const embedding = tokens.some((token) => EMBEDDING_SEARCH_INTENTS.has(token));
266
+ if (chat === embedding)
267
+ return undefined;
268
+ const intentWords = chat ? CHAT_SEARCH_INTENTS : EMBEDDING_SEARCH_INTENTS;
269
+ const remaining = tokens.filter((token) => !intentWords.has(token));
270
+ return {
271
+ modelClass: chat ? ModelClass.ChatThinking : ModelClass.Embedding,
272
+ ...(remaining.length > 0 ? { search: remaining.join(" ") } : {}),
273
+ };
274
+ }
220
275
  function tokenize(value) {
221
276
  return value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
222
277
  }
@@ -246,33 +301,27 @@ function providedDisplayName(endpoint, entities) {
246
301
  for (const tag of arrayValue(endpoint.tags).map(record)) {
247
302
  if (!["display_name", "displayName", "name"].includes(String(tag.key)))
248
303
  continue;
249
- const value = stringValue(tag.value);
304
+ const value = stringUtils.trimToUndefined(tag.value);
250
305
  if (value)
251
306
  return value;
252
307
  }
253
308
  return (entities
254
- .map((entity) => stringValue(record(entity.foundation_model).display_name))
309
+ .map((entity) => stringUtils.trimToUndefined(record(entity.foundation_model).display_name))
255
310
  .find(Boolean) ??
256
- entities.map((entity) => stringValue(record(entity.external_model).name)).find(Boolean));
311
+ entities
312
+ .map((entity) => stringUtils.trimToUndefined(record(entity.external_model).name))
313
+ .find(Boolean));
257
314
  }
258
315
  function record(value) {
259
- return value && typeof value === "object" && !Array.isArray(value)
260
- ? value
261
- : {};
316
+ return object.isRecord(value) ? value : {};
262
317
  }
263
318
  function arrayValue(value) {
264
319
  return Array.isArray(value) ? value : [];
265
320
  }
266
- function stringValue(value) {
267
- if (typeof value !== "string")
268
- return undefined;
269
- const trimmed = value.trim();
270
- return trimmed || undefined;
271
- }
272
321
  function finiteNumber(value) {
273
322
  return typeof value === "number" && Number.isFinite(value) ? value : undefined;
274
323
  }
275
324
  function booleanValue(value) {
276
325
  return typeof value === "boolean" ? value : undefined;
277
326
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FLL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFFM0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHcEYsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFPcEMsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxhQUFhLENBQzNCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUUsRUFDdEIsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sVUFBVSxHQUFH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QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUN4RixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWM7SUFDNUIsT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDaEUsQ0FBQyxDQUFFLEtBQWlDO1FBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixPQUFPLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcbmltcG9ydCB7IHRvTW9kZWxEaXNwbGF5TmFtZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9kaXNwbGF5XCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBtb2RlbFN0YXR1c0ZvciB9IGZyb20gXCIuL19yZXRpcmVtZW50LnRzXCI7XG5pbXBvcnQgeyBjbGFzc2VzQXRPckJlbG93LCBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5RW5kcG9pbnRzLFxuICBlbmRwb2ludENhcGFiaWxpdGllcyxcbiAgc3VwcG9ydHNUb29sc0J5RmFtaWx5LFxuICB2ZXJzaW9uVHVwbGUsXG59IGZyb20gXCIuL2NsYXNzaWZ5LnRzXCI7XG5pbXBvcnQgeyBtb2RlbEZhbWlseSwgbW9kZWxSZWFzb25pbmdFZmZvcnRzLCBtb2RlbFNlcnZpY2VOYW1lcyB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVHlwZTtcbmNvbnN0IE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVmFsdWVzO1xuXG5jb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcbmludGVyZmFjZSBOYXRpdmVSYW5raW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG59XG5cbi8qKiBSYW5rIGVuZHBvaW50IHJlY29yZHMgdGhyb3VnaCB0aGUgVHlwZVNjcmlwdC1vd25lZCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua0VuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4gIG9wdGlvbnM6IE5hdGl2ZVJhbmtpbmdPcHRpb25zID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgY29uc3QgZmlsdGVyZWQgPSBlbmRwb2ludHMuZmlsdGVyKChlbmRwb2ludCkgPT4gbWF0Y2hlc01vZGVsUXVlcnkoZW5kcG9pbnQsIHF1ZXJ5KSk7XG4gIGNvbnN0IG9yaWdpbmFsQnlOYW1lID0gbmV3IE1hcChmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiBbZW5kcG9pbnQubmFtZSwgZW5kcG9pbnRdKSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihvcHRpb25zLm1vZGVsQ2xhc3MgPyB7IGNsYXNzOiBvcHRpb25zLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy50YXNrID8geyB0YXNrOiBvcHRpb25zLnRhc2sgfSA6IHt9KSxcbiAgfSkpO1xuICBjb25zdCBjbGFzc2lmaWVkID0gb3B0aW9ucy5tb2RlbENsYXNzXG4gICAgPyB7XG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gICAgICAgIFtvcHRpb25zLm1vZGVsQ2xhc3NdOiBub3JtYWxpemVkLFxuICAgICAgfVxuICAgIDogY2xhc3NpZnlFbmRwb2ludHMobm9ybWFsaXplZCk7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzID8/IHF1ZXJ5Lm1vZGVsQ2xhc3M7XG4gIGNvbnN0IGluY2x1ZGVEZXByZWNhdGVkID0gcXVlcnkuaW5jbHVkZURlcHJlY2F0ZWQgPz8gb3B0aW9ucy5pbmNsdWRlRGVwcmVjYXRlZCA/PyBmYWxzZTtcbiAgY29uc3QgZWxpZ2libGUgPSByZXF1ZXN0ZWRDbGFzcyA/IGNsYXNzZXNBdE9yQmVsb3cocmVxdWVzdGVkQ2xhc3MpIDogQ0hBVF9DTEFTU19PUkRFUjtcbiAgY29uc3QgY2FuZGlkYXRlczogUmFua2VkTW9kZWxbXSA9IFtdO1xuICBjb25zdCBzZWFyY2ggPSBxdWVyeS5zZWFyY2g/LnRyaW0oKTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmFua2VkID0gY2FuZGlkYXRlcztcbiAgaWYgKHNlYXJjaCkge1xuICAgIGNvbnN0IGV4YWN0ID0gY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lID09PSBzZWFyY2gpO1xuICAgIGlmIChleGFjdCkge1xuICAgICAgcmFua2VkID0gW3sgLi4uZXhhY3QsIHNjb3JlOiAwIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSBxdWVyeS50aHJlc2hvbGQgPz8gREVGQVVMVF9GVVpaWV9USFJFU0hPTEQ7XG4gICAgICBjb25zdCBzZWFyY2hUb2tlbnMgPSB0b2tlbml6ZShzZWFyY2gpO1xuICAgICAgY29uc3QgdG9rZW5NYXRjaGVzID0gY2FuZGlkYXRlc1xuICAgICAgICAuZmlsdGVyKChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGVUb2tlbnMgPSBuZXcgU2V0KHNlYXJjaGFibGVWYWx1ZXMoY2FuZGlkYXRlLmVuZHBvaW50KS5mbGF0TWFwKHRva2VuaXplKSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlYXJjaFRva2Vucy5sZW5ndGggPiAwICYmIHNlYXJjaFRva2Vucy5ldmVyeSgodG9rZW4pID0+IGNhbmRpZGF0ZVRva2Vucy5oYXModG9rZW4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gKHsgLi4uY2FuZGlkYXRlLCBzY29yZTogMCB9KSk7XG4gICAgICBpZiAodG9rZW5NYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmFua2VkID0gdG9rZW5NYXRjaGVzLnNvcnQoY29tcGFyZVJhbmtlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmdXNlID0gbmV3IEZ1c2UoY2FuZGlkYXRlcywge1xuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5kaXNwbGF5TmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5mYW1pbHlcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5zZXJ2aWNlTmFtZXNcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgICAgICAgdXNlRXh0ZW5kZWRTZWFyY2g6IHRydWUsXG4gICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0b2tlbml6ZShzZWFyY2gpLmpvaW4oXCIgXCIpO1xuICAgICAgICByYW5rZWQgPSBub3JtYWxpemVkU2VhcmNoXG4gICAgICAgICAgPyBmdXNlXG4gICAgICAgICAgICAgIC5zZWFyY2gobm9ybWFsaXplZFNlYXJjaClcbiAgICAgICAgICAgICAgLmZpbHRlcigocmVzdWx0KSA9PiAocmVzdWx0LnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiAoeyAuLi5yZXN1bHQuaXRlbSwgc2NvcmU6IHJlc3VsdC5zY29yZSA/PyAwIH0pKVxuICAgICAgICAgICAgICAuc29ydChjb21wYXJlUmFua2VkKVxuICAgICAgICAgIDogW107XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3RvcmVkID0gcmFua2VkLm1hcCgocmVzdWx0KSA9PiAoe1xuICAgIC4uLnJlc3VsdCxcbiAgICBlbmRwb2ludDogb3JpZ2luYWxCeU5hbWUuZ2V0KHJlc3VsdC5lbmRwb2ludC5uYW1lKSA/PyByZXN1bHQuZW5kcG9pbnQsXG4gIH0pKTtcbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ID09PSB1bmRlZmluZWQgPyByZXN0b3JlZCA6IHJlc3RvcmVkLnNsaWNlKDAsIE1hdGgubWF4KDAsIHF1ZXJ5LmxpbWl0KSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBxdWVyeTogTW9kZWxRdWVyeSk6IGJvb2xlYW4ge1xuICBpZiAocXVlcnkubmFtZSAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50Lm5hbWUgIT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5LnRhc2sgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC50YXNrICE9PSBxdWVyeS50YXNrKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBxdWVyeS5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5pbmNsdWRlcyhxdWVyeS5yZWFzb25pbmdFZmZvcnQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgcXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChlbmRwb2ludC5kaW1lbnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gIT09IHF1ZXJ5LmRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPCBxdWVyeS5taW5EaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uID4gcXVlcnkubWF4RGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkgcmVzdWx0LnNldChlbmRwb2ludC5uYW1lLCBtb2RlbENsYXNzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogTm9ybWFsaXplIHNlcmlhbGl6ZWQgU0RLIGVuZHBvaW50IHJlY29yZHMgd2l0aG91dCBuYXRpdmUgYmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3Qgc3VtbWFyaWVzID0gZW5kcG9pbnRzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSByZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdWYWx1ZShlbmRwb2ludC5uYW1lKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBbXTtcbiAgICBjb25zdCBlbnRpdGllcyA9IGFycmF5VmFsdWUocmVjb3JkKGVuZHBvaW50LmNvbmZpZykuc2VydmVkX2VudGl0aWVzKS5tYXAocmVjb3JkKTtcbiAgICBjb25zdCBpZGVudGl0aWVzID0gW1xuICAgICAgbmFtZSxcbiAgICAgIC4uLmVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT5cbiAgICAgICAgW1xuICAgICAgICAgIHN0cmluZ1ZhbHVlKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICAgICAgc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSxcbiAgICAgICAgICBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSxcbiAgICAgICAgXS5maWx0ZXIoKGlkZW50aXR5KTogaWRlbnRpdHkgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWRlbnRpdHkpKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gZW50aXRpZXNcbiAgICAgIC5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+XG4gICAgICAgICAgc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSA/PyBzdHJpbmdWYWx1ZShlbnRpdHkuZW50aXR5X25hbWUpLFxuICAgICAgKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZm91bmRhdGlvbk1vZGVscyA9IGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiByZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpKTtcbiAgICBjb25zdCBmYW1pbHkgPVxuICAgICAgZm91bmRhdGlvbk1vZGVscy5tYXAoKG1vZGVsKSA9PiBzdHJpbmdWYWx1ZShtb2RlbC5tb2RlbF9jbGFzcykpLmZpbmQoQm9vbGVhbikgPz9cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsRmFtaWx5KS5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IHJlYXNvbmluZ0VmZm9ydHMgPVxuICAgICAgaWRlbnRpdGllcy5tYXAobW9kZWxSZWFzb25pbmdFZmZvcnRzKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQubGVuZ3RoIC0gbGVmdC5sZW5ndGgpWzBdID8/XG4gICAgICBbXTtcbiAgICBjb25zdCBwcm9maWxlID0gZW50aXRpZXMubWFwKG1vZGVsUHJvZmlsZSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXNSZWNvcmQgPSByZWNvcmQoZW5kcG9pbnQuY2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uRGVzY3JpcHRpb24gPSBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAubWFwKChtb2RlbCkgPT4gc3RyaW5nVmFsdWUobW9kZWwuZGVzY3JpcHRpb24pKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBzdHJpbmdWYWx1ZShlbmRwb2ludC5kZXNjcmlwdGlvbikgPz8gZm91bmRhdGlvbkRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IHN1bW1hcnk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVuZHBvaW50LCBlbnRpdGllcykpLFxuICAgICAgLi4uKGZhbWlseSA/IHsgZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVmFsdWUoZW5kcG9pbnQudGFzaykgPyB7IHRhc2s6IHN0cmluZ1ZhbHVlKGVuZHBvaW50LnRhc2spIH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVmFsdWUocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSlcbiAgICAgICAgPyB7IHN0YXRlOiBzdHJpbmdWYWx1ZShyZWNvcmQoZW5kcG9pbnQuc3RhdGUpLnJlYWR5KSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgc3VwcG9ydHNUb29sczpcbiAgICAgICAgYm9vbGVhblZhbHVlKGNhcGFiaWxpdGllc1JlY29yZC5mdW5jdGlvbl9jYWxsaW5nKSA/PyBpZGVudGl0aWVzLnNvbWUoc3VwcG9ydHNUb29sc0J5RmFtaWx5KSxcbiAgICAgIC4uLihwcm9maWxlID8geyBwcm9maWxlIH0gOiB7fSksXG4gICAgICBzZXJ2aWNlTmFtZXM6IE9iamVjdC5hc3NpZ24oe30sIC4uLmlkZW50aXRpZXMubWFwKG1vZGVsU2VydmljZU5hbWVzKSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgLi4uKHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID8geyByZWFzb25pbmdFZmZvcnRzIH0gOiB7fSksXG4gICAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKC4uLmlkZW50aXRpZXMpLFxuICAgIH07XG4gICAgcmV0dXJuIFtzdW1tYXJ5XTtcbiAgfSk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhzdW1tYXJpZXMpO1xuICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBjbGFzc2VzLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIHJldHVybiBtb2RlbENsYXNzID8geyAuLi5zdW1tYXJ5LCBjbGFzczogbW9kZWxDbGFzcyB9IDogc3VtbWFyeTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSYW5rZWQobGVmdDogUmFua2VkTW9kZWwsIHJpZ2h0OiBSYW5rZWRNb2RlbCk6IG51bWJlciB7XG4gIGNvbnN0IHNjb3JlID0gTWF0aC5yb3VuZCgobGVmdC5zY29yZSA/PyAwKSAqIDEwMDApIC0gTWF0aC5yb3VuZCgocmlnaHQuc2NvcmUgPz8gMCkgKiAxMDAwKTtcbiAgaWYgKHNjb3JlICE9PSAwKSByZXR1cm4gc2NvcmU7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxWYXJpYW50UmFuayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIS8oPzpefFstXy5dKWdwdCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDI7XG4gIGlmICgvKD86XnxbLV8uXSlzb2woPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAwO1xuICBpZiAoLyg/Ol58Wy1fLl0pbHVuYSg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xufVxuXG5mdW5jdGlvbiBzZWFyY2hhYmxlVmFsdWVzKGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgZW5kcG9pbnQuZmFtaWx5LFxuICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFByb2ZpbGUoZW50aXR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBjb25zdCBzb3VyY2UgPSByZWNvcmQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGUpO1xuICBjb25zdCBxdWFsaXR5ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5xdWFsaXR5KTtcbiAgY29uc3Qgc3BlZWQgPSBmaW5pdGVOdW1iZXIoc291cmNlLnNwZWVkKTtcbiAgY29uc3QgY29zdCA9IGZpbml0ZU51bWJlcihzb3VyY2UuY29zdCk7XG4gIGlmIChxdWFsaXR5ID09PSB1bmRlZmluZWQgJiYgc3BlZWQgPT09IHVuZGVmaW5lZCAmJiBjb3N0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uKHF1YWxpdHkgIT09IHVuZGVmaW5lZCA/IHsgcXVhbGl0eSB9IDoge30pLFxuICAgIC4uLihzcGVlZCAhPT0gdW5kZWZpbmVkID8geyBzcGVlZCB9IDoge30pLFxuICAgIC4uLihjb3N0ICE9PSB1bmRlZmluZWQgPyB7IGNvc3QgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShcbiAgZW5kcG9pbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbnRpdGllczogcmVhZG9ubHkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdGFnIG9mIGFycmF5VmFsdWUoZW5kcG9pbnQudGFncykubWFwKHJlY29yZCkpIHtcbiAgICBpZiAoIVtcImRpc3BsYXlfbmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIFwibmFtZVwiXS5pbmNsdWRlcyhTdHJpbmcodGFnLmtleSkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1ZhbHVlKHRhZy52YWx1ZSk7XG4gICAgaWYgKHZhbHVlKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBlbnRpdGllc1xuICAgICAgLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLmRpc3BsYXlfbmFtZSkpXG4gICAgICAuZmluZChCb29sZWFuKSA/P1xuICAgIGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSkuZmluZChCb29sZWFuKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgOiB7fTtcbn1cblxuZnVuY3Rpb24gYXJyYXlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUsvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHcEYsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2xDLE1BQU07SUFDTixZQUFZO0lBQ1osYUFBYTtJQUNiLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGVBQWU7SUFDZixTQUFTO0NBQ1YsQ0FBQyxDQUFDO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEdB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Q0FBQztRQUNoQixRQUFRO2FBQ0wsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWM7SUFDNUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcbmltcG9ydCB7IHRvTW9kZWxEaXNwbGF5TmFtZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9kaXNwbGF5XCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBtb2RlbFN0YXR1c0ZvciB9IGZyb20gXCIuL19yZXRpcmVtZW50LnRzXCI7XG5pbXBvcnQgeyBjbGFzc2VzQXRPckJlbG93LCBDSEFUX0NMQVNTX09SREVSLCBpc0NoYXRDbGFzcywgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeUVuZHBvaW50cyxcbiAgZW5kcG9pbnRDYXBhYmlsaXRpZXMsXG4gIHN1cHBvcnRzVG9vbHNCeUZhbWlseSxcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiLi9jbGFzc2lmeS50c1wiO1xuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsUmVhc29uaW5nRWZmb3J0cywgbW9kZWxTZXJ2aWNlTmFtZXMgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1R5cGU7XG5jb25zdCBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1ZhbHVlcztcblxuY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5jb25zdCBTRUFSQ0hfSU5URU5UX0ZJTExFUlMgPSBuZXcgU2V0KFtcImFcIiwgXCJiZXN0XCIsIFwiZm9yXCIsIFwibW9kZWxcIiwgXCJtb2RlbHNcIiwgXCJ0aGVcIl0pO1xuY29uc3QgQ0hBVF9TRUFSQ0hfSU5URU5UUyA9IG5ldyBTZXQoW1xuICBcImNoYXRcIixcbiAgXCJjb21wbGV0aW9uXCIsXG4gIFwiY29tcGxldGlvbnNcIixcbiAgXCJzdW1tYXJpemVcIixcbiAgXCJzdW1tYXJpc2VcIixcbiAgXCJzdW1tYXJpemF0aW9uXCIsXG4gIFwic3VtbWFyaXNhdGlvblwiLFxuICBcInN1bW1hcnlcIixcbl0pO1xuY29uc3QgRU1CRURESU5HX1NFQVJDSF9JTlRFTlRTID0gbmV3IFNldChbXG4gIFwiZW1iZWRcIixcbiAgXCJlbWJlZGRpbmdcIixcbiAgXCJlbWJlZGRpbmdzXCIsXG4gIFwidmVjdG9yXCIsXG4gIFwidmVjdG9yaXplXCIsXG4gIFwidmVjdG9yaXNlXCIsXG5dKTtcblxuaW50ZXJmYWNlIE5hdGl2ZVJhbmtpbmdPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZURlcHJlY2F0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzcztcbiAgcmVhZG9ubHkgdGFzaz86IHN0cmluZztcbn1cblxuLyoqIFJhbmsgZW5kcG9pbnQgcmVjb3JkcyB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0LW93bmVkIG1vZGVsIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rRW5kcG9pbnRzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbiAgb3B0aW9uczogTmF0aXZlUmFua2luZ09wdGlvbnMgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBmaWx0ZXJlZCA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiBtYXRjaGVzTW9kZWxRdWVyeShlbmRwb2ludCwgcXVlcnkpKTtcbiAgY29uc3Qgb3JpZ2luYWxCeU5hbWUgPSBuZXcgTWFwKGZpbHRlcmVkLm1hcCgoZW5kcG9pbnQpID0+IFtlbmRwb2ludC5uYW1lLCBlbmRwb2ludF0pKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGZpbHRlcmVkLm1hcCgoZW5kcG9pbnQpID0+ICh7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKG9wdGlvbnMubW9kZWxDbGFzcyA/IHsgY2xhc3M6IG9wdGlvbnMubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnRhc2sgPyB7IHRhc2s6IG9wdGlvbnMudGFzayB9IDoge30pLFxuICB9KSk7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBvcHRpb25zLm1vZGVsQ2xhc3NcbiAgICA/IHtcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgICAgICAgW29wdGlvbnMubW9kZWxDbGFzc106IG5vcm1hbGl6ZWQsXG4gICAgICB9XG4gICAgOiBjbGFzc2lmeUVuZHBvaW50cyhub3JtYWxpemVkKTtcbiAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoPy50cmltKCk7XG4gIGNvbnN0IHNlYXJjaFBsYW4gPSBzZWFyY2ggPyBtb2RlbFNlYXJjaFBsYW4oc2VhcmNoKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmFua2VkU2VhcmNoID0gc2VhcmNoUGxhbiA/IHNlYXJjaFBsYW4uc2VhcmNoIDogc2VhcmNoO1xuICBjb25zdCBzZWFyY2hJbnRlbnQgPSBzZWFyY2hQbGFuPy5tb2RlbENsYXNzO1xuICBjb25zdCByZXF1ZXN0ZWRDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcyA/PyBxdWVyeS5tb2RlbENsYXNzID8/IHNlYXJjaEludGVudDtcbiAgY29uc3QgaW5jbHVkZURlcHJlY2F0ZWQgPSBxdWVyeS5pbmNsdWRlRGVwcmVjYXRlZCA/PyBvcHRpb25zLmluY2x1ZGVEZXByZWNhdGVkID8/IGZhbHNlO1xuICBjb25zdCBlbGlnaWJsZSA9IHJlcXVlc3RlZENsYXNzID8gY2xhc3Nlc0F0T3JCZWxvdyhyZXF1ZXN0ZWRDbGFzcykgOiBDSEFUX0NMQVNTX09SREVSO1xuICBjb25zdCBjYW5kaWRhdGVzOiBSYW5rZWRNb2RlbFtdID0gW107XG4gIGNvbnN0IGV4cGxpY2l0Q2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3MgPz8gcXVlcnkubW9kZWxDbGFzcztcbiAgaWYgKFxuICAgIHNlYXJjaEludGVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgZXhwbGljaXRDbGFzcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgaXNDaGF0Q2xhc3Moc2VhcmNoSW50ZW50KSAhPT0gaXNDaGF0Q2xhc3MoZXhwbGljaXRDbGFzcylcbiAgKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChyYW5rZWRTZWFyY2ggJiYgcmVxdWVzdGVkQ2xhc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNsYXNzQnlOYW1lID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMobm9ybWFsaXplZCk7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBub3JtYWxpemVkKSB7XG4gICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCk7XG4gICAgICBpZiAoIWNhcGFiaWxpdGllcy5jaGF0IHx8IChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFjYXBhYmlsaXRpZXMudG9vbHMpKSBjb250aW51ZTtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBtb2RlbENsYXNzOiBjbGFzc0J5TmFtZS5nZXQoZW5kcG9pbnQubmFtZSkgPz8gTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGVsaWdpYmxlKSB7XG4gICAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIGNsYXNzaWZpZWRbbW9kZWxDbGFzc10pIHtcbiAgICAgICAgaWYgKCFpbmNsdWRlRGVwcmVjYXRlZCAmJiBlbmRwb2ludC5zdGF0dXM/LmRlcHJlY2F0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSBjb250aW51ZTtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgZW5kcG9pbnQsIG1vZGVsQ2xhc3MgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJhbmtlZCA9IGNhbmRpZGF0ZXM7XG4gIGlmIChyYW5rZWRTZWFyY2gpIHtcbiAgICBjb25zdCBleGFjdCA9IGNhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZW5kcG9pbnQubmFtZSA9PT0gcmFua2VkU2VhcmNoKTtcbiAgICBpZiAoZXhhY3QpIHtcbiAgICAgIHJhbmtlZCA9IFt7IC4uLmV4YWN0LCBzY29yZTogMCB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gcXVlcnkudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAgICAgY29uc3Qgc2VhcmNoVG9rZW5zID0gdG9rZW5pemUocmFua2VkU2VhcmNoKTtcbiAgICAgIGNvbnN0IHRva2VuTWF0Y2hlcyA9IGNhbmRpZGF0ZXNcbiAgICAgICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FuZGlkYXRlVG9rZW5zID0gbmV3IFNldChzZWFyY2hhYmxlVmFsdWVzKGNhbmRpZGF0ZS5lbmRwb2ludCkuZmxhdE1hcCh0b2tlbml6ZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWFyY2hUb2tlbnMubGVuZ3RoID4gMCAmJiBzZWFyY2hUb2tlbnMuZXZlcnkoKHRva2VuKSA9PiBjYW5kaWRhdGVUb2tlbnMuaGFzKHRva2VuKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChjYW5kaWRhdGUpID0+ICh7IC4uLmNhbmRpZGF0ZSwgc2NvcmU6IDAgfSkpO1xuICAgICAgaWYgKHRva2VuTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJhbmtlZCA9IHRva2VuTWF0Y2hlcy5zb3J0KGNvbXBhcmVSYW5rZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKGNhbmRpZGF0ZXMsIHtcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICBcImVuZHBvaW50Lm5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuZGlzcGxheU5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuZmFtaWx5XCIsXG4gICAgICAgICAgICBcImVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuc2VydmljZU5hbWVzXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgICAgaWdub3JlTG9jYXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIHVzZUV4dGVuZGVkU2VhcmNoOiB0cnVlLFxuICAgICAgICAgIGlzQ2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gdG9rZW5pemUocmFua2VkU2VhcmNoKS5qb2luKFwiIFwiKTtcbiAgICAgICAgcmFua2VkID0gbm9ybWFsaXplZFNlYXJjaFxuICAgICAgICAgID8gZnVzZVxuICAgICAgICAgICAgICAuc2VhcmNoKG5vcm1hbGl6ZWRTZWFyY2gpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHJlc3VsdCkgPT4gKHJlc3VsdC5zY29yZSA/PyAwKSA8PSB0aHJlc2hvbGQpXG4gICAgICAgICAgICAgIC5tYXAoKHJlc3VsdCkgPT4gKHsgLi4ucmVzdWx0Lml0ZW0sIHNjb3JlOiByZXN1bHQuc2NvcmUgPz8gMCB9KSlcbiAgICAgICAgICAgICAgLnNvcnQoY29tcGFyZVJhbmtlZClcbiAgICAgICAgICA6IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXN0b3JlZCA9IHJhbmtlZC5tYXAoKHJlc3VsdCkgPT4gKHtcbiAgICAuLi5yZXN1bHQsXG4gICAgZW5kcG9pbnQ6IG9yaWdpbmFsQnlOYW1lLmdldChyZXN1bHQuZW5kcG9pbnQubmFtZSkgPz8gcmVzdWx0LmVuZHBvaW50LFxuICB9KSk7XG4gIHJldHVybiBxdWVyeS5saW1pdCA9PT0gdW5kZWZpbmVkID8gcmVzdG9yZWQgOiByZXN0b3JlZC5zbGljZSgwLCBNYXRoLm1heCgwLCBxdWVyeS5saW1pdCkpO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVzTW9kZWxRdWVyeShlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSwgcXVlcnk6IE1vZGVsUXVlcnkpOiBib29sZWFuIHtcbiAgaWYgKHF1ZXJ5Lm5hbWUgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5uYW1lICE9PSBxdWVyeS5uYW1lKSByZXR1cm4gZmFsc2U7XG4gIGlmIChxdWVyeS50YXNrICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQudGFzayAhPT0gcXVlcnkudGFzaykgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgcXVlcnkucmVhc29uaW5nRWZmb3J0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAhZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cz8uaW5jbHVkZXMocXVlcnkucmVhc29uaW5nRWZmb3J0KVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFxuICAgIHF1ZXJ5LmRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkIHx8XG4gICAgcXVlcnkubWluRGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5tYXhEaW1lbnNpb24gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoZW5kcG9pbnQuZGltZW5zaW9uID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uICE9PSBxdWVyeS5kaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWluRGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uIDwgcXVlcnkubWluRGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50LmRpbWVuc2lvbiA+IHF1ZXJ5Lm1heERpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2xhc3NpZnkgY2hhdCBhbmQgZW1iZWRkaW5nIGVuZHBvaW50cyB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0LW93bmVkIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWFkb25seU1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+IHtcbiAgY29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5RW5kcG9pbnRzKGVuZHBvaW50cyk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBNb2RlbENsYXNzPigpO1xuICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgTU9ERUxfQ0xBU1NfT1JERVIpIHtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIGNsYXNzaWZpZWRbbW9kZWxDbGFzc10pIHJlc3VsdC5zZXQoZW5kcG9pbnQubmFtZSwgbW9kZWxDbGFzcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIE5vcm1hbGl6ZSBzZXJpYWxpemVkIFNESyBlbmRwb2ludCByZWNvcmRzIHdpdGhvdXQgbmF0aXZlIGJpbmRpbmdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVuZHBvaW50cyhlbmRwb2ludHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIGNvbnN0IHN1bW1hcmllcyA9IGVuZHBvaW50cy5mbGF0TWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gcmVjb3JkKHZhbHVlKTtcbiAgICBjb25zdCBuYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50Lm5hbWUpO1xuICAgIGlmICghbmFtZSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGVudGl0aWVzID0gYXJyYXlWYWx1ZShyZWNvcmQoZW5kcG9pbnQuY29uZmlnKS5zZXJ2ZWRfZW50aXRpZXMpLm1hcChyZWNvcmQpO1xuICAgIGNvbnN0IGlkZW50aXRpZXMgPSBbXG4gICAgICBuYW1lLFxuICAgICAgLi4uZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PlxuICAgICAgICBbXG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkubmFtZSksXG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZXh0ZXJuYWxfbW9kZWwpLm5hbWUpLFxuICAgICAgICBdLmZpbHRlcigoaWRlbnRpdHkpOiBpZGVudGl0eSBpcyBzdHJpbmcgPT4gQm9vbGVhbihpZGVudGl0eSkpLFxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IG1vZGVsU2VydmljZU5hbWUgPSBlbnRpdGllc1xuICAgICAgLm1hcChcbiAgICAgICAgKGVudGl0eSkgPT5cbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSA/P1xuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbnRpdHkuZW50aXR5X25hbWUpLFxuICAgICAgKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZm91bmRhdGlvbk1vZGVscyA9IGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiByZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpKTtcbiAgICBjb25zdCBmYW1pbHkgPVxuICAgICAgZm91bmRhdGlvbk1vZGVsc1xuICAgICAgICAubWFwKChtb2RlbCkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG1vZGVsLm1vZGVsX2NsYXNzKSlcbiAgICAgICAgLmZpbmQoQm9vbGVhbikgPz8gaWRlbnRpdGllcy5tYXAobW9kZWxGYW1pbHkpLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgcmVhc29uaW5nRWZmb3J0cyA9XG4gICAgICBpZGVudGl0aWVzLm1hcChtb2RlbFJlYXNvbmluZ0VmZm9ydHMpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5sZW5ndGggLSBsZWZ0Lmxlbmd0aClbMF0gPz9cbiAgICAgIFtdO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBlbnRpdGllcy5tYXAobW9kZWxQcm9maWxlKS5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllc1JlY29yZCA9IHJlY29yZChlbmRwb2ludC5jYXBhYmlsaXRpZXMpO1xuICAgIGNvbnN0IGZvdW5kYXRpb25EZXNjcmlwdGlvbiA9IGZvdW5kYXRpb25Nb2RlbHNcbiAgICAgIC5tYXAoKG1vZGVsKSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQobW9kZWwuZGVzY3JpcHRpb24pKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQuZGVzY3JpcHRpb24pID8/IGZvdW5kYXRpb25EZXNjcmlwdGlvbjtcbiAgICBjb25zdCBzdW1tYXJ5OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiB0b01vZGVsRGlzcGxheU5hbWUobmFtZSwgcHJvdmlkZWREaXNwbGF5TmFtZShlbmRwb2ludCwgZW50aXRpZXMpKSxcbiAgICAgIC4uLihmYW1pbHkgPyB7IGZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC50YXNrKVxuICAgICAgICA/IHsgdGFzazogc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50LnRhc2spIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbmRwb2ludC5zdGF0ZSkucmVhZHkpXG4gICAgICAgID8geyBzdGF0ZTogc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbmRwb2ludC5zdGF0ZSkucmVhZHkpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICBzdXBwb3J0c1Rvb2xzOlxuICAgICAgICBib29sZWFuVmFsdWUoY2FwYWJpbGl0aWVzUmVjb3JkLmZ1bmN0aW9uX2NhbGxpbmcpID8/IGlkZW50aXRpZXMuc29tZShzdXBwb3J0c1Rvb2xzQnlGYW1pbHkpLFxuICAgICAgLi4uKHByb2ZpbGUgPyB7IHByb2ZpbGUgfSA6IHt9KSxcbiAgICAgIHNlcnZpY2VOYW1lczogT2JqZWN0LmFzc2lnbih7fSwgLi4uaWRlbnRpdGllcy5tYXAobW9kZWxTZXJ2aWNlTmFtZXMpKSxcbiAgICAgIC4uLihtb2RlbFNlcnZpY2VOYW1lID8geyBtb2RlbFNlcnZpY2VOYW1lIH0gOiB7fSksXG4gICAgICAuLi4ocmVhc29uaW5nRWZmb3J0cy5sZW5ndGggPyB7IHJlYXNvbmluZ0VmZm9ydHMgfSA6IHt9KSxcbiAgICAgIHN0YXR1czogbW9kZWxTdGF0dXNGb3IoLi4uaWRlbnRpdGllcyksXG4gICAgfTtcbiAgICByZXR1cm4gW3N1bW1hcnldO1xuICB9KTtcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKHN1bW1hcmllcyk7XG4gIHJldHVybiBzdW1tYXJpZXMubWFwKChzdW1tYXJ5KSA9PiB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IGNsYXNzZXMuZ2V0KHN1bW1hcnkubmFtZSk7XG4gICAgcmV0dXJuIG1vZGVsQ2xhc3MgPyB7IC4uLnN1bW1hcnksIGNsYXNzOiBtb2RlbENsYXNzIH0gOiBzdW1tYXJ5O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVJhbmtlZChsZWZ0OiBSYW5rZWRNb2RlbCwgcmlnaHQ6IFJhbmtlZE1vZGVsKTogbnVtYmVyIHtcbiAgY29uc3Qgc2NvcmUgPSBNYXRoLnJvdW5kKChsZWZ0LnNjb3JlID8/IDApICogMTAwMCkgLSBNYXRoLnJvdW5kKChyaWdodC5zY29yZSA/PyAwKSAqIDEwMDApO1xuICBpZiAoc2NvcmUgIT09IDApIHJldHVybiBzY29yZTtcbiAgY29uc3QgbGVmdFZlcnNpb24gPSB2ZXJzaW9uVHVwbGUobGVmdC5lbmRwb2ludC5uYW1lKTtcbiAgY29uc3QgcmlnaHRWZXJzaW9uID0gdmVyc2lvblR1cGxlKHJpZ2h0LmVuZHBvaW50Lm5hbWUpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHZlcnNpb24gPSByaWdodFZlcnNpb25baW5kZXhdISAtIGxlZnRWZXJzaW9uW2luZGV4XSE7XG4gICAgaWYgKHZlcnNpb24gIT09IDApIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIGNvbnN0IHZhcmlhbnQgPSBtb2RlbFZhcmlhbnRSYW5rKGxlZnQuZW5kcG9pbnQubmFtZSkgLSBtb2RlbFZhcmlhbnRSYW5rKHJpZ2h0LmVuZHBvaW50Lm5hbWUpO1xuICBpZiAodmFyaWFudCAhPT0gMCkgcmV0dXJuIHZhcmlhbnQ7XG4gIHJldHVybiBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGxlZnQubW9kZWxDbGFzcykgLSBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKHJpZ2h0Lm1vZGVsQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFZhcmlhbnRSYW5rKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICghLyg/Ol58Wy1fLl0pZ3B0KD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpKSByZXR1cm4gMjtcbiAgaWYgKC8oPzpefFstXy5dKXNvbCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDA7XG4gIGlmICgvKD86XnxbLV8uXSlsdW5hKD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpKSByZXR1cm4gMTtcbiAgcmV0dXJuIDI7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBnZW5lcmljIGpvYiBzZWFyY2hlcyB0byB0aGUgY2FwYWJpbGl0eSBjbGFzcyB0aGF0IG93bnMgdGhlIHdvcmsuXG4gKlxuICogQSBwdXJlIGludGVudCBzdWNoIGFzIFwic3VtbWFyaXplXCIgcmFua3MgdGhhdCBjYXBhYmlsaXR5IGRpcmVjdGx5LiBNaXhlZFxuICogcXVlcmllcyByZW1vdmUgdGhlIGludGVudCB3b3JkIGJ1dCByZXRhaW4gdGhlIG1vZGVsIGlkZW50aXR5LCBzbyBcImdwdCBjaGF0XCJcbiAqIHN0aWxsIHVzZXMgdGhlIGhpc3RvcmljYWwgdmVyc2lvbiBhbmQgdmFyaWFudCBwcmVmZXJlbmNlIGZvciBHUFQuXG4gKi9cbmZ1bmN0aW9uIG1vZGVsU2VhcmNoUGxhbihcbiAgc2VhcmNoOiBzdHJpbmcsXG4pOiB7IHJlYWRvbmx5IG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3M7IHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemUoc2VhcmNoKS5maWx0ZXIoKHRva2VuKSA9PiAhU0VBUkNIX0lOVEVOVF9GSUxMRVJTLmhhcyh0b2tlbikpO1xuICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY2hhdCA9IHRva2Vucy5zb21lKCh0b2tlbikgPT4gQ0hBVF9TRUFSQ0hfSU5URU5UUy5oYXModG9rZW4pKTtcbiAgY29uc3QgZW1iZWRkaW5nID0gdG9rZW5zLnNvbWUoKHRva2VuKSA9PiBFTUJFRERJTkdfU0VBUkNIX0lOVEVOVFMuaGFzKHRva2VuKSk7XG4gIGlmIChjaGF0ID09PSBlbWJlZGRpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGludGVudFdvcmRzID0gY2hhdCA/IENIQVRfU0VBUkNIX0lOVEVOVFMgOiBFTUJFRERJTkdfU0VBUkNIX0lOVEVOVFM7XG4gIGNvbnN0IHJlbWFpbmluZyA9IHRva2Vucy5maWx0ZXIoKHRva2VuKSA9PiAhaW50ZW50V29yZHMuaGFzKHRva2VuKSk7XG4gIHJldHVybiB7XG4gICAgbW9kZWxDbGFzczogY2hhdCA/IE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nIDogTW9kZWxDbGFzcy5FbWJlZGRpbmcsXG4gICAgLi4uKHJlbWFpbmluZy5sZW5ndGggPiAwID8geyBzZWFyY2g6IHJlbWFpbmluZy5qb2luKFwiIFwiKSB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xufVxuXG5mdW5jdGlvbiBzZWFyY2hhYmxlVmFsdWVzKGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgZW5kcG9pbnQuZmFtaWx5LFxuICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFByb2ZpbGUoZW50aXR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBjb25zdCBzb3VyY2UgPSByZWNvcmQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGUpO1xuICBjb25zdCBxdWFsaXR5ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5xdWFsaXR5KTtcbiAgY29uc3Qgc3BlZWQgPSBmaW5pdGVOdW1iZXIoc291cmNlLnNwZWVkKTtcbiAgY29uc3QgY29zdCA9IGZpbml0ZU51bWJlcihzb3VyY2UuY29zdCk7XG4gIGlmIChxdWFsaXR5ID09PSB1bmRlZmluZWQgJiYgc3BlZWQgPT09IHVuZGVmaW5lZCAmJiBjb3N0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uKHF1YWxpdHkgIT09IHVuZGVmaW5lZCA/IHsgcXVhbGl0eSB9IDoge30pLFxuICAgIC4uLihzcGVlZCAhPT0gdW5kZWZpbmVkID8geyBzcGVlZCB9IDoge30pLFxuICAgIC4uLihjb3N0ICE9PSB1bmRlZmluZWQgPyB7IGNvc3QgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShcbiAgZW5kcG9pbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbnRpdGllczogcmVhZG9ubHkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdGFnIG9mIGFycmF5VmFsdWUoZW5kcG9pbnQudGFncykubWFwKHJlY29yZCkpIHtcbiAgICBpZiAoIVtcImRpc3BsYXlfbmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIFwibmFtZVwiXS5pbmNsdWRlcyhTdHJpbmcodGFnLmtleSkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZCh0YWcudmFsdWUpO1xuICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkuZGlzcGxheV9uYW1lKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pID8/XG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZXh0ZXJuYWxfbW9kZWwpLm5hbWUpKVxuICAgICAgLmZpbmQoQm9vbGVhbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIGFycmF5VmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -92,8 +92,8 @@ export declare function classifyByFamily(name: string): FamilyClass | null;
92
92
  * within each chat band.
93
93
  *
94
94
  * Embedding endpoints (`task === "llm/v1/embeddings"`) go into
95
- * {@link ModelClass.Embedding} by task, in listing order (they carry no
96
- * capability score to rank on).
95
+ * {@link ModelClass.Embedding} by task. Published profile quality ranks first;
96
+ * otherwise newer parsed versions rank first.
97
97
  *
98
98
  * Chat endpoints (`task === "llm/v1/chat"`) split into the three chat
99
99
  * bands. Scored endpoints (those carrying a `profile.quality`) drive
@@ -211,8 +211,8 @@ function rankOrder(a, b) {
211
211
  * within each chat band.
212
212
  *
213
213
  * Embedding endpoints (`task === "llm/v1/embeddings"`) go into
214
- * {@link ModelClass.Embedding} by task, in listing order (they carry no
215
- * capability score to rank on).
214
+ * {@link ModelClass.Embedding} by task. Published profile quality ranks first;
215
+ * otherwise newer parsed versions rank first.
216
216
  *
217
217
  * Chat endpoints (`task === "llm/v1/chat"`) split into the three chat
218
218
  * bands. Scored endpoints (those carrying a `profile.quality`) drive
@@ -279,8 +279,21 @@ export function classifyEndpoints(endpoints) {
279
279
  version: versionTuple(ep.name),
280
280
  });
281
281
  }
282
- // Embeddings are bucketed by task in listing order - no score to rank.
283
- const embeddings = endpoints.filter((e) => e.task === EMBEDDING_TASK);
282
+ const embeddings = endpoints
283
+ .filter((endpoint) => endpoint.task === EMBEDDING_TASK)
284
+ .map((endpoint) => {
285
+ const quality = endpoint.profile?.quality;
286
+ return {
287
+ ep: endpoint,
288
+ sort: quality ?? versionScore(endpoint.name),
289
+ scored: quality !== undefined,
290
+ tieCost: endpoint.profile?.cost ?? Number.POSITIVE_INFINITY,
291
+ tieSpeed: endpoint.profile?.speed ?? 0,
292
+ version: versionTuple(endpoint.name),
293
+ };
294
+ })
295
+ .sort(rankOrder)
296
+ .map(({ ep }) => ep);
284
297
  return {
285
298
  [ModelClass.ChatThinking]: buckets[ModelClass.ChatThinking].sort(rankOrder).map((x) => x.ep),
286
299
  [ModelClass.ChatBalanced]: buckets[ModelClass.ChatBalanced].sort(rankOrder).map((x) => x.ep),
@@ -288,4 +301,4 @@ export function classifyEndpoints(endpoints) {
288
301
  [ModelClass.Embedding]: embeddings,
289
302
  };
290
303
  }
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUdMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUczQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxnRUFBZ0U7QUFDaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBRWhDLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEUsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdDO0lBQ25FLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUM5Riw4RUFBOEU7SUFDOUUsOENBQThDO0lBQzlDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztJQUN6RixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLElBQUksS0FBSyxHQUFHLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJO1NBQ2QsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUNaLEtBQUssQ0FBQyxhQUFhLENBQUM7U0FDcEIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFvQixFQUFFLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztTQUMxRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBQXVCLEVBQUUsS0FBd0I7SUFDcEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsU0FBUyxrQkFBa0IsQ0FBQyxDQUFvQixFQUFFLENBQW9CO0lBQ3BFLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLEtBQUssR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQWUsRUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFckYsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhELDREQUE0RDtJQUM1RCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELG9CQUFvQjtJQUNwQixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhELGFBQWE7SUFDYixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxlQUFlO0lBQ2YsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUzRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsU0FBUyxRQUFRLENBQUMsU0FBNEIsRUFBRSxDQUFTO0lBQ3ZELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLElBQUksRUFBRSxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsQ0FBQztJQUNyQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBZUQsU0FBUyxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDckMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTztRQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzFELElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlELGtFQUFrRTtJQUNsRSwyREFB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QUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsQ0FBQztJQUV0RSxPQUFPO1FBQ0wsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVTtLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kZWwtY2xhc3MgY2xhc3NpZmljYXRpb24gZm9yIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMuXG4gKlxuICogQ2hhdCBjYXBhYmlsaXR5IGJhbmRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGxpdmUgd29ya3NwYWNlIGNhdGFsb2d1ZVxuICogcmF0aGVyIHRoYW4gYSBoYW5kLW1haW50YWluZWQgdGFibGUuIERhdGFicmlja3MgcHVibGlzaGVzXG4gKiBwZXItZW5kcG9pbnQgYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXMgKHRoZSBBSSBQbGF5Z3JvdW5kXG4gKiBiYXJzKSBvbiB0aGUgc2VydmluZyBsaXN0OyB7QGxpbmsgY2xhc3NpZnlFbmRwb2ludHN9IGJ1Y2tldHMgc2NvcmVkXG4gKiBjaGF0IG1vZGVscyBpbnRvIHRoZSBjaGF0IHtAbGluayBNb2RlbENsYXNzfSBiYW5kcyBieSB0aGUgKnJlbGF0aXZlKlxuICogZGlzdHJpYnV0aW9uIG9mIHRob3NlIHNjb3JlcyAocXVhbnRpbGVzLCBub3QgZml4ZWQgY3V0LW9mZnMpIHNvIGFcbiAqIGJyYW5kLW5ldyBtb2RlbCB0aGF0IGxhbmRzIG91dHNpZGUgdG9kYXkncyBzY29yZSByYW5nZSBzdGlsbCBzbG90cyBpblxuICogbmV4dCB0byBpdHMgcGVlcnMuIEVtYmVkZGluZyBlbmRwb2ludHMgKGB0YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCJgKVxuICogYXJlIGJ1Y2tldGVkIGludG8ge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbmRlcGVuZGVudCBvZlxuICogYW55IHNjb3JlLlxuICpcbiAqIFVuc2NvcmVkLWJ1dC1yZWNvZ25pemFibGUgY2hhdCBlbmRwb2ludHMgYXJlIHN0aWxsIHBsYWNlZCBieSBhIHNtYWxsXG4gKiBmYW1pbHkgaGV1cmlzdGljICh7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0pIHNvIGEgd29ya3NwYWNlIHdob3NlXG4gKiBtb2RlbHMgcHJlZGF0ZSBGb3VuZGF0aW9uIE1vZGVsIEFQSSBzY29yaW5nIGtlZXBzIHdvcmtpbmcuIFRoZVxuICogb2ZmbGluZSBmYWxsYmFjayBmbG9vciAtIHRoZSBoYXJkLWNvZGVkIG1vZGVsIGxpc3QgcmVhY2hlZCBmb3Igd2hlblxuICogdGhlIGxpdmUgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQgYXQgYWxsIC0gaXMgYSBzZXJ2ZXIgY29uY2VybiBhbmRcbiAqIGxpdmVzIGluIGBAZGJ4LXRvb2xzL21vZGVsYCwgbm90IGhlcmU6IGEgYnJvd3NlciBjbGllbnQgbmV2ZXIgdGFsa3NcbiAqIHRvIERhdGFicmlja3MgZGlyZWN0bHksIHNvIGl0IGhhcyBub3RoaW5nIHRvIGZhbGwgYmFjayB0by5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgaW1wb3J0cyksIHNvIGEgY2xpZW50IGNhbiBjbGFzc2lmeSBhIGAvbW9kZWxzYFxuICogcmVzcG9uc2Ugd2l0aG91dCBzZXJ2ZXIgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICB0eXBlIEVuZHBvaW50Q2FwYWJpbGl0aWVzLFxuICB0eXBlIEZhbWlseUNsYXNzLFxuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NUeXBlO1xuY29uc3QgTW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3NWYWx1ZXM7XG5cbi8qKiBUYXNrIGhpbnQgRGF0YWJyaWNrcyBzdGFtcHMgb24gY2hhdCBjb21wbGV0aW9uIGVuZHBvaW50cy4gKi9cbmNvbnN0IENIQVRfVEFTSyA9IFwibGxtL3YxL2NoYXRcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBlbWJlZGRpbmcgZW5kcG9pbnRzLiAqL1xuY29uc3QgRU1CRURESU5HX1RBU0sgPSBcImxsbS92MS9lbWJlZGRpbmdzXCI7XG5cbi8qKlxuICogUHJvdmlkZXIgZmFtaWxpZXMgdmVyaWZpZWQgYWdhaW5zdCBEYXRhYnJpY2tzIFJlc3BvbnNlcy9PcGVuIFJlc3BvbnNlcyB3aXRoXG4gKiBib3RoIGEgZm9yY2VkIGZ1bmN0aW9uIGNhbGwgYW5kIGEgc3RhdGVsZXNzIGBmdW5jdGlvbl9jYWxsX291dHB1dGAgcmVwbGF5LlxuICpcbiAqIERhdGFicmlja3MnIGVuZHBvaW50IGxpc3QvT3BlbkFQSSBjdXJyZW50bHkgZXhwb3NlcyBubyB0b29scyBjYXBhYmlsaXR5IGJpdC5cbiAqIEtlZXAgdGhpcyBjb25zZXJ2YXRpdmU6IGFuIHVua25vd24gY2hhdCBmYW1pbHkgaXMgbm90IGFnZW50LXNhZmUgdW50aWwgaXQgaXNcbiAqIHZlcmlmaWVkLiBHZW1pbmkgaXMgZXhjbHVkZWQgYmVjYXVzZSBpdCBlbWl0cyBhIGNhbGwgYnV0IE9wZW4gUmVzcG9uc2VzXG4gKiBjYW5ub3QgcmVwbGF5IHRoZSByZXF1aXJlZCB0aG91Z2h0IHNpZ25hdHVyZTsgR1BULU9TUyByZWplY3RzIFJlc3BvbnNlc1xuICogcGFzc3Rocm91Z2ggZW50aXJlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpIHx8IG4uaW5jbHVkZXMoXCJncHQtb3NzXCIpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoXG4gICAgbi5pbmNsdWRlcyhcImNsYXVkZVwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJncHRcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwicXdlblwiKSB8fFxuICAgIG4uaW5jbHVkZXMoXCJnbG1cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwibGxhbWFcIilcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gZW5kcG9pbnQncyBjYXBhYmlsaXRpZXMgZnJvbSBpdHMgRGF0YWJyaWNrcyB0YXNrIGhpbnQgYW5kIGl0c1xuICogY2xhc3NpZmllZCB7QGxpbmsgTW9kZWxDbGFzc30sIHNvIGNvbnN1bWVycyBmaWx0ZXIgb24gY2FwYWJpbGl0eSBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCBmcm9tIHJhdyBgdGFza2AgLyBgY2xhc3NgIHN0cmluZ3MuXG4gKlxuICogRWl0aGVyIHNpZ25hbCBhbG9uZSBpcyBlbm91Z2g6IHRoZSB0YXNrIGhpbnQgaXMgYXV0aG9yaXRhdGl2ZSB3aGVuIHByZXNlbnQsXG4gKiBhbmQgdGhlIGNsYXNzIGNvdmVycyBlbmRwb2ludHMgRGF0YWJyaWNrcyBsZWZ0IHVudGFza2VkIGJ1dCB0aGUgY2xhc3NpZmllclxuICogcmVjb2duaXplZC4gRW1iZWRkaW5nIHdpbnMgb3ZlciBjaGF0IHdoZW4gYm90aCBwb2ludCBhdCBpdCwgc2luY2UgdGhlIHR3byBhcmVcbiAqIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgZW1iZWRkaW5nID0gZW5kcG9pbnQudGFzayA9PT0gRU1CRURESU5HX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICAvLyBFdmVyeSBub24tZW1iZWRkaW5nIGNsYXNzIGlzIGEgY2hhdCBiYW5kLCBzbyBcImNsYXNzaWZpZWQgYnV0IG5vdCBlbWJlZGRpbmdcIlxuICAvLyBpcyB0aGUgY2xhc3Mtc2lkZSB0ZXN0IGZvciBjaGF0IGNhcGFiaWxpdHkuXG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBDSEFUX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRvb2xzID0gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZW5kcG9pbnQubmFtZSkpO1xuICByZXR1cm4geyBjaGF0LCBlbWJlZGRpbmcsIHRvb2xzIH07XG59XG5cbi8qKlxuICogTnVtZXJpYyBgW21ham9yLCBtaW5vciwgcGF0Y2hdYCB2ZXJzaW9uIHBhcnNlZCBmcm9tIGFuIGVuZHBvaW50XG4gKiBuYW1lLCB1c2VkIHRvIG9yZGVyIHNpYmxpbmdzIHdpdGhpbiBhIGZhbWlseS90aWVyLiBTdGFydHMgYXQgdGhlXG4gKiBmaXJzdCBkaWdpdCBpbiB0aGUgbmFtZSwgdGhlbiByZWFkcyBzdWNjZXNzaXZlIHNlcGFyYXRvci1kZWxpbWl0ZWQsXG4gKiBkaWdpdC1wcmVmaXhlZCBjaHVua3MgYXMgdGhlIHRocmVlIGNvbXBvbmVudHMgKG1pc3Npbmcgb25lcyBkZWZhdWx0XG4gKiB0byBgMGApOlxuICpcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LThgICAgLT4gYFs0LCA4LCAwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LTEwYCAgLT4gYFs0LCAxMCwgMF1gIChzb3J0cyBhYm92ZSA0LTgpXG4gKiAgIC0gYGRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiYC0+IGBbMywgMywgNzBdYFxuICogICAtIGBkYXRhYnJpY2tzLWJnZS1sYXJnZS1lbmAgICAgICAtPiBgWzAsIDAsIDBdYCAobm8gZGlnaXRzKVxuICpcbiAqIENvbXBvbmVudC13aXNlIGNvbXBhcmlzb24gKG5vdCBhIGRlY2ltYWwgY29sbGFwc2UpIHNvIGA0LjEwYCBiZWF0c1xuICogYDQuOGAgLSB0aGUgYnVnIGEgYG1ham9yICsgbWlub3IvMTBgIHNjb3JlIHdvdWxkIGhpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25UdXBsZShuYW1lOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzdGFydCA9IG5hbWUuc2VhcmNoKC9cXGQvKTtcbiAgaWYgKHN0YXJ0IDwgMCkgcmV0dXJuIFswLCAwLCAwXTtcbiAgY29uc3QgbnVtcyA9IG5hbWVcbiAgICAuc2xpY2Uoc3RhcnQpXG4gICAgLnNwbGl0KC9bXmEtejAtOV0rL2kpXG4gICAgLm1hcCgoY2h1bmspID0+IGNodW5rLm1hdGNoKC9eXFxkKy8pPy5bMF0pXG4gICAgLmZpbHRlcigoZGlnaXRzKTogZGlnaXRzIGlzIHN0cmluZyA9PiBkaWdpdHMgIT09IHVuZGVmaW5lZClcbiAgICAubWFwKE51bWJlcik7XG4gIHJldHVybiBbbnVtc1swXSA/PyAwLCBudW1zWzFdID8/IDAsIG51bXNbMl0gPz8gMF07XG59XG5cbi8qKlxuICogQ29tcGFyZSB2ZXJzaW9uIHR1cGxlcyBjb21wb25lbnQtd2lzZSB3aXRoIG1pc3NpbmcgcGFydHMgYXMgMC5cbiAqIFBvc2l0aXZlIHdoZW4gYGxlZnRgIGlzIG5ld2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb25UdXBsZXMobGVmdDogcmVhZG9ubHkgbnVtYmVyW10sIHJpZ2h0OiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlciB7XG4gIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgsIDMpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGlmZiA9IChsZWZ0W2luZGV4XSA/PyAwKSAtIChyaWdodFtpbmRleF0gPz8gMCk7XG4gICAgaWYgKGRpZmYgIT09IDApIHJldHVybiBkaWZmO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKiogQ29tcGFyZSB0d28gdmVyc2lvbiB0dXBsZXMgc28gdGhlIGhpZ2hlciB2ZXJzaW9uIHNvcnRzIGZpcnN0IChkZXNjZW5kaW5nKS4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uRGVzYyhhOiByZWFkb25seSBudW1iZXJbXSwgYjogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXIge1xuICByZXR1cm4gY29tcGFyZVZlcnNpb25UdXBsZXMoYiwgYSk7XG59XG5cbi8qKlxuICogTW9ub3RvbmljIHZlcnNpb24ga2V5IGZvciBvcmRlcmluZyBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllclxuICogKGUuZy4gYG9wdXMtNC04YCBvdmVyIGBvcHVzLTQtN2ApLiBFbmNvZGVzIHRoZSB7QGxpbmsgdmVyc2lvblR1cGxlfVxuICogYXMgYSBzaW5nbGUgbnVtYmVyIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGEgc2NhbGFyIHJhbmsgKHRoZSBmYW1pbHlcbiAqIGhldXJpc3RpYywgdGhlIHN0YXRpYyBmYWxsYmFjayBvcmRlcmluZykga2VlcCB3b3JraW5nOyB0aGUgZW5jb2RpbmdcbiAqIHByZXNlcnZlcyBjb21wb25lbnQgb3JkZXIgd2l0aG91dCB0aGUgZGVjaW1hbC1jb2xsYXBzZSBidWcuXG4gKi9cbmZ1bmN0aW9uIHZlcnNpb25TY29yZShuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uVHVwbGUobmFtZSk7XG4gIHJldHVybiBtYWpvciAqIDFfMDAwXzAwMCArIG1pbm9yICogMV8wMDAgKyBwYXRjaDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBjaGF0IGNhcGFiaWxpdHkgYmFuZCBmb3IgYW4gZW5kcG9pbnQgd2UgaGF2ZSBubyBsaXZlXG4gKiBzY29yZSBmb3IsIGtleWVkIG9mZiBwcm92aWRlciBmYW1pbHkgYW5kIHRoZSB3ZWxsLWtub3duIHZhcmlhbnQgd29yZHNcbiAqIGluIHRoZSBuYW1lIChgb3B1c2AvYHNvbm5ldGAvYGhhaWt1YCwgYHByb2AvYG1pbmlgL2BuYW5vYCxcbiAqIGBmbGFzaGAvYGZsYXNoLWxpdGVgLCBMbGFtYSBwYXJhbWV0ZXIgc2l6ZXMsIGV0YykuIFJldHVybnMgYG51bGxgIGZvclxuICogbmFtZXMgd2UgZG9uJ3QgcmVjb2duaXplIHNvIHVua25vd24gY3VzdG9tIGVuZHBvaW50cyBhcmUgbmV2ZXJcbiAqIGF1dG8tc2VsZWN0ZWQgYXMgYSBkZWZhdWx0LiBUaGUgYWNjb21wYW55aW5nIGByYW5rYCBvcmRlcnMgc2libGluZ3NcbiAqIHdpdGhpbiBhIGNsYXNzLiBPbmx5IGV2ZXIgcmV0dXJucyBhIGNoYXQgYmFuZCAtIGVtYmVkZGluZyBlbmRwb2ludHNcbiAqIGFyZSBjbGFzc2lmaWVkIGJ5IHRhc2ssIG5vdCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBGYW1pbHlDbGFzcyB8IG51bGwge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAobi5pbmNsdWRlcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChuLmluY2x1ZGVzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAobi5pbmNsdWRlcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkge1xuICAgIHJldHVybiBhdChuLmluY2x1ZGVzKFwiMTIwYlwiKSA/IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkIDogTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gIH1cbiAgLy8gT3BlbkFJIEdQVCBmYW1pbHlcbiAgaWYgKG4uaW5jbHVkZXMoXCJncHRcIikpIHtcbiAgICBpZiAobi5pbmNsdWRlcyhcInByb1wiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIm1pbmlcIikgfHwgbi5pbmNsdWRlcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJmbGFzaC1saXRlXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAobi5pbmNsdWRlcyhcImdlbW1hXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gTWV0YSBMbGFtYVxuICBpZiAobi5pbmNsdWRlcyhcImxsYW1hXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtYXZlcmlja1wiKSB8fCBuLmluY2x1ZGVzKFwiNDA1YlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjcwYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjhiXCIpIHx8IG4uaW5jbHVkZXMoXCIxYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cblxuICAvLyBBbGliYWJhIFF3ZW5cbiAgaWYgKG4uaW5jbHVkZXMoXCJxd2VuXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogTGluZWFyLWludGVycG9sYXRlZCBxdWFudGlsZSBvZiBhbiBhc2NlbmRpbmctc29ydGVkIG51bWVyaWMgYXJyYXkuICovXG5mdW5jdGlvbiBxdWFudGlsZShzb3J0ZWRBc2M6IHJlYWRvbmx5IG51bWJlcltdLCBwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoc29ydGVkQXNjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIE51bWJlci5OYU47XG4gIGNvbnN0IGlkeCA9IChzb3J0ZWRBc2MubGVuZ3RoIC0gMSkgKiBwO1xuICBjb25zdCBsbyA9IE1hdGguZmxvb3IoaWR4KTtcbiAgY29uc3QgaGkgPSBNYXRoLmNlaWwoaWR4KTtcbiAgaWYgKGxvID09PSBoaSkgcmV0dXJuIHNvcnRlZEFzY1tsb10hO1xuICByZXR1cm4gc29ydGVkQXNjW2xvXSEgKyAoc29ydGVkQXNjW2hpXSEgLSBzb3J0ZWRBc2NbbG9dISkgKiAoaWR4IC0gbG8pO1xufVxuXG4vKiogSW50ZXJuYWwgc29ydGFibGUgd3JhcHBlciBjYXJyeWluZyB0aGUgb3JkZXJpbmcga2V5cyBmb3IgYSBidWNrZXQgZW50cnkuICovXG5pbnRlcmZhY2UgUmFua2VkIHtcbiAgZXA6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBRdWFsaXR5IChzY29yZWQpIG9yIGZhbWlseSB2ZXJzaW9uICh1bnNjb3JlZCkgLSBoaWdoZXIgZmlyc3QuICovXG4gIHNvcnQ6IG51bWJlcjtcbiAgLyoqIFNjb3JlZCBlbmRwb2ludHMgcmFuayBhaGVhZCBvZiBmYW1pbHktb25seSBndWVzc2VzLiAqL1xuICBzY29yZWQ6IGJvb2xlYW47XG4gIHRpZUNvc3Q6IG51bWJlcjtcbiAgdGllU3BlZWQ6IG51bWJlcjtcbiAgLyoqIFBhcnNlZCBuYW1lIHZlcnNpb24sIHRoZSBmaW5hbCB0aWUtYnJlYWtlciAobmV3ZXIgc2libGluZyBmaXJzdCkuICovXG4gIHZlcnNpb246IHJlYWRvbmx5IG51bWJlcltdO1xufVxuXG5mdW5jdGlvbiByYW5rT3JkZXIoYTogUmFua2VkLCBiOiBSYW5rZWQpOiBudW1iZXIge1xuICBpZiAoYS5zY29yZWQgIT09IGIuc2NvcmVkKSByZXR1cm4gYS5zY29yZWQgPyAtMSA6IDE7XG4gIGlmIChiLnNvcnQgIT09IGEuc29ydCkgcmV0dXJuIGIuc29ydCAtIGEuc29ydDtcbiAgaWYgKGEudGllQ29zdCAhPT0gYi50aWVDb3N0KSByZXR1cm4gYS50aWVDb3N0IC0gYi50aWVDb3N0O1xuICBpZiAoYi50aWVTcGVlZCAhPT0gYS50aWVTcGVlZCkgcmV0dXJuIGIudGllU3BlZWQgLSBhLnRpZVNwZWVkO1xuICAvLyBTYW1lIHNjb3JlZC1uZXNzLCBxdWFsaXR5LCBjb3N0LCBhbmQgc3BlZWQgKGUuZy4gc2V2ZXJhbCBDbGF1ZGVcbiAgLy8gT3B1cyBwb2ludCByZWxlYXNlcyk6IHByZWZlciB0aGUgbmV3ZXIgcGFyc2VkIHZlcnNpb24gc29cbiAgLy8gYG9wdXMtNC04YCBiZWF0cyBgb3B1cy00LTdgLlxuICByZXR1cm4gY29tcGFyZVZlcnNpb25EZXNjKGEudmVyc2lvbiwgYi52ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBCdWNrZXQgbGl2ZSBlbmRwb2ludHMgaW50byB7QGxpbmsgTW9kZWxDbGFzc31lcywgcmFua2VkIGJlc3QtZmlyc3RcbiAqIHdpdGhpbiBlYWNoIGNoYXQgYmFuZC5cbiAqXG4gKiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYCkgZ28gaW50b1xuICoge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbiBsaXN0aW5nIG9yZGVyICh0aGV5IGNhcnJ5IG5vXG4gKiBjYXBhYmlsaXR5IHNjb3JlIHRvIHJhbmsgb24pLlxuICpcbiAqIENoYXQgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvY2hhdFwiYCkgc3BsaXQgaW50byB0aGUgdGhyZWUgY2hhdFxuICogYmFuZHMuIFNjb3JlZCBlbmRwb2ludHMgKHRob3NlIGNhcnJ5aW5nIGEgYHByb2ZpbGUucXVhbGl0eWApIGRyaXZlXG4gKiB0aGUgYmFuZGluZzogdGhlIG9ic2VydmVkIHF1YWxpdHkgZGlzdHJpYnV0aW9uIGlzIHNwbGl0IGF0IGl0cyAxLzNcbiAqIGFuZCAyLzMgcXVhbnRpbGVzLCBzbyB0aGUgdG9wIHRoaXJkIGlzIHtAbGluayBNb2RlbENsYXNzLkNoYXRUaGlua2luZ30sXG4gKiB0aGUgYm90dG9tIHRoaXJkIHtAbGluayBNb2RlbENsYXNzLkNoYXRGYXN0fSwgYW5kIHRoZSBtaWRkbGVcbiAqIHtAbGluayBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZH0uIEJlY2F1c2UgdGhlIHRocmVzaG9sZHMgY29tZSBmcm9tIHRoZVxuICogZGF0YSwgdGhlIHNwbGl0IGFkYXB0cyBhcyBEYXRhYnJpY2tzIGFkZHMgb3IgcmVzY29yZXMgbW9kZWxzIC1cbiAqIG5vdGhpbmcgaXMgcGlubmVkIHRvIGEgZml4ZWQgc2NvcmUgYmFuZC5cbiAqXG4gKiBVbnNjb3JlZCBjaGF0IGVuZHBvaW50cyBhcmUgcGxhY2VkIGJ5IHtAbGluayBjbGFzc2lmeUJ5RmFtaWx5fSBhbmRcbiAqIHJhbmtlZCBhZnRlciB0aGUgc2NvcmVkIG9uZXMgaW4gdGhlaXIgYmFuZDsgdW5yZWNvZ25pemVkLCB1bnNjb3JlZFxuICogZW5kcG9pbnRzIChlLmcuIGN1c3RvbSBleHRlcm5hbCBtb2RlbHMpIGFyZSBvbWl0dGVkIGVudGlyZWx5IHNvIHRoZXlcbiAqIGFyZSBuZXZlciBwaWNrZWQgYXMgYW4gYXV0b21hdGljIGRlZmF1bHQuXG4gKlxuICogV2l0aGluIGEgY2hhdCBiYW5kLCBzY29yZWQgbW9kZWxzIHNvcnQgYnkgYHF1YWxpdHlgIGRlc2MsIHRoZW4gYGNvc3RgXG4gKiBhc2MsIHRoZW4gYHNwZWVkYCBkZXNjLCB0aGVuIHBhcnNlZCBuYW1lIHZlcnNpb24gZGVzYzsgZmFtaWx5LW9ubHlcbiAqIG1vZGVscyBzb3J0IGJ5IHZlcnNpb24gcmFuayB0aGVuIHBhcnNlZCB2ZXJzaW9uLiBUaGUgdmVyc2lvblxuICogdGllLWJyZWFrICh7QGxpbmsgdmVyc2lvblR1cGxlfSkgaXMgd2hhdCBzZXBhcmF0ZXMgcG9pbnQgcmVsZWFzZXNcbiAqIHRoYXQgc2hhcmUgYSBzY29yZSBwcm9maWxlIChlLmcuIGBvcHVzLTQtOGAgYWhlYWQgb2YgYG9wdXMtNC03YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWNvcmQ8TW9kZWxDbGFzcywgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGNoYXQgPSBlbmRwb2ludHMuZmlsdGVyKChlKSA9PiBlLnRhc2sgPT09IENIQVRfVEFTSyk7XG4gIGNvbnN0IHF1YWxpdGllcyA9IGNoYXRcbiAgICAubWFwKChlKSA9PiBlLnByb2ZpbGU/LnF1YWxpdHkpXG4gICAgLmZpbHRlcigocSk6IHEgaXMgbnVtYmVyID0+IE51bWJlci5pc0Zpbml0ZShxKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBsb3cgPSBxdWFudGlsZShxdWFsaXRpZXMsIDEgLyAzKTtcbiAgY29uc3QgaGlnaCA9IHF1YW50aWxlKHF1YWxpdGllcywgMiAvIDMpO1xuXG4gIGNvbnN0IGJ1Y2tldHM6IFJlY29yZDxNb2RlbENsYXNzLCBSYW5rZWRbXT4gPSB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGVwIG9mIGNoYXQpIHtcbiAgICBjb25zdCBxID0gZXAucHJvZmlsZT8ucXVhbGl0eTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHEpKSB7XG4gICAgICBjb25zdCBxdWFsaXR5ID0gcSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBjbHMgPVxuICAgICAgICBxdWFsaXR5ID49IGhpZ2hcbiAgICAgICAgICA/IE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXG4gICAgICAgICAgOiBxdWFsaXR5IDw9IGxvd1xuICAgICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRGYXN0XG4gICAgICAgICAgICA6IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkO1xuICAgICAgYnVja2V0c1tjbHNdLnB1c2goe1xuICAgICAgICBlcCxcbiAgICAgICAgc29ydDogcXVhbGl0eSxcbiAgICAgICAgc2NvcmVkOiB0cnVlLFxuICAgICAgICB0aWVDb3N0OiBlcC5wcm9maWxlPy5jb3N0ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgdGllU3BlZWQ6IGVwLnByb2ZpbGU/LnNwZWVkID8/IDAsXG4gICAgICAgIHZlcnNpb246IHZlcnNpb25UdXBsZShlcC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZhbWlseSA9IGNsYXNzaWZ5QnlGYW1pbHkoZXAubmFtZSk7XG4gICAgaWYgKCFmYW1pbHkpIGNvbnRpbnVlO1xuICAgIGJ1Y2tldHNbZmFtaWx5LmNsYXNzXS5wdXNoKHtcbiAgICAgIGVwLFxuICAgICAgc29ydDogZmFtaWx5LnJhbmssXG4gICAgICBzY29yZWQ6IGZhbHNlLFxuICAgICAgdGllQ29zdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgdGllU3BlZWQ6IDAsXG4gICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBFbWJlZGRpbmdzIGFyZSBidWNrZXRlZCBieSB0YXNrIGluIGxpc3Rpbmcgb3JkZXIgLSBubyBzY29yZSB0byByYW5rLlxuICBjb25zdCBlbWJlZGRpbmdzID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBFTUJFRERJTkdfVEFTSyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IGJ1Y2tldHNbTW9kZWxDbGFzcy5DaGF0RmFzdF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogZW1iZWRkaW5ncyxcbiAgfTtcbn1cbiJdfQ==
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUdMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUczQyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxnRUFBZ0U7QUFDaEUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBRWhDLDBEQUEwRDtBQUMxRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztBQUUzQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEUsT0FBTyxDQUNMLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdDO0lBQ25FLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUM5Riw4RUFBOEU7SUFDOUUsOENBQThDO0lBQzlD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UyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLElBQUksRUFBRSxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsQ0FBQztJQUNyQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBZUQsU0FBUyxTQUFTLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDckMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsT0FBTztRQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzFELElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzlELGtFQUFrRTtJQUNsRSwyREFB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QyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVU7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZGVsLWNsYXNzIGNsYXNzaWZpY2F0aW9uIGZvciBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLlxuICpcbiAqIENoYXQgY2FwYWJpbGl0eSBiYW5kcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBsaXZlIHdvcmtzcGFjZSBjYXRhbG9ndWVcbiAqIHJhdGhlciB0aGFuIGEgaGFuZC1tYWludGFpbmVkIHRhYmxlLiBEYXRhYnJpY2tzIHB1Ymxpc2hlc1xuICogcGVyLWVuZHBvaW50IGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzICh0aGUgQUkgUGxheWdyb3VuZFxuICogYmFycykgb24gdGhlIHNlcnZpbmcgbGlzdDsge0BsaW5rIGNsYXNzaWZ5RW5kcG9pbnRzfSBidWNrZXRzIHNjb3JlZFxuICogY2hhdCBtb2RlbHMgaW50byB0aGUgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYmFuZHMgYnkgdGhlICpyZWxhdGl2ZSpcbiAqIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBzY29yZXMgKHF1YW50aWxlcywgbm90IGZpeGVkIGN1dC1vZmZzKSBzbyBhXG4gKiBicmFuZC1uZXcgbW9kZWwgdGhhdCBsYW5kcyBvdXRzaWRlIHRvZGF5J3Mgc2NvcmUgcmFuZ2Ugc3RpbGwgc2xvdHMgaW5cbiAqIG5leHQgdG8gaXRzIHBlZXJzLiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYClcbiAqIGFyZSBidWNrZXRlZCBpbnRvIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW5kZXBlbmRlbnQgb2ZcbiAqIGFueSBzY29yZS5cbiAqXG4gKiBVbnNjb3JlZC1idXQtcmVjb2duaXphYmxlIGNoYXQgZW5kcG9pbnRzIGFyZSBzdGlsbCBwbGFjZWQgYnkgYSBzbWFsbFxuICogZmFtaWx5IGhldXJpc3RpYyAoe0BsaW5rIGNsYXNzaWZ5QnlGYW1pbHl9KSBzbyBhIHdvcmtzcGFjZSB3aG9zZVxuICogbW9kZWxzIHByZWRhdGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmluZyBrZWVwcyB3b3JraW5nLiBUaGVcbiAqIG9mZmxpbmUgZmFsbGJhY2sgZmxvb3IgLSB0aGUgaGFyZC1jb2RlZCBtb2RlbCBsaXN0IHJlYWNoZWQgZm9yIHdoZW5cbiAqIHRoZSBsaXZlIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIGlzIGEgc2VydmVyIGNvbmNlcm4gYW5kXG4gKiBsaXZlcyBpbiBgQGRieC10b29scy9tb2RlbGAsIG5vdCBoZXJlOiBhIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzXG4gKiB0byBEYXRhYnJpY2tzIGRpcmVjdGx5LCBzbyBpdCBoYXMgbm90aGluZyB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogUHVyZSAobm8gTm9kZS1vbmx5IGltcG9ydHMpLCBzbyBhIGNsaWVudCBjYW4gY2xhc3NpZnkgYSBgL21vZGVsc2BcbiAqIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBFbmRwb2ludENhcGFiaWxpdGllcyxcbiAgdHlwZSBGYW1pbHlDbGFzcyxcbiAgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVmFsdWVzLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVHlwZTtcbmNvbnN0IE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVmFsdWVzO1xuXG4vKiogVGFzayBoaW50IERhdGFicmlja3Mgc3RhbXBzIG9uIGNoYXQgY29tcGxldGlvbiBlbmRwb2ludHMuICovXG5jb25zdCBDSEFUX1RBU0sgPSBcImxsbS92MS9jaGF0XCI7XG5cbi8qKiBUYXNrIGhpbnQgRGF0YWJyaWNrcyBzdGFtcHMgb24gZW1iZWRkaW5nIGVuZHBvaW50cy4gKi9cbmNvbnN0IEVNQkVERElOR19UQVNLID0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZhbWlsaWVzIHZlcmlmaWVkIGFnYWluc3QgRGF0YWJyaWNrcyBSZXNwb25zZXMvT3BlbiBSZXNwb25zZXMgd2l0aFxuICogYm90aCBhIGZvcmNlZCBmdW5jdGlvbiBjYWxsIGFuZCBhIHN0YXRlbGVzcyBgZnVuY3Rpb25fY2FsbF9vdXRwdXRgIHJlcGxheS5cbiAqXG4gKiBEYXRhYnJpY2tzJyBlbmRwb2ludCBsaXN0L09wZW5BUEkgY3VycmVudGx5IGV4cG9zZXMgbm8gdG9vbHMgY2FwYWJpbGl0eSBiaXQuXG4gKiBLZWVwIHRoaXMgY29uc2VydmF0aXZlOiBhbiB1bmtub3duIGNoYXQgZmFtaWx5IGlzIG5vdCBhZ2VudC1zYWZlIHVudGlsIGl0IGlzXG4gKiB2ZXJpZmllZC4gR2VtaW5pIGlzIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgZW1pdHMgYSBjYWxsIGJ1dCBPcGVuIFJlc3BvbnNlc1xuICogY2Fubm90IHJlcGxheSB0aGUgcmVxdWlyZWQgdGhvdWdodCBzaWduYXR1cmU7IEdQVC1PU1MgcmVqZWN0cyBSZXNwb25zZXNcbiAqIHBhc3N0aHJvdWdoIGVudGlyZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNUb29sc0J5RmFtaWx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAobi5pbmNsdWRlcyhcImdlbWluaVwiKSB8fCBuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKFxuICAgIG4uaW5jbHVkZXMoXCJjbGF1ZGVcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ3B0XCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcInF3ZW5cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ2xtXCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcImxsYW1hXCIpXG4gICk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIGVuZHBvaW50J3MgY2FwYWJpbGl0aWVzIGZyb20gaXRzIERhdGFicmlja3MgdGFzayBoaW50IGFuZCBpdHNcbiAqIGNsYXNzaWZpZWQge0BsaW5rIE1vZGVsQ2xhc3N9LCBzbyBjb25zdW1lcnMgZmlsdGVyIG9uIGNhcGFiaWxpdHkgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQgZnJvbSByYXcgYHRhc2tgIC8gYGNsYXNzYCBzdHJpbmdzLlxuICpcbiAqIEVpdGhlciBzaWduYWwgYWxvbmUgaXMgZW5vdWdoOiB0aGUgdGFzayBoaW50IGlzIGF1dGhvcml0YXRpdmUgd2hlbiBwcmVzZW50LFxuICogYW5kIHRoZSBjbGFzcyBjb3ZlcnMgZW5kcG9pbnRzIERhdGFicmlja3MgbGVmdCB1bnRhc2tlZCBidXQgdGhlIGNsYXNzaWZpZXJcbiAqIHJlY29nbml6ZWQuIEVtYmVkZGluZyB3aW5zIG92ZXIgY2hhdCB3aGVuIGJvdGggcG9pbnQgYXQgaXQsIHNpbmNlIHRoZSB0d28gYXJlXG4gKiBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBFbmRwb2ludENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGVtYmVkZGluZyA9IGVuZHBvaW50LnRhc2sgPT09IEVNQkVERElOR19UQVNLIHx8IGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZztcbiAgLy8gRXZlcnkgbm9uLWVtYmVkZGluZyBjbGFzcyBpcyBhIGNoYXQgYmFuZCwgc28gXCJjbGFzc2lmaWVkIGJ1dCBub3QgZW1iZWRkaW5nXCJcbiAgLy8gaXMgdGhlIGNsYXNzLXNpZGUgdGVzdCBmb3IgY2hhdCBjYXBhYmlsaXR5LlxuICBjb25zdCBjaGF0ID0gIWVtYmVkZGluZyAmJiAoZW5kcG9pbnQudGFzayA9PT0gQ0hBVF9UQVNLIHx8IGVuZHBvaW50LmNsYXNzICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCB0b29scyA9IGNoYXQgJiYgKGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPz8gc3VwcG9ydHNUb29sc0J5RmFtaWx5KGVuZHBvaW50Lm5hbWUpKTtcbiAgcmV0dXJuIHsgY2hhdCwgZW1iZWRkaW5nLCB0b29scyB9O1xufVxuXG4vKipcbiAqIE51bWVyaWMgYFttYWpvciwgbWlub3IsIHBhdGNoXWAgdmVyc2lvbiBwYXJzZWQgZnJvbSBhbiBlbmRwb2ludFxuICogbmFtZSwgdXNlZCB0byBvcmRlciBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllci4gU3RhcnRzIGF0IHRoZVxuICogZmlyc3QgZGlnaXQgaW4gdGhlIG5hbWUsIHRoZW4gcmVhZHMgc3VjY2Vzc2l2ZSBzZXBhcmF0b3ItZGVsaW1pdGVkLFxuICogZGlnaXQtcHJlZml4ZWQgY2h1bmtzIGFzIHRoZSB0aHJlZSBjb21wb25lbnRzIChtaXNzaW5nIG9uZXMgZGVmYXVsdFxuICogdG8gYDBgKTpcbiAqXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC04YCAgIC0+IGBbNCwgOCwgMF1gXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC0xMGAgIC0+IGBbNCwgMTAsIDBdYCAoc29ydHMgYWJvdmUgNC04KVxuICogICAtIGBkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYmAtPiBgWzMsIDMsIDcwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1iZ2UtbGFyZ2UtZW5gICAgICAgLT4gYFswLCAwLCAwXWAgKG5vIGRpZ2l0cylcbiAqXG4gKiBDb21wb25lbnQtd2lzZSBjb21wYXJpc29uIChub3QgYSBkZWNpbWFsIGNvbGxhcHNlKSBzbyBgNC4xMGAgYmVhdHNcbiAqIGA0LjhgIC0gdGhlIGJ1ZyBhIGBtYWpvciArIG1pbm9yLzEwYCBzY29yZSB3b3VsZCBoaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uVHVwbGUobmFtZTogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc3RhcnQgPSBuYW1lLnNlYXJjaCgvXFxkLyk7XG4gIGlmIChzdGFydCA8IDApIHJldHVybiBbMCwgMCwgMF07XG4gIGNvbnN0IG51bXMgPSBuYW1lXG4gICAgLnNsaWNlKHN0YXJ0KVxuICAgIC5zcGxpdCgvW15hLXowLTldKy9pKVxuICAgIC5tYXAoKGNodW5rKSA9PiBjaHVuay5tYXRjaCgvXlxcZCsvKT8uWzBdKVxuICAgIC5maWx0ZXIoKGRpZ2l0cyk6IGRpZ2l0cyBpcyBzdHJpbmcgPT4gZGlnaXRzICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcChOdW1iZXIpO1xuICByZXR1cm4gW251bXNbMF0gPz8gMCwgbnVtc1sxXSA/PyAwLCBudW1zWzJdID8/IDBdO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdmVyc2lvbiB0dXBsZXMgY29tcG9uZW50LXdpc2Ugd2l0aCBtaXNzaW5nIHBhcnRzIGFzIDAuXG4gKiBQb3NpdGl2ZSB3aGVuIGBsZWZ0YCBpcyBuZXdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uVHVwbGVzKGxlZnQ6IHJlYWRvbmx5IG51bWJlcltdLCByaWdodDogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXIge1xuICBjb25zdCBsZW5ndGggPSBNYXRoLm1heChsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoLCAzKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRpZmYgPSAobGVmdFtpbmRleF0gPz8gMCkgLSAocmlnaHRbaW5kZXhdID8/IDApO1xuICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqIENvbXBhcmUgdHdvIHZlcnNpb24gdHVwbGVzIHNvIHRoZSBoaWdoZXIgdmVyc2lvbiBzb3J0cyBmaXJzdCAoZGVzY2VuZGluZykuICovXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbkRlc2MoYTogcmVhZG9ubHkgbnVtYmVyW10sIGI6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uVHVwbGVzKGIsIGEpO1xufVxuXG4vKipcbiAqIE1vbm90b25pYyB2ZXJzaW9uIGtleSBmb3Igb3JkZXJpbmcgc2libGluZ3Mgd2l0aGluIGEgZmFtaWx5L3RpZXJcbiAqIChlLmcuIGBvcHVzLTQtOGAgb3ZlciBgb3B1cy00LTdgKS4gRW5jb2RlcyB0aGUge0BsaW5rIHZlcnNpb25UdXBsZX1cbiAqIGFzIGEgc2luZ2xlIG51bWJlciBzbyBjYWxsZXJzIHRoYXQgbmVlZCBhIHNjYWxhciByYW5rICh0aGUgZmFtaWx5XG4gKiBoZXVyaXN0aWMsIHRoZSBzdGF0aWMgZmFsbGJhY2sgb3JkZXJpbmcpIGtlZXAgd29ya2luZzsgdGhlIGVuY29kaW5nXG4gKiBwcmVzZXJ2ZXMgY29tcG9uZW50IG9yZGVyIHdpdGhvdXQgdGhlIGRlY2ltYWwtY29sbGFwc2UgYnVnLlxuICovXG5mdW5jdGlvbiB2ZXJzaW9uU2NvcmUobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvblR1cGxlKG5hbWUpO1xuICByZXR1cm4gbWFqb3IgKiAxXzAwMF8wMDAgKyBtaW5vciAqIDFfMDAwICsgcGF0Y2g7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgY2hhdCBjYXBhYmlsaXR5IGJhbmQgZm9yIGFuIGVuZHBvaW50IHdlIGhhdmUgbm8gbGl2ZVxuICogc2NvcmUgZm9yLCBrZXllZCBvZmYgcHJvdmlkZXIgZmFtaWx5IGFuZCB0aGUgd2VsbC1rbm93biB2YXJpYW50IHdvcmRzXG4gKiBpbiB0aGUgbmFtZSAoYG9wdXNgL2Bzb25uZXRgL2BoYWlrdWAsIGBwcm9gL2BtaW5pYC9gbmFub2AsXG4gKiBgZmxhc2hgL2BmbGFzaC1saXRlYCwgTGxhbWEgcGFyYW1ldGVyIHNpemVzLCBldGMpLiBSZXR1cm5zIGBudWxsYCBmb3JcbiAqIG5hbWVzIHdlIGRvbid0IHJlY29nbml6ZSBzbyB1bmtub3duIGN1c3RvbSBlbmRwb2ludHMgYXJlIG5ldmVyXG4gKiBhdXRvLXNlbGVjdGVkIGFzIGEgZGVmYXVsdC4gVGhlIGFjY29tcGFueWluZyBgcmFua2Agb3JkZXJzIHNpYmxpbmdzXG4gKiB3aXRoaW4gYSBjbGFzcy4gT25seSBldmVyIHJldHVybnMgYSBjaGF0IGJhbmQgLSBlbWJlZGRpbmcgZW5kcG9pbnRzXG4gKiBhcmUgY2xhc3NpZmllZCBieSB0YXNrLCBub3QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5QnlGYW1pbHkobmFtZTogc3RyaW5nKTogRmFtaWx5Q2xhc3MgfCBudWxsIHtcbiAgY29uc3QgbiA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgYXQgPSAoY2xzOiBNb2RlbENsYXNzKTogRmFtaWx5Q2xhc3MgPT4gKHsgY2xhc3M6IGNscywgcmFuazogdmVyc2lvblNjb3JlKG4pIH0pO1xuXG4gIC8vIEFudGhyb3BpYyBDbGF1ZGVcbiAgaWYgKG4uaW5jbHVkZXMoXCJvcHVzXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICBpZiAobi5pbmNsdWRlcyhcInNvbm5ldFwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgaWYgKG4uaW5jbHVkZXMoXCJoYWlrdVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuXG4gIC8vIE9wZW5BSSBvcGVuLXdlaWdodHMgKGNoZWNrIGJlZm9yZSB0aGUgZ2VuZXJpYyBncHQgYnJhbmNoKVxuICBpZiAobi5pbmNsdWRlcyhcImdwdC1vc3NcIikpIHtcbiAgICByZXR1cm4gYXQobi5pbmNsdWRlcyhcIjEyMGJcIikgPyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCA6IE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICB9XG4gIC8vIE9wZW5BSSBHUFQgZmFtaWx5XG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0XCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtaW5pXCIpIHx8IG4uaW5jbHVkZXMoXCJuYW5vXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuXG4gIC8vIEdvb2dsZSBHZW1pbmkgLyBHZW1tYVxuICBpZiAobi5pbmNsdWRlcyhcImdlbWluaVwiKSkge1xuICAgIGlmIChuLmluY2x1ZGVzKFwiZmxhc2gtbGl0ZVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIGlmIChuLmluY2x1ZGVzKFwicHJvXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cbiAgaWYgKG4uaW5jbHVkZXMoXCJnZW1tYVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuXG4gIC8vIE1ldGEgTGxhbWFcbiAgaWYgKG4uaW5jbHVkZXMoXCJsbGFtYVwiKSkge1xuICAgIGlmIChuLmluY2x1ZGVzKFwibWF2ZXJpY2tcIikgfHwgbi5pbmNsdWRlcyhcIjQwNWJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCI3MGJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCI4YlwiKSB8fCBuLmluY2x1ZGVzKFwiMWJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gQWxpYmFiYSBRd2VuXG4gIGlmIChuLmluY2x1ZGVzKFwicXdlblwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIExpbmVhci1pbnRlcnBvbGF0ZWQgcXVhbnRpbGUgb2YgYW4gYXNjZW5kaW5nLXNvcnRlZCBudW1lcmljIGFycmF5LiAqL1xuZnVuY3Rpb24gcXVhbnRpbGUoc29ydGVkQXNjOiByZWFkb25seSBudW1iZXJbXSwgcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHNvcnRlZEFzYy5sZW5ndGggPT09IDApIHJldHVybiBOdW1iZXIuTmFOO1xuICBjb25zdCBpZHggPSAoc29ydGVkQXNjLmxlbmd0aCAtIDEpICogcDtcbiAgY29uc3QgbG8gPSBNYXRoLmZsb29yKGlkeCk7XG4gIGNvbnN0IGhpID0gTWF0aC5jZWlsKGlkeCk7XG4gIGlmIChsbyA9PT0gaGkpIHJldHVybiBzb3J0ZWRBc2NbbG9dITtcbiAgcmV0dXJuIHNvcnRlZEFzY1tsb10hICsgKHNvcnRlZEFzY1toaV0hIC0gc29ydGVkQXNjW2xvXSEpICogKGlkeCAtIGxvKTtcbn1cblxuLyoqIEludGVybmFsIHNvcnRhYmxlIHdyYXBwZXIgY2FycnlpbmcgdGhlIG9yZGVyaW5nIGtleXMgZm9yIGEgYnVja2V0IGVudHJ5LiAqL1xuaW50ZXJmYWNlIFJhbmtlZCB7XG4gIGVwOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICAvKiogUXVhbGl0eSAoc2NvcmVkKSBvciBmYW1pbHkgdmVyc2lvbiAodW5zY29yZWQpIC0gaGlnaGVyIGZpcnN0LiAqL1xuICBzb3J0OiBudW1iZXI7XG4gIC8qKiBTY29yZWQgZW5kcG9pbnRzIHJhbmsgYWhlYWQgb2YgZmFtaWx5LW9ubHkgZ3Vlc3Nlcy4gKi9cbiAgc2NvcmVkOiBib29sZWFuO1xuICB0aWVDb3N0OiBudW1iZXI7XG4gIHRpZVNwZWVkOiBudW1iZXI7XG4gIC8qKiBQYXJzZWQgbmFtZSB2ZXJzaW9uLCB0aGUgZmluYWwgdGllLWJyZWFrZXIgKG5ld2VyIHNpYmxpbmcgZmlyc3QpLiAqL1xuICB2ZXJzaW9uOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuZnVuY3Rpb24gcmFua09yZGVyKGE6IFJhbmtlZCwgYjogUmFua2VkKTogbnVtYmVyIHtcbiAgaWYgKGEuc2NvcmVkICE9PSBiLnNjb3JlZCkgcmV0dXJuIGEuc2NvcmVkID8gLTEgOiAxO1xuICBpZiAoYi5zb3J0ICE9PSBhLnNvcnQpIHJldHVybiBiLnNvcnQgLSBhLnNvcnQ7XG4gIGlmIChhLnRpZUNvc3QgIT09IGIudGllQ29zdCkgcmV0dXJuIGEudGllQ29zdCAtIGIudGllQ29zdDtcbiAgaWYgKGIudGllU3BlZWQgIT09IGEudGllU3BlZWQpIHJldHVybiBiLnRpZVNwZWVkIC0gYS50aWVTcGVlZDtcbiAgLy8gU2FtZSBzY29yZWQtbmVzcywgcXVhbGl0eSwgY29zdCwgYW5kIHNwZWVkIChlLmcuIHNldmVyYWwgQ2xhdWRlXG4gIC8vIE9wdXMgcG9pbnQgcmVsZWFzZXMpOiBwcmVmZXIgdGhlIG5ld2VyIHBhcnNlZCB2ZXJzaW9uIHNvXG4gIC8vIGBvcHVzLTQtOGAgYmVhdHMgYG9wdXMtNC03YC5cbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uRGVzYyhhLnZlcnNpb24sIGIudmVyc2lvbik7XG59XG5cbi8qKlxuICogQnVja2V0IGxpdmUgZW5kcG9pbnRzIGludG8ge0BsaW5rIE1vZGVsQ2xhc3N9ZXMsIHJhbmtlZCBiZXN0LWZpcnN0XG4gKiB3aXRoaW4gZWFjaCBjaGF0IGJhbmQuXG4gKlxuICogRW1iZWRkaW5nIGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcImApIGdvIGludG9cbiAqIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzay4gUHVibGlzaGVkIHByb2ZpbGUgcXVhbGl0eSByYW5rcyBmaXJzdDtcbiAqIG90aGVyd2lzZSBuZXdlciBwYXJzZWQgdmVyc2lvbnMgcmFuayBmaXJzdC5cbiAqXG4gKiBDaGF0IGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2NoYXRcImApIHNwbGl0IGludG8gdGhlIHRocmVlIGNoYXRcbiAqIGJhbmRzLiBTY29yZWQgZW5kcG9pbnRzICh0aG9zZSBjYXJyeWluZyBhIGBwcm9maWxlLnF1YWxpdHlgKSBkcml2ZVxuICogdGhlIGJhbmRpbmc6IHRoZSBvYnNlcnZlZCBxdWFsaXR5IGRpc3RyaWJ1dGlvbiBpcyBzcGxpdCBhdCBpdHMgMS8zXG4gKiBhbmQgMi8zIHF1YW50aWxlcywgc28gdGhlIHRvcCB0aGlyZCBpcyB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmd9LFxuICogdGhlIGJvdHRvbSB0aGlyZCB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0RmFzdH0sIGFuZCB0aGUgbWlkZGxlXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWR9LiBCZWNhdXNlIHRoZSB0aHJlc2hvbGRzIGNvbWUgZnJvbSB0aGVcbiAqIGRhdGEsIHRoZSBzcGxpdCBhZGFwdHMgYXMgRGF0YWJyaWNrcyBhZGRzIG9yIHJlc2NvcmVzIG1vZGVscyAtXG4gKiBub3RoaW5nIGlzIHBpbm5lZCB0byBhIGZpeGVkIHNjb3JlIGJhbmQuXG4gKlxuICogVW5zY29yZWQgY2hhdCBlbmRwb2ludHMgYXJlIHBsYWNlZCBieSB7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0gYW5kXG4gKiByYW5rZWQgYWZ0ZXIgdGhlIHNjb3JlZCBvbmVzIGluIHRoZWlyIGJhbmQ7IHVucmVjb2duaXplZCwgdW5zY29yZWRcbiAqIGVuZHBvaW50cyAoZS5nLiBjdXN0b20gZXh0ZXJuYWwgbW9kZWxzKSBhcmUgb21pdHRlZCBlbnRpcmVseSBzbyB0aGV5XG4gKiBhcmUgbmV2ZXIgcGlja2VkIGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0LlxuICpcbiAqIFdpdGhpbiBhIGNoYXQgYmFuZCwgc2NvcmVkIG1vZGVscyBzb3J0IGJ5IGBxdWFsaXR5YCBkZXNjLCB0aGVuIGBjb3N0YFxuICogYXNjLCB0aGVuIGBzcGVlZGAgZGVzYywgdGhlbiBwYXJzZWQgbmFtZSB2ZXJzaW9uIGRlc2M7IGZhbWlseS1vbmx5XG4gKiBtb2RlbHMgc29ydCBieSB2ZXJzaW9uIHJhbmsgdGhlbiBwYXJzZWQgdmVyc2lvbi4gVGhlIHZlcnNpb25cbiAqIHRpZS1icmVhayAoe0BsaW5rIHZlcnNpb25UdXBsZX0pIGlzIHdoYXQgc2VwYXJhdGVzIHBvaW50IHJlbGVhc2VzXG4gKiB0aGF0IHNoYXJlIGEgc2NvcmUgcHJvZmlsZSAoZS5nLiBgb3B1cy00LThgIGFoZWFkIG9mIGBvcHVzLTQtN2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUmVjb3JkPE1vZGVsQ2xhc3MsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBjaGF0ID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBDSEFUX1RBU0spO1xuICBjb25zdCBxdWFsaXRpZXMgPSBjaGF0XG4gICAgLm1hcCgoZSkgPT4gZS5wcm9maWxlPy5xdWFsaXR5KVxuICAgIC5maWx0ZXIoKHEpOiBxIGlzIG51bWJlciA9PiBOdW1iZXIuaXNGaW5pdGUocSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgbG93ID0gcXVhbnRpbGUocXVhbGl0aWVzLCAxIC8gMyk7XG4gIGNvbnN0IGhpZ2ggPSBxdWFudGlsZShxdWFsaXRpZXMsIDIgLyAzKTtcblxuICBjb25zdCBidWNrZXRzOiBSZWNvcmQ8TW9kZWxDbGFzcywgUmFua2VkW10+ID0ge1xuICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRGYXN0XTogW10sXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBlcCBvZiBjaGF0KSB7XG4gICAgY29uc3QgcSA9IGVwLnByb2ZpbGU/LnF1YWxpdHk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShxKSkge1xuICAgICAgY29uc3QgcXVhbGl0eSA9IHEgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgY2xzID1cbiAgICAgICAgcXVhbGl0eSA+PSBoaWdoXG4gICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRUaGlua2luZ1xuICAgICAgICAgIDogcXVhbGl0eSA8PSBsb3dcbiAgICAgICAgICAgID8gTW9kZWxDbGFzcy5DaGF0RmFzdFxuICAgICAgICAgICAgOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZDtcbiAgICAgIGJ1Y2tldHNbY2xzXS5wdXNoKHtcbiAgICAgICAgZXAsXG4gICAgICAgIHNvcnQ6IHF1YWxpdHksXG4gICAgICAgIHNjb3JlZDogdHJ1ZSxcbiAgICAgICAgdGllQ29zdDogZXAucHJvZmlsZT8uY29zdCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIHRpZVNwZWVkOiBlcC5wcm9maWxlPy5zcGVlZCA/PyAwLFxuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmYW1pbHkgPSBjbGFzc2lmeUJ5RmFtaWx5KGVwLm5hbWUpO1xuICAgIGlmICghZmFtaWx5KSBjb250aW51ZTtcbiAgICBidWNrZXRzW2ZhbWlseS5jbGFzc10ucHVzaCh7XG4gICAgICBlcCxcbiAgICAgIHNvcnQ6IGZhbWlseS5yYW5rLFxuICAgICAgc2NvcmVkOiBmYWxzZSxcbiAgICAgIHRpZUNvc3Q6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgIHRpZVNwZWVkOiAwLFxuICAgICAgdmVyc2lvbjogdmVyc2lvblR1cGxlKGVwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZW1iZWRkaW5ncyA9IGVuZHBvaW50c1xuICAgIC5maWx0ZXIoKGVuZHBvaW50KSA9PiBlbmRwb2ludC50YXNrID09PSBFTUJFRERJTkdfVEFTSylcbiAgICAubWFwKChlbmRwb2ludCk6IFJhbmtlZCA9PiB7XG4gICAgICBjb25zdCBxdWFsaXR5ID0gZW5kcG9pbnQucHJvZmlsZT8ucXVhbGl0eTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVwOiBlbmRwb2ludCxcbiAgICAgICAgc29ydDogcXVhbGl0eSA/PyB2ZXJzaW9uU2NvcmUoZW5kcG9pbnQubmFtZSksXG4gICAgICAgIHNjb3JlZDogcXVhbGl0eSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICB0aWVDb3N0OiBlbmRwb2ludC5wcm9maWxlPy5jb3N0ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgdGllU3BlZWQ6IGVuZHBvaW50LnByb2ZpbGU/LnNwZWVkID8/IDAsXG4gICAgICAgIHZlcnNpb246IHZlcnNpb25UdXBsZShlbmRwb2ludC5uYW1lKSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuc29ydChyYW5rT3JkZXIpXG4gICAgLm1hcCgoeyBlcCB9KSA9PiBlcCk7XG5cbiAgcmV0dXJuIHtcbiAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IGJ1Y2tldHNbTW9kZWxDbGFzcy5DaGF0RmFzdF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogZW1iZWRkaW5ncyxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -27,11 +27,11 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/appkit": "^0.9.54",
31
- "@dbx-tools/auth": "^0.9.54",
32
- "@dbx-tools/shared-auth": "^0.9.54",
33
- "@dbx-tools/shared-core": "^0.9.54",
34
- "@dbx-tools/shared-model": "^0.9.54",
30
+ "@dbx-tools/appkit": "^0.9.60",
31
+ "@dbx-tools/auth": "^0.9.60",
32
+ "@dbx-tools/shared-auth": "^0.9.60",
33
+ "@dbx-tools/shared-core": "^0.9.60",
34
+ "@dbx-tools/shared-model": "^0.9.60",
35
35
  "cacache": "^21.0.1",
36
36
  "env-paths": "^4.0.0",
37
37
  "fuse.js": "^7.4.2"
@@ -102,7 +102,7 @@
102
102
  "./package.json": "./package.json"
103
103
  }
104
104
  },
105
- "version": "0.9.54",
105
+ "version": "0.9.60",
106
106
  "types": "./lib/index.d.ts",
107
107
  "dbxToolsConfig": {
108
108
  "tags": [
package/src/_ranking.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { object, stringUtils } from "@dbx-tools/shared-core";
1
2
  import {
2
3
  ModelClass as ModelClassValues,
3
4
  type ModelClass as ModelClassType,
@@ -9,7 +10,7 @@ import { toModelDisplayName } from "@dbx-tools/shared-model/display";
9
10
  import Fuse from "fuse.js";
10
11
 
11
12
  import { modelStatusFor } from "./_retirement.ts";
12
- import { classesAtOrBelow, CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./classes.ts";
13
+ import { classesAtOrBelow, CHAT_CLASS_ORDER, isChatClass, MODEL_CLASS_ORDER } from "./classes.ts";
13
14
  import {
14
15
  classifyEndpoints,
15
16
  endpointCapabilities,
@@ -22,6 +23,26 @@ type ModelClass = ModelClassType;
22
23
  const ModelClass = ModelClassValues;
23
24
 
24
25
  const DEFAULT_FUZZY_THRESHOLD = 0.4;
26
+ const SEARCH_INTENT_FILLERS = new Set(["a", "best", "for", "model", "models", "the"]);
27
+ const CHAT_SEARCH_INTENTS = new Set([
28
+ "chat",
29
+ "completion",
30
+ "completions",
31
+ "summarize",
32
+ "summarise",
33
+ "summarization",
34
+ "summarisation",
35
+ "summary",
36
+ ]);
37
+ const EMBEDDING_SEARCH_INTENTS = new Set([
38
+ "embed",
39
+ "embedding",
40
+ "embeddings",
41
+ "vector",
42
+ "vectorize",
43
+ "vectorise",
44
+ ]);
45
+
25
46
  interface NativeRankingOptions {
26
47
  readonly includeDeprecated?: boolean;
27
48
  readonly modelClass?: ModelClass;
@@ -50,12 +71,23 @@ export function rankEndpoints(
50
71
  [options.modelClass]: normalized,
51
72
  }
52
73
  : classifyEndpoints(normalized);
53
- const requestedClass = options.modelClass ?? query.modelClass;
74
+ const search = query.search?.trim();
75
+ const searchPlan = search ? modelSearchPlan(search) : undefined;
76
+ const rankedSearch = searchPlan ? searchPlan.search : search;
77
+ const searchIntent = searchPlan?.modelClass;
78
+ const requestedClass = options.modelClass ?? query.modelClass ?? searchIntent;
54
79
  const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
55
80
  const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
56
81
  const candidates: RankedModel[] = [];
57
- const search = query.search?.trim();
58
- if (search && requestedClass === undefined) {
82
+ const explicitClass = options.modelClass ?? query.modelClass;
83
+ if (
84
+ searchIntent !== undefined &&
85
+ explicitClass !== undefined &&
86
+ isChatClass(searchIntent) !== isChatClass(explicitClass)
87
+ ) {
88
+ return [];
89
+ }
90
+ if (rankedSearch && requestedClass === undefined) {
59
91
  const classByName = classifyEndpointClasses(normalized);
60
92
  for (const endpoint of normalized) {
61
93
  if (!includeDeprecated && endpoint.status?.deprecated) continue;
@@ -77,13 +109,13 @@ export function rankEndpoints(
77
109
  }
78
110
 
79
111
  let ranked = candidates;
80
- if (search) {
81
- const exact = candidates.find((candidate) => candidate.endpoint.name === search);
112
+ if (rankedSearch) {
113
+ const exact = candidates.find((candidate) => candidate.endpoint.name === rankedSearch);
82
114
  if (exact) {
83
115
  ranked = [{ ...exact, score: 0 }];
84
116
  } else {
85
117
  const threshold = query.threshold ?? DEFAULT_FUZZY_THRESHOLD;
86
- const searchTokens = tokenize(search);
118
+ const searchTokens = tokenize(rankedSearch);
87
119
  const tokenMatches = candidates
88
120
  .filter((candidate) => {
89
121
  const candidateTokens = new Set(searchableValues(candidate.endpoint).flatMap(tokenize));
@@ -109,7 +141,7 @@ export function rankEndpoints(
109
141
  useExtendedSearch: true,
110
142
  isCaseSensitive: false,
111
143
  });
112
- const normalizedSearch = tokenize(search).join(" ");
144
+ const normalizedSearch = tokenize(rankedSearch).join(" ");
113
145
  ranked = normalizedSearch
114
146
  ? fuse
115
147
  .search(normalizedSearch)
@@ -165,45 +197,49 @@ export function classifyEndpointClasses(
165
197
  export function normalizeEndpoints(endpoints: readonly unknown[]): ServingEndpointSummary[] {
166
198
  const summaries = endpoints.flatMap((value) => {
167
199
  const endpoint = record(value);
168
- const name = stringValue(endpoint.name);
200
+ const name = stringUtils.trimToUndefined(endpoint.name);
169
201
  if (!name) return [];
170
202
  const entities = arrayValue(record(endpoint.config).served_entities).map(record);
171
203
  const identities = [
172
204
  name,
173
205
  ...entities.flatMap((entity) =>
174
206
  [
175
- stringValue(entity.entity_name),
176
- stringValue(record(entity.foundation_model).name),
177
- stringValue(record(entity.external_model).name),
207
+ stringUtils.trimToUndefined(entity.entity_name),
208
+ stringUtils.trimToUndefined(record(entity.foundation_model).name),
209
+ stringUtils.trimToUndefined(record(entity.external_model).name),
178
210
  ].filter((identity): identity is string => Boolean(identity)),
179
211
  ),
180
212
  ];
181
213
  const modelServiceName = entities
182
214
  .map(
183
215
  (entity) =>
184
- stringValue(record(entity.foundation_model).name) ?? stringValue(entity.entity_name),
216
+ stringUtils.trimToUndefined(record(entity.foundation_model).name) ??
217
+ stringUtils.trimToUndefined(entity.entity_name),
185
218
  )
186
219
  .find(Boolean);
187
220
  const foundationModels = entities.map((entity) => record(entity.foundation_model));
188
221
  const family =
189
- foundationModels.map((model) => stringValue(model.model_class)).find(Boolean) ??
190
- identities.map(modelFamily).find(Boolean);
222
+ foundationModels
223
+ .map((model) => stringUtils.trimToUndefined(model.model_class))
224
+ .find(Boolean) ?? identities.map(modelFamily).find(Boolean);
191
225
  const reasoningEfforts =
192
226
  identities.map(modelReasoningEfforts).sort((left, right) => right.length - left.length)[0] ??
193
227
  [];
194
228
  const profile = entities.map(modelProfile).find(Boolean);
195
229
  const capabilitiesRecord = record(endpoint.capabilities);
196
230
  const foundationDescription = foundationModels
197
- .map((model) => stringValue(model.description))
231
+ .map((model) => stringUtils.trimToUndefined(model.description))
198
232
  .find(Boolean);
199
- const description = stringValue(endpoint.description) ?? foundationDescription;
233
+ const description = stringUtils.trimToUndefined(endpoint.description) ?? foundationDescription;
200
234
  const summary: ServingEndpointSummary = {
201
235
  name,
202
236
  displayName: toModelDisplayName(name, providedDisplayName(endpoint, entities)),
203
237
  ...(family ? { family } : {}),
204
- ...(stringValue(endpoint.task) ? { task: stringValue(endpoint.task) } : {}),
205
- ...(stringValue(record(endpoint.state).ready)
206
- ? { state: stringValue(record(endpoint.state).ready) }
238
+ ...(stringUtils.trimToUndefined(endpoint.task)
239
+ ? { task: stringUtils.trimToUndefined(endpoint.task) }
240
+ : {}),
241
+ ...(stringUtils.trimToUndefined(record(endpoint.state).ready)
242
+ ? { state: stringUtils.trimToUndefined(record(endpoint.state).ready) }
207
243
  : {}),
208
244
  ...(description ? { description } : {}),
209
245
  supportsTools:
@@ -244,6 +280,29 @@ function modelVariantRank(name: string): number {
244
280
  return 2;
245
281
  }
246
282
 
283
+ /**
284
+ * Resolve generic job searches to the capability class that owns the work.
285
+ *
286
+ * A pure intent such as "summarize" ranks that capability directly. Mixed
287
+ * queries remove the intent word but retain the model identity, so "gpt chat"
288
+ * still uses the historical version and variant preference for GPT.
289
+ */
290
+ function modelSearchPlan(
291
+ search: string,
292
+ ): { readonly modelClass: ModelClass; readonly search?: string } | undefined {
293
+ const tokens = tokenize(search).filter((token) => !SEARCH_INTENT_FILLERS.has(token));
294
+ if (tokens.length === 0) return undefined;
295
+ const chat = tokens.some((token) => CHAT_SEARCH_INTENTS.has(token));
296
+ const embedding = tokens.some((token) => EMBEDDING_SEARCH_INTENTS.has(token));
297
+ if (chat === embedding) return undefined;
298
+ const intentWords = chat ? CHAT_SEARCH_INTENTS : EMBEDDING_SEARCH_INTENTS;
299
+ const remaining = tokens.filter((token) => !intentWords.has(token));
300
+ return {
301
+ modelClass: chat ? ModelClass.ChatThinking : ModelClass.Embedding,
302
+ ...(remaining.length > 0 ? { search: remaining.join(" ") } : {}),
303
+ };
304
+ }
305
+
247
306
  function tokenize(value: string): string[] {
248
307
  return value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
249
308
  }
@@ -277,33 +336,27 @@ function providedDisplayName(
277
336
  ): string | undefined {
278
337
  for (const tag of arrayValue(endpoint.tags).map(record)) {
279
338
  if (!["display_name", "displayName", "name"].includes(String(tag.key))) continue;
280
- const value = stringValue(tag.value);
339
+ const value = stringUtils.trimToUndefined(tag.value);
281
340
  if (value) return value;
282
341
  }
283
342
  return (
284
343
  entities
285
- .map((entity) => stringValue(record(entity.foundation_model).display_name))
344
+ .map((entity) => stringUtils.trimToUndefined(record(entity.foundation_model).display_name))
286
345
  .find(Boolean) ??
287
- entities.map((entity) => stringValue(record(entity.external_model).name)).find(Boolean)
346
+ entities
347
+ .map((entity) => stringUtils.trimToUndefined(record(entity.external_model).name))
348
+ .find(Boolean)
288
349
  );
289
350
  }
290
351
 
291
352
  function record(value: unknown): Record<string, unknown> {
292
- return value && typeof value === "object" && !Array.isArray(value)
293
- ? (value as Record<string, unknown>)
294
- : {};
353
+ return object.isRecord(value) ? value : {};
295
354
  }
296
355
 
297
356
  function arrayValue(value: unknown): unknown[] {
298
357
  return Array.isArray(value) ? value : [];
299
358
  }
300
359
 
301
- function stringValue(value: unknown): string | undefined {
302
- if (typeof value !== "string") return undefined;
303
- const trimmed = value.trim();
304
- return trimmed || undefined;
305
- }
306
-
307
360
  function finiteNumber(value: unknown): number | undefined {
308
361
  return typeof value === "number" && Number.isFinite(value) ? value : undefined;
309
362
  }
package/src/classify.ts CHANGED
@@ -232,8 +232,8 @@ function rankOrder(a: Ranked, b: Ranked): number {
232
232
  * within each chat band.
233
233
  *
234
234
  * Embedding endpoints (`task === "llm/v1/embeddings"`) go into
235
- * {@link ModelClass.Embedding} by task, in listing order (they carry no
236
- * capability score to rank on).
235
+ * {@link ModelClass.Embedding} by task. Published profile quality ranks first;
236
+ * otherwise newer parsed versions rank first.
237
237
  *
238
238
  * Chat endpoints (`task === "llm/v1/chat"`) split into the three chat
239
239
  * bands. Scored endpoints (those carrying a `profile.quality`) drive
@@ -305,8 +305,21 @@ export function classifyEndpoints(
305
305
  });
306
306
  }
307
307
 
308
- // Embeddings are bucketed by task in listing order - no score to rank.
309
- const embeddings = endpoints.filter((e) => e.task === EMBEDDING_TASK);
308
+ const embeddings = endpoints
309
+ .filter((endpoint) => endpoint.task === EMBEDDING_TASK)
310
+ .map((endpoint): Ranked => {
311
+ const quality = endpoint.profile?.quality;
312
+ return {
313
+ ep: endpoint,
314
+ sort: quality ?? versionScore(endpoint.name),
315
+ scored: quality !== undefined,
316
+ tieCost: endpoint.profile?.cost ?? Number.POSITIVE_INFINITY,
317
+ tieSpeed: endpoint.profile?.speed ?? 0,
318
+ version: versionTuple(endpoint.name),
319
+ };
320
+ })
321
+ .sort(rankOrder)
322
+ .map(({ ep }) => ep);
310
323
 
311
324
  return {
312
325
  [ModelClass.ChatThinking]: buckets[ModelClass.ChatThinking].sort(rankOrder).map((x) => x.ep),