sonamu 0.8.10 → 0.8.11

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 (55) hide show
  1. package/dist/api/config.d.ts +10 -0
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/bin/test-command.d.ts.map +1 -1
  5. package/dist/bin/test-command.js +53 -10
  6. package/dist/migration/migrator.d.ts.map +1 -1
  7. package/dist/migration/migrator.js +43 -37
  8. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  9. package/dist/migration/postgresql-schema-reader.js +8 -2
  10. package/dist/stream/sse.js +2 -1
  11. package/dist/testing/fixture-manager.d.ts.map +1 -1
  12. package/dist/testing/fixture-manager.js +5 -3
  13. package/dist/ui/api.d.ts.map +1 -1
  14. package/dist/ui/api.js +14 -1
  15. package/dist/ui/cdd-service.d.ts +24 -0
  16. package/dist/ui/cdd-service.d.ts.map +1 -0
  17. package/dist/ui/cdd-service.js +179 -0
  18. package/dist/ui-web/assets/index-BwnPfLKr.css +1 -0
  19. package/dist/ui-web/assets/{index-C3UTzGvY.js → index-CcRgePSa.js} +78 -78
  20. package/dist/ui-web/index.html +2 -2
  21. package/package.json +3 -3
  22. package/src/api/config.ts +11 -0
  23. package/src/bin/test-command.ts +73 -9
  24. package/src/migration/migrator.ts +48 -44
  25. package/src/migration/postgresql-schema-reader.ts +7 -1
  26. package/src/shared/app.shared.ts.txt +11 -68
  27. package/src/skills/AGENTS.md +6 -0
  28. package/src/skills/sonamu/SKILL.md +16 -0
  29. package/src/skills/sonamu/ai-agents.md +204 -0
  30. package/src/skills/sonamu/api.md +51 -0
  31. package/src/skills/sonamu/auth-migration.md +200 -310
  32. package/src/skills/sonamu/auth-plugins.md +297 -0
  33. package/src/skills/sonamu/cone.md +36 -0
  34. package/src/skills/sonamu/config.md +62 -1
  35. package/src/skills/sonamu/create-sonamu.md +33 -0
  36. package/src/skills/sonamu/entity-basic.md +74 -355
  37. package/src/skills/sonamu/entity-relations.md +10 -0
  38. package/src/skills/sonamu/entity-validation-checklist.md +1 -1
  39. package/src/skills/sonamu/fixture-cli.md +19 -1
  40. package/src/skills/sonamu/frontend.md +149 -451
  41. package/src/skills/sonamu/migration.md +12 -1
  42. package/src/skills/sonamu/model.md +32 -1
  43. package/src/skills/sonamu/naite.md +264 -0
  44. package/src/skills/sonamu/skill-contribution.md +241 -0
  45. package/src/skills/sonamu/tasks.md +221 -0
  46. package/src/skills/sonamu/testing-devrunner.md +390 -0
  47. package/src/skills/sonamu/testing.md +396 -1146
  48. package/src/skills/sonamu/upsert.md +18 -0
  49. package/src/skills/sonamu/vector.md +221 -0
  50. package/src/skills/sonamu/workflow.md +4 -2
  51. package/src/stream/sse.ts +2 -0
  52. package/src/testing/fixture-manager.ts +1 -2
  53. package/src/ui/api.ts +16 -0
  54. package/src/ui/cdd-service.ts +208 -0
  55. package/dist/ui-web/assets/index-B3NU_uZ2.css +0 -1
