@cartanova/qgrid-cli 2.10.2 → 2.10.3

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/log-buffer.js +7 -11
  2. package/bundle/dist/application/monit/monit.frame.js +6 -11
  3. package/bundle/dist/application/qgrid/oauth.js +2 -2
  4. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
  5. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -36
  6. package/bundle/dist/application/qgrid/qgrid.frame.js +2 -2
  7. package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
  8. package/bundle/dist/application/qgrid/token-subscriber.js +4 -7
  9. package/bundle/dist/application/qgrid/token-window-keepalive.js +3 -2
  10. package/bundle/dist/application/qgrid/tool-emulation-schema.js +4 -4
  11. package/bundle/dist/application/qgrid/tool-emulation.js +14 -2
  12. package/bundle/dist/application/request-log/request-log.model.js +7 -5
  13. package/bundle/dist/application/setting/setting.model.js +1 -1
  14. package/bundle/dist/sonamu.config.js +6 -6
  15. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  16. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +53 -84
  17. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +55 -0
  18. package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -13
  19. package/bundle/dist/utils/providers/common/effort.js +1 -1
  20. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +3 -3
  21. package/bundle/dist/utils/providers/common/thinking.js +12 -0
  22. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +3 -2
  23. package/bundle/dist/utils/providers/openai/openai-direct-client.js +6 -16
  24. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +89 -78
  25. package/bundle/src/application/monit/log-buffer.test.ts +3 -4
  26. package/bundle/src/application/monit/log-buffer.ts +13 -27
  27. package/bundle/src/application/monit/monit.frame.test.ts +7 -8
  28. package/bundle/src/application/monit/monit.frame.ts +9 -14
  29. package/bundle/src/application/qgrid/oauth.ts +1 -1
  30. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +7 -0
  31. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -1
  32. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +62 -1
  33. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +25 -71
  34. package/bundle/src/application/qgrid/qgrid.frame.ts +4 -8
  35. package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
  36. package/bundle/src/application/qgrid/token-subscriber.test.ts +8 -18
  37. package/bundle/src/application/qgrid/token-subscriber.ts +10 -20
  38. package/bundle/src/application/qgrid/token-window-keepalive.test.ts +2 -2
  39. package/bundle/src/application/qgrid/token-window-keepalive.ts +2 -1
  40. package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +6 -3
  41. package/bundle/src/application/qgrid/tool-emulation-schema.ts +3 -3
  42. package/bundle/src/application/qgrid/tool-emulation.test.ts +8 -1
  43. package/bundle/src/application/qgrid/tool-emulation.ts +29 -0
  44. package/bundle/src/application/request-log/request-log.model.ts +5 -5
  45. package/bundle/src/application/setting/setting.model.ts +1 -1
  46. package/bundle/src/sonamu.config.ts +5 -5
  47. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +3 -6
  48. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +26 -0
  49. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +70 -148
  50. package/bundle/src/utils/providers/anthropic/anthropic-thinking.test.ts +36 -0
  51. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +84 -0
  52. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +74 -13
  53. package/bundle/src/utils/providers/anthropic/claude-session.ts +11 -20
  54. package/bundle/src/utils/providers/common/effort.ts +1 -1
  55. package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -0
  56. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -4
  57. package/bundle/src/utils/providers/common/thinking.ts +10 -0
  58. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +7 -3
  59. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +3 -3
  60. package/bundle/src/utils/providers/openai/openai-direct-client.ts +20 -33
  61. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +97 -6
  62. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +113 -77
  63. package/bundle/web-dist/client/assets/{index-DtRTSTes.js → index-BIC1sQxw.js} +3 -3
  64. package/bundle/web-dist/client/assets/{logs-BhVYDEzC.js → logs-zvdujZWn.js} +1 -1
  65. package/bundle/web-dist/client/assets/{monit-BxN4JWqK.js → monit-CraVV3MQ.js} +1 -1
  66. package/bundle/web-dist/client/assets/{routes-CBCqRp2o.js → routes-B3ZBoJ60.js} +1 -1
  67. package/bundle/web-dist/client/assets/{settings-hBTEC7Ki.js → settings-DwbzT5jo.js} +1 -1
  68. package/bundle/web-dist/client/assets/{show-BzYft5N4.js → show-ItTExdAh.js} +1 -1
  69. package/bundle/web-dist/client/assets/{tokens-PMybtI8X.js → tokens-BynKx8Vn.js} +1 -1
  70. package/bundle/web-dist/client/assets/{use-oauth-login-flow-C51_d6-6.js → use-oauth-login-flow-8xw6on5P.js} +1 -1
  71. package/bundle/web-dist/client/index.html +1 -1
  72. package/bundle/web-dist/server/entry-server.generated.js +1 -1
  73. package/package.json +1 -1
  74. package/skills/qgrid/SKILL.md +1 -0
  75. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -1
  76. package/skills/qgrid/references/anthropic-claude-code-runtime.md +7 -4
  77. package/skills/qgrid/references/decision-rationale.md +9 -0
  78. package/skills/qgrid/references/openai-codex-runtime.md +6 -0
  79. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
  80. package/skills/qgrid/references/tool-calling-and-multiturn.md +18 -1
  81. package/skills/qgrid/references/verification-and-debugging.md +1 -1
@@ -8,7 +8,7 @@ const logger = getLogger(["qgrid", "token-window-keepalive"]);
8
8
  const FIVE_HOURS_MS = 300 * 60 * 1e3;
9
9
  const RESET_GRACE_MS = 1e3;
10
10
  const POST_KEEPALIVE_USAGE_DELAY_MS = 61e3;
11
- const KEEPALIVE_MODEL = "anthropic/claude-haiku-4-5";
11
+ const KEEPALIVE_MODEL = "anthropic/claude-haiku-5-5";
12
12
  const KEEPALIVE_PROJECT_NAME = "qgrid-token-window-keepalive";
13
13
  const KEEPALIVE_SETTING_KEY = "qgrid.tokenWindowKeepaliveEnabled";
14
14
  const KEEPALIVE_ENV_KEY = TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY;
