@cartanova/qgrid-cli 2.10.4 → 2.10.6

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 (81) hide show
  1. package/bundle/dist/application/monit/monit.frame.js +1 -1
  2. package/bundle/dist/application/qgrid/expired-token-reminder.js +1 -1
  3. package/bundle/dist/application/qgrid/oauth.js +1 -1
  4. package/bundle/dist/application/qgrid/qgrid-image-generation.js +6 -6
  5. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +24 -7
  6. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +8 -3
  7. package/bundle/dist/application/qgrid/qgrid.frame.js +25 -11
  8. package/bundle/dist/application/qgrid/qgrid.types.js +4 -8
  9. package/bundle/dist/application/qgrid/token-death.js +1 -1
  10. package/bundle/dist/application/qgrid/token-window-keepalive.js +1 -1
  11. package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
  12. package/bundle/dist/application/request-log/request-log.model.js +23 -17
  13. package/bundle/dist/i18n/sd.generated.js +3 -3
  14. package/bundle/dist/sonamu.config.js +2 -2
  15. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -1
  16. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  17. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +31 -9
  18. package/bundle/dist/utils/providers/openai/openai-direct-client.js +5 -4
  19. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +111 -57
  20. package/bundle/dist/utils/providers/openai/openai-image-generation.js +25 -17
  21. package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -1
  22. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +34 -5
  23. package/bundle/src/application/qgrid/qgrid-image-generation.ts +17 -13
  24. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +11 -0
  25. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +87 -9
  26. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +45 -5
  27. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +136 -2
  28. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +11 -1
  29. package/bundle/src/application/qgrid/qgrid.frame.test.ts +73 -0
  30. package/bundle/src/application/qgrid/qgrid.frame.ts +43 -6
  31. package/bundle/src/application/qgrid/qgrid.types.ts +14 -4
  32. package/bundle/src/application/request-log/request-log.entity.json +2 -2
  33. package/bundle/src/application/request-log/request-log.model.test.ts +17 -12
  34. package/bundle/src/application/request-log/request-log.model.ts +8 -2
  35. package/bundle/src/application/sonamu.generated.http +2 -2
  36. package/bundle/src/i18n/sd.generated.ts +2 -2
  37. package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +42 -2
  38. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +46 -2
  39. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +15 -0
  40. package/bundle/src/utils/providers/openai/openai-direct-client.ts +14 -4
  41. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +235 -32
  42. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +174 -72
  43. package/bundle/src/utils/providers/openai/openai-image-generation.test.ts +89 -0
  44. package/bundle/src/utils/providers/openai/openai-image-generation.ts +26 -15
  45. package/bundle/web-dist/client/assets/cost-DH2jZbrw.js +1 -0
  46. package/bundle/web-dist/client/assets/{index-reW8VvJF.js → index-D9ryIyL-.js} +4 -4
  47. package/bundle/web-dist/client/assets/logs-CLf2VNfk.js +1 -0
  48. package/bundle/web-dist/client/assets/{monit-DkABv7PG.js → monit-DojxOLj6.js} +1 -1
  49. package/bundle/web-dist/client/assets/{routes-BRmQ4M3-.js → routes-DXJhNvbI.js} +2 -2
  50. package/bundle/web-dist/client/assets/{services.generated-jnPHYMER.js → services.generated-DqFYgWsY.js} +1 -1
  51. package/bundle/web-dist/client/assets/{settings-BHvtycEZ.js → settings-bopyz9pa.js} +1 -1
  52. package/bundle/web-dist/client/assets/{show-qeTIzgDZ.js → show-DbLD3MzB.js} +1 -1
  53. package/bundle/web-dist/client/assets/{tokens-5Bep_G-w.js → tokens-2-AIi9sZ.js} +1 -1
  54. package/bundle/web-dist/client/assets/{use-oauth-login-flow-Cx-QO25M.js → use-oauth-login-flow-CnqTWs_H.js} +1 -1
  55. package/bundle/web-dist/client/assets/{use-update-token-mutation-DQCwCYfR.js → use-update-token-mutation-Cxb9K0fM.js} +1 -1
  56. package/bundle/web-dist/client/index.html +2 -2
  57. package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-eEHeTRT5.js} +5 -1
  58. package/bundle/web-dist/server/assets/{lazyRouteComponent-CUR-kWzI.js → lazyRouteComponent-Bi0fYGLs.js} +2 -2
  59. package/bundle/web-dist/server/assets/{logs-CagNGTBj.js → logs-CIVFxfoi.js} +11 -8
  60. package/bundle/web-dist/server/assets/{monit-DSxs4Jnl.js → monit-DBXezg7R.js} +4 -4
  61. package/bundle/web-dist/server/assets/{plus-Bvdj8Pwx.js → plus-BH-t4cm_.js} +1 -1
  62. package/bundle/web-dist/server/assets/{react-dom-CyuShs9K.js → react-dom-CZ2eynd8.js} +1 -1
  63. package/bundle/web-dist/server/assets/{refresh-cw-3QAiSWBd.js → refresh-cw-CosAdcz0.js} +1 -1
  64. package/bundle/web-dist/server/assets/{routes-i-sTqXMX.js → routes-COWYIvA-.js} +5 -6
  65. package/bundle/web-dist/server/assets/{services.generated-FPwsG9p3.js → services.generated-607iwhMI.js} +2 -2
  66. package/bundle/web-dist/server/assets/{settings-DeHNwoMv.js → settings-C_6dpK5p.js} +3 -3
  67. package/bundle/web-dist/server/assets/{show-C4jk1Hrp.js → show-DY396-LD.js} +8 -20
  68. package/bundle/web-dist/server/assets/{tokens-odgS2-9q.js → tokens-COvV7qUP.js} +4 -4
  69. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DTQKdYBO.js → use-oauth-login-flow-VYCYf3uv.js} +1 -1
  70. package/bundle/web-dist/server/assets/{use-update-token-mutation-xvXbPrCI.js → use-update-token-mutation-D8XYV5of.js} +1 -1
  71. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  72. package/package.json +3 -2
  73. package/skills/qgrid/SKILL.md +9 -8
  74. package/skills/qgrid/references/ai-sdk-provider-contract.md +25 -16
  75. package/skills/qgrid/references/decision-rationale.md +8 -8
  76. package/skills/qgrid/references/openai-codex-runtime.md +23 -11
  77. package/skills/qgrid/references/request-log-run-lifecycle.md +4 -2
  78. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -2
  79. package/skills/qgrid/references/verification-and-debugging.md +23 -9
  80. package/bundle/web-dist/client/assets/cost-CpjVoAqp.js +0 -1
  81. package/bundle/web-dist/client/assets/logs-DDIt97D1.js +0 -1
@@ -1,8 +1,8 @@
1
1
  import { monitLogBuffer } from "./log-buffer.js";
2
2
  import { resolveOpenAITransportKind } from "../../utils/providers/openai/openai-transport-config.js";
3
- import { QgridDispatcher } from "../qgrid/qgrid.dispatcher.js";
4
3
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
5
4
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
5
+ import { QgridDispatcher } from "../qgrid/qgrid.dispatcher.js";
6
6
  import { RequestLogModel } from "../request-log/request-log.model.js";
7
7
  import { BaseFrameClass, DB, api } from "sonamu";
8
8
  //#region src/application/monit/monit.frame.ts
@@ -1,6 +1,6 @@
1
+ import { TokenModel } from "../token/token.model.js";
1
2
  import { getSetting } from "../setting/setting.store.js";
2
3
  import { SLACK_COLOR, notifySlack } from "../../utils/slack-notify.js";
3
- import { TokenModel } from "../token/token.model.js";
4
4
  import { getSlackUserMap, mentionFor } from "./slack-user-map.js";
5
5
  import { getLogger } from "@logtape/logtape";
6
6
  //#region src/application/qgrid/expired-token-reminder.ts
@@ -1,5 +1,5 @@
1
- import { createHash, randomBytes } from "node:crypto";
2
1
  import { getLogger } from "@logtape/logtape";
2
+ import { createHash, randomBytes } from "node:crypto";
3
3
  //#region src/application/qgrid/oauth.ts
