@dbx-tools/appkit-mastra 0.6.213 → 0.6.214

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/appkit-mastra";
6
- export const PACKAGE_VERSION = "0.6.213";
6
+ export const PACKAGE_VERSION = "0.6.214";
7
7
  export * as agents from "./src/agents.ts";
8
8
  export * as chart from "./src/chart.ts";
9
9
  export * as config from "./src/config.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
2
- export declare const PACKAGE_VERSION = "0.6.213";
2
+ export declare const PACKAGE_VERSION = "0.6.214";
3
3
  export * as agents from "./src/agents.ts";
4
4
  export * as chart from "./src/chart.ts";
5
5
  export * as config from "./src/config.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/appkit-mastra";
5
- export const PACKAGE_VERSION = "0.6.213";
5
+ export const PACKAGE_VERSION = "0.6.214";
6
6
  export * as agents from "./src/agents.js";
7
7
  export * as chart from "./src/chart.js";
8
8
  export * as config from "./src/config.js";
@@ -53,4 +53,4 @@ export { TYPOGRAPHY_RULE } from "./src/style.js";
53
53
  export { TITLE_INSTRUCTIONS } from "./src/summarize.js";
54
54
  export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR } from "./src/trace-io.js";
55
55
  export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.js";
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNMLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdqTCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjEzXCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaGlzdG9yeSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsUGF0aHMgZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgKiBhcyBzdGF0ZW1lbnQgZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZVNjaGVtYSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHN0eWxlIGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRocmVhZHMgZnJvbSBcIi4vc3JjL3RocmVhZHMudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlSW8gZnJvbSBcIi4vc3JjL3RyYWNlLWlvLnRzXCI7XG5leHBvcnQgKiBhcyB2YWxpZGF0aW9uIGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VzIGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBhcyB3cml0ZXIgZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhcnRQbGFubmVyUmVxdWVzdCwgQ2hhcnRUb29sT3V0cHV0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9hZEhpc3RvcnlPcHRpb25zLCBDbGVhckhpc3RvcnlPcHRpb25zLCBIaXN0b3J5Um91dGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE1vZGVsT3ZlcnJpZGVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBQZXJQYWdlQm91bmRzIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB7IE1hc3RyYVBsdWdpbiwgbWFzdHJhIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciwgUmVzdWx0UHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhU2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpc3RUaHJlYWRzT3B0aW9ucywgRGVsZXRlVGhyZWFkT3B0aW9ucywgUmVuYW1lVGhyZWFkT3B0aW9ucywgVGhyZWFkc1JvdXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNMLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdqTCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjE0XCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaGlzdG9yeSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsUGF0aHMgZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgKiBhcyBzdGF0ZW1lbnQgZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZVNjaGVtYSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHN0eWxlIGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRocmVhZHMgZnJvbSBcIi4vc3JjL3RocmVhZHMudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlSW8gZnJvbSBcIi4vc3JjL3RyYWNlLWlvLnRzXCI7XG5leHBvcnQgKiBhcyB2YWxpZGF0aW9uIGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VzIGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBhcyB3cml0ZXIgZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhcnRQbGFubmVyUmVxdWVzdCwgQ2hhcnRUb29sT3V0cHV0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9hZEhpc3RvcnlPcHRpb25zLCBDbGVhckhpc3RvcnlPcHRpb25zLCBIaXN0b3J5Um91dGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE1vZGVsT3ZlcnJpZGVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBQZXJQYWdlQm91bmRzIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB7IE1hc3RyYVBsdWdpbiwgbWFzdHJhIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciwgUmVzdWx0UHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhU2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpc3RUaHJlYWRzT3B0aW9ucywgRGVsZXRlVGhyZWFkT3B0aW9ucywgUmVuYW1lVGhyZWFkT3B0aW9ucywgVGhyZWFkc1JvdXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
package/lib/src/model.js CHANGED
@@ -26,7 +26,7 @@ import { getExecutionContext } from "@databricks/appkit";
26
26
  import { classes, resolve } from "@dbx-tools/model";
27
27
  import { functionModule, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { MASTRA_USER_KEY } from "./config.js";
29
- import { rewriteServingBody, rewriteServingResponseBody } from "./serving-sanitize.js";
29
+ import { rewriteServingBody, rewriteServingResponseBody, rewriteServingResponseStream, } from "./serving-sanitize.js";
30
30
  import { MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig } from "./serving.js";
31
31
  const { parseModelClass } = classes;
32
32
  const { selectModel } = resolve;
@@ -103,10 +103,9 @@ const SERVING_ENDPOINTS_PATH_PREFIX = "/serving-endpoints/";
103
103
  * 2. At `LOG_LEVEL=debug`, dumps the (post-sanitize) JSON body so
104
104
  * 4xx debugging doesn't have to fight AI SDK's `[Array]`
105
105
  * formatter.
106
- * 3. Repairs the non-streaming JSON response, where Databricks-hosted
107
- * Gemini returns `choices[].message.content` as a parts array that
108
- * the AI SDK's OpenAI schema rejects (see
109
- * {@link rewriteServingResponseBody}).
106
+ * 3. Repairs buffered and streaming responses where a provider returns
107
+ * `choices[].message.content` or `choices[].delta.content` as a parts
108
+ * array that the AI SDK's OpenAI schema rejects.
110
109
  *
111
110
  * Safe to call from any hot path: {@link functionModule.memoize} ensures
112
111
  * the wrapper is installed at most once per process, so subsequent
@@ -136,33 +135,38 @@ const setupFetchInterceptor = functionModule.memoize(() => {
136
135
  });
137
136
  });
138
137
  /**
139
- * Rewrite a non-streaming serving response whose body needs repair, leaving
140
- * everything else byte-identical.
138
+ * Rewrite a serving response whose body needs repair, leaving unsupported
139
+ * content types byte-identical.
141
140
  *
142
- * Streaming turns are passed straight through: an SSE body must stay a live
143
- * stream (buffering it to a string would defeat streaming and break
144
- * `text/event-stream` parsing), and the delta frames already carry string
145
- * content, so they never hit the array-shaped `content` bug. Likewise a
146
- * non-JSON or error body is returned untouched, so the caller still sees the
147
- * original status and headers.
141
+ * SSE remains a live stream: a TransformStream repairs complete `data:` lines
142
+ * as bytes arrive and preserves partial lines across network chunks. JSON is
143
+ * buffered through the existing response-body repair. A non-JSON/non-SSE body
144
+ * is returned untouched so the caller still sees the original response.
148
145
  */
