@cartanova/qgrid-cli 2.3.7 → 2.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/bundle/dist/application/qgrid/qgrid-image-generation.js +42 -0
  2. package/bundle/dist/application/qgrid/qgrid-response-format.js +44 -0
  3. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +23 -4
  4. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +15 -6
  5. package/bundle/dist/application/qgrid/qgrid.frame.js +32 -4
  6. package/bundle/dist/application/qgrid/qgrid.types.js +36 -12
  7. package/bundle/dist/application/qgrid/tool-emulation.js +16 -8
  8. package/bundle/dist/application/request-log/request-log.model.js +5 -2
  9. package/bundle/dist/application/sonamu.generated.js +13 -4
  10. package/bundle/dist/application/sonamu.generated.sso.js +9 -3
  11. package/bundle/dist/i18n/sd.generated.js +4 -1
  12. package/bundle/dist/migrations/20260705140614_alter_request_logs_add1_alter1.js +16 -0
  13. package/bundle/dist/migrations/20260705140615_alter_request_log_steps_alter1.js +14 -0
  14. package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +17 -0
  15. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +2 -1
  16. package/bundle/dist/utils/providers/openai/codex-rpc.js +1 -1
  17. package/bundle/dist/utils/providers/openai/codex-worker.js +78 -6
  18. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +21 -4
  19. package/bundle/src/application/qgrid/qgrid-image-generation.ts +62 -0
  20. package/bundle/src/application/qgrid/qgrid-response-format.ts +59 -0
  21. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +105 -0
  22. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +34 -2
  23. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +33 -0
  24. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +16 -5
  25. package/bundle/src/application/qgrid/qgrid.frame.test.ts +78 -0
  26. package/bundle/src/application/qgrid/qgrid.frame.ts +48 -5
  27. package/bundle/src/application/qgrid/qgrid.types.ts +22 -0
  28. package/bundle/src/application/qgrid/tool-emulation.test.ts +44 -1
  29. package/bundle/src/application/qgrid/tool-emulation.ts +27 -4
  30. package/bundle/src/application/request-log/request-log.entity.json +73 -47
  31. package/bundle/src/application/request-log/request-log.model.ts +7 -0
  32. package/bundle/src/application/sonamu.generated.http +16 -3
  33. package/bundle/src/application/sonamu.generated.sso.ts +6 -0
  34. package/bundle/src/application/sonamu.generated.ts +12 -0
  35. package/bundle/src/i18n/sd.generated.ts +3 -0
  36. package/bundle/src/migrations/20260705140614_alter_request_logs_add1_alter1.ts +15 -0
  37. package/bundle/src/migrations/20260705140615_alter_request_log_steps_alter1.ts +13 -0
  38. package/bundle/src/migrations/20260706120000_alter_request_logs_add_image_cost.ts +14 -0
  39. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +5 -0
  40. package/bundle/src/utils/providers/common/provider-dispatcher.ts +14 -0
  41. package/bundle/src/utils/providers/openai/codex-rpc.ts +2 -0
  42. package/bundle/src/utils/providers/openai/codex-worker.test.ts +219 -0
  43. package/bundle/src/utils/providers/openai/codex-worker.ts +154 -5
  44. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +95 -1
  45. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +42 -0
  46. package/bundle/web-dist/client/assets/index-OQd6CclQ.js +78 -0
  47. package/bundle/web-dist/client/assets/index-VE_24EJf.css +1 -0
  48. package/bundle/web-dist/client/assets/{logs-B0pWpDrg.js → logs-8T91eoLY.js} +1 -1
  49. package/bundle/web-dist/client/assets/{routes-7XhVuG7o.js → routes--GqHRT2A.js} +1 -1
  50. package/bundle/web-dist/client/assets/{sd.generated-DXhjjL2f.js → sd.generated-BrUnRt0B.js} +1 -1
  51. package/bundle/web-dist/client/assets/{services.generated-B7u0U1wC.js → services.generated-AsEvHbJ7.js} +1 -1
  52. package/bundle/web-dist/client/assets/{show-CcjZ9nr7.js → show-cHMucIDC.js} +3 -3
  53. package/bundle/web-dist/client/assets/{tokens-DlwAm0v4.js → tokens-BXAJUeCJ.js} +1 -1
  54. package/bundle/web-dist/client/index.html +3 -3
  55. package/bundle/web-dist/server/assets/{lazyRouteComponent-B0LkbiYf.js → lazyRouteComponent-BswulcOx.js} +1 -1
  56. package/bundle/web-dist/server/assets/{logs-dLx6gMXT.js → logs-B_ZLzpwY.js} +4 -4
  57. package/bundle/web-dist/server/assets/{routes-DD3Hb9xO.js → routes-D9OiKoqa.js} +2 -2
  58. package/bundle/web-dist/server/assets/{sd.generated-DdfpD_iN.js → sd.generated-DRuQSIKo.js} +3 -0
  59. package/bundle/web-dist/server/assets/{services.generated-D3ZCvIkt.js → services.generated-Dp0uKgpV.js} +1 -1
  60. package/bundle/web-dist/server/assets/{show-BQjeyv6A.js → show-CGlX9OYt.js} +104 -13
  61. package/bundle/web-dist/server/assets/{tokens-CSOsBpP7.js → tokens-Cjw6cQxZ.js} +2 -2
  62. package/bundle/web-dist/server/entry-server.generated.js +9 -8
  63. package/package.json +1 -1
  64. package/bundle/web-dist/client/assets/index-5WdFEqZT.css +0 -1
  65. package/bundle/web-dist/client/assets/index-jnUY7nJ-.js +0 -78
