@cartanova/qgrid-cli 2.7.2 → 2.7.4

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 (53) hide show
  1. package/bundle/dist/application/queries.generated.js +2 -1
  2. package/bundle/dist/application/request-log/json-schema-type-text.js +58 -2
  3. package/bundle/dist/application/request-log/request-log.model.js +44 -3
  4. package/bundle/dist/application/request-log/request-log.types.js +10 -4
  5. package/bundle/dist/node_modules/.pnpm/{vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_2519c2e8d8013fcbc7b443879bc9da6d → vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50}/node_modules/vite/dist/node/module-runner.js +2 -2
  6. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +2 -2
  7. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +2 -2
  8. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +3 -3
  9. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +2 -2
  10. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +2 -2
  11. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +2 -2
  12. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +2 -2
  13. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +2 -2
  14. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_3892b4338df694f79f7d384fad23d930 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618}/node_modules/vitest/dist/index.js +2 -2
  15. package/bundle/dist/testing/setup-mocks.js +2 -2
  16. package/bundle/src/application/queries.generated.ts +3 -0
  17. package/bundle/src/application/request-log/json-schema-type-text.test.ts +115 -1
  18. package/bundle/src/application/request-log/json-schema-type-text.ts +91 -0
  19. package/bundle/src/application/request-log/request-log.model.test.ts +166 -0
  20. package/bundle/src/application/request-log/request-log.model.ts +52 -6
  21. package/bundle/src/application/request-log/request-log.types.ts +11 -2
  22. package/bundle/src/application/sonamu.generated.http +6 -2
  23. package/bundle/web-dist/client/assets/index-CPYQIUqO.js +106 -0
  24. package/bundle/web-dist/client/assets/index-D9xE_tO7.css +1 -0
  25. package/bundle/web-dist/client/assets/logs-UlTjUAUB.js +1 -0
  26. package/bundle/web-dist/client/assets/{monit-qap66dhi.js → monit-CVNZnd8j.js} +1 -1
  27. package/bundle/web-dist/client/assets/{routes-CV07Pzde.js → routes-CF7Jlmfi.js} +1 -1
  28. package/bundle/web-dist/client/assets/{services.generated-CSW8bhCP.js → services.generated-CA7oRRYY.js} +4 -4
  29. package/bundle/web-dist/client/assets/settings-N-8sXHl6.js +1 -0
  30. package/bundle/web-dist/client/assets/show-CGhg0fbn.js +2 -0
  31. package/bundle/web-dist/client/assets/{tokens-Dt3gfkwP.js → tokens-DaEtcsoL.js} +1 -1
  32. package/bundle/web-dist/client/assets/{use-oauth-login-flow-Cwi0HtJY.js → use-oauth-login-flow-Eovfx07A.js} +1 -1
  33. package/bundle/web-dist/client/index.html +3 -3
  34. package/bundle/web-dist/server/assets/{lazyRouteComponent-0y-znAfz.js → lazyRouteComponent-tS-rTksX.js} +2 -2
  35. package/bundle/web-dist/server/assets/{logs-CJBbHM3_.js → logs-ttf79emP.js} +3 -14
  36. package/bundle/web-dist/server/assets/{monit-8WAsPETB.js → monit-CJBUH0l6.js} +2 -2
  37. package/bundle/web-dist/server/assets/{plus-9das21ju.js → plus-BuSuoeon.js} +1 -1
  38. package/bundle/web-dist/server/assets/{react-dom-zmEq8BVp.js → react-dom-7_SqhNWR.js} +1 -1
  39. package/bundle/web-dist/server/assets/{routes-B6bX3o41.js → routes-z79f1sOM.js} +3 -3
  40. package/bundle/web-dist/server/assets/{services.generated-DyPeBI00.js → services.generated-B5UkNmgc.js} +20 -38
  41. package/bundle/web-dist/server/assets/{settings-D1u5WdpP.js → settings-nCv71sax.js} +2 -2
  42. package/bundle/web-dist/server/assets/{show-Cr7vwR0l.js → show-CLrA4ZQ-.js} +158 -37
  43. package/bundle/web-dist/server/assets/{tokens-BumM0gnH.js → tokens-BwlkZELV.js} +3 -3
  44. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DmsHGOlx.js → use-oauth-login-flow-B2QllVMi.js} +1 -1
  45. package/bundle/web-dist/server/entry-server.generated.js +10 -11
  46. package/package.json +9 -4
  47. package/skills/qgrid/references/request-log-run-lifecycle.md +9 -1
  48. package/skills/qgrid/references/sonamu-api-web-flow.md +3 -1
  49. package/bundle/web-dist/client/assets/index-BldeEvAK.css +0 -1
  50. package/bundle/web-dist/client/assets/index-DkAXPF9q.js +0 -106
  51. package/bundle/web-dist/client/assets/logs-DlI6OojL.js +0 -1
  52. package/bundle/web-dist/client/assets/settings-CdYub4yo.js +0 -1
  53. package/bundle/web-dist/client/assets/show-DA1L8DVD.js +0 -2
@@ -29,6 +29,7 @@ let RequestLogService;
29
29
  _RequestLogService.getRequestLog = (subset, id) => createSSRQuery("RequestLogModel", "findById", [subset, id], ["RequestLog", "getRequestLog"]);
30
30
  _RequestLogService.getRequestLogs = (subset, rawParams) => createSSRQuery("RequestLogModel", "findMany", [subset, rawParams], ["RequestLog", "getRequestLogs"]);
31
31
  _RequestLogService.responseTypeTs = (id) => createSSRQuery("RequestLogModel", "responseTypeTs", [id], ["RequestLog", "responseTypeTs"]);
32
+ _RequestLogService.toolsView = (id) => createSSRQuery("RequestLogModel", "toolsView", [id], ["RequestLog", "toolsView"]);
32
33
  })(RequestLogService || (RequestLogService = {}));
33
34
  let QgridService;
