@cartanova/qgrid-cli 2.10.3 → 2.10.5

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 (78) hide show
  1. package/bundle/dist/application/qgrid/qgrid-image-generation.js +6 -2
  2. package/bundle/dist/application/qgrid/qgrid-response-format.js +4 -4
  3. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +63 -140
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -6
  5. package/bundle/dist/application/qgrid/qgrid.types.js +4 -8
  6. package/bundle/dist/application/request-log/request-log.model.js +21 -15
  7. package/bundle/dist/application/setting/setting.model.js +2 -64
  8. package/bundle/dist/application/setting/setting.store.js +3 -4
  9. package/bundle/dist/application/setting/setting.types.js +2 -12
  10. package/bundle/dist/i18n/en.js +1 -3
  11. package/bundle/dist/i18n/ko.js +1 -3
  12. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +19 -8
  13. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +18 -0
  14. package/bundle/src/application/qgrid/qgrid-image-generation.ts +14 -3
  15. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +9 -0
  16. package/bundle/src/application/qgrid/qgrid-response-format.ts +10 -7
  17. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +0 -111
  18. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +82 -178
  19. package/bundle/src/application/qgrid/qgrid.frame.test.ts +0 -38
  20. package/bundle/src/application/qgrid/qgrid.frame.ts +4 -6
  21. package/bundle/src/application/qgrid/qgrid.types.ts +14 -4
  22. package/bundle/src/application/request-log/request-log.model.test.ts +17 -12
  23. package/bundle/src/application/request-log/request-log.model.ts +8 -2
  24. package/bundle/src/application/setting/setting.model.test.ts +1 -101
  25. package/bundle/src/application/setting/setting.model.ts +0 -73
  26. package/bundle/src/application/setting/setting.store.ts +2 -3
  27. package/bundle/src/application/setting/setting.types.ts +0 -12
  28. package/bundle/src/application/sonamu.generated.http +2 -7
  29. package/bundle/src/i18n/en.ts +0 -3
  30. package/bundle/src/i18n/ko.ts +0 -3
  31. package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +19 -1
  32. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +22 -0
  33. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +12 -0
  34. package/bundle/web-dist/client/assets/cost-CY2BJEPC.js +1 -0
  35. package/bundle/web-dist/client/assets/index-CvG4UB9v.css +1 -0
  36. package/bundle/web-dist/client/assets/{index-BIC1sQxw.js → index-Dxw7DiXF.js} +4 -4
  37. package/bundle/web-dist/client/assets/logs-3n_U4qnI.js +1 -0
  38. package/bundle/web-dist/client/assets/{monit-CraVV3MQ.js → monit-E8eGW1Sj.js} +1 -1
  39. package/bundle/web-dist/client/assets/{routes-B3ZBoJ60.js → routes-7spLfIGZ.js} +2 -2
  40. package/bundle/web-dist/client/assets/services.generated-jnPHYMER.js +51 -0
  41. package/bundle/web-dist/client/assets/settings-BdosZFNC.js +1 -0
  42. package/bundle/web-dist/client/assets/{show-ItTExdAh.js → show-b2PFNI3D.js} +1 -1
  43. package/bundle/web-dist/client/assets/{tokens-BynKx8Vn.js → tokens-CBdHb2_U.js} +1 -1
  44. package/bundle/web-dist/client/assets/{use-oauth-login-flow-8xw6on5P.js → use-oauth-login-flow-Cyn3YPqW.js} +1 -1
  45. package/bundle/web-dist/client/assets/{use-update-token-mutation-D-Y8OySK.js → use-update-token-mutation-DQCwCYfR.js} +1 -1
  46. package/bundle/web-dist/client/index.html +3 -3
  47. package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-59jBdx-I.js} +8 -3
  48. package/bundle/web-dist/server/assets/{lazyRouteComponent-Bj1cPq6x.js → lazyRouteComponent-CUR-kWzI.js} +2 -2
  49. package/bundle/web-dist/server/assets/{logs-BSk9lOHe.js → logs-CaaWO9-Z.js} +9 -7
  50. package/bundle/web-dist/server/assets/{monit-D9W4ioUi.js → monit-CBil92fJ.js} +4 -4
  51. package/bundle/web-dist/server/assets/{plus-CmvbWuDf.js → plus-Bvdj8Pwx.js} +1 -1
  52. package/bundle/web-dist/server/assets/{react-dom-BjR1Iaz8.js → react-dom-CyuShs9K.js} +1 -1
  53. package/bundle/web-dist/server/assets/{refresh-cw-B8U9BL9-.js → refresh-cw-3QAiSWBd.js} +1 -1
  54. package/bundle/web-dist/server/assets/{routes-C7lB2Q85.js → routes-DtVf9yqo.js} +7 -7
  55. package/bundle/web-dist/server/assets/{services.generated-BM4X3Ecj.js → services.generated-FPwsG9p3.js} +116 -131
  56. package/bundle/web-dist/server/assets/{settings-BFVuldch.js → settings-DeHNwoMv.js} +40 -251
  57. package/bundle/web-dist/server/assets/{show-Cswh_tqs.js → show-8NNdRxhM.js} +3 -3
  58. package/bundle/web-dist/server/assets/{tokens-DiTUwUwr.js → tokens-odgS2-9q.js} +4 -4
  59. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DYKnG4A2.js → use-oauth-login-flow-DTQKdYBO.js} +1 -1
  60. package/bundle/web-dist/server/assets/{use-update-token-mutation-DqGMopII.js → use-update-token-mutation-xvXbPrCI.js} +1 -1
  61. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  62. package/package.json +3 -2
  63. package/skills/qgrid/SKILL.md +1 -1
  64. package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
  65. package/skills/qgrid/references/cli-env-and-server-boot.md +12 -9
  66. package/skills/qgrid/references/decision-rationale.md +2 -2
  67. package/skills/qgrid/references/openai-codex-runtime.md +5 -1
  68. package/bundle/dist/utils/process-supervisor.js +0 -22
  69. package/bundle/dist/utils/server-restart.js +0 -61
  70. package/bundle/src/utils/process-supervisor.test.ts +0 -24
  71. package/bundle/src/utils/process-supervisor.ts +0 -17
  72. package/bundle/src/utils/server-restart.test.ts +0 -76
  73. package/bundle/src/utils/server-restart.ts +0 -68
  74. package/bundle/web-dist/client/assets/cost-CpjVoAqp.js +0 -1
  75. package/bundle/web-dist/client/assets/index-D_sagzsR.css +0 -1
  76. package/bundle/web-dist/client/assets/logs-zvdujZWn.js +0 -1
  77. package/bundle/web-dist/client/assets/services.generated-Cbvg2sGQ.js +0 -51
  78. package/bundle/web-dist/client/assets/settings-DwbzT5jo.js +0 -1
@@ -20,14 +20,6 @@ const SettingSource = z.enum([
20
20
  "env",
21
21
  "default"
22
22
  ]);