@@ -0,0 +1,42 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ //#region src/application/qgrid/qgrid-image-generation.ts
3
+ const CODEX_IMAGE_GENERATION_MODEL = "gpt-image-2";
4
+ const DEFAULT_IMAGE_GENERATION_QUALITY = "medium";
5
+ const DEFAULT_IMAGE_GENERATION_SIZE = "1536x1024";
6
+ const IMAGE_OUTPUT_COST_MICRO_USD = {
7
+ low: {
8
+ "1024x1024": 6e3,
9
+ "1024x1536": 5e3,
10
+ "1536x1024": 5e3
11
+ },
12
+ medium: {
13
+ "1024x1024": 53e3,
14
+ "1024x1536": 41e3,
15
+ "1536x1024": 41e3
16
+ },
17
+ high: {
18
+ "1024x1024": 211e3,
19
+ "1024x1536": 165e3,
20
+ "1536x1024": 165e3
21
+ }
22
+ };
23
+ function resolveImageGenerationOptions(options) {
24
+ return {
25
+ quality: options?.quality ?? "medium",
26
+ size: options?.size ?? "1536x1024"
27
+ };
28
+ }
29
+ function imageGenerationCostMethod(options) {
30
+ const resolved = resolveImageGenerationOptions(options);
31
+ return `assumed:${CODEX_IMAGE_GENERATION_MODEL}:${resolved.quality}:${resolved.size}:png`;
32
+ }
33
+ function estimateImageGenerationCostMicroUsd(result, options) {
34
+ const imageCount = result.content.filter((item) => item.type === "image").length;
35
+ if (imageCount === 0) return null;
36
+ const resolved = resolveImageGenerationOptions(options);
37
+ return imageCount * IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size];
38
+ }
39
+ //#endregion
40
+ export { CODEX_IMAGE_GENERATION_MODEL, DEFAULT_IMAGE_GENERATION_QUALITY, DEFAULT_IMAGE_GENERATION_SIZE, estimateImageGenerationCostMicroUsd, imageGenerationCostMethod, resolveImageGenerationOptions };
41
+
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25TaXplLFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCA9IFwiZ3B0LWltYWdlLTJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fUVVBTElUWTogSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSA9IFwibWVkaXVtXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkU6IEltYWdlR2VuZXJhdGlvblNpemUgPSBcIjE1MzZ4MTAyNFwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPSB7XG4gIHF1YWxpdHk6IEltYWdlR2VuZXJhdGlvblF1YWxpdHk7XG4gIHNpemU6IEltYWdlR2VuZXJhdGlvblNpemU7XG59O1xuXG4vLyBPcGVuQUkgZ3B0LWltYWdlLTIgaW1hZ2Ugb3V0cHV0IGNvc3QgZXN0aW1hdGVzIGJ5IHF1YWxpdHkvc2l6ZTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL2d1aWRlcy9pbWFnZS1nZW5lcmF0aW9uI2NhbGN1bGF0aW5nLWNvc3RzXG5jb25zdCBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0Q6IFJlY29yZDxcbiAgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgUmVjb3JkPEltYWdlR2VuZXJhdGlvblNpemUsIG51bWJlcj5cbj4gPSB7XG4gIGxvdzoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDZfMDAwLFxuICAgIFwiMTAyNHgxNTM2XCI6IDVfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDVfMDAwLFxuICB9LFxuICBtZWRpdW06IHtcbiAgICBcIjEwMjR4MTAyNFwiOiA1M18wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogNDFfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDQxXzAwMCxcbiAgfSxcbiAgaGlnaDoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDIxMV8wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogMTY1XzAwMCxcbiAgICBcIjE1MzZ4MTAyNFwiOiAxNjVfMDAwLFxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogUmVzb2x2ZWRJbWFnZUdlbmVyYXRpb25PcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBxdWFsaXR5OiBvcHRpb25zPy5xdWFsaXR5ID8/IERFRkFVTFRfSU1BR0VfR0VORVJBVElPTl9RVUFMSVRZLFxuICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYGFzc3VtZWQ6JHtDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMfToke3Jlc29sdmVkLnF1YWxpdHl9OiR7cmVzb2x2ZWQuc2l6ZX06cG5nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICByZXN1bHQ6IFF1ZXJ5T3V0cHV0LFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGltYWdlQ291bnQgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiKS5sZW5ndGg7XG4gIGlmIChpbWFnZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGltYWdlQ291bnQgKiBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0RbcmVzb2x2ZWQucXVhbGl0eV1bcmVzb2x2ZWQuc2l6ZV07XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBT0EsTUFBYSwrQkFBK0I7QUFDNUMsTUFBYSxtQ0FBMkQ7QUFDeEUsTUFBYSxnQ0FBcUQ7QUFTbEUsTUFBTSw4QkFHRjtDQUNGLEtBQUs7RUFDSCxhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7RUFDZDtDQUNELFFBQVE7RUFDTixhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7RUFDZDtDQUNELE1BQU07RUFDSixhQUFhO0VBQ2IsYUFBYTtFQUNiLGFBQWE7RUFDZDtDQUNGO0FBRUQsU0FBZ0IsOEJBQ2QsU0FDZ0M7QUFDaEMsUUFBTztFQUNMLFNBQVMsU0FBUyxXQUFBO0VBQ2xCLE1BQU0sU0FBUyxRQUFBO0VBQ2hCOztBQUdILFNBQWdCLDBCQUEwQixTQUFxRDtDQUM3RixNQUFNLFdBQVcsOEJBQThCLFFBQVE7QUFDdkQsUUFBTyxXQUFXLDZCQUE2QixHQUFHLFNBQVMsUUFBUSxHQUFHLFNBQVMsS0FBSzs7QUFHdEYsU0FBZ0Isb0NBQ2QsUUFDQSxTQUNlO0NBQ2YsTUFBTSxhQUFhLE9BQU8sUUFBUSxRQUFRLFNBQVMsS0FBSyxTQUFTLFFBQVEsQ0FBQztBQUMxRSxLQUFJLGVBQWUsRUFBRyxRQUFPO0NBQzdCLE1BQU0sV0FBVyw4QkFBOEIsUUFBUTtBQUN2RCxRQUFPLGFBQWEsNEJBQTRCLFNBQVMsU0FBUyxTQUFTIn0=
@@ -0,0 +1,44 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { CODEX_IMAGE_GENERATION_MODEL, resolveImageGenerationOptions } from "./qgrid-image-generation.js";
3
+ //#region src/application/qgrid/qgrid-response-format.ts
4
+ const CODEX_IMAGE_GENERATION_TOOL_CONFIG = {
5
+ type: "image_generation",
6
+ outputFormat: "png"
7
+ };
8
+ function escapeHtmlAttribute(value) {
9
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
10
+ }
11
+ function formatResponseForLog(result) {
12
+ return result.content.flatMap((item) => {
13
+ if (item.type === "text") return [item.text];
14
+ if (item.type === "image") {
15
+ const alt = escapeHtmlAttribute(item.revisedPrompt ?? "generated image");
16
+ return [`<img src="data:image/png;base64,${item.data}" alt="${alt}" />`];
17
+ }
18
+ return [];
19
+ }).filter((part) => part.length > 0).join("\n");
20
+ }
21
+ function getImageParts(result) {
22
+ return result.content.filter((item) => item.type === "image");
23
+ }
24
+ function formatImagePartForLog(image) {
25
+ const alt = escapeHtmlAttribute(image.revisedPrompt ?? "generated image");
26
+ return `<img src="data:image/png;base64,${image.data}" alt="${alt}" />`;
27
+ }
28
+ function imageGenerationToolArgs(args) {
29
+ const resolved = resolveImageGenerationOptions(args.imageGenerationOptions);
30
+ return JSON.stringify({
31
+ prompt: args.prompt,
32
+ driverModel: args.model ?? null,
33
+ tool: CODEX_IMAGE_GENERATION_TOOL_CONFIG,
34
+ pricingAssumption: {
35
+ model: CODEX_IMAGE_GENERATION_MODEL,
36
+ quality: resolved.quality,
37
+ size: resolved.size
38
+ }
39
+ });
40
+ }
41
+ //#endregion
42
+ export { CODEX_IMAGE_GENERATION_TOOL_CONFIG, formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs };
43
+
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcmVzcG9uc2UtZm9ybWF0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1yZXNwb25zZS1mb3JtYXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBRZ3JpZENvbnRlbnQsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7XG4gIENPREVYX0lNQUdFX0dFTkVSQVRJT05fTU9ERUwsXG4gIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX1RPT0xfQ09ORklHID0ge1xuICB0eXBlOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgb3V0cHV0Rm9ybWF0OiBcInBuZ1wiLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZXNjYXBlSHRtbEF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdDogUXVlcnlPdXRwdXQpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnRcbiAgICAuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiBbaXRlbS50ZXh0XTtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICBjb25zdCBhbHQgPSBlc2NhcGVIdG1sQXR0cmlidXRlKGl0ZW0ucmV2aXNlZFByb21wdCA/PyBcImdlbmVyYXRlZCBpbWFnZVwiKTtcbiAgICAgICAgcmV0dXJuIFtgPGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpdGVtLmRhdGF9XCIgYWx0PVwiJHthbHR9XCIgLz5gXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlUGFydHMocmVzdWx0OiBRdWVyeU91dHB1dCk6IEV4dHJhY3Q8UWdyaWRDb250ZW50LCB7IHR5cGU6IFwiaW1hZ2VcIiB9PltdIHtcbiAgcmV0dXJuIHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImltYWdlXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW1hZ2VQYXJ0Rm9yTG9nKGltYWdlOiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT4pOiBzdHJpbmcge1xuICBjb25zdCBhbHQgPSBlc2NhcGVIdG1sQXR0cmlidXRlKGltYWdlLnJldmlzZWRQcm9tcHQgPz8gXCJnZW5lcmF0ZWQgaW1hZ2VcIik7XG4gIHJldHVybiBgPGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWFnZS5kYXRhfVwiIGFsdD1cIiR7YWx0fVwiIC8+YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICBkcml2ZXJNb2RlbDogYXJncy5tb2RlbCA/PyBudWxsLFxuICAgIHRvb2w6IENPREVYX0lNQUdFX0dFTkVSQVRJT05fVE9PTF9DT05GSUcsXG4gICAgcHJpY2luZ0Fzc3VtcHRpb246IHtcbiAgICAgIG1vZGVsOiBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICAgICAgcXVhbGl0eTogcmVzb2x2ZWQucXVhbGl0eSxcbiAgICAgIHNpemU6IHJlc29sdmVkLnNpemUsXG4gICAgfSxcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQVVBLE1BQWEscUNBQXFDO0NBQ2hELE1BQU07Q0FDTixjQUFjO0NBQ2Y7QUFFRCxTQUFTLG9CQUFvQixPQUF1QjtBQUNsRCxRQUFPLE1BQ0osUUFBUSxNQUFNLFFBQVEsQ0FDdEIsUUFBUSxNQUFNLFNBQVMsQ0FDdkIsUUFBUSxNQUFNLE9BQU8sQ0FDckIsUUFBUSxNQUFNLE9BQU87O0FBRzFCLFNBQWdCLHFCQUFxQixRQUE2QjtBQUNoRSxRQUFPLE9BQU8sUUFDWCxTQUFTLFNBQVM7QUFDakIsTUFBSSxLQUFLLFNBQVMsT0FBUSxRQUFPLENBQUMsS0FBSyxLQUFLO0FBQzVDLE1BQUksS0FBSyxTQUFTLFNBQVM7R0FDekIsTUFBTSxNQUFNLG9CQUFvQixLQUFLLGlCQUFpQixrQkFBa0I7QUFDeEUsVUFBTyxDQUFDLG1DQUFtQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU07O0FBRTFFLFNBQU8sRUFBRTtHQUNULENBQ0QsUUFBUSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQ2pDLEtBQUssS0FBSzs7QUFHZixTQUFnQixjQUFjLFFBQWlFO0FBQzdGLFFBQU8sT0FBTyxRQUFRLFFBQVEsU0FBUyxLQUFLLFNBQVMsUUFBUTs7QUFHL0QsU0FBZ0Isc0JBQXNCLE9BQXlEO0NBQzdGLE1BQU0sTUFBTSxvQkFBb0IsTUFBTSxpQkFBaUIsa0JBQWtCO0FBQ3pFLFFBQU8sbUNBQW1DLE1BQU0sS0FBSyxTQUFTLElBQUk7O0FBR3BFLFNBQWdCLHdCQUF3QixNQUEwQjtDQUNoRSxNQUFNLFdBQVcsOEJBQThCLEtBQUssdUJBQXVCO0FBQzNFLFFBQU8sS0FBSyxVQUFVO0VBQ3BCLFFBQVEsS0FBSztFQUNiLGFBQWEsS0FBSyxTQUFTO0VBQzNCLE1BQU07RUFDTixtQkFBbUI7R0FDakIsT0FBTztHQUNQLFNBQVMsU0FBUztHQUNsQixNQUFNLFNBQVM7R0FDaEI7RUFDRixDQUFDIn0=
@@ -1,4 +1,6 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
+ import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
3
+ import { formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs } from "./qgrid-response-format.js";
2
4
  import { RequestLogModel } from "../request-log/request-log.model.js";