@@ -102,6 +102,16 @@ export type SonamuConfig<TSinkId extends string = string, TFilterId extends stri
102
102
  * ```
103
103
  */
104
104
  test?: SonamuTestConfig;
105
+ /**
106
+ * 외부 에디터 설정 (CDD 등에서 파일 편집 시 사용)
107
+ * 미설정 시 "vscode"를 기본값으로 사용합니다.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * externalEditor: "cursor"
112
+ * ```
113
+ */
114
+ externalEditor?: "Visual Studio Code" | "Zed" | "Cursor";
105
115
  /**
106
116
  * Slack 승인 설정 (Production 마이그레이션용)
107
117
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG;IAC7D,UAAU,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,GAAG,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE;YACL,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF;;;;;;;;;;OAUG;IACH,IAAI,EAAE,iBAAiB,CAAC;IAExB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IAEF,QAAQ,EAAE;QAER,QAAQ,CAAC,EAAE,IAAI,GAAG,UAAU,CAAC;QAE7B,IAAI,EAAE,MAAM,CAAC;QAEb,cAAc,EAAE,cAAc,CAAC;QAE/B,YAAY,CAAC,EAAE;YACb,WAAW,CAAC,EAAE,cAAc,CAAC;YAC7B,iBAAiB,CAAC,EAAE,cAAc,CAAC;YACnC,UAAU,CAAC,EAAE,cAAc,CAAC;YAC5B,gBAAgB,CAAC,EAAE,cAAc,CAAC;YAClC,OAAO,CAAC,EAAE,cAAc,CAAC;YACzB,IAAI,CAAC,EAAE,cAAc,CAAC;SACvB,CAAC;KACH,CAAC;IAEF,OAAO,CAAC,EAAE,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAE1B;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAExB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,oBAAoB,GAAG,KAAK,GAAG,QAAQ,CAAC;IAEzD;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE;QACb,0CAA0C;QAC1C,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,CAAC;QAClC,iCAAiC;QACjC,QAAQ,EAAE,MAAM,CAAC;QACjB,8BAA8B;QAC9B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF,OAAO,CAAC,EAAE;QACR,qCAAqC;QACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;QAC5C,IAAI,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAC;QACpC,QAAQ,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;QAC5C,SAAS,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAAC;QAC9C,EAAE,CAAC,EAAE,OAAO,GAAG,eAAe,CAAC;QAC/B,GAAG,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;QACjC,MAAM,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAAC;QAExC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;KAC5C,CAAC;IAEF;;;;OAIG;IACH,IAAI,CAAC,EAAE,iBAAiB,GAAG;QACzB,IAAI,CAAC,EAAE;YACL,gBAAgB,CAAC,EAAE,MAAM,CACvB,MAAM,EACN,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;gBAChF,UAAU,CAAC,EAAE,MAAM,CAAC;aACrB,CACF,CAAC;SACH,CAAC;KACH,CAAC;IAEF,SAAS,EAAE,mBAAmB,CAAC;IAE/B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAChG,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAE9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,eAAe,EAAE,CACf,cAAc,EAAE,IAAI,CAClB,OAAO,EACP,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAC7F,KACE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B,CAAC;AAGF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAMpF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAWxE"}
@@ -26,4 +26,4 @@ export function defineConfig(config) {
26
26
  return config;
27
27
  }
28
28
 
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeUNvbXByZXNzT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9jb21wcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5Q29yc09wdGlvbnMgfSBmcm9tIFwiQGZhc3RpZnkvY29yc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5U3RhdGljT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9zdGF0aWNcIjtcbmltcG9ydCB0eXBlIHsgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUluc3RhbmNlLCBGYXN0aWZ5UmVwbHksIEZhc3RpZnlSZXF1ZXN0LCBGYXN0aWZ5U2VydmVyT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IFFzUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXFzXCI7XG5pbXBvcnQgdHlwZSB7IFNzZVBsdWdpbk9wdGlvbnMgfSBmcm9tIFwiZmFzdGlmeS1zc2UtdjIvbGliL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZyB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVMb2dnaW5nT3B0aW9ucyB9IGZyb20gXCIuLi9sb2dnZXIvY29uZmlndXJlXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd09wdGlvbnMgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRhYmxlLCBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlQ29uZmlnID0gT21pdDxLbmV4LkNvbmZpZywgXCJjb25uZWN0aW9uXCI+ICYge1xuICBjb25uZWN0aW9uPzogS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG59O1xuXG4vKipcbiAqIGkxOG4g7ISk7KCVXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdUkxOG5PcHRpb25zID0ge1xuICAvKiog6riw67O4IGxvY2FsZSAo7YKkIOygleydmCDquLDspIAgKyDrn7Dtg4DsnoQg6riw67O46rCSKSAqL1xuICBkZWZhdWx0TG9jYWxlOiBzdHJpbmc7XG4gIC8qKiDsp4Dsm5DtlZjripQgbG9jYWxlIOuqqeuhnSAqL1xuICBzdXBwb3J0ZWRMb2NhbGVzOiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogRGV2IOyEnOuyhCDrgrQgVml0ZXN0IOyDgeyjvCDsnbjsiqTthLTsiqQg7ISk7KCVXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyA9IHtcbiAgLyoqIERldlJ1bm5lciDtmZzshLHtmZQg7Jes67aAICjquLDrs7g6IGZhbHNlKSAqL1xuICBlbmFibGVkOiBib29sZWFuO1xuICAvKiog7YWM7Iqk7Yq4IOyXlOuTnO2PrOyduO2KuCDqsr3roZwg7KCR65GQ7IKsICjquLDrs7g6IC9fX3Rlc3RfXykgKi9cbiAgcm91dGVQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiB2aXRlc3QuY29uZmlnLnRzIOqyveuhnCAoYXBpLXJvb3Qg7IOB64yA6rK966GcKSAqL1xuICB2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDthYzsiqTtirgg7ISk7KCVXG4gKiB2aXRlc3Qg67OR66CsIO2FjOyKpO2MheydhCBzb25hbXUuY29uZmlnLnRzIO2VnCDqs7Psl5DshJwg6rSA66as7ZWY6riwIOychO2VnCDshKTsoJXsnoXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdVRlc3RDb25maWcgPSB7XG4gIC8qKiDrs5HroKwg7YWM7Iqk7YyFIO2ZnOyEse2ZlCAo6riw67O4OiBmYWxzZSkgKi9cbiAgcGFyYWxsZWw/OiBib29sZWFuO1xuICAvKiog67OR66CsIOyLpO2WiSDsm4zsu6Qg7IiYICjquLDrs7g6IDQpICovXG4gIG1heFdvcmtlcnM/OiBudW1iZXI7XG4gIC8qKiBEZXYg7ISc67KEIOuCtCBWaXRlc3Qg7IOB7KO8IOyduOyKpO2EtOyKpCDshKTsoJUgKi9cbiAgZGV2UnVubmVyPzogU29uYW11RGV2UnVubmVyQ29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11Q29uZmlnPFRTaW5rSWQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRGaWx0ZXJJZCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHByb2plY3ROYW1lPzogc3RyaW5nO1xuXG4gIGFwaToge1xuICAgIGRpcjogc3RyaW5nO1xuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IHN0cmluZztcbiAgICB9O1xuICAgIHRpbWV6b25lPzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBpMThuIOyEpOyglVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGkxOG46IHtcbiAgICogICBkZWZhdWx0TG9jYWxlOiAna28nLFxuICAgKiAgIHN1cHBvcnRlZExvY2FsZXM6IFsna28nLCAnZW4nLCAnamEnXSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGkxOG46IFNvbmFtdUkxOG5PcHRpb25zO1xuXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcblxuICBkYXRhYmFzZToge1xuICAgIC8vIOuNsOydtO2EsOuyoOydtOyKpChwZ+uKlCBwZyDrqqjrk4gsIHBnbmF0aXZl64qUIHBnLW5hdGl2ZSDrqqjrk4jsnZgg7ISk7LmY6rCAIO2VhOyalO2VqeuLiOuLpC4pXG4gICAgZGF0YWJhc2U/OiBcInBnXCIgfCBcInBnbmF0aXZlXCI7XG4gICAgLy8g6riw67O4IOuNsOydtO2EsOuyoOydtOyKpCDsnbTrpoRcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLy8g66qo65OgIO2ZmOqyveyXkCDsoIHsmqnrkKAg6riw67O4IEtuZXgg7Ji17IWYXG4gICAgZGVmYXVsdE9wdGlvbnM6IERhdGFiYXNlQ29uZmlnO1xuICAgIC8vIO2ZmOqyveuzhCDshKTsoJVcbiAgICBlbnZpcm9ubWVudHM/OiB7XG4gICAgICBkZXZlbG9wbWVudD86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHByb2R1Y3Rpb24/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIGZpeHR1cmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHRlc3Q/OiBEYXRhYmFzZUNvbmZpZztcbiAgICB9O1xuICB9O1xuXG4gIGxvZ2dpbmc/OiBmYWxzZSB8IFNvbmFtdUxvZ2dpbmdPcHRpb25zPFRTaW5rSWQsIFRGaWx0ZXJJZD47XG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbiAgdGFza3M/OiBTb25hbXVUYXNrT3B0aW9ucztcblxuICAvKipcbiAgICog7YWM7Iqk7Yq4IOyEpOyglSAo67OR66CsIO2FjOyKpO2MhSDrk7EpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGVzdDoge1xuICAgKiAgIHBhcmFsbGVsOiB0cnVlLFxuICAgKiAgIG1heFdvcmtlcnM6IDQsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB0ZXN0PzogU29uYW11VGVzdENvbmZpZztcblxuICAvKipcbiAgICogU2xhY2sg7Iq57J24IOyEpOyglSAoUHJvZHVjdGlvbiDrp4jsnbTqt7jroIjsnbTshZjsmqkpXG4gICAqXG4gICAqIFByb2R1Y3Rpb24gREIg66eI7J206re466CI7J207IWYIOyLnCBTbGFja+ydhCDthrXtlZwg7Iq57J24IO2UhOuhnOyEuOyKpOulvCDtmZzshLHtmZTtlanri4jri6QuXG4gICAqIOyEpOygleydtCDsl4bsnLzrqbQg6riw7KG0IOuPmeyekSjrsJTroZwg7Iuk7ZaJKeycvOuhnCDrj5nsnpHtlanri4jri6QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2xhY2tDb25maXJtOiB7XG4gICAqICAgdGFyZ2V0czogW1wicHJvZHVjdGlvblwiXSxcbiAgICogICBib3RUb2tlbjogcHJvY2Vzcy5lbnYuU0xBQ0tfQk9UX1RPS0VOID8/IFwiXCIsXG4gICAqICAgY2hhbm5lbElkOiBwcm9jZXNzLmVudi5TTEFDS19DSEFOTkVMX0lEID8/IFwiXCIsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzbGFja0NvbmZpcm0/OiB7XG4gICAgLyoqIOyKueyduOydtCDtlYTsmpTtlZwgREIg7YKkIOuqqeuhnSAo7JiIOiBbXCJwcm9kdWN0aW9uXCJdKSAqL1xuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICAvKiogU2xhY2sgQm90IFRva2VuICh4b3hiLS4uLikgKi9cbiAgICBib3RUb2tlbjogc3RyaW5nO1xuICAgIC8qKiBTbGFjayBDaGFubmVsIElEIChDLi4uKSAqL1xuICAgIGNoYW5uZWxJZDogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11U2VydmVyT3B0aW9ucyA9IHtcbiAgLy8g7ZSE66Gc7KCd7Yq4IOyZuOu2gOyXkOyEnCDsoJHqt7ztlaAg7IiYIOyeiOuKlCBVUkwuIOq4sOuzuOqwkuydgCB7c2VydmVyLmxpc3Rlbi5ob3N0fTp7c2VydmVyLmxpc3Rlbi5wb3J0fSDsnoXri4jri6QuXG4gIGJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgZmFzdGlmeT86IE9taXQ8RmFzdGlmeVNlcnZlck9wdGlvbnMsIFwibG9nZ2VyXCI+O1xuXG4gIGxpc3Rlbj86IHtcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgaG9zdD86IHN0cmluZztcbiAgfTtcblxuICBwbHVnaW5zPzoge1xuICAgIC8qKiDsnZHri7Ug7JWV7LaVIO2UjOufrOq3uOyduCAoQGZhc3RpZnkvY29tcHJlc3MpICovXG4gICAgY29tcHJlc3M/OiBib29sZWFuIHwgRmFzdGlmeUNvbXByZXNzT3B0aW9ucztcbiAgICBjb3JzPzogYm9vbGVhbiB8IEZhc3RpZnlDb3JzT3B0aW9ucztcbiAgICBmb3JtYm9keT86IGJvb2xlYW4gfCBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zO1xuICAgIG11bHRpcGFydD86IGJvb2xlYW4gfCBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucztcbiAgICBxcz86IGJvb2xlYW4gfCBRc1BsdWdpbk9wdGlvbnM7XG4gICAgc3NlPzogYm9vbGVhbiB8IFNzZVBsdWdpbk9wdGlvbnM7XG4gICAgc3RhdGljPzogYm9vbGVhbiB8IEZhc3RpZnlTdGF0aWNPcHRpb25zO1xuXG4gICAgY3VzdG9tPzogKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSA9PiB2b2lkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDsnbjspp0g7ISk7KCVXG4gICAqIFNvbmFtdSDtmZXsnqXsnLzroZwgYWRkaXRpb25hbEZpZWxkc+yXkCBzb25hbXVUeXBlIOyGjeyEsSDstpTqsIAg6rCA64qlXG4gICAqIEJldHRlckF1dGjsnZggREJGaWVsZEF0dHJpYnV0ZeulvCDtmZXsnqXtlaAg7IiYIOyXhuyWtOyEnCDsmrDshKAgdXNlcuunjCDsoIHsmqlcbiAgICovXG4gIGF1dGg/OiBCZXR0ZXJBdXRoT3B0aW9ucyAmIHtcbiAgICB1c2VyPzoge1xuICAgICAgYWRkaXRpb25hbEZpZWxkcz86IFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBOb25OdWxsYWJsZTxOb25OdWxsYWJsZTxCZXR0ZXJBdXRoT3B0aW9uc1tcInVzZXJcIl0+W1wiYWRkaXRpb25hbEZpZWxkc1wiXT5bc3RyaW5nXSAmIHtcbiAgICAgICAgICBzb25hbXVUeXBlPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICA+O1xuICAgIH07XG4gIH07XG5cbiAgYXBpQ29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBTdG9yYWdlIOuTnOudvOydtOuyhCDshKTsoJUuXG4gICAqIERSSVZFX0RJU0sg7ZmY6rK967OA7IiY66GcIOyCrOyaqe2VoCDrk5zrnbzsnbTrsoTrpbwg7ISg7YOd7ZWp64uI64ukLiAo6riw67O46rCSOiBkZWZhdWx0IO2CpClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBkcml2ZXJzIH0gZnJvbSBcInNvbmFtdS9zdG9yYWdlXCI7XG4gICAqXG4gICAqIHN0b3JhZ2U6IHtcbiAgICogICBkZWZhdWx0OiBwcm9jZXNzLmVudi5EUklWRV9ESVNLID8/IFwiZnNcIixcbiAgICogICBkcml2ZXJzOiB7XG4gICAqICAgICBmczogZHJpdmVycy5mcyh7IGxvY2F0aW9uOiBcIi4vdXBsb2Fkc1wiLCB1cmxCdWlsZGVyOiB7IC4uLiB9IH0pLFxuICAgKiAgICAgczM6IGRyaXZlcnMuczMoeyBidWNrZXQ6IFwibXktYnVja2V0XCIsIHJlZ2lvbjogXCJhcC1ub3J0aGVhc3QtMlwiLCAuLi4gfSksXG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc3RvcmFnZT86IFN0b3JhZ2VDb25maWc7XG5cbiAgLyoqXG4gICAqIENhY2hlIOyEpOyglSAoQmVudG9DYWNoZSDquLDrsJgpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgZHJpdmVycywgc3RvcmUgfSBmcm9tIFwic29uYW11L2NhY2hlXCI7XG4gICAqXG4gICAqIGNhY2hlOiB7XG4gICAqICAgZGVmYXVsdDogJ21haW4nLFxuICAgKiAgIHN0b3Jlczoge1xuICAgKiAgICAgbWFpbjogc3RvcmUoKVxuICAgKiAgICAgICAudXNlTDFMYXllcihkcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6ICcxMDBtYicgfSkpXG4gICAqICAgICAgIC51c2VMMkxheWVyKGRyaXZlcnMucmVkaXMoeyBjb25uZWN0aW9uOiByZWRpc0Nvbm5lY3Rpb24gfSkpXG4gICAqICAgICAgIC51c2VCdXMoZHJpdmVycy5yZWRpc0J1cyh7IGNvbm5lY3Rpb246IHJlZGlzQ29ubmVjdGlvbiB9KSlcbiAgICogICB9LFxuICAgKiAgIHR0bDogJzFoJyxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGNhY2hlPzogQ2FjaGVDb25maWc7XG5cbiAgbGlmZWN5Y2xlPzoge1xuICAgIG9uU3RhcnQ/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uU2h1dGRvd24/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVUYXNrT3B0aW9ucyA9IHtcbiAgLy8gd29ya2Vy66W8IOyCrOyaqe2VoOyngCDsl6zrtoAsIOq4sOuzuOyggeycvOuhnCBkYWVtb24g66qo65Oc7JeQ7ISc66eMIOyCrOyaqeuQqC5cbiAgZW5hYmxlV29ya2VyPzogYm9vbGVhbjtcbiAgd29ya2VyT3B0aW9ucz86IFdvcmtmbG93T3B0aW9ucztcbiAgY29udGV4dFByb3ZpZGVyOiAoXG4gICAgZGVmYXVsdENvbnRleHQ6IFBpY2s8XG4gICAgICBDb250ZXh0LFxuICAgICAgXCJyZXBseVwiIHwgXCJyZXF1ZXN0XCIgfCBcImhlYWRlcnNcIiB8IFwiY3JlYXRlU1NFXCIgfCBcIm5haXRlU3RvcmVcIiB8IFwibG9jYWxlXCIgfCBcInVzZXJcIiB8IFwic2Vzc2lvblwiXG4gICAgPixcbiAgKSA9PiBDb250ZXh0IHwgUHJvbWlzZTxDb250ZXh0Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNTUk9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBIeWRyYXRpb24g7KCE6561XG4gICAqIC0gJ25vbmUnOiDtla3sg4Eg7IOI66GcIOugjOuNlOungSAoaHlkcmF0aW9uIG1pc21hdGNoIOqxseyglSDsl4bsnYwsIOq2jOyepSlcbiAgICogLSAnZnVsbCc6IFJlYWN0IGh5ZHJhdGlvbiDsi5zrj4QgKOyEnOuyhCBIVE1MIOyerOyCrOyaqSwgbWlzbWF0Y2gg7KO87J2YKVxuICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICovXG4gIGh5ZHJhdGlvbj86IFwibm9uZVwiIHwgXCJmdWxsXCI7XG59O1xuXG4vLyBOT1RFKEhhemUsIDI1MTIwOSk6IGNvbmZpZ+yXkOuKlCBULCBQcm9taXNlPFQ+LCAoKSA9PiBULCAoKSA9PiBQcm9taXNlPFQ+6rCAIOuqqOuRkCDsmKwg7IiYIOyeiOyWtOyVvCDtlaguXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnKGNvbmZpZzogRXhlY3V0YWJsZTxTb25hbXVDb25maWc+KTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29uZmlnKCkpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcpO1xufVxuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg7YyM7J287J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAqIOydtCDshKTsoJUg7YyM7J287J2AIO2ZmOqyveyXkCDrlLDrnbwg64uk66W4IOqyveuhnOyXkCDsnojsnYQg7IiYIOyeiOyKteuLiOuLpC5cbiAqIGRpc3Trpbwg67mM65Oc7ZWY64qUIO2ZmOqyveydtOudvOuptCBkaXN0IOuwlOuhnCDslYTrnpjsl5Ag7J6I7J2EIOqyg+ydtOqzoChjbGktd3JhcHBlci50c+yXkOyEnCDruYzrk5wpLFxuICog6re466CH7KeAIOyViuydgCDtmZjqsr3snbTrnbzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCDsnojsnYQg6rKD7J6F64uI64ukLlxuICpcbiAqIOydtCDtlajsiJjripQg7J2Y64+E7KCB7Jy866GcIOuLpOuluCDsnZjsobTshLHsnZgg7IKs7Jqp7J2EIOy1nOuMgO2VnCDrsLDsoJztlZjsmIDsirXri4jri6QuXG4gKiDsnbTripQg7Iuk7ZaJIOy0iOq4sOyXkCDstZzrjIDtlZwg67mg66W06rKMIOyEpOygleydhCDsnb3slrTsmKwg7IiYIOyeiOuPhOuhnSDtlZjquLAg7JyE7ZWo7J6F64uI64ukLlxuICog65Sw65287IScIOqyveuhnCBjb25jYXTqs7wgVVJMIHNjaGVtZSDstpTqsIDrj4Qg64uo7Iic7ZWcIOusuOyekOyXtCDsobDsnpHsnLzroZwg7LKY66as7ZWY7JiA7Iq164uI64ukLlxuICpcbiAqIEBwYXJhbSByb290UGF0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWcocm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8U29uYW11Q29uZmlnPiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPVxuICAgIHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiXG4gICAgICA/IGAke3Jvb3RQYXRofS9zcmMvc29uYW11LmNvbmZpZy50c2BcbiAgICAgIDogYCR7cm9vdFBhdGh9L2Rpc3Qvc29uYW11LmNvbmZpZy5qc2A7XG4gIGNvbnN0IHsgZGVmYXVsdDogY29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoYGZpbGU6Ly8ke2NvbmZpZ1BhdGh9YCk7XG4gIGNvbnN0IGltcG9ydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIgJiZcbiAgICBjb25zb2xlLmxvZyhgW1RJTUlOR10gbG9hZENvbmZpZyB0b29rICR7aW1wb3J0VGltZS50b0ZpeGVkKDIpfW1zYCk7XG4gIHJldHVybiBjb25maWc7XG59XG4iXSwibmFtZXMiOlsiZGVmaW5lQ29uZmlnIiwiY29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJsb2FkQ29uZmlnIiwicm9vdFBhdGgiLCJzdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwiY29uZmlnUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJIT1QiLCJWSVRFU1QiLCJkZWZhdWx0IiwiaW1wb3J0VGltZSIsIk5PREVfRU5WIiwiY29uc29sZSIsImxvZyIsInRvRml4ZWQiXSwibWFwcGluZ3MiOiJBQWdRQSx1RkFBdUY7QUFDdkYsT0FBTyxTQUFTQSxhQUFhQyxNQUFnQztJQUMzRCxJQUFJLE9BQU9BLFdBQVcsWUFBWTtRQUNoQyxPQUFPQyxRQUFRQyxPQUFPLENBQUNGO0lBQ3pCO0lBRUEsT0FBT0MsUUFBUUMsT0FBTyxDQUFDRjtBQUN6QjtBQUVBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNELE9BQU8sZUFBZUcsV0FBV0MsUUFBZ0I7SUFDL0MsTUFBTUMsUUFBUUMsWUFBWUMsR0FBRztJQUM3QixNQUFNQyxhQUNKQyxRQUFRQyxHQUFHLENBQUNDLEdBQUcsS0FBSyxTQUFTRixRQUFRQyxHQUFHLENBQUNFLE1BQU0sS0FBSyxTQUNoRCxHQUFHUixTQUFTLHFCQUFxQixDQUFDLEdBQ2xDLEdBQUdBLFNBQVMsc0JBQXNCLENBQUM7SUFDekMsTUFBTSxFQUFFUyxTQUFTYixNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRVEsWUFBWTtJQUMvRCxNQUFNTSxhQUFhUixZQUFZQyxHQUFHLEtBQUtGO0lBQ3ZDSSxRQUFRQyxHQUFHLENBQUNLLFFBQVEsS0FBSyxVQUN2QkMsUUFBUUMsR0FBRyxDQUFDLENBQUMseUJBQXlCLEVBQUVILFdBQVdJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNuRSxPQUFPbEI7QUFDVCJ9
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeUNvbXByZXNzT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9jb21wcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5Q29yc09wdGlvbnMgfSBmcm9tIFwiQGZhc3RpZnkvY29yc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5U3RhdGljT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9zdGF0aWNcIjtcbmltcG9ydCB0eXBlIHsgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUluc3RhbmNlLCBGYXN0aWZ5UmVwbHksIEZhc3RpZnlSZXF1ZXN0LCBGYXN0aWZ5U2VydmVyT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IFFzUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXFzXCI7XG5pbXBvcnQgdHlwZSB7IFNzZVBsdWdpbk9wdGlvbnMgfSBmcm9tIFwiZmFzdGlmeS1zc2UtdjIvbGliL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZyB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVMb2dnaW5nT3B0aW9ucyB9IGZyb20gXCIuLi9sb2dnZXIvY29uZmlndXJlXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VDb25maWcgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd09wdGlvbnMgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRhYmxlLCBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlQ29uZmlnID0gT21pdDxLbmV4LkNvbmZpZywgXCJjb25uZWN0aW9uXCI+ICYge1xuICBjb25uZWN0aW9uPzogS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG59O1xuXG4vKipcbiAqIGkxOG4g7ISk7KCVXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdUkxOG5PcHRpb25zID0ge1xuICAvKiog6riw67O4IGxvY2FsZSAo7YKkIOygleydmCDquLDspIAgKyDrn7Dtg4DsnoQg6riw67O46rCSKSAqL1xuICBkZWZhdWx0TG9jYWxlOiBzdHJpbmc7XG4gIC8qKiDsp4Dsm5DtlZjripQgbG9jYWxlIOuqqeuhnSAqL1xuICBzdXBwb3J0ZWRMb2NhbGVzOiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogRGV2IOyEnOuyhCDrgrQgVml0ZXN0IOyDgeyjvCDsnbjsiqTthLTsiqQg7ISk7KCVXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyA9IHtcbiAgLyoqIERldlJ1bm5lciDtmZzshLHtmZQg7Jes67aAICjquLDrs7g6IGZhbHNlKSAqL1xuICBlbmFibGVkOiBib29sZWFuO1xuICAvKiog7YWM7Iqk7Yq4IOyXlOuTnO2PrOyduO2KuCDqsr3roZwg7KCR65GQ7IKsICjquLDrs7g6IC9fX3Rlc3RfXykgKi9cbiAgcm91dGVQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKiB2aXRlc3QuY29uZmlnLnRzIOqyveuhnCAoYXBpLXJvb3Qg7IOB64yA6rK966GcKSAqL1xuICB2aXRlc3RDb25maWdQYXRoPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDthYzsiqTtirgg7ISk7KCVXG4gKiB2aXRlc3Qg67OR66CsIO2FjOyKpO2MheydhCBzb25hbXUuY29uZmlnLnRzIO2VnCDqs7Psl5DshJwg6rSA66as7ZWY6riwIOychO2VnCDshKTsoJXsnoXri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFNvbmFtdVRlc3RDb25maWcgPSB7XG4gIC8qKiDrs5HroKwg7YWM7Iqk7YyFIO2ZnOyEse2ZlCAo6riw67O4OiBmYWxzZSkgKi9cbiAgcGFyYWxsZWw/OiBib29sZWFuO1xuICAvKiog67OR66CsIOyLpO2WiSDsm4zsu6Qg7IiYICjquLDrs7g6IDQpICovXG4gIG1heFdvcmtlcnM/OiBudW1iZXI7XG4gIC8qKiBEZXYg7ISc67KEIOuCtCBWaXRlc3Qg7IOB7KO8IOyduOyKpO2EtOyKpCDshKTsoJUgKi9cbiAgZGV2UnVubmVyPzogU29uYW11RGV2UnVubmVyQ29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11Q29uZmlnPFRTaW5rSWQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRGaWx0ZXJJZCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHByb2plY3ROYW1lPzogc3RyaW5nO1xuXG4gIGFwaToge1xuICAgIGRpcjogc3RyaW5nO1xuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IHN0cmluZztcbiAgICB9O1xuICAgIHRpbWV6b25lPzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBpMThuIOyEpOyglVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGkxOG46IHtcbiAgICogICBkZWZhdWx0TG9jYWxlOiAna28nLFxuICAgKiAgIHN1cHBvcnRlZExvY2FsZXM6IFsna28nLCAnZW4nLCAnamEnXSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGkxOG46IFNvbmFtdUkxOG5PcHRpb25zO1xuXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcblxuICBkYXRhYmFzZToge1xuICAgIC8vIOuNsOydtO2EsOuyoOydtOyKpChwZ+uKlCBwZyDrqqjrk4gsIHBnbmF0aXZl64qUIHBnLW5hdGl2ZSDrqqjrk4jsnZgg7ISk7LmY6rCAIO2VhOyalO2VqeuLiOuLpC4pXG4gICAgZGF0YWJhc2U/OiBcInBnXCIgfCBcInBnbmF0aXZlXCI7XG4gICAgLy8g6riw67O4IOuNsOydtO2EsOuyoOydtOyKpCDsnbTrpoRcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLy8g66qo65OgIO2ZmOqyveyXkCDsoIHsmqnrkKAg6riw67O4IEtuZXgg7Ji17IWYXG4gICAgZGVmYXVsdE9wdGlvbnM6IERhdGFiYXNlQ29uZmlnO1xuICAgIC8vIO2ZmOqyveuzhCDshKTsoJVcbiAgICBlbnZpcm9ubWVudHM/OiB7XG4gICAgICBkZXZlbG9wbWVudD86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHByb2R1Y3Rpb24/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIGZpeHR1cmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICAgIHRlc3Q/OiBEYXRhYmFzZUNvbmZpZztcbiAgICB9O1xuICB9O1xuXG4gIGxvZ2dpbmc/OiBmYWxzZSB8IFNvbmFtdUxvZ2dpbmdPcHRpb25zPFRTaW5rSWQsIFRGaWx0ZXJJZD47XG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbiAgdGFza3M/OiBTb25hbXVUYXNrT3B0aW9ucztcblxuICAvKipcbiAgICog7YWM7Iqk7Yq4IOyEpOyglSAo67OR66CsIO2FjOyKpO2MhSDrk7EpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGVzdDoge1xuICAgKiAgIHBhcmFsbGVsOiB0cnVlLFxuICAgKiAgIG1heFdvcmtlcnM6IDQsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICB0ZXN0PzogU29uYW11VGVzdENvbmZpZztcblxuICAvKipcbiAgICog7Jm467aAIOyXkOuUlO2EsCDshKTsoJUgKENERCDrk7Hsl5DshJwg7YyM7J28IO2OuOynkSDsi5wg7IKs7JqpKVxuICAgKiDrr7jshKTsoJUg7IucIFwidnNjb2RlXCLrpbwg6riw67O46rCS7Jy866GcIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleHRlcm5hbEVkaXRvcjogXCJjdXJzb3JcIlxuICAgKiBgYGBcbiAgICovXG4gIGV4dGVybmFsRWRpdG9yPzogXCJWaXN1YWwgU3R1ZGlvIENvZGVcIiB8IFwiWmVkXCIgfCBcIkN1cnNvclwiO1xuXG4gIC8qKlxuICAgKiBTbGFjayDsirnsnbgg7ISk7KCVIChQcm9kdWN0aW9uIOuniOydtOq3uOugiOydtOyFmOyaqSlcbiAgICpcbiAgICogUHJvZHVjdGlvbiBEQiDrp4jsnbTqt7jroIjsnbTshZgg7IucIFNsYWNr7J2EIO2Gte2VnCDsirnsnbgg7ZSE66Gc7IS47Iqk66W8IO2ZnOyEse2ZlO2VqeuLiOuLpC5cbiAgICog7ISk7KCV7J20IOyXhuycvOuptCDquLDsobQg64+Z7J6RKOuwlOuhnCDsi6Ttlokp7Jy866GcIOuPmeyeke2VqeuLiOuLpC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzbGFja0NvbmZpcm06IHtcbiAgICogICB0YXJnZXRzOiBbXCJwcm9kdWN0aW9uXCJdLFxuICAgKiAgIGJvdFRva2VuOiBwcm9jZXNzLmVudi5TTEFDS19CT1RfVE9LRU4gPz8gXCJcIixcbiAgICogICBjaGFubmVsSWQ6IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQgPz8gXCJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNsYWNrQ29uZmlybT86IHtcbiAgICAvKiog7Iq57J247J20IO2VhOyalO2VnCBEQiDtgqQg66qp66GdICjsmIg6IFtcInByb2R1Y3Rpb25cIl0pICovXG4gICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuICAgIC8qKiBTbGFjayBCb3QgVG9rZW4gKHhveGItLi4uKSAqL1xuICAgIGJvdFRva2VuOiBzdHJpbmc7XG4gICAgLyoqIFNsYWNrIENoYW5uZWwgSUQgKEMuLi4pICovXG4gICAgY2hhbm5lbElkOiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zID0ge1xuICAvLyDtlITroZzsoJ3tirgg7Jm467aA7JeQ7IScIOygkeq3vO2VoCDsiJgg7J6I64qUIFVSTC4g6riw67O46rCS7J2AIHtzZXJ2ZXIubGlzdGVuLmhvc3R9OntzZXJ2ZXIubGlzdGVuLnBvcnR9IOyeheuLiOuLpC5cbiAgYmFzZVVybD86IHN0cmluZztcblxuICBmYXN0aWZ5PzogT21pdDxGYXN0aWZ5U2VydmVyT3B0aW9ucywgXCJsb2dnZXJcIj47XG5cbiAgbGlzdGVuPzoge1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBob3N0Pzogc3RyaW5nO1xuICB9O1xuXG4gIHBsdWdpbnM/OiB7XG4gICAgLyoqIOydkeuLtSDslZXstpUg7ZSM65+s6re47J24IChAZmFzdGlmeS9jb21wcmVzcykgKi9cbiAgICBjb21wcmVzcz86IGJvb2xlYW4gfCBGYXN0aWZ5Q29tcHJlc3NPcHRpb25zO1xuICAgIGNvcnM/OiBib29sZWFuIHwgRmFzdGlmeUNvcnNPcHRpb25zO1xuICAgIGZvcm1ib2R5PzogYm9vbGVhbiB8IEZhc3RpZnlGb3JtYm9keU9wdGlvbnM7XG4gICAgbXVsdGlwYXJ0PzogYm9vbGVhbiB8IEZhc3RpZnlNdWx0aXBhcnRPcHRpb25zO1xuICAgIHFzPzogYm9vbGVhbiB8IFFzUGx1Z2luT3B0aW9ucztcbiAgICBzc2U/OiBib29sZWFuIHwgU3NlUGx1Z2luT3B0aW9ucztcbiAgICBzdGF0aWM/OiBib29sZWFuIHwgRmFzdGlmeVN0YXRpY09wdGlvbnM7XG5cbiAgICBjdXN0b20/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IHZvaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOyduOymnSDshKTsoJVcbiAgICogU29uYW11IO2ZleyepeycvOuhnCBhZGRpdGlvbmFsRmllbGRz7JeQIHNvbmFtdVR5cGUg7IaN7ISxIOy2lOqwgCDqsIDriqVcbiAgICogQmV0dGVyQXV0aOydmCBEQkZpZWxkQXR0cmlidXRl66W8IO2Zleyepe2VoCDsiJgg7JeG7Ja07IScIOyasOyEoCB1c2Vy66eMIOyggeyaqVxuICAgKi9cbiAgYXV0aD86IEJldHRlckF1dGhPcHRpb25zICYge1xuICAgIHVzZXI/OiB7XG4gICAgICBhZGRpdGlvbmFsRmllbGRzPzogUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIE5vbk51bGxhYmxlPE5vbk51bGxhYmxlPEJldHRlckF1dGhPcHRpb25zW1widXNlclwiXT5bXCJhZGRpdGlvbmFsRmllbGRzXCJdPltzdHJpbmddICYge1xuICAgICAgICAgIHNvbmFtdVR5cGU/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgID47XG4gICAgfTtcbiAgfTtcblxuICBhcGlDb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWc7XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2Ug65Oc65287J2067KEIOyEpOyglS5cbiAgICogRFJJVkVfRElTSyDtmZjqsr3rs4DsiJjroZwg7IKs7Jqp7ZWgIOuTnOudvOydtOuyhOulvCDshKDtg53tlanri4jri6QuICjquLDrs7jqsJI6IGRlZmF1bHQg7YKkKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IGRyaXZlcnMgfSBmcm9tIFwic29uYW11L3N0b3JhZ2VcIjtcbiAgICpcbiAgICogc3RvcmFnZToge1xuICAgKiAgIGRlZmF1bHQ6IHByb2Nlc3MuZW52LkRSSVZFX0RJU0sgPz8gXCJmc1wiLFxuICAgKiAgIGRyaXZlcnM6IHtcbiAgICogICAgIGZzOiBkcml2ZXJzLmZzKHsgbG9jYXRpb246IFwiLi91cGxvYWRzXCIsIHVybEJ1aWxkZXI6IHsgLi4uIH0gfSksXG4gICAqICAgICBzMzogZHJpdmVycy5zMyh7IGJ1Y2tldDogXCJteS1idWNrZXRcIiwgcmVnaW9uOiBcImFwLW5vcnRoZWFzdC0yXCIsIC4uLiB9KSxcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzdG9yYWdlPzogU3RvcmFnZUNvbmZpZztcblxuICAvKipcbiAgICogQ2FjaGUg7ISk7KCVIChCZW50b0NhY2hlIOq4sOuwmClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBkcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcbiAgICpcbiAgICogY2FjaGU6IHtcbiAgICogICBkZWZhdWx0OiAnbWFpbicsXG4gICAqICAgc3RvcmVzOiB7XG4gICAqICAgICBtYWluOiBzdG9yZSgpXG4gICAqICAgICAgIC51c2VMMUxheWVyKGRyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogJzEwMG1iJyB9KSlcbiAgICogICAgICAgLnVzZUwyTGF5ZXIoZHJpdmVycy5yZWRpcyh7IGNvbm5lY3Rpb246IHJlZGlzQ29ubmVjdGlvbiB9KSlcbiAgICogICAgICAgLnVzZUJ1cyhkcml2ZXJzLnJlZGlzQnVzKHsgY29ubmVjdGlvbjogcmVkaXNDb25uZWN0aW9uIH0pKVxuICAgKiAgIH0sXG4gICAqICAgdHRsOiAnMWgnLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcblxuICBsaWZlY3ljbGU/OiB7XG4gICAgb25TdGFydD86IChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25TaHV0ZG93bj86IChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVRhc2tPcHRpb25zID0ge1xuICAvLyB3b3JrZXLrpbwg7IKs7Jqp7ZWg7KeAIOyXrOu2gCwg6riw67O47KCB7Jy866GcIGRhZW1vbiDrqqjrk5zsl5DshJzrp4wg7IKs7Jqp65CoLlxuICBlbmFibGVXb3JrZXI/OiBib29sZWFuO1xuICB3b3JrZXJPcHRpb25zPzogV29ya2Zsb3dPcHRpb25zO1xuICBjb250ZXh0UHJvdmlkZXI6IChcbiAgICBkZWZhdWx0Q29udGV4dDogUGljazxcbiAgICAgIENvbnRleHQsXG4gICAgICBcInJlcGx5XCIgfCBcInJlcXVlc3RcIiB8IFwiaGVhZGVyc1wiIHwgXCJjcmVhdGVTU0VcIiB8IFwibmFpdGVTdG9yZVwiIHwgXCJsb2NhbGVcIiB8IFwidXNlclwiIHwgXCJzZXNzaW9uXCJcbiAgICA+LFxuICApID0+IENvbnRleHQgfCBQcm9taXNlPENvbnRleHQ+O1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11U1NST3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIEh5ZHJhdGlvbiDsoITrnrVcbiAgICogLSAnbm9uZSc6IO2VreyDgSDsg4jroZwg66CM642U66eBIChoeWRyYXRpb24gbWlzbWF0Y2gg6rGx7KCVIOyXhuydjCwg6raM7J6lKVxuICAgKiAtICdmdWxsJzogUmVhY3QgaHlkcmF0aW9uIOyLnOuPhCAo7ISc67KEIEhUTUwg7J6s7IKs7JqpLCBtaXNtYXRjaCDso7zsnZgpXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgaHlkcmF0aW9uPzogXCJub25lXCIgfCBcImZ1bGxcIjtcbn07XG5cbi8vIE5PVEUoSGF6ZSwgMjUxMjA5KTogY29uZmln7JeQ64qUIFQsIFByb21pc2U8VD4sICgpID0+IFQsICgpID0+IFByb21pc2U8VD7qsIAg66qo65GQIOyYrCDsiJgg7J6I7Ja07JW8IO2VqC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBFeGVjdXRhYmxlPFNvbmFtdUNvbmZpZz4pOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcoKSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG59XG5cbi8qKlxuICogc29uYW11LmNvbmZpZy50cyDtjIzsnbzsnYQg66Gc65Oc7ZWp64uI64ukLlxuICog7J20IOyEpOyglSDtjIzsnbzsnYAg7ZmY6rK97JeQIOuUsOudvCDri6Trpbgg6rK966Gc7JeQIOyeiOydhCDsiJgg7J6I7Iq164uI64ukLlxuICogZGlzdOulvCDruYzrk5ztlZjripQg7ZmY6rK97J20652866m0IGRpc3Qg67CU66GcIOyVhOuemOyXkCDsnojsnYQg6rKD7J206rOgKGNsaS13cmFwcGVyLnRz7JeQ7IScIOu5jOuTnCksXG4gKiDqt7jroIfsp4Ag7JWK7J2AIO2ZmOqyveydtOudvOuptCDtlITroZzsoJ3tirgg66Oo7Yq47JeQIOyeiOydhCDqsoPsnoXri4jri6QuXG4gKlxuICog7J20IO2VqOyImOuKlCDsnZjrj4TsoIHsnLzroZwg64uk66W4IOydmOyhtOyEseydmCDsgqzsmqnsnYQg7LWc64yA7ZWcIOuwsOygnO2VmOyYgOyKteuLiOuLpC5cbiAqIOydtOuKlCDsi6Ttlokg7LSI6riw7JeQIOy1nOuMgO2VnCDruaDrpbTqsowg7ISk7KCV7J2EIOydveyWtOyYrCDsiJgg7J6I64+E66GdIO2VmOq4sCDsnITtlajsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg6rK966GcIGNvbmNhdOqzvCBVUkwgc2NoZW1lIOy2lOqwgOuPhCDri6jsiJztlZwg66y47J6Q7Je0IOyhsOyekeycvOuhnCDsspjrpqztlZjsmIDsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHJvb3RQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhyb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9XG4gICAgcHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiIHx8IHByb2Nlc3MuZW52LlZJVEVTVCA9PT0gXCJ0cnVlXCJcbiAgICAgID8gYCR7cm9vdFBhdGh9L3NyYy9zb25hbXUuY29uZmlnLnRzYFxuICAgICAgOiBgJHtyb290UGF0aH0vZGlzdC9zb25hbXUuY29uZmlnLmpzYDtcbiAgY29uc3QgeyBkZWZhdWx0OiBjb25maWcgfSA9IGF3YWl0IGltcG9ydChgZmlsZTovLyR7Y29uZmlnUGF0aH1gKTtcbiAgY29uc3QgaW1wb3J0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInRlc3RcIiAmJlxuICAgIGNvbnNvbGUubG9nKGBbVElNSU5HXSBsb2FkQ29uZmlnIHRvb2sgJHtpbXBvcnRUaW1lLnRvRml4ZWQoMil9bXNgKTtcbiAgcmV0dXJuIGNvbmZpZztcbn1cbiJdLCJuYW1lcyI6WyJkZWZpbmVDb25maWciLCJjb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsImxvYWRDb25maWciLCJyb290UGF0aCIsInN0YXJ0IiwicGVyZm9ybWFuY2UiLCJub3ciLCJjb25maWdQYXRoIiwicHJvY2VzcyIsImVudiIsIkhPVCIsIlZJVEVTVCIsImRlZmF1bHQiLCJpbXBvcnRUaW1lIiwiTk9ERV9FTlYiLCJjb25zb2xlIiwibG9nIiwidG9GaXhlZCJdLCJtYXBwaW5ncyI6IkFBMlFBLHVGQUF1RjtBQUN2RixPQUFPLFNBQVNBLGFBQWFDLE1BQWdDO0lBQzNELElBQUksT0FBT0EsV0FBVyxZQUFZO1FBQ2hDLE9BQU9DLFFBQVFDLE9BQU8sQ0FBQ0Y7SUFDekI7SUFFQSxPQUFPQyxRQUFRQyxPQUFPLENBQUNGO0FBQ3pCO0FBRUE7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsT0FBTyxlQUFlRyxXQUFXQyxRQUFnQjtJQUMvQyxNQUFNQyxRQUFRQyxZQUFZQyxHQUFHO0lBQzdCLE1BQU1DLGFBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0MsR0FBRyxLQUFLLFNBQVNGLFFBQVFDLEdBQUcsQ0FBQ0UsTUFBTSxLQUFLLFNBQ2hELEdBQUdSLFNBQVMscUJBQXFCLENBQUMsR0FDbEMsR0FBR0EsU0FBUyxzQkFBc0IsQ0FBQztJQUN6QyxNQUFNLEVBQUVTLFNBQVNiLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFUSxZQUFZO0lBQy9ELE1BQU1NLGFBQWFSLFlBQVlDLEdBQUcsS0FBS0Y7SUFDdkNJLFFBQVFDLEdBQUcsQ0FBQ0ssUUFBUSxLQUFLLFVBQ3ZCQyxRQUFRQyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsRUFBRUgsV0FBV0ksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ25FLE9BQU9sQjtBQUNUIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0IjD"}
1
+ {"version":3,"file":"test-command.d.ts","sourceRoot":"","sources":["../../src/bin/test-command.ts"],"names":[],"mappings":"AAkCA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmIjD"}
@@ -2,14 +2,12 @@ import path from "node:path";
2
2
  import chalk from "chalk";
3
3
  import { loadConfig } from "../api/config.js";
4
4
  import { findApiRootPath } from "../utils/utils.js";
5
- export async function testCommand() {
6
- // VITEST=true 임시 설정으로 loadConfig가 src/sonamu.config.ts 경로를 사용하도록 함
5
+ async function loadTestConfig() {
7
6
  const prevVitest = process.env.VITEST;
8
7
  process.env.VITEST = "true";
9
- let config;
10
8
  try {
11
9
  const apiRootPath = findApiRootPath();
12
- config = await loadConfig(apiRootPath);
10
+ return await loadConfig(apiRootPath);
13
11
  } finally{
14
12
  if (prevVitest === undefined) {
15
13
  delete process.env.VITEST;
@@ -17,29 +15,47 @@ export async function testCommand() {
17
15
  process.env.VITEST = prevVitest;
18
16
  }
19
17
  }
20
- // process.argv 파싱: sonamu test [file...] --pattern "이름" --traces
18
+ }
19
+ function resolveTestBaseUrl(config) {
20
+ const port = config.server.listen?.port ?? 3000;
21
+ const host = config.server.listen?.host ?? "localhost";
22
+ const routePrefix = config.test?.devRunner?.routePrefix ?? "/__test__";
23
+ return {
24
+ host,
25
+ port,
26
+ routePrefix,
27
+ baseUrl: `http://${host}:${port}${routePrefix}`
28
+ };
29
+ }
30
+ export async function testCommand() {
21
31
  const args = process.argv.slice(3);
32
+ const config = await loadTestConfig();
33
+ // process.argv 파싱: sonamu test [file...] --pattern "이름" --traces --status
22
34
  const files = [];
23
35
  let pattern;
24
36
  let showTraces = false;
37
+ let showStatus = false;
25
38
  for(let i = 0; i < args.length; i++){
26
39
  const arg = args[i];
27
40
  if (arg === "--pattern" || arg === "-p") {
28
41
  pattern = args[++i];
29
42
  } else if (arg === "--traces" || arg === "-t") {
30
43
  showTraces = true;
44
+ } else if (arg === "--status" || arg === "-s") {
45
+ showStatus = true;
31
46
  } else if (!arg.startsWith("-")) {
32
47
  files.push(arg);
33
48
  }
34
49
  }
50
+ if (showStatus) {
51
+ return testStatusCommand(config);
52
+ }
35
53
  if (!config.test?.devRunner?.enabled) {
36
54
  console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
37
55
  process.exit(1);
38
56
  }
39
- const port = config.server.listen?.port ?? 3000;
40
- const host = config.server.listen?.host ?? "localhost";
41
- const routePrefix = config.test?.devRunner?.routePrefix ?? "/__test__";
42
- const url = `http://${host}:${port}${routePrefix}/run`;
57
+ const { baseUrl } = resolveTestBaseUrl(config);
58
+ const url = `${baseUrl}/run`;
43
59
  const payload = {};
44
60
  if (files.length > 0) {
45
61
  payload.files = files;
@@ -143,5 +159,32 @@ function collectTracesFromResults(nodes) {
143
159
  }
144
160
  return result;
145
161
  }
162
+ async function testStatusCommand(config) {
163
+ if (!config.test?.devRunner?.enabled) {
164
+ console.error(chalk.red("devRunner가 활성화되지 않았습니다. sonamu.config.ts에서 test.devRunner.enabled: true 설정이 필요합니다"));
165
+ process.exit(1);
166
+ }
167
+ const { baseUrl } = resolveTestBaseUrl(config);
168
+ const url = `${baseUrl}/status`;
169
+ try {
170
+ const response = await fetch(url);
171
+ if (!response.ok) {
172
+ console.error(chalk.red(`예상하지 못한 응답: ${response.status}`));
173
+ process.exit(1);
174
+ }
175
+ const status = await response.json();
176
+ console.log(chalk.bold("DevRunner 상태:"));
177
+ console.log(` ready: ${status.ready ? chalk.green("true") : chalk.red("false")}`);
178
+ console.log(` running: ${status.running ? chalk.yellow("true") : "false"}`);
179
+ console.log(` lastRunAt: ${status.lastRunAt ?? chalk.dim("없음")}`);
180
+ console.log(` sseAvailable: ${status.sseAvailable ? chalk.green("true") : "false"}`);
181
+ } catch (err) {
182
+ if (err instanceof TypeError && err.cause) {
183
+ console.error(chalk.red("dev 서버에 연결할 수 없습니다. sonamu dev가 실행 중인지 확인하세요"));
184
+ process.exit(1);
185
+ }
186
+ throw err;
187
+ }
188
+ }
146
189
 
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBSdW5SZXN1bHQsIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFZJVEVTVD10cnVlIOyehOyLnCDshKTsoJXsnLzroZwgbG9hZENvbmZpZ+qwgCBzcmMvc29uYW11LmNvbmZpZy50cyDqsr3roZzrpbwg7IKs7Jqp7ZWY64+E66GdIO2VqFxuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgbGV0IGNvbmZpZzogU29uYW11Q29uZmlnO1xuICB0cnkge1xuICAgIGNvbnN0IGFwaVJvb3RQYXRoID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gICAgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhhcGlSb290UGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHByZXZWaXRlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LlZJVEVTVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5lbnYuVklURVNUID0gcHJldlZpdGVzdDtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXNcbiAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgzKTtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9JHtyb3V0ZVByZWZpeH0vcnVuYDtcblxuICBjb25zdCBwYXlsb2FkOiB7IGZpbGVzPzogc3RyaW5nW107IHBhdHRlcm4/OiBzdHJpbmcgfSA9IHt9O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIHBheWxvYWQuZmlsZXMgPSBmaWxlcztcbiAgfVxuICBpZiAocGF0dGVybikge1xuICAgIHBheWxvYWQucGF0dGVybiA9IHBhdHRlcm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA1MDApIHtcbiAgICAgIGNvbnN0IGVycm9yQm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiVml0ZXN0IOyduOyKpO2EtOyKpOqwgCDslYTsp4Eg7KSA67mE65CY7KeAIOyViuyVmOyKteuLiOuLpFwiKSk7XG4gICAgICBpZiAoZXJyb3JCb2R5LmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yQm9keS5lcnJvcikpO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIFJ1blJlc3VsdDtcblxuICAgIGNvbnN0IHsgcGFzc2VkLCBmYWlsZWQ6IGZhaWxlZENvdW50LCB0b3RhbCwgZHVyYXRpb25NcyB9ID0gcmVzdWx0LnN1bW1hcnk7XG4gICAgY29uc3QgcGFzc2VkU3RyID0gY2hhbGsuZ3JlZW4oYCR7cGFzc2VkfSBwYXNzZWRgKTtcbiAgICBjb25zdCBmYWlsZWRTdHIgPVxuICAgICAgZmFpbGVkQ291bnQgPiAwID8gY2hhbGsucmVkKGAke2ZhaWxlZENvdW50fSBmYWlsZWRgKSA6IGAke2ZhaWxlZENvdW50fSBmYWlsZWRgO1xuICAgIGNvbnNvbGUubG9nKGBcXG5UZXN0czogJHtwYXNzZWRTdHJ9LCAke2ZhaWxlZFN0cn0sICR7dG90YWx9IHRvdGFsYCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGBEdXJhdGlvbjogJHtkdXJhdGlvbk1zfW1zYCkpO1xuXG4gICAgY29uc3QgZmFpbGVkVGVzdHMgPSBjb2xsZWN0RmFpbGVkRnJvbVJlc3VsdHMocmVzdWx0LnJlc3VsdHMpO1xuICAgIGlmIChmYWlsZWRUZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQuYm9sZChcIlxcbkZhaWxlZCB0ZXN0czpcIikpO1xuICAgICAgZm9yIChjb25zdCBmIG9mIGZhaWxlZFRlc3RzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsucmVkKFwieFwiKX0gJHtmLmZ1bGxOYW1lfSAke2NoYWxrLmRpbShgKCR7Zi5maWxlfSlgKX1gKTtcbiAgICAgICAgaWYgKGYuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7Y2hhbGsucmVkKGYuZXJyb3IubWVzc2FnZSl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd1RyYWNlcykge1xuICAgICAgY29uc3QgdGVzdHNXaXRoVHJhY2VzID0gY29sbGVjdFRyYWNlc0Zyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICAgIGlmICh0ZXN0c1dpdGhUcmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQoXCJcXG5UcmFjZXM6XCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB7IHRlc3ROYW1lLCBmaWxlLCB0cmFjZXMgfSBvZiB0ZXN0c1dpdGhUcmFjZXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuICAke2NoYWxrLmJvbGQodGVzdE5hbWUpfWApO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuZGltKHBhdGguYmFzZW5hbWUoZmlsZSkpfWApO1xuICAgICAgICAgIGZvciAoY29uc3QgdHJhY2Ugb2YgdHJhY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBsb2MgPSBgJHtwYXRoLmJhc2VuYW1lKHRyYWNlLmZpbGVQYXRoKX06JHt0cmFjZS5saW5lTnVtYmVyfWA7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZVN0ciA9XG4gICAgICAgICAgICAgIHR5cGVvZiB0cmFjZS52YWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gdHJhY2UudmFsdWVcbiAgICAgICAgICAgICAgICA6IChKU09OLnN0cmluZ2lmeSh0cmFjZS52YWx1ZSwgbnVsbCwgMikgPz8gXCJ1bmRlZmluZWRcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuICAgICR7Y2hhbGsueWVsbG93KGBbJHt0cmFjZS5rZXl9XWApfSAke2NoYWxrLmRpbShsb2MpfWApO1xuICAgICAgICAgICAgY29uc3QgaW5kZW50ZWQgPSB2YWx1ZVN0ci5zcGxpdChcIlxcblwiKS5qb2luKFwiXFxuICAgIFwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtpbmRlbnRlZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiBlcnIuY2F1c2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcImRldiDshJzrsoTsl5Ag7Jew6rKw7ZWgIOyImCDsl4bsirXri4jri6QuIHNvbmFtdSBkZXbqsIAg7Iuk7ZaJIOykkeyduOyngCDtmZXsnbjtlZjshLjsmpRcIiksXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKG5vZGVzOiBUZXN0Q2FzZVJlc3VsdFtdKTogVGVzdENhc2VSZXN1bHRbXSB7XG4gIGNvbnN0IHJlc3VsdDogVGVzdENhc2VSZXN1bHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnN0YXRlID09PSBcImZhaWxlZFwiKSB7XG4gICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKG5vZGUuY2hpbGRyZW4pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFRyYWNlc0Zyb21SZXN1bHRzKFxuICBub2RlczogVGVzdENhc2VSZXN1bHRbXSxcbik6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSB7XG4gIGNvbnN0IHJlc3VsdDogeyB0ZXN0TmFtZTogc3RyaW5nOyBmaWxlOiBzdHJpbmc7IHRyYWNlczogVGVzdENhc2VSZXN1bHRbXCJ0cmFjZXNcIl0gfVtdID0gW107XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGlmIChub2RlLmtpbmQgPT09IFwidGVzdFwiICYmIG5vZGUudHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgdGVzdE5hbWU6IG5vZGUuZnVsbE5hbWUsIGZpbGU6IG5vZGUuZmlsZSwgdHJhY2VzOiBub2RlLnRyYWNlcyB9KTtcbiAgICB9XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uY29sbGVjdFRyYWNlc0Zyb21SZXN1bHRzKG5vZGUuY2hpbGRyZW4pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiY2hhbGsiLCJsb2FkQ29uZmlnIiwiZmluZEFwaVJvb3RQYXRoIiwidGVzdENvbW1hbmQiLCJwcmV2Vml0ZXN0IiwicHJvY2VzcyIsImVudiIsIlZJVEVTVCIsImNvbmZpZyIsImFwaVJvb3RQYXRoIiwidW5kZWZpbmVkIiwiYXJncyIsImFyZ3YiLCJzbGljZSIsImZpbGVzIiwicGF0dGVybiIsInNob3dUcmFjZXMiLCJpIiwibGVuZ3RoIiwiYXJnIiwic3RhcnRzV2l0aCIsInB1c2giLCJ0ZXN0IiwiZGV2UnVubmVyIiwiZW5hYmxlZCIsImNvbnNvbGUiLCJlcnJvciIsInJlZCIsImV4aXQiLCJwb3J0Iiwic2VydmVyIiwibGlzdGVuIiwiaG9zdCIsInJvdXRlUHJlZml4IiwidXJsIiwicGF5bG9hZCIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdGF0dXMiLCJlcnJvckJvZHkiLCJqc29uIiwib2siLCJyZXN1bHQiLCJwYXNzZWQiLCJmYWlsZWQiLCJmYWlsZWRDb3VudCIsInRvdGFsIiwiZHVyYXRpb25NcyIsInN1bW1hcnkiLCJwYXNzZWRTdHIiLCJncmVlbiIsImZhaWxlZFN0ciIsImxvZyIsImRpbSIsImZhaWxlZFRlc3RzIiwiY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzIiwicmVzdWx0cyIsImJvbGQiLCJmIiwiZnVsbE5hbWUiLCJmaWxlIiwibWVzc2FnZSIsInRlc3RzV2l0aFRyYWNlcyIsImNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyIsImN5YW4iLCJ0ZXN0TmFtZSIsInRyYWNlcyIsImJhc2VuYW1lIiwidHJhY2UiLCJsb2MiLCJmaWxlUGF0aCIsImxpbmVOdW1iZXIiLCJ2YWx1ZVN0ciIsInZhbHVlIiwieWVsbG93Iiwia2V5IiwiaW5kZW50ZWQiLCJzcGxpdCIsImpvaW4iLCJlcnIiLCJUeXBlRXJyb3IiLCJjYXVzZSIsIm5vZGVzIiwibm9kZSIsImtpbmQiLCJzdGF0ZSIsImNoaWxkcmVuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFDN0IsT0FBT0MsV0FBVyxRQUFRO0FBRTFCLFNBQVNDLFVBQVUsUUFBUSxtQkFBZ0I7QUFFM0MsU0FBU0MsZUFBZSxRQUFRLG9CQUFpQjtBQUVqRCxPQUFPLGVBQWVDO0lBQ3BCLG1FQUFtRTtJQUNuRSxNQUFNQyxhQUFhQyxRQUFRQyxHQUFHLENBQUNDLE1BQU07SUFDckNGLFFBQVFDLEdBQUcsQ0FBQ0MsTUFBTSxHQUFHO0lB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
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdGVzdC1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBSdW5SZXN1bHQsIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4uL3Rlc3RpbmdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkVGVzdENvbmZpZygpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBjb25zdCBwcmV2Vml0ZXN0ID0gcHJvY2Vzcy5lbnYuVklURVNUO1xuICBwcm9jZXNzLmVudi5WSVRFU1QgPSBcInRydWVcIjtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIHJldHVybiBhd2FpdCBsb2FkQ29uZmlnKGFwaVJvb3RQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocHJldlZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2Vml0ZXN0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnOiBTb25hbXVDb25maWcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICByb3V0ZVByZWZpeDogc3RyaW5nO1xuICBiYXNlVXJsOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcG9ydCA9IGNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gIGNvbnN0IGhvc3QgPSBjb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICBjb25zdCByb3V0ZVByZWZpeCA9IGNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LnJvdXRlUHJlZml4ID8/IFwiL19fdGVzdF9fXCI7XG4gIHJldHVybiB7IGhvc3QsIHBvcnQsIHJvdXRlUHJlZml4LCBiYXNlVXJsOiBgaHR0cDovLyR7aG9zdH06JHtwb3J0fSR7cm91dGVQcmVmaXh9YCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdENvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMyk7XG5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFRlc3RDb25maWcoKTtcblxuICAvLyBwcm9jZXNzLmFyZ3Yg7YyM7IuxOiBzb25hbXUgdGVzdCBbZmlsZS4uLl0gLS1wYXR0ZXJuIFwi7J2066aEXCIgLS10cmFjZXMgLS1zdGF0dXNcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwYXR0ZXJuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaG93VHJhY2VzID0gZmFsc2U7XG4gIGxldCBzaG93U3RhdHVzID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoYXJnID09PSBcIi0tcGF0dGVyblwiIHx8IGFyZyA9PT0gXCItcFwiKSB7XG4gICAgICBwYXR0ZXJuID0gYXJnc1srK2ldO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tdHJhY2VzXCIgfHwgYXJnID09PSBcIi10XCIpIHtcbiAgICAgIHNob3dUcmFjZXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoYXJnID09PSBcIi0tc3RhdHVzXCIgfHwgYXJnID09PSBcIi1zXCIpIHtcbiAgICAgIHNob3dTdGF0dXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgZmlsZXMucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG93U3RhdHVzKSB7XG4gICAgcmV0dXJuIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcImRldlJ1bm5lcuqwgCDtmZzshLHtmZTrkJjsp4Ag7JWK7JWY7Iq164uI64ukLiBzb25hbXUuY29uZmlnLnRz7JeQ7IScIHRlc3QuZGV2UnVubmVyLmVuYWJsZWQ6IHRydWUg7ISk7KCV7J20IO2VhOyalO2VqeuLiOuLpFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHsgYmFzZVVybCB9ID0gcmVzb2x2ZVRlc3RCYXNlVXJsKGNvbmZpZyk7XG4gIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3J1bmA7XG5cbiAgY29uc3QgcGF5bG9hZDogeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0gPSB7fTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBwYXlsb2FkLmZpbGVzID0gZmlsZXM7XG4gIH1cbiAgaWYgKHBhdHRlcm4pIHtcbiAgICBwYXlsb2FkLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgXCJkZXZSdW5uZXLqsIAg7Zmc7ISx7ZmU65CY7KeAIOyViuyVmOyKteuLiOuLpC4gc29uYW11LmNvbmZpZy50c+yXkOyEnCB0ZXN0LmRldlJ1bm5lci5lbmFibGVkOiB0cnVlIOyEpOygleydtCDtlYTsmpTtlanri4jri6RcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICBjb25zdCBlcnJvckJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGVycm9yPzogc3RyaW5nIH07XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlZpdGVzdCDsnbjsiqTthLTsiqTqsIAg7JWE7KeBIOykgOu5hOuQmOyngCDslYrslZjsirXri4jri6RcIikpO1xuICAgICAgaWYgKGVycm9yQm9keS5lcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvckJvZHkuZXJyb3IpKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg7JiI7IOB7ZWY7KeAIOuqu+2VnCDsnZHri7U6ICR7cmVzcG9uc2Uuc3RhdHVzfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSdW5SZXN1bHQ7XG5cbiAgICBjb25zdCB7IHBhc3NlZCwgZmFpbGVkOiBmYWlsZWRDb3VudCwgdG90YWwsIGR1cmF0aW9uTXMgfSA9IHJlc3VsdC5zdW1tYXJ5O1xuICAgIGNvbnN0IHBhc3NlZFN0ciA9IGNoYWxrLmdyZWVuKGAke3Bhc3NlZH0gcGFzc2VkYCk7XG4gICAgY29uc3QgZmFpbGVkU3RyID1cbiAgICAgIGZhaWxlZENvdW50ID4gMCA/IGNoYWxrLnJlZChgJHtmYWlsZWRDb3VudH0gZmFpbGVkYCkgOiBgJHtmYWlsZWRDb3VudH0gZmFpbGVkYDtcbiAgICBjb25zb2xlLmxvZyhgXFxuVGVzdHM6ICR7cGFzc2VkU3RyfSwgJHtmYWlsZWRTdHJ9LCAke3RvdGFsfSB0b3RhbGApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRHVyYXRpb246ICR7ZHVyYXRpb25Nc31tc2ApKTtcblxuICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gY29sbGVjdEZhaWxlZEZyb21SZXN1bHRzKHJlc3VsdC5yZXN1bHRzKTtcbiAgICBpZiAoZmFpbGVkVGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkLmJvbGQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKTtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLnJlZChcInhcIil9ICR7Zi5mdWxsTmFtZX0gJHtjaGFsay5kaW0oYCgke2YuZmlsZX0pYCl9YCk7XG4gICAgICAgIGlmIChmLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLnJlZChmLmVycm9yLm1lc3NhZ2UpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dUcmFjZXMpIHtcbiAgICAgIGNvbnN0IHRlc3RzV2l0aFRyYWNlcyA9IGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhyZXN1bHQucmVzdWx0cyk7XG4gICAgICBpZiAodGVzdHNXaXRoVHJhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKFwiXFxuVHJhY2VzOlwiKSk7XG4gICAgICAgIGZvciAoY29uc3QgeyB0ZXN0TmFtZSwgZmlsZSwgdHJhY2VzIH0gb2YgdGVzdHNXaXRoVHJhY2VzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgJHtjaGFsay5ib2xkKHRlc3ROYW1lKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmRpbShwYXRoLmJhc2VuYW1lKGZpbGUpKX1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNlIG9mIHRyYWNlcykge1xuICAgICAgICAgICAgY29uc3QgbG9jID0gYCR7cGF0aC5iYXNlbmFtZSh0cmFjZS5maWxlUGF0aCl9OiR7dHJhY2UubGluZU51bWJlcn1gO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHIgPVxuICAgICAgICAgICAgICB0eXBlb2YgdHJhY2UudmFsdWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IHRyYWNlLnZhbHVlXG4gICAgICAgICAgICAgICAgOiAoSlNPTi5zdHJpbmdpZnkodHJhY2UudmFsdWUsIG51bGwsIDIpID8/IFwidW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxcbiAgICAke2NoYWxrLnllbGxvdyhgWyR7dHJhY2Uua2V5fV1gKX0gJHtjaGFsay5kaW0obG9jKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGVudGVkID0gdmFsdWVTdHIuc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgICBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7aW5kZW50ZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlczogVGVzdENhc2VSZXN1bHRbXSk6IFRlc3RDYXNlUmVzdWx0W10ge1xuICBjb25zdCByZXN1bHQ6IFRlc3RDYXNlUmVzdWx0W10gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgaWYgKG5vZGUua2luZCA9PT0gXCJ0ZXN0XCIgJiYgbm9kZS5zdGF0ZSA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhcbiAgbm9kZXM6IFRlc3RDYXNlUmVzdWx0W10sXG4pOiB7IHRlc3ROYW1lOiBzdHJpbmc7IGZpbGU6IHN0cmluZzsgdHJhY2VzOiBUZXN0Q2FzZVJlc3VsdFtcInRyYWNlc1wiXSB9W10ge1xuICBjb25zdCByZXN1bHQ6IHsgdGVzdE5hbWU6IHN0cmluZzsgZmlsZTogc3RyaW5nOyB0cmFjZXM6IFRlc3RDYXNlUmVzdWx0W1widHJhY2VzXCJdIH1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBpZiAobm9kZS5raW5kID09PSBcInRlc3RcIiAmJiBub2RlLnRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHRlc3ROYW1lOiBub2RlLmZ1bGxOYW1lLCBmaWxlOiBub2RlLmZpbGUsIHRyYWNlczogbm9kZS50cmFjZXMgfSk7XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmNvbGxlY3RUcmFjZXNGcm9tUmVzdWx0cyhub2RlLmNoaWxkcmVuKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RTdGF0dXNDb21tYW5kKGNvbmZpZzogU29uYW11Q29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwiZGV2UnVubmVy6rCAIO2ZnOyEse2ZlOuQmOyngCDslYrslZjsirXri4jri6QuIHNvbmFtdS5jb25maWcudHPsl5DshJwgdGVzdC5kZXZSdW5uZXIuZW5hYmxlZDogdHJ1ZSDshKTsoJXsnbQg7ZWE7JqU7ZWp64uI64ukXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgeyBiYXNlVXJsIH0gPSByZXNvbHZlVGVzdEJhc2VVcmwoY29uZmlnKTtcbiAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vc3RhdHVzYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDsmIjsg4HtlZjsp4Ag66q77ZWcIOydkeuLtTogJHtyZXNwb25zZS5zdGF0dXN9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIHJlYWR5OiBib29sZWFuO1xuICAgICAgcnVubmluZzogYm9vbGVhbjtcbiAgICAgIGxhc3RSdW5BdDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNzZUF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIkRldlJ1bm5lciDsg4Htg5w6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICByZWFkeTogICAgICAgICR7c3RhdHVzLnJlYWR5ID8gY2hhbGsuZ3JlZW4oXCJ0cnVlXCIpIDogY2hhbGsucmVkKFwiZmFsc2VcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgcnVubmluZzogICAgICAke3N0YXR1cy5ydW5uaW5nID8gY2hhbGsueWVsbG93KFwidHJ1ZVwiKSA6IFwiZmFsc2VcIn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBsYXN0UnVuQXQ6ICAgICR7c3RhdHVzLmxhc3RSdW5BdCA/PyBjaGFsay5kaW0oXCLsl4bsnYxcIil9YCk7XG4gICAgY29uc29sZS5sb2coYCAgc3NlQXZhaWxhYmxlOiAke3N0YXR1cy5zc2VBdmFpbGFibGUgPyBjaGFsay5ncmVlbihcInRydWVcIikgOiBcImZhbHNlXCJ9YCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgZXJyLmNhdXNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXCJkZXYg7ISc67KE7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV26rCAIOyLpO2WiSDspJHsnbjsp4Ag7ZmV7J247ZWY7IS47JqUXCIpLFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImNoYWxrIiwibG9hZENvbmZpZyIsImZpbmRBcGlSb290UGF0aCIsImxvYWRUZXN0Q29uZmlnIiwicHJldlZpdGVzdCIsInByb2Nlc3MiLCJlbnYiLCJWSVRFU1QiLCJhcGlSb290UGF0aCIsInVuZGVmaW5lZCIsInJlc29sdmVUZXN0QmFzZVVybCIsImNvbmZpZyIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJob3N0Iiwicm91dGVQcmVmaXgiLCJ0ZXN0IiwiZGV2UnVubmVyIiwiYmFzZVVybCIsInRlc3RDb21tYW5kIiwiYXJncyIsImFyZ3YiLCJzbGljZSIsImZpbGVzIiwicGF0dGVybiIsInNob3dUcmFjZXMiLCJzaG93U3RhdHVzIiwiaSIsImxlbmd0aCIsImFyZyIsInN0YXJ0c1dpdGgiLCJwdXNoIiwidGVzdFN0YXR1c0NvbW1hbmQiLCJlbmFibGVkIiwiY29uc29sZSIsImVycm9yIiwicmVkIiwiZXhpdCIsInVybCIsInBheWxvYWQiLCJyZXNwb25zZSIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhdHVzIiwiZXJyb3JCb2R5IiwianNvbiIsIm9rIiwicmVzdWx0IiwicGFzc2VkIiwiZmFpbGVkIiwiZmFpbGVkQ291bnQiLCJ0b3RhbCIsImR1cmF0aW9uTXMiLCJzdW1tYXJ5IiwicGFzc2VkU3RyIiwiZ3JlZW4iLCJmYWlsZWRTdHIiLCJsb2ciLCJkaW0iLCJmYWlsZWRUZXN0cyIsImNvbGxlY3RGYWlsZWRGcm9tUmVzdWx0cyIsInJlc3VsdHMiLCJib2xkIiwiZiIsImZ1bGxOYW1lIiwiZmlsZSIsIm1lc3NhZ2UiLCJ0ZXN0c1dpdGhUcmFjZXMiLCJjb2xsZWN0VHJhY2VzRnJvbVJlc3VsdHMiLCJjeWFuIiwidGVzdE5hbWUiLCJ0cmFjZXMiLCJiYXNlbmFtZSIsInRyYWNlIiwibG9jIiwiZmlsZVBhdGgiLCJsaW5lTnVtYmVyIiwidmFsdWVTdHIiLCJ2YWx1ZSIsInllbGxvdyIsImtleSIsImluZGVudGVkIiwic3BsaXQiLCJqb2luIiwiZXJyIiwiVHlwZUVycm9yIiwiY2F1c2UiLCJub2RlcyIsIm5vZGUiLCJraW5kIiwic3RhdGUiLCJjaGlsZHJlbiIsInJlYWR5IiwicnVubmluZyIsImxhc3RSdW5BdCIsInNzZUF2YWlsYWJsZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsVUFBVSxZQUFZO0FBQzdCLE9BQU9DLFdBQVcsUUFBUTtBQUUxQixTQUFTQyxVQUFVLFFBQVEsbUJBQWdCO0FBRTNDLFNBQVNDLGVBQWUsUUFBUSxvQkFBaUI7QUFFakQsZUFBZUM7SUFDYixNQUFNQyxhQUFhQyxRQUFRQyxHQUFHLENBQUNDLE1BQU07SUFDckNGLFFBQVFDLEdBQUcsQ0FBQ0MsTUFBTSxHQUFHO0lBQ3JCLElBQUk7UUFDRixNQUFNQyxjQUFjTjtRQUNwQixPQUFPLE1BQU1ELFdBQVdPO0lBQzFCLFNBQVU7UUFDUixJQUFJSixlQUFlSyxXQUFXO1lBQzVCLE9BQU9KLFFBQVFDLEdBQUcsQ0FBQ0MsTUFBTTtRQUMzQixPQUFPO1lBQ0xGLFFBQVFDLEdBQUcsQ0FBQ0MsTUFBTSxHQUFHSDtRQUN2QjtJQUNGO0FBQ0Y7QUFFQSxTQUFTTSxtQkFBbUJDLE1BQW9CO0lBTTlDLE1BQU1DLE9BQU9ELE9BQU9FLE1BQU0sQ0FBQ0MsTUFBTSxFQUFFRixRQUFRO0lBQzNDLE1BQU1HLE9BQU9KLE9BQU9FLE1BQU0sQ0FBQ0MsTUFBTSxFQUFFQyxRQUFRO0lBQzNDLE1BQU1DLGNBQWNMLE9BQU9NLElBQUksRUFBRUMsV0FBV0YsZUFBZTtJQUMzRCxPQUFPO1FBQUVEO1FBQU1IO1FBQU1JO1FBQWFHLFNBQVMsQ0FBQyxPQUFPLEVBQUVKLEtBQUssQ0FBQyxFQUFFSCxPQUFPSSxhQUFhO0lBQUM7QUFDcEY7QUFFQSxPQUFPLGVBQWVJO0lBQ3BCLE1BQU1DLE9BQU9oQixRQUFRaUIsSUFBSSxDQUFDQyxLQUFLLENBQUM7SUFFaEMsTUFBTVosU0FBUyxNQUFNUjtJQUVyQiwwRUFBMEU7SUFDMUUsTUFBTXFCLFFBQWtCLEVBQUU7SUFDMUIsSUFBSUM7SUFDSixJQUFJQyxhQUFhO0lBQ2pCLElBQUlDLGFBQWE7SUFFakIsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlQLEtBQUtRLE1BQU0sRUFBRUQsSUFBSztRQUNwQyxNQUFNRSxNQUFNVCxJQUFJLENBQUNPLEVBQUU7UUFDbkIsSUFBSUUsUUFBUSxlQUFlQSxRQUFRLE1BQU07WUFDdkNMLFVBQVVKLElBQUksQ0FBQyxFQUFFTyxFQUFFO1FBQ3JCLE9BQU8sSUFBSUUsUUFBUSxjQUFjQSxRQUFRLE1BQU07WUFDN0NKLGFBQWE7UUFDZixPQUFPLElBQUlJLFFBQVEsY0FBY0EsUUFBUSxNQUFNO1lBQzdDSCxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUNHLElBQUlDLFVBQVUsQ0FBQyxNQUFNO1lBQy9CUCxNQUFNUSxJQUFJLENBQUNGO1FBQ2I7SUFDRjtJQUVBLElBQUlILFlBQVk7UUFDZCxPQUFPTSxrQkFBa0J0QjtJQUMzQjtJQUVBLElBQUksQ0FBQ0EsT0FBT00sSUFBSSxFQUFFQyxXQUFXZ0IsU0FBUztRQUNwQ0MsUUFBUUMsS0FBSyxDQUNYcEMsTUFBTXFDLEdBQUcsQ0FDUDtRQUdKaEMsUUFBUWlDLElBQUksQ0FBQztJQUNmO0lBRUEsTUFBTSxFQUFFbkIsT0FBTyxFQUFFLEdBQUdULG1CQUFtQkM7SUFDdkMsTUFBTTRCLE1BQU0sR0FBR3BCLFFBQVEsSUFBSSxDQUFDO0lBRTVCLE1BQU1xQixVQUFrRCxDQUFDO0lBQ3pELElBQUloQixNQUFNSyxNQUFNLEdBQUcsR0FBRztRQUNwQlcsUUFBUWhCLEtBQUssR0FBR0E7SUFDbEI7SUFDQSxJQUFJQyxTQUFTO1FBQ1hlLFFBQVFmLE9BQU8sR0FBR0E7SUFDcEI7SUFFQSxJQUFJO1FBQ0YsTUFBTWdCLFdBQVcsTUFBTUMsTUFBTUgsS0FBSztZQUNoQ0ksUUFBUTtZQUNSQyxTQUFTO2dCQUFFLGdCQUFnQjtZQUFtQjtZQUM5Q0MsTUFBTUMsS0FBS0MsU0FBUyxDQUFDUDtRQUN2QjtRQUVBLElBQUlDLFNBQVNPLE1BQU0sS0FBSyxLQUFLO1lBQzNCYixRQUFRQyxLQUFLLENBQ1hwQyxNQUFNcUMsR0FBRyxDQUNQO1lBR0poQyxRQUFRaUMsSUFBSSxDQUFDO1FBQ2Y7UUFFQSxJQUFJRyxTQUFTTyxNQUFNLEtBQUssS0FBSztZQUMzQixNQUFNQyxZQUFhLE1BQU1SLFNBQVNTLElBQUk7WUFDdENmLFFBQVFDLEtBQUssQ0FBQ3BDLE1BQU1xQyxHQUFHLENBQUM7WUFDeEIsSUFBSVksVUFBVWIsS0FBSyxFQUFFO2dCQUNuQkQsUUFBUUMsS0FBSyxDQUFDcEMsTUFBTXFDLEdBQUcsQ0FBQ1ksVUFBVWIsS0FBSztZQUN6QztZQUNBL0IsUUFBUWlDLElBQUksQ0FBQztRQUNmO1FBRUEsSUFBSSxDQUFDRyxTQUFTVSxFQUFFLEVBQUU7WUFDaEJoQixRQUFRQyxLQUFLLENBQUNwQyxNQUFNcUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFSSxTQUFTTyxNQUFNLEVBQUU7WUFDeEQzQyxRQUFRaUMsSUFBSSxDQUFDO1FBQ2Y7UUFFQSxNQUFNYyxTQUFVLE1BQU1YLFNBQVNTLElBQUk7UUFFbkMsTUFBTSxFQUFFRyxNQUFNLEVBQUVDLFFBQVFDLFdBQVcsRUFBRUMsS0FBSyxFQUFFQyxVQUFVLEVBQUUsR0FBR0wsT0FBT00sT0FBTztRQUN6RSxNQUFNQyxZQUFZM0QsTUFBTTRELEtBQUssQ0FBQyxHQUFHUCxPQUFPLE9BQU8sQ0FBQztRQUNoRCxNQUFNUSxZQUNKTixjQUFjLElBQUl2RCxNQUFNcUMsR0FBRyxDQUFDLEdBQUdrQixZQUFZLE9BQU8sQ0FBQyxJQUFJLEdBQUdBLFlBQVksT0FBTyxDQUFDO1FBQ2hGcEIsUUFBUTJCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRUgsVUFBVSxFQUFFLEVBQUVFLFVBQVUsRUFBRSxFQUFFTCxNQUFNLE1BQU0sQ0FBQztRQUNqRXJCLFFBQVEyQixHQUFHLENBQUM5RCxNQUFNK0QsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFTixXQUFXLEVBQUUsQ0FBQztRQUVqRCxNQUFNTyxjQUFjQyx5QkFBeUJiLE9BQU9jLE9BQU87UUFDM0QsSUFBSUYsWUFBWW5DLE1BQU0sR0FBRyxHQUFHO1lBQzFCTSxRQUFRMkIsR0FBRyxDQUFDOUQsTUFBTXFDLEdBQUcsQ0FBQzhCLElBQUksQ0FBQztZQUMzQixLQUFLLE1BQU1DLEtBQUtKLFlBQWE7Z0JBQzNCN0IsUUFBUTJCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTlELE1BQU1xQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUrQixFQUFFQyxRQUFRLENBQUMsQ0FBQyxFQUFFckUsTUFBTStELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRUssRUFBRUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUMzRSxJQUFJRixFQUFFaEMsS0FBSyxFQUFFO29CQUNYRCxRQUFRMkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFOUQsTUFBTXFDLEdBQUcsQ0FBQytCLEVBQUVoQyxLQUFLLENBQUNtQyxPQUFPLEdBQUc7Z0JBQ2pEO1lBQ0Y7UUFDRjtRQUVBLElBQUk3QyxZQUFZO1lBQ2QsTUFBTThDLGtCQUFrQkMseUJBQXlCckIsT0FBT2MsT0FBTztZQUMvRCxJQUFJTSxnQkFBZ0IzQyxNQUFNLEdBQUcsR0FBRztnQkFDOUJNLFFBQVEyQixHQUFHLENBQUM5RCxNQUFNMEUsSUFBSSxDQUFDUCxJQUFJLENBQUM7Z0JBQzVCLEtBQUssTUFBTSxFQUFFUSxRQUFRLEVBQUVMLElBQUksRUFBRU0sTUFBTSxFQUFFLElBQUlKLGdCQUFpQjtvQkFDeERyQyxRQUFRMkIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFOUQsTUFBTW1FLElBQUksQ0FBQ1EsV0FBVztvQkFDekN4QyxRQUFRMkIsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFOUQsTUFBTStELEdBQUcsQ0FBQ2hFLEtBQUs4RSxRQUFRLENBQUNQLFFBQVE7b0JBQ2pELEtBQUssTUFBTVEsU0FBU0YsT0FBUTt3QkFDMUIsTUFBTUcsTUFBTSxHQUFHaEYsS0FBSzhFLFFBQVEsQ0FBQ0MsTUFBTUUsUUFBUSxFQUFFLENBQUMsRUFBRUYsTUFBTUcsVUFBVSxFQUFFO3dCQUNsRSxNQUFNQyxXQUNKLE9BQU9KLE1BQU1LLEtBQUssS0FBSyxXQUNuQkwsTUFBTUssS0FBSyxHQUNWckMsS0FBS0MsU0FBUyxDQUFDK0IsTUFBTUssS0FBSyxFQUFFLE1BQU0sTUFBTTt3QkFDL0NoRCxRQUFRMkIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFOUQsTUFBTW9GLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRU4sTUFBTU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRXJGLE1BQU0rRCxHQUFHLENBQUNnQixNQUFNO3dCQUN2RSxNQUFNTyxXQUFXSixTQUFTSyxLQUFLLENBQUMsTUFBTUMsSUFBSSxDQUFDO3dCQUMzQ3JELFFBQVEyQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUV3QixVQUFVO29CQUMvQjtnQkFDRjtZQUNGO1FBQ0Y7UUFFQSxJQUFJLENBQUNsQyxPQUFPRCxFQUFFLEVBQUU7WUFDZDlDLFFBQVFpQyxJQUFJLENBQUM7UUFDZjtJQUNGLEVBQUUsT0FBT21ELEtBQUs7UUFDWixJQUFJQSxlQUFlQyxhQUFhRCxJQUFJRSxLQUFLLEVBQUU7WUFDekN4RCxRQUFRQyxLQUFLLENBQ1hwQyxNQUFNcUMsR0FBRyxDQUFDO1lBRVpoQyxRQUFRaUMsSUFBSSxDQUFDO1FBQ2Y7UUFDQSxNQUFNbUQ7SUFDUjtBQUNGO0FBRUEsU0FBU3hCLHlCQUF5QjJCLEtBQXVCO0lBQ3ZELE1BQU14QyxTQUEyQixFQUFFO0lBQ25DLEtBQUssTUFBTXlDLFFBQVFELE1BQU87UUFDeEIsSUFBSUMsS0FBS0MsSUFBSSxLQUFLLFVBQVVELEtBQUtFLEtBQUssS0FBSyxVQUFVO1lBQ25EM0MsT0FBT3BCLElBQUksQ0FBQzZEO1FBQ2Q7UUFDQSxJQUFJQSxLQUFLRyxRQUFRLENBQUNuRSxNQUFNLEdBQUcsR0FBRztZQUM1QnVCLE9BQU9wQixJQUFJLElBQUlpQyx5QkFBeUI0QixLQUFLRyxRQUFRO1FBQ3ZEO0lBQ0Y7SUFDQSxPQUFPNUM7QUFDVDtBQUVBLFNBQVNxQix5QkFDUG1CLEtBQXVCO0lBRXZCLE1BQU14QyxTQUFpRixFQUFFO0lBQ3pGLEtBQUssTUFBTXlDLFFBQVFELE1BQU87UUFDeEIsSUFBSUMsS0FBS0MsSUFBSSxLQUFLLFVBQVVELEtBQUtqQixNQUFNLENBQUMvQyxNQUFNLEdBQUcsR0FBRztZQUNsRHVCLE9BQU9wQixJQUFJLENBQUM7Z0JBQUUyQyxVQUFVa0IsS0FBS3hCLFFBQVE7Z0JBQUVDLE1BQU11QixLQUFLdkIsSUFBSTtnQkFBRU0sUUFBUWlCLEtBQUtqQixNQUFNO1lBQUM7UUFDOUU7UUFDQSxJQUFJaUIsS0FBS0csUUFBUSxDQUFDbkUsTUFBTSxHQUFHLEdBQUc7WUFDNUJ1QixPQUFPcEIsSUFBSSxJQUFJeUMseUJBQXlCb0IsS0FBS0csUUFBUTtRQUN2RDtJQUNGO0lBQ0EsT0FBTzVDO0FBQ1Q7QUFFQSxlQUFlbkIsa0JBQWtCdEIsTUFBb0I7SUFDbkQsSUFBSSxDQUFDQSxPQUFPTSxJQUFJLEVBQUVDLFdBQVdnQixTQUFTO1FBQ3BDQyxRQUFRQyxLQUFLLENBQ1hwQyxNQUFNcUMsR0FBRyxDQUNQO1FBR0poQyxRQUFRaUMsSUFBSSxDQUFDO0lBQ2Y7SUFFQSxNQUFNLEVBQUVuQixPQUFPLEVBQUUsR0FBR1QsbUJBQW1CQztJQUN2QyxNQUFNNEIsTUFBTSxHQUFHcEIsUUFBUSxPQUFPLENBQUM7SUFFL0IsSUFBSTtRQUNGLE1BQU1zQixXQUFXLE1BQU1DLE1BQU1IO1FBRTdCLElBQUksQ0FBQ0UsU0FBU1UsRUFBRSxFQUFFO1lBQ2hCaEIsUUFBUUMsS0FBSyxDQUFDcEMsTUFBTXFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRUksU0FBU08sTUFBTSxFQUFFO1lBQ3hEM0MsUUFBUWlDLElBQUksQ0FBQztRQUNmO1FBRUEsTUFBTVUsU0FBVSxNQUFNUCxTQUFTUyxJQUFJO1FBT25DZixRQUFRMkIsR0FBRyxDQUFDOUQsTUFBTW1FLElBQUksQ0FBQztRQUN2QmhDLFFBQVEyQixHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRWQsT0FBT2lELEtBQUssR0FBR2pHLE1BQU00RCxLQUFLLENBQUMsVUFBVTVELE1BQU1xQyxHQUFHLENBQUMsVUFBVTtRQUN4RkYsUUFBUTJCLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixFQUFFZCxPQUFPa0QsT0FBTyxHQUFHbEcsTUFBTW9GLE1BQU0sQ0FBQyxVQUFVLFNBQVM7UUFDaEZqRCxRQUFRMkIsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVkLE9BQU9tRCxTQUFTLElBQUluRyxNQUFNK0QsR0FBRyxDQUFDLE9BQU87UUFDcEU1QixRQUFRMkIsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVkLE9BQU9vRCxZQUFZLEdBQUdwRyxNQUFNNEQsS0FBSyxDQUFDLFVBQVUsU0FBUztJQUN0RixFQUFFLE9BQU82QixLQUFLO1FBQ1osSUFBSUEsZUFBZUMsYUFBYUQsSUFBSUUsS0FBSyxFQUFFO1lBQ3pDeEQsUUFBUUMsS0FBSyxDQUNYcEMsTUFBTXFDLEdBQUcsQ0FBQztZQUVaaEMsUUFBUWlDLElBQUksQ0FBQztRQUNmO1FBQ0EsTUFBTW1EO0lBQ1I7QUFDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAiG3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAmE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CAkEhD"}
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAiG3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAmE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CAsEhD"}
@@ -297,51 +297,57 @@ export class Migrator {
297
297
  }
298
298
  // 기존 Shadow DB 삭제 후 Shadow DB 생성
299
299
  const tdb = createKnexInstance(Sonamu.dbConfig.test);
300
- !isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
301
- await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
302
- await tdb.raw(`
303
- SELECT pg_terminate_backend(pg_stat_activity.pid)
304
- FROM pg_stat_activity
305
- WHERE datname = '${tdbConn.database}'
306
- AND pid <> pg_backend_pid();
307
- `);
308
- await tdb.raw(`CREATE DATABASE ${shadowDatabase} TEMPLATE ${tdbConn.database}`);
309
- // Shadow DB에 연결
310
- const sdb = createKnexInstance({
311
- ...Sonamu.dbConfig.test,
312
- connection: {
313
- ...tdbConn,
314
- database: shadowDatabase,
315
- password: tdbConn.password
316
- }
317
- });
318
- // shadow DB 테스트 진행
319
300
  try {
320
- const [batchNo, applied] = await sdb.migrate.latest();
321
- !isTest() && console.log(chalk.green("Shadow DB 테스트에 성공했습니다!"), {
322
- batchNo,
323
- applied
301
+ !isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
302
+ await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
303
+ await tdb.raw(`
304
+ SELECT pg_terminate_backend(pg_stat_activity.pid)
305
+ FROM pg_stat_activity
306
+ WHERE datname = '${tdbConn.database}'
307
+ AND pid <> pg_backend_pid();
308
+ `);
309
+ await tdb.raw(`CREATE DATABASE ${shadowDatabase} TEMPLATE ${tdbConn.database}`);
310
+ // Shadow DB에 연결
311
+ const sdb = createKnexInstance({
312
+ ...Sonamu.dbConfig.test,
313
+ connection: {
314
+ ...tdbConn,
315
+ database: shadowDatabase,
316
+ password: tdbConn.password
317
+ }
324
318
  });
325
- return [
326
- {
327
- connKey: "shadow",
319
+ // shadow DB 테스트 진행
320
+ try {
321
+ const [batchNo, applied] = await sdb.migrate.latest();
322
+ !isTest() && console.log(chalk.green("Shadow DB 테스트에 성공했습니다!"), {
328
323
  batchNo,
329
324
  applied
330
- }
331
- ];
332
- } catch (e) {
333
- console.error(e);
334
- throw new ServiceUnavailableException(SD("sonamu.error.shadowDbTestFailed"));
325
+ });
326
+ return [
327
+ {
328
+ connKey: "shadow",
329
+ batchNo,
330
+ applied
331
+ }
332
+ ];
333
+ } catch (e) {
334
+ console.error(e);
335
+ throw new ServiceUnavailableException(SD("sonamu.error.shadowDbTestFailed"));
336
+ } finally{
337
+ await sdb.destroy();
338
+ }
335
339
  } finally{
336
- // Shadow DB 연결 종료
337
- await sdb.destroy();
338
340
  // Shadow DB 삭제
339
341
  !isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
340
- await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
341
- // Test DB 연결 종료
342
- await tdb.destroy();
342
+ try {
343
+ await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
344
+ } catch (e) {
345
+ console.error("Shadow DB 정리 실패:", e); // 이게 없으면 조용히 누수
346
+ } finally{
347
+ await tdb.destroy();
348
+ }
343
349
  }
344
350
  }
345
351
  }
346
352
 
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHN1bSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgdHlwZSB7IEdlbk1pZ3JhdGlvbkNvZGUsIE1pZ3JhdGlvblNldCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29ublN0cmluZywgTWlncmF0aW9uQ29kZSwgTWlncmF0aW9uU3RhdHVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uUmVzdWx0ID0ge1xuICBjb25uS2V5OiBzdHJpbmc7XG4gIGJhdGNoTm86IG51bWJlcjtcbiAgYXBwbGllZDogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRvciB7XG4gIHByaXZhdGUgYXN5bmMgZ2V0TWlncmF0aW9uQ29kZXMoKTogUHJvbWlzZTxNaWdyYXRpb25Db2RlW10+IHtcbiAgICBjb25zdCBzcmNNaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJtaWdyYXRpb25zXCIpOyAvLyDsnbTqsbQg7ZmY6rK97JeQIOq0gOqzhOyXhuydtCDtla3sg4Egc3Jj7JeQ7IScIOywvuyVhOyVvCDtlbTsmpQuXG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjTWlncmF0aW9uc0RpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihzcmNNaWdyYXRpb25zRGlyLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvZGVzID0gKGF3YWl0IHJlYWRkaXIoc3JjTWlncmF0aW9uc0RpcikpXG4gICAgICAuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZikgPT4gKHtcbiAgICAgICAgbmFtZTogZi5yZXBsYWNlKFwiLnRzXCIsIFwiXCIpLFxuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oc3JjTWlncmF0aW9uc0RpciwgZiksXG4gICAgICB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7YOA6rKf67OEIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zsmYAg7L2U65OcIOyDneyEsS/spIDruYQg7IOB7YOc66W8IOq1rO2VtOyYteuLiOuLpC5cbiAgICog7Iuk7KCc66GcIERC7JeQIOygkeq3vOuPhCDtlZjqs6Ag66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzrj4Qg7ZmV7J247ZWY6rOgLFxuICAgKiDtlYTsmpTtlZjri6TrqbQg7KCB7Jqp7ZWgIOyImCDsnojripQg7L2U65Oc66W8IOyDneyEseq5jOyngCDtlbTsmLXri4jri6QuXG4gICAqXG4gICAqIENMSeyZgCBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8TWlncmF0aW9uU3RhdHVzPiB7XG4gICAgY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb2Rlc1wiLCBjb2Rlcyk7XG5cbiAgICBjb25zdCBjb25uS2V5cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKFxuICAgICAgKGtleSkgPT4ga2V5LmVuZHNXaXRoKFwiX3NsYXZlXCIpID09PSBmYWxzZSxcbiAgICApIGFzIChrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnKVtdO1xuXG4gICAgbGV0IG1pZ3JhdGlvblN0YXR1c0Vycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29ubktleXMubWFwKGFzeW5jIChjb25uS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgICAgICBjb25zdCB0Q29ubiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShrbmV4T3B0aW9ucyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGAke2Nvbm5LZXl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuIOuNsOydtO2EsOuyoOydtOyKpOqwgCDsmKzrsJTrpbTqsowg6rWs7ISx65CY7KeAIOyViuydgCDqsoMg6rCZ7Iq164uI64ukLiDtmZXsnbjtlZjsi5zqs6Ag64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalC5cXG7si5zrj4TtlZwg7Jew6rKwIOyEpOyglTpcXG4ke0pTT04uc3RyaW5naWZ5KGtuZXhPcHRpb25zLmNvbm5lY3Rpb24sIG51bGwsIDIpfVxcbuuwnOyDne2VnCDsl5Drn6w6XFxuJHtlcnJ9XFxuYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmc6IHN0cmluZ1tdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFssIGZkTGlzdF0gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZkTGlzdC5tYXAoKGZkOiB7IGZpbGU6IHN0cmluZyB9KSA9PiBmZC5maWxlLnJlcGxhY2UoXCIudHNcIiwgXCJcIikpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIG1pZ3JhdGlvblN0YXR1c0Vycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdENvbm4ubWlncmF0ZS5jdXJyZW50VmVyc2lvbigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IF9lcnIgaW5zdGFuY2VvZiBFcnJvciA/IF9lcnIubWVzc2FnZSA6IFN0cmluZyhfZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6c3RhdHVzXCIsIHN0YXR1cyk7XG5cbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ga25leE9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBjb25uS2V5LnJlcGxhY2UoXCJfbWFzdGVyXCIsIFwiXCIpLFxuICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgIGNvbm5TdHJpbmc6IGBwZzovLyR7Y29ubmVjdGlvbi51c2VyID8/IFwiXCJ9QCR7Y29ubmVjdGlvbi5ob3N0fToke1xuICAgICAgICAgICAgICBjb25uZWN0aW9uLnBvcnRcbiAgICAgICAgICAgIH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZyxcbiAgICAgICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgYXMgbnVtYmVyIHwgXCJlcnJvclwiLFxuICAgICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IHRDb25uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgc3RhdHVzZXMpO1xuXG4gICAgY29uc3QgcHJlcGFyZWRDb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1czBjb25uID0gc3RhdHVzZXMuZmluZCgoc3RhdHVzKSA9PiBzdGF0dXMuc3RhdHVzID09PSAwKTtcbiAgICAgIGlmIChzdGF0dXMwY29ubiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICBgV2hpbGUgdHJ5aW5nIHRvIHByZXBhcmUgbWlncmF0aW9uIGNvZGVzLCB3ZSBmb3VuZCB0aGF0IHRoZXJlIGlzIG5vIGRhdGFiYXNlIHRvIGNvbXBhcmUgbWlncmF0aW9ucy4gV2UgbmVlZCBhdCBsZWFzdCBvbmUgZGF0YWJhc2Ugd2hlcmUgZXZlcnkgbWlncmF0aW9uIGlzIGFwcGxpZWQoc3RhdHVzID09PSAwKS4gWW91IG1pZ2h0IHdhbnQgdG8gYXBwbHkgeW91ciBleGlzdGluZyBtaWdyYXRpb25zIHRvIG9uZSBvZiB0aGUgZGF0YWJhc2VzLmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wYXJlREJjb25uID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzdGF0dXMwY29ubi5jb25uS2V5XSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREJjb25uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGNvbXBhcmVEQmNvbm4uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29ubnM6IHN0YXR1c2VzLFxuICAgICAgY29kZXMsXG4gICAgICBwcmVwYXJlZENvZGVzLFxuICAgICAgZXJyb3I6IG1pZ3JhdGlvblN0YXR1c0Vycm9yLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWY7J2EIOyggeyaqe2VmOqxsOuCmCDroaTrsLHtlanri4jri6QuXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDrp4jsnbTqt7jroIjsnbTshZgg7J6R7JeF7J2EIOyImO2Wie2VoCDrlYwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBDTEnsmYAgU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiDsnpHsl4Ug7Jyg7ZiVIChhcHBseS9yb2xsYmFjaylcbiAgICogQHBhcmFtIHRhcmdldHMg7J6R7JeFIOuMgOyDgSBEQiDshKTsoJUg7YKkIChrZXlvZiBTb25hbXVEQkNvbmZpZylcbiAgICogQHJldHVybnMg7J6R7JeFIOqysOqzvFxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOmFjdGlvblwiLCBhY3Rpb24pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246dGFyZ2V0c1wiLCB0YXJnZXRzKTtcblxuICAgIC8vIGdldCB1bmlxIGtuZXggY29uZmlnc1xuICAgIGNvbnN0IGNvbmZpZ3MgPSB1bmlxdWUoXG4gICAgICB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAgICAgICBjb25uS2V5OiB0YXJnZXQsXG4gICAgICAgICAgb3B0aW9uczogU29uYW11LmRiQ29uZmlnW3RhcmdldCBhcyBrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnXSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICh7IG9wdGlvbnMgfSkgPT5cbiAgICAgICAgYCR7KG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuaG9zdH06JHtcbiAgICAgICAgICAob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5wb3J0ID8/IDU0MzJcbiAgICAgICAgfS8keyhvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGFjdGlvblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYXBwbHlcIjpcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgY29ubnMubWFwKGFzeW5jICh7IGNvbm5LZXksIGtuZXggfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICAgICAgICBhcHBsaWVkLCAvLyDsnbTrsoggbGF0ZXN0IO2YuOy2nOuhnCDsnbjtlbQgXCJ1cFwi7J20IOyggeyaqeuQnCDrp4jsnbTqt7jroIjsnbTshZgg7J2066aEKGUuZy4gXCIyMDI1MTEyNDIzMzU1N19jcmVhdGVfX2NvbXBhbmllcy50c1wiKeuTpOydmCDrsLDsl7TsnoXri4jri6QuIOywuOqzoDogaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9ibG9iLzAxYjE3N2M0ODVkNjk2ZjFiNzI4NThkZWU3MjhiYTE0M2M0ZmFkNzYvbGliL21pZ3JhdGlvbnMvbWlncmF0ZS9NaWdyYXRvci5qcyNMNTYwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgXCJyb2xsYmFja1wiOlxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBjb25ucy5tYXAoYXN5bmMgKHsgY29ubktleSwga25leCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGNvbm5LZXksXG4gICAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgICAgYXBwbGllZCwgLy8g7J2067KIIHJvbGxiYWNrIO2YuOy2nOuhnCDsnbjtlbQgXCJkb3duXCLsnbQg7KCB7Jqp65CcKD3roaTrsLHrkJwpIOuniOydtOq3uOugiOydtOyFmCDsnbTrpoQoZS5nLiBcIjIwMjUxMTI0MjMzNTU3X2NyZWF0ZV9fY29tcGFuaWVzLnRzXCIp65Ok7J2YIOuwsOyXtOyeheuLiOuLpC4g7LC46rOgOiBodHRwczovL2dpdGh1Yi5jb20va25leC9rbmV4L2Jsb2IvMDFiMTc3YzQ4NWQ2OTZmMWI3Mjg1OGRlZTcyOGJhMTQzYzRmYWQ3Ni9saWIvbWlncmF0aW9ucy9taWdyYXRlL01pZ3JhdG9yLmpzI0w2MTFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246cmVzdWx0XCIsIHJlc3VsdCk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtuZXguZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyCreygnCDqsIDriqXtlZwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gY29ubnMg66eI7J206re466CI7J207IWYIOyDge2DnCDrsLDsl7RcbiAgICogQHBhcmFtIGNvZGVOYW1lcyDsgq3soJztlaAg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg7J2066aEIOuwsOyXtFxuICAgKiBAcmV0dXJucyDsgq3soJwg6rCA64qlIOyXrOu2gCDrsI8g7KCB7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhFxuICAgKi9cbiAgdmFsaWRhdGVEZWxldGFibGUoY29ubnM6IE1pZ3JhdGlvblN0YXR1c1tcImNvbm5zXCJdLCBjb2RlTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYXBwbGllZENvZGVzID0gY29kZU5hbWVzLmZpbHRlcigoY29kZU5hbWUpID0+XG4gICAgICBjb25ucy5zb21lKChjb25uKSA9PiBjb25uLnBlbmRpbmcuaW5jbHVkZXMoY29kZU5hbWUpID09PSBmYWxzZSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjYW5EZWxldGU6IGFwcGxpZWRDb2Rlcy5sZW5ndGggPT09IDAsXG4gICAgICBhcHBsaWVkQ29kZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsgq3soJztlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlTmFtZXMg7IKt7KCc7ZWgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhCDrsLDsl7RcbiAgICogQHJldHVybnMg7IKt7KCc65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZGVsQ29kZXMoY29kZU5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBjb25zdCB7IGNhbkRlbGV0ZSwgYXBwbGllZENvZGVzIH0gPSB0aGlzLnZhbGlkYXRlRGVsZXRhYmxlKGNvbm5zLCBjb2RlTmFtZXMpO1xuICAgIGlmICghY2FuRGVsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2Fubm90IGRlbGV0ZSBhIG1pZ3JhdGlvbiBmaWxlIGlmIHRoZXJlIGlzIGFscmVhZHkgYXBwbGllZC4gQXBwbGllZCBjb2RlczogJHthcHBsaWVkQ29kZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzdW0oXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29kZU5hbWVzLm1hcChhc3luYyAoY29kZU5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnMvJHtjb2RlTmFtZX0udHNgO1xuICAgICAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBhd2FpdCB1bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGF0ZVRhZyhpbmRleDogbnVtYmVyLCBiYXNlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRUaW1lKCkgKyBpbmRleCAqIDEwMDApO1xuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyID0gMikgPT4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRIb3VycygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBwcmVwYXJlZENvZGVzIH0gPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZVByZXBhcmVkQ29kZXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcbiAgICBpZiAocHJlcGFyZWRDb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiXFxu7ZiE7J6sIOuqqOuRkCDsi7HtgazrkJwg7IOB7YOc7J6F64uI64ukLlwiKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyDsi6TsoJwg7L2U65OcIOyDneyEsVxuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zYDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBwY29kZV0gb2YgcHJlcGFyZWRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChwY29kZS5mb3JtYXR0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0ZVRhZyA9IHRoaXMuZ2VuRGF0ZVRhZyhpbmRleCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7bWlncmF0aW9uc0Rpcn0vJHtkYXRlVGFnfV8ke3Bjb2RlLnRpdGxlfS50c2A7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgcGNvZGUuZm9ybWF0dGVkKTtcbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBNSUdSQVRJT04gQ1JFQVRFRCAke2ZpbGVQYXRofWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJlcGFyZWRDb2Rlcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyBjb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREI6IEtuZXgpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIC8vIEVudGl0eSDsiJztmoztlZjsl6wg7Iux7YGsXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgRW50aXR57JeQ7IScIE1pZ3JhdGlvblNldCDstpTstpxcbiAgICBjb25zdCBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSA9IGVudGl0eUlkc1xuICAgICAgLmZpbHRlcigoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoZW50aXR5SWQpID0+IGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkoRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpKSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJTrp4wg7LaU7LacXG4gICAgY29uc3Qgam9pblRhYmxlc1dpdGhEdXAgPSBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZS5mbGF0TWFwKChlbnRpdHlTZXQpID0+IGVudGl0eVNldC5qb2luVGFibGVzKTtcbiAgICAvLyDspJHrs7Ug7KCc6rGwICjspJHrs7Xsnbgg6rK97JqwIGluZGV4ZXPrpbwg67OR7ZWpKVxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSBPYmplY3QudmFsdWVzKGdyb3VwKGpvaW5UYWJsZXNXaXRoRHVwLCAoanQpID0+IGp0LnRhYmxlKSkubWFwKCh0YWJsZXMpID0+IHtcbiAgICAgIGFzc2VydCh0YWJsZXMgIT09IHVuZGVmaW5lZCwgXCJ0YWJsZXMgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgaWYgKHRhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhYmxlc1swXSxcbiAgICAgICAgaW5kZXhlczogdW5pcXVlKFxuICAgICAgICAgIHRhYmxlcy5mbGF0TWFwKCh0KSA9PiB0LmluZGV4ZXMpLFxuICAgICAgICAgIChpbmRleCkgPT4gW2luZGV4LnR5cGUsIC4uLmluZGV4LmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgTWlncmF0aW9uU2V0IOuwsOyXtFxuICAgIGNvbnN0IGVudGl0eVNldHM6IE1pZ3JhdGlvblNldFtdID0gWy4uLmVudGl0eVNldHNXaXRoSm9pblRhYmxlLCAuLi5qb2luVGFibGVzXTtcblxuICAgIGNvbnN0IGNvZGVzOiBHZW5NaWdyYXRpb25Db2RlW10gPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZW50aXR5U2V0cy5tYXAoYXN5bmMgKGVudGl0eVNldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRiU2V0ID0gYXdhaXQgUG9zdGdyZVNRTFNjaGVtYVJlYWRlci5nZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgICAgICAgICBjb21wYXJlREIsXG4gICAgICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczplbnRpdHlTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZW50aXR5U2V0KTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczpkYlNldDoke2VudGl0eVNldC50YWJsZX1gLCBkYlNldCk7XG5cbiAgICAgICAgICBpZiAoZGJTZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7JeG7J2MLCDsg4jroZwg7YWM7J2067iUIOyDneyEsVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyhtOyerO2VmOuKlCDsvIDsnbTsiqRcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZShlbnRpdHlTZXQsIGRiU2V0LCBjb21wYXJlREIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG5cbiAgICAvLyBub3JtYWwg7YOA7J6F7J20IOyVnuycvOuhnCwgZm9yZWlnbuydtCDrkqTroZxcbiAgICBjb2Rlcy5zb3J0KChjb2RlQSwgY29kZUIpID0+IHtcbiAgICAgIGlmIChjb2RlQS50eXBlID09PSBcImZvcmVpZ25cIiAmJiBjb2RlQi50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlQS50eXBlID09PSBcIm5vcm1hbFwiICYmIGNvZGVCLnR5cGUgPT09IFwiZm9yZWlnblwiKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYWRvdyBEQiDthYzsiqTtirjrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyBTaGFkb3cgREIg7YWM7Iqk7Yq4IOqysOqzvFxuICAgKi9cbiAgYXN5bmMgcnVuU2hhZG93VGVzdCgpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRkYkNvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHNoYWRvd0RhdGFiYXNlID0gYCR7dGRiQ29ubi5kYXRhYmFzZX1fX21pZ3JhdGlvbl9zaGFkb3dgO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2VyIERCIOyXsOqysCDsnKDsp4BcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TT05BTVVfV09SS0VSX0RCICE9PSBcInRydWVcIikge1xuICAgICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLnRlc3QpO1xuICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcbiAgICBhd2FpdCB0ZGIucmF3KGBcbiAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwZ19zdGF0X2FjdGl2aXR5LnBpZClcbiAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3RkYkNvbm4uZGF0YWJhc2V9J1xuICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgYCk7XG4gICAgYXdhaXQgdGRiLnJhdyhgQ1JFQVRFIERBVEFCQVNFICR7c2hhZG93RGF0YWJhc2V9IFRFTVBMQVRFICR7dGRiQ29ubi5kYXRhYmFzZX1gKTtcblxuICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICBjb25zdCBzZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4uU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLnRkYkNvbm4sXG4gICAgICAgIGRhdGFiYXNlOiBzaGFkb3dEYXRhYmFzZSxcbiAgICAgICAgcGFzc3dvcmQ6IHRkYkNvbm4ucGFzc3dvcmQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICB0cnkge1xuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gYXdhaXQgc2RiLm1pZ3JhdGUubGF0ZXN0KCk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJTaGFkb3cgREIg7YWM7Iqk7Yq47JeQIOyEseqzte2WiOyKteuLiOuLpCFcIiksIHtcbiAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgY29ubktleTogXCJzaGFkb3dcIixcbiAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnNoYWRvd0RiVGVzdEZhaWxlZFwiKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFNoYWRvdyBEQiDsl7DqsrAg7KKF66OMXG4gICAgICBhd2FpdCBzZGIuZGVzdHJveSgpO1xuXG4gICAgICAvLyBTaGFkb3cgREIg7IKt7KCcXG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcblxuICAgICAgLy8gVGVzdCBEQiDsl7DqsrAg7KKF66OMXG4gICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwibWtkaXIiLCJyZWFkZGlyIiwidW5saW5rIiwid3JpdGVGaWxlIiwicGF0aCIsImdyb3VwIiwic3VtIiwidW5pcXVlIiwiU29uYW11IiwiREIiLCJjcmVhdGVLbmV4SW5zdGFuY2UiLCJTRCIsIkVudGl0eU1hbmFnZXIiLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJOYWl0ZSIsImlzVGVzdCIsImV4aXN0cyIsImdlbmVyYXRlQWx0ZXJDb2RlIiwiZ2VuZXJhdGVDcmVhdGVDb2RlIiwiZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXIiLCJNaWdyYXRvciIsImdldE1pZ3JhdGlvbkNvZGVzIiwic3JjTWlncmF0aW9uc0RpciIsImpvaW4iLCJhcGlSb290UGF0aCIsInJlY3Vyc2l2ZSIsImNvZGVzIiwiZmlsdGVyIiwiZiIsImVuZHNXaXRoIiwibWFwIiwibmFtZSIsInJlcGxhY2UiLCJzb3J0IiwiYSIsImIiLCJ0IiwiZ2V0U3RhdHVzIiwiY29ubktleXMiLCJPYmplY3QiLCJrZXlzIiwiZGJDb25maWciLCJrZXkiLCJtaWdyYXRpb25TdGF0dXNFcnJvciIsInN0YXR1c2VzIiwiUHJvbWlzZSIsImFsbCIsImNvbm5LZXkiLCJrbmV4T3B0aW9ucyIsInRDb25uIiwic3RhdHVzIiwibWlncmF0ZSIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwieWVsbG93IiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbm5lY3Rpb24iLCJFcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJwZW5kaW5nIiwiZmRMaXN0IiwibGlzdCIsImZkIiwiZmlsZSIsImN1cnJlbnRWZXJzaW9uIiwiX2VyciIsImNvbm5TdHJpbmciLCJ1c2VyIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImRlc3Ryb3kiLCJwcmVwYXJlZENvZGVzIiwic3RhdHVzMGNvbm4iLCJmaW5kIiwidW5kZWZpbmVkIiwiY29tcGFyZURCY29ubiIsImNvbXBhcmVNaWdyYXRpb25zIiwiY29ubnMiLCJlcnJvciIsInJ1bkFjdGlvbiIsImFjdGlvbiIsInRhcmdldHMiLCJjb25maWdzIiwidGFyZ2V0Iiwib3B0aW9ucyIsImMiLCJjb25maWciLCJrbmV4IiwicmVzdWx0IiwiYmF0Y2hObyIsImFwcGxpZWQiLCJsYXRlc3QiLCJyb2xsYmFjayIsInZhbGlkYXRlRGVsZXRhYmxlIiwiY29kZU5hbWVzIiwiYXBwbGllZENvZGVzIiwiY29kZU5hbWUiLCJzb21lIiwiY29ubiIsImluY2x1ZGVzIiwiY2FuRGVsZXRlIiwibGVuZ3RoIiwiZGVsQ29kZXMiLCJmaWxlUGF0aCIsImdlbkRhdGVUYWciLCJpbmRleCIsImJhc2VEYXRlIiwiRGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwicGFkIiwibnVtIiwic2l6ZSIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZW5lcmF0ZVByZXBhcmVkQ29kZXMiLCJsb2ciLCJncmVlbiIsIm1pZ3JhdGlvbnNEaXIiLCJwY29kZSIsImVudHJpZXMiLCJmb3JtYXR0ZWQiLCJkYXRlVGFnIiwidGl0bGUiLCJjb21wYXJlREIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSIsImVudGl0eUlkIiwiZ2V0IiwicHJvcHMiLCJqb2luVGFibGVzV2l0aER1cCIsImZsYXRNYXAiLCJlbnRpdHlTZXQiLCJqb2luVGFibGVzIiwidmFsdWVzIiwianQiLCJ0YWJsZSIsInRhYmxlcyIsImluZGV4ZXMiLCJ0eXBlIiwiY29sdW1ucyIsImVudGl0eVNldHMiLCJkYlNldCIsImdldE1pZ3JhdGlvblNldEZyb21EQiIsImZsYXQiLCJjb2RlQSIsImNvZGVCIiwicnVuU2hhZG93VGVzdCIsInRkYkNvbm4iLCJ0ZXN0Iiwic2hhZG93RGF0YWJhc2UiLCJjbGVhclRlc3RUcmFuc2FjdGlvbiIsInByb2Nlc3MiLCJlbnYiLCJTT05BTVVfV09SS0VSX0RCIiwidGRiIiwibWFnZW50YSIsInJhdyIsInNkYiIsInBhc3N3b3JkIiwiZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFFaEUsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLEtBQUssRUFBRUMsR0FBRyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUM3QyxTQUFTQyxN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
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vbWlncmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHN1bSwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgdHlwZSB7IEdlbk1pZ3JhdGlvbkNvZGUsIE1pZ3JhdGlvblNldCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29ublN0cmluZywgTWlncmF0aW9uQ29kZSwgTWlncmF0aW9uU3RhdHVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uUmVzdWx0ID0ge1xuICBjb25uS2V5OiBzdHJpbmc7XG4gIGJhdGNoTm86IG51bWJlcjtcbiAgYXBwbGllZDogc3RyaW5nW107XG59W107XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRvciB7XG4gIHByaXZhdGUgYXN5bmMgZ2V0TWlncmF0aW9uQ29kZXMoKTogUHJvbWlzZTxNaWdyYXRpb25Db2RlW10+IHtcbiAgICBjb25zdCBzcmNNaWdyYXRpb25zRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJtaWdyYXRpb25zXCIpOyAvLyDsnbTqsbQg7ZmY6rK97JeQIOq0gOqzhOyXhuydtCDtla3sg4Egc3Jj7JeQ7IScIOywvuyVhOyVvCDtlbTsmpQuXG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjTWlncmF0aW9uc0RpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihzcmNNaWdyYXRpb25zRGlyLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvZGVzID0gKGF3YWl0IHJlYWRkaXIoc3JjTWlncmF0aW9uc0RpcikpXG4gICAgICAuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZikgPT4gKHtcbiAgICAgICAgbmFtZTogZi5yZXBsYWNlKFwiLnRzXCIsIFwiXCIpLFxuICAgICAgICBwYXRoOiBwYXRoLmpvaW4oc3JjTWlncmF0aW9uc0RpciwgZiksXG4gICAgICB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7YOA6rKf67OEIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zsmYAg7L2U65OcIOyDneyEsS/spIDruYQg7IOB7YOc66W8IOq1rO2VtOyYteuLiOuLpC5cbiAgICog7Iuk7KCc66GcIERC7JeQIOygkeq3vOuPhCDtlZjqs6Ag66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzrj4Qg7ZmV7J247ZWY6rOgLFxuICAgKiDtlYTsmpTtlZjri6TrqbQg7KCB7Jqp7ZWgIOyImCDsnojripQg7L2U65Oc66W8IOyDneyEseq5jOyngCDtlbTsmLXri4jri6QuXG4gICAqXG4gICAqIENMSeyZgCBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8TWlncmF0aW9uU3RhdHVzPiB7XG4gICAgY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb2Rlc1wiLCBjb2Rlcyk7XG5cbiAgICBjb25zdCBjb25uS2V5cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKFxuICAgICAgKGtleSkgPT4ga2V5LmVuZHNXaXRoKFwiX3NsYXZlXCIpID09PSBmYWxzZSxcbiAgICApIGFzIChrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnKVtdO1xuXG4gICAgbGV0IG1pZ3JhdGlvblN0YXR1c0Vycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29ubktleXMubWFwKGFzeW5jIChjb25uS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgICAgICBjb25zdCB0Q29ubiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShrbmV4T3B0aW9ucyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGAke2Nvbm5LZXl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuIOuNsOydtO2EsOuyoOydtOyKpOqwgCDsmKzrsJTrpbTqsowg6rWs7ISx65CY7KeAIOyViuydgCDqsoMg6rCZ7Iq164uI64ukLiDtmZXsnbjtlZjsi5zqs6Ag64uk7IucIOyLnOuPhO2VtOyjvOyEuOyalC5cXG7si5zrj4TtlZwg7Jew6rKwIOyEpOyglTpcXG4ke0pTT04uc3RyaW5naWZ5KGtuZXhPcHRpb25zLmNvbm5lY3Rpb24sIG51bGwsIDIpfVxcbuuwnOyDne2VnCDsl5Drn6w6XFxuJHtlcnJ9XFxuYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmc6IHN0cmluZ1tdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFssIGZkTGlzdF0gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZkTGlzdC5tYXAoKGZkOiB7IGZpbGU6IHN0cmluZyB9KSA9PiBmZC5maWxlLnJlcGxhY2UoXCIudHNcIiwgXCJcIikpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIG1pZ3JhdGlvblN0YXR1c0Vycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdENvbm4ubWlncmF0ZS5jdXJyZW50VmVyc2lvbigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0dXNFcnJvciA9IF9lcnIgaW5zdGFuY2VvZiBFcnJvciA/IF9lcnIubWVzc2FnZSA6IFN0cmluZyhfZXJyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6c3RhdHVzXCIsIHN0YXR1cyk7XG5cbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ga25leE9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBjb25uS2V5LnJlcGxhY2UoXCJfbWFzdGVyXCIsIFwiXCIpLFxuICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgIGNvbm5TdHJpbmc6IGBwZzovLyR7Y29ubmVjdGlvbi51c2VyID8/IFwiXCJ9QCR7Y29ubmVjdGlvbi5ob3N0fToke1xuICAgICAgICAgICAgICBjb25uZWN0aW9uLnBvcnRcbiAgICAgICAgICAgIH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZyxcbiAgICAgICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgYXMgbnVtYmVyIHwgXCJlcnJvclwiLFxuICAgICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IHRDb25uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgc3RhdHVzZXMpO1xuXG4gICAgY29uc3QgcHJlcGFyZWRDb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1czBjb25uID0gc3RhdHVzZXMuZmluZCgoc3RhdHVzKSA9PiBzdGF0dXMuc3RhdHVzID09PSAwKTtcbiAgICAgIGlmIChzdGF0dXMwY29ubiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICBgV2hpbGUgdHJ5aW5nIHRvIHByZXBhcmUgbWlncmF0aW9uIGNvZGVzLCB3ZSBmb3VuZCB0aGF0IHRoZXJlIGlzIG5vIGRhdGFiYXNlIHRvIGNvbXBhcmUgbWlncmF0aW9ucy4gV2UgbmVlZCBhdCBsZWFzdCBvbmUgZGF0YWJhc2Ugd2hlcmUgZXZlcnkgbWlncmF0aW9uIGlzIGFwcGxpZWQoc3RhdHVzID09PSAwKS4gWW91IG1pZ2h0IHdhbnQgdG8gYXBwbHkgeW91ciBleGlzdGluZyBtaWdyYXRpb25zIHRvIG9uZSBvZiB0aGUgZGF0YWJhc2VzLmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wYXJlREJjb25uID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tzdGF0dXMwY29ubi5jb25uS2V5XSk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREJjb25uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGNvbXBhcmVEQmNvbm4uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29ubnM6IHN0YXR1c2VzLFxuICAgICAgY29kZXMsXG4gICAgICBwcmVwYXJlZENvZGVzLFxuICAgICAgZXJyb3I6IG1pZ3JhdGlvblN0YXR1c0Vycm9yLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWY7J2EIOyggeyaqe2VmOqxsOuCmCDroaTrsLHtlanri4jri6QuXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDrp4jsnbTqt7jroIjsnbTshZgg7J6R7JeF7J2EIOyImO2Wie2VoCDrlYwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBDTEnsmYAgU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiDsnpHsl4Ug7Jyg7ZiVIChhcHBseS9yb2xsYmFjaylcbiAgICogQHBhcmFtIHRhcmdldHMg7J6R7JeFIOuMgOyDgSBEQiDshKTsoJUg7YKkIChrZXlvZiBTb25hbXVEQkNvbmZpZylcbiAgICogQHJldHVybnMg7J6R7JeFIOqysOqzvFxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOmFjdGlvblwiLCBhY3Rpb24pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246dGFyZ2V0c1wiLCB0YXJnZXRzKTtcblxuICAgIC8vIGdldCB1bmlxIGtuZXggY29uZmlnc1xuICAgIGNvbnN0IGNvbmZpZ3MgPSB1bmlxdWUoXG4gICAgICB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAgICAgICBjb25uS2V5OiB0YXJnZXQsXG4gICAgICAgICAgb3B0aW9uczogU29uYW11LmRiQ29uZmlnW3RhcmdldCBhcyBrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnXSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICh7IG9wdGlvbnMgfSkgPT5cbiAgICAgICAgYCR7KG9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuaG9zdH06JHtcbiAgICAgICAgICAob3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5wb3J0ID8/IDU0MzJcbiAgICAgICAgfS8keyhvcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGFjdGlvblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYXBwbHlcIjpcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgY29ubnMubWFwKGFzeW5jICh7IGNvbm5LZXksIGtuZXggfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgY29ubktleSxcbiAgICAgICAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICAgICAgICBhcHBsaWVkLCAvLyDsnbTrsoggbGF0ZXN0IO2YuOy2nOuhnCDsnbjtlbQgXCJ1cFwi7J20IOyggeyaqeuQnCDrp4jsnbTqt7jroIjsnbTshZgg7J2066aEKGUuZy4gXCIyMDI1MTEyNDIzMzU1N19jcmVhdGVfX2NvbXBhbmllcy50c1wiKeuTpOydmCDrsLDsl7TsnoXri4jri6QuIOywuOqzoDogaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9ibG9iLzAxYjE3N2M0ODVkNjk2ZjFiNzI4NThkZWU3MjhiYTE0M2M0ZmFkNzYvbGliL21pZ3JhdGlvbnMvbWlncmF0ZS9NaWdyYXRvci5qcyNMNTYwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgXCJyb2xsYmFja1wiOlxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBjb25ucy5tYXAoYXN5bmMgKHsgY29ubktleSwga25leCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGNvbm5LZXksXG4gICAgICAgICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgICAgICAgYXBwbGllZCwgLy8g7J2067KIIHJvbGxiYWNrIO2YuOy2nOuhnCDsnbjtlbQgXCJkb3duXCLsnbQg7KCB7Jqp65CcKD3roaTrsLHrkJwpIOuniOydtOq3uOugiOydtOyFmCDsnbTrpoQoZS5nLiBcIjIwMjUxMTI0MjMzNTU3X2NyZWF0ZV9fY29tcGFuaWVzLnRzXCIp65Ok7J2YIOuwsOyXtOyeheuLiOuLpC4g7LC46rOgOiBodHRwczovL2dpdGh1Yi5jb20va25leC9rbmV4L2Jsb2IvMDFiMTc3YzQ4NWQ2OTZmMWI3Mjg1OGRlZTcyOGJhMTQzYzRmYWQ3Ni9saWIvbWlncmF0aW9ucy9taWdyYXRlL01pZ3JhdG9yLmpzI0w2MTFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246cmVzdWx0XCIsIHJlc3VsdCk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtuZXguZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyCreygnCDqsIDriqXtlZwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gY29ubnMg66eI7J206re466CI7J207IWYIOyDge2DnCDrsLDsl7RcbiAgICogQHBhcmFtIGNvZGVOYW1lcyDsgq3soJztlaAg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg7J2066aEIOuwsOyXtFxuICAgKiBAcmV0dXJucyDsgq3soJwg6rCA64qlIOyXrOu2gCDrsI8g7KCB7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhFxuICAgKi9cbiAgdmFsaWRhdGVEZWxldGFibGUoY29ubnM6IE1pZ3JhdGlvblN0YXR1c1tcImNvbm5zXCJdLCBjb2RlTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYXBwbGllZENvZGVzID0gY29kZU5hbWVzLmZpbHRlcigoY29kZU5hbWUpID0+XG4gICAgICBjb25ucy5zb21lKChjb25uKSA9PiBjb25uLnBlbmRpbmcuaW5jbHVkZXMoY29kZU5hbWUpID09PSBmYWxzZSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjYW5EZWxldGU6IGFwcGxpZWRDb2Rlcy5sZW5ndGggPT09IDAsXG4gICAgICBhcHBsaWVkQ29kZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsgq3soJztlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlTmFtZXMg7IKt7KCc7ZWgIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOydtOumhCDrsLDsl7RcbiAgICogQHJldHVybnMg7IKt7KCc65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZGVsQ29kZXMoY29kZU5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBjb25zdCB7IGNhbkRlbGV0ZSwgYXBwbGllZENvZGVzIH0gPSB0aGlzLnZhbGlkYXRlRGVsZXRhYmxlKGNvbm5zLCBjb2RlTmFtZXMpO1xuICAgIGlmICghY2FuRGVsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2Fubm90IGRlbGV0ZSBhIG1pZ3JhdGlvbiBmaWxlIGlmIHRoZXJlIGlzIGFscmVhZHkgYXBwbGllZC4gQXBwbGllZCBjb2RlczogJHthcHBsaWVkQ29kZXMuam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBzdW0oXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29kZU5hbWVzLm1hcChhc3luYyAoY29kZU5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnMvJHtjb2RlTmFtZX0udHNgO1xuICAgICAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBhd2FpdCB1bmxpbmsoZmlsZVBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGF0ZVRhZyhpbmRleDogbnVtYmVyLCBiYXNlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRUaW1lKCkgKyBpbmRleCAqIDEwMDApO1xuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyID0gMikgPT4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkKGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRIb3VycygpKSArXG4gICAgICBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBwcmVwYXJlZENvZGVzIH0gPSBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZVByZXBhcmVkQ29kZXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcbiAgICBpZiAocHJlcGFyZWRDb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiXFxu7ZiE7J6sIOuqqOuRkCDsi7HtgazrkJwg7IOB7YOc7J6F64uI64ukLlwiKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyDsi6TsoJwg7L2U65OcIOyDneyEsVxuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zYDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBwY29kZV0gb2YgcHJlcGFyZWRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChwY29kZS5mb3JtYXR0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0ZVRhZyA9IHRoaXMuZ2VuRGF0ZVRhZyhpbmRleCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7bWlncmF0aW9uc0Rpcn0vJHtkYXRlVGFnfV8ke3Bjb2RlLnRpdGxlfS50c2A7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgcGNvZGUuZm9ybWF0dGVkKTtcbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBNSUdSQVRJT04gQ1JFQVRFRCAke2ZpbGVQYXRofWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJlcGFyZWRDb2Rlcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyBjb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREI6IEtuZXgpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIC8vIEVudGl0eSDsiJztmoztlZjsl6wg7Iux7YGsXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgRW50aXR57JeQ7IScIE1pZ3JhdGlvblNldCDstpTstpxcbiAgICBjb25zdCBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSA9IGVudGl0eUlkc1xuICAgICAgLmZpbHRlcigoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoZW50aXR5SWQpID0+IGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkoRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpKSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJTrp4wg7LaU7LacXG4gICAgY29uc3Qgam9pblRhYmxlc1dpdGhEdXAgPSBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZS5mbGF0TWFwKChlbnRpdHlTZXQpID0+IGVudGl0eVNldC5qb2luVGFibGVzKTtcbiAgICAvLyDspJHrs7Ug7KCc6rGwICjspJHrs7Xsnbgg6rK97JqwIGluZGV4ZXPrpbwg67OR7ZWpKVxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSBPYmplY3QudmFsdWVzKGdyb3VwKGpvaW5UYWJsZXNXaXRoRHVwLCAoanQpID0+IGp0LnRhYmxlKSkubWFwKCh0YWJsZXMpID0+IHtcbiAgICAgIGFzc2VydCh0YWJsZXMgIT09IHVuZGVmaW5lZCwgXCJ0YWJsZXMgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgaWYgKHRhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhYmxlc1swXSxcbiAgICAgICAgaW5kZXhlczogdW5pcXVlKFxuICAgICAgICAgIHRhYmxlcy5mbGF0TWFwKCh0KSA9PiB0LmluZGV4ZXMpLFxuICAgICAgICAgIChpbmRleCkgPT4gW2luZGV4LnR5cGUsIC4uLmluZGV4LmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgTWlncmF0aW9uU2V0IOuwsOyXtFxuICAgIGNvbnN0IGVudGl0eVNldHM6IE1pZ3JhdGlvblNldFtdID0gWy4uLmVudGl0eVNldHNXaXRoSm9pblRhYmxlLCAuLi5qb2luVGFibGVzXTtcblxuICAgIGNvbnN0IGNvZGVzOiBHZW5NaWdyYXRpb25Db2RlW10gPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZW50aXR5U2V0cy5tYXAoYXN5bmMgKGVudGl0eVNldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRiU2V0ID0gYXdhaXQgUG9zdGdyZVNRTFNjaGVtYVJlYWRlci5nZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgICAgICAgICBjb21wYXJlREIsXG4gICAgICAgICAgICBlbnRpdHlTZXQudGFibGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczplbnRpdHlTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZW50aXR5U2V0KTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczpkYlNldDoke2VudGl0eVNldC50YWJsZX1gLCBkYlNldCk7XG5cbiAgICAgICAgICBpZiAoZGJTZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7JeG7J2MLCDsg4jroZwg7YWM7J2067iUIOyDneyEsVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyhtOyerO2VmOuKlCDsvIDsnbTsiqRcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZShlbnRpdHlTZXQsIGRiU2V0LCBjb21wYXJlREIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG5cbiAgICAvLyBub3JtYWwg7YOA7J6F7J20IOyVnuycvOuhnCwgZm9yZWlnbuydtCDrkqTroZxcbiAgICBjb2Rlcy5zb3J0KChjb2RlQSwgY29kZUIpID0+IHtcbiAgICAgIGlmIChjb2RlQS50eXBlID09PSBcImZvcmVpZ25cIiAmJiBjb2RlQi50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlQS50eXBlID09PSBcIm5vcm1hbFwiICYmIGNvZGVCLnR5cGUgPT09IFwiZm9yZWlnblwiKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYWRvdyBEQiDthYzsiqTtirjrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyBTaGFkb3cgREIg7YWM7Iqk7Yq4IOqysOqzvFxuICAgKi9cbiAgYXN5bmMgcnVuU2hhZG93VGVzdCgpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRkYkNvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHNoYWRvd0RhdGFiYXNlID0gYCR7dGRiQ29ubi5kYXRhYmFzZX1fX21pZ3JhdGlvbl9zaGFkb3dgO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2VyIERCIOyXsOqysCDsnKDsp4BcbiAgICAgIGlmIChwcm9jZXNzLmVudi5TT05BTVVfV09SS0VSX0RCICE9PSBcInRydWVcIikge1xuICAgICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLnRlc3QpO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtzaGFkb3dEYXRhYmFzZX1gKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7dGRiQ29ubi5kYXRhYmFzZX0nXG4gICAgICAgICAgQU5EIHBpZCA8PiBwZ19iYWNrZW5kX3BpZCgpO1xuICAgICAgYCk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBDUkVBVEUgREFUQUJBU0UgJHtzaGFkb3dEYXRhYmFzZX0gVEVNUExBVEUgJHt0ZGJDb25uLmRhdGFiYXNlfWApO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIC4uLnRkYkNvbm4sXG4gICAgICAgICAgZGF0YWJhc2U6IHNoYWRvd0RhdGFiYXNlLFxuICAgICAgICAgIHBhc3N3b3JkOiB0ZGJDb25uLnBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNoYWRvdyBEQiDthYzsiqTtirgg7KeE7ZaJXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QoKTtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJTaGFkb3cgREIg7YWM7Iqk7Yq47JeQIOyEseqzte2WiOyKteuLiOuLpCFcIiksIHtcbiAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29ubktleTogXCJzaGFkb3dcIixcbiAgICAgICAgICAgIGJhdGNoTm8sXG4gICAgICAgICAgICBhcHBsaWVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc2hhZG93RGJUZXN0RmFpbGVkXCIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHNkYi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFNoYWRvdyBEQiDsgq3soJxcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0ZGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAke3NoYWRvd0RhdGFiYXNlfWApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU2hhZG93IERCIOygleumrCDsi6TtjKg6XCIsIGUpOyAvLyDsnbTqsowg7JeG7Jy866m0IOyhsOyaqe2eiCDriITsiJhcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRkYi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwiY2hhbGsiLCJta2RpciIsInJlYWRkaXIiLCJ1bmxpbmsiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiZ3JvdXAiLCJzdW0iLCJ1bmlxdWUiLCJTb25hbXUiLCJEQiIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIlNEIiwiRW50aXR5TWFuYWdlciIsIlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiIsIk5haXRlIiwiaXNUZXN0IiwiZXhpc3RzIiwiZ2VuZXJhdGVBbHRlckNvZGUiLCJnZW5lcmF0ZUNyZWF0ZUNvZGUiLCJnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IiwiUG9zdGdyZVNRTFNjaGVtYVJlYWRlciIsIk1pZ3JhdG9yIiwiZ2V0TWlncmF0aW9uQ29kZXMiLCJzcmNNaWdyYXRpb25zRGlyIiwiam9pbiIsImFwaVJvb3RQYXRoIiwicmVjdXJzaXZlIiwiY29kZXMiLCJmaWx0ZXIiLCJmIiwiZW5kc1dpdGgiLCJtYXAiLCJuYW1lIiwicmVwbGFjZSIsInNvcnQiLCJhIiwiYiIsInQiLCJnZXRTdGF0dXMiLCJjb25uS2V5cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsImtleSIsIm1pZ3JhdGlvblN0YXR1c0Vycm9yIiwic3RhdHVzZXMiLCJQcm9taXNlIiwiYWxsIiwiY29ubktleSIsImtuZXhPcHRpb25zIiwidENvbm4iLCJzdGF0dXMiLCJtaWdyYXRlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJ5ZWxsb3ciLCJKU09OIiwic3RyaW5naWZ5IiwiY29ubmVjdGlvbiIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsInBlbmRpbmciLCJmZExpc3QiLCJsaXN0IiwiZmQiLCJmaWxlIiwiY3VycmVudFZlcnNpb24iLCJfZXJyIiwiY29ublN0cmluZyIsInVzZXIiLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZGVzdHJveSIsInByZXBhcmVkQ29kZXMiLCJzdGF0dXMwY29ubiIsImZpbmQiLCJ1bmRlZmluZWQiLCJjb21wYXJlREJjb25uIiwiY29tcGFyZU1pZ3JhdGlvbnMiLCJjb25ucyIsImVycm9yIiwicnVuQWN0aW9uIiwiYWN0aW9uIiwidGFyZ2V0cyIsImNvbmZpZ3MiLCJ0YXJnZXQiLCJvcHRpb25zIiwiYyIsImNvbmZpZyIsImtuZXgiLCJyZXN1bHQiLCJiYXRjaE5vIiwiYXBwbGllZCIsImxhdGVzdCIsInJvbGxiYWNrIiwidmFsaWRhdGVEZWxldGFibGUiLCJjb2RlTmFtZXMiLCJhcHBsaWVkQ29kZXMiLCJjb2RlTmFtZSIsInNvbWUiLCJjb25uIiwiaW5jbHVkZXMiLCJjYW5EZWxldGUiLCJsZW5ndGgiLCJkZWxDb2RlcyIsImZpbGVQYXRoIiwiZ2VuRGF0ZVRhZyIsImluZGV4IiwiYmFzZURhdGUiLCJEYXRlIiwiZGF0ZSIsImdldFRpbWUiLCJwYWQiLCJudW0iLCJzaXplIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJnZXREYXRlIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdlbmVyYXRlUHJlcGFyZWRDb2RlcyIsImxvZyIsImdyZWVuIiwibWlncmF0aW9uc0RpciIsInBjb2RlIiwiZW50cmllcyIsImZvcm1hdHRlZCIsImRhdGVUYWciLCJ0aXRsZSIsImNvbXBhcmVEQiIsImVudGl0eUlkcyIsImdldEFsbElkcyIsImVudGl0eVNldHNXaXRoSm9pblRhYmxlIiwiZW50aXR5SWQiLCJnZXQiLCJwcm9wcyIsImpvaW5UYWJsZXNXaXRoRHVwIiwiZmxhdE1hcCIsImVudGl0eVNldCIsImpvaW5UYWJsZXMiLCJ2YWx1ZXMiLCJqdCIsInRhYmxlIiwidGFibGVzIiwiaW5kZXhlcyIsInR5cGUiLCJjb2x1bW5zIiwiZW50aXR5U2V0cyIsImRiU2V0IiwiZ2V0TWlncmF0aW9uU2V0RnJvbURCIiwiZmxhdCIsImNvZGVBIiwiY29kZUIiLCJydW5TaGFkb3dUZXN0IiwidGRiQ29ubiIsInRlc3QiLCJzaGFkb3dEYXRhYmFzZSIsImNsZWFyVGVzdFRyYW5zYWN0aW9uIiwicHJvY2VzcyIsImVudiIsIlNPTkFNVV9XT1JLRVJfREIiLCJ0ZGIiLCJtYWdlbnRhIiwicmF3Iiwic2RiIiwicGFzc3dvcmQiLCJl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
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EACV,eAAe,EAGf,YAAY,EACZ,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,cAAM,2BAA2B;IAC/B;;;;;OAKG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA8HzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAqHhD;;;OAGG;IACG,yBAAyB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA+C9F;;;OAGG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE;CA+FF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}
1
+ {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EACV,eAAe,EAGf,YAAY,EACZ,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,cAAM,2BAA2B;IAC/B;;;;;OAKG;IACG,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA8HzF;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IA2HhD;;;OAGG;IACG,yBAAyB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA+C9F;;;OAGG;YACW,mBAAmB;IAwBjC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE;CA+FF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}