4
4
  /**
5
5
  * OAuth 유틸 — Claude Code 소스의 OAuth 플로우 그대로 재현
@@ -20,13 +20,14 @@ const IMAGE_OUTPUT_COST_MICRO_USD = {
20
20
  }
21
21
  };
22
22
  function resolveImageGenerationOptions(options) {
23
+ const size = options?.size;
23
24
  return {
24
25
  quality: options?.quality ?? "medium",
25
- size: options?.size ?? "1536x1024"
26
+ size: size === "1024x1024" || size === "1024x1536" || size === "1536x1024" ? size : DEFAULT_IMAGE_GENERATION_SIZE
26
27
  };
27
28
  }
28
29
  function imageGenerationCostMethod(options, result) {
29
- if (result?.content.some((item) => item.type === "image" && item.generation?.route === "codex-images")) return "estimated:gpt-image-2:reported-usage:public-prices:conservative";
30
+ if (result?.content.some((item) => item.type === "image" && item.generation?.usage !== void 0)) return "estimated:gpt-image-2:reported-usage:public-prices:conservative";
30
31
  const resolved = resolveImageGenerationOptions(options);
31
32
  return `assumed:${CODEX_IMAGE_GENERATION_MODEL}:${resolved.quality}:${resolved.size}:png`;
32
33
  }
@@ -34,9 +35,8 @@ function estimateImageGenerationCostMicroUsd(result, options) {
34
35
  const images = result.content.filter((item) => item.type === "image");
35
36
  const imageCount = images.length;
36
37
  if (imageCount === 0) return null;
37
- if (images.some((image) => image.generation?.route === "codex-images")) {
38
- const usage = images.find((image) => image.generation?.usage)?.generation?.usage;
39
- if (!usage) return null;
38
+ const usage = images.find((image) => image.generation?.usage)?.generation?.usage;
39
+ if (usage) {
40
40
  const details = usage.input_tokens_details;
41
41
  const textTokens = details && details.text_tokens + details.image_tokens <= usage.input_tokens ? details.text_tokens : 0;
42
42
  return Math.round(textTokens * 5 + (usage.input_tokens - textTokens) * 8 + usage.output_tokens * 30);
@@ -47,4 +47,4 @@ function estimateImageGenerationCostMicroUsd(result, options) {
47
47
  //#endregion
48
48
  export { CODEX_IMAGE_GENERATION_MODEL, DEFAULT_IMAGE_GENERATION_QUALITY, DEFAULT_IMAGE_GENERATION_SIZE, estimateImageGenerationCostMicroUsd, imageGenerationCostMethod, resolveImageGenerationOptions };
49
49
 
50
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25TaXplLFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCA9IFwiZ3B0LWltYWdlLTJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fUVVBTElUWTogSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSA9IFwibWVkaXVtXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkU6IEltYWdlR2VuZXJhdGlvblNpemUgPSBcIjE1MzZ4MTAyNFwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPSB7XG4gIHF1YWxpdHk6IEltYWdlR2VuZXJhdGlvblF1YWxpdHk7XG4gIHNpemU6IEltYWdlR2VuZXJhdGlvblNpemU7XG59O1xuXG4vLyBPcGVuQUkgZ3B0LWltYWdlLTIgaW1hZ2Ugb3V0cHV0IGNvc3QgZXN0aW1hdGVzIGJ5IHF1YWxpdHkvc2l6ZTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL2d1aWRlcy9pbWFnZS1nZW5lcmF0aW9uI2NhbGN1bGF0aW5nLWNvc3RzXG5jb25zdCBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0Q6IFJlY29yZDxcbiAgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgUmVjb3JkPEltYWdlR2VuZXJhdGlvblNpemUsIG51bWJlcj5cbj4gPSB7XG4gIGxvdzoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDZfMDAwLFxuICAgIFwiMTAyNHgxNTM2XCI6IDVfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDVfMDAwLFxuICB9LFxuICBtZWRpdW06IHtcbiAgICBcIjEwMjR4MTAyNFwiOiA1M18wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogNDFfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDQxXzAwMCxcbiAgfSxcbiAgaGlnaDoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDIxMV8wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogMTY1XzAwMCxcbiAgICBcIjE1MzZ4MTAyNFwiOiAxNjVfMDAwLFxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogUmVzb2x2ZWRJbWFnZUdlbmVyYXRpb25PcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBxdWFsaXR5OiBvcHRpb25zPy5xdWFsaXR5ID8/IERFRkFVTFRfSU1BR0VfR0VORVJBVElPTl9RVUFMSVRZLFxuICAgIHNpemU6IG9wdGlvbnM/LnNpemUgPz8gREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1NJWkUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuICByZXN1bHQ/OiBRdWVyeU91dHB1dCxcbik6IHN0cmluZyB7XG4gIGlmIChcbiAgICByZXN1bHQ/LmNvbnRlbnQuc29tZShcbiAgICAgIChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiBpdGVtLmdlbmVyYXRpb24/LnJvdXRlID09PSBcImNvZGV4LWltYWdlc1wiLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIFwiZXN0aW1hdGVkOmdwdC1pbWFnZS0yOnJlcG9ydGVkLXVzYWdlOnB1YmxpYy1wcmljZXM6Y29uc2VydmF0aXZlXCI7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGBhc3N1bWVkOiR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH06JHtyZXNvbHZlZC5xdWFsaXR5fToke3Jlc29sdmVkLnNpemV9OnBuZ2A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZChcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbiAgb3B0aW9uczogSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBpbWFnZXMgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiKTtcbiAgY29uc3QgaW1hZ2VDb3VudCA9IGltYWdlcy5sZW5ndGg7XG4gIGlmIChpbWFnZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKGltYWdlcy5zb21lKChpbWFnZSkgPT4gaW1hZ2UuZ2VuZXJhdGlvbj8ucm91dGUgPT09IFwiY29kZXgtaW1hZ2VzXCIpKSB7XG4gICAgLy8gVGhlIHN0YW5kYWxvbmUgcmVzcG9uc2UncyBhZ2dyZWdhdGUgdXNhZ2UgaXMgY2FycmllZCBieSBpdHMgZmlyc3QgaW1hZ2Ugb25seS5cbiAgICAvLyBEbyBub3QgbXVsdGlwbHkgaXQgYnkgb3V0cHV0IGNvdW50IG9yIHByaWNlIGl0IGFzIHRoZSByZXF1ZXN0ZWQgdGV4dCBkcml2ZXIuXG4gICAgY29uc3QgdXNhZ2UgPSBpbWFnZXMuZmluZCgoaW1hZ2UpID0+IGltYWdlLmdlbmVyYXRpb24/LnVzYWdlKT8uZ2VuZXJhdGlvbj8udXNhZ2U7XG4gICAgaWYgKCF1c2FnZSkgcmV0dXJuIG51bGw7XG4gICAgLy8gUHVibGljIEdQVCBJbWFnZSAyIHJhdGVzIHZlcmlmaWVkIDIwMjYtMDktMDg6IHRleHQgaW5wdXQgJDUvTSwgaW1hZ2UgaW5wdXRcbiAgICAvLyAkOC9NLCBvdXRwdXQgJDMwL00uIEFtb3VudHMgYmVsb3cgYXJlIG1pY3JvVVNELCBzbyBubyAvMU0gY29udmVyc2lvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9wcmljaW5nI2ltYWdlLWdlbmVyYXRpb25cbiAgICAvLyBVc2UgYSBjb25zaXN0ZW50IHJlcG9ydGVkIHNwbGl0OyB1bmtub3duIGlucHV0IGlzIGNvbnNlcnZhdGl2ZWx5IHByaWNlZCBhc1xuICAgIC8vIGltYWdlcy4gQ2FjaGUgZGlzY291bnRzIGFuZCBwcml2YXRlIHN1YnNjcmlwdGlvbiBiaWxsaW5nIHJlbWFpbiB1bmtub3duLlxuICAgIGNvbnN0IGRldGFpbHMgPSB1c2FnZS5pbnB1dF90b2tlbnNfZGV0YWlscztcbiAgICBjb25zdCB0ZXh0VG9rZW5zID1cbiAgICAgIGRldGFpbHMgJiYgZGV0YWlscy50ZXh0X3Rva2VucyArIGRldGFpbHMuaW1hZ2VfdG9rZW5zIDw9IHVzYWdlLmlucHV0X3Rva2Vuc1xuICAgICAgICA/IGRldGFpbHMudGV4dF90b2tlbnNcbiAgICAgICAgOiAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKFxuICAgICAgdGV4dFRva2VucyAqIDUgKyAodXNhZ2UuaW5wdXRfdG9rZW5zIC0gdGV4dFRva2VucykgKiA4ICsgdXNhZ2Uub3V0cHV0X3Rva2VucyAqIDMwLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIGltYWdlQ291bnQgKiBJTUFHRV9PVVRQVVRfQ09TVF9NSUNST19VU0RbcmVzb2x2ZWQucXVhbGl0eV1bcmVzb2x2ZWQuc2l6ZV07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFPQSxNQUFhLCtCQUErQjtBQUM1QyxNQUFhLG1DQUEyRDtBQUN4RSxNQUFhLGdDQUFxRDtBQVNsRSxNQUFNLDhCQUdGO0NBQ0YsS0FBSztFQUNILGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBQ0EsUUFBUTtFQUNOLGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBQ0EsTUFBTTtFQUNKLGFBQWE7RUFDYixhQUFhO0VBQ2IsYUFBYTtDQUNmO0FBQ0Y7QUFFQSxTQUFnQiw4QkFDZCxTQUNnQztDQUNoQyxPQUFPO0VBQ0wsU0FBUyxTQUFTLFdBQUE7RUFDbEIsTUFBTSxTQUFTLFFBQUE7Q0FDakI7QUFDRjtBQUVBLFNBQWdCLDBCQUNkLFNBQ0EsUUFDUTtDQUNSLElBQ0UsUUFBUSxRQUFRLE1BQ2IsU0FBUyxLQUFLLFNBQVMsV0FBVyxLQUFLLFlBQVksVUFBVSxjQUNoRSxHQUVBLE9BQU87Q0FFVCxNQUFNLFdBQVcsOEJBQThCLE9BQU87Q0FDdEQsT0FBTyxXQUFXLDZCQUE2QixHQUFHLFNBQVMsUUFBUSxHQUFHLFNBQVMsS0FBSztBQUN0RjtBQUVBLFNBQWdCLG9DQUNkLFFBQ0EsU0FDZTtDQUNmLE1BQU0sU0FBUyxPQUFPLFFBQVEsUUFBUSxTQUFTLEtBQUssU0FBUyxPQUFPO0NBQ3BFLE1BQU0sYUFBYSxPQUFPO0NBQzFCLElBQUksZUFBZSxHQUFHLE9BQU87Q0FDN0IsSUFBSSxPQUFPLE1BQU0sVUFBVSxNQUFNLFlBQVksVUFBVSxjQUFjLEdBQUc7RUFHdEUsTUFBTSxRQUFRLE9BQU8sTUFBTSxVQUFVLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRSxZQUFZO0VBQzNFLElBQUksQ0FBQyxPQUFPLE9BQU87RUFNbkIsTUFBTSxVQUFVLE1BQU07RUFDdEIsTUFBTSxhQUNKLFdBQVcsUUFBUSxjQUFjLFFBQVEsZ0JBQWdCLE1BQU0sZUFDM0QsUUFBUSxjQUNSO0VBQ04sT0FBTyxLQUFLLE1BQ1YsYUFBYSxLQUFLLE1BQU0sZUFBZSxjQUFjLElBQUksTUFBTSxnQkFBZ0IsRUFDakY7Q0FDRjtDQUNBLE1BQU0sV0FBVyw4QkFBOEIsT0FBTztDQUN0RCxPQUFPLGFBQWEsNEJBQTRCLFNBQVMsUUFBUSxDQUFDLFNBQVM7QUFDN0UifQ==
50
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gIHR5cGUgSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eSxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IENPREVYX0lNQUdFX0dFTkVSQVRJT05fTU9ERUwgPSBcImdwdC1pbWFnZS0yXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTUFHRV9HRU5FUkFUSU9OX1FVQUxJVFk6IEltYWdlR2VuZXJhdGlvblF1YWxpdHkgPSBcIm1lZGl1bVwiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU1BR0VfR0VORVJBVElPTl9TSVpFID0gXCIxNTM2eDEwMjRcIjtcblxudHlwZSBQcmljZWRJbWFnZVNpemUgPSBcIjEwMjR4MTAyNFwiIHwgXCIxMDI0eDE1MzZcIiB8IFwiMTUzNngxMDI0XCI7XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyA9IHtcbiAgcXVhbGl0eTogSW1hZ2VHZW5lcmF0aW9uUXVhbGl0eTtcbiAgc2l6ZTogUHJpY2VkSW1hZ2VTaXplO1xufTtcblxuLy8gT3BlbkFJIGdwdC1pbWFnZS0yIGltYWdlIG91dHB1dCBjb3N0IGVzdGltYXRlcyBieSBxdWFsaXR5L3NpemU6XG4vLyBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9ndWlkZXMvaW1hZ2UtZ2VuZXJhdGlvbiNjYWxjdWxhdGluZy1jb3N0c1xuY29uc3QgSU1BR0VfT1VUUFVUX0NPU1RfTUlDUk9fVVNEOiBSZWNvcmQ8XG4gIEltYWdlR2VuZXJhdGlvblF1YWxpdHksXG4gIFJlY29yZDxQcmljZWRJbWFnZVNpemUsIG51bWJlcj5cbj4gPSB7XG4gIGxvdzoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDZfMDAwLFxuICAgIFwiMTAyNHgxNTM2XCI6IDVfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDVfMDAwLFxuICB9LFxuICBtZWRpdW06IHtcbiAgICBcIjEwMjR4MTAyNFwiOiA1M18wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogNDFfMDAwLFxuICAgIFwiMTUzNngxMDI0XCI6IDQxXzAwMCxcbiAgfSxcbiAgaGlnaDoge1xuICAgIFwiMTAyNHgxMDI0XCI6IDIxMV8wMDAsXG4gICAgXCIxMDI0eDE1MzZcIjogMTY1XzAwMCxcbiAgICBcIjE1MzZ4MTAyNFwiOiAxNjVfMDAwLFxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKFxuICBvcHRpb25zOiBJbWFnZUdlbmVyYXRpb25PcHRpb25zIHwgdW5kZWZpbmVkLFxuKTogUmVzb2x2ZWRJbWFnZUdlbmVyYXRpb25PcHRpb25zIHtcbiAgY29uc3Qgc2l6ZSA9IG9wdGlvbnM/LnNpemU7XG4gIHJldHVybiB7XG4gICAgcXVhbGl0eTogb3B0aW9ucz8ucXVhbGl0eSA/PyBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fUVVBTElUWSxcbiAgICAvLyBVbmtub3duL2N1c3RvbSBzaXplcyB1c2UgdGhlIGRlZmF1bHQgcHJpY2UsIHdpdGhvdXQgY2hhbmdpbmcgb3V0cHV0IGhpbnRzLlxuICAgIHNpemU6XG4gICAgICBzaXplID09PSBcIjEwMjR4MTAyNFwiIHx8IHNpemUgPT09IFwiMTAyNHgxNTM2XCIgfHwgc2l6ZSA9PT0gXCIxNTM2eDEwMjRcIlxuICAgICAgICA/IHNpemVcbiAgICAgICAgOiBERUZBVUxUX0lNQUdFX0dFTkVSQVRJT05fU0laRSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QoXG4gIG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJlc3VsdD86IFF1ZXJ5T3V0cHV0LFxuKTogc3RyaW5nIHtcbiAgaWYgKFxuICAgIHJlc3VsdD8uY29udGVudC5zb21lKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiBpdGVtLmdlbmVyYXRpb24/LnVzYWdlICE9PSB1bmRlZmluZWQpXG4gICkge1xuICAgIHJldHVybiBcImVzdGltYXRlZDpncHQtaW1hZ2UtMjpyZXBvcnRlZC11c2FnZTpwdWJsaWMtcHJpY2VzOmNvbnNlcnZhdGl2ZVwiO1xuICB9XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMob3B0aW9ucyk7XG4gIHJldHVybiBgYXNzdW1lZDoke0NPREVYX0lNQUdFX0dFTkVSQVRJT05fTU9ERUx9OiR7cmVzb2x2ZWQucXVhbGl0eX06JHtyZXNvbHZlZC5zaXplfTpwbmdgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QoXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4gIG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgaW1hZ2VzID0gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIik7XG4gIGNvbnN0IGltYWdlQ291bnQgPSBpbWFnZXMubGVuZ3RoO1xuICBpZiAoaW1hZ2VDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHVzYWdlID0gaW1hZ2VzLmZpbmQoKGltYWdlKSA9PiBpbWFnZS5nZW5lcmF0aW9uPy51c2FnZSk/LmdlbmVyYXRpb24/LnVzYWdlO1xuICBpZiAodXNhZ2UpIHtcbiAgICAvLyBSZXNwb25zZS1sZXZlbCBpbWFnZSB1c2FnZSBpcyBjYXJyaWVkIGJ5IGl0cyBmaXJzdCBpbWFnZSBvbmx5LlxuICAgIC8vIERvIG5vdCBtdWx0aXBseSBpdCBieSBvdXRwdXQgY291bnQgb3IgcHJpY2UgaXQgYXMgdGhlIHJlcXVlc3RlZCB0ZXh0IGRyaXZlci5cbiAgICAvLyBQdWJsaWMgR1BUIEltYWdlIDIgcmF0ZXMgdmVyaWZpZWQgMjAyNi0wOS0wODogdGV4dCBpbnB1dCAkNS9NLCBpbWFnZSBpbnB1dFxuICAgIC8vICQ4L00sIG91dHB1dCAkMzAvTS4gQW1vdW50cyBiZWxvdyBhcmUgbWljcm9VU0QsIHNvIG5vIC8xTSBjb252ZXJzaW9uLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmcjaW1hZ2UtZ2VuZXJhdGlvblxuICAgIC8vIFVzZSBhIGNvbnNpc3RlbnQgcmVwb3J0ZWQgc3BsaXQ7IHVua25vd24gaW5wdXQgaXMgY29uc2VydmF0aXZlbHkgcHJpY2VkIGFzXG4gICAgLy8gaW1hZ2VzLiBDYWNoZSBkaXNjb3VudHMgYW5kIHByaXZhdGUgc3Vic2NyaXB0aW9uIGJpbGxpbmcgcmVtYWluIHVua25vd24uXG4gICAgY29uc3QgZGV0YWlscyA9IHVzYWdlLmlucHV0X3Rva2Vuc19kZXRhaWxzO1xuICAgIGNvbnN0IHRleHRUb2tlbnMgPVxuICAgICAgZGV0YWlscyAmJiBkZXRhaWxzLnRleHRfdG9rZW5zICsgZGV0YWlscy5pbWFnZV90b2tlbnMgPD0gdXNhZ2UuaW5wdXRfdG9rZW5zXG4gICAgICAgID8gZGV0YWlscy50ZXh0X3Rva2Vuc1xuICAgICAgICA6IDA7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoXG4gICAgICB0ZXh0VG9rZW5zICogNSArICh1c2FnZS5pbnB1dF90b2tlbnMgLSB0ZXh0VG9rZW5zKSAqIDggKyB1c2FnZS5vdXRwdXRfdG9rZW5zICogMzAsXG4gICAgKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB1bml0Q29zdCA9IElNQUdFX09VVFBVVF9DT1NUX01JQ1JPX1VTRFtyZXNvbHZlZC5xdWFsaXR5XVtyZXNvbHZlZC5zaXplXTtcbiAgcmV0dXJuIGltYWdlQ291bnQgKiB1bml0Q29zdDtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQU1BLE1BQWEsK0JBQStCO0FBQzVDLE1BQWEsbUNBQTJEO0FBQ3hFLE1BQWEsZ0NBQWdDO0FBVzdDLE1BQU0sOEJBR0Y7Q0FDRixLQUFLO0VBQ0gsYUFBYTtFQUNiLGFBQWE7RUFDYixhQUFhO0NBQ2Y7Q0FDQSxRQUFRO0VBQ04sYUFBYTtFQUNiLGFBQWE7RUFDYixhQUFhO0NBQ2Y7Q0FDQSxNQUFNO0VBQ0osYUFBYTtFQUNiLGFBQWE7RUFDYixhQUFhO0NBQ2Y7QUFDRjtBQUVBLFNBQWdCLDhCQUNkLFNBQ2dDO0NBQ2hDLE1BQU0sT0FBTyxTQUFTO0NBQ3RCLE9BQU87RUFDTCxTQUFTLFNBQVMsV0FBQTtFQUVsQixNQUNFLFNBQVMsZUFBZSxTQUFTLGVBQWUsU0FBUyxjQUNyRCxPQUNBO0NBQ1I7QUFDRjtBQUVBLFNBQWdCLDBCQUNkLFNBQ0EsUUFDUTtDQUNSLElBQ0UsUUFBUSxRQUFRLE1BQU0sU0FBUyxLQUFLLFNBQVMsV0FBVyxLQUFLLFlBQVksVUFBVSxNQUFTLEdBRTVGLE9BQU87Q0FFVCxNQUFNLFdBQVcsOEJBQThCLE9BQU87Q0FDdEQsT0FBTyxXQUFXLDZCQUE2QixHQUFHLFNBQVMsUUFBUSxHQUFHLFNBQVMsS0FBSztBQUN0RjtBQUVBLFNBQWdCLG9DQUNkLFFBQ0EsU0FDZTtDQUNmLE1BQU0sU0FBUyxPQUFPLFFBQVEsUUFBUSxTQUFTLEtBQUssU0FBUyxPQUFPO0NBQ3BFLE1BQU0sYUFBYSxPQUFPO0NBQzFCLElBQUksZUFBZSxHQUFHLE9BQU87Q0FDN0IsTUFBTSxRQUFRLE9BQU8sTUFBTSxVQUFVLE1BQU0sWUFBWSxLQUFLLENBQUMsRUFBRSxZQUFZO0NBQzNFLElBQUksT0FBTztFQVFULE1BQU0sVUFBVSxNQUFNO0VBQ3RCLE1BQU0sYUFDSixXQUFXLFFBQVEsY0FBYyxRQUFRLGdCQUFnQixNQUFNLGVBQzNELFFBQVEsY0FDUjtFQUNOLE9BQU8sS0FBSyxNQUNWLGFBQWEsS0FBSyxNQUFNLGVBQWUsY0FBYyxJQUFJLE1BQU0sZ0JBQWdCLEVBQ2pGO0NBQ0Y7Q0FDQSxNQUFNLFdBQVcsOEJBQThCLE9BQU87Q0FFdEQsT0FBTyxhQURVLDRCQUE0QixTQUFTLFFBQVEsQ0FBQyxTQUFTO0FBRTFFIn0=
@@ -71,7 +71,7 @@ async function beforeQuery(args) {
71
71
  stepIndex
72
72
  };
73
73
  }
74
- async function afterQuery(requestLogId, stepIndex, args, result) {
74
+ async function appendGenerateStep(requestLogId, stepIndex, args, result) {
75
75
  const requestedModelName = withProviderPrefix(args.model, args.model ?? result.requestedModel ?? result.model);
76
76
  const servedModelName = withProviderPrefix(args.model, result.model);
77
77
  await RequestLogModel.appendStep(requestLogId, {
@@ -92,6 +92,13 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
92
92
  ttft_ms: result.ttftMs,
93
93
  finish_reason: result.finishReason
94
94
  });
95
+ return {
96
+ requestedModelName,
97
+ servedModelName
98
+ };
99
+ }
100
+ async function afterQuery(requestLogId, stepIndex, args, result) {
101
+ const { requestedModelName, servedModelName } = await appendGenerateStep(requestLogId, stepIndex, args, result);
95
102
  const imageParts = getImageParts(result);
96
103
  const imageCostMicroUsd = estimateImageGenerationCostMicroUsd(result, args.imageGenerationOptions);
97
104
  for (const step of buildImageGenerationToolSteps(args, imageParts, stepIndex)) await RequestLogModel.appendStep(requestLogId, step);
@@ -137,14 +144,19 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
137
144
  });
138
145
  return {};
139
146
  }
140
- async function finishRunWithError(requestLogId, errorMessage, args) {
141
- await finishTerminalRun(requestLogId, "error", errorMessage, args);
147
+ async function finishRunWithError(requestLogId, errorMessage, args, completedStep) {
148
+ await finishTerminalRun(requestLogId, "error", errorMessage, args, completedStep);
142
149
  }
143
- async function finishRunAborted(requestLogId, args) {
144
- await finishTerminalRun(requestLogId, "aborted", "client disconnected", args);
150
+ async function finishRunAborted(requestLogId, args, completedStep) {
151
+ await finishTerminalRun(requestLogId, "aborted", "client disconnected", args, completedStep);
145
152
  }
146
- async function finishTerminalRun(requestLogId, status, errorMessage, args) {
153
+ async function finishTerminalRun(requestLogId, status, errorMessage, args, completedStep) {
147
154
  try {
155
+ if (completedStep && args) try {
156
+ await appendGenerateStep(requestLogId, completedStep.stepIndex, args, completedStep.result);
157
+ } catch (e) {
158
+ logger.error(`appendGenerateStep failed while finishing ${status}: ${e.message}`);
159
+ }
148
160
  let aggregate;
149
161
  try {
150
162
  aggregate = await RequestLogModel.aggregateStepUsage(requestLogId);
@@ -155,6 +167,11 @@ async function finishTerminalRun(requestLogId, status, errorMessage, args) {
155
167
  status,
156
168
  error_message: errorMessage,
157
169
  history: args ? filterHistoryForStorage(args.history) : void 0,
170
+ ...completedStep ? {
171
+ token_name: completedStep.result.tokenName,
172
+ requested_model_name: withProviderPrefix(args?.model, args?.model ?? completedStep.result.requestedModel ?? completedStep.result.model),
173
+ model_name: withProviderPrefix(args?.model, completedStep.result.model)
174
+ } : {},
158
175
  ...aggregate ? {
159
176
  input_tokens: aggregate.input_tokens,
160
177
  output_tokens: aggregate.output_tokens,
@@ -199,4 +216,4 @@ async function performStaleRunCleanup() {
199
216
  //#endregion
200
217
  export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
201
218
 
202
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkLFxuICBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyxcbiAgZm9ybWF0UmVzcG9uc2VGb3JMb2csXG4gIGdldEltYWdlUGFydHMsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHsgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsIHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcbmxldCBzdGFsZUNsZWFudXBJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbmxldCBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gMDtcbmZ1bmN0aW9uIHdpdGhQcm92aWRlclByZWZpeChcbiAgcm91dGVNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiL1wiKSkgcmV0dXJuIG1vZGVsO1xuICBjb25zdCBzbGFzaCA9IHJvdXRlTW9kZWw/LmluZGV4T2YoXCIvXCIpID8/IC0xO1xuICBjb25zdCBwcm92aWRlciA9IHNsYXNoID4gMCA/IHJvdXRlTW9kZWw/LnNsaWNlKDAsIHNsYXNoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHByb3ZpZGVyID8gYCR7cHJvdmlkZXJ9LyR7bW9kZWx9YCA6IG1vZGVsO1xufVxuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFyc2VhYmxlSnNvbih0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dnZXItZW5hYmxlZCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgdG9vbC13YWl0IGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIC8vIGNvbnRpbnVhdGlvbiDsnYAgY3JlYXRlUnVuIOydhCDqsbTrhIjrm7Drr4DroZwgcnVuIOydmCB0b29scyDripQg7LKrIOyKpO2FnSDsnqXssKnrtoTsnLzroZwg6rOg7KCV65Cc64ukIOKAlFxuICAvLyBBSSBTREsgcHJlcGFyZVN0ZXAvYWN0aXZlVG9vbHMg66GcIOyKpO2FneuniOuLpCDtiLTshYvsnbQg67CU64CM7Ja064+EIOuhnOq3uOyXkOuKlCDrsJjsmIHrkJjsp4Ag7JWK64qU64ukLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG4gICAgLy8gY2xlYW51cOqzvCDqsJnsnYAgREIgYWR2aXNvcnkgbG9ja+ydhCDsnqHqs6AgdG9vbCDqsrDqs7wg67CY7JiBICsg64uk7J2MIHN0ZXAg7JiI7JW97J2EIO2VnFxuICAgIC8vIHRyYW5zYWN0aW9u7JeQ7IScIOyymOumrO2VnOuLpC4g7Jes65+sIHFncmlkIO2UhOuhnOyEuOyKpCDsgqzsnbTsl5DshJzrj4Qgc3RhbGUgZXhwaXJ56rCAXG4gICAgLy8g64+E7LCpIOykkeyduCBmb2xsb3ctdXDsnYQgZXJyb3LroZwg642u7Ja07JOw7KeAIOuqu+2VnOuLpC5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29udGludWVUb29sUnVuKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyA/PyBbXSk7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogYXJncy5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGFyZ3MucHJvamVjdE5hbWUsXG4gICAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICAgICAgdG9vbHM6IGFyZ3MudG9vbHM/Lmxlbmd0aCA/IGFyZ3MudG9vbHMgOiB1bmRlZmluZWQsXG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uOiBhcmdzLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJhdXRvXCIgPyBmYWxzZSA6IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAganNvbl9zY2hlbWE6IGFyZ3MuanNvblNjaGVtYSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIHByb3ZpZGVy6rCAIGNhbm9uaWNhbCBtb2RlbOydhCDrj4zroKTspJjrj4Qg7JqU7LKtIHJvdXRlIOyekOyytChbMW1dIOuTsSnripQg67O07KG07ZWc64ukLlxuICBjb25zdCByZXF1ZXN0ZWRNb2RlbE5hbWUgPSB3aXRoUHJvdmlkZXJQcmVmaXgoXG4gICAgYXJncy5tb2RlbCxcbiAgICBhcmdzLm1vZGVsID8/IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyByZXN1bHQubW9kZWwsXG4gICk7XG4gIGNvbnN0IHNlcnZlZE1vZGVsTmFtZSA9IHdpdGhQcm92aWRlclByZWZpeChhcmdzLm1vZGVsLCByZXN1bHQubW9kZWwpO1xuXG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiByZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgZmFsbGJhY2tfY291bnQ6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcz8ubGVuZ3RoID8/IDAsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl8xaF9pbnB1dF90b2tlbnMsXG4gICAgY29zdF91c2Q6IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiAxXzAwMF8wMDApLFxuICAgIGNvc3Rfc291cmNlOiByZXN1bHQuY29zdFNvdXJjZSxcbiAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdF9tczogcmVzdWx0LnR0ZnRNcyxcbiAgICBmaW5pc2hfcmVhc29uOiByZXN1bHQuZmluaXNoUmVhc29uLFxuICB9KTtcblxuICBjb25zdCBpbWFnZVBhcnRzID0gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQpO1xuICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgIHJlc3VsdCxcbiAgICBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCBzdGVwSW5kZXgpKSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVw7J2EIOymieyLnCDquLDroZ3tlZjqs6AsIOuLpOydjCBmb2xsb3ctdXDsnbQg6rCZ7J2AIHJvd+yXkCDqsrDqs7zrpbwg7LGE7Jq064ukLlxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBjb25zdCByZXNwb25zZVRleHQgPSBmb3JtYXRSZXNwb25zZUZvckxvZyhyZXN1bHQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogcmVzcG9uc2VUZXh0LFxuICAgIC8vIHN0cnVjdHVyZWQg7JqU7LKt66eMIO2MkOygle2VnOuLpC4gZGV0aSDrsLDsuZjsnZggYnJva2VuIEpTT04g66WY66W8IOuqqeuhneyXkOyEnCDrsJTroZxcbiAgICAvLyDqtazrs4TtlZjquLAg7JyE7ZWcIOq4sOuhneydtOupsCwg67mEc3RydWN0dXJlZCDsmpTssq3snYAgbnVsbCDroZwg64Ko64qU64ukLlxuICAgIHJlc3BvbnNlX2pzb25fb2s6IGFyZ3MuanNvblNjaGVtYSA/IGlzUGFyc2VhYmxlSnNvbihyZXNwb25zZVRleHQpIDogbnVsbCxcbiAgICB0b2tlbl9uYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiBhZ2cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdnLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgLy8gbXVsdGktc3RlcCBydW4g67aA66qo7J2YIOuqqOuNuOydgCDstZzsooUgdHVybuydhCDshJzruZntlZwg66qo64247J2064ukLlxuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiByZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgIGZhbGxiYWNrX2NvdW50OiBhZ2cuZmFsbGJhY2tfY291bnQsXG4gICAgY29zdF91c2Q6IGFnZy5jb3N0X3VzZCxcbiAgICBjb3N0X3NvdXJjZTogYWdnLmNvc3Rfc291cmNlLFxuICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICAuLi4oaW1hZ2VQYXJ0cy5sZW5ndGggPiAwID8geyBpc19pbWFnZV9nZW5lcmF0aW9uOiB0cnVlIH0gOiB7fSksXG4gICAgaW1hZ2VfY29zdF9tZXRob2Q6XG4gICAgICBpbWFnZUNvc3RNaWNyb1VzZCAhPT0gbnVsbFxuICAgICAgICA/IGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QoYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLCByZXN1bHQpXG4gICAgICAgIDogbnVsbCxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImVycm9yXCIsIGVycm9yTWVzc2FnZSwgYXJncyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZDogbnVtYmVyLCBhcmdzPzogUXVlcnlJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmaW5pc2hUZXJtaW5hbFJ1bihyZXF1ZXN0TG9nSWQsIFwiYWJvcnRlZFwiLCBcImNsaWVudCBkaXNjb25uZWN0ZWRcIiwgYXJncyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmlzaFRlcm1pbmFsUnVuKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RhdHVzOiBcImVycm9yXCIgfCBcImFib3J0ZWRcIixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgbGV0IGFnZ3JlZ2F0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlPj4gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGFnZ3JlZ2F0ZSA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGFnZ3JlZ2F0ZVN0ZXBVc2FnZSBmYWlsZWQgd2hpbGUgZmluaXNoaW5nICR7c3RhdHVzfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzLFxuICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICAuLi4oYWdncmVnYXRlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogYWdncmVnYXRlLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgICAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgICAgIGZhbGxiYWNrX2NvdW50OiBhZ2dyZWdhdGUuZmFsbGJhY2tfY291bnQsXG4gICAgICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAgICAgY29zdF9zb3VyY2U6IGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBmaW5pc2hUZXJtaW5hbFJ1bigke3N0YXR1c30pIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQpIHtcbiAgICBhd2FpdCBzdGFsZUNsZWFudXBJbkZsaWdodDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA8IFNUQUxFX0NMRUFOVVBfSU5URVJWQUxfTVMpIHJldHVybjtcbiAgbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA9IG5vdztcblxuICBjb25zdCBjbGVhbnVwID0gcGVyZm9ybVN0YWxlUnVuQ2xlYW51cCgpO1xuICBzdGFsZUNsZWFudXBJbkZsaWdodCA9IGNsZWFudXA7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xlYW51cDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQgPT09IGNsZWFudXApIHN0YWxlQ2xlYW51cEluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1TdGFsZVJ1bkNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIjtcbiAgICBjb25zdCBzdGFsZUlkcyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5leHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICAgIFNUQUxFX1JVTl9USFJFU0hPTERfTVMsXG4gICAgICBlcnJvck1lc3NhZ2UsXG4gICAgKTtcbiAgICBjb25zdCBjbGVhbmVkQ291bnQgPSBzdGFsZUlkcy5sZW5ndGg7XG4gICAgaWYgKGNsZWFuZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBjbGVhbmVkIHVwICR7Y2xlYW5lZENvdW50fSBzdGFsZSBydW5uaW5nIHJlcXVlc3QgbG9nc2ApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgc3RhbGUgY2xlYW51cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLE9BQVU7QUFD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
219
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkLFxuICBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyxcbiAgZm9ybWF0UmVzcG9uc2VGb3JMb2csXG4gIGdldEltYWdlUGFydHMsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHsgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsIHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcbmxldCBzdGFsZUNsZWFudXBJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbmxldCBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gMDtcbmZ1bmN0aW9uIHdpdGhQcm92aWRlclByZWZpeChcbiAgcm91dGVNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiL1wiKSkgcmV0dXJuIG1vZGVsO1xuICBjb25zdCBzbGFzaCA9IHJvdXRlTW9kZWw/LmluZGV4T2YoXCIvXCIpID8/IC0xO1xuICBjb25zdCBwcm92aWRlciA9IHNsYXNoID4gMCA/IHJvdXRlTW9kZWw/LnNsaWNlKDAsIHNsYXNoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHByb3ZpZGVyID8gYCR7cHJvdmlkZXJ9LyR7bW9kZWx9YCA6IG1vZGVsO1xufVxuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFyc2VhYmxlSnNvbih0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dnZXItZW5hYmxlZCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgdG9vbC13YWl0IGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIC8vIGNvbnRpbnVhdGlvbiDsnYAgY3JlYXRlUnVuIOydhCDqsbTrhIjrm7Drr4DroZwgcnVuIOydmCB0b29scyDripQg7LKrIOyKpO2FnSDsnqXssKnrtoTsnLzroZwg6rOg7KCV65Cc64ukIOKAlFxuICAvLyBBSSBTREsgcHJlcGFyZVN0ZXAvYWN0aXZlVG9vbHMg66GcIOyKpO2FneuniOuLpCDtiLTshYvsnbQg67CU64CM7Ja064+EIOuhnOq3uOyXkOuKlCDrsJjsmIHrkJjsp4Ag7JWK64qU64ukLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG4gICAgLy8gY2xlYW51cOqzvCDqsJnsnYAgREIgYWR2aXNvcnkgbG9ja+ydhCDsnqHqs6AgdG9vbCDqsrDqs7wg67CY7JiBICsg64uk7J2MIHN0ZXAg7JiI7JW97J2EIO2VnFxuICAgIC8vIHRyYW5zYWN0aW9u7JeQ7IScIOyymOumrO2VnOuLpC4g7Jes65+sIHFncmlkIO2UhOuhnOyEuOyKpCDsgqzsnbTsl5DshJzrj4Qgc3RhbGUgZXhwaXJ56rCAXG4gICAgLy8g64+E7LCpIOykkeyduCBmb2xsb3ctdXDsnYQgZXJyb3LroZwg642u7Ja07JOw7KeAIOuqu+2VnOuLpC5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29udGludWVUb29sUnVuKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyA/PyBbXSk7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogYXJncy5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGFyZ3MucHJvamVjdE5hbWUsXG4gICAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICAgICAgdG9vbHM6IGFyZ3MudG9vbHM/Lmxlbmd0aCA/IGFyZ3MudG9vbHMgOiB1bmRlZmluZWQsXG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uOiBhcmdzLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJhdXRvXCIgPyBmYWxzZSA6IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAganNvbl9zY2hlbWE6IGFyZ3MuanNvblNjaGVtYSA/PyBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwZW5kR2VuZXJhdGVTdGVwKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4pIHtcbiAgLy8gcHJvdmlkZXLqsIAgY2Fub25pY2FsIG1vZGVs7J2EIOuPjOugpOykmOuPhCDsmpTssq0gcm91dGUg7J6Q7LK0KFsxbV0g65OxKeuKlCDrs7TsobTtlZzri6QuXG4gIGNvbnN0IHJlcXVlc3RlZE1vZGVsTmFtZSA9IHdpdGhQcm92aWRlclByZWZpeChcbiAgICBhcmdzLm1vZGVsLFxuICAgIGFyZ3MubW9kZWwgPz8gcmVzdWx0LnJlcXVlc3RlZE1vZGVsID8/IHJlc3VsdC5tb2RlbCxcbiAgKTtcbiAgY29uc3Qgc2VydmVkTW9kZWxOYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KGFyZ3MubW9kZWwsIHJlc3VsdC5tb2RlbCk7XG5cbiAgLy8gZ2VuZXJhdGUgc3RlcCDquLDroZ1cbiAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgIHR5cGU6IFwiZ2VuZXJhdGVcIixcbiAgICBtb2RlbF9uYW1lOiBzZXJ2ZWRNb2RlbE5hbWUsXG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICBmYWxsYmFja19jb3VudDogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzPy5sZW5ndGggPz8gMCxcbiAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25fNW1faW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VucyxcbiAgICBjb3N0X3VzZDogTWF0aC5yb3VuZChyZXN1bHQuY29zdFVzZCAqIDFfMDAwXzAwMCksXG4gICAgY29zdF9zb3VyY2U6IHJlc3VsdC5jb3N0U291cmNlLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuICByZXR1cm4geyByZXF1ZXN0ZWRNb2RlbE5hbWUsIHNlcnZlZE1vZGVsTmFtZSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWZ0ZXJRdWVyeShcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHN0ZXBJbmRleDogbnVtYmVyLFxuICBhcmdzOiBRdWVyeUlucHV0LFxuICByZXN1bHQ6IFF1ZXJ5T3V0cHV0LFxuKTogUHJvbWlzZTxSdW5MaWZlY3ljbGVSZXN1bHQ+IHtcbiAgY29uc3QgeyByZXF1ZXN0ZWRNb2RlbE5hbWUsIHNlcnZlZE1vZGVsTmFtZSB9ID0gYXdhaXQgYXBwZW5kR2VuZXJhdGVTdGVwKFxuICAgIHJlcXVlc3RMb2dJZCxcbiAgICBzdGVwSW5kZXgsXG4gICAgYXJncyxcbiAgICByZXN1bHQsXG4gICk7XG5cbiAgY29uc3QgaW1hZ2VQYXJ0cyA9IGdldEltYWdlUGFydHMocmVzdWx0KTtcbiAgY29uc3QgaW1hZ2VDb3N0TWljcm9Vc2QgPSBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZChcbiAgICByZXN1bHQsXG4gICAgYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICApO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2YgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMoYXJncywgaW1hZ2VQYXJ0cywgc3RlcEluZGV4KSkge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwgc3RlcCk7XG4gIH1cblxuICBpZiAocmVzdWx0LmZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sLWNhbGxzXCIpIHtcbiAgICAvLyB0b29sLWNhbGwgc3RlcOydhCDsponsi5wg6riw66Gd7ZWY6rOgLCDri6TsnYwgZm9sbG93LXVw7J20IOqwmeydgCByb3fsl5Ag6rKw6rO866W8IOyxhOyatOuLpC5cbiAgICBjb25zdCB0b29sQ2FsbHMgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGMpID0+IGMudHlwZSA9PT0gXCJ0b29sLWNhbGxcIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b29sQ2FsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRjID0gdG9vbENhbGxzW2ldITtcbiAgICAgIGlmICh0Yy50eXBlICE9PSBcInRvb2wtY2FsbFwiKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgICAgICBzdGVwX2luZGV4OiBzdGVwSW5kZXgsXG4gICAgICAgIHR5cGU6IFwidG9vbF9jYWxsXCIsXG4gICAgICAgIHRvb2xfY2FsbF9pbmRleDogaW1hZ2VQYXJ0cy5sZW5ndGggKyBpLFxuICAgICAgICB0b29sX2NhbGxfaWQ6IHRjLnRvb2xDYWxsSWQsXG4gICAgICAgIHRvb2xfbmFtZTogdGMudG9vbE5hbWUsXG4gICAgICAgIHRvb2xfYXJnczogdGMuaW5wdXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBydW5Db250ZXh0OiB7IHJlcXVlc3RMb2dJZCB9IH07XG4gIH1cblxuICAvLyBmaW5pc2hSZWFzb24gPT09IFwic3RvcFwiIOKGkiBydW4g7KKF66OMICjsoITssrQgc3RlcCB1c2FnZSDtlansgrApXG4gIGNvbnN0IGFnZyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KTtcbiAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihyZXF1ZXN0TG9nSWQsIHtcbiAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAvLyBzdHJ1Y3R1cmVkIOyalOyyreunjCDtjJDsoJXtlZzri6QuIGRldGkg67Cw7LmY7J2YIGJyb2tlbiBKU09OIOulmOulvCDrqqnroZ3sl5DshJwg67CU66GcXG4gICAgLy8g6rWs67OE7ZWY6riwIOychO2VnCDquLDroZ3snbTrqbAsIOu5hHN0cnVjdHVyZWQg7JqU7LKt7J2AIG51bGwg66GcIOuCqOuKlOuLpC5cbiAgICByZXNwb25zZV9qc29uX29rOiBhcmdzLmpzb25TY2hlbWEgPyBpc1BhcnNlYWJsZUpzb24ocmVzcG9uc2VUZXh0KSA6IG51bGwsXG4gICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBpbnB1dF90b2tlbnM6IGFnZy5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogYWdnLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZy5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICBkdXJhdGlvbl9tczogYWdnLmR1cmF0aW9uX21zLFxuICAgIC8vIG11bHRpLXN0ZXAgcnVuIOu2gOuqqOydmCDrqqjrjbjsnYAg7LWc7KKFIHR1cm7snYQg7ISc67mZ7ZWcIOuqqOuNuOydtOuLpC5cbiAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogcmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgIG1vZGVsX25hbWU6IHNlcnZlZE1vZGVsTmFtZSxcbiAgICBmYWxsYmFja19jb3VudDogYWdnLmZhbGxiYWNrX2NvdW50LFxuICAgIGNvc3RfdXNkOiBhZ2cuY29zdF91c2QsXG4gICAgY29zdF9zb3VyY2U6IGFnZy5jb3N0X3NvdXJjZSxcbiAgICBpbWFnZV9jb3N0X3VzZDogaW1hZ2VDb3N0TWljcm9Vc2QsXG4gICAgLi4uKGltYWdlUGFydHMubGVuZ3RoID4gMCA/IHsgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogdHJ1ZSB9IDoge30pLFxuICAgIGltYWdlX2Nvc3RfbWV0aG9kOlxuICAgICAgaW1hZ2VDb3N0TWljcm9Vc2QgIT09IG51bGxcbiAgICAgICAgPyBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucywgcmVzdWx0KVxuICAgICAgICA6IG51bGwsXG4gICAgaGlzdG9yeTogZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuV2l0aEVycm9yKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuICBjb21wbGV0ZWRTdGVwPzogeyBzdGVwSW5kZXg6IG51bWJlcjsgcmVzdWx0OiBRdWVyeU91dHB1dCB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZpbmlzaFRlcm1pbmFsUnVuKHJlcXVlc3RMb2dJZCwgXCJlcnJvclwiLCBlcnJvck1lc3NhZ2UsIGFyZ3MsIGNvbXBsZXRlZFN0ZXApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuQWJvcnRlZChcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuICBjb21wbGV0ZWRTdGVwPzogeyBzdGVwSW5kZXg6IG51bWJlcjsgcmVzdWx0OiBRdWVyeU91dHB1dCB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZpbmlzaFRlcm1pbmFsUnVuKHJlcXVlc3RMb2dJZCwgXCJhYm9ydGVkXCIsIFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLCBhcmdzLCBjb21wbGV0ZWRTdGVwKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluaXNoVGVybWluYWxSdW4oXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGF0dXM6IFwiZXJyb3JcIiB8IFwiYWJvcnRlZFwiLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4gIGNvbXBsZXRlZFN0ZXA/OiB7IHN0ZXBJbmRleDogbnVtYmVyOyByZXN1bHQ6IFF1ZXJ5T3V0cHV0IH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBpZiAoY29tcGxldGVkU3RlcCAmJiBhcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBlbmRHZW5lcmF0ZVN0ZXAocmVxdWVzdExvZ0lkLCBjb21wbGV0ZWRTdGVwLnN0ZXBJbmRleCwgYXJncywgY29tcGxldGVkU3RlcC5yZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYGFwcGVuZEdlbmVyYXRlU3RlcCBmYWlsZWQgd2hpbGUgZmluaXNoaW5nICR7c3RhdHVzfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgYWdncmVnYXRlOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2U+PiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgYWdncmVnYXRlID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgYWdncmVnYXRlU3RlcFVzYWdlIGZhaWxlZCB3aGlsZSBmaW5pc2hpbmcgJHtzdGF0dXN9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXMsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLihjb21wbGV0ZWRTdGVwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdG9rZW5fbmFtZTogY29tcGxldGVkU3RlcC5yZXN1bHQudG9rZW5OYW1lLFxuICAgICAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHdpdGhQcm92aWRlclByZWZpeChcbiAgICAgICAgICAgICAgYXJncz8ubW9kZWwsXG4gICAgICAgICAgICAgIGFyZ3M/Lm1vZGVsID8/IGNvbXBsZXRlZFN0ZXAucmVzdWx0LnJlcXVlc3RlZE1vZGVsID8/IGNvbXBsZXRlZFN0ZXAucmVzdWx0Lm1vZGVsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHdpdGhQcm92aWRlclByZWZpeChhcmdzPy5tb2RlbCwgY29tcGxldGVkU3RlcC5yZXN1bHQubW9kZWwpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oYWdncmVnYXRlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogYWdncmVnYXRlLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgICAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgICAgIGZhbGxiYWNrX2NvdW50OiBhZ2dyZWdhdGUuZmFsbGJhY2tfY291bnQsXG4gICAgICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAgICAgY29zdF9zb3VyY2U6IGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBmaW5pc2hUZXJtaW5hbFJ1bigke3N0YXR1c30pIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQpIHtcbiAgICBhd2FpdCBzdGFsZUNsZWFudXBJbkZsaWdodDtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA8IFNUQUxFX0NMRUFOVVBfSU5URVJWQUxfTVMpIHJldHVybjtcbiAgbGFzdFN0YWxlQ2xlYW51cFN0YXJ0ZWRBdCA9IG5vdztcblxuICBjb25zdCBjbGVhbnVwID0gcGVyZm9ybVN0YWxlUnVuQ2xlYW51cCgpO1xuICBzdGFsZUNsZWFudXBJbkZsaWdodCA9IGNsZWFudXA7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xlYW51cDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhbGVDbGVhbnVwSW5GbGlnaHQgPT09IGNsZWFudXApIHN0YWxlQ2xlYW51cEluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1TdGFsZVJ1bkNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIjtcbiAgICBjb25zdCBzdGFsZUlkcyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5leHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICAgIFNUQUxFX1JVTl9USFJFU0hPTERfTVMsXG4gICAgICBlcnJvck1lc3NhZ2UsXG4gICAgKTtcbiAgICBjb25zdCBjbGVhbmVkQ291bnQgPSBzdGFsZUlkcy5sZW5ndGg7XG4gICAgaWYgKGNsZWFuZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBjbGVhbmVkIHVwICR7Y2xlYW5lZENvdW50fSBzdGFsZSBydW5uaW5nIHJlcXVlc3QgbG9nc2ApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgc3RhbGUgY2xlYW51cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBQ25ELE1BQU0seUJBQXlCLE9BQVU7QUFDekMsTUFBTSw0QkFBNEIsS0FBSztBQUN2QyxJQUFJO0FBQ0osSUFBSSw0QkFBNEI7QUFDaEMsU0FBUyxtQkFDUCxZQUNBLE9BQ29CO0NBQ3BCLElBQUksQ0FBQyxPQUFPLE9BQU87Q0FDbkIsSUFBSSxNQUFNLFNBQVMsR0FBRyxHQUFHLE9BQU87Q0FDaEMsTUFBTSxRQUFRLFlBQVksUUFBUSxHQUFHLEtBQUs7Q0FDMUMsTUFBTSxXQUFXLFFBQVEsSUFBSSxZQUFZLE1BQU0sR0FBRyxLQUFLLElBQUk7Q0FDM0QsT0FBTyxXQUFXLEdBQUcsU0FBUyxHQUFHLFVBQVU7QUFDN0M7Ozs7QUFLQSxTQUFTLHdCQUF3QixZQUF5QztDQUN4RSxJQUFJLENBQUMsWUFBWSxPQUFPO0NBQ3hCLElBQUk7RUFFRixNQUFNLFdBRFEsS0FBSyxNQUFNLFVBQ1IsQ0FBQSxDQUFNLFFBQVEsU0FBUztHQUN0QyxJQUFJLENBQUMsUUFBUSxPQUFPLFNBQVMsVUFBVSxPQUFPO0dBQzlDLE1BQU0sU0FBUztHQUNmLE9BQU8sT0FBTyxTQUFTLGNBQWMsT0FBTyxTQUFTLFVBQVUsT0FBTyxTQUFTO0VBQ2pGLENBQUM7RUFDRCxPQUFPLFNBQVMsU0FBUyxJQUFJ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
@@ -4,8 +4,9 @@ import { getAccessToken } from "../../utils/providers/common/credentials.js";
4
4
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
5
5
  import { parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema } from "../../utils/providers/common/schema-validation.js";
6
6
  import { strictify } from "../../utils/providers/common/strictifier.js";
7
- import { decideConvRouting, issueConvContext } from "./conv-routing.js";
8
7
  import { ProcessError, maskToken } from "./qgrid.types.js";
8
+ import { ImageGenerationError } from "../../utils/providers/openai/openai-dispatcher.js";
9
+ import { decideConvRouting, issueConvContext } from "./conv-routing.js";
9
10
  import { composeSystemWithSchemaContract } from "./schema-prompt.js";
10
11
  import { applyToolCallEmulation, isToolCallEnvelope } from "./tool-emulation.js";
11
12
  import { buildToolCallSchema } from "./tool-emulation-schema.js";
@@ -213,6 +214,10 @@ function buildRawOutputSchema(input) {
213
214
  const callerOutputSchema = parseAndValidateCallerSchemas(input);
214
215
  return input.tools?.length ? buildToolCallSchema(input.tools, callerOutputSchema) : callerOutputSchema;
215
216
  }
217
+ function completedDriverFromImageFailure(error) {
218
+ if (!(error instanceof ImageGenerationError) || !error.completedDriver) return void 0;
219
+ return applyToolCallEmulation(toEmulationResult(error.completedDriver), void 0, { answerKind: "text" });
220
+ }
216
221
  function toEmulationResult(result) {
217
222
  const hasProviderCost = result.costUsd !== void 0 && result.costUsd > 0;
218
223
  return {
@@ -245,6 +250,6 @@ function toEmulationResult(result) {
245
250
  }
246
251
  const QgridDispatcher = new QgridDispatcherClass();
247
252
  //#endregion
248
- export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
253
+ export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema, completedDriverFromImageFailure };
249
254
 
250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QgfSBmcm9tIFwiLi9zY2hlbWEtcHJvbXB0XCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGlzVG9vbENhbGxFbnZlbG9wZSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsUXVlcnlJbnB1dCA9IFF1ZXJ5SW5wdXQgJiB7XG4gIHByZWZlcnJlZFRva2VuSWQ/OiBudW1iZXI7XG4gIHJlcXVpcmVQcmVmZXJyZWRUb2tlbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIO2UhOuhnOyEuOyKpCDsi5zsnpEg7J207ZuEIOyZhOujjOuQnCBwcm92aWRlciBnZW5lcmF0aW9uIOyImC4g7Iuk7YyoL+ykkeqwhCDsi5zrj4TripQg7KCc7Jm47ZWY66mwLFxuICAvLyDtm4Tsho0gdG9vbCB0dXJu64+EIO2VnCBnZW5lcmF0aW9u7Jy866GcIOyEvOuLpC4g64+Z66qFIO2GoO2BsOydgCBwcm92aWRlcuuzhOuhnCDrtoTrpqztlZzri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBIVFRQ6rCAIGRpc3BhdGNoZXLrs7Tri6Qg66i87KCAIOyXtOumrOuvgOuhnCDstIjquLDtmZQg7KSR6rO8IOy0iOq4sO2ZlCDsi6TtjKjrpbwg6rWs67aE7ZWc64ukLlxuICBzdGFydHVwU3RhdGU6IFJlY29yZDxcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIiwgUHJvdmlkZXJTdGFydHVwU3RhdGU+ID0ge1xuICAgIG9wZW5haTogXCJzdGFydGluZ1wiLFxuICAgIGFudGhyb3BpYzogXCJzdGFydGluZ1wiLFxuICB9O1xuXG4gIC8vIOy0iOq4sO2ZlCDspJHsl5DripQgNTAzICsgUmV0cnktQWZ0ZXIsIOy0iOq4sO2ZlCDsi6TtjKjsl5DripQgNTAw7J2EIOuwmO2ZmO2VnOuLpC5cbiAgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgcmVjb3JkQ29tcGxldGVkKHByb3ZpZGVyOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7cHJvdmlkZXJ9XFwwJHt0b2tlbk5hbWV9YDtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KGtleSwgKHRoaXMucmVxdWVzdENvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGAke3IucHJvdmlkZXJ9XFwwJHtyLm5hbWV9YCkgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogSW50ZXJuYWxRdWVyeUlucHV0LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCwge1xuICAgICAgICBkaXJlY3RPcGVuQUk6IHRydWUsXG4gICAgICAgIG1vZGVsTmFtZXNwYWNlOiBgb3BlbmFpLyR7cm91dGUubW9kZWx9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDpcbiAgICAgICAgICBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IChpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkKSxcbiAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24sIHJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCk7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHJlc3VsdC50b2tlbk5hbWUpO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzPFF1ZXJ5T3V0cHV0PixcbiAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgICAgZGlyZWN0T3BlbkFJOiB0cnVlLFxuICAgICAgICBtb2RlbE5hbWVzcGFjZTogYG9wZW5haS8ke3JvdXRlLm1vZGVsfWAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgc3RvcEFmdGVyT3V0cHV0TWVzc2FnZTogaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcHJvbXB0Q2FjaGVLZXk6IGRlY2lzaW9uLnByb21wdENhY2hlS2V5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gZGVjaXNpb24ucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgICByZXF1aXJlUHJlZmVycmVkVG9rZW46IGlucHV0LnJlcXVpcmVQcmVmZXJyZWRUb2tlbixcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsXG4gICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwiYW50aHJvcGljXCIpO1xuXG4gICAgICAvLyDqtazsobDtmZQg7J2R64u17J2AIOy1nOyihSDthY3siqTtirjsmYAg64247YOAIOuqqOuRkCDsvZTrk5ztjpzsiqTrpbwg7KCc6rGw7ZWc64ukLlxuICAgICAgY29uc3QgaGFzU2NoZW1hQ29udHJhY3QgPSBpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQgfHwgQm9vbGVhbihpbnB1dC50b29scz8ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGZlbmNlU3RyaXAgPSBoYXNTY2hlbWFDb250cmFjdCA/IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0oKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgaWYgKHNhZmUpIGNiLm9uRGVsdGEoc2FmZSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IGNiLm9uRGVsdGE7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBlbWl0RGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJhbnRocm9waWNcIiwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgICAgLy8g64ur64qUIO2OnOyKpCDtjJDsoJUg65WM66y47JeQIOuztOulmO2VnCDthY3siqTtirjrpbwg7JmE66OMIOyghOyXkCDrsKnstpztlZzri6QuXG4gICAgICAgICAgICBjb25zdCByZXN0ID0gZmVuY2VTdHJpcD8uZmx1c2goKTtcbiAgICAgICAgICAgIGlmIChyZXN0KSBjYi5vbkRlbHRhKHJlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVkQ29vcmQsXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm92aWRlclJvdXRlKG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IHByb3ZpZGVyPzogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0ge1xuICBpZiAoIW1vZGVsPy5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICByZXR1cm4geyBtb2RlbDogbW9kZWwgPz8gXCJcIiB9O1xuICB9XG5cbiAgY29uc3QgW3Byb3ZpZGVyLCByb3V0ZWRNb2RlbF0gPSBtb2RlbC5zcGxpdChcIi9cIiwgMik7XG4gIGlmICghcHJvdmlkZXIgfHwgIXJvdXRlZE1vZGVsKSB0aHJvdyBuZXcgUHJvY2Vzc0Vycm9yKFwidW5rbm93biBtb2RlbFwiKTtcbiAgcmV0dXJuIHsgcHJvdmlkZXIsIG1vZGVsOiByb3V0ZWRNb2RlbCB9O1xufVxuXG5mdW5jdGlvbiBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0OiBRdWVyeUlucHV0KTogUHJvY2Vzc0Vycm9yIHtcbiAgcmV0dXJuIG5ldyBQcm9jZXNzRXJyb3IoXG4gICAgYERpcmVjdCBMTE0gQVBJIGZhbGxiYWNrIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gXCI8ZGVmYXVsdD5cIn1gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSwgeyBwcm92aWRlciB9KSBhcyBKc29uVmFsdWUpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcIm1vZGVsXCIgfCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKS5wcm92aWRlcixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIC8vIENsYXVkZSBDb2Rl7J2YIC0tanNvbi1zY2hlbWHripQg67aI7ZWE7JqU7ZWcIOuCtOu2gCDsnqzsi5zrj4Trpbwg7Jyg67Cc7ZWc64ukLlxuICAvLyBBbnRocm9waWPsnYAg7JuQ67O4IOyKpO2CpOuniOulvCDqsoDspp3tlZwg65KkIO2UhOuhrO2UhO2KuOuhnCDsoITri6ztlZjqs6AsIOydkeuLtSDqsoDspp3snYAg7IaM67mE7J6Q7JeQIOunoeq4tOuLpC5cbiAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuZnVuY3Rpb24gdG9FbXVsYXRpb25SZXN1bHQoXG4gIHJlc3VsdDogR2VuZXJhdGVSZXN1bHQsXG4pOiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4ge1xuICBjb25zdCBoYXNQcm92aWRlckNvc3QgPSByZXN1bHQuY29zdFVzZCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5jb3N0VXNkID4gMDtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICByZXF1ZXN0ZWRNb2RlbDogcmVzdWx0LnJlcXVlc3RlZE1vZGVsLFxuICAgIG1vZGVsRmFsbGJhY2tzOiByZXN1bHQubW9kZWxGYWxsYmFja3MsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgIHJlYXNvbmluZ190b2tlbnM6IHJlc3VsdC51c2FnZS5yZWFzb25pbmdPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBd0NBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUl2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUV4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NB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
255
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm92aWRlciDrnbzsmrDtjIXqs7wg7Yag7YGwIOy6kOyLnMK37Ya16rOELiDsupDsi5zripQgVG9rZW5TdWJzY3JpYmVy6rCAIOqwseyLoO2VnOuLpC5cblxuaW1wb3J0IHsgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiwgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9mZW5jZS1zdHJpcFwiO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29zdFVzZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL21vZGVsLWNvc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgU3RyZWFtQ2FsbGJhY2tzLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyxcbiAgc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQge1xuICBJbWFnZUdlbmVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVuQUlEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7XG4gIG1hc2tUb2tlbixcbiAgUHJvY2Vzc0Vycm9yLFxuICB0eXBlIFByb3ZpZGVyU3RhcnR1cFN0YXRlLFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QgfSBmcm9tIFwiLi9zY2hlbWEtcHJvbXB0XCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGlzVG9vbENhbGxFbnZlbG9wZSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5pbXBvcnQgeyBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsUXVlcnlJbnB1dCA9IFF1ZXJ5SW5wdXQgJiB7XG4gIHByZWZlcnJlZFRva2VuSWQ/OiBudW1iZXI7XG4gIHJlcXVpcmVQcmVmZXJyZWRUb2tlbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIO2UhOuhnOyEuOyKpCDsi5zsnpEg7J207ZuEIOyZhOujjOuQnCBwcm92aWRlciBnZW5lcmF0aW9uIOyImC4g7Iuk7YyoL+ykkeqwhCDsi5zrj4TripQg7KCc7Jm47ZWY66mwLFxuICAvLyDtm4Tsho0gdG9vbCB0dXJu64+EIO2VnCBnZW5lcmF0aW9u7Jy866GcIOyEvOuLpC4g64+Z66qFIO2GoO2BsOydgCBwcm92aWRlcuuzhOuhnCDrtoTrpqztlZzri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBIVFRQ6rCAIGRpc3BhdGNoZXLrs7Tri6Qg66i87KCAIOyXtOumrOuvgOuhnCDstIjquLDtmZQg7KSR6rO8IOy0iOq4sO2ZlCDsi6TtjKjrpbwg6rWs67aE7ZWc64ukLlxuICBzdGFydHVwU3RhdGU6IFJlY29yZDxcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIiwgUHJvdmlkZXJTdGFydHVwU3RhdGU+ID0ge1xuICAgIG9wZW5haTogXCJzdGFydGluZ1wiLFxuICAgIGFudGhyb3BpYzogXCJzdGFydGluZ1wiLFxuICB9O1xuXG4gIC8vIOy0iOq4sO2ZlCDspJHsl5DripQgNTAzICsgUmV0cnktQWZ0ZXIsIOy0iOq4sO2ZlCDsi6TtjKjsl5DripQgNTAw7J2EIOuwmO2ZmO2VnOuLpC5cbiAgbm90UmVhZHlFcnJvcihwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIpOiBFcnJvciB7XG4gICAgY29uc3QgbGFiZWwgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IFwiT3BlbkFJXCIgOiBcIkFudGhyb3BpY1wiO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0dXBTdGF0ZVtwcm92aWRlcl0gPT09IFwiZmFpbGVkXCJcbiAgICAgID8gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oU0QoXCJxZ3JpZC5kaXNwYXRjaGVyRmFpbGVkXCIpKGxhYmVsKSlcbiAgICAgIDogbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiKShsYWJlbCkpO1xuICB9XG5cbiAgcmVjb3JkQ29tcGxldGVkKHByb3ZpZGVyOiBzdHJpbmcsIHRva2VuTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7cHJvdmlkZXJ9XFwwJHt0b2tlbk5hbWV9YDtcbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KGtleSwgKHRoaXMucmVxdWVzdENvdW50cy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KGAke3IucHJvdmlkZXJ9XFwwJHtyLm5hbWV9YCkgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogSW50ZXJuYWxRdWVyeUlucHV0LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0LCByb3V0ZS5wcm92aWRlcik7XG4gICAgY29uc3QgYW5zd2VyS2luZCA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJqc29uXCIgYXMgY29uc3QpIDogKFwidGV4dFwiIGFzIGNvbnN0KTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcIm9wZW5haVwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCwge1xuICAgICAgICBkaXJlY3RPcGVuQUk6IHRydWUsXG4gICAgICAgIG1vZGVsTmFtZXNwYWNlOiBgb3BlbmFpLyR7cm91dGUubW9kZWx9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBzdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlOiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHByb21wdENhY2hlS2V5OiBpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcm9tcHRDYWNoZUtleSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDpcbiAgICAgICAgICBpbnB1dC5wcmVmZXJyZWRUb2tlbklkID8/IChpbnB1dC5pbWFnZUdlbmVyYXRpb24gPyB1bmRlZmluZWQgOiBkZWNpc2lvbi5wcmVmZXJyZWRUb2tlbklkKSxcbiAgICAgICAgcmVxdWlyZVByZWZlcnJlZFRva2VuOiBpbnB1dC5yZXF1aXJlUHJlZmVycmVkVG9rZW4sXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgcmVzdWx0LnRva2VuTmFtZSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24sIHJlc3VsdC50aHJlYWRDb29yZC53b3JrZXJJZCk7XG5cbiAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksIGlucHV0LnRvb2xzLCB7XG4gICAgICAgIHRocmVhZENvb3JkOiBjb29yZCxcbiAgICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgaWYgKCF0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHRocm93IHRoaXMubm90UmVhZHlFcnJvcihcImFudGhyb3BpY1wiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LnRoaW5raW5nID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgcHJlZmVycmVkVG9rZW5JZDogaW5wdXQucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiBpbnB1dC5pbWFnZUdlbmVyYXRpb24sXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVjb3JkQ29tcGxldGVkKFwiYW50aHJvcGljXCIsIHJlc3VsdC50b2tlbk5hbWUpO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzPFF1ZXJ5T3V0cHV0PixcbiAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyB0aGlzLm5vdFJlYWR5RXJyb3IoXCJvcGVuYWlcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQsIHtcbiAgICAgICAgZGlyZWN0T3BlbkFJOiB0cnVlLFxuICAgICAgICBtb2RlbE5hbWVzcGFjZTogYG9wZW5haS8ke3JvdXRlLm1vZGVsfWAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgc3RvcEFmdGVyT3V0cHV0TWVzc2FnZTogaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICAgICAgPyAodGV4dCwgcGhhc2UpID0+IGlzVG9vbENhbGxFbnZlbG9wZSh0ZXh0LCBpbnB1dC50b29scyEsIGFuc3dlcktpbmQsIHBoYXNlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpbmtpbmc6IGlucHV0LnRoaW5raW5nLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIHRpbWVvdXRNczogaW5wdXQudGltZW91dCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcHJvbXB0Q2FjaGVLZXk6IGRlY2lzaW9uLnByb21wdENhY2hlS2V5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQgPz8gZGVjaXNpb24ucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgICAgICByZXF1aXJlUHJlZmVycmVkVG9rZW46IGlucHV0LnJlcXVpcmVQcmVmZXJyZWRUb2tlbixcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJvcGVuYWlcIiwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsXG4gICAgICAgICAgICAgICAgICBkZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgIHR1cm5SZXN1bHQudGhyZWFkQ29vcmQud29ya2VySWQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgdGhpcy5ub3RSZWFkeUVycm9yKFwiYW50aHJvcGljXCIpO1xuXG4gICAgICAvLyDqtazsobDtmZQg7J2R64u17J2AIOy1nOyihSDthY3siqTtirjsmYAg64247YOAIOuqqOuRkCDsvZTrk5ztjpzsiqTrpbwg7KCc6rGw7ZWc64ukLlxuICAgICAgY29uc3QgaGFzU2NoZW1hQ29udHJhY3QgPSBpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQgfHwgQm9vbGVhbihpbnB1dC50b29scz8ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGZlbmNlU3RyaXAgPSBoYXNTY2hlbWFDb250cmFjdCA/IGNyZWF0ZUZlbmNlU3RyaXBUcmFuc2Zvcm0oKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVtaXREZWx0YSA9IGZlbmNlU3RyaXBcbiAgICAgICAgPyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzYWZlID0gZmVuY2VTdHJpcC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgaWYgKHNhZmUpIGNiLm9uRGVsdGEoc2FmZSk7XG4gICAgICAgICAgfVxuICAgICAgICA6IGNiLm9uRGVsdGE7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogY29tcG9zZVN5c3RlbVdpdGhTY2hlbWFDb250cmFjdChpbnB1dC5zeXN0ZW0sIGlucHV0KSxcbiAgICAgICAgICB0aGlua2luZzogaW5wdXQudGhpbmtpbmcsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC50aGlua2luZyA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHByZWZlcnJlZFRva2VuSWQ6IGlucHV0LnByZWZlcnJlZFRva2VuSWQsXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBlbWl0RGVsdGEsXG4gICAgICAgICAgb25UaHJlYWRJZDogY2Iub25UaHJlYWRJZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb21wbGV0ZWQoXCJhbnRocm9waWNcIiwgdHVyblJlc3VsdC50b2tlbk5hbWUpO1xuICAgICAgICAgICAgLy8g64ur64qUIO2OnOyKpCDtjJDsoJUg65WM66y47JeQIOuztOulmO2VnCDthY3siqTtirjrpbwg7JmE66OMIOyghOyXkCDrsKnstpztlZzri6QuXG4gICAgICAgICAgICBjb25zdCByZXN0ID0gZmVuY2VTdHJpcD8uZmx1c2goKTtcbiAgICAgICAgICAgIGlmIChyZXN0KSBjYi5vbkRlbHRhKHJlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIHtcbiAgICAgICAgICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVkQ29vcmQsXG4gICAgICAgICAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQcm92aWRlclJvdXRlKG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IHByb3ZpZGVyPzogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0ge1xuICBpZiAoIW1vZGVsPy5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICByZXR1cm4geyBtb2RlbDogbW9kZWwgPz8gXCJcIiB9O1xuICB9XG5cbiAgY29uc3QgW3Byb3ZpZGVyLCByb3V0ZWRNb2RlbF0gPSBtb2RlbC5zcGxpdChcIi9cIiwgMik7XG4gIGlmICghcHJvdmlkZXIgfHwgIXJvdXRlZE1vZGVsKSB0aHJvdyBuZXcgUHJvY2Vzc0Vycm9yKFwidW5rbm93biBtb2RlbFwiKTtcbiAgcmV0dXJuIHsgcHJvdmlkZXIsIG1vZGVsOiByb3V0ZWRNb2RlbCB9O1xufVxuXG5mdW5jdGlvbiBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0OiBRdWVyeUlucHV0KTogUHJvY2Vzc0Vycm9yIHtcbiAgcmV0dXJuIG5ldyBQcm9jZXNzRXJyb3IoXG4gICAgYERpcmVjdCBMTE0gQVBJIGZhbGxiYWNrIG5vdCBpbXBsZW1lbnRlZCBmb3IgbW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gXCI8ZGVmYXVsdD5cIn1gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoXG4gIGlucHV0OiBQaWNrPFF1ZXJ5SW5wdXQsIFwidG9vbHNcIiB8IFwianNvblNjaGVtYVwiPixcbiAgcHJvdmlkZXI/OiBzdHJpbmcsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFJhd091dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSwgeyBwcm92aWRlciB9KSBhcyBKc29uVmFsdWUpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcIm1vZGVsXCIgfCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKS5wcm92aWRlcixcbik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIC8vIENsYXVkZSBDb2Rl7J2YIC0tanNvbi1zY2hlbWHripQg67aI7ZWE7JqU7ZWcIOuCtOu2gCDsnqzsi5zrj4Trpbwg7Jyg67Cc7ZWc64ukLlxuICAvLyBBbnRocm9waWPsnYAg7JuQ67O4IOyKpO2CpOuniOulvCDqsoDspp3tlZwg65KkIO2UhOuhrO2UhO2KuOuhnCDsoITri6ztlZjqs6AsIOydkeuLtSDqsoDspp3snYAg7IaM67mE7J6Q7JeQIOunoeq4tOuLpC5cbiAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV0ZWREcml2ZXJGcm9tSW1hZ2VGYWlsdXJlKGVycm9yOiB1bmtub3duKTogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEltYWdlR2VuZXJhdGlvbkVycm9yKSB8fCAhZXJyb3IuY29tcGxldGVkRHJpdmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChlcnJvci5jb21wbGV0ZWREcml2ZXIpLCB1bmRlZmluZWQsIHtcbiAgICBhbnN3ZXJLaW5kOiBcInRleHRcIixcbiAgfSk7XG59XG5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuZnVuY3Rpb24gdG9FbXVsYXRpb25SZXN1bHQoXG4gIHJlc3VsdDogR2VuZXJhdGVSZXN1bHQsXG4pOiBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj4ge1xuICBjb25zdCBoYXNQcm92aWRlckNvc3QgPSByZXN1bHQuY29zdFVzZCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5jb3N0VXNkID4gMDtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICByZXF1ZXN0ZWRNb2RlbDogcmVzdWx0LnJlcXVlc3RlZE1vZGVsLFxuICAgIG1vZGVsRmFsbGJhY2tzOiByZXN1bHQubW9kZWxGYWxsYmFja3MsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgIHJlYXNvbmluZ190b2tlbnM6IHJlc3VsdC51c2FnZS5yZWFzb25pbmdPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdE1zOiByZXN1bHQudHRmdE1zID8/IDAsXG4gICAgY29zdFVzZDogaGFzUHJvdmlkZXJDb3N0XG4gICAgICA/IHJlc3VsdC5jb3N0VXNkIVxuICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSxcbiAgICBjb3N0U291cmNlOiBoYXNQcm92aWRlckNvc3QgPyBcInByb3ZpZGVyXCIgOiBcInByaWNpbmdfdGFibGVcIixcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRGlzcGF0Y2hlciA9IG5ldyBRZ3JpZERpc3BhdGNoZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQTJDQSxJQUFhLHVCQUFiLE1BQWtDO0NBQ2hDLHlCQUFTLElBQUksSUFBMEI7Q0FJdkMsZ0NBQWdCLElBQUksSUFBb0I7Q0FFeEMsYUFBcUM7Q0FDckMsbUJBQTRDO0NBQzVDLHNCQUFrRDtDQUdsRCxlQUFxRTtFQUNuRSxRQUFRO0VBQ1IsV0FBVztDQUNiO0NBR0EsY0FBYyxVQUF5QztFQUNyRCxNQUFNLFFBQVEsYUFBYSxXQUFXLFdBQVc7RUFDakQsT0FBTyxLQUFLLGFBQWEsY0FBYyxXQUNuQyxJQUFJLDZCQUE2QixHQUFHLHdCQUF3QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQ3BFLElBQUksNEJBQTRCLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUM7Q0FDM0U7Q0FFQSxnQkFBZ0IsVUFBa0IsV0FBeUI7RUFDekQsTUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJO0VBQzVCLEtBQUssY0FBYyxJQUFJLE1BQU0sS0FBSyxjQUFjLElBQUksR0FBRyxLQUFLLEtBQUssQ0FBQztDQUNwRTtDQUVBLGFBQWEsTUFBNEI7RUFDdkMsS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUNsRDtDQUVBLFdBQXlCO0VBQ3ZCLE9BQU8sQ0FBQyxHQUFHLEtBQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTztHQUMzQyxPQUFPLFVBQVUsZUFBZSxFQUFFLFdBQVcsQ0FBQztHQUM5QyxNQUFNLEVBQUU7R0FD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