3
5
  import { getLogger } from "@logtape/logtape";
4
6
  //#region src/application/qgrid/qgrid-run-lifecycle.ts
@@ -39,7 +41,8 @@ async function beforeQuery(args) {
39
41
  system_prompt: args.system,
40
42
  model_name: args.model,
41
43
  effort: args.effort,
42
- project_name: args.projectName
44
+ project_name: args.projectName,
45
+ is_image_generation: args.imageGeneration
43
46
  });
44
47
  return {
45
48
  requestLogId,
@@ -58,6 +61,20 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
58
61
  ttft_ms: result.ttftMs,
59
62
  finish_reason: result.finishReason
60
63
  });
64
+ const imageParts = getImageParts(result);
65
+ const imageCostMicroUsd = estimateImageGenerationCostMicroUsd(result, args.imageGenerationOptions);
66
+ for (let i = 0; i < imageParts.length; i++) {
67
+ const image = imageParts[i];
68
+ await RequestLogModel.appendStep(requestLogId, {
69
+ step_index: stepIndex,
70
+ type: "tool_call",
71
+ tool_call_index: i,
72
+ tool_call_id: `image_generation:${stepIndex}:${i}`,
73
+ tool_name: "image_generation",
74
+ tool_args: imageGenerationToolArgs(args),
75
+ tool_result: formatImagePartForLog(image)
76
+ });
77
+ }
61
78
  if (result.finishReason === "tool-calls") {
62
79
  const toolCalls = result.content.filter((c) => c.type === "tool-call");
63
80
  for (let i = 0; i < toolCalls.length; i++) {
@@ -66,7 +83,7 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
66
83
  await RequestLogModel.appendStep(requestLogId, {
67
84
  step_index: stepIndex,
68
85
  type: "tool_call",
69
- tool_call_index: i,
86
+ tool_call_index: imageParts.length + i,
70
87
  tool_call_id: tc.toolCallId,
71
88
  tool_name: tc.toolName,
72
89
  tool_args: tc.input
@@ -77,13 +94,15 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
77
94
  const agg = await RequestLogModel.aggregateStepUsage(requestLogId);
78
95
  await RequestLogModel.finishRun(requestLogId, {
79
96
  status: "succeeded",
80
- response: result.text,
97
+ response: formatResponseForLog(result),
81
98
  token_name: result.tokenName,
82
99
  input_tokens: agg.input_tokens,
83
100
  output_tokens: agg.output_tokens,
84
101
  cache_read_tokens: agg.cache_read_tokens,
85
102
  cache_creation_tokens: agg.cache_creation_tokens,
86
103
  duration_ms: agg.duration_ms,
104
+ image_cost_usd: imageCostMicroUsd,
105
+ image_cost_method: imageCostMicroUsd !== null ? imageGenerationCostMethod(args.imageGenerationOptions) : null,
87
106
  history: filterHistoryForStorage(args.history)
88
107
  });
89
108
  return {};
@@ -135,4 +154,4 @@ async function cleanupStaleRuns() {
135
154
  //#endregion
136
155
  export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
137
156
 
138
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bkxpZmVjeWNsZVJlc3VsdCA9IHtcbiAgcnVuQ29udGV4dD86IFFncmlkUnVuQ29udGV4dDtcbn07XG5cbi8qKlxuICogbG9nTW9kZTpcInJ1blwiIOyLnCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgY2xlYW51cFxuICogMikgYWZ0ZXJRdWVyeTogZ2VuZXJhdGUgc3RlcCArIHRvb2wtY2FsbCBzdGVwICsgZmluaXNoL2tlZXAtb3BlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmVmb3JlUXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8e1xuICByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgc3RlcEluZGV4OiBudW1iZXI7XG59PiB7XG4gIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcblxuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIGlmIChhcmdzLnJ1bkNvbnRleHQ/LnJlcXVlc3RMb2dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWVzdExvZ0lkID0gYXJncy5ydW5Db250ZXh0LnJlcXVlc3RMb2dJZDtcblxuICAgIGlmIChhcmdzLnRvb2xSZXN1bHRzICYmIGFyZ3MudG9vbFJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgY29tcGxldGVUb29sUmVzdWx0cyhyZXF1ZXN0TG9nSWQsIGFyZ3MudG9vbFJlc3VsdHMpO1xuICAgIH1cblxuICAgIHN0ZXBJbmRleCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5nZXROZXh0U3RlcEluZGV4KHJlcXVlc3RMb2dJZCk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogYXJncy5wcm9tcHQsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBhcmdzLnN5c3RlbSxcbiAgICAgIG1vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MuZWZmb3J0LFxuICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVwIOymieyLnCDquLDroZ0gKHJlc3VsdOuKlCDrgpjspJHsl5AgY29tcGxldGVUb29sQ2FsbOuhnCDssYTsm4ApXG4gICAgY29uc3QgdG9vbENhbGxzID0gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09IFwidG9vbC1jYWxsXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbENhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0YyA9IHRvb2xDYWxsc1tpXSE7XG4gICAgICBpZiAodGMudHlwZSAhPT0gXCJ0b29sLWNhbGxcIikgY29udGludWU7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgICAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgICAgICB0b29sX2NhbGxfaW5kZXg6IGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBpbnB1dF90b2tlbnM6IGFnZy5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogYWdnLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZy5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgZHVyYXRpb25fbXM6IGFnZy5kdXJhdGlvbl9tcyxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoUnVuV2l0aEVycm9yIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgYXJncz86IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbiAgICAgIGVycm9yX21lc3NhZ2U6IFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYGZpbmlzaFJ1bkFib3J0ZWQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlVG9vbFJlc3VsdHMoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICB0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHRyIG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jb21wbGV0ZVRvb2xDYWxsKHJlcXVlc3RMb2dJZCwgdHIudG9vbENhbGxJZCwge1xuICAgICAgICB0b29sX3Jlc3VsdDogdHIuaXNFcnJvciA/IHVuZGVmaW5lZCA6IHRyLm91dHB1dCxcbiAgICAgICAgZXJyb3I6IHRyLmlzRXJyb3IgPyB0ci5vdXRwdXQgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGNvbXBsZXRlVG9vbENhbGwgZmFpbGVkIGZvciAke3RyLnRvb2xDYWxsSWR9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YWxlSWRzID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmRTdGFsZVJ1bm5pbmdJZHMoU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzdGFsZUlkcykge1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpZCwge1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhbGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYGNsZWFuZWQgdXAgJHtzdGFsZUlkcy5sZW5ndGh9IHN0YWxlIHJ1bm5pbmcgcmVxdWVzdCBsb2dzYCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBzdGFsZSBjbGVhbnVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0seUJBQXlCLE9BQVU7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
157
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQge1xuICBmb3JtYXRJbWFnZVBhcnRGb3JMb2csXG4gIGZvcm1hdFJlc3BvbnNlRm9yTG9nLFxuICBnZXRJbWFnZVBhcnRzLFxuICBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyxcbn0gZnJvbSBcIi4vcWdyaWQtcmVzcG9uc2UtZm9ybWF0XCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJydW4tbGlmZWN5Y2xlXCJdKTtcbmNvbnN0IFNUQUxFX1JVTl9USFJFU0hPTERfTVMgPSAzMCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBoaXN0b3J564qUIOybkOuzuCDqt7jrjIDroZwg7KCA7J6l7ZWY6riw67O064uk64qULCBydW4g67aE7ISd7JeQIO2VhOyalO2VnCB1c2VyL2Fzc2lzdGFudCDsoJXrs7Trp4wg7ZWE7YSw66eB7ZW07IScIOyggOyepVxuICovXG5mdW5jdGlvbiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShyYXdIaXN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB1bmtub3duIHtcbiAgaWYgKCFyYXdIaXN0b3J5KSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGl0ZW1zID0gSlNPTi5wYXJzZShyYXdIaXN0b3J5KSBhcyB1bmtub3duW107XG4gICAgY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVjb3JkID0gaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHJldHVybiByZWNvcmQudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgKHJlY29yZC5yb2xlID09PSBcInVzZXJcIiB8fCByZWNvcmQucm9sZSA9PT0gXCJhc3Npc3RhbnRcIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSdW5MaWZlY3ljbGVSZXN1bHQgPSB7XG4gIHJ1bkNvbnRleHQ/OiBRZ3JpZFJ1bkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIGxvZ01vZGU6XCJydW5cIiDsi5wgcXVlcnkvc3RyZWFtIOydkeuLtSDsoITtm4Tsl5Ag7Zi47LacLlxuICpcbiAqIDEpIGJlZm9yZVF1ZXJ5OiBydW4g7IOd7ISxL+qzhOyGjSArIHRvb2wgcmVzdWx0IOyZhOujjCArIHN0YWxlIGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBhd2FpdCBjbGVhbnVwU3RhbGVSdW5zKCk7XG5cbiAgbGV0IHJlcXVlc3RMb2dJZDogbnVtYmVyO1xuICBsZXQgc3RlcEluZGV4ID0gMDtcblxuICAvLyByZXF1ZXN0TG9nSWQg6rCAIOyeiOydhCDrlYzrp4wg6riw7KG0IHJ1biDsl7DsnqUuIHRocmVhZENvb3JkIOunjCDsnojripQgY29udiDripQg7IOIIHJ1biDsnLzroZwg7Iuc7J6RLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG5cbiAgICBpZiAoYXJncy50b29sUmVzdWx0cyAmJiBhcmdzLnRvb2xSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGNvbXBsZXRlVG9vbFJlc3VsdHMocmVxdWVzdExvZ0lkLCBhcmdzLnRvb2xSZXN1bHRzKTtcbiAgICB9XG5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZ2V0TmV4dFN0ZXBJbmRleChyZXF1ZXN0TG9nSWQpO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0sXG4gICAgICBtb2RlbF9uYW1lOiBhcmdzLm1vZGVsLFxuICAgICAgZWZmb3J0OiBhcmdzLmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZSxcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuXG4gIGNvbnN0IGltYWdlUGFydHMgPSBnZXRJbWFnZVBhcnRzKHJlc3VsdCk7XG4gIGNvbnN0IGltYWdlQ29zdE1pY3JvVXNkID0gZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QoXG4gICAgcmVzdWx0LFxuICAgIGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW1hZ2UgPSBpbWFnZVBhcnRzW2ldITtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IFwidG9vbF9jYWxsXCIsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGksXG4gICAgICB0b29sX2NhbGxfaWQ6IGBpbWFnZV9nZW5lcmF0aW9uOiR7c3RlcEluZGV4fToke2l9YCxcbiAgICAgIHRvb2xfbmFtZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgICB0b29sX2FyZ3M6IGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3MpLFxuICAgICAgdG9vbF9yZXN1bHQ6IGZvcm1hdEltYWdlUGFydEZvckxvZyhpbWFnZSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzdWx0LmZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sLWNhbGxzXCIpIHtcbiAgICAvLyB0b29sLWNhbGwgc3RlcCDsponsi5wg6riw66GdIChyZXN1bHTripQg64KY7KSR7JeQIGNvbXBsZXRlVG9vbENhbGzroZwg7LGE7JuAKVxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KSxcbiAgICB0b2tlbl9uYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiBhZ2cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdnLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICBkdXJhdGlvbl9tczogYWdnLmR1cmF0aW9uX21zLFxuICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgIGltYWdlQ29zdE1pY3JvVXNkICE9PSBudWxsID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMpIDogbnVsbCxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoUnVuV2l0aEVycm9yIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgYXJncz86IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbiAgICAgIGVycm9yX21lc3NhZ2U6IFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYGZpbmlzaFJ1bkFib3J0ZWQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlVG9vbFJlc3VsdHMoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICB0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHRyIG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jb21wbGV0ZVRvb2xDYWxsKHJlcXVlc3RMb2dJZCwgdHIudG9vbENhbGxJZCwge1xuICAgICAgICB0b29sX3Jlc3VsdDogdHIuaXNFcnJvciA/IHVuZGVmaW5lZCA6IHRyLm91dHB1dCxcbiAgICAgICAgZXJyb3I6IHRyLmlzRXJyb3IgPyB0ci5vdXRwdXQgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGNvbXBsZXRlVG9vbENhbGwgZmFpbGVkIGZvciAke3RyLnRvb2xDYWxsSWR9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YWxlSWRzID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmRTdGFsZVJ1bm5pbmdJZHMoU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzdGFsZUlkcykge1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpZCwge1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhbGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYGNsZWFuZWQgdXAgJHtzdGFsZUlkcy5sZW5ndGh9IHN0YWxlIHJ1bm5pbmcgcmVxdWVzdCBsb2dzYCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBzdGFsZSBjbGVhbnVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFvQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0seUJBQXlCLE9BQVU7Ozs7QUFLekMsU0FBUyx3QkFBd0IsWUFBeUM7QUFDeEUsS0FBSSxDQUFDLFdBQVksUUFBTztBQUN4QixLQUFJO0VBRUYsTUFBTSxXQURRLEtBQUssTUFBTSxXQUFXLENBQ2IsUUFBUSxTQUFTO0FBQ3RDLE9BQUksQ0FBQyxRQUFRLE9BQU8sU0FBUyxTQUFVLFFBQU87R0FDOUMsTUFBTSxTQUFTO0FBQ2YsVUFBTyxPQUFPLFNBQVMsY0FBYyxPQUFPLFNBQVMsVUFBVSxPQUFPLFNBQVM7SUFDL0U7QUFDRixTQUFPLFNBQVMsU0FBUyxJQUFJLFdBQVc7U0FDbEM7QUFDTjs7Ozs7Ozs7O0FBY0osZUFBc0IsWUFBWSxNQUcvQjtBQUNELE9BQU0sa0JBQWtCO0NBRXhCLElBQUk7Q0FDSixJQUFJLFlBQVk7QUFHaEIsS0FBSSxLQUFLLFlBQVksaUJBQWlCLFFBQVc7QUFDL0MsaUJBQWUsS0FBSyxXQUFXO0FBRS9CLE1BQUksS0FBSyxlQUFlLEtBQUssWUFBWSxTQUFTLEVBQ2hELE9BQU0sb0JBQW9CLGNBQWMsS0FBSyxZQUFZO0FBRzNELGNBQVksTUFBTSxnQkFBZ0IsaUJBQWlCLGFBQWE7T0FFaEUsZ0JBQWUsTUFBTSxnQkFBZ0IsVUFBVTtFQUM3QyxhQUFhLEtBQUs7RUFDbEIsZUFBZSxLQUFLO0VBQ3BCLFlBQVksS0FBSztFQUNqQixRQUFRLEtBQUs7RUFDYixjQUFjLEtBQUs7RUFDbkIscUJBQXFCLEtBQUs7RUFDM0IsQ0FBQztBQUdKLFFBQU87RUFBRTtFQUFjO0VBQVc7O0FBR3BDLGVBQXNCLFdBQ3BCLGNBQ0EsV0FDQSxNQUNBLFFBQzZCO0FBRTdCLE9BQU0sZ0JBQWdCLFdBQVcsY0FBYztFQUM3QyxZQUFZO0VBQ1osTUFBTTtFQUNOLGNBQWMsT0FBTyxNQUFNO0VBQzNCLGVBQWUsT0FBTyxNQUFNO0VBQzVCLG1CQUFtQixPQUFPLE1BQU07RUFDaEMsdUJBQXVCLE9BQU8sTUFBTTtFQUNwQyxhQUFhLE9BQU87RUFDcEIsU0FBUyxPQUFPO0VBQ2hCLGVBQWUsT0FBTztFQUN2QixDQUFDO0NBRUYsTUFBTSxhQUFhLGNBQWMsT0FBTztDQUN4QyxNQUFNLG9CQUFvQixvQ0FDeEIsUUFDQSxLQUFLLHVCQUNOO0FBQ0QsTUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLFdBQVcsUUFBUSxLQUFLO0VBQzFDLE1BQU0sUUFBUSxXQUFXO0FBQ3pCLFFBQU0sZ0JBQWdCLFdBQVcsY0FBYztHQUM3QyxZQUFZO0dBQ1osTUFBTTtHQUNOLGlCQUFpQjtHQUNqQixjQUFjLG9CQUFvQixVQUFVLEdBQUc7R0FDL0MsV0FBVztHQUNYLFdBQVcsd0JBQXdCLEtBQUs7R0FDeEMsYUFBYSxzQkFBc0IsTUFBTTtHQUMxQyxDQUFDOztBQUdKLEtBQUksT0FBTyxpQkFBaUIsY0FBYztFQUV4QyxNQUFNLFlBQVksT0FBTyxRQUFRLFFBQVEsTUFBTSxFQUFFLFNBQVMsWUFBWTtBQUN0RSxPQUFLLElBQUksSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7R0FDekMsTUFBTSxLQUFLLFVBQVU7QUFDckIsT0FBSSxHQUFHLFNBQVMsWUFBYTtBQUM3QixTQUFNLGdCQUFnQixXQUFXLGNBQWM7SUFDN0MsWUFBWTtJQUNaLE1BQU07SUFDTixpQkFBaUIsV0FBVyxTQUFTO0lBQ3JDLGNBQWMsR0FBRztJQUNqQixXQUFXLEdBQUc7SUFDZCxXQUFXLEdBQUc7SUFDZixDQUFDOztBQUdKLFNBQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFOztDQUl6QyxNQUFNLE1BQU0sTUFBTSxnQkFBZ0IsbUJBQW1CLGFBQWE7QUFDbEUsT0FBTSxnQkFBZ0IsVUFBVSxjQUFjO0VBQzVDLFFBQVE7RUFDUixVQUFVLHFCQUFxQixPQUFPO0VBQ3RDLFlBQVksT0FBTztFQUNuQixjQUFjLElBQUk7RUFDbEIsZUFBZSxJQUFJO0VBQ25CLG1CQUFtQixJQUFJO0VBQ3ZCLHVCQUF1QixJQUFJO0VBQzNCLGFBQWEsSUFBSTtFQUNqQixnQkFBZ0I7RUFDaEIsbUJBQ0Usc0JBQXNCLE9BQU8sMEJBQTBCLEtBQUssdUJBQXVCLEdBQUc7RUFDeEYsU0FBUyx3QkFBd0IsS0FBSyxRQUFRO0VBQy9DLENBQUM7QUFFRixRQUFPLEVBQUU7O0FBR1gsZUFBc0IsbUJBQ3BCLGNBQ0EsY0FDQSxNQUNlO0FBQ2YsS0FBSTtBQUNGLFFBQU0sZ0JBQWdCLFVBQVUsY0FBYztHQUM1QyxRQUFRO0dBQ1IsZUFBZTtHQUNmLFNBQVMsT0FBTyx3QkFBd0IsS0FBSyxRQUFRLEdBQUc7R0FDekQsQ0FBQztVQUNLLEdBQUc7QUFDVixTQUFPLE1BQU0sOEJBQStCLEVBQVksVUFBVTs7O0FBSXRFLGVBQXNCLGlCQUFpQixjQUFzQixNQUFrQztBQUM3RixLQUFJO0FBQ0YsUUFBTSxnQkFBZ0IsVUFBVSxjQUFjO0dBQzVDLFFBQVE7R0FDUixlQUFlO0dBQ2YsU0FBUyxPQUFPLHdCQUF3QixLQUFLLFFBQVEsR0FBRztHQUN6RCxDQUFDO1VBQ0ssR0FBRztBQUNWLFNBQU8sTUFBTSw0QkFBNkIsRUFBWSxVQUFVOzs7QUFJcEUsZUFBZSxvQkFDYixjQUNBLGFBQ2U7QUFDZixNQUFLLE1BQU0sTUFBTSxZQUNmLEtBQUk7QUFDRixRQUFNLGdCQUFnQixpQkFBaUIsY0FBYyxHQUFHLFlBQVk7R0FDbEUsYUFBYSxHQUFHLFVBQVUsU0FBWSxHQUFHO0dBQ3pDLE9BQU8sR0FBRyxVQUFVLEdBQUcsU0FBUztHQUNqQyxDQUFDO1VBQ0ssR0FBRztBQUNWLFNBQU8sTUFBTSwrQkFBK0IsR0FBRyxXQUFXLElBQUssRUFBWSxVQUFVOzs7QUFLM0YsZUFBZSxtQkFBa0M7QUFDL0MsS0FBSTtFQUNGLE1BQU0sV0FBVyxNQUFNLGdCQUFnQixvQkFBb0IsdUJBQXVCO0FBQ2xGLE9BQUssTUFBTSxNQUFNLFNBQ2YsT0FBTSxnQkFBZ0IsVUFBVSxJQUFJO0dBQ2xDLFFBQVE7R0FDUixlQUFlO0dBQ2hCLENBQUM7QUFFSixNQUFJLFNBQVMsU0FBUyxFQUNwQixRQUFPLEtBQUssY0FBYyxTQUFTLE9BQU8sNkJBQTZCO1VBRWxFLEdBQUc7QUFDVixTQUFPLE1BQU0seUJBQTBCLEVBQVksVUFBVSJ9
@@ -50,9 +50,12 @@ var QgridDispatcherClass = class {
50
50
  coldInput: decision.coldInput,
51
51
  coldHistory: decision.coldHistory,
52
52
  reuse: decision.reuse,
53
- reuseInput: decision.reuseInput
53
+ reuseInput: decision.reuseInput,
54
+ imageGeneration: input.imageGeneration,
55
+ imageGenerationOptions: input.imageGenerationOptions
54
56
  });
55
- return applyToolCallEmulation(toEmulationResult(result), input.tools, issueConvContext(result.threadCoord, decision));
57
+ const coord = input.imageGeneration ? void 0 : issueConvContext(result.threadCoord, decision);
58
+ return applyToolCallEmulation(toEmulationResult(result), input.tools, coord, result.images);
56
59
  } else if (route.provider === "anthropic") {
57
60
  if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
58
61
  const decision = decideConvRouting(input);
@@ -62,7 +65,9 @@ var QgridDispatcherClass = class {
62
65
  outputSchema,
63
66
  effort: input.effort,
64
67
  coldInput: decision.coldInput,
65
- coldHistory: decision.coldHistory
68
+ coldHistory: decision.coldHistory,
69
+ imageGeneration: input.imageGeneration,
70
+ imageGenerationOptions: input.imageGenerationOptions
66
71
  });
67
72
  return applyToolCallEmulation(toEmulationResult(result), input.tools, issueConvContext(result.threadCoord, decision));
68
73
  }
@@ -86,7 +91,9 @@ var QgridDispatcherClass = class {
86
91
  coldHistory: decision.coldHistory,
87
92
  reuse: decision.reuse,
88
93
  reuseInput: decision.reuseInput,
89
- abortSignal
94
+ abortSignal,
95
+ imageGeneration: input.imageGeneration,
96
+ imageGenerationOptions: input.imageGenerationOptions
90
97
  }, {
91
98
  onDelta: cb.onDelta,
92
99
  onThreadId: cb.onThreadId,
@@ -107,7 +114,9 @@ var QgridDispatcherClass = class {
107
114
  effort: input.effort,
108
115
  coldInput: decision.coldInput,
109
116
  coldHistory: decision.coldHistory,
110
- abortSignal
117
+ abortSignal,
118
+ imageGeneration: input.imageGeneration,
119
+ imageGenerationOptions: input.imageGenerationOptions
111
120
  }, {
112
121
  onDelta: cb.onDelta,
113
122
  onThreadId: cb.onThreadId,
@@ -166,4 +175,4 @@ const QgridDispatcher = new QgridDispatcherClass();
166
175
  //#endregion
167
176
  export { QgridDispatcher, QgridDispatcherClass, buildStrictOutputSchema };
168
177
 
169
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgYnVpbGRUb29sQ2FsbFNjaGVtYSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHRpbWVvdXRNcz86IG51bWJlcik6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICB2b2lkIHRpbWVvdXRNcztcblxuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gICAgICAgIHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksXG4gICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgLy8gQW50aHJvcGljRGlzcGF0Y2hlciDrgrTrtoDsl5DshJwg7JWM7JWE7IScIHByb3ZpZGVyIHByZWZpeCDrpbwgY2Fub25pY2FsIG1vZGVsIOuhnCDsoJXqt5ztmZTtlahcbiAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSxcbiAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgIGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICAgICAgICB0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSxcbiAgICAgICAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuLy8gcWdyaWQgcHJvdmlkZXIgZGlzcGF0Y2hlciDsl5DshJwg7LKY66as7ZWY7KeAIOyViuuKlCDrqqjrjbjsnYAg7Zal7ZuEIOyngeygkSBMTE0gQVBJIO2YuOy2nCDsp4DsoJDsnLzroZwg67O064K464ukLlxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuLy8g66qo65OgIHByb3ZpZGVyKE9wZW5BSS9BbnRocm9waWMp6rCAIOuPmeydvO2VmOqyjCBzdHJpY3Qgb3V0cHV0IHNjaGVtYSDrpbwg7JO064ukLlxuLy9cbi8vIFNPTi00OTUg6rWQ7ZuIOiDtlZzrlYwgQW50aHJvcGljIHJvdXRlIOunjCByZXF1aXJlZCDrpbwg7KCc6rGwKG9wdGlvbmFsaXplKe2VtCBwYXJ0aWFsL3JlamVjdGVkIGF0dGVtcHQg6rCAXG4vLyDshJ7sl6zrj4Qg7Ya16rO87ZWY6rKMIO2WiOycvOuCmCwg7Iuk7LihIOqysOqzvCDqt7jqsowg7Jik7Z6I66CkIFwi66qo64247J20IOu5hOuKlCDtlYTrk5zrpbwg7YKk7Ke4IOyDneuetVwi7ZWY64+E66GdIOycoOuPhO2WiOuLpFxuLy8gKHJlcXVpcmVkIOyCtOumsCBzY2hlbWEg64qUIOuIhOudvSAwLCBsb29zZSDripQg64iE6529IOuLpOuwnCkuIHN0cmljdCDroZwg65GQ66m0IOuqqOuNuOydtCDruaDsp5Dsl4bsnbQg7LGE7Jqw6rOgLFxuLy8g65Oc66y86rKMIOyWtOqyqOuPhCByZXRyeT0xICsg67mE7KCV7IOBIOyiheujjOuKlCDsoJXsp4HtlZwg7JeQ65+sKHN0cmVhbS1qc29uLWFkYXB0ZXIp66GcIOuwm+yVhOykgOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSYXdPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzKVxuICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgPyAoSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKSBhcyBKc29uVmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbn1cblxuLy8gR2VuZXJhdGVSZXN1bHQocHJvdmlkZXIgZGlzcGF0Y2hlciDsnZHri7Up66W8IGFwcGx5VG9vbENhbGxFbXVsYXRpb24g7J6F66ClIHNoYXBlIOuhnCDrp6TtlZHtlZzri6QuXG4vLyBPcGVuQUkvQW50aHJvcGljLCBxdWVyeS9xdWVyeVN0cmVhbSA0IOqyveuhnOqwgCDrj5nsnbztlZjqsowg7JO064ukLlxuLy8gQW50aHJvcGljIGFkYXB0ZXIg64qUIGNhY2hlIGNyZWF0aW9uIOydhCBpbnB1dFRva2VucyDsl5Ag7Y+s7ZWo7ZW0IO2RnOykgO2ZlO2VmOqzoCwg67OE64+EIO2VhOuTnOyXkOuPhCDrs7TsobTtlZzri6QuXG4vLyBwZXItcmVxdWVzdCBjb3N0IOuKlCBwcm92aWRlciDqsIAg7KSAIOqwkuydhCDsmrDshKAg7IKs7Jqp7ZWY6rOgLCDsl4bsnLzrqbQg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDpcbiAgICAgIHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwXG4gICAgICAgID8gcmVzdWx0LmNvc3RVc2RcbiAgICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQXlCQSxJQUFhLHVCQUFiLE1BQWtDO0NBQ2hDLHlCQUFTLElBQUksS0FBMkI7Q0FHeEMsZ0NBQWdCLElBQUksS0FBcUI7Q0FHekMsYUFBcUM7Q0FDckMsbUJBQTRDO0NBQzVDLHNCQUFrRDtDQUVsRCxRQUFRLE1BQXNCO0FBQzVCLFNBQU8sS0FBSyxjQUFjLElBQUksS0FBSyxJQUFJOztDQUl6QyxZQUFZLElBQVksS0FBeUI7QUFDL0MsT0FBSyxPQUFPLElBQUksSUFBSSxJQUFJOztDQUcxQixZQUFZLElBQWtCO0FBQzVCLE9BQUssT0FBTyxPQUFPLEdBQUc7O0NBR3hCLGFBQWEsTUFBNEI7QUFDdkMsT0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Q0FHbkQsV0FBeUI7QUFDdkIsU0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLFFBQVEsQ0FBQyxDQUFDLEtBQUssT0FBTztHQUMzQyxPQUFPLFVBQVUsZUFBZSxFQUFFLFlBQVksQ0FBQztHQUMvQyxNQUFNLEVBQUU7R0FDUixVQUFVLEVBQUU7R0FDWixVQUFVLEtBQUssUUFBUSxFQUFFLEtBQUs7R0FDL0IsRUFBRTs7Q0FHTCxNQUFNLE1BQU0sT0FBbUIsV0FBMEM7QUFHdkUsTUFBSSxNQUFNLE9BQU8sVUFBVSxNQUFNLFdBQy9CLE9BQU0sSUFBSSxhQUFhLCtDQUErQztFQUd4RSxNQUFNLFFBQVEsbUJBQW1CLE1BQU0sTUFBTTtFQUM3QyxNQUFNLGVBQWUsd0JBQXdCLE1BQU07QUFHbkQsTUFBSSxNQUFNLGFBQWEsVUFBVTtBQUMvQixPQUFJLENBQUMsS0FBSyxpQkFBa0IsT0FBTSxJQUFJLFdBQVcsb0NBQW9DO0dBRXJGLE1BQU0sV0FBVyxrQkFBa0IsTUFBTTtHQUN6QyxNQUFNLFNBQVMsTUFBTSxLQUFLLGlCQUFpQixTQUFTO0lBQ2xELE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLFFBQVEsTUFBTTtJQUNkLFdBQVcsTUFBTTtJQUNqQixrQkFBa0IsTUFBTTtJQUN4QixhQUFhLE1BQU07SUFDbkIsV0FBVyxTQUFTO0lBQ3BCLGFBQWEsU0FBUztJQUN0QixPQUFPLFNBQVM7SUFDaEIsWUFBWSxTQUFTO0lBQ3RCLENBQUM7QUFFRixVQUFPLHVCQUNMLGtCQUFrQixPQUFPLEVBQ3pCLE1BQU0sT0FDTixpQkFBaUIsT0FBTyxhQUFhLFNBQVMsQ0FDL0M7YUFDUSxNQUFNLGFBQWEsYUFBYTtBQUN6QyxPQUFJLENBQUMsS0FBSyxvQkFBcUIsT0FBTSxJQUFJLFdBQVcsdUNBQXVDO0dBRTNGLE1BQU0sV0FBVyxrQkFBa0IsTUFBTTtHQUN6QyxNQUFNLFNBQVMsTUFBTSxLQUFLLG9CQUFvQixTQUFTO0lBRXJELE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLFFBQVEsTUFBTTtJQUNkLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdkIsQ0FBQztBQUVGLFVBQU8sdUJBQ0wsa0JBQWtCLE9BQU8sRUFDekIsTUFBTSxPQUNOLGlCQUFpQixPQUFPLGFBQWEsU0FBUyxDQUMvQzs7QUFHSCxRQUFNLG1DQUFtQyxNQUFNOztDQUdqRCxNQUFNLFlBQ0osT0FDQSxJQUNBLGFBQ2U7RUFDZixNQUFNLFFBQVEsbUJBQW1CLE1BQU0sTUFBTTtFQUM3QyxNQUFNLGVBQWUsd0JBQXdCLE1BQU07QUFFbkQsTUFBSSxNQUFNLGFBQWEsVUFBVTtBQUMvQixPQUFJLENBQUMsS0FBSyxpQkFBa0IsT0FBTSxJQUFJLFdBQVcsb0NBQW9DO0dBRXJGLE1BQU0sV0FBVyxrQkFBa0IsTUFBTTtBQUN6QyxTQUFNLEtBQUssaUJBQWlCLGVBQzFCO0lBQ0UsT0FBTyxNQUFNO0lBQ2IsY0FBYyxNQUFNO0lBQ3BCO0lBQ0EsUUFBUSxNQUFNO0lBQ2QsV0FBVyxNQUFNO0lBQ2pCLGtCQUFrQixNQUFNO0lBQ3hCLGFBQWEsTUFBTTtJQUNuQixXQUFXLFNBQVM7SUFDcEIsYUFBYSxTQUFTO0lBQ3RCLE9BQU8sU0FBUztJQUNoQixZQUFZLFNBQVM7SUFDckI7SUFDRCxFQUNEO0lBQ0UsU0FBUyxHQUFHO0lBQ1osWUFBWSxHQUFHO0lBQ2YsVUFBVSxHQUFHO0lBQ2IsYUFBYSxlQUFlO0FBQzFCLFFBQUcsV0FDRCx1QkFDRSxrQkFBa0IsV0FBVyxFQUM3QixNQUFNLE9BQ04saUJBQWlCLFdBQVcsYUFBYSxTQUFTLENBQ25ELENBQ0Y7O0lBRUgsU0FBUyxHQUFHO0lBQ2IsQ0FDRjtBQUNEO2FBQ1MsTUFBTSxhQUFhLGFBQWE7QUFDekMsT0FBSSxDQUFDLEtBQUssb0JBQXFCLE9BQU0sSUFBSSxXQUFXLHVDQUF1QztHQUUzRixNQUFNLFdBQVcsa0JBQWtCLE1BQU07QUFDekMsU0FBTSxLQUFLLG9CQUFvQixlQUM3QjtJQUNFLE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLFFBQVEsTUFBTTtJQUNkLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdEI7SUFDRCxFQUNEO0lBQ0UsU0FBUyxHQUFHO0lBQ1osWUFBWSxHQUFHO0lBQ2YsYUFBYSxlQUFlO0tBQzFCLE1BQU0sY0FBYyxpQkFBaUIsV0FBVyxhQUFhLFNBQVM7QUFDdEUsUUFBRyxXQUNELHVCQUF1QixrQkFBa0IsV0FBVyxFQUFFLE1BQU0sT0FBTyxZQUFZLENBQ2hGOztJQUVILFNBQVMsR0FBRztJQUNiLENBQ0Y7QUFDRDs7QUFHRixRQUFNLG1DQUFtQyxNQUFNOzs7QUFJbkQsU0FBUyxtQkFBbUIsT0FBaUU7QUFDM0YsS0FBSSxDQUFDLE9BQU8sU0FBUyxJQUFJLENBQ3ZCLFFBQU8sRUFBRSxPQUFPLFNBQVMsSUFBSTtDQUcvQixNQUFNLENBQUMsVUFBVSxlQUFlLE1BQU0sTUFBTSxLQUFLLEVBQUU7QUFDbkQsS0FBSSxDQUFDLFlBQVksQ0FBQyxZQUFhLE9BQU0sSUFBSSxhQUFhLGdCQUFnQjtBQUN0RSxRQUFPO0VBQUU7RUFBVSxPQUFPO0VBQWE7O0FBSXpDLFNBQVMsbUNBQW1DLE9BQWlDO0FBQzNFLFFBQU8sSUFBSSxhQUNULHNEQUFzRCxNQUFNLFNBQVMsY0FDdEU7O0FBU0gsU0FBZ0Isd0JBQ2QsT0FDdUI7Q0FDdkIsTUFBTSxlQUFlLHFCQUFxQixNQUFNO0FBRWhELFFBQU8sZUFDRixVQUFVLGFBQWdELEdBQzNEOztBQUdOLFNBQVMscUJBQ1AsT0FDdUI7QUFDdkIsUUFBTyxNQUFNLE9BQU8sU0FDaEIsb0JBQW9CLE1BQU0sTUFBTSxHQUNoQyxNQUFNLGFBQ0gsS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUM3Qjs7QUFPUixTQUFTLGtCQUNQLFFBQzhEO0FBQzlELFFBQU87RUFDTCxNQUFNLE9BQU87RUFDYixXQUFXLE9BQU87RUFDbEIsT0FBTyxPQUFPO0VBQ2QsT0FBTztHQUNMLGNBQWMsT0FBTyxNQUFNO0dBQzNCLGVBQWUsT0FBTyxNQUFNO0dBQzVCLDZCQUE2QixPQUFPLE1BQU0sNEJBQTRCO0dBQ3RFLHlCQUF5QixPQUFPLE1BQU07R0FDdkM7RUFDRCxZQUFZLE9BQU87RUFDbkIsUUFBUSxPQUFPLFVBQVU7RUFDekIsU0FDRSxPQUFPLFlBQVksVUFBYSxPQUFPLFVBQVUsSUFDN0MsT0FBTyxVQUNQLGlCQUFpQixPQUFPLE9BQU87R0FDN0IsYUFBYSxPQUFPLE1BQU07R0FDMUIsY0FBYyxPQUFPLE1BQU07R0FDM0IsbUJBQW1CLE9BQU8sTUFBTTtHQUNoQywwQkFBMEIsT0FBTyxNQUFNLDRCQUE0QjtHQUNwRSxDQUFDO0VBQ1Q7O0FBR0gsTUFBYSxrQkFBa0IsSUFBSSxzQkFBc0IifQ==
178
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgYnVpbGRUb29sQ2FsbFNjaGVtYSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHRpbWVvdXRNcz86IG51bWJlcik6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICB2b2lkIHRpbWVvdXRNcztcblxuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgY29vcmQsIHJlc3VsdC5pbWFnZXMpO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSxcbiAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgIGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIC8vIOydtOuvuOyngCDtlIzrnpjqt7jrpbwg7KCE64us7ZW07JW8IGdlbmVyYXRlU3RyZWFtIOydmCBub24tc3RyZWFtIOyghOyaqSDqsbDrtoAoUjIp6rCAIOuwnOuPme2VnOuLpC5cbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICAgICAgICB0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSxcbiAgICAgICAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgIGNiLm9uQ29tcGxldGUoXG4gICAgICAgICAgICAgIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQodHVyblJlc3VsdCksIGlucHV0LnRvb2xzLCBpc3N1ZWRDb29yZCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm92aWRlclJvdXRlKG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IHByb3ZpZGVyPzogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0ge1xuICBpZiAoIW1vZGVsPy5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICByZXR1cm4geyBtb2RlbDogbW9kZWwgPz8gXCJcIiB9O1xuICB9XG5cbiAgY29uc3QgW3Byb3ZpZGVyLCByb3V0ZWRNb2RlbF0gPSBtb2RlbC5zcGxpdChcIi9cIiwgMik7XG4gIGlmICghcHJvdmlkZXIgfHwgIXJvdXRlZE1vZGVsKSB0aHJvdyBuZXcgUHJvY2Vzc0Vycm9yKFwidW5rbm93biBtb2RlbFwiKTtcbiAgcmV0dXJuIHsgcHJvdmlkZXIsIG1vZGVsOiByb3V0ZWRNb2RlbCB9O1xufVxuXG4vLyBxZ3JpZCBwcm92aWRlciBkaXNwYXRjaGVyIOyXkOyEnCDsspjrpqztlZjsp4Ag7JWK64qUIOuqqOuNuOydgCDtlqXtm4Qg7KeB7KCRIExMTSBBUEkg7Zi47LacIOyngOygkOycvOuhnCDrs7Trgrjri6QuXG5mdW5jdGlvbiBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0OiBRdWVyeUlucHV0KTogUHJvY2Vzc0Vycm9yIHtcbiAgcmV0dXJuIG5ldyBQcm9jZXNzRXJyb3IoXG4gICAgYERpcmVjdCBMTE0gQVBJIGZhbGxiYWNrIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gXCI8ZGVmYXVsdD5cIn1gLFxuICApO1xufVxuXG4vLyDrqqjrk6AgcHJvdmlkZXIoT3BlbkFJL0FudGhyb3BpYynqsIAg64+Z7J287ZWY6rKMIHN0cmljdCBvdXRwdXQgc2NoZW1hIOulvCDsk7Tri6QuXG4vL1xuLy8gU09OLTQ5NSDqtZDtm4g6IO2VnOuVjCBBbnRocm9waWMgcm91dGUg66eMIHJlcXVpcmVkIOulvCDsoJzqsbAob3B0aW9uYWxpemUp7ZW0IHBhcnRpYWwvcmVqZWN0ZWQgYXR0ZW1wdCDqsIBcbi8vIOyEnuyXrOuPhCDthrXqs7ztlZjqsowg7ZaI7Jy864KYLCDsi6TsuKEg6rKw6rO8IOq3uOqyjCDsmKTtnojroKQgXCLrqqjrjbjsnbQg67mE64qUIO2VhOuTnOulvCDtgqTsp7gg7IOd6561XCLtlZjrj4TroZ0g7Jyg64+E7ZaI64ukXG4vLyAocmVxdWlyZWQg7IK066awIHNjaGVtYSDripQg64iE6529IDAsIGxvb3NlIOuKlCDriITrnb0g64uk67CcKS4gc3RyaWN0IOuhnCDrkZDrqbQg66qo64247J20IOu5oOynkOyXhuydtCDssYTsmrDqs6AsXG4vLyDrk5zrrLzqsowg7Ja06rKo64+EIHJldHJ5PTEgKyDruYTsoJXsg4Eg7KKF66OM64qUIOygleynge2VnCDsl5Drn6woc3RyZWFtLWpzb24tYWRhcHRlcinroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICA/IGJ1aWxkVG9vbENhbGxTY2hlbWEoaW5wdXQudG9vbHMpXG4gICAgOiBpbnB1dC5qc29uU2NoZW1hXG4gICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xufVxuXG4vLyBHZW5lcmF0ZVJlc3VsdChwcm92aWRlciBkaXNwYXRjaGVyIOydkeuLtSnrpbwgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiDsnoXroKUgc2hhcGUg66GcIOunpO2Vke2VnOuLpC5cbi8vIE9wZW5BSS9BbnRocm9waWMsIHF1ZXJ5L3F1ZXJ5U3RyZWFtIDQg6rK966Gc6rCAIOuPmeydvO2VmOqyjCDsk7Tri6QuXG4vLyBBbnRocm9waWMgYWRhcHRlciDripQgY2FjaGUgY3JlYXRpb24g7J2EIGlucHV0VG9rZW5zIOyXkCDtj6ztlajtlbQg7ZGc7KSA7ZmU7ZWY6rOgLCDrs4Trj4Qg7ZWE65Oc7JeQ64+EIOuztOyhtO2VnOuLpC5cbi8vIHBlci1yZXF1ZXN0IGNvc3Qg64qUIHByb3ZpZGVyIOqwgCDspIAg6rCS7J2EIOyasOyEoCDsgqzsmqntlZjqs6AsIOyXhuycvOuptCDqs7XthrUgY29zdCDtlajsiJjrpbwg7JO064ukLlxuZnVuY3Rpb24gdG9FbXVsYXRpb25SZXN1bHQoXG4gIHJlc3VsdDogR2VuZXJhdGVSZXN1bHQsXG4pOiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4ge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHVzYWdlOiB7XG4gICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgfSxcbiAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0TXM6IHJlc3VsdC50dGZ0TXMgPz8gMCxcbiAgICBjb3N0VXNkOlxuICAgICAgcmVzdWx0LmNvc3RVc2QgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQuY29zdFVzZCA+IDBcbiAgICAgICAgPyByZXN1bHQuY29zdFVzZFxuICAgICAgICA6IGNhbGN1bGF0ZUNvc3RVc2QocmVzdWx0Lm1vZGVsLCB7XG4gICAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIH0pLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBeUJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxLQUEyQjtDQUd4QyxnQ0FBZ0IsSUFBSSxLQUFxQjtDQUd6QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7QUFDNUIsU0FBTyxLQUFLLGNBQWMsSUFBSSxLQUFLLElBQUk7O0NBSXpDLFlBQVksSUFBWSxLQUF5QjtBQUMvQyxPQUFLLE9BQU8sSUFBSSxJQUFJLElBQUk7O0NBRzFCLFlBQVksSUFBa0I7QUFDNUIsT0FBSyxPQUFPLE9BQU8sR0FBRzs7Q0FHeEIsYUFBYSxNQUE0QjtBQUN2QyxPQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENB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