23
- /**
24
- * 프로세스를 다시 띄워주는 도구. 재시작은 스스로 종료하고 이 도구에 맡기므로,
25
- * 없으면(null) 화면에서 재시작을 시도조차 하지 않는다.
26
- *
27
- * API 반환 타입에 쓰이므로 zod 로 둔다 — sonamu syncer 가 클라이언트 코드를 만들 때
28
- * 타입만 있는 선언은 모듈을 찾지 못한다.
29
- */
30
- const SupervisorKind = z.enum(["pm2"]);
31
23
  const SettingItem = z.object({
32
24
  key: z.string(),
33
25
  group: z.string(),
@@ -52,12 +44,10 @@ const RuntimeInfoItem = z.object({
52
44
  const SettingsResponse = z.object({
53
45
  settings: SettingItem.array(),
54
46
  runtime: RuntimeInfoItem.array(),
55
- /** null 이면 재시작 버튼을 쓸 수 없다 — 종료해도 되살릴 주체가 없다. */
56
- supervisor: SupervisorKind.nullable(),
57
47
  /** 이 인스턴스가 keepalive 스케줄러를 소유하도록 명시적으로 허용됐는지. */
58
48
  keepaliveRunnerEnabled: z.boolean()
59
49
  });
60
50
  //#endregion
61
- export { RuntimeInfoItem, SettingApplies, SettingItem, SettingKind, SettingListParams, SettingSaveParams, SettingSource, SettingsResponse, SupervisorKind };
51
+ export { RuntimeInfoItem, SettingApplies, SettingItem, SettingKind, SettingListParams, SettingSaveParams, SettingSource, SettingsResponse };
62
52
 
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy50eXBlcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNldHRpbmdCYXNlU2NoZW1hLCBTZXR0aW5nQmFzZUxpc3RQYXJhbXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuXG4vLyBTZXR0aW5nIC0gTGlzdFBhcmFtc1xuZXhwb3J0IGNvbnN0IFNldHRpbmdMaXN0UGFyYW1zID0gU2V0dGluZ0Jhc2VMaXN0UGFyYW1zO1xuZXhwb3J0IHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nTGlzdFBhcmFtcz47XG5cbi8vIFNldHRpbmcgLSBTYXZlUGFyYW1zXG5leHBvcnQgY29uc3QgU2V0dGluZ1NhdmVQYXJhbXMgPSBTZXR0aW5nQmFzZVNjaGVtYS5wYXJ0aWFsKHsgaWQ6IHRydWUsIGNyZWF0ZWRfYXQ6IHRydWUgfSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nU2F2ZVBhcmFtcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdTYXZlUGFyYW1zPjtcblxuLy8g4pSA4pSAIOyEpOyglSBBUEkg7J2R64u1IOyKpO2CpOuniCDilIDilIBcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdLaW5kID0gei5lbnVtKFtcImJvb2xlYW5cIiwgXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwic2VjcmV0XCIsIFwicHJlc2V0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdLaW5kID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ0tpbmQ+O1xuXG5leHBvcnQgY29uc3QgU2V0dGluZ0FwcGxpZXMgPSB6LmVudW0oW1wiaW1tZWRpYXRlXCIsIFwicmVzdGFydFwiXSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nQXBwbGllcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdBcHBsaWVzPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdTb3VyY2UgPSB6LmVudW0oW1wiZGJcIiwgXCJlbnZcIiwgXCJkZWZhdWx0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdTb3VyY2UgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nU291cmNlPjtcblxuLyoqXG4gKiDtlITroZzshLjsiqTrpbwg64uk7IucIOudhOybjOyjvOuKlCDrj4TqtawuIOyerOyLnOyekeydgCDsiqTsiqTroZwg7KKF66OM7ZWY6rOgIOydtCDrj4Tqtazsl5Ag66eh6riw66+A66GcLFxuICog7JeG7Jy866m0KG51bGwpIO2ZlOuptOyXkOyEnCDsnqzsi5zsnpHsnYQg7Iuc64+E7KGw7LCoIO2VmOyngCDslYrripTri6QuXG4gKlxuICogQVBJIOuwmO2ZmCDtg4DsnoXsl5Ag7JOw7J2066+A66GcIHpvZCDroZwg65GU64ukIOKAlCBzb25hbXUgc3luY2VyIOqwgCDtgbTrnbzsnbTslrjtirgg7L2U65Oc66W8IOunjOuTpCDrlYxcbiAqIO2DgOyeheunjCDsnojripQg7ISg7Ja47J2AIOuqqOuTiOydhCDssL7sp4Ag66q77ZWc64ukLlxuICovXG5leHBvcnQgY29uc3QgU3VwZXJ2aXNvcktpbmQgPSB6LmVudW0oW1wicG0yXCJdKTtcbmV4cG9ydCB0eXBlIFN1cGVydmlzb3JLaW5kID0gei5pbmZlcjx0eXBlb2YgU3VwZXJ2aXNvcktpbmQ+O1xuXG5leHBvcnQgY29uc3QgU2V0dGluZ0l0ZW0gPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgZ3JvdXA6IHouc3RyaW5nKCksXG4gIGxhYmVsOiB6LnN0cmluZygpLFxuICBraW5kOiBTZXR0aW5nS2luZCxcbiAgYXBwbGllczogU2V0dGluZ0FwcGxpZXMsXG4gIC8qKiDtmITsnqwg7KCB7JqpIOykkeyduCDqsJIuIOuIiCDthqDquIDsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBzZWNyZXQg64+EIOybkOuzuOycvOuhnCDrgrTroKTqsITri6QuICovXG4gIHZhbHVlOiB6LnN0cmluZygpLFxuICAvKiog7J20IOqwkuydtCDslrTrlJTshJwg7JmU64qU7KeALiDtmZTrqbTsl5DshJwg7Lac7LKY66W8IOuztOyXrOykmOyVvCBcIuyZnCDslYgg67CU64CM7KeAXCLqsIAg7JeG64ukLiAqL1xuICBzb3VyY2U6IFNldHRpbmdTb3VyY2UsXG4gIG1pbjogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICBtYXg6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgLyoqIGBwcmVzZXRgIOyiheulmOyXkOyEnCDqs6Drpbwg7IiYIOyeiOuKlCDqsJIuIOuLpOuluCDsooXrpZjripQg67mIIOuwsOyXtC4gKi9cbiAgcHJlc2V0czogei5udW1iZXIoKS5hcnJheSgpLFxuICBoZWxwOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIFNldHRpbmdJdGVtID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ0l0ZW0+O1xuXG4vKiog7ZmU66m07JeQ7IScIOuwlOq/gCDsiJgg7JeG64qUIOq4sOuPmSDsi5zsoJAg6rCS65OkIOKAlCDslrTrlqQg7ZmY6rK97JeQIOu2meyWtCDsnojripTsp4Ag7ZmV7J247JqpLiAqL1xuZXhwb3J0IGNvbnN0IFJ1bnRpbWVJbmZvSXRlbSA9IHoub2JqZWN0KHtcbiAgbGFiZWw6IHouc3RyaW5nKCksXG4gIHZhbHVlOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBSdW50aW1lSW5mb0l0ZW0gPSB6LmluZmVyPHR5cGVvZiBSdW50aW1lSW5mb0l0ZW0+O1xuXG5leHBvcnQgY29uc3QgU2V0dGluZ3NSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc2V0dGluZ3M6IFNldHRpbmdJdGVtLmFycmF5KCksXG4gIHJ1bnRpbWU6IFJ1bnRpbWVJbmZvSXRlbS5hcnJheSgpLFxuICAvKiogbnVsbCDsnbTrqbQg7J6s7Iuc7J6RIOuyhO2KvOydhCDsk7gg7IiYIOyXhuuLpCDigJQg7KKF66OM7ZW064+EIOuQmOyCtOumtCDso7zssrTqsIAg7JeG64ukLiAqL1xuICBzdXBlcnZpc29yOiBTdXBlcnZpc29yS2luZC5udWxsYWJsZSgpLFxuICAvKiog7J20IOyduOyKpO2EtOyKpOqwgCBrZWVwYWxpdmUg7Iqk7LyA7KSE65+s66W8IOyGjOycoO2VmOuPhOuhnSDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp65CQ64qU7KeALiAqL1xuICBrZWVwYWxpdmVSdW5uZXJFbmFibGVkOiB6LmJvb2xlYW4oKSxcbn0pO1xuZXhwb3J0IHR5cGUgU2V0dGluZ3NSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdzUmVzcG9uc2U+O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFLQSxNQUFhLG9CQUFvQjtBQUlqQyxNQUFhLG9CQUFvQixrQkFBa0IsUUFBUTtDQUFFLElBQUk7Q0FBTSxZQUFZO0FBQUssQ0FBQztBQUt6RixNQUFhLGNBQWMsRUFBRSxLQUFLO0NBQUM7Q0FBVztDQUFXO0NBQVU7Q0FBVTtDQUFVO0FBQVEsQ0FBQztBQUdoRyxNQUFhLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxhQUFhLFNBQVMsQ0FBQztBQUc3RCxNQUFhLGdCQUFnQixFQUFFLEtBQUs7Q0FBQztDQUFNO0NBQU87QUFBUyxDQUFDOzs7Ozs7OztBQVU1RCxNQUFhLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFHNUMsTUFBYSxjQUFjLEVBQUUsT0FBTztDQUNsQyxLQUFLLEVBQUUsT0FBTztDQUNkLE9BQU8sRUFBRSxPQUFPO0NBQ2hCLE9BQU8sRUFBRSxPQUFPO0NBQ2hCLE1BQU07Q0FDTixTQUFTOztDQUVULE9BQU8sRUFBRSxPQUFPOztDQUVoQixRQUFRO0NBQ1IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7O0NBRXpCLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNO0NBQzFCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQzVCLENBQUM7O0FBSUQsTUFBYSxrQkFBa0IsRUFBRSxPQUFPO0NBQ3RDLE9BQU8sRUFBRSxPQUFPO0NBQ2hCLE9BQU8sRUFBRSxPQUFPO0FBQ2xCLENBQUM7QUFHRCxNQUFhLG1CQUFtQixFQUFFLE9BQU87Q0FDdkMsVUFBVSxZQUFZLE1BQU07Q0FDNUIsU0FBUyxnQkFBZ0IsTUFBTTs7Q0FFL0IsWUFBWSxlQUFlLFNBQVM7O0NBRXBDLHdCQUF3QixFQUFFLFFBQVE7QUFDcEMsQ0FBQyJ9
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy50eXBlcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFNldHRpbmdCYXNlU2NoZW1hLCBTZXR0aW5nQmFzZUxpc3RQYXJhbXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuXG4vLyBTZXR0aW5nIC0gTGlzdFBhcmFtc1xuZXhwb3J0IGNvbnN0IFNldHRpbmdMaXN0UGFyYW1zID0gU2V0dGluZ0Jhc2VMaXN0UGFyYW1zO1xuZXhwb3J0IHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nTGlzdFBhcmFtcz47XG5cbi8vIFNldHRpbmcgLSBTYXZlUGFyYW1zXG5leHBvcnQgY29uc3QgU2V0dGluZ1NhdmVQYXJhbXMgPSBTZXR0aW5nQmFzZVNjaGVtYS5wYXJ0aWFsKHsgaWQ6IHRydWUsIGNyZWF0ZWRfYXQ6IHRydWUgfSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nU2F2ZVBhcmFtcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdTYXZlUGFyYW1zPjtcblxuLy8g4pSA4pSAIOyEpOyglSBBUEkg7J2R64u1IOyKpO2CpOuniCDilIDilIBcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdLaW5kID0gei5lbnVtKFtcImJvb2xlYW5cIiwgXCJpbnRlZ2VyXCIsIFwibnVtYmVyXCIsIFwic3RyaW5nXCIsIFwic2VjcmV0XCIsIFwicHJlc2V0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdLaW5kID0gei5pbmZlcjx0eXBlb2YgU2V0dGluZ0tpbmQ+O1xuXG5leHBvcnQgY29uc3QgU2V0dGluZ0FwcGxpZXMgPSB6LmVudW0oW1wiaW1tZWRpYXRlXCIsIFwicmVzdGFydFwiXSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nQXBwbGllcyA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdBcHBsaWVzPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdTb3VyY2UgPSB6LmVudW0oW1wiZGJcIiwgXCJlbnZcIiwgXCJkZWZhdWx0XCJdKTtcbmV4cG9ydCB0eXBlIFNldHRpbmdTb3VyY2UgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nU291cmNlPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdJdGVtID0gei5vYmplY3Qoe1xuICBrZXk6IHouc3RyaW5nKCksXG4gIGdyb3VwOiB6LnN0cmluZygpLFxuICBsYWJlbDogei5zdHJpbmcoKSxcbiAga2luZDogU2V0dGluZ0tpbmQsXG4gIGFwcGxpZXM6IFNldHRpbmdBcHBsaWVzLFxuICAvKiog7ZiE7J6sIOyggeyaqSDspJHsnbgg6rCSLiDriIgg7Yag6riA7J2EIOyngOybkO2VmOq4sCDsnITtlbQgc2VjcmV0IOuPhCDsm5Drs7jsnLzroZwg64K066Ck6rCE64ukLiAqL1xuICB2YWx1ZTogei5zdHJpbmcoKSxcbiAgLyoqIOydtCDqsJLsnbQg7Ja065SU7IScIOyZlOuKlOyngC4g7ZmU66m07JeQ7IScIOy2nOyymOulvCDrs7Tsl6zspJjslbwgXCLsmZwg7JWIIOuwlOuAjOyngFwi6rCAIOyXhuuLpC4gKi9cbiAgc291cmNlOiBTZXR0aW5nU291cmNlLFxuICBtaW46IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgbWF4OiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gIC8qKiBgcHJlc2V0YCDsooXrpZjsl5DshJwg6rOg66W8IOyImCDsnojripQg6rCSLiDri6Trpbgg7KKF66WY64qUIOu5iCDrsLDsl7QuICovXG4gIHByZXNldHM6IHoubnVtYmVyKCkuYXJyYXkoKSxcbiAgaGVscDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxufSk7XG5leHBvcnQgdHlwZSBTZXR0aW5nSXRlbSA9IHouaW5mZXI8dHlwZW9mIFNldHRpbmdJdGVtPjtcblxuLyoqIO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuKlCDquLDrj5kg7Iuc7KCQIOqwkuuTpCDigJQg7Ja065akIO2ZmOqyveyXkCDrtpnslrQg7J6I64qU7KeAIO2ZleyduOyaqS4gKi9cbmV4cG9ydCBjb25zdCBSdW50aW1lSW5mb0l0ZW0gPSB6Lm9iamVjdCh7XG4gIGxhYmVsOiB6LnN0cmluZygpLFxuICB2YWx1ZTogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUnVudGltZUluZm9JdGVtID0gei5pbmZlcjx0eXBlb2YgUnVudGltZUluZm9JdGVtPjtcblxuZXhwb3J0IGNvbnN0IFNldHRpbmdzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHNldHRpbmdzOiBTZXR0aW5nSXRlbS5hcnJheSgpLFxuICBydW50aW1lOiBSdW50aW1lSW5mb0l0ZW0uYXJyYXkoKSxcbiAgLyoqIOydtCDsnbjsiqTthLTsiqTqsIAga2VlcGFsaXZlIOyKpOy8gOykhOufrOulvCDshozsnKDtlZjrj4TroZ0g66qF7Iuc7KCB7Jy866GcIO2XiOyaqeuQkOuKlOyngC4gKi9cbiAga2VlcGFsaXZlUnVubmVyRW5hYmxlZDogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIFNldHRpbmdzUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBTZXR0aW5nc1Jlc3BvbnNlPjtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsTUFBYSxvQkFBb0I7QUFJakMsTUFBYSxvQkFBb0Isa0JBQWtCLFFBQVE7Q0FBRSxJQUFJO0NBQU0sWUFBWTtBQUFLLENBQUM7QUFLekYsTUFBYSxjQUFjLEVBQUUsS0FBSztDQUFDO0NBQVc7Q0FBVztDQUFVO0NBQVU7Q0FBVTtBQUFRLENBQUM7QUFHaEcsTUFBYSxpQkFBaUIsRUFBRSxLQUFLLENBQUMsYUFBYSxTQUFTLENBQUM7QUFHN0QsTUFBYSxnQkFBZ0IsRUFBRSxLQUFLO0NBQUM7Q0FBTTtDQUFPO0FBQVMsQ0FBQztBQUc1RCxNQUFhLGNBQWMsRUFBRSxPQUFPO0NBQ2xDLEtBQUssRUFBRSxPQUFPO0NBQ2QsT0FBTyxFQUFFLE9BQU87Q0FDaEIsT0FBTyxFQUFFLE9BQU87Q0FDaEIsTUFBTTtDQUNOLFNBQVM7O0NBRVQsT0FBTyxFQUFFLE9BQU87O0NBRWhCLFFBQVE7Q0FDUixLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUN6QixLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUzs7Q0FFekIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU07Q0FDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7QUFDNUIsQ0FBQzs7QUFJRCxNQUFhLGtCQUFrQixFQUFFLE9BQU87Q0FDdEMsT0FBTyxFQUFFLE9BQU87Q0FDaEIsT0FBTyxFQUFFLE9BQU87QUFDbEIsQ0FBQztBQUdELE1BQWEsbUJBQW1CLEVBQUUsT0FBTztDQUN2QyxVQUFVLFlBQVksTUFBTTtDQUM1QixTQUFTLGdCQUFnQixNQUFNOztDQUUvQix3QkFBd0IsRUFBRSxRQUFRO0FBQ3BDLENBQUMifQ==
@@ -50,10 +50,8 @@ var en_default = {
50
50
  "error.serviceUnavailable": "Service unavailable",
51
51
  "setting.invalidValue": (reason) => `Invalid setting value: ${reason}`,
52
52
  "setting.unknownKey": (key) => `Unknown setting key ${key}`,
53
- "setting.noSupervisor": () => "Restart is unavailable when running locally — nothing would bring the server back up",
54
53
  "qgrid.dispatcherFailed": (provider) => `${provider} dispatcher failed to initialize`,
55
54
  "qgrid.dispatcherStarting": (provider) => `${provider} dispatcher is starting up. Please retry shortly`,
56
- "qgrid.restartPending": () => "Server restart is in progress. Please retry shortly",
57
55
  "error.unauthorized": "Unauthorized",
58
56
  notFound: (name, id) => `${name} ID ${id} not found`,
59
57
  "validation.email": "Invalid email format",
@@ -65,4 +63,4 @@ var en_default = {
65
63
  //#endregion
66
64
  export { en_default as default };
67
65
 
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2kxOG4vZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSBcInNvbmFtdS9kaWN0XCI7XG5cbi8qKlxuICogUHJvamVjdCBFTiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCJjb21tb24uYWxsXCI6IFwiQWxsXCIsXG4gIFwiY29tbW9uLmJhY2tUb0xpc3RcIjogXCJCYWNrIHRvIExpc3RcIixcbiAgXCJjb21tb24uY2FuY2VsXCI6IFwiQ2FuY2VsXCIsXG4gIFwiY29tbW9uLmNsb3NlXCI6IFwiQ2xvc2VcIixcbiAgXCJjb21tb24uY29uZmlybVwiOiBcIkNvbmZpcm1cIixcbiAgXCJjb21tb24uY3JlYXRlXCI6IFwiQ3JlYXRlXCIsXG4gIFwiY29tbW9uLmNyZWF0ZWRBdFwiOiBcIkNyZWF0ZWQgQXRcIixcbiAgXCJjb21tb24uZGVsZXRlXCI6IFwiRGVsZXRlXCIsXG4gIFwiY29tbW9uLmVkaXRcIjogXCJFZGl0XCIsXG4gIFwiY29tbW9uLmxvZ2luXCI6IFwiTG9naW5cIixcbiAgXCJjb21tb24ubG9nb3V0XCI6IFwiTG9nb3V0XCIsXG4gIFwiY29tbW9uLm1hbmFnZVwiOiBcIk1hbmFnZVwiLFxuICBcImNvbW1vbi5yZXN1bHRzXCI6IChjb3VudDogbnVtYmVyKSA9PlxuICAgIHBsdXJhbChjb3VudCwgeyBvbmU6IGAke2NvdW50fSByZXN1bHRgLCBvdGhlcjogYCR7Y291bnR9IHJlc3VsdHNgIH0pLFxuICBcImNvbW1vbi5zYXZlXCI6IFwiU2F2ZVwiLFxuICBcImNvbW1vbi5zZWFyY2hcIjogXCJTZWFyY2hcIixcbiAgXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIjogXCJTZWFyY2guLi5cIixcbiAgXCJjb21tb24uc2VhcmNoVHlwZVwiOiBcIlNlYXJjaCBUeXBlXCIsXG4gIFwiY29tbW9uLnNvcnRcIjogXCJTb3J0XCIsXG4gIFwiY29uZmlybS5kZWxldGVcIjogXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlP1wiLFxuICBcImNvbmZpcm0uc2F2ZVwiOiBcIkRvIHlvdSB3YW50IHRvIHNhdmU/XCIsXG4gIFwiZGFzaGJvYXJkLmFkbWluTWVudVwiOiBcIkFkbWluIE1lbnVcIixcbiAgXCJkYXNoYm9hcmQuY3JlYXRlZEF0XCI6IFwiSm9pbmVkXCIsXG4gIFwiZGFzaGJvYXJkLmVtYWlsXCI6IFwiRW1haWxcIixcbiAgXCJkYXNoYm9hcmQubG9naW5SZXF1aXJlZFwiOiBcIlBsZWFzZSBsb2dpbiB0byBjb250aW51ZS5cIixcbiAgXCJkYXNoYm9hcmQubmFtZVwiOiBcIk5hbWVcIixcbiAgXCJkYXNoYm9hcmQucm9sZVwiOiBcIlJvbGVcIixcbiAgXCJkYXNoYm9hcmQudGl0bGVcIjogXCJBZG1pbiBEYXNoYm9hcmRcIixcbiAgXCJkYXNoYm9hcmQud2VsY29tZVwiOiBcIldlbGNvbWUhXCIsXG4gIFwiZGVsZXRlLmNvbmZpcm0uZGVzY3JpcHRpb25cIjpcbiAgICBcIlRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIFRoaXMgd2lsbCBwZXJtYW5lbnRseSBkZWxldGUgdGhpcyBpdGVtLlwiLFxuICBcImRlbGV0ZS5jb25maXJtLnRpdGxlXCI6IFwiQXJlIHlvdSBzdXJlP1wiLFxuICBcImVudGl0eS5jcmVhdGVcIjogKG5hbWU6IHN0cmluZykgPT4gYENyZWF0ZSAke25hbWV9YCxcbiAgXCJlbnRpdHkuZWRpdFwiOiAobmFtZTogc3RyaW5nLCBpZDogbnVtYmVyKSA9PiBgRWRpdCAke25hbWV9ICgjJHtpZH0pYCxcbiAgXCJlbnRpdHkubGlzdFwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSBMaXN0YCxcbiAgXCJlbnRpdHkubGlzdE1hbmFnZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgTWFuYWdlICR7bmFtZX0gTGlzdGAsXG4gIFwiZXJyb3IuYWxyZWFkeVByb2Nlc3NlZFwiOiBcIkFscmVhZHkgcHJvY2Vzc2VkXCIsXG4gIFwiZXJyb3IuYmFkUmVxdWVzdFwiOiBcIkJhZCByZXF1ZXN0XCIsXG4gIFwiZXJyb3IuZHVwbGljYXRlUm93XCI6IFwiRHVwbGljYXRlIGRhdGFcIixcbiAgXCJlcnJvci5mb3JiaWRkZW5cIjogXCJGb3JiaWRkZW5cIixcbiAgXCJlcnJvci5pbnRlcm5hbFNlcnZlckVycm9yXCI6IFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG4gIFwiZXJyb3Iubm90Rm91bmRcIjogXCJOb3QgZm91bmRcIixcbiAgXCJlcnJvci5zZXJ2aWNlVW5hdmFpbGFibGVcIjogXCJTZXJ2aWNlIHVuYXZhaWxhYmxlXCIsXG4gIFwic2V0dGluZy5pbnZhbGlkVmFsdWVcIjogKHJlYXNvbjogc3RyaW5nKSA9PiBgSW52YWxpZCBzZXR0aW5nIHZhbHVlOiAke3JlYXNvbn1gLFxuICBcInNldHRpbmcudW5rbm93bktleVwiOiAoa2V5OiBzdHJpbmcpID0+IGBVbmtub3duIHNldHRpbmcga2V5ICR7a2V5fWAsXG4gIFwic2V0dGluZy5ub1N1cGVydmlzb3JcIjogKCkgPT5cbiAgICBcIlJlc3RhcnQgaXMgdW5hdmFpbGFibGUgd2hlbiBydW5uaW5nIGxvY2FsbHkg4oCUIG5vdGhpbmcgd291bGQgYnJpbmcgdGhlIHNlcnZlciBiYWNrIHVwXCIsXG4gIFwicWdyaWQuZGlzcGF0Y2hlckZhaWxlZFwiOiAocHJvdmlkZXI6IHN0cmluZykgPT4gYCR7cHJvdmlkZXJ9IGRpc3BhdGNoZXIgZmFpbGVkIHRvIGluaXRpYWxpemVgLFxuICBcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiOiAocHJvdmlkZXI6IHN0cmluZykgPT5cbiAgICBgJHtwcm92aWRlcn0gZGlzcGF0Y2hlciBpcyBzdGFydGluZyB1cC4gUGxlYXNlIHJldHJ5IHNob3J0bHlgLFxuICBcInFncmlkLnJlc3RhcnRQZW5kaW5nXCI6ICgpID0+IFwiU2VydmVyIHJlc3RhcnQgaXMgaW4gcHJvZ3Jlc3MuIFBsZWFzZSByZXRyeSBzaG9ydGx5XCIsXG4gIFwiZXJyb3IudW5hdXRob3JpemVkXCI6IFwiVW5hdXRob3JpemVkXCIsXG4gIG5vdEZvdW5kOiAobmFtZTogc3RyaW5nLCBpZDogbnVtYmVyKSA9PiBgJHtuYW1lfSBJRCAke2lkfSBub3QgZm91bmRgLFxuICBcInZhbGlkYXRpb24uZW1haWxcIjogXCJJbnZhbGlkIGVtYWlsIGZvcm1hdFwiLFxuICBcInZhbGlkYXRpb24ubWF4TGVuZ3RoXCI6IChmaWVsZDogc3RyaW5nLCBtYXg6IG51bWJlcikgPT5cbiAgICBgJHtmaWVsZH0gbXVzdCBiZSBhdCBtb3N0ICR7bWF4fSBjaGFyYWN0ZXJzYCxcbiAgXCJ2YWxpZGF0aW9uLm1pbkxlbmd0aFwiOiAoZmllbGQ6IHN0cmluZywgbWluOiBudW1iZXIpID0+XG4gICAgYCR7ZmllbGR9IG11c3QgYmUgYXQgbGVhc3QgJHttaW59IGNoYXJhY3RlcnNgLFxuICBcInZhbGlkYXRpb24ucmVxdWlyZWRcIjogKGZpZWxkOiBzdHJpbmcpID0+IGAke2ZpZWxkfSBpcyByZXF1aXJlZGAsXG4gIFwidmFsaWRhdGlvbi51cmxcIjogXCJJbnZhbGlkIFVSTCBmb3JtYXRcIixcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsSUFBQSxhQUFlO0NBQ2IsY0FBYztDQUNkLHFCQUFxQjtDQUNyQixpQkFBaUI7Q0FDakIsZ0JBQWdCO0NBQ2hCLGtCQUFrQjtDQUNsQixpQkFBaUI7Q0FDakIsb0JBQW9CO0NBQ3BCLGlCQUFpQjtDQUNqQixlQUFlO0NBQ2YsZ0JBQWdCO0NBQ2hCLGlCQUFpQjtDQUNqQixpQkFBaUI7Q0FDakIsbUJBQW1CLFVBQ2pCLE9BQU8sT0FBTztFQUFFLEtBQUssR0FBRyxNQUFNO0VBQVUsT0FBTyxHQUFHLE1BQU07Q0FBVSxDQUFDO0NBQ3JFLGVBQWU7Q0FDZixpQkFBaUI7Q0FDakIsNEJBQTRCO0NBQzVCLHFCQUFxQjtDQUNyQixlQUFlO0NBQ2Ysa0JBQWtCO0NBQ2xCLGdCQUFnQjtDQUNoQix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLG1CQUFtQjtDQUNuQiwyQkFBMkI7Q0FDM0Isa0JBQWtCO0NBQ2xCLGtCQUFrQjtDQUNsQixtQkFBbUI7Q0FDbkIscUJBQXFCO0NBQ3JCLDhCQUNFO0NBQ0Ysd0JBQXdCO0NBQ3hCLGtCQUFrQixTQUFpQixVQUFVO0NBQzdDLGdCQUFnQixNQUFjLE9BQWUsUUFBUSxLQUFLLEtBQUssR0FBRztDQUNsRSxnQkFBZ0IsU0FBaUIsR0FBRyxLQUFLO0NBQ3pDLHNCQUFzQixTQUFpQixVQUFVLEtBQUs7Q0FDdEQsMEJBQTBCO0NBQzFCLG9CQUFvQjtDQUNwQixzQkFBc0I7Q0FDdEIsbUJBQW1CO0NBQ25CLDZCQUE2QjtDQUM3QixrQkFBa0I7Q0FDbEIsNEJBQTRCO0NBQzVCLHlCQUF5QixXQUFtQiwwQkFBMEI7Q0FDdEUsdUJBQXVCLFFBQWdCLHVCQUF1QjtDQUM5RCw4QkFDRTtDQUNGLDJCQUEyQixhQUFxQixHQUFHLFNBQVM7Q0FDNUQsNkJBQTZCLGFBQzNCLEdBQUcsU0FBUztDQUNkLDhCQUE4QjtDQUM5QixzQkFBc0I7Q0FDdEIsV0FBVyxNQUFjLE9BQWUsR0FBRyxLQUFLLE1BQU0sR0FBRztDQUN6RCxvQkFBb0I7Q0FDcEIseUJBQXlCLE9BQWUsUUFDdEMsR0FBRyxNQUFNLG1CQUFtQixJQUFJO0NBQ2xDLHlCQUF5QixPQUFlLFFBQ3RDLEdBQUcsTUFBTSxvQkFBb0IsSUFBSTtDQUNuQyx3QkFBd0IsVUFBa0IsR0FBRyxNQUFNO0NBQ25ELGtCQUFrQjtBQUNwQiJ9
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW4uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2kxOG4vZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSBcInNvbmFtdS9kaWN0XCI7XG5cbi8qKlxuICogUHJvamVjdCBFTiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgXCJjb21tb24uYWxsXCI6IFwiQWxsXCIsXG4gIFwiY29tbW9uLmJhY2tUb0xpc3RcIjogXCJCYWNrIHRvIExpc3RcIixcbiAgXCJjb21tb24uY2FuY2VsXCI6IFwiQ2FuY2VsXCIsXG4gIFwiY29tbW9uLmNsb3NlXCI6IFwiQ2xvc2VcIixcbiAgXCJjb21tb24uY29uZmlybVwiOiBcIkNvbmZpcm1cIixcbiAgXCJjb21tb24uY3JlYXRlXCI6IFwiQ3JlYXRlXCIsXG4gIFwiY29tbW9uLmNyZWF0ZWRBdFwiOiBcIkNyZWF0ZWQgQXRcIixcbiAgXCJjb21tb24uZGVsZXRlXCI6IFwiRGVsZXRlXCIsXG4gIFwiY29tbW9uLmVkaXRcIjogXCJFZGl0XCIsXG4gIFwiY29tbW9uLmxvZ2luXCI6IFwiTG9naW5cIixcbiAgXCJjb21tb24ubG9nb3V0XCI6IFwiTG9nb3V0XCIsXG4gIFwiY29tbW9uLm1hbmFnZVwiOiBcIk1hbmFnZVwiLFxuICBcImNvbW1vbi5yZXN1bHRzXCI6IChjb3VudDogbnVtYmVyKSA9PlxuICAgIHBsdXJhbChjb3VudCwgeyBvbmU6IGAke2NvdW50fSByZXN1bHRgLCBvdGhlcjogYCR7Y291bnR9IHJlc3VsdHNgIH0pLFxuICBcImNvbW1vbi5zYXZlXCI6IFwiU2F2ZVwiLFxuICBcImNvbW1vbi5zZWFyY2hcIjogXCJTZWFyY2hcIixcbiAgXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIjogXCJTZWFyY2guLi5cIixcbiAgXCJjb21tb24uc2VhcmNoVHlwZVwiOiBcIlNlYXJjaCBUeXBlXCIsXG4gIFwiY29tbW9uLnNvcnRcIjogXCJTb3J0XCIsXG4gIFwiY29uZmlybS5kZWxldGVcIjogXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlP1wiLFxuICBcImNvbmZpcm0uc2F2ZVwiOiBcIkRvIHlvdSB3YW50IHRvIHNhdmU/XCIsXG4gIFwiZGFzaGJvYXJkLmFkbWluTWVudVwiOiBcIkFkbWluIE1lbnVcIixcbiAgXCJkYXNoYm9hcmQuY3JlYXRlZEF0XCI6IFwiSm9pbmVkXCIsXG4gIFwiZGFzaGJvYXJkLmVtYWlsXCI6IFwiRW1haWxcIixcbiAgXCJkYXNoYm9hcmQubG9naW5SZXF1aXJlZFwiOiBcIlBsZWFzZSBsb2dpbiB0byBjb250aW51ZS5cIixcbiAgXCJkYXNoYm9hcmQubmFtZVwiOiBcIk5hbWVcIixcbiAgXCJkYXNoYm9hcmQucm9sZVwiOiBcIlJvbGVcIixcbiAgXCJkYXNoYm9hcmQudGl0bGVcIjogXCJBZG1pbiBEYXNoYm9hcmRcIixcbiAgXCJkYXNoYm9hcmQud2VsY29tZVwiOiBcIldlbGNvbWUhXCIsXG4gIFwiZGVsZXRlLmNvbmZpcm0uZGVzY3JpcHRpb25cIjpcbiAgICBcIlRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIFRoaXMgd2lsbCBwZXJtYW5lbnRseSBkZWxldGUgdGhpcyBpdGVtLlwiLFxuICBcImRlbGV0ZS5jb25maXJtLnRpdGxlXCI6IFwiQXJlIHlvdSBzdXJlP1wiLFxuICBcImVudGl0eS5jcmVhdGVcIjogKG5hbWU6IHN0cmluZykgPT4gYENyZWF0ZSAke25hbWV9YCxcbiAgXCJlbnRpdHkuZWRpdFwiOiAobmFtZTogc3RyaW5nLCBpZDogbnVtYmVyKSA9PiBgRWRpdCAke25hbWV9ICgjJHtpZH0pYCxcbiAgXCJlbnRpdHkubGlzdFwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSBMaXN0YCxcbiAgXCJlbnRpdHkubGlzdE1hbmFnZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgTWFuYWdlICR7bmFtZX0gTGlzdGAsXG4gIFwiZXJyb3IuYWxyZWFkeVByb2Nlc3NlZFwiOiBcIkFscmVhZHkgcHJvY2Vzc2VkXCIsXG4gIFwiZXJyb3IuYmFkUmVxdWVzdFwiOiBcIkJhZCByZXF1ZXN0XCIsXG4gIFwiZXJyb3IuZHVwbGljYXRlUm93XCI6IFwiRHVwbGljYXRlIGRhdGFcIixcbiAgXCJlcnJvci5mb3JiaWRkZW5cIjogXCJGb3JiaWRkZW5cIixcbiAgXCJlcnJvci5pbnRlcm5hbFNlcnZlckVycm9yXCI6IFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG4gIFwiZXJyb3Iubm90Rm91bmRcIjogXCJOb3QgZm91bmRcIixcbiAgXCJlcnJvci5zZXJ2aWNlVW5hdmFpbGFibGVcIjogXCJTZXJ2aWNlIHVuYXZhaWxhYmxlXCIsXG4gIFwic2V0dGluZy5pbnZhbGlkVmFsdWVcIjogKHJlYXNvbjogc3RyaW5nKSA9PiBgSW52YWxpZCBzZXR0aW5nIHZhbHVlOiAke3JlYXNvbn1gLFxuICBcInNldHRpbmcudW5rbm93bktleVwiOiAoa2V5OiBzdHJpbmcpID0+IGBVbmtub3duIHNldHRpbmcga2V5ICR7a2V5fWAsXG4gIFwicWdyaWQuZGlzcGF0Y2hlckZhaWxlZFwiOiAocHJvdmlkZXI6IHN0cmluZykgPT4gYCR7cHJvdmlkZXJ9IGRpc3BhdGNoZXIgZmFpbGVkIHRvIGluaXRpYWxpemVgLFxuICBcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiOiAocHJvdmlkZXI6IHN0cmluZykgPT5cbiAgICBgJHtwcm92aWRlcn0gZGlzcGF0Y2hlciBpcyBzdGFydGluZyB1cC4gUGxlYXNlIHJldHJ5IHNob3J0bHlgLFxuICBcImVycm9yLnVuYXV0aG9yaXplZFwiOiBcIlVuYXV0aG9yaXplZFwiLFxuICBub3RGb3VuZDogKG5hbWU6IHN0cmluZywgaWQ6IG51bWJlcikgPT4gYCR7bmFtZX0gSUQgJHtpZH0gbm90IGZvdW5kYCxcbiAgXCJ2YWxpZGF0aW9uLmVtYWlsXCI6IFwiSW52YWxpZCBlbWFpbCBmb3JtYXRcIixcbiAgXCJ2YWxpZGF0aW9uLm1heExlbmd0aFwiOiAoZmllbGQ6IHN0cmluZywgbWF4OiBudW1iZXIpID0+XG4gICAgYCR7ZmllbGR9IG11c3QgYmUgYXQgbW9zdCAke21heH0gY2hhcmFjdGVyc2AsXG4gIFwidmFsaWRhdGlvbi5taW5MZW5ndGhcIjogKGZpZWxkOiBzdHJpbmcsIG1pbjogbnVtYmVyKSA9PlxuICAgIGAke2ZpZWxkfSBtdXN0IGJlIGF0IGxlYXN0ICR7bWlufSBjaGFyYWN0ZXJzYCxcbiAgXCJ2YWxpZGF0aW9uLnJlcXVpcmVkXCI6IChmaWVsZDogc3RyaW5nKSA9PiBgJHtmaWVsZH0gaXMgcmVxdWlyZWRgLFxuICBcInZhbGlkYXRpb24udXJsXCI6IFwiSW52YWxpZCBVUkwgZm9ybWF0XCIsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUtBLElBQUEsYUFBZTtDQUNiLGNBQWM7Q0FDZCxxQkFBcUI7Q0FDckIsaUJBQWlCO0NBQ2pCLGdCQUFnQjtDQUNoQixrQkFBa0I7Q0FDbEIsaUJBQWlCO0NBQ2pCLG9CQUFvQjtDQUNwQixpQkFBaUI7Q0FDakIsZUFBZTtDQUNmLGdCQUFnQjtDQUNoQixpQkFBaUI7Q0FDakIsaUJBQWlCO0NBQ2pCLG1CQUFtQixVQUNqQixPQUFPLE9BQU87RUFBRSxLQUFLLEdBQUcsTUFBTTtFQUFVLE9BQU8sR0FBRyxNQUFNO0NBQVUsQ0FBQztDQUNyRSxlQUFlO0NBQ2YsaUJBQWlCO0NBQ2pCLDRCQUE0QjtDQUM1QixxQkFBcUI7Q0FDckIsZUFBZTtDQUNmLGtCQUFrQjtDQUNsQixnQkFBZ0I7Q0FDaEIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2QixtQkFBbUI7Q0FDbkIsMkJBQTJCO0NBQzNCLGtCQUFrQjtDQUNsQixrQkFBa0I7Q0FDbEIsbUJBQW1CO0NBQ25CLHFCQUFxQjtDQUNyQiw4QkFDRTtDQUNGLHdCQUF3QjtDQUN4QixrQkFBa0IsU0FBaUIsVUFBVTtDQUM3QyxnQkFBZ0IsTUFBYyxPQUFlLFFBQVEsS0FBSyxLQUFLLEdBQUc7Q0FDbEUsZ0JBQWdCLFNBQWlCLEdBQUcsS0FBSztDQUN6QyxzQkFBc0IsU0FBaUIsVUFBVSxLQUFLO0NBQ3RELDBCQUEwQjtDQUMxQixvQkFBb0I7Q0FDcEIsc0JBQXNCO0NBQ3RCLG1CQUFtQjtDQUNuQiw2QkFBNkI7Q0FDN0Isa0JBQWtCO0NBQ2xCLDRCQUE0QjtDQUM1Qix5QkFBeUIsV0FBbUIsMEJBQTBCO0NBQ3RFLHVCQUF1QixRQUFnQix1QkFBdUI7Q0FDOUQsMkJBQTJCLGFBQXFCLEdBQUcsU0FBUztDQUM1RCw2QkFBNkIsYUFDM0IsR0FBRyxTQUFTO0NBQ2Qsc0JBQXNCO0NBQ3RCLFdBQVcsTUFBYyxPQUFlLEdBQUcsS0FBSyxNQUFNLEdBQUc7Q0FDekQsb0JBQW9CO0NBQ3BCLHlCQUF5QixPQUFlLFFBQ3RDLEdBQUcsTUFBTSxtQkFBbUIsSUFBSTtDQUNsQyx5QkFBeUIsT0FBZSxRQUN0QyxHQUFHLE1BQU0sb0JBQW9CLElBQUk7Q0FDbkMsd0JBQXdCLFVBQWtCLEdBQUcsTUFBTTtDQUNuRCxrQkFBa0I7QUFDcEIifQ==
@@ -48,10 +48,8 @@ var ko_default = {
48
48
  "error.serviceUnavailable": "서비스를 사용할 수 없습니다",
49
49
  "setting.invalidValue": (reason) => `설정 값이 올바르지 않습니다: ${reason}`,
50
50
  "setting.unknownKey": (key) => `알 수 없는 설정 키 ${key}`,
51
- "setting.noSupervisor": () => "로컬 실행 환경에서는 재시작할 수 없습니다 — 종료하면 다시 켜줄 모니터링 도구가 없습니다",
52
51
  "qgrid.dispatcherFailed": (provider) => `${provider} dispatcher 초기화에 실패했습니다`,
53
52
  "qgrid.dispatcherStarting": (provider) => `${provider} dispatcher 기동 중입니다. 잠시 후 다시 시도해주세요`,
54
- "qgrid.restartPending": () => "서버 재시작 중입니다. 잠시 후 다시 시도해주세요",
55
53
  "error.unauthorized": "인증이 필요합니다",
56
54
  "error.unknownSearchField": (field) => `구현되지 않은 검색 필드 ${field}`,
57
55
  notFound: (name, id) => `존재하지 않는 ${name} ID ${id}`,
@@ -64,4 +62,4 @@ var ko_default = {
64
62
  //#endregion
65
63
  export { ko_default as default };
66
64
 
67
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia28uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2kxOG4va28udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9zYSB9IGZyb20gXCJzb25hbXUvZGljdFwiO1xuXG4vKipcbiAqIFByb2plY3QgS08gRGljdGlvbmFyeVxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiY29tbW9uLmFsbFwiOiBcIuyghOyytFwiLFxuICBcImNvbW1vbi5iYWNrVG9MaXN0XCI6IFwi66qp66Gd7Jy866GcXCIsXG4gIFwiY29tbW9uLmNhbmNlbFwiOiBcIuy3qOyGjFwiLFxuICBcImNvbW1vbi5jbG9zZVwiOiBcIuuLq+q4sFwiLFxuICBcImNvbW1vbi5jb25maXJtXCI6IFwi7ZmV7J24XCIsXG4gIFwiY29tbW9uLmNyZWF0ZVwiOiBcIuyDneyEsVwiLFxuICBcImNvbW1vbi5jcmVhdGVkQXRcIjogXCLrk7HroZ1cIixcbiAgXCJjb21tb24uZGVsZXRlXCI6IFwi7IKt7KCcXCIsXG4gIFwiY29tbW9uLmVkaXRcIjogXCLsiJjsoJVcIixcbiAgXCJjb21tb24ubG9naW5cIjogXCLroZzqt7jsnbhcIixcbiAgXCJjb21tb24ubG9nb3V0XCI6IFwi66Gc6re47JWE7JuDXCIsXG4gIFwiY29tbW9uLm1hbmFnZVwiOiBcIuq0gOumrFwiLFxuICBcImNvbW1vbi5yZXN1bHRzXCI6IChjb3VudDogbnVtYmVyKSA9PiBgJHtjb3VudH3qsJwg6rKw6rO8YCxcbiAgXCJjb21tb24uc2F2ZVwiOiBcIuyggOyepVwiLFxuICBcImNvbW1vbi5zZWFyY2hcIjogXCLqsoDsg4lcIixcbiAgXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIjogXCLqsoDsg4kuLi5cIixcbiAgXCJjb21tb24uc2VhcmNoVHlwZVwiOiBcIuqygOyDiSDsnKDtmJVcIixcbiAgXCJjb21tb24uc29ydFwiOiBcIuygleugrFwiLFxuICBcImNvbmZpcm0uZGVsZXRlXCI6IFwi7KCV66eQIOyCreygnO2VmOyLnOqyoOyKteuLiOq5jD9cIixcbiAgXCJjb25maXJtLnNhdmVcIjogXCLsoIDsnqXtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIFwiZGFzaGJvYXJkLmFkbWluTWVudVwiOiBcIuq0gOumrCDrqZTribRcIixcbiAgXCJkYXNoYm9hcmQuY3JlYXRlZEF0XCI6IFwi6rCA7J6F7J28XCIsXG4gIFwiZGFzaGJvYXJkLmVtYWlsXCI6IFwi7J2066mU7J28XCIsXG4gIFwiZGFzaGJvYXJkLmxvZ2luUmVxdWlyZWRcIjogXCLroZzqt7jsnbjsnbQg7ZWE7JqU7ZWp64uI64ukLlwiLFxuICBcImRhc2hib2FyZC5uYW1lXCI6IFwi7J2066aEXCIsXG4gIFwiZGFzaGJvYXJkLnJvbGVcIjogXCLsl63tlaBcIixcbiAgXCJkYXNoYm9hcmQudGl0bGVcIjogXCLqtIDrpqzsnpAg64yA7Iuc67O065OcXCIsXG4gIFwiZGFzaGJvYXJkLndlbGNvbWVcIjogXCLtmZjsmIHtlanri4jri6QhXCIsXG4gIFwiZGVsZXRlLmNvbmZpcm0uZGVzY3JpcHRpb25cIjogXCLsnbQg7J6R7JeF7J2AIOy3qOyGjO2VoCDsiJgg7JeG7Iq164uI64ukLiDtla3rqqnsnbQg7JiB6rWs7KCB7Jy866GcIOyCreygnOuQqeuLiOuLpC5cIixcbiAgXCJkZWxldGUuY29uZmlybS50aXRsZVwiOiBcIuygleunkCDsgq3soJztlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIFwiZW50aXR5LmNyZWF0ZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSDsg53shLFgLFxuICBcImVudGl0eS5lZGl0XCI6IChuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXIpID0+IGAke25hbWV9IOyImOyglSAoIyR7aWR9KWAsXG4gIFwiZW50aXR5Lmxpc3RcIjogKG5hbWU6IHN0cmluZykgPT4gYCR7bmFtZX0g66qp66GdYCxcbiAgXCJlbnRpdHkubGlzdE1hbmFnZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSDrqqnroZ0g6rSA66asYCxcbiAgXCJlcnJvci5hbHJlYWR5UHJvY2Vzc2VkXCI6IFwi7J2066+4IOyymOumrOuQmOyXiOyKteuLiOuLpFwiLFxuICBcImVycm9yLmJhZFJlcXVlc3RcIjogXCLsnpjrqrvrkJwg7JqU7LKt7J6F64uI64ukXCIsXG4gIFwiZXJyb3IuZHVwbGljYXRlUm93XCI6IFwi7KSR67O165CcIOuNsOydtO2EsOyeheuLiOuLpFwiLFxuICBcImVycm9yLmVudGl0eU5vdEZvdW5kXCI6IChuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXIgfCBzdHJpbmcpID0+IGDsobTsnqztlZjsp4Ag7JWK64qUICR7bmFtZX0gSUQgJHtpZH1gLFxuICBcImVycm9yLmZvcmJpZGRlblwiOiBcIuq2jO2VnOydtCDsl4bsirXri4jri6RcIixcbiAgXCJlcnJvci5pbnRlcm5hbFNlcnZlckVycm9yXCI6IFwi7ISc67KEIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6RcIixcbiAgXCJlcnJvci5ub3RGb3VuZFwiOiBcIuywvuydhCDsiJgg7JeG7Iq164uI64ukXCIsXG4gIFwiZXJyb3Iuc2VydmljZVVuYXZhaWxhYmxlXCI6IFwi7ISc67mE7Iqk66W8IOyCrOyaqe2VoCDsiJgg7JeG7Iq164uI64ukXCIsXG4gIFwic2V0dGluZy5pbnZhbGlkVmFsdWVcIjogKHJlYXNvbjogc3RyaW5nKSA9PiBg7ISk7KCVIOqwkuydtCDsmKzrsJTrpbTsp4Ag7JWK7Iq164uI64ukOiAke3JlYXNvbn1gLFxuICBcInNldHRpbmcudW5rbm93bktleVwiOiAoa2V5OiBzdHJpbmcpID0+IGDslYwg7IiYIOyXhuuKlCDshKTsoJUg7YKkICR7a2V5fWAsXG4gIFwic2V0dGluZy5ub1N1cGVydmlzb3JcIjogKCkgPT5cbiAgICBcIuuhnOy7rCDsi6Ttlokg7ZmY6rK97JeQ7ISc64qUIOyerOyLnOyeke2VoCDsiJgg7JeG7Iq164uI64ukIOKAlCDsooXro4ztlZjrqbQg64uk7IucIOy8nOykhCDrqqjri4jthLDrp4Eg64+E6rWs6rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInFncmlkLmRpc3BhdGNoZXJGYWlsZWRcIjogKHByb3ZpZGVyOiBzdHJpbmcpID0+IGAke3Byb3ZpZGVyfSBkaXNwYXRjaGVyIOy0iOq4sO2ZlOyXkCDsi6TtjKjtlojsirXri4jri6RgLFxuICBcInFncmlkLmRpc3BhdGNoZXJTdGFydGluZ1wiOiAocHJvdmlkZXI6IHN0cmluZykgPT5cbiAgICBgJHtwcm92aWRlcn0gZGlzcGF0Y2hlciDquLDrj5kg7KSR7J6F64uI64ukLiDsnqDsi5wg7ZuEIOuLpOyLnCDsi5zrj4TtlbTso7zshLjsmpRgLFxuICBcInFncmlkLnJlc3RhcnRQZW5kaW5nXCI6ICgpID0+IFwi7ISc67KEIOyerOyLnOyekSDspJHsnoXri4jri6QuIOyeoOyLnCDtm4Qg64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalFwiLFxuICBcImVycm9yLnVuYXV0aG9yaXplZFwiOiBcIuyduOymneydtCDtlYTsmpTtlanri4jri6RcIixcbiAgXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIjogKGZpZWxkOiBzdHJpbmcpID0+IGDqtaztmITrkJjsp4Ag7JWK7J2AIOqygOyDiSDtlYTrk5wgJHtmaWVsZH1gLFxuICBub3RGb3VuZDogKG5hbWU6IHN0cmluZywgaWQ6IG51bWJlcikgPT4gYOyhtOyerO2VmOyngCDslYrripQgJHtuYW1lfSBJRCAke2lkfWAsXG4gIFwidmFsaWRhdGlvbi5lbWFpbFwiOiBcIuyYrOuwlOuluCDsnbTrqZTsnbwg7ZiV7Iud7J20IOyVhOuLmeuLiOuLpFwiLFxuICBcInZhbGlkYXRpb24ubWF4TGVuZ3RoXCI6IChmaWVsZDogc3RyaW5nLCBtYXg6IG51bWJlcikgPT5cbiAgICBgJHtmaWVsZH0ke2pvc2EoZmllbGQsIFwi7J2A64qUXCIpfSDstZzrjIAgJHttYXh97J6Q6rmM7KeAIOyeheugpe2VoCDsiJgg7J6I7Iq164uI64ukYCxcbiAgXCJ2YWxpZGF0aW9uLm1pbkxlbmd0aFwiOiAoZmllbGQ6IHN0cmluZywgbWluOiBudW1iZXIpID0+XG4gICAgYCR7ZmllbGR9JHtqb3NhKGZpZWxkLCBcIuydgOuKlFwiKX0g7LWc7IaMICR7bWlufeyekCDsnbTsg4HsnbTslrTslbwg7ZWp64uI64ukYCxcbiAgXCJ2YWxpZGF0aW9uLnJlcXVpcmVkXCI6IChmaWVsZDogc3RyaW5nKSA9PiBgJHtqb3NhKGZpZWxkLCBcIuydgOuKlFwiKX0g7ZWE7IiY7J6F64uI64ukYCxcbiAgXCJ2YWxpZGF0aW9uLnVybFwiOiBcIuyYrOuwlOuluCBVUkwg7ZiV7Iud7J20IOyVhOuLmeuLiOuLpFwiLFxufSBhcyBjb25zdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxJQUFBLGFBQWU7Q0FDYixjQUFjO0NBQ2QscUJBQXFCO0NBQ3JCLGlCQUFpQjtDQUNqQixnQkFBZ0I7Q0FDaEIsa0JBQWtCO0NBQ2xCLGlCQUFpQjtDQUNqQixvQkFBb0I7Q0FDcEIsaUJBQWlCO0NBQ2pCLGVBQWU7Q0FDZixnQkFBZ0I7Q0FDaEIsaUJBQWlCO0NBQ2pCLGlCQUFpQjtDQUNqQixtQkFBbUIsVUFBa0IsR0FBRyxNQUFNO0NBQzlDLGVBQWU7Q0FDZixpQkFBaUI7Q0FDakIsNEJBQTRCO0NBQzVCLHFCQUFxQjtDQUNyQixlQUFlO0NBQ2Ysa0JBQWtCO0NBQ2xCLGdCQUFnQjtDQUNoQix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLG1CQUFtQjtDQUNuQiwyQkFBMkI7Q0FDM0Isa0JBQWtCO0NBQ2xCLGtCQUFrQjtDQUNsQixtQkFBbUI7Q0FDbkIscUJBQXFCO0NBQ3JCLDhCQUE4QjtDQUM5Qix3QkFBd0I7Q0FDeEIsa0JBQWtCLFNBQWlCLEdBQUcsS0FBSztDQUMzQyxnQkFBZ0IsTUFBYyxPQUFlLEdBQUcsS0FBSyxRQUFRLEdBQUc7Q0FDaEUsZ0JBQWdCLFNBQWlCLEdBQUcsS0FBSztDQUN6QyxzQkFBc0IsU0FBaUIsR0FBRyxLQUFLO0NBQy9DLDBCQUEwQjtDQUMxQixvQkFBb0I7Q0FDcEIsc0JBQXNCO0NBQ3RCLHlCQUF5QixNQUFjLE9BQXdCLFdBQVcsS0FBSyxNQUFNO0NBQ3JGLG1CQUFtQjtDQUNuQiw2QkFBNkI7Q0FDN0Isa0JBQWtCO0NBQ2xCLDRCQUE0QjtDQUM1Qix5QkFBeUIsV0FBbUIsb0JBQW9CO0NBQ2hFLHVCQUF1QixRQUFnQixlQUFlO0NBQ3RELDhCQUNFO0NBQ0YsMkJBQTJCLGFBQXFCLEdBQUcsU0FBUztDQUM1RCw2QkFBNkIsYUFDM0IsR0FBRyxTQUFTO0NBQ2QsOEJBQThCO0NBQzlCLHNCQUFzQjtDQUN0Qiw2QkFBNkIsVUFBa0IsaUJBQWlCO0NBQ2hFLFdBQVcsTUFBYyxPQUFlLFdBQVcsS0FBSyxNQUFNO0NBQzlELG9CQUFvQjtDQUNwQix5QkFBeUIsT0FBZSxRQUN0QyxHQUFHLFFBQVEsS0FBSyxPQUFPLElBQUksRUFBRSxNQUFNLElBQUk7Q0FDekMseUJBQXlCLE9BQWUsUUFDdEMsR0FBRyxRQUFRLEtBQUssT0FBTyxJQUFJLEVBQUUsTUFBTSxJQUFJO0NBQ3pDLHdCQUF3QixVQUFrQixHQUFHLEtBQUssT0FBTyxJQUFJLEVBQUU7Q0FDL0Qsa0JBQWtCO0FBQ3BCIn0=
65
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia28uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2kxOG4va28udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9zYSB9IGZyb20gXCJzb25hbXUvZGljdFwiO1xuXG4vKipcbiAqIFByb2plY3QgS08gRGljdGlvbmFyeVxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiY29tbW9uLmFsbFwiOiBcIuyghOyytFwiLFxuICBcImNvbW1vbi5iYWNrVG9MaXN0XCI6IFwi66qp66Gd7Jy866GcXCIsXG4gIFwiY29tbW9uLmNhbmNlbFwiOiBcIuy3qOyGjFwiLFxuICBcImNvbW1vbi5jbG9zZVwiOiBcIuuLq+q4sFwiLFxuICBcImNvbW1vbi5jb25maXJtXCI6IFwi7ZmV7J24XCIsXG4gIFwiY29tbW9uLmNyZWF0ZVwiOiBcIuyDneyEsVwiLFxuICBcImNvbW1vbi5jcmVhdGVkQXRcIjogXCLrk7HroZ1cIixcbiAgXCJjb21tb24uZGVsZXRlXCI6IFwi7IKt7KCcXCIsXG4gIFwiY29tbW9uLmVkaXRcIjogXCLsiJjsoJVcIixcbiAgXCJjb21tb24ubG9naW5cIjogXCLroZzqt7jsnbhcIixcbiAgXCJjb21tb24ubG9nb3V0XCI6IFwi66Gc6re47JWE7JuDXCIsXG4gIFwiY29tbW9uLm1hbmFnZVwiOiBcIuq0gOumrFwiLFxuICBcImNvbW1vbi5yZXN1bHRzXCI6IChjb3VudDogbnVtYmVyKSA9PiBgJHtjb3VudH3qsJwg6rKw6rO8YCxcbiAgXCJjb21tb24uc2F2ZVwiOiBcIuyggOyepVwiLFxuICBcImNvbW1vbi5zZWFyY2hcIjogXCLqsoDsg4lcIixcbiAgXCJjb21tb24uc2VhcmNoUGxhY2Vob2xkZXJcIjogXCLqsoDsg4kuLi5cIixcbiAgXCJjb21tb24uc2VhcmNoVHlwZVwiOiBcIuqygOyDiSDsnKDtmJVcIixcbiAgXCJjb21tb24uc29ydFwiOiBcIuygleugrFwiLFxuICBcImNvbmZpcm0uZGVsZXRlXCI6IFwi7KCV66eQIOyCreygnO2VmOyLnOqyoOyKteuLiOq5jD9cIixcbiAgXCJjb25maXJtLnNhdmVcIjogXCLsoIDsnqXtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIFwiZGFzaGJvYXJkLmFkbWluTWVudVwiOiBcIuq0gOumrCDrqZTribRcIixcbiAgXCJkYXNoYm9hcmQuY3JlYXRlZEF0XCI6IFwi6rCA7J6F7J28XCIsXG4gIFwiZGFzaGJvYXJkLmVtYWlsXCI6IFwi7J2066mU7J28XCIsXG4gIFwiZGFzaGJvYXJkLmxvZ2luUmVxdWlyZWRcIjogXCLroZzqt7jsnbjsnbQg7ZWE7JqU7ZWp64uI64ukLlwiLFxuICBcImRhc2hib2FyZC5uYW1lXCI6IFwi7J2066aEXCIsXG4gIFwiZGFzaGJvYXJkLnJvbGVcIjogXCLsl63tlaBcIixcbiAgXCJkYXNoYm9hcmQudGl0bGVcIjogXCLqtIDrpqzsnpAg64yA7Iuc67O065OcXCIsXG4gIFwiZGFzaGJvYXJkLndlbGNvbWVcIjogXCLtmZjsmIHtlanri4jri6QhXCIsXG4gIFwiZGVsZXRlLmNvbmZpcm0uZGVzY3JpcHRpb25cIjogXCLsnbQg7J6R7JeF7J2AIOy3qOyGjO2VoCDsiJgg7JeG7Iq164uI64ukLiDtla3rqqnsnbQg7JiB6rWs7KCB7Jy866GcIOyCreygnOuQqeuLiOuLpC5cIixcbiAgXCJkZWxldGUuY29uZmlybS50aXRsZVwiOiBcIuygleunkCDsgq3soJztlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIFwiZW50aXR5LmNyZWF0ZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSDsg53shLFgLFxuICBcImVudGl0eS5lZGl0XCI6IChuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXIpID0+IGAke25hbWV9IOyImOyglSAoIyR7aWR9KWAsXG4gIFwiZW50aXR5Lmxpc3RcIjogKG5hbWU6IHN0cmluZykgPT4gYCR7bmFtZX0g66qp66GdYCxcbiAgXCJlbnRpdHkubGlzdE1hbmFnZVwiOiAobmFtZTogc3RyaW5nKSA9PiBgJHtuYW1lfSDrqqnroZ0g6rSA66asYCxcbiAgXCJlcnJvci5hbHJlYWR5UHJvY2Vzc2VkXCI6IFwi7J2066+4IOyymOumrOuQmOyXiOyKteuLiOuLpFwiLFxuICBcImVycm9yLmJhZFJlcXVlc3RcIjogXCLsnpjrqrvrkJwg7JqU7LKt7J6F64uI64ukXCIsXG4gIFwiZXJyb3IuZHVwbGljYXRlUm93XCI6IFwi7KSR67O165CcIOuNsOydtO2EsOyeheuLiOuLpFwiLFxuICBcImVycm9yLmVudGl0eU5vdEZvdW5kXCI6IChuYW1lOiBzdHJpbmcsIGlkOiBudW1iZXIgfCBzdHJpbmcpID0+IGDsobTsnqztlZjsp4Ag7JWK64qUICR7bmFtZX0gSUQgJHtpZH1gLFxuICBcImVycm9yLmZvcmJpZGRlblwiOiBcIuq2jO2VnOydtCDsl4bsirXri4jri6RcIixcbiAgXCJlcnJvci5pbnRlcm5hbFNlcnZlckVycm9yXCI6IFwi7ISc67KEIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6RcIixcbiAgXCJlcnJvci5ub3RGb3VuZFwiOiBcIuywvuydhCDsiJgg7JeG7Iq164uI64ukXCIsXG4gIFwiZXJyb3Iuc2VydmljZVVuYXZhaWxhYmxlXCI6IFwi7ISc67mE7Iqk66W8IOyCrOyaqe2VoCDsiJgg7JeG7Iq164uI64ukXCIsXG4gIFwic2V0dGluZy5pbnZhbGlkVmFsdWVcIjogKHJlYXNvbjogc3RyaW5nKSA9PiBg7ISk7KCVIOqwkuydtCDsmKzrsJTrpbTsp4Ag7JWK7Iq164uI64ukOiAke3JlYXNvbn1gLFxuICBcInNldHRpbmcudW5rbm93bktleVwiOiAoa2V5OiBzdHJpbmcpID0+IGDslYwg7IiYIOyXhuuKlCDshKTsoJUg7YKkICR7a2V5fWAsXG4gIFwicWdyaWQuZGlzcGF0Y2hlckZhaWxlZFwiOiAocHJvdmlkZXI6IHN0cmluZykgPT4gYCR7cHJvdmlkZXJ9IGRpc3BhdGNoZXIg7LSI6riw7ZmU7JeQIOyLpO2MqO2WiOyKteuLiOuLpGAsXG4gIFwicWdyaWQuZGlzcGF0Y2hlclN0YXJ0aW5nXCI6IChwcm92aWRlcjogc3RyaW5nKSA9PlxuICAgIGAke3Byb3ZpZGVyfSBkaXNwYXRjaGVyIOq4sOuPmSDspJHsnoXri4jri6QuIOyeoOyLnCDtm4Qg64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalGAsXG4gIFwiZXJyb3IudW5hdXRob3JpemVkXCI6IFwi7J247Kad7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICBcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiOiAoZmllbGQ6IHN0cmluZykgPT4gYOq1rO2YhOuQmOyngCDslYrsnYAg6rKA7IOJIO2VhOuTnCAke2ZpZWxkfWAsXG4gIG5vdEZvdW5kOiAobmFtZTogc3RyaW5nLCBpZDogbnVtYmVyKSA9PiBg7KG07J6s7ZWY7KeAIOyViuuKlCAke25hbWV9IElEICR7aWR9YCxcbiAgXCJ2YWxpZGF0aW9uLmVtYWlsXCI6IFwi7Jis67CU66W4IOydtOuplOydvCDtmJXsi53snbQg7JWE64uZ64uI64ukXCIsXG4gIFwidmFsaWRhdGlvbi5tYXhMZW5ndGhcIjogKGZpZWxkOiBzdHJpbmcsIG1heDogbnVtYmVyKSA9PlxuICAgIGAke2ZpZWxkfSR7am9zYShmaWVsZCwgXCLsnYDripRcIil9IOy1nOuMgCAke21heH3snpDquYzsp4Ag7J6F66Cl7ZWgIOyImCDsnojsirXri4jri6RgLFxuICBcInZhbGlkYXRpb24ubWluTGVuZ3RoXCI6IChmaWVsZDogc3RyaW5nLCBtaW46IG51bWJlcikgPT5cbiAgICBgJHtmaWVsZH0ke2pvc2EoZmllbGQsIFwi7J2A64qUXCIpfSDstZzshowgJHttaW597J6QIOydtOyDgeydtOyWtOyVvCDtlanri4jri6RgLFxuICBcInZhbGlkYXRpb24ucmVxdWlyZWRcIjogKGZpZWxkOiBzdHJpbmcpID0+IGAke2pvc2EoZmllbGQsIFwi7J2A64qUXCIpfSDtlYTsiJjsnoXri4jri6RgLFxuICBcInZhbGlkYXRpb24udXJsXCI6IFwi7Jis67CU66W4IFVSTCDtmJXsi53snbQg7JWE64uZ64uI64ukXCIsXG59IGFzIGNvbnN0O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUtBLElBQUEsYUFBZTtDQUNiLGNBQWM7Q0FDZCxxQkFBcUI7Q0FDckIsaUJBQWlCO0NBQ2pCLGdCQUFnQjtDQUNoQixrQkFBa0I7Q0FDbEIsaUJBQWlCO0NBQ2pCLG9CQUFvQjtDQUNwQixpQkFBaUI7Q0FDakIsZUFBZTtDQUNmLGdCQUFnQjtDQUNoQixpQkFBaUI7Q0FDakIsaUJBQWlCO0NBQ2pCLG1CQUFtQixVQUFrQixHQUFHLE1BQU07Q0FDOUMsZUFBZTtDQUNmLGlCQUFpQjtDQUNqQiw0QkFBNEI7Q0FDNUIscUJBQXFCO0NBQ3JCLGVBQWU7Q0FDZixrQkFBa0I7Q0FDbEIsZ0JBQWdCO0NBQ2hCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsbUJBQW1CO0NBQ25CLDJCQUEyQjtDQUMzQixrQkFBa0I7Q0FDbEIsa0JBQWtCO0NBQ2xCLG1CQUFtQjtDQUNuQixxQkFBcUI7Q0FDckIsOEJBQThCO0NBQzlCLHdCQUF3QjtDQUN4QixrQkFBa0IsU0FBaUIsR0FBRyxLQUFLO0NBQzNDLGdCQUFnQixNQUFjLE9BQWUsR0FBRyxLQUFLLFFBQVEsR0FBRztDQUNoRSxnQkFBZ0IsU0FBaUIsR0FBRyxLQUFLO0NBQ3pDLHNCQUFzQixTQUFpQixHQUFHLEtBQUs7Q0FDL0MsMEJBQTBCO0NBQzFCLG9CQUFvQjtDQUNwQixzQkFBc0I7Q0FDdEIseUJBQXlCLE1BQWMsT0FBd0IsV0FBVyxLQUFLLE1BQU07Q0FDckYsbUJBQW1CO0NBQ25CLDZCQUE2QjtDQUM3QixrQkFBa0I7Q0FDbEIsNEJBQTRCO0NBQzVCLHlCQUF5QixXQUFtQixvQkFBb0I7Q0FDaEUsdUJBQXVCLFFBQWdCLGVBQWU7Q0FDdEQsMkJBQTJCLGFBQXFCLEdBQUcsU0FBUztDQUM1RCw2QkFBNkIsYUFDM0IsR0FBRyxTQUFTO0NBQ2Qsc0JBQXNCO0NBQ3RCLDZCQUE2QixVQUFrQixpQkFBaUI7Q0FDaEUsV0FBVyxNQUFjLE9BQWUsV0FBVyxLQUFLLE1BQU07Q0FDOUQsb0JBQW9CO0NBQ3BCLHlCQUF5QixPQUFlLFFBQ3RDLEdBQUcsUUFBUSxLQUFLLE9BQU8sSUFBSSxFQUFFLE1BQU0sSUFBSTtDQUN6Qyx5QkFBeUIsT0FBZSxRQUN0QyxHQUFHLFFBQVEsS0FBSyxPQUFPLElBQUksRUFBRSxNQUFNLElBQUk7Q0FDekMsd0JBQXdCLFVBQWtCLEdBQUcsS0FBSyxPQUFPLElBQUksRUFBRTtDQUMvRCxrQkFBa0I7QUFDcEIifQ==
@@ -128,13 +128,24 @@ function normalizeOpenAIEvent(raw) {
128
128
  };
129
129
  if ((type === "response.output_item.added" || type === "response.output_item.done") && event.item && typeof event.item === "object") {
130
130
  const item = event.item;
131
- if (item.type === "image_generation_call" && typeof item.result === "string") return {
132
- type: "image",
133
- ...typeof item.id === "string" ? { id: item.id } : {},
134
- base64: item.result,
135
- mimeType: imageMimeType(item.result, item.output_format),
136
- ...typeof item.revised_prompt === "string" ? { revisedPrompt: item.revised_prompt } : typeof item.revisedPrompt === "string" ? { revisedPrompt: item.revisedPrompt } : {}
137
- };
131
+ if (item.type === "image_generation_call" && typeof item.result === "string") {
132
+ const header = Buffer.from(item.result.slice(0, 32), "base64");
133
+ const size = (header.length >= 24 && header.subarray(0, 8).equals(Buffer.from("89504e470d0a1a0a", "hex")) && header.readUInt32BE(16) > 0 && header.readUInt32BE(20) > 0 ? `${header.readUInt32BE(16)}x${header.readUInt32BE(20)}` : void 0) ?? (typeof item.size === "string" && /^[1-9]\d*x[1-9]\d*$/.test(item.size) ? item.size : void 0);
134
+ return {
135
+ type: "image",
136
+ ...typeof item.id === "string" ? { id: item.id } : {},
137
+ base64: item.result,
138
+ mimeType: imageMimeType(item.result, item.output_format),
139
+ generation: {
140
+ route: "codex-responses",
141
+ ...size ? { size } : {},
142
+ ...typeof item.model === "string" ? { model: item.model } : {},
143
+ ...typeof item.quality === "string" ? { quality: item.quality } : {},
144
+ ...typeof item.background === "string" ? { background: item.background } : {}
145
+ },
146
+ ...typeof item.revised_prompt === "string" ? { revisedPrompt: item.revised_prompt } : typeof item.revisedPrompt === "string" ? { revisedPrompt: item.revisedPrompt } : {}
147
+ };
148
+ }
138
149
  return {
139
150
  type: "output-item",
140
151
  item,
@@ -162,4 +173,4 @@ function normalizeOpenAIEvent(raw) {
162
173
  //#endregion
163
174
  export { CHATGPT_CODEX_RESPONSES_URL, CODEX_CLI_ORIGINATOR, CODEX_CLI_VERSION, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, codexCliUserAgent, imageMimeType, normalizeOpenAIEvent };
164
175
 
165
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcblxuZXhwb3J0IGNvbnN0IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCA9XG4gIFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS9jb2RleC9yZXNwb25zZXNcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPREVYX0NMSV9PUklHSU5BVE9SID0gXCJjb2RleF9jbGlfcnNcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfVkVSU0lPTiA9IFwiMC4xNDcuMFwiIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBvc1R5cGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGFyY2hpdGVjdHVyZTogc3RyaW5nO1xuICB0ZXJtaW5hbDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjb2RleFBsYXRmb3JtKCk6IENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBjb25zdCBuYW1lczogUGFydGlhbDxSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCBzdHJpbmc+PiA9IHtcbiAgICBkYXJ3aW46IFwiTWFjIE9TXCIsXG4gICAgbGludXg6IFwiTGludXhcIixcbiAgICB3aW4zMjogXCJXaW5kb3dzXCIsXG4gIH07XG4gIGNvbnN0IHRlcm1pbmFsID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNO1xuICBjb25zdCB0ZXJtaW5hbFZlcnNpb24gPSBwcm9jZXNzLmVudi5URVJNX1BST0dSQU1fVkVSU0lPTjtcbiAgcmV0dXJuIHtcbiAgICBvc1R5cGU6IG5hbWVzW3Byb2Nlc3MucGxhdGZvcm1dID8/IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgb3NWZXJzaW9uOiBvcy5yZWxlYXNlKCksXG4gICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmFyY2gsXG4gICAgdGVybWluYWw6IHRlcm1pbmFsID8gYCR7dGVybWluYWx9JHt0ZXJtaW5hbFZlcnNpb24gPyBgLyR7dGVybWluYWxWZXJzaW9ufWAgOiBcIlwifWAgOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuLyoqIE1hdGNoZXMgdGhlIHBsYXRmb3JtL3Rlcm1pbmFsIHN1ZmZpeCBlbWl0dGVkIGJ5IHRoZSBwaW5uZWQgUnVzdCBDb2RleCBDTEkuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhDbGlVc2VyQWdlbnQocGxhdGZvcm06IENvZGV4VXNlckFnZW50UGxhdGZvcm0gPSBjb2RleFBsYXRmb3JtKCkpOiBzdHJpbmcge1xuICByZXR1cm4gYGNvZGV4X2NsaV9ycy8ke0NPREVYX0NMSV9WRVJTSU9OfSAoJHtwbGF0Zm9ybS5vc1R5cGV9ICR7cGxhdGZvcm0ub3NWZXJzaW9ufTsgJHtwbGF0Zm9ybS5hcmNoaXRlY3R1cmV9KSAke3BsYXRmb3JtLnRlcm1pbmFsfWA7XG59XG5cbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgbnVsbFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBKc29uVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH07XG5cbi8qKiBSYXcgUmVzcG9uc2VzIEFQSSBpdGVtcy4gS2VlcGluZyB0aGVzZSBvcGFxdWUgcHJlc2VydmVzIHRoZSBjb21wbGV0ZSBjb252ZXJzYXRpb24gaGlzdG9yeS4gKi9cbmV4cG9ydCB0eXBlIE9wZW5BSVJlc3BvbnNlSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSU91dHB1dFNjaGVtYSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVtYTogSnNvblZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sQ2hvaWNlPzogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbFRvb2xDYWxscz86IGJvb2xlYW47XG4gIHJlYXNvbmluZz86IHtcbiAgICBlZmZvcnQ/OiBPcGVuQUlFZmZvcnQgfCBcIm5vbmVcIjtcbiAgICBzdW1tYXJ5PzogXCJhdXRvXCIgfCBcImNvbmNpc2VcIiB8IFwiZGV0YWlsZWRcIjtcbiAgfTtcbiAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG4gIHByb21wdENhY2hlS2V5Pzogc3RyaW5nO1xuICBvdXRwdXRTY2hlbWE/OiBPcGVuQUlPdXRwdXRTY2hlbWE7XG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW4gfCBPcGVuQUlSZXNwb25zZUl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaW5wdXQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sX2Nob2ljZTogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbF90b29sX2NhbGxzOiBib29sZWFuO1xuICByZWFzb25pbmc6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnNbXCJyZWFzb25pbmdcIl0gfCBudWxsO1xuICBzdG9yZTogZmFsc2U7XG4gIHN0cmVhbTogdHJ1ZTtcbiAgaW5jbHVkZTogc3RyaW5nW107XG4gIHNlcnZpY2VfdGllcj86IHN0cmluZztcbiAgcHJvbXB0X2NhY2hlX2tleT86IHN0cmluZztcbiAgdGV4dD86IHtcbiAgICB2ZXJib3NpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAgIGZvcm1hdD86IHtcbiAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIjtcbiAgICAgIHN0cmljdDogdHJ1ZTtcbiAgICAgIHNjaGVtYTogSnNvblZhbHVlO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoXG4gIG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsXG4pOiBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0IHtcbiAgY29uc3QgdG9vbHMgPSBvcHRpb25zLnRvb2xzID8gWy4uLm9wdGlvbnMudG9vbHNdIDogW107XG4gIGlmIChvcHRpb25zLmltYWdlR2VuZXJhdGlvbikge1xuICAgIHRvb2xzLnB1c2goXG4gICAgICBvcHRpb25zLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIgfVxuICAgICAgICA6IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsIC4uLm9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPVxuICAgIG9wdGlvbnMudmVyYm9zaXR5IHx8IG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICA/IHtcbiAgICAgICAgICAuLi4ob3B0aW9ucy52ZXJib3NpdHkgPyB7IHZlcmJvc2l0eTogb3B0aW9ucy52ZXJib3NpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5vdXRwdXRTY2hlbWFcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJqc29uX3NjaGVtYVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBvcHRpb25zLm91dHB1dFNjaGVtYS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm91dHB1dFNjaGVtYS5uYW1lID8/IFwiY29kZXhfb3V0cHV0X3NjaGVtYVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIG1vZGVsOiBvcHRpb25zLm1vZGVsLFxuICAgIC4uLihvcHRpb25zLmluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zOiBvcHRpb25zLmluc3RydWN0aW9ucyB9IDoge30pLFxuICAgIC8vIENvcHkgdGhlIGFycmF5LCBub3QgaXRzIGl0ZW1zOiByYXcgaXRlbXMgbXVzdCBhcnJpdmUgYnl0ZS1mb3ItYnl0ZSBlcXVpdmFsZW50LlxuICAgIGlucHV0OiBbLi4ub3B0aW9ucy5oaXN0b3J5XSxcbiAgICAuLi4odG9vbHMubGVuZ3RoID8geyB0b29scyB9IDoge30pLFxuICAgIHRvb2xfY2hvaWNlOiBvcHRpb25zLnRvb2xDaG9pY2UgPz8gXCJhdXRvXCIsXG4gICAgcGFyYWxsZWxfdG9vbF9jYWxsczogb3B0aW9ucy5wYXJhbGxlbFRvb2xDYWxscyA/PyB0cnVlLFxuICAgIHJlYXNvbmluZzogb3B0aW9ucy5yZWFzb25pbmcgPz8gbnVsbCxcbiAgICBzdG9yZTogZmFsc2UsXG4gICAgc3RyZWFtOiB0cnVlLFxuICAgIGluY2x1ZGU6IFtcInJlYXNvbmluZy5lbmNyeXB0ZWRfY29udGVudFwiXSxcbiAgICAuLi4ob3B0aW9ucy5zZXJ2aWNlVGllciA/IHsgc2VydmljZV90aWVyOiBvcHRpb25zLnNlcnZpY2VUaWVyIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgPyB7IHByb21wdF9jYWNoZV9rZXk6IG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgfSA6IHt9KSxcbiAgICAuLi4odGV4dCA/IHsgdGV4dCB9IDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgYWNjZXNzVG9rZW46IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGNvcnJlbGF0aW9uPzogeyBzZXNzaW9uSWQ/OiBzdHJpbmc7IHRocmVhZElkPzogc3RyaW5nOyBjbGllbnRSZXF1ZXN0SWQ/OiBzdHJpbmcgfSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIEFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgIFwiQ2hhdEdQVC1BY2NvdW50LUlEXCI6IGFjY291bnRJZCxcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBvcmlnaW5hdG9yOiBDT0RFWF9DTElfT1JJR0lOQVRPUixcbiAgICBcIlVzZXItQWdlbnRcIjogY29kZXhDbGlVc2VyQWdlbnQoKSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnNlc3Npb25JZCA/IHsgXCJzZXNzaW9uLWlkXCI6IGNvcnJlbGF0aW9uLnNlc3Npb25JZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8udGhyZWFkSWQgPyB7IFwidGhyZWFkLWlkXCI6IGNvcnJlbGF0aW9uLnRocmVhZElkIH0gOiB7fSksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5jbGllbnRSZXF1ZXN0SWQgPyB7IFwieC1jbGllbnQtcmVxdWVzdC1pZFwiOiBjb3JyZWxhdGlvbi5jbGllbnRSZXF1ZXN0SWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlVc2FnZSB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJTm9ybWFsaXplZEV2ZW50ID1cbiAgfCB7IHR5cGU6IFwiY3JlYXRlZFwiOyByZXNwb25zZUlkPzogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwidGV4dC1kZWx0YVwiOyB0ZXh0OiBzdHJpbmc7IGl0ZW1JZD86IHN0cmluZyB9XG4gIHwge1xuICAgICAgdHlwZTogXCJpbWFnZVwiO1xuICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgICBiYXNlNjQ6IHN0cmluZztcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIjtcbiAgICAgIHJldmlzZWRQcm9tcHQ/OiBzdHJpbmc7XG4gICAgICBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG4gICAgfVxuICB8IHsgdHlwZTogXCJvdXRwdXQtaXRlbVwiOyBpdGVtOiBPcGVuQUlSZXNwb25zZUl0ZW07IGNvbXBsZXRlZD86IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJjb21wbGV0ZWRcIjsgcmVzcG9uc2VJZDogc3RyaW5nOyB1c2FnZT86IE9wZW5BSVVzYWdlOyBtb2RlbD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImVycm9yXCI7IGVycm9yOiBPcGVuQUlQcm90b2NvbEVycm9yIH07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlQcm90b2NvbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlBZnRlck1zPzogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk9wZW5BSVByb3RvY29sRXJyb3JcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1c2FnZUZyb20odmFsdWU6IHVua25vd24pOiBPcGVuQUlVc2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB1c2FnZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBpbnB1dERldGFpbHMgPSAodXNhZ2UuaW5wdXRfdG9rZW5zX2RldGFpbHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBvdXRwdXREZXRhaWxzID0gKHVzYWdlLm91dHB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaW5wdXRUb2tlbnM6IE51bWJlcih1c2FnZS5pbnB1dF90b2tlbnMgPz8gMCksXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IE51bWJlcihpbnB1dERldGFpbHMuY2FjaGVkX3Rva2VucyA/PyAwKSxcbiAgICBvdXRwdXRUb2tlbnM6IE51bWJlcih1c2FnZS5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgIHJlYXNvbmluZ1Rva2VuczogTnVtYmVyKG91dHB1dERldGFpbHMucmVhc29uaW5nX3Rva2VucyA/PyAwKSxcbiAgICB0b3RhbFRva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWltZVR5cGUoXG4gIGJhc2U2NDogc3RyaW5nLFxuICBvdXRwdXRGb3JtYXQ/OiB1bmtub3duLFxuKTogXCJpbWFnZS9wbmdcIiB8IFwiaW1hZ2UvanBlZ1wiIHwgXCJpbWFnZS93ZWJwXCIge1xuICAvLyBJbnNwZWN0IG9ubHkgdGhlIGhlYWRlciwgd2l0aG91dCBkZWNvZGluZyBhIHBvdGVudGlhbGx5IGxhcmdlIGltYWdlIHR3aWNlLlxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQuc2xpY2UoMCwgMjQpLCBcImJhc2U2NFwiKTtcbiAgaWYgKGhlYWRlci5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKSkpXG4gICAgcmV0dXJuIFwiaW1hZ2UvcG5nXCI7XG4gIGlmIChoZWFkZXJbMF0gPT09IDI1NSAmJiBoZWFkZXJbMV0gPT09IDIxNiAmJiBoZWFkZXJbMl0gPT09IDI1NSkgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAoaGVhZGVyLnRvU3RyaW5nKFwiYXNjaWlcIiwgMCwgNCkgPT09IFwiUklGRlwiICYmIGhlYWRlci50b1N0cmluZyhcImFzY2lpXCIsIDgsIDEyKSA9PT0gXCJXRUJQXCIpXG4gICAgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcImpwZWdcIikgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcIndlYnBcIikgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSB1bmRlZmluZWQgfHwgb3V0cHV0Rm9ybWF0ID09PSBcInBuZ1wiKSByZXR1cm4gXCJpbWFnZS9wbmdcIjtcbiAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoYFVuc3VwcG9ydGVkIGltYWdlIG91dHB1dCBmb3JtYXQ6ICR7U3RyaW5nKG91dHB1dEZvcm1hdCl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcGVuQUlFdmVudChyYXc6IHVua25vd24pOiBPcGVuQUlOb3JtYWxpemVkRXZlbnQgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBldmVudCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdHlwZSA9IFN0cmluZyhldmVudC50eXBlID8/IFwiXCIpO1xuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jcmVhdGVkXCIpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LnJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHR5cGU6IFwiY3JlYXRlZFwiLCAuLi4ocmVzcG9uc2U/LmlkID8geyByZXNwb25zZUlkOiBTdHJpbmcocmVzcG9uc2UuaWQpIH0gOiB7fSkgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiICYmIHR5cGVvZiBldmVudC5kZWx0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgIHRleHQ6IGV2ZW50LmRlbHRhLFxuICAgICAgLi4uKHR5cGVvZiBldmVudC5pdGVtX2lkID09PSBcInN0cmluZ1wiID8geyBpdGVtSWQ6IGV2ZW50Lml0ZW1faWQgfSA6IHt9KSxcbiAgICB9O1xuICB9XG4gIGlmIChcbiAgICAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiKSAmJlxuICAgIGV2ZW50Lml0ZW0gJiZcbiAgICB0eXBlb2YgZXZlbnQuaXRlbSA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICBjb25zdCBpdGVtID0gZXZlbnQuaXRlbSBhcyBPcGVuQUlSZXNwb25zZUl0ZW07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiAmJiB0eXBlb2YgaXRlbS5yZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLmlkID09PSBcInN0cmluZ1wiID8geyBpZDogaXRlbS5pZCB9IDoge30pLFxuICAgICAgICBiYXNlNjQ6IGl0ZW0ucmVzdWx0LFxuICAgICAgICBtaW1lVHlwZTogaW1hZ2VNaW1lVHlwZShpdGVtLnJlc3VsdCwgaXRlbS5vdXRwdXRfZm9ybWF0KSxcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLnJldmlzZWRfcHJvbXB0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZF9wcm9tcHQgfVxuICAgICAgICAgIDogdHlwZW9mIGl0ZW0ucmV2aXNlZFByb21wdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZFByb21wdCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6IFwib3V0cHV0LWl0ZW1cIiwgaXRlbSwgY29tcGxldGVkOiB0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcInJlc3BvbnNlLmNvbXBsZXRlZFwiKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoZXZlbnQucmVzcG9uc2UgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbXBsZXRlZFwiLFxuICAgICAgcmVzcG9uc2VJZDogU3RyaW5nKHJlc3BvbnNlLmlkID8/IFwiXCIpLFxuICAgICAgLi4uKHJlc3BvbnNlLnVzYWdlID8geyB1c2FnZTogdXNhZ2VGcm9tKHJlc3BvbnNlLnVzYWdlKSB9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiByZXNwb25zZS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWw6IHJlc3BvbnNlLm1vZGVsIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJlcnJvclwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5pbmNvbXBsZXRlXCIpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAoZXZlbnQuZXJyb3IgPz8gZXZlbnQucmVzcG9uc2UgPz8gZXZlbnQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG5lc3RlZCA9IChzb3VyY2UuZXJyb3IgPz8gc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgZXJyb3I6IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICBTdHJpbmcobmVzdGVkLm1lc3NhZ2UgPz8gYE9wZW5BSSBzdHJlYW0gZW5kZWQgd2l0aCAke3R5cGV9YCksXG4gICAgICAgIHR5cGVvZiBuZXN0ZWQuY29kZSA9PT0gXCJzdHJpbmdcIiA/IG5lc3RlZC5jb2RlIDogdW5kZWZpbmVkLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBS0EsTUFBYSw4QkFDWDtBQUVGLE1BQWEsdUJBQXVCO0FBQ3BDLE1BQWEsb0JBQW9CO0FBU2pDLFNBQVMsZ0JBQXdDO0NBQy9DLE1BQU0sUUFBa0Q7RUFDdEQsUUFBUTtFQUNSLE9BQU87RUFDUCxPQUFPO0NBQ1Q7Q0FDQSxNQUFNLFdBQVcsUUFBUSxJQUFJO0NBQzdCLE1BQU0sa0JBQWtCLFFBQVEsSUFBSTtDQUNwQyxPQUFPO0VB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
176
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcblxuZXhwb3J0IGNvbnN0IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCA9XG4gIFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS9jb2RleC9yZXNwb25zZXNcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPREVYX0NMSV9PUklHSU5BVE9SID0gXCJjb2RleF9jbGlfcnNcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfVkVSU0lPTiA9IFwiMC4xNDcuMFwiIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBvc1R5cGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGFyY2hpdGVjdHVyZTogc3RyaW5nO1xuICB0ZXJtaW5hbDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjb2RleFBsYXRmb3JtKCk6IENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBjb25zdCBuYW1lczogUGFydGlhbDxSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCBzdHJpbmc+PiA9IHtcbiAgICBkYXJ3aW46IFwiTWFjIE9TXCIsXG4gICAgbGludXg6IFwiTGludXhcIixcbiAgICB3aW4zMjogXCJXaW5kb3dzXCIsXG4gIH07XG4gIGNvbnN0IHRlcm1pbmFsID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNO1xuICBjb25zdCB0ZXJtaW5hbFZlcnNpb24gPSBwcm9jZXNzLmVudi5URVJNX1BST0dSQU1fVkVSU0lPTjtcbiAgcmV0dXJuIHtcbiAgICBvc1R5cGU6IG5hbWVzW3Byb2Nlc3MucGxhdGZvcm1dID8/IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgb3NWZXJzaW9uOiBvcy5yZWxlYXNlKCksXG4gICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmFyY2gsXG4gICAgdGVybWluYWw6IHRlcm1pbmFsID8gYCR7dGVybWluYWx9JHt0ZXJtaW5hbFZlcnNpb24gPyBgLyR7dGVybWluYWxWZXJzaW9ufWAgOiBcIlwifWAgOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuLyoqIE1hdGNoZXMgdGhlIHBsYXRmb3JtL3Rlcm1pbmFsIHN1ZmZpeCBlbWl0dGVkIGJ5IHRoZSBwaW5uZWQgUnVzdCBDb2RleCBDTEkuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhDbGlVc2VyQWdlbnQocGxhdGZvcm06IENvZGV4VXNlckFnZW50UGxhdGZvcm0gPSBjb2RleFBsYXRmb3JtKCkpOiBzdHJpbmcge1xuICByZXR1cm4gYGNvZGV4X2NsaV9ycy8ke0NPREVYX0NMSV9WRVJTSU9OfSAoJHtwbGF0Zm9ybS5vc1R5cGV9ICR7cGxhdGZvcm0ub3NWZXJzaW9ufTsgJHtwbGF0Zm9ybS5hcmNoaXRlY3R1cmV9KSAke3BsYXRmb3JtLnRlcm1pbmFsfWA7XG59XG5cbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgbnVsbFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBKc29uVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH07XG5cbi8qKiBSYXcgUmVzcG9uc2VzIEFQSSBpdGVtcy4gS2VlcGluZyB0aGVzZSBvcGFxdWUgcHJlc2VydmVzIHRoZSBjb21wbGV0ZSBjb252ZXJzYXRpb24gaGlzdG9yeS4gKi9cbmV4cG9ydCB0eXBlIE9wZW5BSVJlc3BvbnNlSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSU91dHB1dFNjaGVtYSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVtYTogSnNvblZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sQ2hvaWNlPzogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbFRvb2xDYWxscz86IGJvb2xlYW47XG4gIHJlYXNvbmluZz86IHtcbiAgICBlZmZvcnQ/OiBPcGVuQUlFZmZvcnQgfCBcIm5vbmVcIjtcbiAgICBzdW1tYXJ5PzogXCJhdXRvXCIgfCBcImNvbmNpc2VcIiB8IFwiZGV0YWlsZWRcIjtcbiAgfTtcbiAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG4gIHByb21wdENhY2hlS2V5Pzogc3RyaW5nO1xuICBvdXRwdXRTY2hlbWE/OiBPcGVuQUlPdXRwdXRTY2hlbWE7XG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW4gfCBPcGVuQUlSZXNwb25zZUl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaW5wdXQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sX2Nob2ljZTogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbF90b29sX2NhbGxzOiBib29sZWFuO1xuICByZWFzb25pbmc6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnNbXCJyZWFzb25pbmdcIl0gfCBudWxsO1xuICBzdG9yZTogZmFsc2U7XG4gIHN0cmVhbTogdHJ1ZTtcbiAgaW5jbHVkZTogc3RyaW5nW107XG4gIHNlcnZpY2VfdGllcj86IHN0cmluZztcbiAgcHJvbXB0X2NhY2hlX2tleT86IHN0cmluZztcbiAgdGV4dD86IHtcbiAgICB2ZXJib3NpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAgIGZvcm1hdD86IHtcbiAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIjtcbiAgICAgIHN0cmljdDogdHJ1ZTtcbiAgICAgIHNjaGVtYTogSnNvblZhbHVlO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoXG4gIG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsXG4pOiBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0IHtcbiAgY29uc3QgdG9vbHMgPSBvcHRpb25zLnRvb2xzID8gWy4uLm9wdGlvbnMudG9vbHNdIDogW107XG4gIGlmIChvcHRpb25zLmltYWdlR2VuZXJhdGlvbikge1xuICAgIHRvb2xzLnB1c2goXG4gICAgICBvcHRpb25zLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIgfVxuICAgICAgICA6IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsIC4uLm9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPVxuICAgIG9wdGlvbnMudmVyYm9zaXR5IHx8IG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICA/IHtcbiAgICAgICAgICAuLi4ob3B0aW9ucy52ZXJib3NpdHkgPyB7IHZlcmJvc2l0eTogb3B0aW9ucy52ZXJib3NpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5vdXRwdXRTY2hlbWFcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJqc29uX3NjaGVtYVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBvcHRpb25zLm91dHB1dFNjaGVtYS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm91dHB1dFNjaGVtYS5uYW1lID8/IFwiY29kZXhfb3V0cHV0X3NjaGVtYVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIG1vZGVsOiBvcHRpb25zLm1vZGVsLFxuICAgIC4uLihvcHRpb25zLmluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zOiBvcHRpb25zLmluc3RydWN0aW9ucyB9IDoge30pLFxuICAgIC8vIENvcHkgdGhlIGFycmF5LCBub3QgaXRzIGl0ZW1zOiByYXcgaXRlbXMgbXVzdCBhcnJpdmUgYnl0ZS1mb3ItYnl0ZSBlcXVpdmFsZW50LlxuICAgIGlucHV0OiBbLi4ub3B0aW9ucy5oaXN0b3J5XSxcbiAgICAuLi4odG9vbHMubGVuZ3RoID8geyB0b29scyB9IDoge30pLFxuICAgIHRvb2xfY2hvaWNlOiBvcHRpb25zLnRvb2xDaG9pY2UgPz8gXCJhdXRvXCIsXG4gICAgcGFyYWxsZWxfdG9vbF9jYWxsczogb3B0aW9ucy5wYXJhbGxlbFRvb2xDYWxscyA/PyB0cnVlLFxuICAgIHJlYXNvbmluZzogb3B0aW9ucy5yZWFzb25pbmcgPz8gbnVsbCxcbiAgICBzdG9yZTogZmFsc2UsXG4gICAgc3RyZWFtOiB0cnVlLFxuICAgIGluY2x1ZGU6IFtcInJlYXNvbmluZy5lbmNyeXB0ZWRfY29udGVudFwiXSxcbiAgICAuLi4ob3B0aW9ucy5zZXJ2aWNlVGllciA/IHsgc2VydmljZV90aWVyOiBvcHRpb25zLnNlcnZpY2VUaWVyIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgPyB7IHByb21wdF9jYWNoZV9rZXk6IG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgfSA6IHt9KSxcbiAgICAuLi4odGV4dCA/IHsgdGV4dCB9IDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgYWNjZXNzVG9rZW46IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGNvcnJlbGF0aW9uPzogeyBzZXNzaW9uSWQ/OiBzdHJpbmc7IHRocmVhZElkPzogc3RyaW5nOyBjbGllbnRSZXF1ZXN0SWQ/OiBzdHJpbmcgfSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIEFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgIFwiQ2hhdEdQVC1BY2NvdW50LUlEXCI6IGFjY291bnRJZCxcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBvcmlnaW5hdG9yOiBDT0RFWF9DTElfT1JJR0lOQVRPUixcbiAgICBcIlVzZXItQWdlbnRcIjogY29kZXhDbGlVc2VyQWdlbnQoKSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnNlc3Npb25JZCA/IHsgXCJzZXNzaW9uLWlkXCI6IGNvcnJlbGF0aW9uLnNlc3Npb25JZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8udGhyZWFkSWQgPyB7IFwidGhyZWFkLWlkXCI6IGNvcnJlbGF0aW9uLnRocmVhZElkIH0gOiB7fSksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5jbGllbnRSZXF1ZXN0SWQgPyB7IFwieC1jbGllbnQtcmVxdWVzdC1pZFwiOiBjb3JyZWxhdGlvbi5jbGllbnRSZXF1ZXN0SWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlVc2FnZSB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJTm9ybWFsaXplZEV2ZW50ID1cbiAgfCB7IHR5cGU6IFwiY3JlYXRlZFwiOyByZXNwb25zZUlkPzogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwidGV4dC1kZWx0YVwiOyB0ZXh0OiBzdHJpbmc7IGl0ZW1JZD86IHN0cmluZyB9XG4gIHwge1xuICAgICAgdHlwZTogXCJpbWFnZVwiO1xuICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgICBiYXNlNjQ6IHN0cmluZztcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIjtcbiAgICAgIHJldmlzZWRQcm9tcHQ/OiBzdHJpbmc7XG4gICAgICBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG4gICAgfVxuICB8IHsgdHlwZTogXCJvdXRwdXQtaXRlbVwiOyBpdGVtOiBPcGVuQUlSZXNwb25zZUl0ZW07IGNvbXBsZXRlZD86IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJjb21wbGV0ZWRcIjsgcmVzcG9uc2VJZDogc3RyaW5nOyB1c2FnZT86IE9wZW5BSVVzYWdlOyBtb2RlbD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImVycm9yXCI7IGVycm9yOiBPcGVuQUlQcm90b2NvbEVycm9yIH07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlQcm90b2NvbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlBZnRlck1zPzogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk9wZW5BSVByb3RvY29sRXJyb3JcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1c2FnZUZyb20odmFsdWU6IHVua25vd24pOiBPcGVuQUlVc2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB1c2FnZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBpbnB1dERldGFpbHMgPSAodXNhZ2UuaW5wdXRfdG9rZW5zX2RldGFpbHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBvdXRwdXREZXRhaWxzID0gKHVzYWdlLm91dHB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaW5wdXRUb2tlbnM6IE51bWJlcih1c2FnZS5pbnB1dF90b2tlbnMgPz8gMCksXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IE51bWJlcihpbnB1dERldGFpbHMuY2FjaGVkX3Rva2VucyA/PyAwKSxcbiAgICBvdXRwdXRUb2tlbnM6IE51bWJlcih1c2FnZS5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgIHJlYXNvbmluZ1Rva2VuczogTnVtYmVyKG91dHB1dERldGFpbHMucmVhc29uaW5nX3Rva2VucyA/PyAwKSxcbiAgICB0b3RhbFRva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWltZVR5cGUoXG4gIGJhc2U2NDogc3RyaW5nLFxuICBvdXRwdXRGb3JtYXQ/OiB1bmtub3duLFxuKTogXCJpbWFnZS9wbmdcIiB8IFwiaW1hZ2UvanBlZ1wiIHwgXCJpbWFnZS93ZWJwXCIge1xuICAvLyBJbnNwZWN0IG9ubHkgdGhlIGhlYWRlciwgd2l0aG91dCBkZWNvZGluZyBhIHBvdGVudGlhbGx5IGxhcmdlIGltYWdlIHR3aWNlLlxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQuc2xpY2UoMCwgMjQpLCBcImJhc2U2NFwiKTtcbiAgaWYgKGhlYWRlci5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKSkpXG4gICAgcmV0dXJuIFwiaW1hZ2UvcG5nXCI7XG4gIGlmIChoZWFkZXJbMF0gPT09IDI1NSAmJiBoZWFkZXJbMV0gPT09IDIxNiAmJiBoZWFkZXJbMl0gPT09IDI1NSkgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAoaGVhZGVyLnRvU3RyaW5nKFwiYXNjaWlcIiwgMCwgNCkgPT09IFwiUklGRlwiICYmIGhlYWRlci50b1N0cmluZyhcImFzY2lpXCIsIDgsIDEyKSA9PT0gXCJXRUJQXCIpXG4gICAgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcImpwZWdcIikgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcIndlYnBcIikgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSB1bmRlZmluZWQgfHwgb3V0cHV0Rm9ybWF0ID09PSBcInBuZ1wiKSByZXR1cm4gXCJpbWFnZS9wbmdcIjtcbiAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoYFVuc3VwcG9ydGVkIGltYWdlIG91dHB1dCBmb3JtYXQ6ICR7U3RyaW5nKG91dHB1dEZvcm1hdCl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcGVuQUlFdmVudChyYXc6IHVua25vd24pOiBPcGVuQUlOb3JtYWxpemVkRXZlbnQgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBldmVudCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdHlwZSA9IFN0cmluZyhldmVudC50eXBlID8/IFwiXCIpO1xuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jcmVhdGVkXCIpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LnJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHR5cGU6IFwiY3JlYXRlZFwiLCAuLi4ocmVzcG9uc2U/LmlkID8geyByZXNwb25zZUlkOiBTdHJpbmcocmVzcG9uc2UuaWQpIH0gOiB7fSkgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiICYmIHR5cGVvZiBldmVudC5kZWx0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgIHRleHQ6IGV2ZW50LmRlbHRhLFxuICAgICAgLi4uKHR5cGVvZiBldmVudC5pdGVtX2lkID09PSBcInN0cmluZ1wiID8geyBpdGVtSWQ6IGV2ZW50Lml0ZW1faWQgfSA6IHt9KSxcbiAgICB9O1xuICB9XG4gIGlmIChcbiAgICAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiKSAmJlxuICAgIGV2ZW50Lml0ZW0gJiZcbiAgICB0eXBlb2YgZXZlbnQuaXRlbSA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICBjb25zdCBpdGVtID0gZXZlbnQuaXRlbSBhcyBPcGVuQUlSZXNwb25zZUl0ZW07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiAmJiB0eXBlb2YgaXRlbS5yZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIFBORyBleHBvc2VzIGRpbWVuc2lvbnMgaW4gaXRzIGZpeGVkIGhlYWRlci4gT3RoZXIgZm9ybWF0cyByZXRhaW4gdGhlXG4gICAgICAvLyBiYWNrZW5kJ3Mgb2JzZXJ2ZWQgc2l6ZTsgbmV2ZXIgc3Vic3RpdHV0ZSByZXF1ZXN0ZWQgaW1hZ2UgY29udHJvbHMuXG4gICAgICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuZnJvbShpdGVtLnJlc3VsdC5zbGljZSgwLCAzMiksIFwiYmFzZTY0XCIpO1xuICAgICAgY29uc3QgcG5nU2l6ZSA9XG4gICAgICAgIGhlYWRlci5sZW5ndGggPj0gMjQgJiZcbiAgICAgICAgaGVhZGVyLnN1YmFycmF5KDAsIDgpLmVxdWFscyhCdWZmZXIuZnJvbShcIjg5NTA0ZTQ3MGQwYTFhMGFcIiwgXCJoZXhcIikpICYmXG4gICAgICAgIGhlYWRlci5yZWFkVUludDMyQkUoMTYpID4gMCAmJlxuICAgICAgICBoZWFkZXIucmVhZFVJbnQzMkJFKDIwKSA+IDBcbiAgICAgICAgICA/IGAke2hlYWRlci5yZWFkVUludDMyQkUoMTYpfXgke2hlYWRlci5yZWFkVUludDMyQkUoMjApfWBcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICBwbmdTaXplID8/XG4gICAgICAgICh0eXBlb2YgaXRlbS5zaXplID09PSBcInN0cmluZ1wiICYmIC9eWzEtOV1cXGQqeFsxLTldXFxkKiQvLnRlc3QoaXRlbS5zaXplKVxuICAgICAgICAgID8gaXRlbS5zaXplXG4gICAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICAuLi4odHlwZW9mIGl0ZW0uaWQgPT09IFwic3RyaW5nXCIgPyB7IGlkOiBpdGVtLmlkIH0gOiB7fSksXG4gICAgICAgIGJhc2U2NDogaXRlbS5yZXN1bHQsXG4gICAgICAgIG1pbWVUeXBlOiBpbWFnZU1pbWVUeXBlKGl0ZW0ucmVzdWx0LCBpdGVtLm91dHB1dF9mb3JtYXQpLFxuICAgICAgICBnZW5lcmF0aW9uOiB7XG4gICAgICAgICAgcm91dGU6IFwiY29kZXgtcmVzcG9uc2VzXCIsXG4gICAgICAgICAgLi4uKHNpemUgPyB7IHNpemUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4odHlwZW9mIGl0ZW0ubW9kZWwgPT09IFwic3RyaW5nXCIgPyB7IG1vZGVsOiBpdGVtLm1vZGVsIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHR5cGVvZiBpdGVtLnF1YWxpdHkgPT09IFwic3RyaW5nXCIgPyB7IHF1YWxpdHk6IGl0ZW0ucXVhbGl0eSB9IDoge30pLFxuICAgICAgICAgIC4uLih0eXBlb2YgaXRlbS5iYWNrZ3JvdW5kID09PSBcInN0cmluZ1wiID8geyBiYWNrZ3JvdW5kOiBpdGVtLmJhY2tncm91bmQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLnJldmlzZWRfcHJvbXB0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZF9wcm9tcHQgfVxuICAgICAgICAgIDogdHlwZW9mIGl0ZW0ucmV2aXNlZFByb21wdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZFByb21wdCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6IFwib3V0cHV0LWl0ZW1cIiwgaXRlbSwgY29tcGxldGVkOiB0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcInJlc3BvbnNlLmNvbXBsZXRlZFwiKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoZXZlbnQucmVzcG9uc2UgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbXBsZXRlZFwiLFxuICAgICAgcmVzcG9uc2VJZDogU3RyaW5nKHJlc3BvbnNlLmlkID8/IFwiXCIpLFxuICAgICAgLi4uKHJlc3BvbnNlLnVzYWdlID8geyB1c2FnZTogdXNhZ2VGcm9tKHJlc3BvbnNlLnVzYWdlKSB9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiByZXNwb25zZS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWw6IHJlc3BvbnNlLm1vZGVsIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJlcnJvclwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5pbmNvbXBsZXRlXCIpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAoZXZlbnQuZXJyb3IgPz8gZXZlbnQucmVzcG9uc2UgPz8gZXZlbnQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG5lc3RlZCA9IChzb3VyY2UuZXJyb3IgPz8gc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgZXJyb3I6IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICBTdHJpbmcobmVzdGVkLm1lc3NhZ2UgPz8gYE9wZW5BSSBzdHJlYW0gZW5kZWQgd2l0aCAke3R5cGV9YCksXG4gICAgICAgIHR5cGVvZiBuZXN0ZWQuY29kZSA9PT0gXCJzdHJpbmdcIiA/IG5lc3RlZC5jb2RlIDogdW5kZWZpbmVkLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBS0Es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
@@ -17,6 +17,24 @@ function result(content: QgridContent[]): QueryOutput {
17
17
  }
18
18
 
19
19
  describe("standalone image cost estimates", () => {
20
+ it("accepts size hints without promising public API resolution limits", () => {
21
+ for (const size of ["auto", "1152x2560", "841x1870", "2160x3840"]) {
22
+ expect(QueryInput.parse({ prompt: "draw", imageGenerationOptions: { size } }).imageGenerationOptions?.size).toBe(size);
23
+ }
24
+ for (const size of ["9:20", "0x1024", "1.5x1024", "-1x1024", "9007199254740992x1"]) {
25
+ expect(QueryInput.safeParse({ prompt: "draw", imageGenerationOptions: { size } }).success).toBe(false);
26
+ }
27
+ });
28
+
29
+ it("leaves custom/auto size and observed hosted image costs unknown", () => {
30
+ const output = result([{ type: "image", data: "png" }]);
31
+ for (const size of ["auto", "1152x2560"] as const) {
32
+ expect(estimateImageGenerationCostMicroUsd(output, { size })).toBeNull();
33
+ }
34
+ expect(estimateImageGenerationCostMicroUsd(result([{ type: "image", data: "png", generation: {
35
+ route: "codex-responses", size: "841x1870", quality: "low",
36
+ } }]), options)).toBeNull();
37
+ });
20
38
  it("accepts automatic image mode while preserving boolean requests", () => {
21
39
  for (const imageGeneration of [true, false, "auto"] as const) {
22
40
  expect(QueryInput.parse({ prompt: "chat", imageGeneration }).imageGeneration).toBe(imageGeneration);
@@ -18,7 +18,7 @@ export type ResolvedImageGenerationOptions = {
18
18
  // https://developers.openai.com/api/docs/guides/image-generation#calculating-costs
19
19
  const IMAGE_OUTPUT_COST_MICRO_USD: Record<
20
20
  ImageGenerationQuality,
21
- Record<ImageGenerationSize, number>
21
+ Partial<Record<ImageGenerationSize, number>>
22
22
  > = {
23
23
  low: {
24
24
  "1024x1024": 6_000,
@@ -49,7 +49,13 @@ export function resolveImageGenerationOptions(
49
49
  export function imageGenerationCostMethod(
50
50
  options: ImageGenerationOptions | undefined,
51
51
  result?: QueryOutput,
52
- ): string {
52
+ ): string | null {
53
+ if (
54
+ result?.content.some(
55
+ (item) => item.type === "image" && item.generation?.route === "codex-responses",
56
+ )
57
+ )
58
+ return null;
53
59
  if (
54
60
  result?.content.some(
55
61
  (item) => item.type === "image" && item.generation?.route === "codex-images",
@@ -58,6 +64,7 @@ export function imageGenerationCostMethod(
58
64
  return "estimated:gpt-image-2:reported-usage:public-prices:conservative";
59
65
  }
60
66
  const resolved = resolveImageGenerationOptions(options);
67
+ if (IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size] === undefined) return null;
61
68
  return `assumed:${CODEX_IMAGE_GENERATION_MODEL}:${resolved.quality}:${resolved.size}:png`;
62
69
  }
63
70
 
@@ -68,6 +75,9 @@ export function estimateImageGenerationCostMicroUsd(
68
75
  const images = result.content.filter((item) => item.type === "image");
69
76
  const imageCount = images.length;
70
77
  if (imageCount === 0) return null;
78
+ // Hosted Responses reports observed settings but no trustworthy image usage
79
+ // or guaranteed image model. Requested size/quality cannot price that output.
80
+ if (images.some((image) => image.generation?.route === "codex-responses")) return null;
71
81
  if (images.some((image) => image.generation?.route === "codex-images")) {
72
82
  // The standalone response's aggregate usage is carried by its first image only.
73
83
  // Do not multiply it by output count or price it as the requested text driver.
@@ -88,5 +98,6 @@ export function estimateImageGenerationCostMicroUsd(
88
98
  );
89
99
  }
90
100
  const resolved = resolveImageGenerationOptions(options);
91
- return imageCount * IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size];
101
+ const unitCost = IMAGE_OUTPUT_COST_MICRO_USD[resolved.quality][resolved.size];
102
+ return unitCost === undefined ? null : imageCount * unitCost;
92
103
  }
@@ -19,6 +19,15 @@ it("logs observed standalone settings separately from requested controls without
19
19
  });
20
20
 
21
21
  describe("qgrid response log formatting", () => {
22
+ it("keeps custom requests and hosted observations separate without inventing a price assumption", () => {
23
+ const args = { prompt: "draw in 9:20", imageGenerationOptions: { size: "1152x2560" } };
24
+ const generation = { route: "codex-responses" as const, size: "841x1870", quality: "low" };
25
+ const observed = JSON.parse(imageGenerationToolArgs(args, { generation }));
26
+ expect(observed.requestedOptions.size).toBe("1152x2560");
27
+ expect(observed.observedGeneration).toEqual(generation);
28
+ expect(observed).not.toHaveProperty("pricingAssumption");
29
+ expect(JSON.parse(imageGenerationToolArgs(args))).not.toHaveProperty("pricingAssumption");
30
+ });
22
31
  it("logs the returned MIME and requested output format", () => {
23
32
  expect(formatImagePartForLog({ type: "image", data: "webp", mediaType: "image/webp" })).toContain("data:image/webp;base64,webp");
24
33
  expect(JSON.parse(imageGenerationToolArgs({ prompt: "draw", imageGenerationOptions: { outputFormat: "webp" } })).tool.outputFormat).toBe("webp");
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  CODEX_IMAGE_GENERATION_MODEL,
3
+ imageGenerationCostMethod,
3
4
  resolveImageGenerationOptions,
4
5
  } from "./qgrid-image-generation";
5
6
  import {
@@ -62,13 +63,15 @@ export function imageGenerationToolArgs(
62
63
  ...(args.imageGenerationOptions ? { requestedOptions: args.imageGenerationOptions } : {}),
63
64
  ...(options.generation
64
65
  ? { observedGeneration: options.generation }
65
- : {
66
- pricingAssumption: {
67
- model: CODEX_IMAGE_GENERATION_MODEL,
68
- quality: resolved.quality,
69
- size: resolved.size,
70
- },
71
- }),
66
+ : imageGenerationCostMethod(args.imageGenerationOptions)
67
+ ? {
68
+ pricingAssumption: {
69
+ model: CODEX_IMAGE_GENERATION_MODEL,
70
+ quality: resolved.quality,
71
+ size: resolved.size,
72
+ },
73
+ }
74
+ : {}),
72
75
  });
73
76
  }
74
77
 
@@ -1,16 +1,10 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
2
 
3
- import {
4
- beginServerRestart,
5
- resetServerRestartForTests,
6
- } from "../../utils/server-restart";
7
3
  import {
8
4
  afterQuery,
9
5
  beforeQuery,
10
- finishActiveNativeRunsForRestart,
11
6
  finishRunAborted,
12
7
  finishRunWithError,
13
- resetNativeRunRegistryForTests,
14
8
  } from "./qgrid-run-lifecycle";
15
9
  import { type QueryOutput } from "./qgrid.types";
16
10
 
@@ -65,11 +59,6 @@ function queryOutput(overrides: Partial<QueryOutput> = {}): QueryOutput {
65
59
 
66
60
  let lifecycleNow = Date.now();
67
61
 
68
- afterEach(() => {
69
- resetServerRestartForTests();
70
- resetNativeRunRegistryForTests();
71
- });
72
-
73
62
  describe("qgrid run lifecycle start", () => {
74
63
  beforeEach(() => {
75
64
  lifecycleNow += 60_001;
@@ -221,107 +210,7 @@ describe("qgrid run lifecycle start", () => {
221
210
  expect(createRunMock).toHaveBeenCalledTimes(2);
222
211
  });
223
212
 
224
- it("rejects new native runs while a restart is pending", async () => {
225
- beginServerRestart();
226
-
227
- await expect(beforeQuery({ prompt: "hi" })).rejects.toMatchObject({ statusCode: 503 });
228
- expect(createRunMock).not.toHaveBeenCalled();
229
- });
230
-
231
- it("finishes a run prepared during the restart race before rejecting provider execution", async () => {
232
- let resolveCreate!: (requestLogId: number) => void;
233
- createRunMock.mockReturnValueOnce(
234
- new Promise<number>((resolve) => {
235
- resolveCreate = resolve;
236
- }),
237
- );
238
-
239
- const starting = beforeQuery({ prompt: "hi" });
240
- await vi.waitFor(() => expect(createRunMock).toHaveBeenCalledOnce());
241
- beginServerRestart();
242
- resolveCreate(22);
243
-
244
- await expect(starting).rejects.toMatchObject({ statusCode: 503 });
245
- expect(finishRunMock).toHaveBeenCalledWith(
246
- 22,
247
- expect.objectContaining({ status: "error", error_message: "server restarted" }),
248
- );
249
- });
250
-
251
- it("marks only active native runs as restarted and prevents a late success overwrite", async () => {
252
- const { requestLogId, stepIndex } = await beforeQuery({ prompt: "hi" });
253
-
254
- await finishActiveNativeRunsForRestart();
255
- expect(finishRunMock).toHaveBeenCalledWith(
256
- requestLogId,
257
- expect.objectContaining({ status: "error", error_message: "server restarted" }),
258
- );
259
-
260
- appendStepMock.mockClear();
261
- finishRunMock.mockClear();
262
- await expect(afterQuery(requestLogId, stepIndex, { prompt: "hi" }, queryOutput())).resolves.toEqual(
263
- {},
264
- );
265
- expect(appendStepMock).not.toHaveBeenCalled();
266
- expect(finishRunMock).not.toHaveBeenCalled();
267
- });
268
-
269
- it("waits for an in-flight finalizer and writes the restart error last", async () => {
270
- const { requestLogId, stepIndex } = await beforeQuery({ prompt: "hi" });
271
- let releaseAppend!: () => void;
272
- appendStepMock.mockReturnValueOnce(
273
- new Promise<void>((resolve) => {
274
- releaseAppend = resolve;
275
- }),
276
- );
277
-
278
- const finishing = afterQuery(requestLogId, stepIndex, { prompt: "hi" }, queryOutput());
279
- await vi.waitFor(() => expect(appendStepMock).toHaveBeenCalledOnce());
280
- const restarting = finishActiveNativeRunsForRestart();
281
-
282
- await Promise.resolve();
283
- expect(finishRunMock).not.toHaveBeenCalledWith(
284
- requestLogId,
285
- expect.objectContaining({ error_message: "server restarted" }),
286
- );
287
-
288
- releaseAppend();
289
- await Promise.all([finishing, restarting]);
290
-
291
- const terminalStatuses = finishRunMock.mock.calls
292
- .filter(([id]) => id === requestLogId)
293
- .map(([, payload]) => payload.status);
294
- expect(terminalStatuses.at(-1)).toBe("error");
295
- expect(finishRunMock).toHaveBeenLastCalledWith(
296
- requestLogId,
297
- expect.objectContaining({ status: "error", error_message: "server restarted" }),
298
- );
299
- });
300
-
301
- it("leaves tool-wait runs alone after their provider turn has completed", async () => {
302
- const { requestLogId, stepIndex } = await beforeQuery({ prompt: "use a tool" });
303
- await afterQuery(
304
- requestLogId,
305
- stepIndex,
306
- { prompt: "use a tool" },
307
- queryOutput({
308
- finishReason: "tool-calls",
309
- content: [
310
- {
311
- type: "tool-call",
312
- toolCallId: "call-1",
313
- toolName: "lookup",
314
- input: "{}",
315
- },
316
- ],
317
- }),
318
- );
319
- finishRunMock.mockClear();
320
-
321
- await finishActiveNativeRunsForRestart();
322
213
 
323
- expect(finishRunMock).not.toHaveBeenCalled();
324
- });
325
214
  });
326
215
 
327
216
  describe("qgrid run lifecycle TTFT", () => {