149
146
  async function repairServingResponse(response) {
150
147
  const contentType = response.headers.get("content-type") ?? "";
148
+ if (contentType.includes("text/event-stream") && response.body) {
149
+ return rebuildServingResponse(response, rewriteServingResponseStream(response.body));
150
+ }
151
151
  if (!contentType.includes("application/json"))
152
152
  return response;
153
153
  const body = await response.clone().text();
154
154
  const rewritten = rewriteServingResponseBody(body);
155
155
  if (rewritten === body)
156
156
  return response;
157
+ return rebuildServingResponse(response, rewritten);
158
+ }
159
+ /** Rebuild a transformed response without stale byte-length/encoding headers. */
160
+ function rebuildServingResponse(response, body) {
157
161
  // `content-length` / `content-encoding` describe the ORIGINAL bytes, so they
158
162
  // are dropped: the rewritten body is a different length and already decoded.
159
163
  const headers = new Headers(response.headers);
160
164
  headers.delete("content-length");
161
165
  headers.delete("content-encoding");
162
- return new Response(rewritten, {
166
+ return new Response(body, {
163
167
  status: response.status,
164
168
  statusText: response.statusText,
165
169
  headers,
166
170
  });
167
171
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLeEUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQXFCaEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLE1BQTBCLEVBQzFCLGNBQThCLEVBQzlCLFlBQWlDLEVBQUU7SUFFbkMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO0lBQzdCLGtFQUFrRTtJQUNsRSxxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEQsTUFBTSxJ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OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLFFBQWtCO0lBQ3JELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRS9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLElBQUk7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUV4Qyw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQzdCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgTW9kZWwgU2VydmluZyByZXNvbHZlciBmb3IgTWFzdHJhIGFnZW50cy5cbiAqXG4gKiBFYWNoIGFnZW50IHN0ZXAgY2FsbHMge0BsaW5rIGJ1aWxkTW9kZWx9IHdpdGggdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIHVzZXIgc3RhbXBlZCBieSBgTWFzdHJhU2VydmVyYCBjYXJyaWVzIGFuXG4gKiBBcHBLaXQgYFdvcmtzcGFjZUNsaWVudGA7IHdlIGFzayBpdCBmb3IgdGhlIHdvcmtzcGFjZSBob3N0IGFuZCBhXG4gKiBmcmVzaCBiZWFyZXIgaGVhZGVyLCB0aGVuIHBvaW50IE1hc3RyYSdzIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyXG4gKiBhdCBgL3NlcnZpbmctZW5kcG9pbnRzYCBvbiB0aGF0IGhvc3QuXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSBhZGRzIHRoZSBNYXN0cmEtc3BlY2lmaWMgZ2x1ZS4gVGhlIGFjdHVhbCBtb2RlbFxuICogc2VsZWN0aW9uIC0gbGlzdGluZyB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2aW5nIGFuXG4gKiBleHBsaWNpdCBuYW1lIC8gY2xhc3MgLyBmYWxsYmFjayBjaGFpbiB0byBhIHJlYWwgZW5kcG9pbnQgaWQgLSBsaXZlc1xuICogaW4gYEBkYngtdG9vbHMvbW9kZWxgICh7QGxpbmsgc2VsZWN0TW9kZWx9KSBzbyBub24tTWFzdHJhIGNvbnN1bWVyc1xuICogKGUuZy4gYSBqb2IgdGhhdCBqdXN0IG5lZWRzIGEgbW9kZWwgbmFtZSkgY2FuIHJldXNlIGl0LiBIZXJlIHdlXG4gKiBhc3NlbWJsZSB0aGUgZXhwbGljaXQgYXNrIGZyb20gTWFzdHJhJ3MgcmVxdWVzdCBjb250ZXh0ICh0aGVcbiAqIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHVuZGVyIHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgdGhlXG4gKiBhZ2VudCAvIHBsdWdpbiBgbW9kZWxJZGAsIG9yIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWApLFxuICogcGFzcyB0aGUgcGx1Z2luJ3MgZnV6enkgLyBjbGFzcyAvIGZhbGxiYWNrIGtub2JzIHRocm91Z2gsIGFuZCB3cmFwXG4gKiB0aGUgcmVzb2x2ZWQgaWQgaW4gdGhlIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGNvbmZpZyBNYXN0cmFcbiAqIGV4cGVjdHMuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzXG4gKiBwcm9wYWdhdGUgc28gY2FsbGVycyBzZWUgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbGFzc2VzLCByZXNvbHZlIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBqc29uLCBsb2csIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZywgdHlwZSBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyByZXdyaXRlU2VydmluZ0JvZHksIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5IH0gZnJvbSBcIi4vc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5jb25zdCB7IHBhcnNlTW9kZWxDbGFzcyB9ID0gY2xhc3NlcztcbmNvbnN0IHsgc2VsZWN0TW9kZWwgfSA9IHJlc29sdmU7XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IG92ZXJyaWRlcy5tb2RlbENsYXNzO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChleGVjdXRpb25Db250ZXh0LmNsaWVudCwgaG9zdCwge1xuICAgIC4uLihleHBsaWNpdCAhPT0gdW5kZWZpbmVkID8geyBleHBsaWNpdCB9IDoge30pLFxuICAgIGZ1enp5OiBzZXJ2aW5nLmZ1enp5LFxuICAgIHRocmVzaG9sZDogc2VydmluZy50aHJlc2hvbGQsXG4gICAgLi4uKG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzcyB9IDoge30pLFxuICAgIGZhbGxiYWNrczogc2VydmluZy5mYWxsYmFja3MsXG4gICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXJJZDogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJkYXRhYnJpY2tzXCIsXG4gICAgbW9kZWxJZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgfTtcbn1cblxuLyoqIFBhdGggcHJlZml4IHRoYXQgaWRlbnRpZmllcyBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBSRVNUIGNhbGwuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCA9IFwiL3NlcnZpbmctZW5kcG9pbnRzL1wiO1xuXG4vKipcbiAqIEluc3RhbGwgYSBzaW5nbGUgc2hhcmVkIGBnbG9iYWxUaGlzLmZldGNoYCB3cmFwcGVyIGZvciBldmVyeSBQT1NUIHRvXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAuIFRoZSB3cmFwcGVyIGRvZXMgdHdvIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIHRoZSBvdXRnb2luZyBgbWVzc2FnZXNgIGFycmF5IHRvIHJlcGFpciBNYXN0cmEvQUkgU0RLXG4gKiAgICAgIHN0cmVhbS1yZXBsYXkgcXVpcmtzIHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgKHNlZVxuICogICAgICB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIHRoZSBub24tc3RyZWFtaW5nIEpTT04gcmVzcG9uc2UsIHdoZXJlIERhdGFicmlja3MtaG9zdGVkXG4gKiAgICAgIEdlbWluaSByZXR1cm5zIGBjaG9pY2VzW10ubWVzc2FnZS5jb250ZW50YCBhcyBhIHBhcnRzIGFycmF5IHRoYXRcbiAqICAgICAgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cyAoc2VlXG4gKiAgICAgIHtAbGluayByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keX0pLlxuICpcbiAqIFNhZmUgdG8gY2FsbCBmcm9tIGFueSBob3QgcGF0aDoge0BsaW5rIGZ1bmN0aW9uTW9kdWxlLm1lbW9pemV9IGVuc3VyZXNcbiAqIHRoZSB3cmFwcGVyIGlzIGluc3RhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MsIHNvIHN1YnNlcXVlbnRcbiAqIGNhbGxzIGFyZSBhIG5vLW9wIGV2ZW4gd2hlbiB7QGxpbmsgYnVpbGRNb2RlbH0gZmlyZXMgb24gZXZlcnkgYWdlbnRcbiAqIHN0ZXAuXG4gKi9cbmNvbnN0IHNldHVwRmV0Y2hJbnRlcmNlcHRvciA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoKCk6IHZvaWQgPT4ge1xuICBjb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2xsbVwiKTtcbiAgY29uc3Qgb3JpZ2luYWwgPSBnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcyk7XG4gIGdsb2JhbFRoaXMuZmV0Y2ggPSAoYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoaW5wdXQpO1xuICAgIGlmIChcbiAgICAgICF1cmwgfHxcbiAgICAgICF1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCkgfHxcbiAgICAgIHR5cGVvZiBpbml0Py5ib2R5ICE9PSBcInN0cmluZ1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWwoaW5wdXQsIGluaXQpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlU2VydmluZ0JvZHkoaW5pdC5ib2R5KTtcbiAgICBpZiAocmV3cml0dGVuICE9PSBpbml0LmJvZHkpIHtcbiAgICAgIGluaXQgPSB7IC4uLmluaXQsIGJvZHk6IHJld3JpdHRlbiB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPHVua25vd24+KHJld3JpdHRlbik7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJQT1NUXCIsXG4gICAgICBwYXJzZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgdXJsOiB1cmwudG9TdHJpbmcoKSwgYm9keVR5cGU6IFwibm9uLUpTT05cIiB9XG4gICAgICAgIDogeyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5OiBwYXJzZWQgfSxcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb3JpZ2luYWwoaW5wdXQsIGluaXQpO1xuICAgIHJldHVybiByZXBhaXJTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9KSBhcyB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaDtcbn0pO1xuXG4vKipcbiAqIFJld3JpdGUgYSBub24tc3RyZWFtaW5nIHNlcnZpbmcgcmVzcG9uc2Ugd2hvc2UgYm9keSBuZWVkcyByZXBhaXIsIGxlYXZpbmdcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBieXRlLWlkZW50aWNhbC5cbiAqXG4gKiBTdHJlYW1pbmcgdHVybnMgYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoOiBhbiBTU0UgYm9keSBtdXN0IHN0YXkgYSBsaXZlXG4gKiBzdHJlYW0gKGJ1ZmZlcmluZyBpdCB0byBhIHN0cmluZyB3b3VsZCBkZWZlYXQgc3RyZWFtaW5nIGFuZCBicmVha1xuICogYHRleHQvZXZlbnQtc3RyZWFtYCBwYXJzaW5nKSwgYW5kIHRoZSBkZWx0YSBmcmFtZXMgYWxyZWFkeSBjYXJyeSBzdHJpbmdcbiAqIGNvbnRlbnQsIHNvIHRoZXkgbmV2ZXIgaGl0IHRoZSBhcnJheS1zaGFwZWQgYGNvbnRlbnRgIGJ1Zy4gTGlrZXdpc2UgYVxuICogbm9uLUpTT04gb3IgZXJyb3IgYm9keSBpcyByZXR1cm5lZCB1bnRvdWNoZWQsIHNvIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyB0aGVcbiAqIG9yaWdpbmFsIHN0YXR1cyBhbmQgaGVhZGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcIlwiO1xuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkgcmV0dXJuIHJlc3BvbnNlO1xuXG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLnRleHQoKTtcbiAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHkoYm9keSk7XG4gIGlmIChyZXdyaXR0ZW4gPT09IGJvZHkpIHJldHVybiByZXNwb25zZTtcblxuICAvLyBgY29udGVudC1sZW5ndGhgIC8gYGNvbnRlbnQtZW5jb2RpbmdgIGRlc2NyaWJlIHRoZSBPUklHSU5BTCBieXRlcywgc28gdGhleVxuICAvLyBhcmUgZHJvcHBlZDogdGhlIHJld3JpdHRlbiBib2R5IGlzIGEgZGlmZmVyZW50IGxlbmd0aCBhbmQgYWxyZWFkeSBkZWNvZGVkLlxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1lbmNvZGluZ1wiKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXdyaXR0ZW4sIHtcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnMsXG4gIH0pO1xufVxuIl19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLeEUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEdBQzdCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQXFCaEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLE1BQTBCLEVBQzFCLGNBQThCLEVBQzlCLFlBQWlDLEVBQUU7SUFFbkMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO0lBQzdCLGtFQUFrRTtJQUNsRSxxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENB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Qy9CLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgcmVzb2x2ZXIgZm9yIE1hc3RyYSBhZ2VudHMuXG4gKlxuICogRWFjaCBhZ2VudCBzdGVwIGNhbGxzIHtAbGluayBidWlsZE1vZGVsfSB3aXRoIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSB1c2VyIHN0YW1wZWQgYnkgYE1hc3RyYVNlcnZlcmAgY2FycmllcyBhblxuICogQXBwS2l0IGBXb3Jrc3BhY2VDbGllbnRgOyB3ZSBhc2sgaXQgZm9yIHRoZSB3b3Jrc3BhY2UgaG9zdCBhbmQgYVxuICogZnJlc2ggYmVhcmVyIGhlYWRlciwgdGhlbiBwb2ludCBNYXN0cmEncyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlclxuICogYXQgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb24gdGhhdCBob3N0LlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBjb25maWcgTWFzdHJhXG4gKiBleHBlY3RzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgcmVzb2x2ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBmdW5jdGlvbk1vZHVsZSwganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhTW9kZWxDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2xsbVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5cbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcsIHR5cGUgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgcmV3cml0ZVNlcnZpbmdCb2R5LFxuICByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keSxcbiAgcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbSxcbn0gZnJvbSBcIi4vc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5jb25zdCB7IHBhcnNlTW9kZWxDbGFzcyB9ID0gY2xhc3NlcztcbmNvbnN0IHsgc2VsZWN0TW9kZWwgfSA9IHJlc29sdmU7XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IG92ZXJyaWRlcy5tb2RlbENsYXNzO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChleGVjdXRpb25Db250ZXh0LmNsaWVudCwgaG9zdCwge1xuICAgIC4uLihleHBsaWNpdCAhPT0gdW5kZWZpbmVkID8geyBleHBsaWNpdCB9IDoge30pLFxuICAgIGZ1enp5OiBzZXJ2aW5nLmZ1enp5LFxuICAgIHRocmVzaG9sZDogc2VydmluZy50aHJlc2hvbGQsXG4gICAgLi4uKG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzcyB9IDoge30pLFxuICAgIGZhbGxiYWNrczogc2VydmluZy5mYWxsYmFja3MsXG4gICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXJJZDogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJkYXRhYnJpY2tzXCIsXG4gICAgbW9kZWxJZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgfTtcbn1cblxuLyoqIFBhdGggcHJlZml4IHRoYXQgaWRlbnRpZmllcyBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBSRVNUIGNhbGwuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCA9IFwiL3NlcnZpbmctZW5kcG9pbnRzL1wiO1xuXG4vKipcbiAqIEluc3RhbGwgYSBzaW5nbGUgc2hhcmVkIGBnbG9iYWxUaGlzLmZldGNoYCB3cmFwcGVyIGZvciBldmVyeSBQT1NUIHRvXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAuIFRoZSB3cmFwcGVyIGRvZXMgdHdvIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIHRoZSBvdXRnb2luZyBgbWVzc2FnZXNgIGFycmF5IHRvIHJlcGFpciBNYXN0cmEvQUkgU0RLXG4gKiAgICAgIHN0cmVhbS1yZXBsYXkgcXVpcmtzIHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgKHNlZVxuICogICAgICB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIGJ1ZmZlcmVkIGFuZCBzdHJlYW1pbmcgcmVzcG9uc2VzIHdoZXJlIGEgcHJvdmlkZXIgcmV0dXJuc1xuICogICAgICBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgb3IgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcyBhIHBhcnRzXG4gKiAgICAgIGFycmF5IHRoYXQgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cy5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgaG90IHBhdGg6IHtAbGluayBmdW5jdGlvbk1vZHVsZS5tZW1vaXplfSBlbnN1cmVzXG4gKiB0aGUgd3JhcHBlciBpcyBpbnN0YWxsZWQgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLCBzbyBzdWJzZXF1ZW50XG4gKiBjYWxscyBhcmUgYSBuby1vcCBldmVuIHdoZW4ge0BsaW5rIGJ1aWxkTW9kZWx9IGZpcmVzIG9uIGV2ZXJ5IGFnZW50XG4gKiBzdGVwLlxuICovXG5jb25zdCBzZXR1cEZldGNoSW50ZXJjZXB0b3IgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKCgpOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9sbG1cIik7XG4gIGNvbnN0IG9yaWdpbmFsID0gZ2xvYmFsVGhpcy5mZXRjaC5iaW5kKGdsb2JhbFRoaXMpO1xuICBnbG9iYWxUaGlzLmZldGNoID0gKGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KTtcbiAgICBpZiAoXG4gICAgICAhdXJsIHx8XG4gICAgICAhdXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoU0VSVklOR19FTkRQT0lOVFNfUEFUSF9QUkVGSVgpIHx8XG4gICAgICB0eXBlb2YgaW5pdD8uYm9keSAhPT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVNlcnZpbmdCb2R5KGluaXQuYm9keSk7XG4gICAgaWYgKHJld3JpdHRlbiAhPT0gaW5pdC5ib2R5KSB7XG4gICAgICBpbml0ID0geyAuLi5pbml0LCBib2R5OiByZXdyaXR0ZW4gfTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZTx1bmtub3duPihyZXdyaXR0ZW4pO1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiUE9TVFwiLFxuICAgICAgcGFyc2VkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHVybDogdXJsLnRvU3RyaW5nKCksIGJvZHlUeXBlOiBcIm5vbi1KU09OXCIgfVxuICAgICAgICA6IHsgdXJsOiB1cmwudG9TdHJpbmcoKSwgYm9keTogcGFyc2VkIH0sXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICByZXR1cm4gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSkgYXMgdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59KTtcblxuLyoqXG4gKiBSZXdyaXRlIGEgc2VydmluZyByZXNwb25zZSB3aG9zZSBib2R5IG5lZWRzIHJlcGFpciwgbGVhdmluZyB1bnN1cHBvcnRlZFxuICogY29udGVudCB0eXBlcyBieXRlLWlkZW50aWNhbC5cbiAqXG4gKiBTU0UgcmVtYWlucyBhIGxpdmUgc3RyZWFtOiBhIFRyYW5zZm9ybVN0cmVhbSByZXBhaXJzIGNvbXBsZXRlIGBkYXRhOmAgbGluZXNcbiAqIGFzIGJ5dGVzIGFycml2ZSBhbmQgcHJlc2VydmVzIHBhcnRpYWwgbGluZXMgYWNyb3NzIG5ldHdvcmsgY2h1bmtzLiBKU09OIGlzXG4gKiBidWZmZXJlZCB0aHJvdWdoIHRoZSBleGlzdGluZyByZXNwb25zZS1ib2R5IHJlcGFpci4gQSBub24tSlNPTi9ub24tU1NFIGJvZHlcbiAqIGlzIHJldHVybmVkIHVudG91Y2hlZCBzbyB0aGUgY2FsbGVyIHN0aWxsIHNlZXMgdGhlIG9yaWdpbmFsIHJlc3BvbnNlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXBhaXJTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpID8/IFwiXCI7XG4gIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcyhcInRleHQvZXZlbnQtc3RyZWFtXCIpICYmIHJlc3BvbnNlLmJvZHkpIHtcbiAgICByZXR1cm4gcmVidWlsZFNlcnZpbmdSZXNwb25zZShyZXNwb25zZSwgcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbShyZXNwb25zZS5ib2R5KSk7XG4gIH1cbiAgaWYgKCFjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHJldHVybiByZXNwb25zZTtcblxuICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCk7XG4gIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5KGJvZHkpO1xuICBpZiAocmV3cml0dGVuID09PSBib2R5KSByZXR1cm4gcmVzcG9uc2U7XG4gIHJldHVybiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlLCByZXdyaXR0ZW4pO1xufVxuXG4vKiogUmVidWlsZCBhIHRyYW5zZm9ybWVkIHJlc3BvbnNlIHdpdGhvdXQgc3RhbGUgYnl0ZS1sZW5ndGgvZW5jb2RpbmcgaGVhZGVycy4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgYm9keTogc3RyaW5nIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBSZXNwb25zZSB7XG4gIC8vIGBjb250ZW50LWxlbmd0aGAgLyBgY29udGVudC1lbmNvZGluZ2AgZGVzY3JpYmUgdGhlIE9SSUdJTkFMIGJ5dGVzLCBzbyB0aGV5XG4gIC8vIGFyZSBkcm9wcGVkOiB0aGUgcmV3cml0dGVuIGJvZHkgaXMgYSBkaWZmZXJlbnQgbGVuZ3RoIGFuZCBhbHJlYWR5IGRlY29kZWQuXG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgaGVhZGVycy5kZWxldGUoXCJjb250ZW50LWxlbmd0aFwiKTtcbiAgaGVhZGVycy5kZWxldGUoXCJjb250ZW50LWVuY29kaW5nXCIpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHtcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnMsXG4gIH0pO1xufVxuIl19
@@ -7,8 +7,9 @@
7
7
  * Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
8
8
  * a trailing assistant message as a prefill request.
9
9
  *
10
- * Inbound ({@link rewriteServingResponseBody}), because Databricks-hosted
11
- * Gemini answers with its native content-parts array where the OpenAI contract
10
+ * Inbound ({@link rewriteServingResponseBody} and
11
+ * {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
12
+ * Claude can answer with native content-parts arrays where the OpenAI contract
12
13
  * (and therefore the AI SDK's response schema) requires a plain string.
13
14
  *
14
15
  * Every repair here is a provider quirk rather than a schema violation, so all
@@ -75,6 +76,13 @@ export declare function repairAssistantPrefill(messages: ServingChatMessage[]):
75
76
  * {@link rewriteServingBody} on the request side.
76
77
  */
77
78
  export declare function rewriteServingResponseBody(body: string): string;
79
+ /**
80
+ * Repair array-valued `choices[].delta.content` inside an OpenAI SSE stream
81
+ * without buffering the response. The decoder retains partial lines across
82
+ * arbitrary network chunk boundaries; each complete `data:` line is parsed and
83
+ * re-encoded only when its content needs normalization.
84
+ */
85
+ export declare function rewriteServingResponseStream(body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array>;
78
86
  /**
79
87
  * Collapse a structured `choices[].message.content` array to the plain string
80
88
  * the OpenAI Chat Completions contract specifies.
@@ -93,12 +101,17 @@ export declare function rewriteServingResponseBody(body: string): string;
93
101
  * uses `doGenerate` for its side calls, so the visible symptom is
94
102
  * `Error generating title` - every thread keeps its placeholder name.
95
103
  *
96
- * Flattening on the wire keeps the repair in one place: the streaming path is
97
- * unaffected (deltas already carry string content), and neither the agent's
104
+ * Flattening on the wire keeps the repair in one place: neither the agent's
98
105
  * stored transcript nor the UI has to know the provider emitted parts. Any
99
- * non-text part (a `thoughtSignature`-only entry, an inline image) contributes
100
- * nothing, matching {@link openaiChat.chatContentToText}, and an all-parts-empty
101
- * message flattens to `""` rather than being dropped, so `finish_reason` and
102
- * `usage` still round-trip.
106
+ * non-text part (a reasoning block, `thoughtSignature`-only entry, or inline
107
+ * image) contributes nothing, matching {@link openaiChat.chatContentToText},
108
+ * and an all-parts-empty message flattens to `""` rather than being dropped, so
109
+ * `finish_reason` and `usage` still round-trip.
103
110
  */
104
111
  export declare function flattenChoiceMessageContent(payload: Record<string, unknown>): boolean;
112
+ /**
113
+ * Collapse structured streaming `choices[].delta.content` arrays to strings.
114
+ * Claude reasoning-only chunks become an empty content delta while text parts
115
+ * are concatenated in order.
116
+ */
117
+ export declare function flattenChoiceDeltaContent(payload: Record<string, unknown>): boolean;
@@ -7,8 +7,9 @@
7
7
  * Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
8
8
  * a trailing assistant message as a prefill request.
9
9
  *
10
- * Inbound ({@link rewriteServingResponseBody}), because Databricks-hosted
11
- * Gemini answers with its native content-parts array where the OpenAI contract
10
+ * Inbound ({@link rewriteServingResponseBody} and
11
+ * {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
12
+ * Claude can answer with native content-parts arrays where the OpenAI contract
12
13
  * (and therefore the AI SDK's response schema) requires a plain string.
13
14
  *
14
15
  * Every repair here is a provider quirk rather than a schema violation, so all
@@ -74,9 +75,10 @@ export function stripReasoningFromServingMessages(messages) {
74
75
  delete msg.reasoning_content;
75
76
  changed = true;
76
77
  }
77
- if (!Array.isArray(msg.content))
78
+ const parts = openaiChat.chatContentParts(msg.content);
79
+ if (!parts)
78
80
  continue;
79
- const filtered = msg.content.filter((part) => {
81
+ const filtered = parts.filter((part) => {
80
82
  const type = part?.type;
81
83
  if (typeof type === "string" && REASONING_PART_TYPES.has(type)) {
82
84
  changed = true;
@@ -84,7 +86,7 @@ export function stripReasoningFromServingMessages(messages) {
84
86
  }
85
87
  return true;
86
88
  });
87
- if (filtered.length !== msg.content.length) {
89
+ if (filtered.length !== parts.length) {
88
90
  msg.content = filtered;
89
91
  }
90
92
  const hasToolCalls = Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
@@ -160,9 +162,10 @@ function isEmptyServingContent(content) {
160
162
  return true;
161
163
  if (typeof content === "string")
162
164
  return content.trim().length === 0;
163
- if (!Array.isArray(content))
165
+ const parts = openaiChat.chatContentParts(content);
166
+ if (!parts)
164
167
  return true;
165
- return content.every((part) => {
168
+ return parts.every((part) => {
166
169
  if (part?.type === "text") {
167
170
  return typeof part.text !== "string" || part.text.trim().length === 0;
168
171
  }
@@ -181,6 +184,46 @@ export function rewriteServingResponseBody(body) {
181
184
  return body;
182
185
  return flattenChoiceMessageContent(parsed) ? JSON.stringify(parsed) : body;
183
186
  }
187
+ /**
188
+ * Repair array-valued `choices[].delta.content` inside an OpenAI SSE stream
189
+ * without buffering the response. The decoder retains partial lines across
190
+ * arbitrary network chunk boundaries; each complete `data:` line is parsed and
191
+ * re-encoded only when its content needs normalization.
192
+ */
193
+ export function rewriteServingResponseStream(body) {
194
+ const decoder = new TextDecoder();
195
+ const encoder = new TextEncoder();
196
+ let buffer = "";
197
+ return body.pipeThrough(new TransformStream({
198
+ transform(chunk, controller) {
199
+ buffer += decoder.decode(chunk, { stream: true });
200
+ let newline = buffer.indexOf("\n");
201
+ while (newline >= 0) {
202
+ const line = buffer.slice(0, newline + 1);
203
+ buffer = buffer.slice(newline + 1);
204
+ controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(line)));
205
+ newline = buffer.indexOf("\n");
206
+ }
207
+ },
208
+ flush(controller) {
209
+ buffer += decoder.decode();
210
+ if (buffer)
211
+ controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(buffer)));
212
+ },
213
+ }));
214
+ }
215
+ /** Normalize one SSE line while preserving its `data:` spacing and line ending. */
216
+ function rewriteServingResponseStreamLine(line) {
217
+ const lineEnding = line.endsWith("\r\n") ? "\r\n" : line.endsWith("\n") ? "\n" : "";
218
+ const content = lineEnding ? line.slice(0, -lineEnding.length) : line;
219
+ const match = /^(data:\s*)(.*)$/.exec(content);
220
+ if (!match || match[2] === "[DONE]")
221
+ return line;
222
+ const parsed = json.parseRecord(match[2]);
223
+ if (!parsed || !flattenChoiceDeltaContent(parsed))
224
+ return line;
225
+ return `${match[1]}${JSON.stringify(parsed)}${lineEnding}`;
226
+ }
184
227
  /**
185
228
  * Collapse a structured `choices[].message.content` array to the plain string
186
229
  * the OpenAI Chat Completions contract specifies.
@@ -199,30 +242,42 @@ export function rewriteServingResponseBody(body) {
199
242
  * uses `doGenerate` for its side calls, so the visible symptom is
200
243
  * `Error generating title` - every thread keeps its placeholder name.
201
244
  *
202
- * Flattening on the wire keeps the repair in one place: the streaming path is
203
- * unaffected (deltas already carry string content), and neither the agent's
245
+ * Flattening on the wire keeps the repair in one place: neither the agent's
204
246
  * stored transcript nor the UI has to know the provider emitted parts. Any
205
- * non-text part (a `thoughtSignature`-only entry, an inline image) contributes
206
- * nothing, matching {@link openaiChat.chatContentToText}, and an all-parts-empty
207
- * message flattens to `""` rather than being dropped, so `finish_reason` and
208
- * `usage` still round-trip.
247
+ * non-text part (a reasoning block, `thoughtSignature`-only entry, or inline
248
+ * image) contributes nothing, matching {@link openaiChat.chatContentToText},
249
+ * and an all-parts-empty message flattens to `""` rather than being dropped, so
250
+ * `finish_reason` and `usage` still round-trip.
209
251
  */
210
252
  export function flattenChoiceMessageContent(payload) {
253
+ return flattenChoiceContent(payload, "message");
254
+ }
255
+ /**
256
+ * Collapse structured streaming `choices[].delta.content` arrays to strings.
257
+ * Claude reasoning-only chunks become an empty content delta while text parts
258
+ * are concatenated in order.
259
+ */
260
+ export function flattenChoiceDeltaContent(payload) {
261
+ return flattenChoiceContent(payload, "delta");
262
+ }
263
+ /** Shared choice walker for buffered `message` and streaming `delta` payloads. */
264
+ function flattenChoiceContent(payload, field) {
211
265
  if (!Array.isArray(payload.choices))
212
266
  return false;
213
267
  let changed = false;
214
268
  for (const choice of payload.choices) {
215
269
  if (!choice || typeof choice !== "object")
216
270
  continue;
217
- const message = choice.message;
218
- if (!message || typeof message !== "object")
271
+ const container = choice[field];
272
+ if (!container || typeof container !== "object")
219
273
  continue;
220
- const target = message;
221
- if (!Array.isArray(target.content))
274
+ const target = container;
275
+ const parts = openaiChat.chatContentParts(target.content);
276
+ if (!parts)
222
277
  continue;
223
- target.content = openaiChat.chatContentToText(target.content, { types: ["text"] });
278
+ target.content = openaiChat.chatContentToText(parts, { types: ["text"] });
224
279
  changed = true;
225
280
  }
226
281
  return changed;
227
282
  }
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy1zYW5pdGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBR0wsVUFBVSxFQUNWLGVBQWUsR0FDaEIsTUFBTSx5QkFBeUIsQ0FBQztBQWVqQyw4RUFBOEU7QUFDOUUsc0NBQXNDO0FBQ3RDLE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQztBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFdkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFnQyxDQUFDO1FBQ3pELHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsTUFBTSxRQUFRLEdBQUcsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsT0FBTyxHQUFHLE9BQU8sSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNB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QU8sS0FBSyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3BELE1BQU0sT0FBTyxHQUFJLE1BQWdDLENBQUMsT0FBTyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsT0FBZ0MsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQUUsU0FBUztRQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDakIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcGFpcnMgdHJhZmZpYyBiZXR3ZWVuIE1hc3RyYSAvIHRoZSBBSSBTREsgYW5kIERhdGFicmlja3MgTW9kZWwgU2VydmluZydzXG4gKiBPcGVuQUktY29tcGF0aWJsZSBgL2NoYXQvY29tcGxldGlvbnNgIHJvdXRlLCBpbiBib3RoIGRpcmVjdGlvbnMuXG4gKlxuICogT3V0Ym91bmQgKHtAbGluayByZXdyaXRlU2VydmluZ0JvZHl9KSwgYmVjYXVzZSB0aGUgdHJhbnNjcmlwdCBNYXN0cmFcbiAqIHBlcnNpc3RzIGlzIG5vdCBhbHdheXMgYSB0cmFuc2NyaXB0IHRoZSBwcm92aWRlciB3aWxsIGFjY2VwdCBiYWNrOlxuICogRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgcmVwbGF5ZWQgZXh0ZW5kZWQtdGhpbmtpbmcgYmxvY2tzIGFuZCByZWFkc1xuICogYSB0cmFpbGluZyBhc3Npc3RhbnQgbWVzc2FnZSBhcyBhIHByZWZpbGwgcmVxdWVzdC5cbiAqXG4gKiBJbmJvdW5kICh7QGxpbmsgcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHl9KSwgYmVjYXVzZSBEYXRhYnJpY2tzLWhvc3RlZFxuICogR2VtaW5pIGFuc3dlcnMgd2l0aCBpdHMgbmF0aXZlIGNvbnRlbnQtcGFydHMgYXJyYXkgd2hlcmUgdGhlIE9wZW5BSSBjb250cmFjdFxuICogKGFuZCB0aGVyZWZvcmUgdGhlIEFJIFNESydzIHJlc3BvbnNlIHNjaGVtYSkgcmVxdWlyZXMgYSBwbGFpbiBzdHJpbmcuXG4gKlxuICogRXZlcnkgcmVwYWlyIGhlcmUgaXMgYSBwcm92aWRlciBxdWlyayByYXRoZXIgdGhhbiBhIHNjaGVtYSB2aW9sYXRpb24sIHNvIGFsbFxuICogb2YgdGhlbSBhcmUgYXBwbGllZCBvbiB0aGUgd2lyZSAoc2VlIHRoZSBgZ2xvYmFsVGhpcy5mZXRjaGAgd3JhcHBlciBpblxuICogYG1vZGVsLnRzYCkgcmF0aGVyIHRoYW4gYnkgY2hhbmdpbmcgd2hhdCB0aGUgYWdlbnQgc3RvcmVzIG9yIHdoYXQgdGhlIFVJXG4gKiBzaG93cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsganNvbiwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hhdE1lc3NhZ2UsXG4gIHR5cGUgQ2hhdFJvbGUsXG4gIG9wZW5haUNoYXQsXG4gIG9wZW5haVJlc3BvbnNlcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKlxuICogQSBjaGF0IG1lc3NhZ2UgYXMgaXQgYXJyaXZlcyBvbiB0aGUgc2VydmluZyB3aXJlLCBwbHVzIHRoZSBleHRlbmRlZC10aGlua2luZ1xuICogZmllbGRzIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSBhZGRzLiBUaGUgT3BlbkFJLXN0YW5kYXJkIHBhcnQgb2YgdGhlIHNoYXBlXG4gKiBpcyB7QGxpbmsgQ2hhdE1lc3NhZ2V9IGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLW1vZGVsYDsgb25seSB0aGUgcHJvdmlkZXJcbiAqIGV4dGVuc2lvbnMgdGhpcyBtb2R1bGUgc3RyaXBzIGFyZSBkZWNsYXJlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpbmdDaGF0TWVzc2FnZSBleHRlbmRzIENoYXRNZXNzYWdlIHtcbiAgLyoqIE5hcnJvd2VkIHRvIHRoZSByb2xlcyB0aGlzIHJlcGFpciBwYXNzIHJlYXNvbnMgYWJvdXQsIHBsdXMgQ2xhdWRlJ3MgYHJlYXNvbmluZ2AgdHVybi4gKi9cbiAgcm9sZTogQ2hhdFJvbGUgfCBcInJlYXNvbmluZ1wiO1xuICByZWFzb25pbmc/OiB1bmtub3duO1xuICByZWFzb25pbmdfY29udGVudD86IHVua25vd247XG59XG5cbi8vIFNoYXJlZCB3aXRoIHRoZSBSZXNwb25zZXMgc2FuaXRpemUgcGF0aCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgYWdyZWUgb24gd2hhdFxuLy8gY291bnRzIGFzIGEgc2lnbmVkIHJlYXNvbmluZyBibG9jay5cbmNvbnN0IFJFQVNPTklOR19QQVJUX1RZUEVTID0gb3BlbmFpUmVzcG9uc2VzLlJFQVNPTklOR19UWVBFUztcblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgUE9TVFxuICogYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXMgbm90XG4gKiBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVTZXJ2aW5nQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG5cbiAgLy8gUnVucyByZWdhcmRsZXNzIG9mIGBtZXNzYWdlc2A6IERhdGFicmlja3MgcmVmdXNlcyB0byBwYXJzZSBhIGJvZHkgY2FycnlpbmdcbiAgLy8gYW4gdW5rbm93biB0b3AtbGV2ZWwgZmllbGQsIHNvIHRoaXMgZmFpbHVyZSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB0cmFuc2NyaXB0LlxuICBsZXQgY2hhbmdlZCA9IG9wZW5haUNoYXQuc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMocGFyc2VkKS5sZW5ndGggPiAwO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5tZXNzYWdlcykpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHBhcnNlZC5tZXNzYWdlcyBhcyBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXTtcbiAgICAvLyBFdmFsdWF0ZWQgZWFnZXJseSwgbm90IHNob3J0LWNpcmN1aXRlZDogb25lIHRyYW5zY3JpcHQgY2FuIG5lZWQgYm90aFxuICAgIC8vIHJlYXNvbmluZyBibG9ja3Mgc3RyaXBwZWQgQU5EIGEgdHJhaWxpbmcgYXNzaXN0YW50IHByZWZpbGwgZm9sZGVkIGJhY2suXG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXMpO1xuICAgIGNvbnN0IHJlcGFpcmVkID0gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlcyk7XG4gICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3RyaXBwZWQgfHwgcmVwYWlyZWQ7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgZXh0ZW5kZWQtdGhpbmtpbmcgLyByZWFzb25pbmcgYmxvY2tzIGZyb20gYSByZXBsYXllZCB0cmFuc2NyaXB0LlxuICpcbiAqIEh5YnJpZCBDbGF1ZGUgZW5kcG9pbnRzIChlLmcuIFNvbm5ldCA0LjUrKSBtYXkgZW1pdCBgcmVhc29uaW5nYCBjb250ZW50XG4gKiBwYXJ0cyBvbiB0aGUgZmlyc3QgdHVybi4gTWFzdHJhIHBlcnNpc3RzIGFuZCByZXBsYXlzIHRoZW0gb24gdGhlIG5leHRcbiAqIGFnZW50IHN0ZXAsIGJ1dCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGUgcmVqZWN0cyB0aG9zZSBibG9ja3Mgb25cbiAqIG11bHRpLXR1cm4gdG9vbCBjb250aW51YXRpb25zLiBUaGUgVUkgYWxyZWFkeSBjYXB0dXJlZCByZWFzb25pbmcgZm9yXG4gKiBkaXNwbGF5OyBzdHJpcHBpbmcgaGVyZSBrZWVwcyBwcm92aWRlciByZXBsYXkgY29tcGF0aWJsZSB3aXRob3V0XG4gKiBjaGFuZ2luZyB3aGF0IHVzZXJzIHNlZSBpbiB0aGUgY2hhdCBidWJibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXM6IFNlcnZpbmdDaGF0TWVzc2FnZVtdKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmICghbXNnKSBjb250aW51ZTtcbiAgICBpZiAobXNnLnJvbGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtc2cucmVhc29uaW5nO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nX2NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1zZy5yZWFzb25pbmdfY29udGVudDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobXNnLmNvbnRlbnQpKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1zZy5jb250ZW50LmZpbHRlcigocGFydCkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IHBhcnQ/LnR5cGU7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1BBUlRfVFlQRVMuaGFzKHR5cGUpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoICE9PSBtc2cuY29udGVudC5sZW5ndGgpIHtcbiAgICAgIG1zZy5jb250ZW50ID0gZmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IGhhc1Rvb2xDYWxscyA9IEFycmF5LmlzQXJyYXkobXNnLnRvb2xfY2FsbHMpICYmIG1zZy50b29sX2NhbGxzLmxlbmd0aCA+IDA7XG4gICAgaWYgKG1zZy5yb2xlID09PSBcImFzc2lzdGFudFwiICYmICFoYXNUb29sQ2FsbHMgJiYgaXNFbXB0eVNlcnZpbmdDb250ZW50KG1zZy5jb250ZW50KSkge1xuICAgICAgbWVzc2FnZXMuc3BsaWNlKGksIDEpO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIFJlcGFpciBhIE1hc3RyYS9BSSBTREsgbWVzc2FnZSByZXBsYXkgdGhhdCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGVcbiAqIHJlamVjdHMgd2l0aCBgXCJUaGlzIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgYXNzaXN0YW50IG1lc3NhZ2VcbiAqIHByZWZpbGwuIFRoZSBjb252ZXJzYXRpb24gbXVzdCBlbmQgd2l0aCBhIHVzZXIgbWVzc2FnZS5cImAuXG4gKlxuICogVGhlIGJ1ZyBwYXR0ZXJuOiB3aGVuIGFuIGFzc2lzdGFudCB0dXJuIHN0cmVhbXMgdGV4dCAqYW5kKiBhXG4gKiBgdG9vbF9jYWxsYCwgdGhlIEFJIFNESyBwZXJzaXN0cyB0aGVtIGFzIHR3byBzZXBhcmF0ZSBhc3Npc3RhbnRcbiAqIGVudHJpZXMgKHRleHQtb25seSBhbmQgdG9vbC1jYWxsLW9ubHkpLiBPbiB0aGUgbmV4dCBhZ2VudCBzdGVwIHRoZVxuICogdG9vbC1jYWxsIGVudHJ5IGlzIHJlcGxheWVkICpiZWZvcmUqIHRoZSB0b29sIHJlc3VsdCBhbmQgdGhlXG4gKiB0ZXh0IGVudHJ5IGlzIHJlcGxheWVkICphZnRlciogaXQsIHNvIHRoZSBjb252ZXJzYXRpb24gZW5kcyB3aXRoIGFcbiAqIHRyYWlsaW5nIGFzc2lzdGFudCB0ZXh0IG1lc3NhZ2UuIEFudGhyb3BpYyBpbnRlcnByZXRzIHRoYXQgYXMgYVxuICogcHJlZmlsbCByZXF1ZXN0IGFuZCByZWplY3RzIGl0IG9uIERhdGFicmlja3MgKHRoZSB1cHN0cmVhbSBCZWRyb2NrXG4gKiByb3V0ZSBkaXNhbGxvd3MgcHJlZmlsbCkuXG4gKlxuICogRml4OiB3aGVuIHRoZSBsYXN0IG1lc3NhZ2UgaXMgYW4gYXNzaXN0YW50IHRleHQgd2l0aCBubyBgdG9vbF9jYWxsc2BcbiAqIGFuZCB0aGUgY2hhaW4gaW1tZWRpYXRlbHkgYmVmb3JlIGl0IGlzIGBhc3Npc3RhbnQodG9vbF9jYWxscz0uLi4pYFxuICogZm9sbG93ZWQgb25seSBieSBgdG9vbCguLi4pYCByZXN1bHRzLCBmb2xkIHRoZSB0cmFpbGluZyB0ZXh0IGJhY2tcbiAqIGludG8gdGhlIGBjb250ZW50YCBvZiB0aGF0IG9wZW5pbmcgYXNzaXN0YW50IGFuZCBkcm9wIHRoZSBkdXBsaWNhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBhaXJBc3Npc3RhbnRQcmVmaWxsKG1lc3NhZ2VzOiBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXSk6IGJvb2xlYW4ge1xuICBpZiAobWVzc2FnZXMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBsYXN0ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gIGlmICghbGFzdCB8fCBsYXN0LnJvbGUgIT09IFwiYXNzaXN0YW50XCIgfHwgKGxhc3QudG9vbF9jYWxscyAmJiBsYXN0LnRvb2xfY2FsbHMubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDI7XG4gIHdoaWxlIChpID49IDAgJiYgbWVzc2FnZXNbaV0/LnJvbGUgPT09IFwidG9vbFwiKSBpLS07XG4gIGlmIChpIDwgMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBvcGVuZXIgPSBtZXNzYWdlc1tpXTtcbiAgaWYgKFxuICAgICFvcGVuZXIgfHxcbiAgICBvcGVuZXIucm9sZSAhPT0gXCJhc3Npc3RhbnRcIiB8fFxuICAgICFvcGVuZXIudG9vbF9jYWxscyB8fFxuICAgIG9wZW5lci50b29sX2NhbGxzLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXJnZWQgPSBbXG4gICAgc3RyaW5nLnRyaW1Ub051bGwodGV4dEZyb21TZXJ2aW5nQ29udGVudChvcGVuZXIuY29udGVudCkpLFxuICAgIHN0cmluZy50cmltVG9OdWxsKHRleHRGcm9tU2VydmluZ0NvbnRlbnQobGFzdC5jb250ZW50KSksXG4gIF1cbiAgICAuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gcyAhPT0gbnVsbClcbiAgICAuam9pbihcIlxcblxcblwiKTtcbiAgb3BlbmVyLmNvbnRlbnQgPSBtZXJnZWQ7XG4gIG1lc3NhZ2VzLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGNvbnRlbnQgdG8gdGhlIHByb3NlIGEgaHVtYW4gd291bGQgcmVhZDogdGV4dCBwYXJ0cyBvbmx5LCBzZXBhcmF0ZWRcbiAqIGJ5IGJsYW5rIGxpbmVzLCBzaW5jZSB0aGUgcmVzdWx0IGlzIHNwbGljZWQgaW50byBhbm90aGVyIHR1cm4ncyBtZXNzYWdlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIHRleHRGcm9tU2VydmluZ0NvbnRlbnQoY29udGVudDogU2VydmluZ0NoYXRNZXNzYWdlW1wiY29udGVudFwiXSk6IHN0cmluZyB7XG4gIHJldHVybiBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KGNvbnRlbnQsIHsgc2VwYXJhdG9yOiBcIlxcblxcblwiLCB0eXBlczogW1widGV4dFwiXSB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgdHVybiBjYXJyaWVzIG5vdGhpbmcgd29ydGggcmVwbGF5aW5nLiBEZWxpYmVyYXRlbHkgc3RyaWN0ZXIgdGhhblxuICogXCJoYXMgbm8gdGV4dFwiOiBhIHBhcnQgb2YgYW55IG90aGVyIHR5cGUgKGFuIGltYWdlLCBhIGNhY2hlIG1hcmtlcikgY291bnRzIGFzXG4gKiBjb250ZW50LCBzbyBhIG1lc3NhZ2UgaG9sZGluZyBvbmUgaXMga2VwdCBldmVuIHRob3VnaCBpdCBoYXMgbm8gcHJvc2UuXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTZXJ2aW5nQ29udGVudChjb250ZW50OiBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXCJjb250ZW50XCJdKTogYm9vbGVhbiB7XG4gIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBjb250ZW50LmV2ZXJ5KChwYXJ0KSA9PiB7XG4gICAgaWYgKHBhcnQ/LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIiB8fCBwYXJ0LnRleHQudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgbm9uLXN0cmVhbWluZ1xuICogSlNPTiBSRVNQT05TRSBib2R5LiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmcgdmVyYmF0aW0gd2hlbiB0aGUgYm9keSBpc1xuICogbm90IEpTT04gb3Igbm8gcmV3cml0ZSB3YXMgbmVlZGVkLCBtaXJyb3JpbmdcbiAqIHtAbGluayByZXdyaXRlU2VydmluZ0JvZHl9IG9uIHRoZSByZXF1ZXN0IHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG4gIHJldHVybiBmbGF0dGVuQ2hvaWNlTWVzc2FnZUNvbnRlbnQocGFyc2VkKSA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIENvbGxhcHNlIGEgc3RydWN0dXJlZCBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgYXJyYXkgdG8gdGhlIHBsYWluIHN0cmluZ1xuICogdGhlIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIGNvbnRyYWN0IHNwZWNpZmllcy5cbiAqXG4gKiBEYXRhYnJpY2tzLWhvc3RlZCBHZW1pbmkgYW5zd2VycyBhIG5vbi1zdHJlYW1pbmcgYC9jaGF0L2NvbXBsZXRpb25zYCBjYWxsXG4gKiB3aXRoIHRoZSBHZW1pbmktbmF0aXZlIHBhcnRzIHNoYXBlOlxuICpcbiAqIGBgYGpzb25cbiAqIFwiY29udGVudFwiOiBbeyBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGV4dFwiOiBcIi4uLlwiLCBcInRob3VnaHRTaWduYXR1cmVcIjogXCIuLi5cIiB9XVxuICogYGBgXG4gKlxuICogYEBhaS1zZGsvb3BlbmFpLWNvbXBhdGlibGVgIHZhbGlkYXRlcyB0aGUgcmVzcG9uc2UgYWdhaW5zdCB0aGUgT3BlbkFJXG4gKiBzY2hlbWEsIHdoZXJlIGBjb250ZW50YCBpcyBhIG51bGxhYmxlIHN0cmluZywgc28gaXQgdGhyb3dzXG4gKiBgVHlwZSB2YWxpZGF0aW9uIGZhaWxlZDogLi4uIGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYXJyYXlgIGFuZCB0aGUgd2hvbGVcbiAqIGNhbGwgZmFpbHMgKGBBSV9BUElDYWxsRXJyb3I6IEludmFsaWQgSlNPTiByZXNwb25zZWAgb24gYW4gSFRUUCAyMDApLiBNYXN0cmFcbiAqIHVzZXMgYGRvR2VuZXJhdGVgIGZvciBpdHMgc2lkZSBjYWxscywgc28gdGhlIHZpc2libGUgc3ltcHRvbSBpc1xuICogYEVycm9yIGdlbmVyYXRpbmcgdGl0bGVgIC0gZXZlcnkgdGhyZWFkIGtlZXBzIGl0cyBwbGFjZWhvbGRlciBuYW1lLlxuICpcbiAqIEZsYXR0ZW5pbmcgb24gdGhlIHdpcmUga2VlcHMgdGhlIHJlcGFpciBpbiBvbmUgcGxhY2U6IHRoZSBzdHJlYW1pbmcgcGF0aCBpc1xuICogdW5hZmZlY3RlZCAoZGVsdGFzIGFscmVhZHkgY2Fycnkgc3RyaW5nIGNvbnRlbnQpLCBhbmQgbmVpdGhlciB0aGUgYWdlbnQnc1xuICogc3RvcmVkIHRyYW5zY3JpcHQgbm9yIHRoZSBVSSBoYXMgdG8ga25vdyB0aGUgcHJvdmlkZXIgZW1pdHRlZCBwYXJ0cy4gQW55XG4gKiBub24tdGV4dCBwYXJ0IChhIGB0aG91Z2h0U2lnbmF0dXJlYC1vbmx5IGVudHJ5LCBhbiBpbmxpbmUgaW1hZ2UpIGNvbnRyaWJ1dGVzXG4gKiBub3RoaW5nLCBtYXRjaGluZyB7QGxpbmsgb3BlbmFpQ2hhdC5jaGF0Q29udGVudFRvVGV4dH0sIGFuZCBhbiBhbGwtcGFydHMtZW1wdHlcbiAqIG1lc3NhZ2UgZmxhdHRlbnMgdG8gYFwiXCJgIHJhdGhlciB0aGFuIGJlaW5nIGRyb3BwZWQsIHNvIGBmaW5pc2hfcmVhc29uYCBhbmRcbiAqIGB1c2FnZWAgc3RpbGwgcm91bmQtdHJpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VNZXNzYWdlQ29udGVudChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZC5jaG9pY2VzKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGNob2ljZSBvZiBwYXlsb2FkLmNob2ljZXMpIHtcbiAgICBpZiAoIWNob2ljZSB8fCB0eXBlb2YgY2hvaWNlICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBtZXNzYWdlID0gKGNob2ljZSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2U7XG4gICAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXQgPSBtZXNzYWdlIGFzIHsgY29udGVudD86IHVua25vd24gfTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0LmNvbnRlbnQpKSBjb250aW51ZTtcbiAgICB0YXJnZXQuY29udGVudCA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQodGFyZ2V0LmNvbnRlbnQsIHsgdHlwZXM6IFtcInRleHRcIl0gfSk7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG4iXX0=
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy1zYW5pdGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUdMLFVBQVUsRUFDVixlQUFlLEdBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFlakMsOEVBQThFO0FBQzlFLHNDQUFzQztBQUN0QyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUM7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6Qiw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBZ0MsQ0FBQztRQUN6RCx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLE1BQU0sUUFBUSxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sR0FBRyxPQUFPLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxT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RUFDaEMsS0FBMEI7SUFFMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3BELE1BQU0sU0FBUyxHQUFJLE1BQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRO1lBQUUsU0FBUztRQUMxRCxNQUFNLE1BQU0sR0FBRyxTQUFrQyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxTQUFTO1FBQ3JCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBhaXJzIHRyYWZmaWMgYmV0d2VlbiBNYXN0cmEgLyB0aGUgQUkgU0RLIGFuZCBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcnc1xuICogT3BlbkFJLWNvbXBhdGlibGUgYC9jaGF0L2NvbXBsZXRpb25zYCByb3V0ZSwgaW4gYm90aCBkaXJlY3Rpb25zLlxuICpcbiAqIE91dGJvdW5kICh7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSksIGJlY2F1c2UgdGhlIHRyYW5zY3JpcHQgTWFzdHJhXG4gKiBwZXJzaXN0cyBpcyBub3QgYWx3YXlzIGEgdHJhbnNjcmlwdCB0aGUgcHJvdmlkZXIgd2lsbCBhY2NlcHQgYmFjazpcbiAqIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSByZWplY3RzIHJlcGxheWVkIGV4dGVuZGVkLXRoaW5raW5nIGJsb2NrcyBhbmQgcmVhZHNcbiAqIGEgdHJhaWxpbmcgYXNzaXN0YW50IG1lc3NhZ2UgYXMgYSBwcmVmaWxsIHJlcXVlc3QuXG4gKlxuICogSW5ib3VuZCAoe0BsaW5rIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5fSBhbmRcbiAqIHtAbGluayByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtfSksIGJlY2F1c2UgRGF0YWJyaWNrcy1ob3N0ZWQgR2VtaW5pIGFuZFxuICogQ2xhdWRlIGNhbiBhbnN3ZXIgd2l0aCBuYXRpdmUgY29udGVudC1wYXJ0cyBhcnJheXMgd2hlcmUgdGhlIE9wZW5BSSBjb250cmFjdFxuICogKGFuZCB0aGVyZWZvcmUgdGhlIEFJIFNESydzIHJlc3BvbnNlIHNjaGVtYSkgcmVxdWlyZXMgYSBwbGFpbiBzdHJpbmcuXG4gKlxuICogRXZlcnkgcmVwYWlyIGhlcmUgaXMgYSBwcm92aWRlciBxdWlyayByYXRoZXIgdGhhbiBhIHNjaGVtYSB2aW9sYXRpb24sIHNvIGFsbFxuICogb2YgdGhlbSBhcmUgYXBwbGllZCBvbiB0aGUgd2lyZSAoc2VlIHRoZSBgZ2xvYmFsVGhpcy5mZXRjaGAgd3JhcHBlciBpblxuICogYG1vZGVsLnRzYCkgcmF0aGVyIHRoYW4gYnkgY2hhbmdpbmcgd2hhdCB0aGUgYWdlbnQgc3RvcmVzIG9yIHdoYXQgdGhlIFVJXG4gKiBzaG93cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsganNvbiwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hhdE1lc3NhZ2UsXG4gIHR5cGUgQ2hhdFJvbGUsXG4gIG9wZW5haUNoYXQsXG4gIG9wZW5haVJlc3BvbnNlcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKlxuICogQSBjaGF0IG1lc3NhZ2UgYXMgaXQgYXJyaXZlcyBvbiB0aGUgc2VydmluZyB3aXJlLCBwbHVzIHRoZSBleHRlbmRlZC10aGlua2luZ1xuICogZmllbGRzIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSBhZGRzLiBUaGUgT3BlbkFJLXN0YW5kYXJkIHBhcnQgb2YgdGhlIHNoYXBlXG4gKiBpcyB7QGxpbmsgQ2hhdE1lc3NhZ2V9IGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLW1vZGVsYDsgb25seSB0aGUgcHJvdmlkZXJcbiAqIGV4dGVuc2lvbnMgdGhpcyBtb2R1bGUgc3RyaXBzIGFyZSBkZWNsYXJlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpbmdDaGF0TWVzc2FnZSBleHRlbmRzIENoYXRNZXNzYWdlIHtcbiAgLyoqIE5hcnJvd2VkIHRvIHRoZSByb2xlcyB0aGlzIHJlcGFpciBwYXNzIHJlYXNvbnMgYWJvdXQsIHBsdXMgQ2xhdWRlJ3MgYHJlYXNvbmluZ2AgdHVybi4gKi9cbiAgcm9sZTogQ2hhdFJvbGUgfCBcInJlYXNvbmluZ1wiO1xuICByZWFzb25pbmc/OiB1bmtub3duO1xuICByZWFzb25pbmdfY29udGVudD86IHVua25vd247XG59XG5cbi8vIFNoYXJlZCB3aXRoIHRoZSBSZXNwb25zZXMgc2FuaXRpemUgcGF0aCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgYWdyZWUgb24gd2hhdFxuLy8gY291bnRzIGFzIGEgc2lnbmVkIHJlYXNvbmluZyBibG9jay5cbmNvbnN0IFJFQVNPTklOR19QQVJUX1RZUEVTID0gb3BlbmFpUmVzcG9uc2VzLlJFQVNPTklOR19UWVBFUztcblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgUE9TVFxuICogYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXMgbm90XG4gKiBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVTZXJ2aW5nQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG5cbiAgLy8gUnVucyByZWdhcmRsZXNzIG9mIGBtZXNzYWdlc2A6IERhdGFicmlja3MgcmVmdXNlcyB0byBwYXJzZSBhIGJvZHkgY2FycnlpbmdcbiAgLy8gYW4gdW5rbm93biB0b3AtbGV2ZWwgZmllbGQsIHNvIHRoaXMgZmFpbHVyZSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB0cmFuc2NyaXB0LlxuICBsZXQgY2hhbmdlZCA9IG9wZW5haUNoYXQuc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMocGFyc2VkKS5sZW5ndGggPiAwO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5tZXNzYWdlcykpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHBhcnNlZC5tZXNzYWdlcyBhcyBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXTtcbiAgICAvLyBFdmFsdWF0ZWQgZWFnZXJseSwgbm90IHNob3J0LWNpcmN1aXRlZDogb25lIHRyYW5zY3JpcHQgY2FuIG5lZWQgYm90aFxuICAgIC8vIHJlYXNvbmluZyBibG9ja3Mgc3RyaXBwZWQgQU5EIGEgdHJhaWxpbmcgYXNzaXN0YW50IHByZWZpbGwgZm9sZGVkIGJhY2suXG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXMpO1xuICAgIGNvbnN0IHJlcGFpcmVkID0gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlcyk7XG4gICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3RyaXBwZWQgfHwgcmVwYWlyZWQ7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgZXh0ZW5kZWQtdGhpbmtpbmcgLyByZWFzb25pbmcgYmxvY2tzIGZyb20gYSByZXBsYXllZCB0cmFuc2NyaXB0LlxuICpcbiAqIEh5YnJpZCBDbGF1ZGUgZW5kcG9pbnRzIChlLmcuIFNvbm5ldCA0LjUrKSBtYXkgZW1pdCBgcmVhc29uaW5nYCBjb250ZW50XG4gKiBwYXJ0cyBvbiB0aGUgZmlyc3QgdHVybi4gTWFzdHJhIHBlcnNpc3RzIGFuZCByZXBsYXlzIHRoZW0gb24gdGhlIG5leHRcbiAqIGFnZW50IHN0ZXAsIGJ1dCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGUgcmVqZWN0cyB0aG9zZSBibG9ja3Mgb25cbiAqIG11bHRpLXR1cm4gdG9vbCBjb250aW51YXRpb25zLiBUaGUgVUkgYWxyZWFkeSBjYXB0dXJlZCByZWFzb25pbmcgZm9yXG4gKiBkaXNwbGF5OyBzdHJpcHBpbmcgaGVyZSBrZWVwcyBwcm92aWRlciByZXBsYXkgY29tcGF0aWJsZSB3aXRob3V0XG4gKiBjaGFuZ2luZyB3aGF0IHVzZXJzIHNlZSBpbiB0aGUgY2hhdCBidWJibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXM6IFNlcnZpbmdDaGF0TWVzc2FnZVtdKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmICghbXNnKSBjb250aW51ZTtcbiAgICBpZiAobXNnLnJvbGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtc2cucmVhc29uaW5nO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nX2NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1zZy5yZWFzb25pbmdfY29udGVudDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhtc2cuY29udGVudCk7XG4gICAgaWYgKCFwYXJ0cykgY29udGludWU7XG4gICAgY29uc3QgZmlsdGVyZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBwYXJ0Py50eXBlO1xuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiICYmIFJFQVNPTklOR19QQVJUX1RZUEVTLmhhcyh0eXBlKSkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCAhPT0gcGFydHMubGVuZ3RoKSB7XG4gICAgICBtc2cuY29udGVudCA9IGZpbHRlcmVkO1xuICAgIH1cbiAgICBjb25zdCBoYXNUb29sQ2FsbHMgPSBBcnJheS5pc0FycmF5KG1zZy50b29sX2NhbGxzKSAmJiBtc2cudG9vbF9jYWxscy5sZW5ndGggPiAwO1xuICAgIGlmIChtc2cucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiAhaGFzVG9vbENhbGxzICYmIGlzRW1wdHlTZXJ2aW5nQ29udGVudChtc2cuY29udGVudCkpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlZDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYSBNYXN0cmEvQUkgU0RLIG1lc3NhZ2UgcmVwbGF5IHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlXG4gKiByZWplY3RzIHdpdGggYFwiVGhpcyBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IGFzc2lzdGFudCBtZXNzYWdlXG4gKiBwcmVmaWxsLiBUaGUgY29udmVyc2F0aW9uIG11c3QgZW5kIHdpdGggYSB1c2VyIG1lc3NhZ2UuXCJgLlxuICpcbiAqIFRoZSBidWcgcGF0dGVybjogd2hlbiBhbiBhc3Npc3RhbnQgdHVybiBzdHJlYW1zIHRleHQgKmFuZCogYVxuICogYHRvb2xfY2FsbGAsIHRoZSBBSSBTREsgcGVyc2lzdHMgdGhlbSBhcyB0d28gc2VwYXJhdGUgYXNzaXN0YW50XG4gKiBlbnRyaWVzICh0ZXh0LW9ubHkgYW5kIHRvb2wtY2FsbC1vbmx5KS4gT24gdGhlIG5leHQgYWdlbnQgc3RlcCB0aGVcbiAqIHRvb2wtY2FsbCBlbnRyeSBpcyByZXBsYXllZCAqYmVmb3JlKiB0aGUgdG9vbCByZXN1bHQgYW5kIHRoZVxuICogdGV4dCBlbnRyeSBpcyByZXBsYXllZCAqYWZ0ZXIqIGl0LCBzbyB0aGUgY29udmVyc2F0aW9uIGVuZHMgd2l0aCBhXG4gKiB0cmFpbGluZyBhc3Npc3RhbnQgdGV4dCBtZXNzYWdlLiBBbnRocm9waWMgaW50ZXJwcmV0cyB0aGF0IGFzIGFcbiAqIHByZWZpbGwgcmVxdWVzdCBhbmQgcmVqZWN0cyBpdCBvbiBEYXRhYnJpY2tzICh0aGUgdXBzdHJlYW0gQmVkcm9ja1xuICogcm91dGUgZGlzYWxsb3dzIHByZWZpbGwpLlxuICpcbiAqIEZpeDogd2hlbiB0aGUgbGFzdCBtZXNzYWdlIGlzIGFuIGFzc2lzdGFudCB0ZXh0IHdpdGggbm8gYHRvb2xfY2FsbHNgXG4gKiBhbmQgdGhlIGNoYWluIGltbWVkaWF0ZWx5IGJlZm9yZSBpdCBpcyBgYXNzaXN0YW50KHRvb2xfY2FsbHM9Li4uKWBcbiAqIGZvbGxvd2VkIG9ubHkgYnkgYHRvb2woLi4uKWAgcmVzdWx0cywgZm9sZCB0aGUgdHJhaWxpbmcgdGV4dCBiYWNrXG4gKiBpbnRvIHRoZSBgY29udGVudGAgb2YgdGhhdCBvcGVuaW5nIGFzc2lzdGFudCBhbmQgZHJvcCB0aGUgZHVwbGljYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlczogU2VydmluZ0NoYXRNZXNzYWdlW10pOiBib29sZWFuIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbGFzdCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICBpZiAoIWxhc3QgfHwgbGFzdC5yb2xlICE9PSBcImFzc2lzdGFudFwiIHx8IChsYXN0LnRvb2xfY2FsbHMgJiYgbGFzdC50b29sX2NhbGxzLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAyO1xuICB3aGlsZSAoaSA+PSAwICYmIG1lc3NhZ2VzW2ldPy5yb2xlID09PSBcInRvb2xcIikgaS0tO1xuICBpZiAoaSA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgb3BlbmVyID0gbWVzc2FnZXNbaV07XG4gIGlmIChcbiAgICAhb3BlbmVyIHx8XG4gICAgb3BlbmVyLnJvbGUgIT09IFwiYXNzaXN0YW50XCIgfHxcbiAgICAhb3BlbmVyLnRvb2xfY2FsbHMgfHxcbiAgICBvcGVuZXIudG9vbF9jYWxscy5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkID0gW1xuICAgIHN0cmluZy50cmltVG9OdWxsKHRleHRGcm9tU2VydmluZ0NvbnRlbnQob3BlbmVyLmNvbnRlbnQpKSxcbiAgICBzdHJpbmcudHJpbVRvTnVsbCh0ZXh0RnJvbVNlcnZpbmdDb250ZW50KGxhc3QuY29udGVudCkpLFxuICBdXG4gICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHMgIT09IG51bGwpXG4gICAgLmpvaW4oXCJcXG5cXG5cIik7XG4gIG9wZW5lci5jb250ZW50ID0gbWVyZ2VkO1xuICBtZXNzYWdlcy5wb3AoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRmxhdHRlbiBjb250ZW50IHRvIHRoZSBwcm9zZSBhIGh1bWFuIHdvdWxkIHJlYWQ6IHRleHQgcGFydHMgb25seSwgc2VwYXJhdGVkXG4gKiBieSBibGFuayBsaW5lcywgc2luY2UgdGhlIHJlc3VsdCBpcyBzcGxpY2VkIGludG8gYW5vdGhlciB0dXJuJ3MgbWVzc2FnZSBib2R5LlxuICovXG5mdW5jdGlvbiB0ZXh0RnJvbVNlcnZpbmdDb250ZW50KGNvbnRlbnQ6IFNlcnZpbmdDaGF0TWVzc2FnZVtcImNvbnRlbnRcIl0pOiBzdHJpbmcge1xuICByZXR1cm4gb3BlbmFpQ2hhdC5jaGF0Q29udGVudFRvVGV4dChjb250ZW50LCB7IHNlcGFyYXRvcjogXCJcXG5cXG5cIiwgdHlwZXM6IFtcInRleHRcIl0gfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHR1cm4gY2FycmllcyBub3RoaW5nIHdvcnRoIHJlcGxheWluZy4gRGVsaWJlcmF0ZWx5IHN0cmljdGVyIHRoYW5cbiAqIFwiaGFzIG5vIHRleHRcIjogYSBwYXJ0IG9mIGFueSBvdGhlciB0eXBlIChhbiBpbWFnZSwgYSBjYWNoZSBtYXJrZXIpIGNvdW50cyBhc1xuICogY29udGVudCwgc28gYSBtZXNzYWdlIGhvbGRpbmcgb25lIGlzIGtlcHQgZXZlbiB0aG91Z2ggaXQgaGFzIG5vIHByb3NlLlxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2VydmluZ0NvbnRlbnQoY29udGVudDogU2VydmluZ0NoYXRNZXNzYWdlW1wiY29udGVudFwiXSk6IGJvb2xlYW4ge1xuICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudC50cmltKCkubGVuZ3RoID09PSAwO1xuICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhjb250ZW50KTtcbiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwYXJ0cy5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0Py50eXBlID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIgfHwgcGFydC50ZXh0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UsIHNhbml0aXplLCBhbmQgcmUtc2VyaWFsaXplIGEgYC9zZXJ2aW5nLWVuZHBvaW50cy8uLi5gIG5vbi1zdHJlYW1pbmdcbiAqIEpTT04gUkVTUE9OU0UgYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXNcbiAqIG5vdCBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZCwgbWlycm9yaW5nXG4gKiB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBvbiB0aGUgcmVxdWVzdCBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHkoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZVJlY29yZChib2R5KTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBib2R5O1xuICByZXR1cm4gZmxhdHRlbkNob2ljZU1lc3NhZ2VDb250ZW50KHBhcnNlZCkgPyBKU09OLnN0cmluZ2lmeShwYXJzZWQpIDogYm9keTtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYXJyYXktdmFsdWVkIGBjaG9pY2VzW10uZGVsdGEuY29udGVudGAgaW5zaWRlIGFuIE9wZW5BSSBTU0Ugc3RyZWFtXG4gKiB3aXRob3V0IGJ1ZmZlcmluZyB0aGUgcmVzcG9uc2UuIFRoZSBkZWNvZGVyIHJldGFpbnMgcGFydGlhbCBsaW5lcyBhY3Jvc3NcbiAqIGFyYml0cmFyeSBuZXR3b3JrIGNodW5rIGJvdW5kYXJpZXM7IGVhY2ggY29tcGxldGUgYGRhdGE6YCBsaW5lIGlzIHBhcnNlZCBhbmRcbiAqIHJlLWVuY29kZWQgb25seSB3aGVuIGl0cyBjb250ZW50IG5lZWRzIG5vcm1hbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtKFxuICBib2R5OiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pixcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuXG4gIHJldHVybiBib2R5LnBpcGVUaHJvdWdoKFxuICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZShjaHVuaywgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICAgIGxldCBuZXdsaW5lID0gYnVmZmVyLmluZGV4T2YoXCJcXG5cIik7XG4gICAgICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lID0gYnVmZmVyLnNsaWNlKDAsIG5ld2xpbmUgKyAxKTtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVyLmVuY29kZShyZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtTGluZShsaW5lKSkpO1xuICAgICAgICAgIG5ld2xpbmUgPSBidWZmZXIuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgICAgIGlmIChidWZmZXIpIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVyLmVuY29kZShyZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtTGluZShidWZmZXIpKSk7XG4gICAgICB9LFxuICAgIH0pLFxuICApO1xufVxuXG4vKiogTm9ybWFsaXplIG9uZSBTU0UgbGluZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyBgZGF0YTpgIHNwYWNpbmcgYW5kIGxpbmUgZW5kaW5nLiAqL1xuZnVuY3Rpb24gcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZUVuZGluZyA9IGxpbmUuZW5kc1dpdGgoXCJcXHJcXG5cIikgPyBcIlxcclxcblwiIDogbGluZS5lbmRzV2l0aChcIlxcblwiKSA/IFwiXFxuXCIgOiBcIlwiO1xuICBjb25zdCBjb250ZW50ID0gbGluZUVuZGluZyA/IGxpbmUuc2xpY2UoMCwgLWxpbmVFbmRpbmcubGVuZ3RoKSA6IGxpbmU7XG4gIGNvbnN0IG1hdGNoID0gL14oZGF0YTpcXHMqKSguKikkLy5leGVjKGNvbnRlbnQpO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzJdID09PSBcIltET05FXVwiKSByZXR1cm4gbGluZTtcblxuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKG1hdGNoWzJdKTtcbiAgaWYgKCFwYXJzZWQgfHwgIWZsYXR0ZW5DaG9pY2VEZWx0YUNvbnRlbnQocGFyc2VkKSkgcmV0dXJuIGxpbmU7XG4gIHJldHVybiBgJHttYXRjaFsxXX0ke0pTT04uc3RyaW5naWZ5KHBhcnNlZCl9JHtsaW5lRW5kaW5nfWA7XG59XG5cbi8qKlxuICogQ29sbGFwc2UgYSBzdHJ1Y3R1cmVkIGBjaG9pY2VzW10ubWVzc2FnZS5jb250ZW50YCBhcnJheSB0byB0aGUgcGxhaW4gc3RyaW5nXG4gKiB0aGUgT3BlbkFJIENoYXQgQ29tcGxldGlvbnMgY29udHJhY3Qgc3BlY2lmaWVzLlxuICpcbiAqIERhdGFicmlja3MtaG9zdGVkIEdlbWluaSBhbnN3ZXJzIGEgbm9uLXN0cmVhbWluZyBgL2NoYXQvY29tcGxldGlvbnNgIGNhbGxcbiAqIHdpdGggdGhlIEdlbWluaS1uYXRpdmUgcGFydHMgc2hhcGU6XG4gKlxuICogYGBganNvblxuICogXCJjb250ZW50XCI6IFt7IFwidHlwZVwiOiBcInRleHRcIiwgXCJ0ZXh0XCI6IFwiLi4uXCIsIFwidGhvdWdodFNpZ25hdHVyZVwiOiBcIi4uLlwiIH1dXG4gKiBgYGBcbiAqXG4gKiBgQGFpLXNkay9vcGVuYWktY29tcGF0aWJsZWAgdmFsaWRhdGVzIHRoZSByZXNwb25zZSBhZ2FpbnN0IHRoZSBPcGVuQUlcbiAqIHNjaGVtYSwgd2hlcmUgYGNvbnRlbnRgIGlzIGEgbnVsbGFibGUgc3RyaW5nLCBzbyBpdCB0aHJvd3NcbiAqIGBUeXBlIHZhbGlkYXRpb24gZmFpbGVkOiAuLi4gZXhwZWN0ZWQgc3RyaW5nLCByZWNlaXZlZCBhcnJheWAgYW5kIHRoZSB3aG9sZVxuICogY2FsbCBmYWlscyAoYEFJX0FQSUNhbGxFcnJvcjogSW52YWxpZCBKU09OIHJlc3BvbnNlYCBvbiBhbiBIVFRQIDIwMCkuIE1hc3RyYVxuICogdXNlcyBgZG9HZW5lcmF0ZWAgZm9yIGl0cyBzaWRlIGNhbGxzLCBzbyB0aGUgdmlzaWJsZSBzeW1wdG9tIGlzXG4gKiBgRXJyb3IgZ2VuZXJhdGluZyB0aXRsZWAgLSBldmVyeSB0aHJlYWQga2VlcHMgaXRzIHBsYWNlaG9sZGVyIG5hbWUuXG4gKlxuICogRmxhdHRlbmluZyBvbiB0aGUgd2lyZSBrZWVwcyB0aGUgcmVwYWlyIGluIG9uZSBwbGFjZTogbmVpdGhlciB0aGUgYWdlbnQnc1xuICogc3RvcmVkIHRyYW5zY3JpcHQgbm9yIHRoZSBVSSBoYXMgdG8ga25vdyB0aGUgcHJvdmlkZXIgZW1pdHRlZCBwYXJ0cy4gQW55XG4gKiBub24tdGV4dCBwYXJ0IChhIHJlYXNvbmluZyBibG9jaywgYHRob3VnaHRTaWduYXR1cmVgLW9ubHkgZW50cnksIG9yIGlubGluZVxuICogaW1hZ2UpIGNvbnRyaWJ1dGVzIG5vdGhpbmcsIG1hdGNoaW5nIHtAbGluayBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0fSxcbiAqIGFuZCBhbiBhbGwtcGFydHMtZW1wdHkgbWVzc2FnZSBmbGF0dGVucyB0byBgXCJcImAgcmF0aGVyIHRoYW4gYmVpbmcgZHJvcHBlZCwgc29cbiAqIGBmaW5pc2hfcmVhc29uYCBhbmQgYHVzYWdlYCBzdGlsbCByb3VuZC10cmlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNob2ljZU1lc3NhZ2VDb250ZW50KHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiB7XG4gIHJldHVybiBmbGF0dGVuQ2hvaWNlQ29udGVudChwYXlsb2FkLCBcIm1lc3NhZ2VcIik7XG59XG5cbi8qKlxuICogQ29sbGFwc2Ugc3RydWN0dXJlZCBzdHJlYW1pbmcgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcnJheXMgdG8gc3RyaW5ncy5cbiAqIENsYXVkZSByZWFzb25pbmctb25seSBjaHVua3MgYmVjb21lIGFuIGVtcHR5IGNvbnRlbnQgZGVsdGEgd2hpbGUgdGV4dCBwYXJ0c1xuICogYXJlIGNvbmNhdGVuYXRlZCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VEZWx0YUNvbnRlbnQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGZsYXR0ZW5DaG9pY2VDb250ZW50KHBheWxvYWQsIFwiZGVsdGFcIik7XG59XG5cbi8qKiBTaGFyZWQgY2hvaWNlIHdhbGtlciBmb3IgYnVmZmVyZWQgYG1lc3NhZ2VgIGFuZCBzdHJlYW1pbmcgYGRlbHRhYCBwYXlsb2Fkcy4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VDb250ZW50KFxuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZmllbGQ6IFwibWVzc2FnZVwiIHwgXCJkZWx0YVwiLFxuKTogYm9vbGVhbiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2hvaWNlIG9mIHBheWxvYWQuY2hvaWNlcykge1xuICAgIGlmICghY2hvaWNlIHx8IHR5cGVvZiBjaG9pY2UgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IChjaG9pY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXTtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgY29udGFpbmVyICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXQgPSBjb250YWluZXIgYXMgeyBjb250ZW50PzogdW5rbm93biB9O1xuICAgIGNvbnN0IHBhcnRzID0gb3BlbmFpQ2hhdC5jaGF0Q29udGVudFBhcnRzKHRhcmdldC5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICB0YXJnZXQuY29udGVudCA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQocGFydHMsIHsgdHlwZXM6IFtcInRleHRcIl0gfSk7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG4iXX0=
package/package.json CHANGED
@@ -31,18 +31,18 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@databricks/appkit": "^0.60.0",
34
- "@dbx-tools/appkit": "0.6.213",
35
- "@dbx-tools/core": "0.6.213",
36
- "@dbx-tools/databricks": "0.6.213",
37
- "@dbx-tools/fs": "0.6.213",
38
- "@dbx-tools/genie": "0.6.213",
39
- "@dbx-tools/model": "0.6.213",
40
- "@dbx-tools/path": "0.6.213",
41
- "@dbx-tools/shared-core": "0.6.213",
42
- "@dbx-tools/shared-fs": "0.6.213",
43
- "@dbx-tools/shared-genie": "0.6.213",
44
- "@dbx-tools/shared-mastra": "0.6.213",
45
- "@dbx-tools/shared-model": "0.6.213",
34
+ "@dbx-tools/appkit": "0.6.214",
35
+ "@dbx-tools/core": "0.6.214",
36
+ "@dbx-tools/databricks": "0.6.214",
37
+ "@dbx-tools/fs": "0.6.214",
38
+ "@dbx-tools/genie": "0.6.214",
39
+ "@dbx-tools/model": "0.6.214",
40
+ "@dbx-tools/path": "0.6.214",
41
+ "@dbx-tools/shared-core": "0.6.214",
42
+ "@dbx-tools/shared-fs": "0.6.214",
43
+ "@dbx-tools/shared-genie": "0.6.214",
44
+ "@dbx-tools/shared-mastra": "0.6.214",
45
+ "@dbx-tools/shared-model": "0.6.214",
46
46
  "@mastra/ai-sdk": "1.6.0",
47
47
  "@mastra/core": "1.47.0",
48
48
  "@mastra/express": "1.4.2",
@@ -72,7 +72,7 @@
72
72
  "./package.json": "./package.json"
73
73
  }
74
74
  },
75
- "version": "0.6.213",
75
+ "version": "0.6.214",
76
76
  "types": "./lib/index.d.ts",
77
77
  "type": "module",
78
78
  "exports": {
package/src/model.ts CHANGED
@@ -31,7 +31,11 @@ import type { MastraModelConfig } from "@mastra/core/llm";
31
31
  import type { RequestContext } from "@mastra/core/request-context";
32
32
 
33
33
  import { MASTRA_USER_KEY, type MastraPluginConfig, type User } from "./config.ts";
34
- import { rewriteServingBody, rewriteServingResponseBody } from "./serving-sanitize.ts";
34
+ import {
35
+ rewriteServingBody,
36
+ rewriteServingResponseBody,
37
+ rewriteServingResponseStream,
38
+ } from "./serving-sanitize.ts";
35
39
  import { MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig } from "./serving.ts";
36
40
 
37
41
  type ModelClass = model.ModelClass;
@@ -140,10 +144,9 @@ const SERVING_ENDPOINTS_PATH_PREFIX = "/serving-endpoints/";
140
144
  * 2. At `LOG_LEVEL=debug`, dumps the (post-sanitize) JSON body so
141
145
  * 4xx debugging doesn't have to fight AI SDK's `[Array]`
142
146
  * formatter.
143
- * 3. Repairs the non-streaming JSON response, where Databricks-hosted
144
- * Gemini returns `choices[].message.content` as a parts array that
145
- * the AI SDK's OpenAI schema rejects (see
146
- * {@link rewriteServingResponseBody}).
147
+ * 3. Repairs buffered and streaming responses where a provider returns
148
+ * `choices[].message.content` or `choices[].delta.content` as a parts
149
+ * array that the AI SDK's OpenAI schema rejects.
147
150
  *
148
151
  * Safe to call from any hot path: {@link functionModule.memoize} ensures
149
152
  * the wrapper is installed at most once per process, so subsequent
@@ -179,30 +182,38 @@ const setupFetchInterceptor = functionModule.memoize((): void => {
179
182
  });
180
183
 
181
184
  /**
182
- * Rewrite a non-streaming serving response whose body needs repair, leaving
183
- * everything else byte-identical.
185
+ * Rewrite a serving response whose body needs repair, leaving unsupported
186
+ * content types byte-identical.
184
187
  *
185
- * Streaming turns are passed straight through: an SSE body must stay a live
186
- * stream (buffering it to a string would defeat streaming and break
187
- * `text/event-stream` parsing), and the delta frames already carry string
188
- * content, so they never hit the array-shaped `content` bug. Likewise a
189
- * non-JSON or error body is returned untouched, so the caller still sees the
190
- * original status and headers.
188
+ * SSE remains a live stream: a TransformStream repairs complete `data:` lines
189
+ * as bytes arrive and preserves partial lines across network chunks. JSON is
190
+ * buffered through the existing response-body repair. A non-JSON/non-SSE body
191
+ * is returned untouched so the caller still sees the original response.
191
192
  */
192
193
  async function repairServingResponse(response: Response): Promise<Response> {
193
194
  const contentType = response.headers.get("content-type") ?? "";
195
+ if (contentType.includes("text/event-stream") && response.body) {
196
+ return rebuildServingResponse(response, rewriteServingResponseStream(response.body));
197
+ }
194
198
  if (!contentType.includes("application/json")) return response;
195
199
 
196
200
  const body = await response.clone().text();
197
201
  const rewritten = rewriteServingResponseBody(body);
198
202
  if (rewritten === body) return response;
203
+ return rebuildServingResponse(response, rewritten);
204
+ }
199
205
 
206
+ /** Rebuild a transformed response without stale byte-length/encoding headers. */
207
+ function rebuildServingResponse(
208
+ response: Response,
209
+ body: string | ReadableStream<Uint8Array>,
210
+ ): Response {
200
211
  // `content-length` / `content-encoding` describe the ORIGINAL bytes, so they
201
212
  // are dropped: the rewritten body is a different length and already decoded.
202
213
  const headers = new Headers(response.headers);
203
214
  headers.delete("content-length");
204
215
  headers.delete("content-encoding");
205
- return new Response(rewritten, {
216
+ return new Response(body, {
206
217
  status: response.status,
207
218
  statusText: response.statusText,
208
219
  headers,
@@ -7,8 +7,9 @@
7
7
  * Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
8
8
  * a trailing assistant message as a prefill request.
9
9
  *
10
- * Inbound ({@link rewriteServingResponseBody}), because Databricks-hosted
11
- * Gemini answers with its native content-parts array where the OpenAI contract
10
+ * Inbound ({@link rewriteServingResponseBody} and
11
+ * {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
12
+ * Claude can answer with native content-parts arrays where the OpenAI contract
12
13
  * (and therefore the AI SDK's response schema) requires a plain string.
13
14
  *
14
15
  * Every repair here is a provider quirk rather than a schema violation, so all
@@ -97,8 +98,9 @@ export function stripReasoningFromServingMessages(messages: ServingChatMessage[]
97
98
  delete msg.reasoning_content;
98
99
  changed = true;
99
100
  }
100
- if (!Array.isArray(msg.content)) continue;
101
- const filtered = msg.content.filter((part) => {
101
+ const parts = openaiChat.chatContentParts(msg.content);
102
+ if (!parts) continue;
103
+ const filtered = parts.filter((part) => {
102
104
  const type = part?.type;
103
105
  if (typeof type === "string" && REASONING_PART_TYPES.has(type)) {
104
106
  changed = true;
@@ -106,7 +108,7 @@ export function stripReasoningFromServingMessages(messages: ServingChatMessage[]
106
108
  }
107
109
  return true;
108
110
  });
109
- if (filtered.length !== msg.content.length) {
111
+ if (filtered.length !== parts.length) {
110
112
  msg.content = filtered;
111
113
  }
112
114
  const hasToolCalls = Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
@@ -184,8 +186,9 @@ function textFromServingContent(content: ServingChatMessage["content"]): string
184
186
  function isEmptyServingContent(content: ServingChatMessage["content"]): boolean {
185
187
  if (content === undefined) return true;
186
188
  if (typeof content === "string") return content.trim().length === 0;
187
- if (!Array.isArray(content)) return true;
188
- return content.every((part) => {
189
+ const parts = openaiChat.chatContentParts(content);
190
+ if (!parts) return true;
191
+ return parts.every((part) => {
189
192
  if (part?.type === "text") {
190
193
  return typeof part.text !== "string" || part.text.trim().length === 0;
191
194
  }
@@ -205,6 +208,51 @@ export function rewriteServingResponseBody(body: string): string {
205
208
  return flattenChoiceMessageContent(parsed) ? JSON.stringify(parsed) : body;
206
209
  }
207
210
 
211
+ /**
212
+ * Repair array-valued `choices[].delta.content` inside an OpenAI SSE stream
213
+ * without buffering the response. The decoder retains partial lines across
214
+ * arbitrary network chunk boundaries; each complete `data:` line is parsed and
215
+ * re-encoded only when its content needs normalization.
216
+ */
217
+ export function rewriteServingResponseStream(
218
+ body: ReadableStream<Uint8Array>,
219
+ ): ReadableStream<Uint8Array> {
220
+ const decoder = new TextDecoder();
221
+ const encoder = new TextEncoder();
222
+ let buffer = "";
223
+
224
+ return body.pipeThrough(
225
+ new TransformStream<Uint8Array, Uint8Array>({
226
+ transform(chunk, controller) {
227
+ buffer += decoder.decode(chunk, { stream: true });
228
+ let newline = buffer.indexOf("\n");
229
+ while (newline >= 0) {
230
+ const line = buffer.slice(0, newline + 1);
231
+ buffer = buffer.slice(newline + 1);
232
+ controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(line)));
233
+ newline = buffer.indexOf("\n");
234
+ }
235
+ },
236
+ flush(controller) {
237
+ buffer += decoder.decode();
238
+ if (buffer) controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(buffer)));
239
+ },
240
+ }),
241
+ );
242
+ }
243
+
244
+ /** Normalize one SSE line while preserving its `data:` spacing and line ending. */
245
+ function rewriteServingResponseStreamLine(line: string): string {
246
+ const lineEnding = line.endsWith("\r\n") ? "\r\n" : line.endsWith("\n") ? "\n" : "";
247
+ const content = lineEnding ? line.slice(0, -lineEnding.length) : line;
248
+ const match = /^(data:\s*)(.*)$/.exec(content);
249
+ if (!match || match[2] === "[DONE]") return line;
250
+
251
+ const parsed = json.parseRecord(match[2]);
252
+ if (!parsed || !flattenChoiceDeltaContent(parsed)) return line;
253
+ return `${match[1]}${JSON.stringify(parsed)}${lineEnding}`;
254
+ }
255
+
208
256
  /**
209
257
  * Collapse a structured `choices[].message.content` array to the plain string
210
258
  * the OpenAI Chat Completions contract specifies.
@@ -223,24 +271,41 @@ export function rewriteServingResponseBody(body: string): string {
223
271
  * uses `doGenerate` for its side calls, so the visible symptom is
224
272
  * `Error generating title` - every thread keeps its placeholder name.
225
273
  *
226
- * Flattening on the wire keeps the repair in one place: the streaming path is
227
- * unaffected (deltas already carry string content), and neither the agent's
274
+ * Flattening on the wire keeps the repair in one place: neither the agent's
228
275
  * stored transcript nor the UI has to know the provider emitted parts. Any
229
- * non-text part (a `thoughtSignature`-only entry, an inline image) contributes
230
- * nothing, matching {@link openaiChat.chatContentToText}, and an all-parts-empty
231
- * message flattens to `""` rather than being dropped, so `finish_reason` and
232
- * `usage` still round-trip.
276
+ * non-text part (a reasoning block, `thoughtSignature`-only entry, or inline
277
+ * image) contributes nothing, matching {@link openaiChat.chatContentToText},
278
+ * and an all-parts-empty message flattens to `""` rather than being dropped, so
279
+ * `finish_reason` and `usage` still round-trip.
233
280
  */
234
281
  export function flattenChoiceMessageContent(payload: Record<string, unknown>): boolean {
282
+ return flattenChoiceContent(payload, "message");
283
+ }
284
+
285
+ /**
286
+ * Collapse structured streaming `choices[].delta.content` arrays to strings.
287
+ * Claude reasoning-only chunks become an empty content delta while text parts
288
+ * are concatenated in order.
289
+ */
290
+ export function flattenChoiceDeltaContent(payload: Record<string, unknown>): boolean {
291
+ return flattenChoiceContent(payload, "delta");
292
+ }
293
+
294
+ /** Shared choice walker for buffered `message` and streaming `delta` payloads. */
295
+ function flattenChoiceContent(
296
+ payload: Record<string, unknown>,
297
+ field: "message" | "delta",
298
+ ): boolean {
235
299
  if (!Array.isArray(payload.choices)) return false;
236
300
  let changed = false;
237
301
  for (const choice of payload.choices) {
238
302
  if (!choice || typeof choice !== "object") continue;
239
- const message = (choice as { message?: unknown }).message;
240
- if (!message || typeof message !== "object") continue;
241
- const target = message as { content?: unknown };
242
- if (!Array.isArray(target.content)) continue;
243
- target.content = openaiChat.chatContentToText(target.content, { types: ["text"] });
303
+ const container = (choice as Record<string, unknown>)[field];
304
+ if (!container || typeof container !== "object") continue;
305
+ const target = container as { content?: unknown };
306
+ const parts = openaiChat.chatContentParts(target.content);
307
+ if (!parts) continue;
308
+ target.content = openaiChat.chatContentToText(parts, { types: ["text"] });
244
309
  changed = true;
245
310
  }
246
311
  return changed;