34
35
  (function(_QgridService) {
@@ -48,4 +49,4 @@ let MonitService;
48
49
  //#endregion
49
50
  export { MonitService, QgridService, RequestLogService, RequestLogStepService, SettingService, TokenService };
50
51
 
51
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5nZW5lcmF0ZWQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3F1ZXJpZXMuZ2VuZXJhdGVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuLyogb3hsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHR5cGUgeyBTU1JRdWVyeSB9IGZyb20gXCJzb25hbXUvc3NyXCI7XG5cbi8vIFNTUlF1ZXJ5IO2XrO2NvCDtlajsiJhcbmZ1bmN0aW9uIGNyZWF0ZVNTUlF1ZXJ5KFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IGFueVtdLFxuICBzZXJ2aWNlS2V5OiBbc3RyaW5nLCBzdHJpbmddLFxuKTogU1NSUXVlcnkge1xuICByZXR1cm4geyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtcywgc2VydmljZUtleSwgX19icmFuZDogXCJTU1JRdWVyeVwiIH0gYXMgU1NSUXVlcnk7XG59XG5cbmltcG9ydCB7IFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyB9IGZyb20gXCIuL3JlcXVlc3QtbG9nLXN0ZXAvcmVxdWVzdC1sb2ctc3RlcC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9zZXR0aW5nL3NldHRpbmcudHlwZXNcIjtcbmltcG9ydCB7XG4gIFRva2VuU3Vic2V0S2V5LFxuICBTZXR0aW5nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleSxcbiAgUmVxdWVzdExvZ1N1YnNldEtleSxcbn0gZnJvbSBcIi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5MaXN0UGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBUb2tlblNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgZ2V0VG9rZW4gPSA8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiVG9rZW5Nb2RlbFwiLCBcImZpbmRCeUlkXCIsIFtzdWJzZXQsIGlkXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlblwiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFRva2VucyA9IDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJUb2tlbk1vZGVsXCIsIFwiZmluZE1hbnlcIiwgW3N1YnNldCwgcmF3UGFyYW1zXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlbnNcIl0pO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFNldHRpbmdTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFNldHRpbmcgPSA8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJTZXR0aW5nTW9kZWxcIiwgXCJmaW5kQnlJZFwiLCBbc3Vic2V0LCBpZF0sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nXCJdKTtcblxuICBleHBvcnQgY29uc3QgZ2V0U2V0dGluZ3MgPSA8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXksIExQIGV4dGVuZHMgU2V0dGluZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlNldHRpbmdNb2RlbFwiLCBcImZpbmRNYW55XCIsIFtzdWJzZXQsIHJhd1BhcmFtc10sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFNldHRpbmdMaXN0ID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJTZXR0aW5nTW9kZWxcIiwgXCJsaXN0U2V0dGluZ3NcIiwgW10sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nTGlzdFwiXSk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUmVxdWVzdExvZ1N0ZXBTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dTdGVwID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXIsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXG4gICAgICBcIlJlcXVlc3RMb2dTdGVwTW9kZWxcIixcbiAgICAgIFwiZmluZEJ5SWRcIixcbiAgICAgIFtzdWJzZXQsIGlkXSxcbiAgICAgIFtcIlJlcXVlc3RMb2dTdGVwXCIsIFwiZ2V0UmVxdWVzdExvZ1N0ZXBcIl0sXG4gICAgKTtcblxuICBleHBvcnQgY29uc3QgZ2V0UmVxdWVzdExvZ1N0ZXBzID0gPFxuICAgIFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleSxcbiAgICBMUCBleHRlbmRzIFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyxcbiAgPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXG4gICAgICBcIlJlcXVlc3RMb2dTdGVwTW9kZWxcIixcbiAgICAgIFwiZmluZE1hbnlcIixcbiAgICAgIFtzdWJzZXQsIHJhd1BhcmFtc10sXG4gICAgICBbXCJSZXF1ZXN0TG9nU3RlcFwiLCBcImdldFJlcXVlc3RMb2dTdGVwc1wiXSxcbiAgICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVlc3RMb2dTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2cgPSA8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJSZXF1ZXN0TG9nTW9kZWxcIiwgXCJmaW5kQnlJZFwiLCBbc3Vic2V0LCBpZF0sIFtcIlJlcXVlc3RMb2dcIiwgXCJnZXRSZXF1ZXN0TG9nXCJdKTtcblxuICBleHBvcnQgY29uc3QgZ2V0UmVxdWVzdExvZ3MgPSA8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXksIExQIGV4dGVuZHMgUmVxdWVzdExvZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcbiAgICAgIFwiUmVxdWVzdExvZ01vZGVsXCIsXG4gICAgICBcImZpbmRNYW55XCIsXG4gICAgICBbc3Vic2V0LCByYXdQYXJhbXNdLFxuICAgICAgW1wiUmVxdWVzdExvZ1wiLCBcImdldFJlcXVlc3RMb2dzXCJdLFxuICAgICk7XG5cbiAgZXhwb3J0IGNvbnN0IHJlc3BvbnNlVHlwZVRzID0gKGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUmVxdWVzdExvZ01vZGVsXCIsIFwicmVzcG9uc2VUeXBlVHNcIiwgW2lkXSwgW1wiUmVxdWVzdExvZ1wiLCBcInJlc3BvbnNlVHlwZVRzXCJdKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBRZ3JpZFNlcnZpY2Uge1xuICBleHBvcnQgY29uc3Qgc3RhdHMgPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJzdGF0c1wiLCBbXSwgW1wiUWdyaWRcIiwgXCJzdGF0c1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IHRvdGFsQ29zdCA9IChwYXJhbXM/OiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwidG90YWxDb3N0XCIsIFtwYXJhbXNdLCBbXCJRZ3JpZFwiLCBcInRvdGFsQ29zdFwiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IHByb2plY3ROYW1lcyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUWdyaWRGcmFtZVwiLCBcInByb2plY3ROYW1lc1wiLCBbXSwgW1wiUWdyaWRcIiwgXCJwcm9qZWN0TmFtZXNcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCBtb2RlbE5hbWVzID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwibW9kZWxOYW1lc1wiLCBbXSwgW1wiUWdyaWRcIiwgXCJtb2RlbE5hbWVzXCJdKTtcblxuICBleHBvcnQgY29uc3QgdXNhZ2UgPSAodG9rZW5JZD86IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwidXNhZ2VcIiwgW3Rva2VuSWRdLCBbXCJRZ3JpZFwiLCBcInVzYWdlXCJdKTtcblxuICBleHBvcnQgY29uc3QgaGVhbHRoID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwiaGVhbHRoXCIsIFtdLCBbXCJRZ3JpZFwiLCBcImhlYWx0aFwiXSk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9uaXRTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IG1vbml0TG9ncyA9IChjdXJzb3I/OiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiTW9uaXRGcmFtZVwiLCBcIm1vbml0TG9nc1wiLCBbY3Vyc29yXSwgW1wiTW9uaXRcIiwgXCJtb25pdExvZ3NcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCBtb25pdEluZm8gPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIk1vbml0RnJhbWVcIiwgXCJtb25pdEluZm9cIiwgW10sIFtcIk1vbml0XCIsIFwibW9uaXRJbmZvXCJdKTtcblxuICBleHBvcnQgY29uc3QgbW9uaXRTdGF0cyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiTW9uaXRGcmFtZVwiLCBcIm1vbml0U3RhdHNcIiwgW10sIFtcIk1vbml0XCIsIFwibW9uaXRTdGF0c1wiXSk7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFVQSxTQUFTLGVBQ1AsV0FDQSxZQUNBLFFBQ0EsWUFDVTtDQUNWLE9BQU87RUFBRTtFQUFXO0VBQVk7RUFBUTtFQUFZLFNBQVM7Q0FBVztBQUMxRTtBQWFPLElBQVU7Q0FBVixTQUFBLGVBQUE7Q0FDUSxjQUFBLFlBQXNDLFFBQVcsT0FDNUQsZUFBZSxjQUFjLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFNBQVMsVUFBVSxDQUFDO0NBRWpFLGNBQUEsYUFDWCxRQUNBLGNBRUEsZUFBZSxjQUFjLFlBQVksQ0FBQyxRQUFRLFNBQVMsR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDO0FBQ3ZGLEVBQUEsQ0FBQSxpQkFBQSxlQUFBLENBQUEsRUFBRDtBQUVPLElBQVU7Q0FBVixTQUFBLGlCQUFBO0NBQ1EsZ0JBQUEsY0FBMEMsUUFBVyxPQUNoRSxlQUFlLGdCQUFnQixZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxXQUFXLFlBQVksQ0FBQztDQUV2RSxnQkFBQSxlQUNYLFFBQ0EsY0FFQSxlQUFlLGdCQUFnQixZQUFZLENBQUMsUUFBUSxTQUFTLEdBQUcsQ0FBQyxXQUFXLGFBQWEsQ0FBQztDQUUvRSxnQkFBQSx1QkFDWCxlQUFlLGdCQUFnQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxnQkFBZ0IsQ0FBQztBQUNuRixFQUFBLENBQUEsbUJBQUEsaUJBQUEsQ0FBQSxFQUFEO0FBRU8sSUFBVTtDQUFWLFNBQUEsd0JBQUE7Q0FDUSx1QkFBQSxxQkFDWCxRQUNBLE9BRUEsZUFDRSx1QkFDQSxZQUNBLENBQUMsUUFBUSxFQUFFLEdBQ1gsQ0FBQyxrQkFBa0IsbUJBQW1CLENBQ3hDO0NBRVcsdUJBQUEsc0JBSVgsUUFDQSxjQUVBLGVBQ0UsdUJBQ0EsWUFDQSxDQUFDLFFBQVEsU0FBUyxHQUNsQixDQUFDLGtCQUFrQixvQkFBb0IsQ0FDekM7QUFDSCxFQUFBLENBQUEsMEJBQUEsd0JBQUEsQ0FBQSxFQUFEO0FBRU8sSUFBVTtDQUFWLFNBQUEsb0JBQUE7Q0FDUSxtQkFBQSxpQkFBZ0QsUUFBVyxPQUN0RSxlQUFlLG1CQUFtQixZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxjQUFjLGVBQWUsQ0FBQztDQUVoRixtQkFBQSxrQkFDWCxRQUNBLGNBRUEsZUFDRSxtQkFDQSxZQUNBLENBQUMsUUFBUSxTQUFTLEdBQ2xCLENBQUMsY0FBYyxnQkFBZ0IsQ0FDakM7Q0FFVyxtQkFBQSxrQkFBa0IsT0FDN0IsZUFBZSxtQkFBbUIsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsY0FBYyxnQkFBZ0IsQ0FBQztBQUM3RixFQUFBLENBQUEsc0JBQUEsb0JBQUEsQ0FBQSxFQUFEO0FBRU8sSUFBVTtDQUFWLFNBQUEsZUFBQTtDQUNRLGNBQUEsY0FDWCxlQUFlLGNBQWMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLE9BQU8sQ0FBQztDQUVqRCxjQUFBLGFBQWEsV0FDeEIsZUFBZSxjQUFjLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLFdBQVcsQ0FBQztDQUUvRCxjQUFBLHFCQUNYLGVBQWUsY0FBYyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxjQUFjLENBQUM7Q0FFL0QsY0FBQSxtQkFDWCxlQUFlLGNBQWMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFlBQVksQ0FBQztDQUUzRCxjQUFBLFNBQVMsWUFDcEIsZUFBZSxjQUFjLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxTQUFTLE9BQU8sQ0FBQztDQUV4RCxjQUFBLGVBQ1gsZUFBZSxjQUFjLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxRQUFRLENBQUM7QUFDakUsRUFBQSxDQUFBLGlCQUFBLGVBQUEsQ0FBQSxFQUFEO0FBRU8sSUFBVTtDQUFWLFNBQUEsZUFBQTtDQUNRLGNBQUEsYUFBYSxXQUN4QixlQUFlLGNBQWMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDO0NBRS9ELGNBQUEsa0JBQ1gsZUFBZSxjQUFjLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxXQUFXLENBQUM7Q0FFekQsY0FBQSxtQkFDWCxlQUFlLGNBQWMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFlBQVksQ0FBQztBQUN6RSxFQUFBLENBQUEsaUJBQUEsZUFBQSxDQUFBLEVBQUQifQ==
52
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5nZW5lcmF0ZWQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3F1ZXJpZXMuZ2VuZXJhdGVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuLyogb3hsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHR5cGUgeyBTU1JRdWVyeSB9IGZyb20gXCJzb25hbXUvc3NyXCI7XG5cbi8vIFNTUlF1ZXJ5IO2XrO2NvCDtlajsiJhcbmZ1bmN0aW9uIGNyZWF0ZVNTUlF1ZXJ5KFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IGFueVtdLFxuICBzZXJ2aWNlS2V5OiBbc3RyaW5nLCBzdHJpbmddLFxuKTogU1NSUXVlcnkge1xuICByZXR1cm4geyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtcywgc2VydmljZUtleSwgX19icmFuZDogXCJTU1JRdWVyeVwiIH0gYXMgU1NSUXVlcnk7XG59XG5cbmltcG9ydCB7IFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyB9IGZyb20gXCIuL3JlcXVlc3QtbG9nLXN0ZXAvcmVxdWVzdC1sb2ctc3RlcC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9zZXR0aW5nL3NldHRpbmcudHlwZXNcIjtcbmltcG9ydCB7XG4gIFRva2VuU3Vic2V0S2V5LFxuICBTZXR0aW5nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleSxcbiAgUmVxdWVzdExvZ1N1YnNldEtleSxcbn0gZnJvbSBcIi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5MaXN0UGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBUb2tlblNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgZ2V0VG9rZW4gPSA8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiVG9rZW5Nb2RlbFwiLCBcImZpbmRCeUlkXCIsIFtzdWJzZXQsIGlkXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlblwiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFRva2VucyA9IDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJUb2tlbk1vZGVsXCIsIFwiZmluZE1hbnlcIiwgW3N1YnNldCwgcmF3UGFyYW1zXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlbnNcIl0pO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFNldHRpbmdTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFNldHRpbmcgPSA8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJTZXR0aW5nTW9kZWxcIiwgXCJmaW5kQnlJZFwiLCBbc3Vic2V0LCBpZF0sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nXCJdKTtcblxuICBleHBvcnQgY29uc3QgZ2V0U2V0dGluZ3MgPSA8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXksIExQIGV4dGVuZHMgU2V0dGluZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlNldHRpbmdNb2RlbFwiLCBcImZpbmRNYW55XCIsIFtzdWJzZXQsIHJhd1BhcmFtc10sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFNldHRpbmdMaXN0ID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJTZXR0aW5nTW9kZWxcIiwgXCJsaXN0U2V0dGluZ3NcIiwgW10sIFtcIlNldHRpbmdcIiwgXCJnZXRTZXR0aW5nTGlzdFwiXSk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUmVxdWVzdExvZ1N0ZXBTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dTdGVwID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXIsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXG4gICAgICBcIlJlcXVlc3RMb2dTdGVwTW9kZWxcIixcbiAgICAgIFwiZmluZEJ5SWRcIixcbiAgICAgIFtzdWJzZXQsIGlkXSxcbiAgICAgIFtcIlJlcXVlc3RMb2dTdGVwXCIsIFwiZ2V0UmVxdWVzdExvZ1N0ZXBcIl0sXG4gICAgKTtcblxuICBleHBvcnQgY29uc3QgZ2V0UmVxdWVzdExvZ1N0ZXBzID0gPFxuICAgIFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcFN1YnNldEtleSxcbiAgICBMUCBleHRlbmRzIFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyxcbiAgPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXG4gICAgICBcIlJlcXVlc3RMb2dTdGVwTW9kZWxcIixcbiAgICAgIFwiZmluZE1hbnlcIixcbiAgICAgIFtzdWJzZXQsIHJhd1BhcmFtc10sXG4gICAgICBbXCJSZXF1ZXN0TG9nU3RlcFwiLCBcImdldFJlcXVlc3RMb2dTdGVwc1wiXSxcbiAgICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVlc3RMb2dTZXJ2aWNlIHtcbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2cgPSA8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJSZXF1ZXN0TG9nTW9kZWxcIiwgXCJmaW5kQnlJZFwiLCBbc3Vic2V0LCBpZF0sIFtcIlJlcXVlc3RMb2dcIiwgXCJnZXRSZXF1ZXN0TG9nXCJdKTtcblxuICBleHBvcnQgY29uc3QgZ2V0UmVxdWVzdExvZ3MgPSA8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXksIExQIGV4dGVuZHMgUmVxdWVzdExvZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcbiAgICAgIFwiUmVxdWVzdExvZ01vZGVsXCIsXG4gICAgICBcImZpbmRNYW55XCIsXG4gICAgICBbc3Vic2V0LCByYXdQYXJhbXNdLFxuICAgICAgW1wiUmVxdWVzdExvZ1wiLCBcImdldFJlcXVlc3RMb2dzXCJdLFxuICAgICk7XG5cbiAgZXhwb3J0IGNvbnN0IHJlc3BvbnNlVHlwZVRzID0gKGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUmVxdWVzdExvZ01vZGVsXCIsIFwicmVzcG9uc2VUeXBlVHNcIiwgW2lkXSwgW1wiUmVxdWVzdExvZ1wiLCBcInJlc3BvbnNlVHlwZVRzXCJdKTtcblxuICBleHBvcnQgY29uc3QgdG9vbHNWaWV3ID0gKGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUmVxdWVzdExvZ01vZGVsXCIsIFwidG9vbHNWaWV3XCIsIFtpZF0sIFtcIlJlcXVlc3RMb2dcIiwgXCJ0b29sc1ZpZXdcIl0pO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFFncmlkU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBzdGF0cyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUWdyaWRGcmFtZVwiLCBcInN0YXRzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcInN0YXRzXCJdKTtcblxuICBleHBvcnQgY29uc3QgdG90YWxDb3N0ID0gKHBhcmFtcz86IFJlcXVlc3RMb2dMaXN0UGFyYW1zKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJ0b3RhbENvc3RcIiwgW3BhcmFtc10sIFtcIlFncmlkXCIsIFwidG90YWxDb3N0XCJdKTtcblxuICBleHBvcnQgY29uc3QgcHJvamVjdE5hbWVzID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwicHJvamVjdE5hbWVzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcInByb2plY3ROYW1lc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IG1vZGVsTmFtZXMgPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJtb2RlbE5hbWVzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcIm1vZGVsTmFtZXNcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCB1c2FnZSA9ICh0b2tlbklkPzogbnVtYmVyKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJ1c2FnZVwiLCBbdG9rZW5JZF0sIFtcIlFncmlkXCIsIFwidXNhZ2VcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCBoZWFsdGggPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJoZWFsdGhcIiwgW10sIFtcIlFncmlkXCIsIFwiaGVhbHRoXCJdKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNb25pdFNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgbW9uaXRMb2dzID0gKGN1cnNvcj86IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJNb25pdEZyYW1lXCIsIFwibW9uaXRMb2dzXCIsIFtjdXJzb3JdLCBbXCJNb25pdFwiLCBcIm1vbml0TG9nc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IG1vbml0SW5mbyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiTW9uaXRGcmFtZVwiLCBcIm1vbml0SW5mb1wiLCBbXSwgW1wiTW9uaXRcIiwgXCJtb25pdEluZm9cIl0pO1xuXG4gIGV4cG9ydCBjb25zdCBtb25pdFN0YXRzID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJNb25pdEZyYW1lXCIsIFwibW9uaXRTdGF0c1wiLCBbXSwgW1wiTW9uaXRcIiwgXCJtb25pdFN0YXRzXCJdKTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQVVBLFNBQVMsZUFDUCxXQUNBLFlBQ0EsUUFDQSxZQUNVO0NBQ1YsT0FBTztFQUFFO0VBQVc7RUFBWTtFQUFRO0VBQVksU0FBUztDQUFXO0FBQzFFO0FBYU8sSUFBVTtDQUFWLFNBQUEsZUFBQTtDQUNRLGNBQUEsWUFBc0MsUUFBVyxPQUM1RCxlQUFlLGNBQWMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsU0FBUyxVQUFVLENBQUM7Q0FFakUsY0FBQSxhQUNYLFFBQ0EsY0FFQSxlQUFlLGNBQWMsWUFBWSxDQUFDLFFBQVEsU0FBUyxHQUFHLENBQUMsU0FBUyxXQUFXLENBQUM7QUFDdkYsRUFBQSxDQUFBLGlCQUFBLGVBQUEsQ0FBQSxFQUFEO0FBRU8sSUFBVTtDQUFWLFNBQUEsaUJBQUE7Q0FDUSxnQkFBQSxjQUEwQyxRQUFXLE9BQ2hFLGVBQWUsZ0JBQWdCLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFdBQVcsWUFBWSxDQUFDO0NBRXZFLGdCQUFBLGVBQ1gsUUFDQSxjQUVBLGVBQWUsZ0JBQWdCLFlBQVksQ0FBQyxRQUFRLFNBQVMsR0FBRyxDQUFDLFdBQVcsYUFBYSxDQUFDO0NBRS9FLGdCQUFBLHVCQUNYLGVBQWUsZ0JBQWdCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLGdCQUFnQixDQUFDO0FBQ25GLEVBQUEsQ0FBQSxtQkFBQSxpQkFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSx3QkFBQTtDQUNRLHVCQUFBLHFCQUNYLFFBQ0EsT0FFQSxlQUNFLHVCQUNBLFlBQ0EsQ0FBQyxRQUFRLEVBQUUsR0FDWCxDQUFDLGtCQUFrQixtQkFBbUIsQ0FDeEM7Q0FFVyx1QkFBQSxzQkFJWCxRQUNBLGNBRUEsZUFDRSx1QkFDQSxZQUNBLENBQUMsUUFBUSxTQUFTLEdBQ2xCLENBQUMsa0JBQWtCLG9CQUFvQixDQUN6QztBQUNILEVBQUEsQ0FBQSwwQkFBQSx3QkFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxvQkFBQTtDQUNRLG1CQUFBLGlCQUFnRCxRQUFXLE9BQ3RFLGVBQWUsbUJBQW1CLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGNBQWMsZUFBZSxDQUFDO0NBRWhGLG1CQUFBLGtCQUNYLFFBQ0EsY0FFQSxlQUNFLG1CQUNBLFlBQ0EsQ0FBQyxRQUFRLFNBQVMsR0FDbEIsQ0FBQyxjQUFjLGdCQUFnQixDQUNqQztDQUVXLG1CQUFBLGtCQUFrQixPQUM3QixlQUFlLG1CQUFtQixrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxjQUFjLGdCQUFnQixDQUFDO0NBRS9FLG1CQUFBLGFBQWEsT0FDeEIsZUFBZSxtQkFBbUIsYUFBYSxDQUFDLEVBQUUsR0FBRyxDQUFDLGNBQWMsV0FBVyxDQUFDO0FBQ25GLEVBQUEsQ0FBQSxzQkFBQSxvQkFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxlQUFBO0NBQ1EsY0FBQSxjQUNYLGVBQWUsY0FBYyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDO0NBRWpELGNBQUEsYUFBYSxXQUN4QixlQUFlLGNBQWMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDO0NBRS9ELGNBQUEscUJBQ1gsZUFBZSxjQUFjLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLGNBQWMsQ0FBQztDQUUvRCxjQUFBLG1CQUNYLGVBQWUsY0FBYyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsWUFBWSxDQUFDO0NBRTNELGNBQUEsU0FBUyxZQUNwQixlQUFlLGNBQWMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDO0NBRXhELGNBQUEsZUFDWCxlQUFlLGNBQWMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFFBQVEsQ0FBQztBQUNqRSxFQUFBLENBQUEsaUJBQUEsZUFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxlQUFBO0NBQ1EsY0FBQSxhQUFhLFdBQ3hCLGVBQWUsY0FBYyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsU0FBUyxXQUFXLENBQUM7Q0FFL0QsY0FBQSxrQkFDWCxlQUFlLGNBQWMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFdBQVcsQ0FBQztDQUV6RCxjQUFBLG1CQUNYLGVBQWUsY0FBYyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsWUFBWSxDQUFDO0FBQ3pFLEVBQUEsQ0FBQSxpQkFBQSxlQUFBLENBQUEsRUFBRCJ9
@@ -12,6 +12,58 @@ function renderPrimitive(type) {
12
12
  if (type === "null") return "null";
13
13
  return "unknown";
14
14
  }
15
+ function renderZodPrimitive(type) {
16
+ if (type === "string") return "z.string()";
17
+ if (type === "number" || type === "integer") return "z.number()";
18
+ if (type === "boolean") return "z.boolean()";
19
+ if (type === "null") return "z.null()";
20
+ return "z.unknown()";
21
+ }
22
+ function renderZodEnum(values, enumValueLimit) {
23
+ if (values.length === 0) return "z.never()";
24
+ const visibleValues = enumValueLimit === void 0 ? values : values.slice(0, Math.max(0, enumValueLimit));
25
+ const omittedCount = values.length - visibleValues.length;
26
+ const suffix = omittedCount > 0 ? ` /* +${omittedCount} */` : "";
27
+ if (values.every((value) => typeof value === "string")) return `z.enum([${visibleValues.map((value) => JSON.stringify(value)).join(", ")}${suffix}])`;
28
+ const literals = visibleValues.map((value) => `z.literal(${JSON.stringify(value)})`);
29
+ if (literals.length === 1 && omittedCount === 0) return literals[0] ?? "z.never()";
30
+ return `z.union([${literals.join(", ")}${suffix}])`;
31
+ }
32
+ function renderZodNode(node, depth, enumValueLimit) {
33
+ if (node === true) return "z.unknown()";
34
+ if (!node || typeof node !== "object" || Array.isArray(node)) return "z.unknown()";
35
+ const schema = node;
36
+ if (Array.isArray(schema.enum)) return renderZodEnum(schema.enum, enumValueLimit);
37
+ if (schema.const !== void 0) return `z.literal(${JSON.stringify(schema.const)})`;
38
+ const variants = schema.anyOf ?? schema.oneOf;
39
+ if (Array.isArray(variants) && variants.length > 0) {
40
+ const rendered = [...new Set(variants.map((variant) => renderZodNode(variant, depth, enumValueLimit)))];
41
+ return rendered.length === 1 ? rendered[0] ?? "z.unknown()" : `z.union([${rendered.join(", ")}])`;
42
+ }
43
+ const type = schema.type;
44
+ if (Array.isArray(type)) {
45
+ const rendered = [...new Set(type.map(renderZodPrimitive))];
46
+ return rendered.length === 1 ? rendered[0] ?? "z.unknown()" : `z.union([${rendered.join(", ")}])`;
47
+ }
48
+ if (type === "object" || type === void 0 && schema.properties) {
49
+ const properties = schema.properties ?? {};
50
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
51
+ const keys = Object.keys(properties);
52
+ if (keys.length === 0) return "z.object({})";
53
+ const orderedKeys = [...keys.filter((key) => required.has(key)), ...keys.filter((key) => !required.has(key))];
54
+ const inner = " ".repeat(depth + 1);
55
+ return `z.object({\n${orderedKeys.map((key) => {
56
+ const propertySchema = properties[key];
57
+ const rendered = renderZodNode(propertySchema, depth + 1, enumValueLimit);
58
+ const optional = required.has(key) ? rendered : `${rendered}.optional()`;
59
+ const defaultValue = propertySchema && typeof propertySchema === "object" && !Array.isArray(propertySchema) && Object.hasOwn(propertySchema, "default") ? JSON.stringify(propertySchema.default) : void 0;
60
+ const defaultComment = defaultValue === void 0 ? "" : ` // default=${defaultValue}`;
61
+ return `${inner}${renderKey(key)}: ${optional},${defaultComment}`;
62
+ }).join("\n")}\n${" ".repeat(depth)}})`;
63
+ }
64
+ if (type === "array") return `z.array(${renderZodNode(schema.items, depth, enumValueLimit)})`;
65
+ return renderZodPrimitive(type);
66
+ }
15
67
  function renderNode(node, depth) {
16
68
  if (node === true) return "unknown";
17
69
  if (!node || typeof node !== "object" || Array.isArray(node)) return "unknown";
@@ -41,6 +93,10 @@ function renderNode(node, depth) {
41
93
  function renderParsedJsonSchemaTypeText(schema, name = "Response") {
42
94
  return `type ${name} = ${renderNode(schema, 0)}`;
43
95
  }
96
+ /** Tool input 계약용 표시 전용 Zod shape. 검증 제약은 의도적으로 생략한다. */
97
+ function renderJsonSchemaZodShapeText(schema, enumValueLimit) {
98
+ return renderZodNode(schema, 0, enumValueLimit);
99
+ }
44
100
  /** 실패(파싱 불가 등) 시 null — 호출부가 표시 자체를 생략한다. */
45
101
  function renderJsonSchemaTypeText(schemaJson, name = "Response") {
46
102
  try {
@@ -50,6 +106,6 @@ function renderJsonSchemaTypeText(schemaJson, name = "Response") {
50
106
  }
51
107
  }
52
108
  //#endregion
53
- export { IDENT_SOURCE, renderJsonSchemaTypeText, renderParsedJsonSchemaTypeText };
109
+ export { IDENT_SOURCE, renderJsonSchemaTypeText, renderJsonSchemaZodShapeText, renderParsedJsonSchemaTypeText };
54
110
 
55
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxudHlwZSBTY2hlbWFOb2RlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKiBUUy96b2Qg7ZGc7IucIOy9lOuTnCDqs7Xsmqkg7Iud67OE7J6QIO2MkOuzhCDigJQgem9kLWNvZGUtZm9ybWF0IOydmCDtgqQgdW5xdW90ZSDrj4Qg7J206rG4IOyTtOuLpC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVF9TT1VSQ0UgPSBcIltBLVphLXpfJF1bXFxcXHckXSpcIjtcbmNvbnN0IElERU5UX1JFID0gbmV3IFJlZ0V4cChgXiR7SURFTlRfU09VUkNFfSRgKTtcblxuZnVuY3Rpb24gcmVuZGVyS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIElERU5UX1JFLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZSh0eXBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAodHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwibnVtYmVyXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhblwiO1xuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcbiAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOb2RlKG5vZGU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwidW5rbm93blwiO1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub2RlKSkgcmV0dXJuIFwidW5rbm93blwiO1xuICBjb25zdCBzY2hlbWEgPSBub2RlIGFzIFNjaGVtYU5vZGU7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7XG4gICAgcmV0dXJuIHNjaGVtYS5lbnVtLm1hcCgodmFsdWUpID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkuam9pbihcIiB8IFwiKTtcbiAgfVxuICBpZiAoc2NoZW1hLmNvbnN0ICE9PSB1bmRlZmluZWQpIHJldHVybiBKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gKHNjaGVtYS5hbnlPZiA/PyBzY2hlbWEub25lT2YpIGFzIHVua25vd247XG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyTm9kZSh2YXJpYW50LCBkZXB0aCkpKV0uam9pbihcIiB8IFwiKTtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodHlwZS5tYXAocmVuZGVyUHJpbWl0aXZlKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fCAodHlwZSA9PT0gdW5kZWZpbmVkICYmIHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSAoc2NoZW1hLnByb3BlcnRpZXMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJlcXVpcmVkID0gbmV3IFNldChBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgPyAoc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSA6IFtdKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlwiO1xuICAgIGNvbnN0IGlubmVyID0gXCIgIFwiLnJlcGVhdChkZXB0aCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0ga2V5cy5tYXAoXG4gICAgICAoa2V5KSA9PlxuICAgICAgICBgJHtpbm5lcn0ke3JlbmRlcktleShrZXkpfSR7cmVxdWlyZWQuaGFzKGtleSkgPyBcIlwiIDogXCI/XCJ9OiAke3JlbmRlck5vZGUocHJvcGVydGllc1trZXldLCBkZXB0aCArIDEpfWAsXG4gICAgKTtcbiAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtcIiAgXCIucmVwZWF0KGRlcHRoKX19YDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtID0gcmVuZGVyTm9kZShzY2hlbWEuaXRlbXMsIGRlcHRoKTtcbiAgICAvLyDsnKDri4jsmKgg7JqU7IaM64qUIOq0hO2YuOqwgCDsl4bsnLzrqbQgYEEgfCBCW11gIOuhnCDsnpjrqrsg7J297Z6M64ukLlxuICAgIGlmIChpdGVtLmluY2x1ZGVzKFwiIHwgXCIpKSByZXR1cm4gYCgke2l0ZW19KVtdYDtcbiAgICByZXR1cm4gYCR7aXRlbX1bXWA7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyUHJpbWl0aXZlKHR5cGUpO1xufVxuXG4vKiog7J2066+4IO2MjOyLseuQnCDsiqTtgqTrp4gg6rCS7JqpIOKAlCDtmLjstpzrtoDqsIAg6rCZ7J2AIEpTT04g7J2EIOuRkCDrsogg7YyM7Iux7ZWY7KeAIOyViuqyjCDtlZzri6QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0KHNjaGVtYTogdW5rbm93biwgbmFtZSA9IFwiUmVzcG9uc2VcIik6IHN0cmluZyB7XG4gIHJldHVybiBgdHlwZSAke25hbWV9ID0gJHtyZW5kZXJOb2RlKHNjaGVtYSwgMCl9YDtcbn1cblxuLyoqIOyLpO2MqCjtjIzsi7Eg67aI6rCAIOuTsSkg7IucIG51bGwg4oCUIO2YuOy2nOu2gOqwgCDtkZzsi5wg7J6Q7LK066W8IOyDneuete2VnOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJKc29uU2NoZW1hVHlwZVRleHQoc2NoZW1hSnNvbjogc3RyaW5nLCBuYW1lID0gXCJSZXNwb25zZVwiKTogc3RyaW5nIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChKU09OLnBhcnNlKHNjaGVtYUpzb24pIGFzIHVua25vd24sIG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOztB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
111
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxudHlwZSBTY2hlbWFOb2RlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKiBUUy96b2Qg7ZGc7IucIOy9lOuTnCDqs7Xsmqkg7Iud67OE7J6QIO2MkOuzhCDigJQgem9kLWNvZGUtZm9ybWF0IOydmCDtgqQgdW5xdW90ZSDrj4Qg7J206rG4IOyTtOuLpC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVF9TT1VSQ0UgPSBcIltBLVphLXpfJF1bXFxcXHckXSpcIjtcbmNvbnN0IElERU5UX1JFID0gbmV3IFJlZ0V4cChgXiR7SURFTlRfU09VUkNFfSRgKTtcblxuZnVuY3Rpb24gcmVuZGVyS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIElERU5UX1JFLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZSh0eXBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAodHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwibnVtYmVyXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhblwiO1xuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcbiAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RQcmltaXRpdmUodHlwZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgaWYgKHR5cGUgPT09IFwibnVsbFwiKSByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RFbnVtKHZhbHVlczogdW5rbm93bltdLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcblxuICBjb25zdCB2aXNpYmxlVmFsdWVzID1cbiAgICBlbnVtVmFsdWVMaW1pdCA9PT0gdW5kZWZpbmVkID8gdmFsdWVzIDogdmFsdWVzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGVudW1WYWx1ZUxpbWl0KSk7XG4gIGNvbnN0IG9taXR0ZWRDb3VudCA9IHZhbHVlcy5sZW5ndGggLSB2aXNpYmxlVmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgc3VmZml4ID0gb21pdHRlZENvdW50ID4gMCA/IGAgLyogKyR7b21pdHRlZENvdW50fSAqL2AgOiBcIlwiO1xuXG4gIGlmICh2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIGB6LmVudW0oWyR7dmlzaWJsZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG4gIH1cblxuICBjb25zdCBsaXRlcmFscyA9IHZpc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG4gIGlmIChsaXRlcmFscy5sZW5ndGggPT09IDEgJiYgb21pdHRlZENvdW50ID09PSAwKSByZXR1cm4gbGl0ZXJhbHNbMF0gPz8gXCJ6Lm5ldmVyKClcIjtcbiAgcmV0dXJuIGB6LnVuaW9uKFske2xpdGVyYWxzLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZE5vZGUobm9kZTogdW5rbm93biwgZGVwdGg6IG51bWJlciwgZW51bVZhbHVlTGltaXQ/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gIGNvbnN0IHNjaGVtYSA9IG5vZGUgYXMgU2NoZW1hTm9kZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHJldHVybiByZW5kZXJab2RFbnVtKHNjaGVtYS5lbnVtLCBlbnVtVmFsdWVMaW1pdCk7XG4gIGlmIChzY2hlbWEuY29uc3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGB6LmxpdGVyYWwoJHtKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpfSlgO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gKHNjaGVtYS5hbnlPZiA/PyBzY2hlbWEub25lT2YpIGFzIHVua25vd247XG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyWm9kTm9kZSh2YXJpYW50LCBkZXB0aCwgZW51bVZhbHVlTGltaXQpKSksXG4gICAgXTtcbiAgICByZXR1cm4gcmVuZGVyZWQubGVuZ3RoID09PSAxXG4gICAgICA/IChyZW5kZXJlZFswXSA/PyBcInoudW5rbm93bigpXCIpXG4gICAgICA6IGB6LnVuaW9uKFske3JlbmRlcmVkLmpvaW4oXCIsIFwiKX1dKWA7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbLi4ubmV3IFNldCh0eXBlLm1hcChyZW5kZXJab2RQcmltaXRpdmUpKV07XG4gICAgcmV0dXJuIHJlbmRlcmVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyAocmVuZGVyZWRbMF0gPz8gXCJ6LnVua25vd24oKVwiKVxuICAgICAgOiBgei51bmlvbihbJHtyZW5kZXJlZC5qb2luKFwiLCBcIil9XSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiei5vYmplY3Qoe30pXCI7XG4gICAgY29uc3Qgb3JkZXJlZEtleXMgPSBbXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiByZXF1aXJlZC5oYXMoa2V5KSksXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiAhcmVxdWlyZWQuaGFzKGtleSkpLFxuICAgIF07XG5cbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IG9yZGVyZWRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVyWm9kTm9kZShwcm9wZXJ0eVNjaGVtYSwgZGVwdGggKyAxLCBlbnVtVmFsdWVMaW1pdCk7XG4gICAgICBjb25zdCBvcHRpb25hbCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gcmVuZGVyZWQgOiBgJHtyZW5kZXJlZH0ub3B0aW9uYWwoKWA7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICBwcm9wZXJ0eVNjaGVtYSAmJlxuICAgICAgICB0eXBlb2YgcHJvcGVydHlTY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocHJvcGVydHlTY2hlbWEpICYmXG4gICAgICAgIE9iamVjdC5oYXNPd24ocHJvcGVydHlTY2hlbWEsIFwiZGVmYXVsdFwiKVxuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoKHByb3BlcnR5U2NoZW1hIGFzIFNjaGVtYU5vZGUpLmRlZmF1bHQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZWZhdWx0Q29tbWVudCA9IGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgLy8gZGVmYXVsdD0ke2RlZmF1bHRWYWx1ZX1gO1xuICAgICAgcmV0dXJuIGAke2lubmVyfSR7cmVuZGVyS2V5KGtleSl9OiAke29wdGlvbmFsfSwke2RlZmF1bHRDb21tZW50fWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB6Lm9iamVjdCh7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBgei5hcnJheSgke3JlbmRlclpvZE5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCwgZW51bVZhbHVlTGltaXQpfSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclpvZFByaW1pdGl2ZSh0eXBlKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTm9kZShub2RlOiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT09IHRydWUpIHJldHVybiBcInVua25vd25cIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInVua25vd25cIjtcbiAgY29uc3Qgc2NoZW1hID0gbm9kZSBhcyBTY2hlbWFOb2RlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5jb25zdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmNvbnN0KTtcblxuICBjb25zdCB2YXJpYW50cyA9IChzY2hlbWEuYW55T2YgPz8gc2NoZW1hLm9uZU9mKSBhcyB1bmtub3duO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYW50cykgJiYgdmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh2YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+IHJlbmRlck5vZGUodmFyaWFudCwgZGVwdGgpKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHR5cGUubWFwKHJlbmRlclByaW1pdGl2ZSkpXS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IGtleXMubWFwKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX0ke3JlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wifTogJHtyZW5kZXJOb2RlKHByb3BlcnRpZXNba2V5XSwgZGVwdGggKyAxKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fWA7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbSA9IHJlbmRlck5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCk7XG4gICAgLy8g7Jyg64uI7JioIOyalOyGjOuKlCDqtITtmLjqsIAg7JeG7Jy866m0IGBBIHwgQltdYCDroZwg7J6Y66q7IOydve2ejOuLpC5cbiAgICBpZiAoaXRlbS5pbmNsdWRlcyhcIiB8IFwiKSkgcmV0dXJuIGAoJHtpdGVtfSlbXWA7XG4gICAgcmV0dXJuIGAke2l0ZW19W11gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclByaW1pdGl2ZSh0eXBlKTtcbn1cblxuLyoqIOydtOuvuCDtjIzsi7HrkJwg7Iqk7YKk66eIIOqwkuyaqSDigJQg7Zi47Lac67aA6rCAIOqwmeydgCBKU09OIOydhCDrkZAg67KIIO2MjOyLse2VmOyngCDslYrqsowg7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWE6IHVua25vd24sIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcge1xuICByZXR1cm4gYHR5cGUgJHtuYW1lfSA9ICR7cmVuZGVyTm9kZShzY2hlbWEsIDApfWA7XG59XG5cbi8qKiBUb29sIGlucHV0IOqzhOyVveyaqSDtkZzsi5wg7KCE7JqpIFpvZCBzaGFwZS4g6rKA7KadIOygnOyVveydgCDsnZjrj4TsoIHsnLzroZwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoc2NoZW1hOiB1bmtub3duLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJab2ROb2RlKHNjaGVtYSwgMCwgZW51bVZhbHVlTGltaXQpO1xufVxuXG4vKiog7Iuk7YyoKO2MjOyLsSDrtojqsIAg65OxKSDsi5wgbnVsbCDigJQg7Zi47Lac67aA6rCAIO2RnOyLnCDsnpDssrTrpbwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWFKc29uOiBzdHJpbmcsIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0KEpTT04ucGFyc2Uoc2NoZW1hSnNvbikgYXMgdW5rbm93biwgbmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBWUEsTUFBYSxlQUFlO0FBQzVCLE1BQU0sV0FBVyxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUU7QUFFL0MsU0FBUyxVQUFVLEtBQXFCO0NBQ3RDLE9BQU8sU0FBUyxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssVUFBVSxHQUFHO0FBQ3REO0FBRUEsU0FBUyxnQkFBZ0IsTUFBdUI7Q0FDOUMsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxtQkFBbUIsTUFBdUI7Q0FDakQsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxjQUFjLFFBQW1CLGdCQUFpQztDQUN6RSxJQUFJLE9BQU8sV0FBVyxHQUFHLE9BQU87Q0FFaEMsTUFBTSxnQkFDSixtQkFBbUIsU0FBWSxTQUFTLE9BQU8sTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFH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
@@ -1,7 +1,7 @@
1
1
  import { SD } from "../../i18n/sd.generated.js";
2
2
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
3
3
  import { requestLogLoaderQueries, requestLogSubsetQueries } from "../sonamu.generated.sso.js";
4
- import { renderParsedJsonSchemaTypeText } from "./json-schema-type-text.js";
4
+ import { renderJsonSchemaZodShapeText, renderParsedJsonSchemaTypeText } from "./json-schema-type-text.js";
5
5
  import { formatZodCode } from "./zod-code-format.js";
6
6
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
7
7
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
@@ -10,6 +10,16 @@ import { jsonSchemaToZod } from "json-schema-to-zod";
10
10
  //#region src/application/request-log/request-log.model.ts
11
11
  const MICRO_USD = 1e6;
12
12
  const REQUEST_LOG_RUN_LOCK_CLASS_ID = 718;
13
+ const TOOL_ENUM_VALUE_LIMIT = 6;
14
+ function decodeStoredTools(value) {
15
+ if (!value) return null;
16
+ if (typeof value !== "string") return value;
17
+ try {
18
+ return JSON.parse(value);
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
13
23
  const STEP_AGGREGATE_SELECT = {
14
24
  input_tokens: "input_tokens",
15
25
  output_tokens: "output_tokens",
@@ -138,7 +148,6 @@ var RequestLogModelClass = class extends BaseModelClass {
138
148
  else if (params.project_name_is_not_null) qb.where("request_logs.project_name", "!=", null);
139
149
  else if (params.project_name) qb.where("request_logs.project_name", params.project_name);
140
150
  if (params.model_name) qb.where("request_logs.model_name", params.model_name);
141
- if (params.response_json_broken) qb.where("request_logs.response_json_ok", false);
142
151
  if (params.search && params.keyword && params.keyword.length > 0) if (params.search === "id") qb.where("request_logs.id", Number(params.keyword));
143
152
  else if (params.search === "token_name") qb.where("request_logs.token_name", "like", `%${params.keyword}%`);
144
153
  else if (params.search === "user_prompt") qb.where("request_logs.user_prompt", "like", `%${params.keyword}%`);
@@ -242,6 +251,29 @@ var RequestLogModelClass = class extends BaseModelClass {
242
251
  zod
243
252
  };
244
253
  }
254
+ /**
255
+ * 요청에 장착된 tool 계약을 detail 화면용으로 축약한다. JSONB 는 이미 decode 된
256
+ * 배열로 오며 문자열인 경우만 방어적으로 parse 한다. 저장된 QgridTool 계약은
257
+ * 전수 검사로 확인됐으므로 항목별 보정이나 unreadable sentinel 은 만들지 않는다.
258
+ * 다만 `QgridTool.inputSchema` 는 `z.unknown()` 이라 키가 없거나 null 인 값도
259
+ * wire 검증을 통과하므로 빈 스키마로 정규화한다 — SDK 는 `{}` 로 채워 보낸다.
260
+ */
261
+ async toolsView(id) {
262
+ const tools = decodeStoredTools((await this.getPuri("r").from("request_logs").select({ tools: "request_logs.tools" }).where("request_logs.id", id).first())?.tools);
263
+ if (!tools) return [];
264
+ return tools.map((tool) => {
265
+ const inputSchema = tool.inputSchema ?? {};
266
+ const inputZod = renderJsonSchemaZodShapeText(inputSchema, TOOL_ENUM_VALUE_LIMIT);
267
+ const fullInputZod = renderJsonSchemaZodShapeText(inputSchema);
268
+ return {
269
+ name: tool.name,
270
+ ...tool.description !== void 0 ? { description: tool.description } : {},
271
+ parameterCount: Object.keys(inputSchema.properties ?? {}).length,
272
+ inputZod,
273
+ ...inputZod !== fullInputZod ? { fullInputZod } : {}
274
+ };
275
+ });
276
+ }
245
277
  async createRun(params) {
246
278
  const wdb = this.getPuri("w");
247
279
  wdb.ubRegister("request_logs", {
@@ -507,6 +539,15 @@ __decorate([
507
539
  __decorateMetadata("design:paramtypes", [Number]),
508
540
  __decorateMetadata("design:returntype", Promise)
509
541
  ], RequestLogModelClass.prototype, "responseTypeTs", null);
542
+ __decorate([
543
+ api({
544
+ httpMethod: "GET",
545
+ clients: ["axios", "tanstack-query"]
546
+ }),
547
+ __decorateMetadata("design:type", Function),
548
+ __decorateMetadata("design:paramtypes", [Number]),
549
+ __decorateMetadata("design:returntype", Promise)
550
+ ], RequestLogModelClass.prototype, "toolsView", null);
510
551
  __decorate([
511
552
  transactional({ dbPreset: "w" }),
512
553
  __decorateMetadata("design:type", Function),
@@ -536,4 +577,4 @@ const RequestLogModel = new RequestLogModelClass();
536
577
  //#endregion
537
578
  export { MICRO_USD, RequestLogModel };
538
579
 
539
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQgfSBmcm9tIFwiLi9qc29uLXNjaGVtYS10eXBlLXRleHRcIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gIHR5cGUgUmVxdWVzdExvZ1NhdmVQYXJhbXMsXG4gIHR5cGUgVG9vbERlZmluaXRpb25zLFxufSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Wm9kQ29kZSB9IGZyb20gXCIuL3pvZC1jb2RlLWZvcm1hdFwiO1xuXG4vLyBjb3N0X3VzZOuKlCDsoJXsiJggbWljcm8tVVNE66GcIOyggOyepS4g7Iuk7KCcIFVTRCA9IGNvc3RfdXNkIC8gTUlDUk9fVVNELlxuZXhwb3J0IGNvbnN0IE1JQ1JPX1VTRCA9IDFfMDAwXzAwMDtcbmNvbnN0IFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lEID0gNzE4O1xuXG50eXBlIFRvb2xSZXN1bHRDb250aW51YXRpb24gPSB7XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgb3V0cHV0OiBzdHJpbmc7XG4gIGlzRXJyb3I/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXF1ZXN0TG9nU3RlcEFnZ3JlZ2F0ZSA9IHtcbiAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyO1xuICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICBmYWxsYmFja19jb3VudDogbnVtYmVyO1xuICBjb3N0X3VzZDogbnVtYmVyO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZztcbn07XG5cbmNvbnN0IFNURVBfQUdHUkVHQVRFX1NFTEVDVCA9IHtcbiAgaW5wdXRfdG9rZW5zOiBcImlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcIm91dHB1dF90b2tlbnNcIixcbiAgY2FjaGVfcmVhZF90b2tlbnM6IFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgZmFsbGJhY2tfY291bnQ6IFwiZmFsbGJhY2tfY291bnRcIixcbiAgY29zdF91c2Q6IFwiY29zdF91c2RcIixcbiAgY29zdF9zb3VyY2U6IFwiY29zdF9zb3VyY2VcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUge1xuICBjb25zdCBzdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciA9PlxuICAgIHJvd3MucmVkdWNlKCh0b3RhbCwgcm93KSA9PiB0b3RhbCArIE51bWJlcihyb3dbZmllbGRdID8/IDApLCAwKTtcbiAgY29uc3Qgb3B0aW9uYWxTdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgIHJvd3Muc29tZSgocm93KSA9PiByb3dbZmllbGRdICE9PSBudWxsICYmIHJvd1tmaWVsZF0gIT09IHVuZGVmaW5lZCkgPyBzdW0oZmllbGQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjb2xsYXBzZSA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICByb3dzXG4gICAgICAgICAgLm1hcCgocm93KSA9PiByb3dbZmllbGRdKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IFwibWl4ZWRcIjtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dF90b2tlbnM6IHN1bShcImlucHV0X3Rva2Vuc1wiKSxcbiAgICBvdXRwdXRfdG9rZW5zOiBzdW0oXCJvdXRwdXRfdG9rZW5zXCIpLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBzdW0oXCJjYWNoZV9yZWFkX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHN1bShcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIpLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogb3B0aW9uYWxTdW0oXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIiksXG4gICAgZHVyYXRpb25fbXM6IHN1bShcImR1cmF0aW9uX21zXCIpLFxuICAgIGZhbGxiYWNrX2NvdW50OiBzdW0oXCJmYWxsYmFja19jb3VudFwiKSxcbiAgICBjb3N0X3VzZDogc3VtKFwiY29zdF91c2RcIiksXG4gICAgY29zdF9zb3VyY2U6IGNvbGxhcHNlKFwiY29zdF9zb3VyY2VcIiksXG4gIH07XG59XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGlzQW50aHJvcGljVXNhZ2VSb3cocm93OiBQaWNrPFJlcXVlc3RMb2dVc2FnZVJvdywgXCJ0b2tlbl9uYW1lXCIgfCBcIm1vZGVsX25hbWVcIj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICByb3cudG9rZW5fbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImNsYXVkZS1cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9jbGF1ZGUtXCIpID09PSB0cnVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbE1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbE5hbWUuaW5jbHVkZXMoXCIvXCIpID8gbW9kZWxOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiBtb2RlbE5hbWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93OiBSZXF1ZXN0TG9nVXNhZ2VSb3cpOiB7XG4gIG1vZGVsOiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVkSW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbn0ge1xuICBjb25zdCBjYWNoZVJlYWQgPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBzdG9yZWRJbnB1dCA9IHJvdy5pbnB1dF90b2tlbnM7XG4gIGNvbnN0IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPVxuICAgIGlzQW50aHJvcGljVXNhZ2VSb3cocm93KSAmJiBzdG9yZWRJbnB1dCA8IGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb247XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHJvdy5tb2RlbF9uYW1lID8gY2Fub25pY2FsTW9kZWxOYW1lKHJvdy5tb2RlbF9uYW1lKSA6IG51bGwsXG4gICAgaW5wdXRUb2tlbnM6IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPyBzdG9yZWRJbnB1dCArIGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb24gOiBzdG9yZWRJbnB1dCxcbiAgICBvdXRwdXRUb2tlbnM6IHJvdy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIC8vIOyDiCByb3cg64qUIOuLueyLnOydmCBwcm92aWRlci/qsIDqsqntkZwg67mE7Jqp7J2EIO2ZleyglSDsoIDsnqXtlZzri6QuIO2YhOyerCDqsIDqsqntkZzroZwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgaWYgKHJvdy5jb3N0X3NvdXJjZSkgcmV0dXJuIHJvdztcbiAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gIGlmICh1c2FnZS5pbnB1dFRva2VucyA9PT0gcm93LmlucHV0X3Rva2VucykgcmV0dXJuIHJvdztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4ucm93LCBpbnB1dF90b2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zIH07XG4gIGlmICh1c2FnZS5tb2RlbCkge1xuICAgIG5vcm1hbGl6ZWQuY29zdF91c2QgPSBNYXRoLnJvdW5kKGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHVzYWdlKSAqIE1JQ1JPX1VTRCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogYG9yZGVyQnlgIGVudW0g6rCSKGDsu6zrn7wt67Cp7ZalYCnsnYQg7KCV66CsIOygiOuhnCDsmK7quLTri6QuXG4gKlxuICogZW51bSDsnbQgMTgg7KKF7J206528IOy8gOydtOyKpOulvCDsnbzsnbzsnbQg7KCB64qUIOuMgOyLoCDtjIzsi7HtlZjrkJgsIOy7rOufvOydgCDslYTrnpgg66qp66Gd7Jy866GcIO2VnOygle2VnOuLpCDigJRcbiAqIOusuOyekOyXtOydhCDqt7jrjIDroZwg7Lus65+866qF7JeQIOuEmOq4sOuptCBlbnVtIOydtCDrsJTrgJQg65WMIOqygOymnSDsl4bripQg7Iud67OE7J6Q6rCAIFNRTCDroZwg7Z2Y65+s65Og64ukLlxuICog66qp66Gd7JeQIOyXhuuKlCDqsJLsnYAg6riw67O4IOygleugrChpZCBkZXNjKeuhnCDrlqjslrTsp4Tri6QuXG4gKi9cbmNvbnN0IE9SREVSQUJMRV9DT0xVTU5TID0ge1xuICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ3MuY3JlYXRlZF9hdFwiLFxuICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFwcGx5T3JkZXJCeShcbiAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICBvcmRlckJ5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gb3JkZXJCeS5sYXN0SW5kZXhPZihcIi1cIik7XG4gIGNvbnN0IGtleSA9IG9yZGVyQnkuc2xpY2UoMCwgc2VwYXJhdG9yKSBhcyBrZXlvZiB0eXBlb2YgT1JERVJBQkxFX0NPTFVNTlM7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyQnkuc2xpY2Uoc2VwYXJhdG9yICsgMSkgPT09IFwiYXNjXCIgPyBcImFzY1wiIDogXCJkZXNjXCI7XG4gIGNvbnN0IGNvbHVtbiA9IE9SREVSQUJMRV9DT0xVTU5TW2tleV07XG5cbiAgaWYgKCFjb2x1bW4pIHtcbiAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcWIub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gIC8vIOuPmeygkCDtlonsnZgg7Iic7ISc6rCAIO2OmOydtOyngOuniOuLpCDtnZTrk6Trpqzsp4Ag7JWK6rKMIOqzoOycoCDsu6zrn7zsnLzroZwgdGllLWJyZWFrIO2VnOuLpC5cbiAgaWYgKGtleSAhPT0gXCJpZFwiKSBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMaXN0RmlsdGVycyhcbiAgICBxYjogUmV0dXJuVHlwZTxSZXF1ZXN0TG9nTW9kZWxDbGFzc1tcImdldFN1YnNldFF1ZXJpZXNcIl0+W1wicWJcIl0sXG4gICAgcGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICAvLyBzdHJ1Y3R1cmVkIOydkeuLteydtCBKU09OIO2MjOyLseyXkCDsi6TtjKjtlZwg7ZaJ66eMIOKAlCBicm9rZW4g67Cw7LmYIOyhsOyCrOyaqSDtlYTthLAuXG4gICAgaWYgKHBhcmFtcy5yZXNwb25zZV9qc29uX2Jyb2tlbikge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucmVzcG9uc2VfanNvbl9va1wiLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ0b2tlbl9uYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ1c2VyX3Byb21wdFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImlkLWRlc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIHRoaXMuYXBwbHlMaXN0RmlsdGVycyhxYiwgcGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkgYXBwbHlPcmRlckJ5KHFiLCBwYXJhbXMub3JkZXJCeSk7XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICBBOiAocm93KSA9PiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3cocm93KSxcbiAgICAgIEM6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBSZXF1ZXN0TG9nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDstZzqt7wg6rWs6rCE7J2YIHByb3ZpZGVyIOuzhCDqsr3rn4kg7Ya16rOEKOuqqOuLiO2EsOungeyaqSkuIHByb3ZpZGVyIOuKlCByZXF1ZXN0ZWRfbW9kZWxfbmFtZSDsnZhcbiAgICogXCJvcGVuYWkvLi4uXCIgfCBcImFudGhyb3BpYy8uLi5cIiBwcmVmaXgg66GcIO2MkOygle2VnOuLpCDigJQgc2VydmluZyBtb2RlbF9uYW1lIOydgCBwcmVmaXgg6rCAXG4gICAqIOyXhuqzoCwgcnVubmluZyDstIjquLDsl5Qg7JWE7KeBIOu5hOyWtCDsnojri6QuIOynkeqzhOuKlCBKUyDsl5DshJwg7ZWc64ukOiDtj7Trp4Eg7KO86riw6rCAIOuKkOyKqO2VmOqzoFxuICAgKiDqtazqsITsnbQg7Ken7JWEIHJvdyDsiJjqsIAg7J6R7Jy866mwLCBwcmVmaXggQ0FTRSDsi53snYQg7L+866asIOu5jOuNlOyXkCDrsJXsp4Ag7JWK7JWE64+EIOuQnOuLpC5cbiAgICovXG4gIGFzeW5jIHByb3ZpZGVyU3RhdHNTaW5jZShzaW5jZTogRGF0ZSk6IFByb21pc2U8XG4gICAgQXJyYXk8e1xuICAgICAgcHJvdmlkZXI6IHN0cmluZztcbiAgICAgIHJlcXVlc3RzOiBudW1iZXI7XG4gICAgICBlcnJvcnM6IG51bWJlcjtcbiAgICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgICBjYWNoZVJlYWRUb2tlbnM6IG51bWJlcjtcbiAgICB9PlxuICA+IHtcbiAgICBjb25zdCByZGIgPSB0aGlzLmdldFB1cmkoXCJyXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgcmRiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgICAgICBzdGF0dXM6IFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLFxuICAgICAgICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuY3JlYXRlZF9hdFwiLCBcIj49XCIsIHNpbmNlKSkgYXMgdW5rbm93biBhcyBBcnJheTx7XG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICAgIH0+O1xuXG4gICAgY29uc3QgYnlQcm92aWRlciA9IG5ldyBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICB7IHJlcXVlc3RzOiBudW1iZXI7IGVycm9yczogbnVtYmVyOyBpbnB1dFRva2VuczogbnVtYmVyOyBjYWNoZVJlYWRUb2tlbnM6IG51bWJlciB9XG4gICAgPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcm93LnJlcXVlc3RlZF9tb2RlbF9uYW1lID8/IFwiXCI7XG4gICAgICBjb25zdCBwcm92aWRlciA9IG1vZGVsLnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpXG4gICAgICAgID8gXCJvcGVuYWlcIlxuICAgICAgICA6IG1vZGVsLnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpXG4gICAgICAgICAgPyBcImFudGhyb3BpY1wiXG4gICAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIGNvbnN0IGFnZyA9IGJ5UHJvdmlkZXIuZ2V0KHByb3ZpZGVyKSA/PyB7XG4gICAgICAgIHJlcXVlc3RzOiAwLFxuICAgICAgICBlcnJvcnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IDAsXG4gICAgICB9O1xuICAgICAgYWdnLnJlcXVlc3RzICs9IDE7XG4gICAgICBpZiAocm93LnN0YXR1cyA9PT0gXCJlcnJvclwiKSBhZ2cuZXJyb3JzICs9IDE7XG4gICAgICBhZ2cuaW5wdXRUb2tlbnMgKz0gcm93LmlucHV0X3Rva2VucztcbiAgICAgIGFnZy5jYWNoZVJlYWRUb2tlbnMgKz0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICAgICAgYnlQcm92aWRlci5zZXQocHJvdmlkZXIsIGFnZyk7XG4gICAgfVxuICAgIHJldHVybiBbLi4uYnlQcm92aWRlci5lbnRyaWVzKCldXG4gICAgICAubWFwKChbcHJvdmlkZXIsIGFnZ10pID0+ICh7IHByb3ZpZGVyLCAuLi5hZ2cgfSkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEucHJvdmlkZXIubG9jYWxlQ29tcGFyZShiLnByb3ZpZGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogc3RydWN0dXJlZCBvdXRwdXQg7JqU7LKt7J2YIEpTT04gU2NoZW1hIOulvCDtkZzsi5zsmqkg7YOA7J6FIO2FjeyKpO2KuOuhnCDrs4DtmZjtlZzri6QuXG4gICAqIHR5cGVzY3JpcHQg64qUIOqwhOqysO2VnCBgdHlwZWAg7ISg7Ja4LCB6b2Qg64qUIOyerOq1rOyEseuQnCB6b2Qg7ZGc7ZiE7Iud7J2064ukIOKAlCDsm5Drs7ggem9kXG4gICAqIOyGjOyKpOuKlCB3aXJlIOulvCDqsbTrhIjsmKTrqbAg7IaM7Iuk65CY66+A66GcIHJlZmluZS90cmFuc2Zvcm0g66WY64qUIOuzteybkOuQmOyngCDslYrripTri6QuXG4gICAqIOyKpO2CpOuniOqwgCDsl4bqsbDrgpgg67OA7ZmYIOyLpO2MqOuptCBudWxsIOKAlCDtmZTrqbTsnYAg7ZW064u5IOu4lOuhnSDtkZzsi5zrpbwg7IOd65617ZWc64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgcmVzcG9uc2VUeXBlVHMoaWQ6IG51bWJlcik6IFByb21pc2U8e1xuICAgIHR5cGVzY3JpcHQ6IHN0cmluZyB8IG51bGw7XG4gICAgem9kOiBzdHJpbmcgfCBudWxsO1xuICB9PiB7XG4gICAgY29uc3QgcmRiID0gdGhpcy5nZXRQdXJpKFwiclwiKTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IHJkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyBqc29uX3NjaGVtYTogXCJyZXF1ZXN0X2xvZ3MuanNvbl9zY2hlbWFcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkKSkgYXMgdW5rbm93biBhcyBBcnJheTx7IGpzb25fc2NoZW1hOiBzdHJpbmcgfCBudWxsIH0+O1xuICAgIGNvbnN0IHNjaGVtYSA9IHJvd3NbMF0/Lmpzb25fc2NoZW1hO1xuICAgIGlmICghc2NoZW1hKSByZXR1cm4geyB0eXBlc2NyaXB0OiBudWxsLCB6b2Q6IG51bGwgfTtcblxuICAgIGxldCBwYXJzZWQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2Uoc2NoZW1hKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHR5cGVzY3JpcHQ6IG51bGwsIHpvZDogbnVsbCB9O1xuICAgIH1cbiAgICBsZXQgem9kOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgem9kID0gZm9ybWF0Wm9kQ29kZShcbiAgICAgICAganNvblNjaGVtYVRvWm9kKHBhcnNlZCBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBqc29uU2NoZW1hVG9ab2Q+WzBdLCB7IG1vZHVsZTogXCJub25lXCIgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgem9kID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZXNjcmlwdDogcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0KHBhcnNlZCksIHpvZCB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9ucztcbiAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICBqc29uX3NjaGVtYT86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAganNvbl9zY2hlbWE6IHBhcmFtcy5qc29uX3NjaGVtYSA/PyBudWxsLFxuICAgICAgaXNfc3RydWN0dXJlZDogcGFyYW1zLmpzb25fc2NoZW1hICE9PSBudWxsICYmIHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gdW5kZWZpbmVkLFxuICAgICAgLi4uKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQgPyB7IGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5IGFzIHsgdHlwZTogc3RyaW5nIH1bXSB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy50b29scyAhPT0gdW5kZWZpbmVkID8geyB0b29sczogcGFyYW1zLnRvb2xzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZmFsbGJhY2tfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF9zb3VyY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgaGlzdG9yeT86IHVua25vd247XG4gICAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgICAgdG9vbF9jYWxsX2NvdW50PzogbnVtYmVyO1xuICAgICAgaW1hZ2VfY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmVzcG9uc2VfanNvbl9vaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiICYmICFwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciBzdWNjZWVkZWQgcnVuc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IHJlcXVlc3RMb2dJZCwgc3RhdHVzOiBwYXJhbXMuc3RhdHVzIH07XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgXCJyZXNwb25zZVwiLFxuICAgICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICAgIFwiY29zdF9zb3VyY2VcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIFwicmVzcG9uc2VfanNvbl9va1wiLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRzKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdXBkYXRlW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHVwZGF0ZS5oaXN0b3J5ID0gcGFyYW1zLmhpc3Rvcnk7XG4gICAgdXBkYXRlLnR0ZnRfbXMgPSAoYXdhaXQgdGhpcy5maXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkKSkgPz8gMDtcblxuICAgIC8vIOyEnOuyhCBydW4g6rK966Gc64qUIHN0ZXAg7JeQ7IScIO2Zleygle2VnCBleGFjdCBjb3N0IOulvCDrhJjquLTri6QuIOyZuOu2gC9sZWdhY3kgY2FsbGVyIOqwgCDruYTsmqnsnYRcbiAgICAvLyDsg53rnrXtlZwg6rK97Jqw7JeQ66eMIOyggOyepeuQnCDrqqjrjbgrdXNhZ2Ug66GcIOqzhOyCsO2VnOuLpC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29zdF91c2QgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmlucHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAgIC5zZWxlY3QoeyBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIiB9KVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5maXJzdCgpO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTW9kZWxOYW1lID0gcGFyYW1zLm1vZGVsX25hbWUgPz8gcm93Py5tb2RlbF9uYW1lO1xuICAgICAgaWYgKGVmZmVjdGl2ZU1vZGVsTmFtZSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbE1vZGVsTmFtZShlZmZlY3RpdmVNb2RlbE5hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IGVmZmVjdGl2ZU1vZGVsTmFtZSxcbiAgICAgICAgICBpbnB1dF90b2tlbnM6IHBhcmFtcy5pbnB1dF90b2tlbnMsXG4gICAgICAgICAgb3V0cHV0X3Rva2VuczogcGFyYW1zLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHBhcmFtcy5jYWNoZV9yZWFkX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3NvdXJjZSA9IFwicHJpY2luZ190YWJsZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgdXBkYXRlKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmlyc3RHZW5lcmF0ZVN0ZXBUdGZ0KHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gcm93Py50dGZ0X21zID09PSBudWxsIHx8IHJvdz8udHRmdF9tcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihyb3cudHRmdF9tcyk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoU1RFUF9BR0dSRUdBVEVfU0VMRUNUKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpO1xuICAgIHJldHVybiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBzdGFsZSBjYW5kaWRhdGVzLCB0aGVuIGV4cGlyZXMgZWFjaCBydW4gaW4gaXRzIG93biBzaG9ydCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIGNhbmRpZGF0ZSBxdWVyeSBpcyBvbmx5IGEgaGludDsgdGhlIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHJlY2hlY2tzIGl0XG4gICAqIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCB0b29sIGZvbGxvdy11cHMuXG4gICAqL1xuICBhc3luYyBleHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICB0aHJlc2hvbGRNczogbnVtYmVyLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIgPSAxMCxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSB0aHJlc2hvbGRNcyk7XG4gICAgY29uc3QgY2FuZGlkYXRlSWRzID0gYXdhaXQgdGhpcy5maW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkLCBsaW1pdCk7XG4gICAgY29uc3QgZXhwaXJlZElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RMb2dJZCBvZiBjYW5kaWRhdGVJZHMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4ocmVxdWVzdExvZ0lkLCB0aHJlc2hvbGQsIGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgZXhwaXJlZElkcy5wdXNoKHJlcXVlc3RMb2dJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHBpcmVkSWRzO1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlVG9vbFdhaXRpbmdSdW5DYW5kaWRhdGVzKHRocmVzaG9sZDogRGF0ZSwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwid1wiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5qb2luKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiKVxuICAgICAgLmRpc3RpbmN0KFwicmVxdWVzdF9sb2dzLmlkXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5zdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX3Jlc3VsdFwiLCBudWxsKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMuZXJyb3JcIiwgbnVsbClcbiAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKCh7IGlkIH0pID0+IGlkKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKHsgZGJQcmVzZXQ6IFwid1wiIH0pXG4gIGFzeW5jIHRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdGhyZXNob2xkOiBEYXRlLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGNvbnN0IGxvY2tSZXN1bHQgPSAoYXdhaXQgd2RiLmtuZXgucmF3KFwiU0VMRUNUIHBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2soPywgPykgQVMgYWNxdWlyZWRcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSkpIGFzIHsgcm93cz86IEFycmF5PHsgYWNxdWlyZWQ/OiBib29sZWFuIH0+IH07XG4gICAgaWYgKGxvY2tSZXN1bHQucm93cz8uWzBdPy5hY3F1aXJlZCAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVGhlIGZvbGxvdy11cCBwYXRoIHVzZXMgdGhlIHNhbWUgd3JpdGVyIHRyYW5zYWN0aW9uIGxvY2suIFJlY2hlY2sgYWZ0ZXJcbiAgICAvLyBsb2NraW5nIHNvIGEgcmVzdWx0IGNvbW1pdHRlZCBkdXJpbmcgY2FuZGlkYXRlIGRpc2NvdmVyeSBtYWtlcyB0aGlzIGEgbm8tb3AuXG4gICAgY29uc3QgdW5yZXNvbHZlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IGlkOiBcImlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcImNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJlcnJvclwiLCBudWxsKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCF1bnJlc29sdmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwUm93cyA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgY29uc3QgYWdncmVnYXRlID0gYWdncmVnYXRlR2VuZXJhdGVTdGVwUm93cyhzdGVwUm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICAgIGNvbnN0IGZpcnN0VHRmdCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAudXBkYXRlKHtcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBhZ2dyZWdhdGUub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgZmFsbGJhY2tfY291bnQ6IGFnZ3JlZ2F0ZS5mYWxsYmFja19jb3VudCxcbiAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSAhPT0gdW5kZWZpbmVkID8geyBjb3N0X3NvdXJjZTogYWdncmVnYXRlLmNvc3Rfc291cmNlIH0gOiB7fSksXG4gICAgICAgIHR0ZnRfbXM6XG4gICAgICAgICAgZmlyc3RUdGZ0Py50dGZ0X21zID09PSBudWxsIHx8IGZpcnN0VHRmdD8udHRmdF9tcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogTnVtYmVyKGZpcnN0VHRmdC50dGZ0X21zKSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVkID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmF0aXZlIHFncmlkIHRvb2wgZm9sbG93LXVwIGFuZCBjb21wdXRlcyBpdHMgbmV4dCBzdGVwIGluZGV4IHdoaWxlXG4gICAqIGhvbGRpbmcgdGhlIHBlci1ydW4gYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCBzdGFsZSBjbGVhbnVwLlxuICAgKi9cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgY29udGludWVUb29sUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRvb2xSZXN1bHRzOiBUb29sUmVzdWx0Q29udGludWF0aW9uW10sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfeGFjdF9sb2NrKD8sID8pXCIsIFtcbiAgICAgIFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lELFxuICAgICAgcmVxdWVzdExvZ0lkLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IHN0YXR1czogXCJzdGF0dXNcIiB9KVxuICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCFydW4pIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBub3QgZm91bmRgKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBpcyBhbHJlYWR5ICR7cnVuLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0b29sUmVzdWx0cykge1xuICAgICAgYXdhaXQgd2RiXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgcmVzdWx0LnRvb2xDYWxsSWQpXG4gICAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgICAgLnVwZGF0ZShyZXN1bHQuaXNFcnJvciA/IHsgZXJyb3I6IHJlc3VsdC5vdXRwdXQgfSA6IHsgdG9vbF9yZXN1bHQ6IHJlc3VsdC5vdXRwdXQgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgbWF4X3N0ZXA6IFB1cmkubWF4KFwic3RlcF9pbmRleFwiKSB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgcmV0dXJuIChyb3c/Lm1heF9zdGVwID8/IC0xKSArIDE7XG4gIH1cblxuICAvKipcbiAgICog7ZmU66m0IO2RnOyLnOyaqSDstJ0g67mE7JqpLiDrqqnroZ3qs7wg6rCZ7J2AIO2VhO2EsOulvCDsoIHsmqntlZzri6QuXG4gICAqXG4gICAqIOyghOyytOulvCDsobDqsbQg7JeG7J20IFNVTSDtlZwg65KkLCBgY29zdF9zb3VyY2VgIOqwgCDsl4bripQgbGVnYWN5IHJvdyDsnZgg7LCo7JWh66eMIOuztOygle2VnOuLpC5cbiAgICog7KGw6rG0IOyXhuuKlCBTVU0g7J207Ja07JW8IGAocHJvamVjdF9uYW1lLCBjb3N0X3VzZClgIOy7pOuyhOungSDsnbjrjbHsiqTqsIAgSW5kZXggT25seSBTY2FuIOydhFxuICAgKiDtg4Tri6Qg4oCUIGBjb3N0X3NvdXJjZSBJUyBOT1QgTlVMTGAg7J2EIOqxuOuptCDqt7gg7Lus65+87J20IOyduOuNseyKpOyXkCDsl4bslrQgaGVhcCDsnYQg64uk7IucIOu0kOyVvFxuICAgKiDtlZjrr4DroZwg7ZSM656Y64SI6rCAIOyduOuNseyKpOulvCDrsoTrpqzqs6Agc2VxIHNjYW4g7Jy866GcIOuPjOyVhOqwhOuLpCjsi6TsuKEgMjMwbXMg4oaSIDgxNG1zKS5cbiAgICpcbiAgICogbGVnYWN5IOuztOygleydhCDrgqjqsqjrkZQg7J207JygOiDrsLHtlYTroZwg6riw7KG0IGxlZ2FjeSDripQgMCDsnbQg65CY7JeI7KeA66eMLCDsmbjrtoAg66Gc6rGw6rCAXG4gICAqIGBBcHBlbmRTdGVwSW5wdXRgL2BGaW5pc2hSdW5JbnB1dGAg7Jy866GcIGNvc3RTb3VyY2Ug7JeG7J20IOuEo+ycvOuptCDri6Tsi5wg7IOd6ri4IOyImCDsnojri6QuXG4gICAqIOq3uOufsCByb3cg64qUIOyggOyepeqwkiDrjIDsi6Ag7ZiE7J6sIOqwgOqyqe2RnCDsnqzqs4TsgrDqsJLsnbQg66ee7Jy866+A66GcIOywqOyVoeydhCDrjZTtlZzri6QuXG4gICAqXG4gICAqIO2VhO2EsCDsobDqsbTsnYQg7Jes6riw7IScIOuLpOyLnCDqtaztmITtlZjsp4Ag7JWK6rOgIGBhcHBseUxpc3RGaWx0ZXJzYCDrpbwg6rO17Jyg7ZWY64qUIOqyg+ydtCDtlbXsi6zsnbTri6Qg4oCUXG4gICAqIOuRkCDsv7zrpqzqsIAg6rCB7J6QIO2VhO2EsOulvCDqsIDsp4DrqbQg7ZmU66m07JeQ7IScIO2VhO2EsOulvCDqsbjsl4jsnYQg65WMIO2WiSDsiJjsmYAg67mE7Jqp7J20IOyhsOyaqe2eiCDslrTquIvrgpzri6QuXG4gICAqL1xuICBhc3luYyB0b3RhbENvc3QocmF3UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyA9IHsgbnVtOiAwLCBwYWdlOiAxIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWI6IHRvdGFsUWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHRvdGFsUWIsIHBhcmFtcyk7XG4gICAgLy8gc3Vic2V0IHFiIOuKlCDsu6zrn7wg66qp66Gd7J20IOydtOuvuCBTRUxFQ1Qg7JeQIOuwle2YgCDsnojslrQg7KeR6rOE66W8IOyWueycvOuptCBHUk9VUCBCWSDsl5Drn6zqsIAg64Kc64ukLlxuICAgIC8vIGV4ZWN1dGVDb3VudFF1ZXJ5IOyZgCDqsJnsnYAg67Cp7Iud7Jy866GcIHNlbGVjdCDrpbwg67mE7Jqw6rOgIOynkeqzhOunjCDrgqjquLTri6QuXG4gICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgdG90YWxRYlxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAvLyDsnYzsiJgg7KCA7J6l6rCSKOqzvOqxsCDrsoTqt7gp7J2AIDAg7Jy866GcIOuIjOufrOyEnCDrjZTtlZzri6Qg4oCUIEpTIOyqvSBNYXRoLm1heCDsmYAg6rCZ7J2AIOq3nOy5mS5cbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICB0b3RhbDogUHVyaS5yYXdOdW1iZXIoXCJDT0FMRVNDRShTVU0oR1JFQVRFU1QocmVxdWVzdF9sb2dzLmNvc3RfdXNkLCAwKSksIDApXCIpLFxuICAgICAgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgeyBxYjogbGVnYWN5UWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKGxlZ2FjeVFiLCBwYXJhbXMpO1xuICAgIGNvbnN0IGxlZ2FjeVJvd3MgPSBhd2FpdCBsZWdhY3lRYlxuICAgICAgLndoZXJlUmF3KFwicmVxdWVzdF9sb2dzLmNvc3Rfc291cmNlIElTIE5VTEwgT1IgcmVxdWVzdF9sb2dzLmNvc3RfdXNkIElTIE5VTExcIilcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgICAgbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLFxuICAgICAgICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVkVG90YWwgPSBOdW1iZXIoc3RvcmVkPy50b3RhbCA/PyAwKSAvIE1JQ1JPX1VTRDtcblxuICAgIC8vIGxlZ2FjeSByb3cg64qUIOychCBTVU0g7JeQIOyggOyepeqwkuycvOuhnCDsnbTrr7gg7Y+s7ZWo65CY7Ja0IOyeiOuLpC4g7J6s6rOE7IKw6rCS6rO87J2YIOywqOyVoeunjCDrjZTtlZzri6QuXG4gICAgcmV0dXJuIGxlZ2FjeVJvd3MucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgY29uc3QgYWxyZWFkeVN1bW1lZCA9IE1hdGgubWF4KHJvdy5jb3N0X3VzZCA/PyAwLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICAgICAgaWYgKCF1c2FnZS5tb2RlbCkgcmV0dXJuIHN1bTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgIH0pIC1cbiAgICAgICAgYWxyZWFkeVN1bW1lZFxuICAgICAgKTtcbiAgICB9LCBzdG9yZWRUb3RhbCk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdFByb2plY3ROYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJwcm9qZWN0X25hbWVcIilcbiAgICAgIC53aGVyZShcInByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInByb2plY3RfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHByb2plY3RfbmFtZTogXCJwcm9qZWN0X25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5wcm9qZWN0X25hbWUhKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0TW9kZWxOYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJtb2RlbF9uYW1lXCIpXG4gICAgICAud2hlcmUoXCJtb2RlbF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwibW9kZWxfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLm1vZGVsX25hbWUhKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeFxuICAgICAgICAudGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmVJbihcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIsIGlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInJlcXVlc3RfbG9nc1wiKS53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ01vZGVsID0gbmV3IFJlcXVlc3RMb2dNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUF5QkEsTUFBYSxZQUFZO0FBQ3pCLE1BQU0sZ0NBQWdDO0FBcUJ0QyxNQUFNLHdCQUF3QjtDQUM1QixjQUFjO0NBQ2QsZUFBZTtDQUNmLG1CQUFtQjtDQUNuQix1QkFBdUI7Q0FDdkIsMEJBQTBCO0NBQzFCLDBCQUEwQjtDQUMxQixhQUFhO0NBQ2IsZ0JBQWdCO0NBQ2hCLFVBQVU7Q0FDVixhQUFhO0FBQ2Y7QUFFQSxTQUFTLDBCQUEwQixNQUErRDtD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
580
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQge1xuICByZW5kZXJKc29uU2NoZW1hWm9kU2hhcGVUZXh0LFxuICByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQsXG59IGZyb20gXCIuL2pzb24tc2NoZW1hLXR5cGUtdGV4dFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgdHlwZSBSZXF1ZXN0TG9nU2F2ZVBhcmFtcyxcbiAgdHlwZSBUb29sRGVmaW5pdGlvbnMsXG4gIHR5cGUgVG9vbFZpZXcsXG59IGZyb20gXCIuL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyBmb3JtYXRab2RDb2RlIH0gZnJvbSBcIi4vem9kLWNvZGUtZm9ybWF0XCI7XG5cbi8vIGNvc3RfdXNk64qUIOygleyImCBtaWNyby1VU0TroZwg7KCA7J6lLiDsi6TsoJwgVVNEID0gY29zdF91c2QgLyBNSUNST19VU0QuXG5leHBvcnQgY29uc3QgTUlDUk9fVVNEID0gMV8wMDBfMDAwO1xuY29uc3QgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQgPSA3MTg7XG5jb25zdCBUT09MX0VOVU1fVkFMVUVfTElNSVQgPSA2O1xuXG5mdW5jdGlvbiBkZWNvZGVTdG9yZWRUb29scyh2YWx1ZTogdW5rbm93bik6IFRvb2xEZWZpbml0aW9ucyB8IG51bGwge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlIGFzIFRvb2xEZWZpbml0aW9ucztcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgVG9vbERlZmluaXRpb25zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG50eXBlIFRvb2xSZXN1bHRDb250aW51YXRpb24gPSB7XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgb3V0cHV0OiBzdHJpbmc7XG4gIGlzRXJyb3I/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXF1ZXN0TG9nU3RlcEFnZ3JlZ2F0ZSA9IHtcbiAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyO1xuICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICBmYWxsYmFja19jb3VudDogbnVtYmVyO1xuICBjb3N0X3VzZDogbnVtYmVyO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZztcbn07XG5cbmNvbnN0IFNURVBfQUdHUkVHQVRFX1NFTEVDVCA9IHtcbiAgaW5wdXRfdG9rZW5zOiBcImlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcIm91dHB1dF90b2tlbnNcIixcbiAgY2FjaGVfcmVhZF90b2tlbnM6IFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgZmFsbGJhY2tfY291bnQ6IFwiZmFsbGJhY2tfY291bnRcIixcbiAgY29zdF91c2Q6IFwiY29zdF91c2RcIixcbiAgY29zdF9zb3VyY2U6IFwiY29zdF9zb3VyY2VcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUge1xuICBjb25zdCBzdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciA9PlxuICAgIHJvd3MucmVkdWNlKCh0b3RhbCwgcm93KSA9PiB0b3RhbCArIE51bWJlcihyb3dbZmllbGRdID8/IDApLCAwKTtcbiAgY29uc3Qgb3B0aW9uYWxTdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgIHJvd3Muc29tZSgocm93KSA9PiByb3dbZmllbGRdICE9PSBudWxsICYmIHJvd1tmaWVsZF0gIT09IHVuZGVmaW5lZCkgPyBzdW0oZmllbGQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjb2xsYXBzZSA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICByb3dzXG4gICAgICAgICAgLm1hcCgocm93KSA9PiByb3dbZmllbGRdKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IFwibWl4ZWRcIjtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dF90b2tlbnM6IHN1bShcImlucHV0X3Rva2Vuc1wiKSxcbiAgICBvdXRwdXRfdG9rZW5zOiBzdW0oXCJvdXRwdXRfdG9rZW5zXCIpLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBzdW0oXCJjYWNoZV9yZWFkX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHN1bShcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIpLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogb3B0aW9uYWxTdW0oXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIiksXG4gICAgZHVyYXRpb25fbXM6IHN1bShcImR1cmF0aW9uX21zXCIpLFxuICAgIGZhbGxiYWNrX2NvdW50OiBzdW0oXCJmYWxsYmFja19jb3VudFwiKSxcbiAgICBjb3N0X3VzZDogc3VtKFwiY29zdF91c2RcIiksXG4gICAgY29zdF9zb3VyY2U6IGNvbGxhcHNlKFwiY29zdF9zb3VyY2VcIiksXG4gIH07XG59XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGlzQW50aHJvcGljVXNhZ2VSb3cocm93OiBQaWNrPFJlcXVlc3RMb2dVc2FnZVJvdywgXCJ0b2tlbl9uYW1lXCIgfCBcIm1vZGVsX25hbWVcIj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICByb3cudG9rZW5fbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImNsYXVkZS1cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9jbGF1ZGUtXCIpID09PSB0cnVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbE1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbE5hbWUuaW5jbHVkZXMoXCIvXCIpID8gbW9kZWxOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiBtb2RlbE5hbWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93OiBSZXF1ZXN0TG9nVXNhZ2VSb3cpOiB7XG4gIG1vZGVsOiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVkSW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbn0ge1xuICBjb25zdCBjYWNoZVJlYWQgPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBzdG9yZWRJbnB1dCA9IHJvdy5pbnB1dF90b2tlbnM7XG4gIGNvbnN0IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPVxuICAgIGlzQW50aHJvcGljVXNhZ2VSb3cocm93KSAmJiBzdG9yZWRJbnB1dCA8IGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb247XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHJvdy5tb2RlbF9uYW1lID8gY2Fub25pY2FsTW9kZWxOYW1lKHJvdy5tb2RlbF9uYW1lKSA6IG51bGwsXG4gICAgaW5wdXRUb2tlbnM6IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPyBzdG9yZWRJbnB1dCArIGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb24gOiBzdG9yZWRJbnB1dCxcbiAgICBvdXRwdXRUb2tlbnM6IHJvdy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIC8vIOyDiCByb3cg64qUIOuLueyLnOydmCBwcm92aWRlci/qsIDqsqntkZwg67mE7Jqp7J2EIO2ZleyglSDsoIDsnqXtlZzri6QuIO2YhOyerCDqsIDqsqntkZzroZwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgaWYgKHJvdy5jb3N0X3NvdXJjZSkgcmV0dXJuIHJvdztcbiAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gIGlmICh1c2FnZS5pbnB1dFRva2VucyA9PT0gcm93LmlucHV0X3Rva2VucykgcmV0dXJuIHJvdztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4ucm93LCBpbnB1dF90b2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zIH07XG4gIGlmICh1c2FnZS5tb2RlbCkge1xuICAgIG5vcm1hbGl6ZWQuY29zdF91c2QgPSBNYXRoLnJvdW5kKGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHVzYWdlKSAqIE1JQ1JPX1VTRCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogYG9yZGVyQnlgIGVudW0g6rCSKGDsu6zrn7wt67Cp7ZalYCnsnYQg7KCV66CsIOygiOuhnCDsmK7quLTri6QuXG4gKlxuICogZW51bSDsnbQgMTgg7KKF7J206528IOy8gOydtOyKpOulvCDsnbzsnbzsnbQg7KCB64qUIOuMgOyLoCDtjIzsi7HtlZjrkJgsIOy7rOufvOydgCDslYTrnpgg66qp66Gd7Jy866GcIO2VnOygle2VnOuLpCDigJRcbiAqIOusuOyekOyXtOydhCDqt7jrjIDroZwg7Lus65+866qF7JeQIOuEmOq4sOuptCBlbnVtIOydtCDrsJTrgJQg65WMIOqygOymnSDsl4bripQg7Iud67OE7J6Q6rCAIFNRTCDroZwg7Z2Y65+s65Og64ukLlxuICog66qp66Gd7JeQIOyXhuuKlCDqsJLsnYAg6riw67O4IOygleugrChpZCBkZXNjKeuhnCDrlqjslrTsp4Tri6QuXG4gKi9cbmNvbnN0IE9SREVSQUJMRV9DT0xVTU5TID0ge1xuICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ3MuY3JlYXRlZF9hdFwiLFxuICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFwcGx5T3JkZXJCeShcbiAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICBvcmRlckJ5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gb3JkZXJCeS5sYXN0SW5kZXhPZihcIi1cIik7XG4gIGNvbnN0IGtleSA9IG9yZGVyQnkuc2xpY2UoMCwgc2VwYXJhdG9yKSBhcyBrZXlvZiB0eXBlb2YgT1JERVJBQkxFX0NPTFVNTlM7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyQnkuc2xpY2Uoc2VwYXJhdG9yICsgMSkgPT09IFwiYXNjXCIgPyBcImFzY1wiIDogXCJkZXNjXCI7XG4gIGNvbnN0IGNvbHVtbiA9IE9SREVSQUJMRV9DT0xVTU5TW2tleV07XG5cbiAgaWYgKCFjb2x1bW4pIHtcbiAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcWIub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gIC8vIOuPmeygkCDtlonsnZgg7Iic7ISc6rCAIO2OmOydtOyngOuniOuLpCDtnZTrk6Trpqzsp4Ag7JWK6rKMIOqzoOycoCDsu6zrn7zsnLzroZwgdGllLWJyZWFrIO2VnOuLpC5cbiAgaWYgKGtleSAhPT0gXCJpZFwiKSBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMaXN0RmlsdGVycyhcbiAgICBxYjogUmV0dXJuVHlwZTxSZXF1ZXN0TG9nTW9kZWxDbGFzc1tcImdldFN1YnNldFF1ZXJpZXNcIl0+W1wicWJcIl0sXG4gICAgcGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHFiLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSBhcHBseU9yZGVyQnkocWIsIHBhcmFtcy5vcmRlckJ5KTtcblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgICAgQzogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOy1nOq3vCDqtazqsITsnZggcHJvdmlkZXIg67OEIOqyveufiSDthrXqs4Qo66qo64uI7YSw66eB7JqpKS4gcHJvdmlkZXIg64qUIHJlcXVlc3RlZF9tb2RlbF9uYW1lIOydmFxuICAgKiBcIm9wZW5haS8uLi5cIiB8IFwiYW50aHJvcGljLy4uLlwiIHByZWZpeCDroZwg7YyQ7KCV7ZWc64ukIOKAlCBzZXJ2aW5nIG1vZGVsX25hbWUg7J2AIHByZWZpeCDqsIBcbiAgICog7JeG6rOgLCBydW5uaW5nIOy0iOq4sOyXlCDslYTsp4Eg67mE7Ja0IOyeiOuLpC4g7KeR6rOE64qUIEpTIOyXkOyEnCDtlZzri6Q6IO2PtOungSDso7zquLDqsIAg64qQ7Iqo7ZWY6rOgXG4gICAqIOq1rOqwhOydtCDsp6fslYQgcm93IOyImOqwgCDsnpHsnLzrqbAsIHByZWZpeCBDQVNFIOyLneydhCDsv7zrpqwg67mM642U7JeQIOuwleyngCDslYrslYTrj4Qg65Cc64ukLlxuICAgKi9cbiAgYXN5bmMgcHJvdmlkZXJTdGF0c1NpbmNlKHNpbmNlOiBEYXRlKTogUHJvbWlzZTxcbiAgICBBcnJheTx7XG4gICAgICBwcm92aWRlcjogc3RyaW5nO1xuICAgICAgcmVxdWVzdHM6IG51bWJlcjtcbiAgICAgIGVycm9yczogbnVtYmVyO1xuICAgICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICAgIH0+XG4gID4ge1xuICAgIGNvbnN0IHJkYiA9IHRoaXMuZ2V0UHVyaShcInJcIik7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCByZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICAgIHN0YXR1czogXCJyZXF1ZXN0X2xvZ3Muc3RhdHVzXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5jcmVhdGVkX2F0XCIsIFwiPj1cIiwgc2luY2UpKSBhcyB1bmtub3duIGFzIEFycmF5PHtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gICAgfT47XG5cbiAgICBjb25zdCBieVByb3ZpZGVyID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgcmVxdWVzdHM6IG51bWJlcjsgZXJyb3JzOiBudW1iZXI7IGlucHV0VG9rZW5zOiBudW1iZXI7IGNhY2hlUmVhZFRva2VuczogbnVtYmVyIH1cbiAgICA+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgbW9kZWwgPSByb3cucmVxdWVzdGVkX21vZGVsX25hbWUgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbW9kZWwuc3RhcnRzV2l0aChcIm9wZW5haS9cIilcbiAgICAgICAgPyBcIm9wZW5haVwiXG4gICAgICAgIDogbW9kZWwuc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIilcbiAgICAgICAgICA/IFwiYW50aHJvcGljXCJcbiAgICAgICAgICA6IFwidW5rbm93blwiO1xuICAgICAgY29uc3QgYWdnID0gYnlQcm92aWRlci5nZXQocHJvdmlkZXIpID8/IHtcbiAgICAgICAgcmVxdWVzdHM6IDAsXG4gICAgICAgIGVycm9yczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlUmVhZFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBhZ2cucmVxdWVzdHMgKz0gMTtcbiAgICAgIGlmIChyb3cuc3RhdHVzID09PSBcImVycm9yXCIpIGFnZy5lcnJvcnMgKz0gMTtcbiAgICAgIGFnZy5pbnB1dFRva2VucyArPSByb3cuaW5wdXRfdG9rZW5zO1xuICAgICAgYWdnLmNhY2hlUmVhZFRva2VucyArPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gICAgICBieVByb3ZpZGVyLnNldChwcm92aWRlciwgYWdnKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieVByb3ZpZGVyLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFtwcm92aWRlciwgYWdnXSkgPT4gKHsgcHJvdmlkZXIsIC4uLmFnZyB9KSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5wcm92aWRlci5sb2NhbGVDb21wYXJlKGIucHJvdmlkZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdHJ1Y3R1cmVkIG91dHB1dCDsmpTssq3snZggSlNPTiBTY2hlbWEg66W8IO2RnOyLnOyaqSDtg4DsnoUg7YWN7Iqk7Yq466GcIOuzgO2ZmO2VnOuLpC5cbiAgICogdHlwZXNjcmlwdCDripQg6rCE6rKw7ZWcIGB0eXBlYCDshKDslrgsIHpvZCDripQg7J6s6rWs7ISx65CcIHpvZCDtkZztmITsi53snbTri6Qg4oCUIOybkOuzuCB6b2RcbiAgICog7IaM7Iqk64qUIHdpcmUg66W8IOqxtOuEiOyYpOupsCDshozsi6TrkJjrr4DroZwgcmVmaW5lL3RyYW5zZm9ybSDrpZjripQg67O17JuQ65CY7KeAIOyViuuKlOuLpC5cbiAgICog7Iqk7YKk66eI6rCAIOyXhuqxsOuCmCDrs4DtmZgg7Iuk7Yyo66m0IG51bGwg4oCUIO2ZlOuptOydgCDtlbTri7kg67iU66GdIO2RnOyLnOulvCDsg53rnrXtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyByZXNwb25zZVR5cGVUcyhpZDogbnVtYmVyKTogUHJvbWlzZTx7XG4gICAgdHlwZXNjcmlwdDogc3RyaW5nIHwgbnVsbDtcbiAgICB6b2Q6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByZGIgPSB0aGlzLmdldFB1cmkoXCJyXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgcmRiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IGpzb25fc2NoZW1hOiBcInJlcXVlc3RfbG9ncy5qc29uX3NjaGVtYVwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWQpKSBhcyB1bmtub3duIGFzIEFycmF5PHsganNvbl9zY2hlbWE6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29uc3Qgc2NoZW1hID0gcm93c1swXT8uanNvbl9zY2hlbWE7XG4gICAgaWYgKCFzY2hlbWEpIHJldHVybiB7IHR5cGVzY3JpcHQ6IG51bGwsIHpvZDogbnVsbCB9O1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShzY2hlbWEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdHlwZXNjcmlwdDogbnVsbCwgem9kOiBudWxsIH07XG4gICAgfVxuICAgIGxldCB6b2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB6b2QgPSBmb3JtYXRab2RDb2RlKFxuICAgICAgICBqc29uU2NoZW1hVG9ab2QocGFyc2VkIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWFUb1pvZD5bMF0sIHsgbW9kdWxlOiBcIm5vbmVcIiB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB6b2QgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlc2NyaXB0OiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQocGFyc2VkKSwgem9kIH07XG4gIH1cblxuICAvLyDilIDilIAgVG9vbCBDb250cmFjdCBWaWV3XG5cbiAgLyoqXG4gICAqIOyalOyyreyXkCDsnqXssKnrkJwgdG9vbCDqs4Tslb3snYQgZGV0YWlsIO2ZlOuptOyaqeycvOuhnCDstpXslb3tlZzri6QuIEpTT05CIOuKlCDsnbTrr7ggZGVjb2RlIOuQnFxuICAgKiDrsLDsl7TroZwg7Jik66mwIOusuOyekOyXtOyduCDqsr3smrDrp4wg67Cp7Ja07KCB7Jy866GcIHBhcnNlIO2VnOuLpC4g7KCA7J6l65CcIFFncmlkVG9vbCDqs4Tslb3snYBcbiAgICog7KCE7IiYIOqygOyCrOuhnCDtmZXsnbjrkJDsnLzrr4DroZwg7ZWt66qp67OEIOuztOygleydtOuCmCB1bnJlYWRhYmxlIHNlbnRpbmVsIOydgCDrp4zrk6Tsp4Ag7JWK64qU64ukLlxuICAgKiDri6Trp4wgYFFncmlkVG9vbC5pbnB1dFNjaGVtYWAg64qUIGB6LnVua25vd24oKWAg7J206528IO2CpOqwgCDsl4bqsbDrgpggbnVsbCDsnbgg6rCS64+EXG4gICAqIHdpcmUg6rKA7Kad7J2EIO2GteqzvO2VmOuvgOuhnCDruYgg7Iqk7YKk66eI66GcIOygleq3nO2ZlO2VnOuLpCDigJQgU0RLIOuKlCBge31gIOuhnCDssYTsm4wg67O064K464ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG9vbHNWaWV3KGlkOiBudW1iZXIpOiBQcm9taXNlPFRvb2xWaWV3W10+IHtcbiAgICBjb25zdCByb3cgPSAoYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyB0b29sczogXCJyZXF1ZXN0X2xvZ3MudG9vbHNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkKVxuICAgICAgLmZpcnN0KCkpIGFzIHsgdG9vbHM6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b29scyA9IGRlY29kZVN0b3JlZFRvb2xzKHJvdz8udG9vbHMpO1xuICAgIGlmICghdG9vbHMpIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0U2NoZW1hID0gKHRvb2wuaW5wdXRTY2hlbWEgPz8ge30pIGFzIHtcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0Wm9kID0gcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dChpbnB1dFNjaGVtYSwgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUKTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFpvZCA9IHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoaW5wdXRTY2hlbWEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIC4uLih0b29sLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHBhcmFtZXRlckNvdW50OiBPYmplY3Qua2V5cyhpbnB1dFNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KS5sZW5ndGgsXG4gICAgICAgIGlucHV0Wm9kLFxuICAgICAgICAuLi4oaW5wdXRab2QgIT09IGZ1bGxJbnB1dFpvZCA/IHsgZnVsbElucHV0Wm9kIH0gOiB7fSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9ucztcbiAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICBqc29uX3NjaGVtYT86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAganNvbl9zY2hlbWE6IHBhcmFtcy5qc29uX3NjaGVtYSA/PyBudWxsLFxuICAgICAgaXNfc3RydWN0dXJlZDogcGFyYW1zLmpzb25fc2NoZW1hICE9PSBudWxsICYmIHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gdW5kZWZpbmVkLFxuICAgICAgLi4uKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQgPyB7IGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5IGFzIHsgdHlwZTogc3RyaW5nIH1bXSB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy50b29scyAhPT0gdW5kZWZpbmVkID8geyB0b29sczogcGFyYW1zLnRvb2xzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZmFsbGJhY2tfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF9zb3VyY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgaGlzdG9yeT86IHVua25vd247XG4gICAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgICAgdG9vbF9jYWxsX2NvdW50PzogbnVtYmVyO1xuICAgICAgaW1hZ2VfY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmVzcG9uc2VfanNvbl9vaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiICYmICFwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciBzdWNjZWVkZWQgcnVuc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IHJlcXVlc3RMb2dJZCwgc3RhdHVzOiBwYXJhbXMuc3RhdHVzIH07XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgXCJyZXNwb25zZVwiLFxuICAgICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICAgIFwiY29zdF9zb3VyY2VcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIFwicmVzcG9uc2VfanNvbl9va1wiLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRzKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdXBkYXRlW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHVwZGF0ZS5oaXN0b3J5ID0gcGFyYW1zLmhpc3Rvcnk7XG4gICAgdXBkYXRlLnR0ZnRfbXMgPSAoYXdhaXQgdGhpcy5maXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkKSkgPz8gMDtcblxuICAgIC8vIOyEnOuyhCBydW4g6rK966Gc64qUIHN0ZXAg7JeQ7IScIO2Zleygle2VnCBleGFjdCBjb3N0IOulvCDrhJjquLTri6QuIOyZuOu2gC9sZWdhY3kgY2FsbGVyIOqwgCDruYTsmqnsnYRcbiAgICAvLyDsg53rnrXtlZwg6rK97Jqw7JeQ66eMIOyggOyepeuQnCDrqqjrjbgrdXNhZ2Ug66GcIOqzhOyCsO2VnOuLpC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29zdF91c2QgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmlucHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAgIC5zZWxlY3QoeyBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIiB9KVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5maXJzdCgpO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTW9kZWxOYW1lID0gcGFyYW1zLm1vZGVsX25hbWUgPz8gcm93Py5tb2RlbF9uYW1lO1xuICAgICAgaWYgKGVmZmVjdGl2ZU1vZGVsTmFtZSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbE1vZGVsTmFtZShlZmZlY3RpdmVNb2RlbE5hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IGVmZmVjdGl2ZU1vZGVsTmFtZSxcbiAgICAgICAgICBpbnB1dF90b2tlbnM6IHBhcmFtcy5pbnB1dF90b2tlbnMsXG4gICAgICAgICAgb3V0cHV0X3Rva2VuczogcGFyYW1zLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHBhcmFtcy5jYWNoZV9yZWFkX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3NvdXJjZSA9IFwicHJpY2luZ190YWJsZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgdXBkYXRlKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmlyc3RHZW5lcmF0ZVN0ZXBUdGZ0KHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gcm93Py50dGZ0X21zID09PSBudWxsIHx8IHJvdz8udHRmdF9tcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihyb3cudHRmdF9tcyk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoU1RFUF9BR0dSRUdBVEVfU0VMRUNUKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpO1xuICAgIHJldHVybiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBzdGFsZSBjYW5kaWRhdGVzLCB0aGVuIGV4cGlyZXMgZWFjaCBydW4gaW4gaXRzIG93biBzaG9ydCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIGNhbmRpZGF0ZSBxdWVyeSBpcyBvbmx5IGEgaGludDsgdGhlIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHJlY2hlY2tzIGl0XG4gICAqIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCB0b29sIGZvbGxvdy11cHMuXG4gICAqL1xuICBhc3luYyBleHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICB0aHJlc2hvbGRNczogbnVtYmVyLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIgPSAxMCxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSB0aHJlc2hvbGRNcyk7XG4gICAgY29uc3QgY2FuZGlkYXRlSWRzID0gYXdhaXQgdGhpcy5maW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkLCBsaW1pdCk7XG4gICAgY29uc3QgZXhwaXJlZElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RMb2dJZCBvZiBjYW5kaWRhdGVJZHMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4ocmVxdWVzdExvZ0lkLCB0aHJlc2hvbGQsIGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgZXhwaXJlZElkcy5wdXNoKHJlcXVlc3RMb2dJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHBpcmVkSWRzO1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlVG9vbFdhaXRpbmdSdW5DYW5kaWRhdGVzKHRocmVzaG9sZDogRGF0ZSwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwid1wiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5qb2luKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiKVxuICAgICAgLmRpc3RpbmN0KFwicmVxdWVzdF9sb2dzLmlkXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5zdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX3Jlc3VsdFwiLCBudWxsKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMuZXJyb3JcIiwgbnVsbClcbiAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKCh7IGlkIH0pID0+IGlkKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKHsgZGJQcmVzZXQ6IFwid1wiIH0pXG4gIGFzeW5jIHRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdGhyZXNob2xkOiBEYXRlLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGNvbnN0IGxvY2tSZXN1bHQgPSAoYXdhaXQgd2RiLmtuZXgucmF3KFwiU0VMRUNUIHBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2soPywgPykgQVMgYWNxdWlyZWRcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSkpIGFzIHsgcm93cz86IEFycmF5PHsgYWNxdWlyZWQ/OiBib29sZWFuIH0+IH07XG4gICAgaWYgKGxvY2tSZXN1bHQucm93cz8uWzBdPy5hY3F1aXJlZCAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVGhlIGZvbGxvdy11cCBwYXRoIHVzZXMgdGhlIHNhbWUgd3JpdGVyIHRyYW5zYWN0aW9uIGxvY2suIFJlY2hlY2sgYWZ0ZXJcbiAgICAvLyBsb2NraW5nIHNvIGEgcmVzdWx0IGNvbW1pdHRlZCBkdXJpbmcgY2FuZGlkYXRlIGRpc2NvdmVyeSBtYWtlcyB0aGlzIGEgbm8tb3AuXG4gICAgY29uc3QgdW5yZXNvbHZlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IGlkOiBcImlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcImNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJlcnJvclwiLCBudWxsKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCF1bnJlc29sdmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwUm93cyA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgY29uc3QgYWdncmVnYXRlID0gYWdncmVnYXRlR2VuZXJhdGVTdGVwUm93cyhzdGVwUm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICAgIGNvbnN0IGZpcnN0VHRmdCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAudXBkYXRlKHtcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBhZ2dyZWdhdGUub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgZmFsbGJhY2tfY291bnQ6IGFnZ3JlZ2F0ZS5mYWxsYmFja19jb3VudCxcbiAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSAhPT0gdW5kZWZpbmVkID8geyBjb3N0X3NvdXJjZTogYWdncmVnYXRlLmNvc3Rfc291cmNlIH0gOiB7fSksXG4gICAgICAgIHR0ZnRfbXM6XG4gICAgICAgICAgZmlyc3RUdGZ0Py50dGZ0X21zID09PSBudWxsIHx8IGZpcnN0VHRmdD8udHRmdF9tcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogTnVtYmVyKGZpcnN0VHRmdC50dGZ0X21zKSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVkID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmF0aXZlIHFncmlkIHRvb2wgZm9sbG93LXVwIGFuZCBjb21wdXRlcyBpdHMgbmV4dCBzdGVwIGluZGV4IHdoaWxlXG4gICAqIGhvbGRpbmcgdGhlIHBlci1ydW4gYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCBzdGFsZSBjbGVhbnVwLlxuICAgKi9cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgY29udGludWVUb29sUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRvb2xSZXN1bHRzOiBUb29sUmVzdWx0Q29udGludWF0aW9uW10sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfeGFjdF9sb2NrKD8sID8pXCIsIFtcbiAgICAgIFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lELFxuICAgICAgcmVxdWVzdExvZ0lkLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IHN0YXR1czogXCJzdGF0dXNcIiB9KVxuICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCFydW4pIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBub3QgZm91bmRgKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBpcyBhbHJlYWR5ICR7cnVuLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0b29sUmVzdWx0cykge1xuICAgICAgYXdhaXQgd2RiXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgcmVzdWx0LnRvb2xDYWxsSWQpXG4gICAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgICAgLnVwZGF0ZShyZXN1bHQuaXNFcnJvciA/IHsgZXJyb3I6IHJlc3VsdC5vdXRwdXQgfSA6IHsgdG9vbF9yZXN1bHQ6IHJlc3VsdC5vdXRwdXQgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgbWF4X3N0ZXA6IFB1cmkubWF4KFwic3RlcF9pbmRleFwiKSB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgcmV0dXJuIChyb3c/Lm1heF9zdGVwID8/IC0xKSArIDE7XG4gIH1cblxuICAvKipcbiAgICog7ZmU66m0IO2RnOyLnOyaqSDstJ0g67mE7JqpLiDrqqnroZ3qs7wg6rCZ7J2AIO2VhO2EsOulvCDsoIHsmqntlZzri6QuXG4gICAqXG4gICAqIOyghOyytOulvCDsobDqsbQg7JeG7J20IFNVTSDtlZwg65KkLCBgY29zdF9zb3VyY2VgIOqwgCDsl4bripQgbGVnYWN5IHJvdyDsnZgg7LCo7JWh66eMIOuztOygle2VnOuLpC5cbiAgICog7KGw6rG0IOyXhuuKlCBTVU0g7J207Ja07JW8IGAocHJvamVjdF9uYW1lLCBjb3N0X3VzZClgIOy7pOuyhOungSDsnbjrjbHsiqTqsIAgSW5kZXggT25seSBTY2FuIOydhFxuICAgKiDtg4Tri6Qg4oCUIGBjb3N0X3NvdXJjZSBJUyBOT1QgTlVMTGAg7J2EIOqxuOuptCDqt7gg7Lus65+87J20IOyduOuNseyKpOyXkCDsl4bslrQgaGVhcCDsnYQg64uk7IucIOu0kOyVvFxuICAgKiDtlZjrr4DroZwg7ZSM656Y64SI6rCAIOyduOuNseyKpOulvCDrsoTrpqzqs6Agc2VxIHNjYW4g7Jy866GcIOuPjOyVhOqwhOuLpCjsi6TsuKEgMjMwbXMg4oaSIDgxNG1zKS5cbiAgICpcbiAgICogbGVnYWN5IOuztOygleydhCDrgqjqsqjrkZQg7J207JygOiDrsLHtlYTroZwg6riw7KG0IGxlZ2FjeSDripQgMCDsnbQg65CY7JeI7KeA66eMLCDsmbjrtoAg66Gc6rGw6rCAXG4gICAqIGBBcHBlbmRTdGVwSW5wdXRgL2BGaW5pc2hSdW5JbnB1dGAg7Jy866GcIGNvc3RTb3VyY2Ug7JeG7J20IOuEo+ycvOuptCDri6Tsi5wg7IOd6ri4IOyImCDsnojri6QuXG4gICAqIOq3uOufsCByb3cg64qUIOyggOyepeqwkiDrjIDsi6Ag7ZiE7J6sIOqwgOqyqe2RnCDsnqzqs4TsgrDqsJLsnbQg66ee7Jy866+A66GcIOywqOyVoeydhCDrjZTtlZzri6QuXG4gICAqXG4gICAqIO2VhO2EsCDsobDqsbTsnYQg7Jes6riw7IScIOuLpOyLnCDqtaztmITtlZjsp4Ag7JWK6rOgIGBhcHBseUxpc3RGaWx0ZXJzYCDrpbwg6rO17Jyg7ZWY64qUIOqyg+ydtCDtlbXsi6zsnbTri6Qg4oCUXG4gICAqIOuRkCDsv7zrpqzqsIAg6rCB7J6QIO2VhO2EsOulvCDqsIDsp4DrqbQg7ZmU66m07JeQ7IScIO2VhO2EsOulvCDqsbjsl4jsnYQg65WMIO2WiSDsiJjsmYAg67mE7Jqp7J20IOyhsOyaqe2eiCDslrTquIvrgpzri6QuXG4gICAqL1xuICBhc3luYyB0b3RhbENvc3QocmF3UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyA9IHsgbnVtOiAwLCBwYWdlOiAxIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWI6IHRvdGFsUWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHRvdGFsUWIsIHBhcmFtcyk7XG4gICAgLy8gc3Vic2V0IHFiIOuKlCDsu6zrn7wg66qp66Gd7J20IOydtOuvuCBTRUxFQ1Qg7JeQIOuwle2YgCDsnojslrQg7KeR6rOE66W8IOyWueycvOuptCBHUk9VUCBCWSDsl5Drn6zqsIAg64Kc64ukLlxuICAgIC8vIGV4ZWN1dGVDb3VudFF1ZXJ5IOyZgCDqsJnsnYAg67Cp7Iud7Jy866GcIHNlbGVjdCDrpbwg67mE7Jqw6rOgIOynkeqzhOunjCDrgqjquLTri6QuXG4gICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgdG90YWxRYlxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAvLyDsnYzsiJgg7KCA7J6l6rCSKOqzvOqxsCDrsoTqt7gp7J2AIDAg7Jy866GcIOuIjOufrOyEnCDrjZTtlZzri6Qg4oCUIEpTIOyqvSBNYXRoLm1heCDsmYAg6rCZ7J2AIOq3nOy5mS5cbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICB0b3RhbDogUHVyaS5yYXdOdW1iZXIoXCJDT0FMRVNDRShTVU0oR1JFQVRFU1QocmVxdWVzdF9sb2dzLmNvc3RfdXNkLCAwKSksIDApXCIpLFxuICAgICAgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgeyBxYjogbGVnYWN5UWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKGxlZ2FjeVFiLCBwYXJhbXMpO1xuICAgIGNvbnN0IGxlZ2FjeVJvd3MgPSBhd2FpdCBsZWdhY3lRYlxuICAgICAgLndoZXJlUmF3KFwicmVxdWVzdF9sb2dzLmNvc3Rfc291cmNlIElTIE5VTEwgT1IgcmVxdWVzdF9sb2dzLmNvc3RfdXNkIElTIE5VTExcIilcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgICAgbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLFxuICAgICAgICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVkVG90YWwgPSBOdW1iZXIoc3RvcmVkPy50b3RhbCA/PyAwKSAvIE1JQ1JPX1VTRDtcblxuICAgIC8vIGxlZ2FjeSByb3cg64qUIOychCBTVU0g7JeQIOyggOyepeqwkuycvOuhnCDsnbTrr7gg7Y+s7ZWo65CY7Ja0IOyeiOuLpC4g7J6s6rOE7IKw6rCS6rO87J2YIOywqOyVoeunjCDrjZTtlZzri6QuXG4gICAgcmV0dXJuIGxlZ2FjeVJvd3MucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgY29uc3QgYWxyZWFkeVN1bW1lZCA9IE1hdGgubWF4KHJvdy5jb3N0X3VzZCA/PyAwLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICAgICAgaWYgKCF1c2FnZS5tb2RlbCkgcmV0dXJuIHN1bTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgIH0pIC1cbiAgICAgICAgYWxyZWFkeVN1bW1lZFxuICAgICAgKTtcbiAgICB9LCBzdG9yZWRUb3RhbCk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdFByb2plY3ROYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJwcm9qZWN0X25hbWVcIilcbiAgICAgIC53aGVyZShcInByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInByb2plY3RfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHByb2plY3RfbmFtZTogXCJwcm9qZWN0X25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5wcm9qZWN0X25hbWUhKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0TW9kZWxOYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJtb2RlbF9uYW1lXCIpXG4gICAgICAud2hlcmUoXCJtb2RlbF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwibW9kZWxfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLm1vZGVsX25hbWUhKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeFxuICAgICAgICAudGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmVJbihcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIsIGlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInJlcXVlc3RfbG9nc1wiKS53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ01vZGVsID0gbmV3IFJlcXVlc3RMb2dNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUE2QkEsTUFBYSxZQUFZO0FBQ3pCLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQXdCO0FBRTlCLFNBQVMsa0JBQWtCLE9BQXdDO0NBQ2pFLElBQUksQ0FBQyxPQUFPLE9BQU87Q0FDbkIsSUFBSSxPQUFPLFVBQVUsVUFBVSxPQUFPO0NBQ3RDLElBQUk7RUFDRixPQUFPLEtBQUssTUFBTSxLQUFLO0NBQ3pCLFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjtBQXFCQSxNQUFNLHdCQUF3QjtDQUM1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
@@ -12,10 +12,16 @@ const HistoryItems = z.array(z.object({
12
12
  output: z.string().optional()
13
13
  }));
14
14
  const ToolDefinitions = z.array(QgridTool);
15
+ const ToolView = z.object({
16
+ name: z.string(),
17
+ description: z.string().optional(),
18
+ parameterCount: z.number(),
19
+ inputZod: z.string(),
20
+ fullInputZod: z.string().optional()
21
+ });
15
22
  const RequestLogListParams = RequestLogBaseListParams.extend({
16
23
  project_name_is_null: z.boolean().optional(),
17
- project_name_is_not_null: z.boolean().optional(),
18
- response_json_broken: z.boolean().optional()
24
+ project_name_is_not_null: z.boolean().optional()
19
25
  });
20
26
  const RequestLogSaveParams = RequestLogBaseSchema.partial({
21
27
  id: true,
@@ -25,6 +31,6 @@ const RequestLogSaveParams = RequestLogBaseSchema.partial({
25
31
  error_message: true
26
32
  });
27
33
  //#endregion
28
- export { HistoryItems, RequestLogListParams, RequestLogSaveParams, ToolDefinitions };
34
+ export { HistoryItems, RequestLogListParams, RequestLogSaveParams, ToolDefinitions, ToolView };
29
35
 
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFFncmlkVG9vbCB9IGZyb20gXCIuLi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zLCBSZXF1ZXN0TG9nQmFzZVNjaGVtYSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBIaXN0b3J5SXRlbXMgPSB6LmFycmF5KFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5zdHJpbmcoKSxcbiAgICByb2xlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY29udGVudDogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgYXJndW1lbnRzOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY2FsbF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG91dHB1dDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KSxcbik7XG5leHBvcnQgdHlwZSBIaXN0b3J5SXRlbXMgPSB6LmluZmVyPHR5cGVvZiBIaXN0b3J5SXRlbXM+O1xuXG4vLyDsmpTssq3sl5Ag7J6l7LCp65CcIHRvb2wg7KCV7J2YIOuqqeuhnSDigJQg7KCA7J6lIO2Yle2DnOuKlCBRZ3JpZFRvb2wg6rOE7JW97J2EIOq3uOuMgOuhnCDrlLDrpbjri6QuXG5leHBvcnQgY29uc3QgVG9vbERlZmluaXRpb25zID0gei5hcnJheShRZ3JpZFRvb2wpO1xuZXhwb3J0IHR5cGUgVG9vbERlZmluaXRpb25zID0gei5pbmZlcjx0eXBlb2YgVG9vbERlZmluaXRpb25zPjtcblxuLy8gUmVxdWVzdExvZyAtIExpc3RQYXJhbXNcbi8vIHByb2plY3RfbmFtZSBOVUxMIOu2hOq4sDogSVMgTlVMTOunjCDsobDtmowodW5hc3NpZ25lZCDtlYTthLApIOuYkOuKlCBJUyBOT1QgTlVMTOunjChkaXN0aW5jdCDsobDtmowpLlxuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dMaXN0UGFyYW1zID0gUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zLmV4dGVuZCh7XG4gIHByb2plY3RfbmFtZV9pc19udWxsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBwcm9qZWN0X25hbWVfaXNfbm90X251bGw6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8vIHN0cnVjdHVyZWQg7J2R64u17J20IOq5qOynhChKU09OIO2MjOyLsSDsi6TtjKgpIO2WieunjCDsobDtmoxcbiAgcmVzcG9uc2VfanNvbl9icm9rZW46IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ0xpc3RQYXJhbXM+O1xuXG4vLyBSZXF1ZXN0TG9nIC0gU2F2ZVBhcmFtc1xuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dTYXZlUGFyYW1zID0gUmVxdWVzdExvZ0Jhc2VTY2hlbWEucGFydGlhbCh7XG4gIGlkOiB0cnVlLFxuICBjcmVhdGVkX2F0OiB0cnVlLFxuICB0b2tlbl9uYW1lOiB0cnVlLFxuICBzdGF0dXM6IHRydWUsXG4gIGVycm9yX21lc3NhZ2U6IHRydWUsXG59KTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zID0gei5pbmZlcjx0eXBlb2YgUmVxdWVzdExvZ1NhdmVQYXJhbXM+O1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBS0EsTUFBYSxlQUFlLEVBQUUsTUFDNUIsRUFBRSxPQUFPO0NBQ1AsTUFBTSxFQUFFLE9BQU87Q0FDZixNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUMxQixTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsU0FBUztDQUM5QixNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUMvQixTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUM3QixRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztBQUM5QixDQUFDLENBQ0g7QUFJQSxNQUFhLGtCQUFrQixFQUFFLE1BQU0sU0FBUztBQUtoRCxNQUFhLHVCQUF1Qix5QkFBeUIsT0FBTztDQUNsRSxzQkFBc0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzNDLDBCQUEwQixFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FFL0Msc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUMsU0FBUztBQUM3QyxDQUFDO0FBSUQsTUFBYSx1QkFBdUIscUJBQXFCLFFBQVE7Q0FDL0QsSUFBSTtDQUNKLFlBQVk7Q0FDWixZQUFZO0NBQ1osUUFBUTtDQUNSLGVBQWU7QUFDakIsQ0FBQyJ9
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IFFncmlkVG9vbCB9IGZyb20gXCIuLi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0Jhc2VMaXN0UGFyYW1zLCBSZXF1ZXN0TG9nQmFzZVNjaGVtYSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjb25zdCBIaXN0b3J5SXRlbXMgPSB6LmFycmF5KFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5zdHJpbmcoKSxcbiAgICByb2xlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY29udGVudDogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgYXJndW1lbnRzOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgY2FsbF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG91dHB1dDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB9KSxcbik7XG5leHBvcnQgdHlwZSBIaXN0b3J5SXRlbXMgPSB6LmluZmVyPHR5cGVvZiBIaXN0b3J5SXRlbXM+O1xuXG4vLyDsmpTssq3sl5Ag7J6l7LCp65CcIHRvb2wg7KCV7J2YIOuqqeuhnSDigJQg7KCA7J6lIO2Yle2DnOuKlCBRZ3JpZFRvb2wg6rOE7JW97J2EIOq3uOuMgOuhnCDrlLDrpbjri6QuXG5leHBvcnQgY29uc3QgVG9vbERlZmluaXRpb25zID0gei5hcnJheShRZ3JpZFRvb2wpO1xuZXhwb3J0IHR5cGUgVG9vbERlZmluaXRpb25zID0gei5pbmZlcjx0eXBlb2YgVG9vbERlZmluaXRpb25zPjtcblxuLy8gcmVxdWVzdC1sb2cgZGV0YWlsIO2ZlOuptOydtCDshozruYTtlZjripQgdG9vbCDqs4Tslb0gcHJvamVjdGlvbi4gQVBJIOuwmO2ZmCDtg4DsnoXsnYAgU29uYW11XG4vLyBzeW5jZXIg6rCAIOuqqOuTiOydhCDtlbTshJ3tlaAg7IiYIOyeiOuPhOuhnSB0eXBlLW9ubHkg7ISg7Ja4IOuMgOyLoCBab2Qgc2NoZW1hIOuhnCDrkZTri6QuXG5leHBvcnQgY29uc3QgVG9vbFZpZXcgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHBhcmFtZXRlckNvdW50OiB6Lm51bWJlcigpLFxuICBpbnB1dFpvZDogei5zdHJpbmcoKSxcbiAgZnVsbElucHV0Wm9kOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFRvb2xWaWV3ID0gei5pbmZlcjx0eXBlb2YgVG9vbFZpZXc+O1xuXG4vLyBSZXF1ZXN0TG9nIC0gTGlzdFBhcmFtc1xuLy8gcHJvamVjdF9uYW1lIE5VTEwg67aE6riwOiBJUyBOVUxM66eMIOyhsO2ajCh1bmFzc2lnbmVkIO2VhO2EsCkg65iQ64qUIElTIE5PVCBOVUxM66eMKGRpc3RpbmN0IOyhsO2ajCkuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ0xpc3RQYXJhbXMgPSBSZXF1ZXN0TG9nQmFzZUxpc3RQYXJhbXMuZXh0ZW5kKHtcbiAgcHJvamVjdF9uYW1lX2lzX251bGw6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIHByb2plY3RfbmFtZV9pc19ub3RfbnVsbDogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ0xpc3RQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nTGlzdFBhcmFtcz47XG5cbi8vIFJlcXVlc3RMb2cgLSBTYXZlUGFyYW1zXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ1NhdmVQYXJhbXMgPSBSZXF1ZXN0TG9nQmFzZVNjaGVtYS5wYXJ0aWFsKHtcbiAgaWQ6IHRydWUsXG4gIGNyZWF0ZWRfYXQ6IHRydWUsXG4gIHRva2VuX25hbWU6IHRydWUsXG4gIHN0YXR1czogdHJ1ZSxcbiAgZXJyb3JfbWVzc2FnZTogdHJ1ZSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1NhdmVQYXJhbXMgPSB6LmluZmVyPHR5cGVvZiBSZXF1ZXN0TG9nU2F2ZVBhcmFtcz47XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFLQSxNQUFhLGVBQWUsRUFBRSxNQUM1QixFQUFFLE9BQU87Q0FDUCxNQUFNLEVBQUUsT0FBTztDQUNmLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQy9CLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQzlCLENBQUMsQ0FDSDtBQUlBLE1BQWEsa0JBQWtCLEVBQUUsTUFBTSxTQUFTO0FBS2hELE1BQWEsV0FBVyxFQUFFLE9BQU87Q0FDL0IsTUFBTSxFQUFFLE9BQU87Q0FDZixhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUNqQyxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3pCLFVBQVUsRUFBRSxPQUFPO0NBQ25CLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0FBQ3BDLENBQUM7QUFLRCxNQUFhLHVCQUF1Qix5QkFBeUIsT0FBTztDQUNsRSxzQkFBc0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzNDLDBCQUEwQixFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7QUFDakQsQ0FBQztBQUlELE1BQWEsdUJBQXVCLHFCQUFxQixRQUFRO0NBQy9ELElBQUk7Q0FDSixZQUFZO0NBQ1osWUFBWTtDQUNaLFFBQVE7Q0FDUixlQUFlO0FBQ2pCLENBQUMifQ==