@@ -104,6 +104,7 @@ async function inspectToken(token, deps, expectedGeneration, allowFire) {
104
104
  await deps.dispatch({
105
105
  prompt: "Reply OK.",
106
106
  model: KEEPALIVE_MODEL,
107
+ thinking: false,
107
108
  effort: "low",
108
109
  projectName: KEEPALIVE_PROJECT_NAME,
109
110
  preferredTokenId: token.id
@@ -156,4 +157,4 @@ function stopTokenWindowKeepalive() {
156
157
  //#endregion
157
158
  export { KEEPALIVE_ENV_KEY, KEEPALIVE_MODEL, KEEPALIVE_PROJECT_NAME, KEEPALIVE_SETTING_KEY, POST_KEEPALIVE_USAGE_DELAY_MS, rescheduleTokenWindowKeepalive, startTokenWindowKeepalive, stopTokenWindowKeepalive };
158
159
 
159
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUT0tFTl9XSU5ET1dfS0VFUEFMSVZFX1JVTk5FUl9FTlZfS0VZIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5jb25zdGFudFwiO1xuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyB0eXBlIFVzYWdlUmVzcG9uc2UgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi13aW5kb3cta2VlcGFsaXZlXCJdKTtcblxuY29uc3QgRklWRV9IT1VSU19NUyA9IDUgKiA2MCAqIDYwICogMV8wMDA7XG5jb25zdCBSRVNFVF9HUkFDRV9NUyA9IDFfMDAwO1xuXG4vLyB1c2FnZSBBUEkg7ISx6rO1IOydkeuLteydgCAx67aEIOy6kOyLnOuQnOuLpC4ga2VlcGFsaXZlIOynge2bhCDsponsi5wg7J6s7KGw7ZqM7ZWY66m0IOydtOyghCDsnIjrj4TsmrDrpbxcbi8vIOuLpOyLnCDrs7Trr4DroZwg7LqQ7Iuc6rCAIOyngOuCnCDrkqQg7ZWcIOuyiCDtmZXsnbjtlZjqs6AsIOq3uOuVjOuPhCDsg4gg7JyI64+E7Jqw6rCAIOyXhuycvOuptCDri6TsnYwgNWjquYzsp4Ag6riw64uk66aw64ukLlxuZXhwb3J0IGNvbnN0IFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TID0gNjFfMDAwO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9NT0RFTCA9IFwiYW50aHJvcGljL2NsYXVkZS1oYWlrdS00LTVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfUFJPSkVDVF9OQU1FID0gXCJxZ3JpZC10b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX1NFVFRJTkdfS0VZID0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfRU5WX0tFWSA9IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVk7XG5cbnR5cGUgS2VlcGFsaXZlVG9rZW4gPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICBrZWVwYWxpdmVfZW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGltZXJIYW5kbGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuZXhwb3J0IHR5cGUgVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0ge1xuICBmaW5kVG9rZW5zOiAoKSA9PiBQcm9taXNlPEtlZXBhbGl2ZVRva2VuW10+O1xuICByZWFkVXNhZ2U6ICh0b2tlbklkOiBudW1iZXIpID0+IFByb21pc2U8VXNhZ2VSZXNwb25zZT47XG4gIGRpc3BhdGNoOiAoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nO1xuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG4gIG5vdzogKCkgPT4gbnVtYmVyO1xuICBzZXRUaW1lcjogKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFRpbWVySGFuZGxlO1xuICBjbGVhclRpbWVyOiAoaGFuZGxlOiBUaW1lckhhbmRsZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHREZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSB7XG4gIGZpbmRUb2tlbnM6ICgpID0+IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpLFxuICByZWFkVXNhZ2U6ICh0b2tlbklkKSA9PiBRZ3JpZEZyYW1lLnVzYWdlKHRva2VuSWQpLFxuICBkaXNwYXRjaDogKGlucHV0KSA9PiBRZ3JpZEZyYW1lLnF1ZXJ5KGlucHV0KSxcbiAgcmVhZFNldHRpbmc6IGdldFNldHRpbmcsXG4gIGlzUnVubmVyRW5hYmxlZDogKCkgPT4gcHJvY2Vzcy5lbnZbS0VFUEFMSVZFX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgbm93OiAoKSA9PiBEYXRlLm5vdygpLFxuICBzZXRUaW1lcjogKGNhbGxiYWNrLCBkZWxheU1zKSA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheU1zKSxcbiAgY2xlYXJUaW1lcjogKGhhbmRsZSkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSksXG59O1xuXG5jb25zdCB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgeyBoYW5kbGU6IFRpbWVySGFuZGxlOyBjbGVhcjogKGhhbmRsZTogVGltZXJIYW5kbGUpID0+IHZvaWQgfT4oKTtcbmNvbnN0IGZpcmVHdWFyZHMgPSBuZXcgTWFwPG51bWJlciwgeyB1bnRpbE1zOiBudW1iZXI7IGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuIH0+KCk7XG5sZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbmZ1bmN0aW9uIGNsZWFyVG9rZW5UaW1lcih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgdGltZXIgPSB0aW1lcnMuZ2V0KHRva2VuSWQpO1xuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuICBjb25zdCBoYW5kbGUgPSBkZXBzLnNldFRpbWVyKFxuICAgICgpID0+IHtcbiAgICAgIHRpbWVycy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgdm9pZCBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgYWxsb3dGaXJlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGtlZXBhbGl2ZSBjeWNsZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcbiAgdGltZXJzLnNldCh0b2tlbi5pZCwgeyBoYW5kbGUsIGNsZWFyOiBkZXBzLmNsZWFyVGltZXIgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmVyVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCB1bnRpbE1zID0gZGVwcy5ub3coKSArIGRlbGF5TXM7XG4gIGZpcmVHdWFyZHMuc2V0KHRva2VuLmlkLCB7IHVudGlsTXMsIGFsbG93RmlyZUF0RXhwaXJ5IH0pO1xuICBzY2hlZHVsZVRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGRlbGF5TXMsIGFsbG93RmlyZUF0RXhwaXJ5KTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVGYWxsYmFjayhcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGRlZmVyVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgRklWRV9IT1VSU19NUywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gZGVwcy5ub3coKTtcbiAgY29uc3QgZ3VhcmQgPSBmaXJlR3VhcmRzLmdldCh0b2tlbi5pZCk7XG4gIGlmIChndWFyZCAmJiBndWFyZC51bnRpbE1zID4gbm93KSB7XG4gICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBndWFyZC51bnRpbE1zIC0gbm93LCBndWFyZC5hbGxvd0ZpcmVBdEV4cGlyeSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChndWFyZCkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuXG4gIGxldCB1c2FnZTogVXNhZ2VSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1c2FnZSA9IGF3YWl0IGRlcHMucmVhZFVzYWdlKHRva2VuLmlkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGlmICh1c2FnZS5lcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB1c2FnZSBsb29rdXAgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke3VzYWdlLmVycm9yfWApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzZXRzQXQgPSB1c2FnZS5maXZlSG91cj8ucmVzZXRzQXQ7XG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNldE1zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGludmFsaWQgZml2ZS1ob3VyIHJlc2V0IGZvciAke3Rva2VuLm5hbWV9OiAke3Jlc2V0c0F0fWApO1xuICAgICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuICAgIGlmIChyZXNldE1zID4gaW5zcGVjdGVkQXQpIHtcbiAgICAgIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuLmlkKTtcbiAgICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgcmVzZXRNcyAtIGluc3BlY3RlZEF0ICsgUkVTRVRfR1JBQ0VfTVMsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuwnOyCrCDsp4Htm4Qg7ZmV7J247JeQ7ISc64qUIOy6kOyLnOuQnCBudWxsL+qzvOqxsCByZXNldOydhCDrtJDrj4Qg64uk7IucIOuwnOyCrO2VmOyngCDslYrripTri6QuXG4gIGlmICghYWxsb3dGaXJlKSB7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVwcy5kaXNwYXRjaCh7XG4gICAgICBwcm9tcHQ6IFwiUmVwbHkgT0suXCIsXG4gICAgICBtb2RlbDogS0VFUEFMSVZFX01PREVMLFxuICAgICAgZWZmb3J0OiBcImxvd1wiLFxuICAgICAgcHJvamVjdE5hbWU6IEtFRVBBTElWRV9QUk9KRUNUX05BTUUsXG4gICAgICBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhga2VlcGFsaXZlIHNlbnQgZm9yICR7dG9rZW4ubmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2Fybihga2VlcGFsaXZlIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0RmlyZUd1YXJkID0gZmlyZUd1YXJkcy5nZXQodG9rZW4uaWQpO1xuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGltZXJzLmtleXMoKSkgY2xlYXJUb2tlblRpbWVyKHRva2VuSWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgaWYgKCFkZXBzLmlzUnVubmVyRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHJ1bm5lciBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRlcHMucmVhZFNldHRpbmcoS0VFUEFMSVZFX1NFVFRJTkdfS0VZKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIGRpc2FibGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleHBlY3RlZEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuXG4gIGxldCB0b2tlbnM6IEtlZXBhbGl2ZVRva2VuW107XG4gIHRyeSB7XG4gICAgdG9rZW5zID0gYXdhaXQgZGVwcy5maW5kVG9rZW5zKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRva2VuIGRpc2NvdmVyeSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdGFyZ2V0cyA9IHRva2Vucy5maWx0ZXIoXG4gICAgKHRva2VuKSA9PiB0b2tlbi5hY3RpdmUgJiYgdG9rZW4ucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdG9rZW4ua2VlcGFsaXZlX2VuYWJsZWQsXG4gICk7XG4gIGNvbnN0IHRhcmdldElkcyA9IG5ldyBTZXQodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgZmlyZUd1YXJkcy5rZXlzKCkpIHtcbiAgICBpZiAoIXRhcmdldElkcy5oYXModG9rZW5JZCkpIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuSWQpO1xuICB9XG4gIGxvZ2dlci5pbmZvKGB0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHNjaGVkdWxpbmcgJHt0YXJnZXRzLmxlbmd0aH0gdG9rZW4ocylgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgdHJ1ZSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHN0YXJ0VG9rZW5XaW5kb3dLZWVwYWxpdmUoZGVwcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTogdm9pZCB7XG4gIGNsZWFyU2No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
160
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUT0tFTl9XSU5ET1dfS0VFUEFMSVZFX1JVTk5FUl9FTlZfS0VZIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5jb25zdGFudFwiO1xuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyB0eXBlIFVzYWdlUmVzcG9uc2UgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi13aW5kb3cta2VlcGFsaXZlXCJdKTtcblxuY29uc3QgRklWRV9IT1VSU19NUyA9IDUgKiA2MCAqIDYwICogMV8wMDA7XG5jb25zdCBSRVNFVF9HUkFDRV9NUyA9IDFfMDAwO1xuXG4vLyB1c2FnZSBBUEkg7ISx6rO1IOydkeuLteydgCAx67aEIOy6kOyLnOuQnOuLpC4ga2VlcGFsaXZlIOynge2bhCDsponsi5wg7J6s7KGw7ZqM7ZWY66m0IOydtOyghCDsnIjrj4TsmrDrpbxcbi8vIOuLpOyLnCDrs7Trr4DroZwg7LqQ7Iuc6rCAIOyngOuCnCDrkqQg7ZWcIOuyiCDtmZXsnbjtlZjqs6AsIOq3uOuVjOuPhCDsg4gg7JyI64+E7Jqw6rCAIOyXhuycvOuptCDri6TsnYwgNWjquYzsp4Ag6riw64uk66aw64ukLlxuZXhwb3J0IGNvbnN0IFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TID0gNjFfMDAwO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9NT0RFTCA9IFwiYW50aHJvcGljL2NsYXVkZS1oYWlrdS01LTVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfUFJPSkVDVF9OQU1FID0gXCJxZ3JpZC10b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX1NFVFRJTkdfS0VZID0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfRU5WX0tFWSA9IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVk7XG5cbnR5cGUgS2VlcGFsaXZlVG9rZW4gPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICBrZWVwYWxpdmVfZW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGltZXJIYW5kbGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuZXhwb3J0IHR5cGUgVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0ge1xuICBmaW5kVG9rZW5zOiAoKSA9PiBQcm9taXNlPEtlZXBhbGl2ZVRva2VuW10+O1xuICByZWFkVXNhZ2U6ICh0b2tlbklkOiBudW1iZXIpID0+IFByb21pc2U8VXNhZ2VSZXNwb25zZT47XG4gIGRpc3BhdGNoOiAoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nO1xuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG4gIG5vdzogKCkgPT4gbnVtYmVyO1xuICBzZXRUaW1lcjogKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFRpbWVySGFuZGxlO1xuICBjbGVhclRpbWVyOiAoaGFuZGxlOiBUaW1lckhhbmRsZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHREZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSB7XG4gIGZpbmRUb2tlbnM6ICgpID0+IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpLFxuICByZWFkVXNhZ2U6ICh0b2tlbklkKSA9PiBRZ3JpZEZyYW1lLnVzYWdlKHRva2VuSWQpLFxuICBkaXNwYXRjaDogKGlucHV0KSA9PiBRZ3JpZEZyYW1lLnF1ZXJ5KGlucHV0KSxcbiAgcmVhZFNldHRpbmc6IGdldFNldHRpbmcsXG4gIGlzUnVubmVyRW5hYmxlZDogKCkgPT4gcHJvY2Vzcy5lbnZbS0VFUEFMSVZFX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgbm93OiAoKSA9PiBEYXRlLm5vdygpLFxuICBzZXRUaW1lcjogKGNhbGxiYWNrLCBkZWxheU1zKSA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheU1zKSxcbiAgY2xlYXJUaW1lcjogKGhhbmRsZSkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSksXG59O1xuXG5jb25zdCB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgeyBoYW5kbGU6IFRpbWVySGFuZGxlOyBjbGVhcjogKGhhbmRsZTogVGltZXJIYW5kbGUpID0+IHZvaWQgfT4oKTtcbmNvbnN0IGZpcmVHdWFyZHMgPSBuZXcgTWFwPG51bWJlciwgeyB1bnRpbE1zOiBudW1iZXI7IGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuIH0+KCk7XG5sZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbmZ1bmN0aW9uIGNsZWFyVG9rZW5UaW1lcih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgdGltZXIgPSB0aW1lcnMuZ2V0KHRva2VuSWQpO1xuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuICBjb25zdCBoYW5kbGUgPSBkZXBzLnNldFRpbWVyKFxuICAgICgpID0+IHtcbiAgICAgIHRpbWVycy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgdm9pZCBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgYWxsb3dGaXJlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGtlZXBhbGl2ZSBjeWNsZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcbiAgdGltZXJzLnNldCh0b2tlbi5pZCwgeyBoYW5kbGUsIGNsZWFyOiBkZXBzLmNsZWFyVGltZXIgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmVyVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCB1bnRpbE1zID0gZGVwcy5ub3coKSArIGRlbGF5TXM7XG4gIGZpcmVHdWFyZHMuc2V0KHRva2VuLmlkLCB7IHVudGlsTXMsIGFsbG93RmlyZUF0RXhwaXJ5IH0pO1xuICBzY2hlZHVsZVRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGRlbGF5TXMsIGFsbG93RmlyZUF0RXhwaXJ5KTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVGYWxsYmFjayhcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGRlZmVyVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgRklWRV9IT1VSU19NUywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gZGVwcy5ub3coKTtcbiAgY29uc3QgZ3VhcmQgPSBmaXJlR3VhcmRzLmdldCh0b2tlbi5pZCk7XG4gIGlmIChndWFyZCAmJiBndWFyZC51bnRpbE1zID4gbm93KSB7XG4gICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBndWFyZC51bnRpbE1zIC0gbm93LCBndWFyZC5hbGxvd0ZpcmVBdEV4cGlyeSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChndWFyZCkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuXG4gIGxldCB1c2FnZTogVXNhZ2VSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1c2FnZSA9IGF3YWl0IGRlcHMucmVhZFVzYWdlKHRva2VuLmlkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGlmICh1c2FnZS5lcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB1c2FnZSBsb29rdXAgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke3VzYWdlLmVycm9yfWApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzZXRzQXQgPSB1c2FnZS5maXZlSG91cj8ucmVzZXRzQXQ7XG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNldE1zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGludmFsaWQgZml2ZS1ob3VyIHJlc2V0IGZvciAke3Rva2VuLm5hbWV9OiAke3Jlc2V0c0F0fWApO1xuICAgICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuICAgIGlmIChyZXNldE1zID4gaW5zcGVjdGVkQXQpIHtcbiAgICAgIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuLmlkKTtcbiAgICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgcmVzZXRNcyAtIGluc3BlY3RlZEF0ICsgUkVTRVRfR1JBQ0VfTVMsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuwnOyCrCDsp4Htm4Qg7ZmV7J247JeQ7ISc64qUIOy6kOyLnOuQnCBudWxsL+qzvOqxsCByZXNldOydhCDrtJDrj4Qg64uk7IucIOuwnOyCrO2VmOyngCDslYrripTri6QuXG4gIGlmICghYWxsb3dGaXJlKSB7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVwcy5kaXNwYXRjaCh7XG4gICAgICBwcm9tcHQ6IFwiUmVwbHkgT0suXCIsXG4gICAgICBtb2RlbDogS0VFUEFMSVZFX01PREVMLFxuICAgICAgdGhpbmtpbmc6IGZhbHNlLFxuICAgICAgZWZmb3J0OiBcImxvd1wiLFxuICAgICAgcHJvamVjdE5hbWU6IEtFRVBBTElWRV9QUk9KRUNUX05BTUUsXG4gICAgICBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhga2VlcGFsaXZlIHNlbnQgZm9yICR7dG9rZW4ubmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2Fybihga2VlcGFsaXZlIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0RmlyZUd1YXJkID0gZmlyZUd1YXJkcy5nZXQodG9rZW4uaWQpO1xuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGltZXJzLmtleXMoKSkgY2xlYXJUb2tlblRpbWVyKHRva2VuSWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgaWYgKCFkZXBzLmlzUnVubmVyRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHJ1bm5lciBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRlcHMucmVhZFNldHRpbmcoS0VFUEFMSVZFX1NFVFRJTkdfS0VZKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIGRpc2FibGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleHBlY3RlZEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuXG4gIGxldCB0b2tlbnM6IEtlZXBhbGl2ZVRva2VuW107XG4gIHRyeSB7XG4gICAgdG9rZW5zID0gYXdhaXQgZGVwcy5maW5kVG9rZW5zKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRva2VuIGRpc2NvdmVyeSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdGFyZ2V0cyA9IHRva2Vucy5maWx0ZXIoXG4gICAgKHRva2VuKSA9PiB0b2tlbi5hY3RpdmUgJiYgdG9rZW4ucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdG9rZW4ua2VlcGFsaXZlX2VuYWJsZWQsXG4gICk7XG4gIGNvbnN0IHRhcmdldElkcyA9IG5ldyBTZXQodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgZmlyZUd1YXJkcy5rZXlzKCkpIHtcbiAgICBpZiAoIXRhcmdldElkcy5oYXModG9rZW5JZCkpIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuSWQpO1xuICB9XG4gIGxvZ2dlci5pbmZvKGB0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHNjaGVkdWxpbmcgJHt0YXJnZXRzLmxlbmd0aH0gdG9rZW4ocylgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgdHJ1ZSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHN0YXJ0VG9rZW5XaW5kb3dLZWVwYWxpdmUoZGVwcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTogdm9pZCB7XG4gIGNsZWFyU2NoZWR1bGVkVGltZXJzKCk7XG4gIGZpcmVHdWFyZHMuY2xlYXIoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLHdCQUF3QixDQUFDO0FBRTVELE1BQU0sZ0JBQWdCLE1BQVMsS0FBSztBQUNwQyxNQUFNLGlCQUFpQjtBQUl2QixNQUFhLGdDQUFnQztBQUM3QyxNQUFhLGtCQUFrQjtBQUMvQixNQUFhLHlCQUF5QjtBQUN0QyxNQUFhLHdCQUF3QjtBQUNyQyxNQUFhLG9CQUFvQjtBQXVCakMsTUFBTSxjQUF3QztDQUM1QyxrQkFBa0IsV0FBVyxxQkFBcUIsS0FBSyxXQUFXO0NBQ2xFLFlBQVksWUFBWSxXQUFXLE1BQU0sT0FBTztDQUNoRCxXQUFXLFVBQVUsV0FBVyxNQUFNLEtBQUs7Q0FDM0MsYUFBYTtDQUNiLHVCQUF1QixRQUFRLElBQUksdUJBQXVCO0NBQzFELFdBQVcsS0FBSyxJQUFJO0NBQ3BCLFdBQVcsVUFBVSxZQUFZLFdBQVcsVUFBVSxPQUFPO0NBQzdELGFBQWEsV0FBVyxhQUFhLE1BQU07QUFDN0M7QUFFQSxNQUFNLHlCQUFTLElBQUksSUFBMkU7QUFDOUYsTUFBTSw2QkFBYSxJQUFJLElBQTZEO0FBQ3BGLElBQUksYUFBYTtBQUVqQixTQUFTLGdCQUFnQixTQUF1QjtDQUM5QyxNQUFNLFFBQVEsT0FBTyxJQUFJLE9BQU87Q0FDaEMsSUFBSSxDQUFDLE9BQU87Q0FDWixNQUFNLE1BQU0sTUFBTSxNQUFNO0NBQ3hCLE9BQU8sT0FBTyxPQUFPO0FBQ3ZCO0FBRUEsU0FBUyxjQUNQLE9BQ0EsTUFDQSxvQkFDQSxTQUNBLFdBQ007Q0FDTixJQUFJLGVBQWUsb0JBQW9CO0NBQ3ZDLGdCQUFnQixNQUFNLEVBQUU7Q0FDeEIsTUFBTSxTQUFTLEtBQUssZUFDWjtFQUNKLE9BQU8sT0FBTyxNQUFNLEVBQUU7RUFDdEIsSUFBSSxlQUFlLG9CQUFvQjtFQUN2QyxBQUFLLGFBQWEsT0FBTyxNQUFNLG9CQUFv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
@@ -30,7 +30,7 @@ function buildToolCallSchema(tools, answerSchema) {
30
30
  const normalizedAnswerSchema = answerSchema === void 0 ? void 0 : rebaseUserOutputSchema(answerSchema);
31
31
  return {
32
32
  type: "object",
33
- description: "Use this schema only through StructuredOutput. Do not invoke listed client tools as native Claude Code tools. To request client-side tool execution, set result.action to tool_call and include result.toolCalls. Use action answer only when no further client tool result is needed.",
33
+ description: "Return exactly one JSON object matching this schema as your final response, including when requesting a tool. This object is the response body, not a call to a built-in tool. To request client-side tools, set result.action to tool_call and include result.toolCalls, then end your turn. The client executes those tools and supplies their results in a later request. Do not invent tool results or emit an answer before receiving the required results.",
34
34
  properties: { result: { anyOf: [{
35
35
  type: "object",
36
36
  description: "Final answer. Use only when no further client tool result is needed.",
@@ -50,7 +50,7 @@ function buildToolCallSchema(tools, answerSchema) {
50
50
  additionalProperties: false
51
51
  }, {
52
52
  type: "object",
53
- description: "Request client-side tool execution through this structured output. Do not call these tools as native Claude Code tools.",
53
+ description: "Request client-side tool execution. Return this object as the complete response, then wait for the next request containing tool results.",
54
54
  properties: {
55
55
  action: {
56
56
  type: "string",
@@ -66,7 +66,7 @@ function buildToolCallSchema(tools, answerSchema) {
66
66
  toolName: {
67
67
  type: "string",
68
68
  enum: tools.map((tool) => tool.name),
69
- description: `Client-side tool name to request through structured output. Do not call this as a native Claude Code tool.\n${toolDescriptions}`
69
+ description: `Client-side tool name. The caller executes these tools after receiving your JSON response.\n${toolDescriptions}`
70
70
  },
71
71
  args: {
72
72
  type: "string",
@@ -122,4 +122,4 @@ function isJsonObject(value) {
122
122
  //#endregion
123
123
  export { ToolSchemaCompositionError, buildToolCallSchema };
124
124
 
125
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0b29sIGVudmVsb3BlICsg7IKs7Jqp7J6QIG91dHB1dCDsiqTtgqTrp4gg7ZWp7ISxICjsmpTssq0g67Cp7ZalKS4g7J2R64u1IO2VtOyEneydgCB0b29sLWVtdWxhdGlvbi50cy5cbiAqXG4gKiB0b29scyDqsIAg7J6I7Ja064+EIOy1nOyihSBhbnN3ZXIg6rCAIOyCrOyaqeyekCDsiqTtgqTrp4jroZwg6rCV7KCc65CY6rKMIO2VmOugpOqzoCBlbnZlbG9wZSDsnZggYW5zd2VyIOu4jOuenOy5mOyXkFxuICog7IKs7Jqp7J6QIOyKpO2CpOuniOulvCDsi6zripTri6QuIO2GteynuOuhnCDspJHssqntlaAg7IiYIOyXhuuKlCDsnbTsnKDripQgYCRyZWZgIOqwgCDrrLjshJwg7KCI64yAIOqyveuhnOydtOq4sCDrlYzrrLgg4oCUXG4gKiBgI2Ag7J2AIFwi7J20IOyhsOqwgeydmCDro6jtirhcIuqwgCDslYTri4jrnbwgXCLstZzsooUg66y47ISc7J2YIOujqO2KuFwi6528LCDqt7jrjIDroZwg64Sj7Jy866m0IO2PrOyduO2EsOqwgCBlbnZlbG9wZSDsnYRcbiAqIOqwgOumrOy8nCDsobDsmqntnogg7JeJ65qx7ZWcIOqxuCDqsoDspp3tlZjqsowg65Cc64ukLiDqt7jrnpjshJwg7JiI7JW9IOydtOumhCDslYTrnpjroZwg7Jiu6riw6rOgIOuhnOy7rCDtj6zsnbjthLDrpbwg7J6s7J6R7ISx7ZWc64ukLlxuICpcbiAqIOuwsOqyvcK37Iuk7LihwrfsmIjsi5zCt+qxsOu2gCDrqqnroZ3snYAg7Iqk7YKsIOusuOyEnOulvCDrs7wg6rKDOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqICAg4oaSIFwiQ29tcG9zaW5nIFRvb2xzIFdpdGggQSBVc2VyIE91dHB1dCBTY2hlbWFcIlxuICovXG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JELFxuICBTQ0hFTUFfTUFQX0tFWVdPUkRTLFxuICBTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTLFxuICBVTlNVUFBPUlRFRF9SRUZFUkVOQ0VfS0VZV09SRFMsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2pzb24tc2NoZW1hLWtleXdvcmRzXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkVG9vbCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IFVTRVJfT1VUUFVUX0RFRklOSVRJT04gPSBcIl9fcWdyaWRfdXNlcl9vdXRwdXRcIjtcbmNvbnN0IFVTRVJfT1VUUFVUX1JFRiA9IGAjLyRkZWZzLyR7VVNFUl9PVVRQVVRfREVGSU5JVElPTn1gO1xuXG5leHBvcnQgY2xhc3MgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihgdG9vbCBzY2hlbWEgY29tcG9zaXRpb246ICR7bWVzc2FnZX0gKGF0ICR7cGF0aH0pYCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclwiO1xuICB9XG59XG5cbi8vIGVudmVsb3BlIOuKlCByZXN1bHQg7ZWcIOqyuSDslYTrnpjsl5AgZGlzY3JpbWluYXRlZCB1bmlvbiDsnYQg65GU64ukLiDrkZAg67OA7ZiV7J2EIOusuOuylSDsiJjspIDsl5DshJxcbi8vIOyDge2YuOuwsO2DgOuhnCDrp4zrk6TslrQoYW5zd2VyIOuzgO2YleydgCBhbnN3ZXIg67mEbnVsbCDtlYTsiJgsIHRvb2xfY2FsbCDrs4DtmJXsnYAgdG9vbENhbGxzIDHqsJwg7J207IOBKVxuLy8gYGFjdGlvbjpcImFuc3dlclwiLCBhbnN3ZXI6bnVsbGAg6rCZ7J2AIO2HtO2ZlCDsobDtlansnYQg7JuQ7LKcIOywqOuLqO2VnOuLpCDigJQg7Y+J7Y+J7ZWcIOyKpO2CpOuniCDsi5zsoIhcbi8vIOydtCDsobDtlansnbQgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J2EIO2GteqzvO2VtCAxMy41ayDqsbTsnZgg7Jik7Je8IOydkeuLteydhCDrp4zrk6Ag7Iuk7IKs6rOg6rCAIOq3vOqxsC5cbi8vIHVuaW9uIOydhCByZXN1bHQgcHJvcGVydHkg7JWI7JeQIOykkeyyqe2VmOuKlCDsnbTsnKA6IE9wZW5BSSBzdHJ1Y3R1cmVkIG91dHB1dHMg64qUIOujqO2KuOqwgFxuLy8gb2JqZWN0IOyXrOyVvCDtlZjqs6AgdG9wLWxldmVsIGFueU9mIOulvCDqsbDrtoDtlZzri6QuIOykkeyyqSBhbnlPZiDsmYAgbWluSXRlbXMg64qUIOyngOybkOuQnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyU2NoZW1hPzogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcbiAgY29uc3QgdG9vbERlc2NyaXB0aW9ucyA9IHRvb2xzXG4gICAgLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gSlNPTi5zdHJpbmdpZnkodG9vbC5pbnB1dFNjaGVtYSk7XG4gICAgICByZXR1cm4gYC0gJHt0b29sLm5hbWV9OiAke3Rvb2wuZGVzY3JpcHRpb24gPz8gXCJcIn1cXG4gIGlucHV0U2NoZW1hOiAke3NjaGVtYX1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3Qgbm9ybWFsaXplZEFuc3dlclNjaGVtYSA9XG4gICAgYW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWJhc2VVc2VyT3V0cHV0U2NoZW1hKGFuc3dlclNjaGVtYSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJVc2UgdGhpcyBzY2hlbWEgb25seSB0aHJvdWdoIFN0cnVjdHVyZWRPdXRwdXQuIERvIG5vdCBpbnZva2UgbGlzdGVkIGNsaWVudCB0b29scyBhcyBuYXRpdmUgQ2xhdWRlIENvZGUgdG9vbHMuIFRvIHJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24sIHNldCByZXN1bHQuYWN0aW9uIHRvIHRvb2xfY2FsbCBhbmQgaW5jbHVkZSByZXN1bHQudG9vbENhbGxzLiBVc2UgYWN0aW9uIGFuc3dlciBvbmx5IHdoZW4gbm8gZnVydGhlciBjbGllbnQgdG9vbCByZXN1bHQgaXMgbmVlZGVkLlwiLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBhbnlPZjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJGaW5hbCBhbnN3ZXIuIFVzZSBvbmx5IHdoZW4gbm8gZnVydGhlciBjbGllbnQgdG9vbCByZXN1bHQgaXMgbmVlZGVkLlwiLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICBhY3Rpb246IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1wiYW5zd2VyXCJdIH0sXG4gICAgICAgICAgICAgIGFuc3dlcjpcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkQW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8geyB0eXBlOiBcInN0cmluZ1wiIH1cbiAgICAgICAgICAgICAgICAgIDogeyAkcmVmOiBVU0VSX09VVFBVVF9SRUYgfSxcbiAgICAgICAgICAgICAgdG9vbENhbGxzOiB7IHR5cGU6IFwibnVsbFwiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFtcImFjdGlvblwiLCBcImFuc3dlclwiLCBcInRvb2xDYWxsc1wiXSxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgXCJSZXF1ZXN0IGNsaWVudC1zaWRlIHRvb2wgZXhlY3V0aW9uIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmVkIG91dHB1dC4gRG8gbm90IGNhbGwgdGhlc2UgdG9vbHMgYXMgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2xzLlwiLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICBhY3Rpb246IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1widG9vbF9jYWxsXCJdIH0sXG4gICAgICAgICAgICAgIGFuc3dlcjogeyB0eXBlOiBcIm51bGxcIiB9LFxuICAgICAgICAgICAgICB0b29sQ2FsbHM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgbWluSXRlbXM6IDEsXG4gICAgICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICBlbnVtOiB0b29scy5tYXAoKHRvb2wpID0+IHRvb2wubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDbGllbnQtc2lkZSB0b29sIG5hbWUgdG8gcmVxdWVzdCB0aHJvdWdoIHN0cnVjdHVyZWQgb3V0cHV0LiBEbyBub3QgY2FsbCB0aGlzIGFzIGEgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2wuXFxuJHt0b29sRGVzY3JpcHRpb25zfWAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHRoZSBjbGllbnQtc2lkZSB0b29sLlwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0b29sTmFtZVwiLCBcImFyZ3NcIl0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtcInJlc3VsdFwiXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgLi4uKG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgJGRlZnM6IHtcbiAgICAgICAgICAgIFtVU0VSX09VVFBVVF9ERUZJTklUSU9OXTogbm9ybWFsaXplZEFuc3dlclNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmViYXNlVXNlck91dHB1dFNjaGVtYShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIHJldHVybiByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIFwiJFwiKTtcbn1cblxuY29uc3QgTUFQX0tFWVdPUkRTID0gbmV3IFNldDxzdHJpbmc+KFNDSEVNQV9NQVBfS0VZV09SRFMpO1xuY29uc3QgQVJSQVlfS0VZV09SRFMgPSBuZXcgU2V0PHN0cmluZz4oU0NIRU1BX0FSUkFZX0tFWVdPUkRTKTtcbmNvbnN0IFNJTkdMRV9LRVlXT1JEUyA9IG5ldyBTZXQ8c3RyaW5nPihTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTKTtcblxuZnVuY3Rpb24gcmV3cml0ZVNjaGVtYU5vZGUodmFsdWU6IEpzb25WYWx1ZSwgcGF0aDogc3RyaW5nKTogSnNvblZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT47XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHsgLi4uc291cmNlIH07XG5cbiAgZm9yIChjb25zdCB1bnN1cHBvcnRlZEtleXdvcmQgb2YgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oc291cmNlLCB1bnN1cHBvcnRlZEtleXdvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAgIGAke3Vuc3VwcG9ydGVkS2V5d29yZH0gaXMgbm90IHN1cHBvcnRlZGAsXG4gICAgICAgIGAke3BhdGh9LiR7dW5zdXBwb3J0ZWRLZXl3b3JkfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcIiRyZWZcIiBpbiBzb3VyY2UpIHtcbiAgICBjb25zdCByZWYgPSBzb3VyY2UuJHJlZjtcbiAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJzdHJpbmdcIiB8fCAocmVmICE9PSBcIiNcIiAmJiAhcmVmLnN0YXJ0c1dpdGgoXCIjL1wiKSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgXCJvbmx5IHJvb3QtcmVsYXRpdmUgSlNPTiBQb2ludGVyICRyZWYgdmFsdWVzIGFyZSBzdXBwb3J0ZWRcIixcbiAgICAgICAgYCR7cGF0aH0uJHJlZmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQuJHJlZiA9IGAke1VTRVJfT1VUUFVUX1JFRn0ke3JlZi5zbGljZSgxKX1gO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5d29yZCwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBrZXl3b3JkUGF0aCA9IGAke3BhdGh9LiR7a2V5d29yZH1gO1xuXG4gICAgaWYgKE1BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JEICYmIGlzSnNvbk9iamVjdChjaGlsZCkpIHtcbiAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hpbGQpLm1hcCgoW25hbWUsIGRlcGVuZGVuY3ldKSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpXG4gICAgICAgICAgICA/IGRlcGVuZGVuY3lcbiAgICAgICAgICAgIDogcmV3cml0ZVNjaGVtYU5vZGUoZGVwZW5kZW5jeSwgYCR7a2V5d29yZFBhdGh9LiR7bmFtZX1gKSxcbiAgICAgICAgXSksXG4gICAgICApIGFzIEpzb25WYWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFSUkFZX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gY2hpbGQubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgICByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIGAke2tleXdvcmRQYXRofVske2luZGV4fV1gKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoU0lOR0xFX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiaXRlbXNcIiAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICByZXN1bHRba2V5d29yZF0gPSBjaGlsZC5tYXAoKHNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH1bJHtpbmRleH1dYCksXG4gICAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleXdvcmRdID0gcmV3cml0ZVNjaGVtYU5vZGUoY2hpbGQsIGtleXdvcmRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIEpzb25WYWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLFdBQVc7QUFFbkMsSUFBYSw2QkFBYixjQUFnRCxNQUFNO0NBRzNDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLDRCQUE0QixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRmpELEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFRQSxTQUFnQixvQkFBb0IsT0FBb0IsY0FBcUM7Q0FDM0YsTUFBTSxtQkFBbUIsTUFDdEIsS0FBSyxTQUFTO0VBQ2IsTUFBTSxTQUFTLEtBQUssVUFBVSxLQUFLLFdBQVc7RUFDOUMsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssZUFBZSxHQUFHLG1CQUFtQjtDQUN0RSxDQUFDLENBQUMsQ0FDRCxLQUFLLElBQUk7Q0FFWixNQUFNLHlCQUNKLGlCQUFpQixTQUFZLFNBQVksdUJBQXVCLFlBQVk7Q0FFOUUsT0FBTztFQUNMLE1BQU07RUFDTixhQUNFO0VBQ0YsWUFBWSxFQUNWLFFBQVEsRUFDTixPQUFPLENBQ0w7R0FDRSxNQUFNO0dBQ04sYUFBYTtHQUNiLFlBQVk7SUFDVixRQUFRO0tBQUUsTUFBTTtLQUFVLE1BQU0sQ0FBQyxRQUFRO0lBQUU7SUFDM0MsUUFDRSwyQkFBMkIsU0FDdkIsRUFBRSxNQUFNLFNBQVMsSUFDakIsRUFBRSxNQUFNLGdCQUFnQjtJQUM5QixXQUFXLEVBQUUsTUFBTSxPQUFPO0dBQzVCO0dBQ0EsVUFBVTtJQUFDO0lBQVU7SUFBVTtHQUFXO0dBQzFDLHNCQUFzQjtFQUN4QixHQUNBO0dBQ0UsTUFBTTtHQUNOLGFBQ0U7R0FDRixZQUFZO0lBQ1YsUUFBUTtLQUFFLE1BQU07S0FBVSxNQUFNLENBQUMsV0FBVztJQUFFO0lB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
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24tc2NoZW1hLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC90b29sLWVtdWxhdGlvbi1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0b29sIGVudmVsb3BlICsg7IKs7Jqp7J6QIG91dHB1dCDsiqTtgqTrp4gg7ZWp7ISxICjsmpTssq0g67Cp7ZalKS4g7J2R64u1IO2VtOyEneydgCB0b29sLWVtdWxhdGlvbi50cy5cbiAqXG4gKiB0b29scyDqsIAg7J6I7Ja064+EIOy1nOyihSBhbnN3ZXIg6rCAIOyCrOyaqeyekCDsiqTtgqTrp4jroZwg6rCV7KCc65CY6rKMIO2VmOugpOqzoCBlbnZlbG9wZSDsnZggYW5zd2VyIOu4jOuenOy5mOyXkFxuICog7IKs7Jqp7J6QIOyKpO2CpOuniOulvCDsi6zripTri6QuIO2GteynuOuhnCDspJHssqntlaAg7IiYIOyXhuuKlCDsnbTsnKDripQgYCRyZWZgIOqwgCDrrLjshJwg7KCI64yAIOqyveuhnOydtOq4sCDrlYzrrLgg4oCUXG4gKiBgI2Ag7J2AIFwi7J20IOyhsOqwgeydmCDro6jtirhcIuqwgCDslYTri4jrnbwgXCLstZzsooUg66y47ISc7J2YIOujqO2KuFwi6528LCDqt7jrjIDroZwg64Sj7Jy866m0IO2PrOyduO2EsOqwgCBlbnZlbG9wZSDsnYRcbiAqIOqwgOumrOy8nCDsobDsmqntnogg7JeJ65qx7ZWcIOqxuCDqsoDspp3tlZjqsowg65Cc64ukLiDqt7jrnpjshJwg7JiI7JW9IOydtOumhCDslYTrnpjroZwg7Jiu6riw6rOgIOuhnOy7rCDtj6zsnbjthLDrpbwg7J6s7J6R7ISx7ZWc64ukLlxuICpcbiAqIOuwsOqyvcK37Iuk7LihwrfsmIjsi5zCt+qxsOu2gCDrqqnroZ3snYAg7Iqk7YKsIOusuOyEnOulvCDrs7wg6rKDOlxuICogICBwYWNrYWdlcy9jbGkvc2tpbGxzL3FncmlkL3JlZmVyZW5jZXMvdG9vbC1jYWxsaW5nLWFuZC1tdWx0aXR1cm4ubWRcbiAqICAg4oaSIFwiQ29tcG9zaW5nIFRvb2xzIFdpdGggQSBVc2VyIE91dHB1dCBTY2hlbWFcIlxuICovXG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JELFxuICBTQ0hFTUFfTUFQX0tFWVdPUkRTLFxuICBTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTLFxuICBVTlNVUFBPUlRFRF9SRUZFUkVOQ0VfS0VZV09SRFMsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2pzb24tc2NoZW1hLWtleXdvcmRzXCI7XG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkVG9vbCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IFVTRVJfT1VUUFVUX0RFRklOSVRJT04gPSBcIl9fcWdyaWRfdXNlcl9vdXRwdXRcIjtcbmNvbnN0IFVTRVJfT1VUUFVUX1JFRiA9IGAjLyRkZWZzLyR7VVNFUl9PVVRQVVRfREVGSU5JVElPTn1gO1xuXG5leHBvcnQgY2xhc3MgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihgdG9vbCBzY2hlbWEgY29tcG9zaXRpb246ICR7bWVzc2FnZX0gKGF0ICR7cGF0aH0pYCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvclwiO1xuICB9XG59XG5cbi8vIGVudmVsb3BlIOuKlCByZXN1bHQg7ZWcIOqyuSDslYTrnpjsl5AgZGlzY3JpbWluYXRlZCB1bmlvbiDsnYQg65GU64ukLiDrkZAg67OA7ZiV7J2EIOusuOuylSDsiJjspIDsl5DshJxcbi8vIOyDge2YuOuwsO2DgOuhnCDrp4zrk6TslrQoYW5zd2VyIOuzgO2YleydgCBhbnN3ZXIg67mEbnVsbCDtlYTsiJgsIHRvb2xfY2FsbCDrs4DtmJXsnYAgdG9vbENhbGxzIDHqsJwg7J207IOBKVxuLy8gYGFjdGlvbjpcImFuc3dlclwiLCBhbnN3ZXI6bnVsbGAg6rCZ7J2AIO2HtO2ZlCDsobDtlansnYQg7JuQ7LKcIOywqOuLqO2VnOuLpCDigJQg7Y+J7Y+J7ZWcIOyKpO2CpOuniCDsi5zsoIhcbi8vIOydtCDsobDtlansnbQgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J2EIO2GteqzvO2VtCAxMy41ayDqsbTsnZgg7Jik7Je8IOydkeuLteydhCDrp4zrk6Ag7Iuk7IKs6rOg6rCAIOq3vOqxsC5cbi8vIHVuaW9uIOydhCByZXN1bHQgcHJvcGVydHkg7JWI7JeQIOykkeyyqe2VmOuKlCDsnbTsnKA6IE9wZW5BSSBzdHJ1Y3R1cmVkIG91dHB1dHMg64qUIOujqO2KuOqwgFxuLy8gb2JqZWN0IOyXrOyVvCDtlZjqs6AgdG9wLWxldmVsIGFueU9mIOulvCDqsbDrtoDtlZzri6QuIOykkeyyqSBhbnlPZiDsmYAgbWluSXRlbXMg64qUIOyngOybkOuQnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyU2NoZW1hPzogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcbiAgY29uc3QgdG9vbERlc2NyaXB0aW9ucyA9IHRvb2xzXG4gICAgLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hID0gSlNPTi5zdHJpbmdpZnkodG9vbC5pbnB1dFNjaGVtYSk7XG4gICAgICByZXR1cm4gYC0gJHt0b29sLm5hbWV9OiAke3Rvb2wuZGVzY3JpcHRpb24gPz8gXCJcIn1cXG4gIGlucHV0U2NoZW1hOiAke3NjaGVtYX1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3Qgbm9ybWFsaXplZEFuc3dlclNjaGVtYSA9XG4gICAgYW5zd2VyU2NoZW1hID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWJhc2VVc2VyT3V0cHV0U2NoZW1hKGFuc3dlclNjaGVtYSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJSZXR1cm4gZXhhY3RseSBvbmUgSlNPTiBvYmplY3QgbWF0Y2hpbmcgdGhpcyBzY2hlbWEgYXMgeW91ciBmaW5hbCByZXNwb25zZSwgaW5jbHVkaW5nIHdoZW4gcmVxdWVzdGluZyBhIHRvb2wuIFRoaXMgb2JqZWN0IGlzIHRoZSByZXNwb25zZSBib2R5LCBub3QgYSBjYWxsIHRvIGEgYnVpbHQtaW4gdG9vbC4gVG8gcmVxdWVzdCBjbGllbnQtc2lkZSB0b29scywgc2V0IHJlc3VsdC5hY3Rpb24gdG8gdG9vbF9jYWxsIGFuZCBpbmNsdWRlIHJlc3VsdC50b29sQ2FsbHMsIHRoZW4gZW5kIHlvdXIgdHVybi4gVGhlIGNsaWVudCBleGVjdXRlcyB0aG9zZSB0b29scyBhbmQgc3VwcGxpZXMgdGhlaXIgcmVzdWx0cyBpbiBhIGxhdGVyIHJlcXVlc3QuIERvIG5vdCBpbnZlbnQgdG9vbCByZXN1bHRzIG9yIGVtaXQgYW4gYW5zd2VyIGJlZm9yZSByZWNlaXZpbmcgdGhlIHJlcXVpcmVkIHJlc3VsdHMuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGFueU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkZpbmFsIGFuc3dlci4gVXNlIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQuXCIsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGFjdGlvbjogeyB0eXBlOiBcInN0cmluZ1wiLCBlbnVtOiBbXCJhbnN3ZXJcIl0gfSxcbiAgICAgICAgICAgICAgYW5zd2VyOlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6IFwic3RyaW5nXCIgfVxuICAgICAgICAgICAgICAgICAgOiB7ICRyZWY6IFVTRVJfT1VUUFVUX1JFRiB9LFxuICAgICAgICAgICAgICB0b29sQ2FsbHM6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIlJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24uIFJldHVybiB0aGlzIG9iamVjdCBhcyB0aGUgY29tcGxldGUgcmVzcG9uc2UsIHRoZW4gd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBjb250YWluaW5nIHRvb2wgcmVzdWx0cy5cIixcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgYWN0aW9uOiB7IHR5cGU6IFwic3RyaW5nXCIsIGVudW06IFtcInRvb2xfY2FsbFwiXSB9LFxuICAgICAgICAgICAgICBhbnN3ZXI6IHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgICAgICAgdG9vbENhbGxzOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZW51bTogdG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ2xpZW50LXNpZGUgdG9vbCBuYW1lLiBUaGUgY2FsbGVyIGV4ZWN1dGVzIHRoZXNlIHRvb2xzIGFmdGVyIHJlY2VpdmluZyB5b3VyIEpTT04gcmVzcG9uc2UuXFxuJHt0b29sRGVzY3JpcHRpb25zfWAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHRoZSBjbGllbnQtc2lkZSB0b29sLlwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJ0b29sTmFtZVwiLCBcImFyZ3NcIl0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFtcInJlc3VsdFwiXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgLi4uKG5vcm1hbGl6ZWRBbnN3ZXJTY2hlbWEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgJGRlZnM6IHtcbiAgICAgICAgICAgIFtVU0VSX09VVFBVVF9ERUZJTklUSU9OXTogbm9ybWFsaXplZEFuc3dlclNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmViYXNlVXNlck91dHB1dFNjaGVtYShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIHJldHVybiByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIFwiJFwiKTtcbn1cblxuY29uc3QgTUFQX0tFWVdPUkRTID0gbmV3IFNldDxzdHJpbmc+KFNDSEVNQV9NQVBfS0VZV09SRFMpO1xuY29uc3QgQVJSQVlfS0VZV09SRFMgPSBuZXcgU2V0PHN0cmluZz4oU0NIRU1BX0FSUkFZX0tFWVdPUkRTKTtcbmNvbnN0IFNJTkdMRV9LRVlXT1JEUyA9IG5ldyBTZXQ8c3RyaW5nPihTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTKTtcblxuZnVuY3Rpb24gcmV3cml0ZVNjaGVtYU5vZGUodmFsdWU6IEpzb25WYWx1ZSwgcGF0aDogc3RyaW5nKTogSnNvblZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT47XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHsgLi4uc291cmNlIH07XG5cbiAgZm9yIChjb25zdCB1bnN1cHBvcnRlZEtleXdvcmQgb2YgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oc291cmNlLCB1bnN1cHBvcnRlZEtleXdvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAgIGAke3Vuc3VwcG9ydGVkS2V5d29yZH0gaXMgbm90IHN1cHBvcnRlZGAsXG4gICAgICAgIGAke3BhdGh9LiR7dW5zdXBwb3J0ZWRLZXl3b3JkfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcIiRyZWZcIiBpbiBzb3VyY2UpIHtcbiAgICBjb25zdCByZWYgPSBzb3VyY2UuJHJlZjtcbiAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJzdHJpbmdcIiB8fCAocmVmICE9PSBcIiNcIiAmJiAhcmVmLnN0YXJ0c1dpdGgoXCIjL1wiKSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgXCJvbmx5IHJvb3QtcmVsYXRpdmUgSlNPTiBQb2ludGVyICRyZWYgdmFsdWVzIGFyZSBzdXBwb3J0ZWRcIixcbiAgICAgICAgYCR7cGF0aH0uJHJlZmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQuJHJlZiA9IGAke1VTRVJfT1VUUFVUX1JFRn0ke3JlZi5zbGljZSgxKX1gO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5d29yZCwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBjb25zdCBrZXl3b3JkUGF0aCA9IGAke3BhdGh9LiR7a2V5d29yZH1gO1xuXG4gICAgaWYgKE1BUF9LRVlXT1JEUy5oYXMoa2V5d29yZCkgJiYgaXNKc29uT2JqZWN0KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZCkubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH0uJHtuYW1lfWApLFxuICAgICAgICBdKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gU0NIRU1BX0RFUEVOREVOQ0lFU19LRVlXT1JEICYmIGlzSnNvbk9iamVjdChjaGlsZCkpIHtcbiAgICAgIHJlc3VsdFtrZXl3b3JkXSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hpbGQpLm1hcCgoW25hbWUsIGRlcGVuZGVuY3ldKSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpXG4gICAgICAgICAgICA/IGRlcGVuZGVuY3lcbiAgICAgICAgICAgIDogcmV3cml0ZVNjaGVtYU5vZGUoZGVwZW5kZW5jeSwgYCR7a2V5d29yZFBhdGh9LiR7bmFtZX1gKSxcbiAgICAgICAgXSksXG4gICAgICApIGFzIEpzb25WYWx1ZTtcbiAgICB9IGVsc2UgaWYgKEFSUkFZX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgcmVzdWx0W2tleXdvcmRdID0gY2hpbGQubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgICByZXdyaXRlU2NoZW1hTm9kZShzY2hlbWEsIGAke2tleXdvcmRQYXRofVske2luZGV4fV1gKSxcbiAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgIH0gZWxzZSBpZiAoU0lOR0xFX0tFWVdPUkRTLmhhcyhrZXl3b3JkKSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiaXRlbXNcIiAmJiBBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICByZXN1bHRba2V5d29yZF0gPSBjaGlsZC5tYXAoKHNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgcmV3cml0ZVNjaGVtYU5vZGUoc2NoZW1hLCBgJHtrZXl3b3JkUGF0aH1bJHtpbmRleH1dYCksXG4gICAgICAgICkgYXMgSnNvblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleXdvcmRdID0gcmV3cml0ZVNjaGVtYU5vZGUoY2hpbGQsIGtleXdvcmRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIEpzb25WYWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sa0JBQWtCLFdBQVc7QUFFbkMsSUFBYSw2QkFBYixjQUFnRCxNQUFNO0NBRzNDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLDRCQUE0QixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRmpELEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFRQSxTQUFnQixvQkFBb0IsT0FBb0IsY0FBcUM7Q0FDM0YsTUFBTSxtQkFBbUIsTUFDdEIsS0FBSyxTQUFTO0VBQ2IsTUFBTSxTQUFTLEtBQUssVUFBVSxLQUFLLFdBQVc7RUFDOUMsT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssZUFBZSxHQUFHLG1CQUFtQjtDQUN0RSxDQUFDLENBQUMsQ0FDRCxLQUFLLElBQUk7Q0FFWixNQUFNLHlCQUNKLGlCQUFpQixTQUFZLFNBQVksdUJBQXVCLFlBQVk7Q0FFOUUsT0FBTztFQUNMLE1BQU07RUFDTixhQUNFO0VBQ0YsWUFBWSxFQUNWLFFBQVEsRUFDTixPQUFPLENBQ0w7R0FDRSxNQUFNO0dBQ04sYUFBYTtHQUNiLFlBQVk7SUFDVixRQUFRO0tBQUUsTUFBTTtLQUFVLE1BQU0sQ0FBQyxRQUFRO0lBQUU7SUFDM0MsUUFDRSwyQkFBMkIsU0FDdkIsRUFBRSxNQUFNLFNBQVMsSUFDakIsRUFBRSxNQUFN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
@@ -38,6 +38,18 @@ function applyToolCallEmulation(result, tools, options) {
38
38
  if (parsed.action === "tool_call") return toolCallOutput(result, parsed.toolCalls, images, runContext);
39
39
  return answerOutput(result, answerKind === "text" ? parsed.answer : JSON.stringify(parsed.answer), images, runContext);
40
40
  }
41
+ function isToolCallEnvelope(text, tools, answerKind, phase) {
42
+ if (phase === "commentary") {
43
+ let value;
44
+ try {
45
+ value = JSON.parse(text);
46
+ } catch {
47
+ return false;
48
+ }
49
+ if (!value || typeof value !== "object" || !("result" in value) || !value.result || typeof value.result !== "object" || !("action" in value.result) || value.result.action !== "tool_call") return false;
50
+ }
51
+ return parseEnvelope(text, tools, answerKind).action === "tool_call";
52
+ }
41
53
  function parseEnvelope(text, tools, answerKind) {
42
54
  if (Buffer.byteLength(text, "utf8") > STRUCTURED_ENVELOPE_LIMITS.maxUtf8Bytes) throw new ToolCallEmulationError(`tool envelope exceeds UTF-8 byte limit of ${STRUCTURED_ENVELOPE_LIMITS.maxUtf8Bytes}`);
43
55
  let value;
@@ -125,6 +137,6 @@ function assertStructuredEnvelopeComplexity(root) {
125
137
  }
126
138
  }
127
139
  //#endregion
128
- export { ToolCallEmulationError, applyToolCallEmulation };
140
+ export { ToolCallEmulationError, applyToolCallEmulation, isToolCallEnvelope };
129
141
 
130
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gUHJlc2VydmUgaW1hZ2UgYnl0ZXMgYW5kIHRoZSBwcm92aWRlcidzIHJlc29sdmVkIE1JTUUgdHlwZS5cbmludGVyZmFjZSBFbXVsYXRpb25JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbWVkaWFUeXBlPzogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W1wibWVkaWFUeXBlXCJdO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAuLi4oaW1hZ2UubWVkaWFUeXBlID8geyBtZWRpYVR5cGU6IGltYWdlLm1lZGlhVHlwZSB9IDoge30pLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxP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
142
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gUHJlc2VydmUgaW1hZ2UgYnl0ZXMgYW5kIHRoZSBwcm92aWRlcidzIHJlc29sdmVkIE1JTUUgdHlwZS5cbmludGVyZmFjZSBFbXVsYXRpb25JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbWVkaWFUeXBlPzogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W1wibWVkaWFUeXBlXCJdO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb2xDYWxsRW52ZWxvcGUoXG4gIHRleHQ6IHN0cmluZyxcbiAgdG9vbHM6IFFncmlkVG9vbFtdLFxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kLFxuICBwaGFzZT86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBpZiAocGhhc2UgPT09IFwiY29tbWVudGFyeVwiKSB7XG4gICAgLy8gQ29tbWVudGFyeSBpcyBub3QgdGhlIHN0cnVjdHVyZWQgYW5zd2VyLiBPbmx5IGFuIGV4cGxpY2l0IHRvb2wgY29udHJvbFxuICAgIC8vIG9iamVjdCBpcyBlbGlnaWJsZSwgYW5kIHRoYXQgb2JqZWN0IG11c3Qgc3RpbGwgcGFzcyB0aGUgc3RyaWN0IHBhcnNlci5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJyZXN1bHRcIiBpbiB2YWx1ZSkgfHxcbiAgICAgICF2YWx1ZS5yZXN1bHQgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZS5yZXN1bHQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJhY3Rpb25cIiBpbiB2YWx1ZS5yZXN1bHQpIHx8XG4gICAgICB2YWx1ZS5yZXN1bHQuYWN0aW9uICE9PSBcInRvb2xfY2FsbFwiXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBwYXJzZUVudmVsb3BlKHRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKS5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAuLi4oaW1hZ2UubWVkaWFUeXBlID8geyBtZWRpYVR5cGU6IGltYWdlLm1lZGlhVHlwZSB9IDoge30pLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxPQUFPLElBQ1QsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLEVBQzNDLFNBQVMsMEJBQ1gsQ0FBQztFQUNQLFdBQVcsRUFBRSxLQUFLO0NB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