@cartanova/qgrid-cli 2.4.4 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/bundle/dist/application/monit/log-buffer.js +76 -0
  2. package/bundle/dist/application/monit/monit.frame.js +86 -0
  3. package/bundle/dist/application/monit/monit.types.js +42 -0
  4. package/bundle/dist/application/qgrid/oauth.js +1 -1
  5. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +3 -3
  6. package/bundle/dist/application/qgrid/qgrid.frame.js +14 -12
  7. package/bundle/dist/application/qgrid/qgrid.types.js +3 -2
  8. package/bundle/dist/application/queries.generated.js +7 -2
  9. package/bundle/dist/application/request-log/request-log.model.js +1 -1
  10. package/bundle/dist/sonamu.config.js +14 -10
  11. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +5 -2
  12. package/bundle/dist/utils/providers/anthropic/claude-session.js +3 -3
  13. package/bundle/dist/utils/providers/openai/codex-worker.js +5 -3
  14. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +179 -15
  15. package/bundle/src/application/monit/log-buffer.test.ts +121 -0
  16. package/bundle/src/application/monit/log-buffer.ts +121 -0
  17. package/bundle/src/application/monit/monit.frame.test.ts +176 -0
  18. package/bundle/src/application/monit/monit.frame.ts +77 -0
  19. package/bundle/src/application/monit/monit.types.ts +54 -0
  20. package/bundle/src/application/qgrid/qgrid.frame.test.ts +24 -0
  21. package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
  22. package/bundle/src/application/qgrid/qgrid.types.ts +1 -0
  23. package/bundle/src/application/queries.generated.ts +8 -0
  24. package/bundle/src/application/sonamu.generated.http +12 -0
  25. package/bundle/src/sonamu.config.ts +5 -2
  26. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +5 -0
  27. package/bundle/src/utils/providers/openai/codex-worker.test.ts +26 -0
  28. package/bundle/src/utils/providers/openai/codex-worker.ts +3 -1
  29. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +212 -7
  30. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +297 -17
  31. package/bundle/web-dist/client/assets/index-BOXhNo0k.js +78 -0
  32. package/bundle/web-dist/client/assets/index-yZcjDoV0.css +1 -0
  33. package/bundle/web-dist/client/assets/{logs-vuI-Zgnq.js → logs-BShH_sut.js} +1 -1
  34. package/bundle/web-dist/client/assets/monit-CoEAp5S0.js +1 -0
  35. package/bundle/web-dist/client/assets/{routes-0Fki0JEi.js → routes-Dr3cGnV3.js} +2 -2
  36. package/bundle/web-dist/client/assets/{sd.generated-WA5SGJYZ.js → sd.generated-D2Y9QeiN.js} +1 -1
  37. package/bundle/web-dist/client/assets/{services.generated-DzZLnb7S.js → services.generated-CmxXl220.js} +1 -1
  38. package/bundle/web-dist/client/assets/{show-BreAgaFH.js → show-CXII6Iy7.js} +3 -3
  39. package/bundle/web-dist/client/assets/{tokens-4VgHQtXd.js → tokens-hP1NecIg.js} +1 -1
  40. package/bundle/web-dist/client/assets/use-update-token-mutation-6J1T9U2-.js +1 -0
  41. package/bundle/web-dist/client/index.html +3 -3
  42. package/bundle/web-dist/server/assets/{lazyRouteComponent-BrPAFtBA.js → lazyRouteComponent-BlfOh9S3.js} +1 -1
  43. package/bundle/web-dist/server/assets/{logs-CKM6W3W6.js → logs-DYly4ipQ.js} +3 -3
  44. package/bundle/web-dist/server/assets/monit-CYyY2S2f.js +1577 -0
  45. package/bundle/web-dist/server/assets/{routes-DhIpPgXz.js → routes-Dqu3osXt.js} +14 -6
  46. package/bundle/web-dist/server/assets/{sd.generated-Cwg2f53z.js → sd.generated-CE6D5clm.js} +1 -1
  47. package/bundle/web-dist/server/assets/{services.generated-CsotZP44.js → services.generated-DyZUzXiq.js} +39 -2
  48. package/bundle/web-dist/server/assets/{show-CV2UFjaH.js → show-BDul8xLb.js} +3 -3
  49. package/bundle/web-dist/server/assets/{tokens-DfGj1y2v.js → tokens-fzMW4G74.js} +4 -4
  50. package/bundle/web-dist/server/assets/{use-update-token-mutation-BL96w-Pg.js → use-update-token-mutation-BejUW5sw.js} +1 -1
  51. package/bundle/web-dist/server/entry-server.generated.js +71 -27
  52. package/package.json +1 -1
  53. package/skills/qgrid/references/ai-sdk-provider-contract.md +25 -0
  54. package/bundle/web-dist/client/assets/index-D1ExP77_.js +0 -78
  55. package/bundle/web-dist/client/assets/index-Dc-qeEPm.css +0 -1
  56. package/bundle/web-dist/client/assets/use-update-token-mutation-BV6msjuy.js +0 -1
@@ -0,0 +1,76 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ //#region src/application/monit/log-buffer.ts
3
+ const DEFAULT_CAPACITY = 2e3;
4
+ const DEFAULT_MAX_TEXT_LENGTH = 4e3;
5
+ function flattenMessage(message) {
6
+ return message.map((part, index) => index % 2 === 0 ? String(part ?? "") : renderValue(part)).join("");
7
+ }
8
+ function renderValue(value) {
9
+ if (typeof value === "string") return value;
10
+ if (value instanceof Error) return value.message;
11
+ try {
12
+ return JSON.stringify(value) ?? String(value);
13
+ } catch {
14
+ return String(value);
15
+ }
16
+ }
17
+ var MonitLogBuffer = class {
18
+ processStartedAt = Date.now();
19
+ entries = [];
20
+ nextSeq = 1;
21
+ constructor(capacity = DEFAULT_CAPACITY, maxTextLength = DEFAULT_MAX_TEXT_LENGTH) {
22
+ this.capacity = capacity;
23
+ this.maxTextLength = maxTextLength;
24
+ }
25
+ push(record) {
26
+ try {
27
+ let text = flattenMessage(record.message);
28
+ if (text.length > this.maxTextLength) text = `${text.slice(0, this.maxTextLength)}…`;
29
+ this.entries.push({
30
+ seq: this.nextSeq++,
31
+ timestamp: record.timestamp,
32
+ level: record.level,
33
+ category: [...record.category],
34
+ text
35
+ });
36
+ if (this.entries.length > this.capacity) this.entries.splice(0, this.entries.length - this.capacity);
37
+ } catch {}
38
+ }
39
+ get oldestSeq() {
40
+ return this.entries[0]?.seq ?? this.nextSeq;
41
+ }
42
+ get latestSeq() {
43
+ return this.nextSeq - 1;
44
+ }
45
+ after(cursor, limit) {
46
+ if (cursor === void 0) {
47
+ const entries = this.entries.slice(-limit);
48
+ return {
49
+ entries,
50
+ nextCursor: entries.at(-1)?.seq ?? this.latestSeq,
51
+ dropped: 0
52
+ };
53
+ }
54
+ if (cursor > this.latestSeq) return {
55
+ entries: [],
56
+ nextCursor: this.latestSeq,
57
+ dropped: 0
58
+ };
59
+ const dropped = Math.max(this.oldestSeq - cursor - 1, 0);
60
+ const startIndex = this.entries.findIndex((entry) => entry.seq > cursor);
61
+ const entries = startIndex === -1 ? [] : this.entries.slice(startIndex, startIndex + limit);
62
+ return {
63
+ entries,
64
+ nextCursor: entries.at(-1)?.seq ?? cursor + dropped,
65
+ dropped
66
+ };
67
+ }
68
+ };
69
+ const monitLogBuffer = new MonitLogBuffer();
70
+ const monitLogSink = (record) => {
71
+ monitLogBuffer.push(record);
72
+ };
73
+ //#endregion
74
+ export { MonitLogBuffer, monitLogBuffer, monitLogSink };
75
+
76
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWJ1ZmZlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vbml0IOuhnOq3uCByaW5nIGJ1ZmZlciDigJQg7ZSE66Gc7IS47IqkIOyDneyhtCDquLDqsIQg64+Z7JWIIOy1nOq3vCDroZzqt7jrpbwg6rWs7KGw7ZmUIOugiOy9lOuTnOuhnCDrs7TqtIDtlZzri6QuXG4gKlxuICog7L2Y7IaUIHNpbmsg7JmAIOuzkeugrOuhnCDrk7HroZ3rkJjripQg65GQIOuyiOynuCBsb2d0YXBlIHNpbmsg6rCAIOydtCDrsoTtjbzrpbwg7LGE7Jqw6rOgLFxuICogbW9uaXQuZnJhbWUg7J20IOy7pOyEnCDquLDrsJjsnLzroZwg7J297Ja0IOuMgOyLnOuztOuTnCBNb25pdCDtg63sl5Ag7KCc6rO17ZWc64ukLlxuICog7J6s7Iuc7J6R7ZWY66m0IOumrOyFi+uQnOuLpCDigJQg7JiB7IaNIOq4sOuhneydgCByZXF1ZXN0X2xvZyDsnZgg66qrLlxuICpcbiAqIHRpbWVzdGFtcC9wcm9jZXNzU3RhcnRlZEF0IOydgCBlcG9jaCBtcyDsiKvsnpDroZwg7Jyg7KeA7ZWc64ukLiB3ZWIg7J2YIOyghOyXrSBkYXRlUmV2aXZlciDqsIBcbiAqIElTTyDrrLjsnpDsl7TsnYQgRGF0ZSDroZwg67CU6r+U67KE66as66+A66GcLCDsiKvsnpDrp4zsnbQg7J6s7Iuc7J6RIOqwkOyngOydmCDrj5nrk7HshLEg67mE6rWQ66W8IOuztOyhtO2VnOuLpC5cbiAqL1xuaW1wb3J0IHsgdHlwZSBMb2dSZWNvcmQsIHR5cGUgU2luayB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IERFRkFVTFRfQ0FQQUNJVFkgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX1RFWFRfTEVOR1RIID0gNF8wMDA7XG5cbi8vIO2RnOyLnCDsoITsmqkgd2lyZSDroIjsvZTrk5wuIHByb3BlcnRpZXMv7JuQ67O4IOqwkuydgCDrsoTtjbzsl5Ag7Iuj7KeAIOyViuuKlOuLpChhbGxvd2xpc3QpLlxuZXhwb3J0IGludGVyZmFjZSBNb25pdExvZ0VudHJ5IHtcbiAgc2VxOiBudW1iZXI7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBsZXZlbDogc3RyaW5nO1xuICBjYXRlZ29yeTogc3RyaW5nW107XG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb25pdExvZ0NodW5rIHtcbiAgZW50cmllczogTW9uaXRMb2dFbnRyeVtdO1xuICBuZXh0Q3Vyc29yOiBudW1iZXI7XG4gIC8vIO2YuOy2nOyekOydmCDsu6TshJzqsIAgZXZpY3Rpb24g7JeQIOuwgOugpCDsnKDsi6TrkJwg65287J24IOyImC4gMCDsnbTrqbQg6rO167CxIOyXhuydjC5cbiAgZHJvcHBlZDogbnVtYmVyO1xufVxuXG4vLyBsb2d0YXBlIG1lc3NhZ2Ug67Cw7Je07J2AIO2ZgOyImCDquLjsnbQg4oCUIOynneyImCDsnbjrjbHsiqTqsIAg7YWc7ZSM66a/IO2FjeyKpO2KuCwg7ZmA7IiY6rCAIOuztOqwhCDqsJIuXG5mdW5jdGlvbiBmbGF0dGVuTWVzc2FnZShtZXNzYWdlOiByZWFkb25seSB1bmtub3duW10pOiBzdHJpbmcge1xuICByZXR1cm4gbWVzc2FnZVxuICAgIC5tYXAoKHBhcnQsIGluZGV4KSA9PiAoaW5kZXggJSAyID09PSAwID8gU3RyaW5nKHBhcnQgPz8gXCJcIikgOiByZW5kZXJWYWx1ZShwYXJ0KSkpXG4gICAgLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbHVlLm1lc3NhZ2U7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSA/PyBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9uaXRMb2dCdWZmZXIge1xuICByZWFkb25seSBwcm9jZXNzU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBlbnRyaWVzOiBNb25pdExvZ0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBuZXh0U2VxID0gMTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcGFjaXR5ID0gREVGQVVMVF9DQVBBQ0lUWSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heFRleHRMZW5ndGggPSBERUZBVUxUX01BWF9URVhUX0xFTkdUSCxcbiAgKSB7fVxuXG4gIC8vIGxvZ3RhcGUgc2luayDrs7jssrQuIGxvZ3RhcGUg6rCAIHNpbmsg7Jik66WY66W8IOqyqeumrO2VmOyngOunjCwg67KE7Y28IOuyhOq3uOqwgFxuICAvLyBtZXRhIGxvZ2dlciDshozsnYzsnYQg66eM65Ok7KeAIOyViuuPhOuhnSDrsKnslrTsoIHsnLzroZwg7ZWcIOuyiCDrjZQg6rCQ7Iu864ukLlxuICBwdXNoKHJlY29yZDogTG9nUmVjb3JkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0ZXh0ID0gZmxhdHRlbk1lc3NhZ2UocmVjb3JkLm1lc3NhZ2UpO1xuICAgICAgaWYgKHRleHQubGVuZ3RoID4gdGhpcy5tYXhUZXh0TGVuZ3RoKSB7XG4gICAgICAgIHRleHQgPSBgJHt0ZXh0LnNsaWNlKDAsIHRoaXMubWF4VGV4dExlbmd0aCl94oCmYDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgICAgc2VxOiB0aGlzLm5leHRTZXErKyxcbiAgICAgICAgdGltZXN0YW1wOiByZWNvcmQudGltZXN0YW1wLFxuICAgICAgICBsZXZlbDogcmVjb3JkLmxldmVsLFxuICAgICAgICBjYXRlZ29yeTogWy4uLnJlY29yZC5jYXRlZ29yeV0sXG4gICAgICAgIHRleHQsXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID4gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKDAsIHRoaXMuZW50cmllcy5sZW5ndGggLSB0aGlzLmNhcGFjaXR5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOuhnOq3uCDsuqHsspgg7Iuk7Yyo64qUIOyhsOyaqe2eiCDrrLTsi5wg4oCUIOuhnOq5hSDqsr3roZzrpbwg7KCI64yAIOuwqe2VtO2VmOyngCDslYrripTri6QuXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9sZGVzdFNlcSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXNbMF0/LnNlcSA/PyB0aGlzLm5leHRTZXE7XG4gIH1cblxuICBnZXQgbGF0ZXN0U2VxKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV4dFNlcSAtIDE7XG4gIH1cblxuICAvLyBjdXJzb3Ig7J207ZuE7J2YIOyXlO2KuOumrOulvCDstZzrjIAgbGltaXQg6rCcIOuwmO2ZmO2VnOuLpC4gY3Vyc29yIOuvuOyngOygleydtOuptCB0YWlsLlxuICBhZnRlcihjdXJzb3I6IG51bWJlciB8IHVuZGVmaW5lZCwgbGltaXQ6IG51bWJlcik6IE1vbml0TG9nQ2h1bmsge1xuICAgIGlmIChjdXJzb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcy5zbGljZSgtbGltaXQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50cmllcyxcbiAgICAgICAgbmV4dEN1cnNvcjogZW50cmllcy5hdCgtMSk/LnNlcSA/PyB0aGlzLmxhdGVzdFNlcSxcbiAgICAgICAgZHJvcHBlZDogMCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8g7J207KCEIO2UhOuhnOyEuOyKpOydmCDsu6TshJwg65OxIOuvuOuemCDsu6TshJzripQg67Cp7Ja07KCB7Jy866GcIO2YhOyerCB0YWlsIOuhnCDsnqzrj5nquLDtmZTtlZzri6QuXG4gICAgaWYgKGN1cnNvciA+IHRoaXMubGF0ZXN0U2VxKSB7XG4gICAgICByZXR1cm4geyBlbnRyaWVzOiBbXSwgbmV4dEN1cnNvcjogdGhpcy5sYXRlc3RTZXEsIGRyb3BwZWQ6IDAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkcm9wcGVkID0gTWF0aC5tYXgodGhpcy5vbGRlc3RTZXEgLSBjdXJzb3IgLSAxLCAwKTtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5lbnRyaWVzLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5LnNlcSA+IGN1cnNvcik7XG4gICAgY29uc3QgZW50cmllcyA9IHN0YXJ0SW5kZXggPT09IC0xID8gW10gOiB0aGlzLmVudHJpZXMuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGxpbWl0KTtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllcyxcbiAgICAgIG5leHRDdXJzb3I6IGVudHJpZXMuYXQoLTEpPy5zZXEgPz8gY3Vyc29yICsgZHJvcHBlZCxcbiAgICAgIGRyb3BwZWQsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbW9uaXRMb2dCdWZmZXIgPSBuZXcgTW9uaXRMb2dCdWZmZXIoKTtcblxuZXhwb3J0IGNvbnN0IG1vbml0TG9nU2luazogU2luayA9IChyZWNvcmQpID0+IHtcbiAgbW9uaXRMb2dCdWZmZXIucHVzaChyZWNvcmQpO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFZQSxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLDBCQUEwQjtBQW1CaEMsU0FBUyxlQUFlLFNBQXFDO0FBQzNELFFBQU8sUUFDSixLQUFLLE1BQU0sVUFBVyxRQUFRLE1BQU0sSUFBSSxPQUFPLFFBQVEsR0FBRyxHQUFHLFlBQVksS0FBSyxDQUFFLENBQ2hGLEtBQUssR0FBRzs7QUFHYixTQUFTLFlBQVksT0FBd0I7QUFDM0MsS0FBSSxPQUFPLFVBQVUsU0FBVSxRQUFPO0FBQ3RDLEtBQUksaUJBQWlCLE1BQU8sUUFBTyxNQUFNO0FBQ3pDLEtBQUk7QUFDRixTQUFPLEtBQUssVUFBVSxNQUFNLElBQUksT0FBTyxNQUFNO1NBQ3ZDO0FBQ04sU0FBTyxPQUFPLE1BQU07OztBQUl4QixJQUFhLGlCQUFiLE1BQTRCO0NBQzFCLG1CQUE0QixLQUFLLEtBQUs7Q0FDdEMsVUFBbUMsRUFBRTtDQUNyQyxVQUFrQjtDQUVsQixZQUNFLFdBQTRCLGtCQUM1QixnQkFBaUMseUJBQ2pDO0FBRmlCLE9BQUEsV0FBQTtBQUNBLE9BQUEsZ0JBQUE7O0NBS25CLEtBQUssUUFBeUI7QUFDNUIsTUFBSTtHQUNGLElBQUksT0FBTyxlQUFlLE9BQU8sUUFBUTtBQUN6QyxPQUFJLEtBQUssU0FBUyxLQUFLLGNBQ3JCLFFBQU8sR0FBRyxLQUFLLE1BQU0sR0FBRyxLQUFLLGNBQWMsQ0FBQztBQUU5QyxRQUFLLFFBQVEsS0FBSztJQUNoQixLQUFLLEtBQUs7SUFDVixXQUFXLE9BQU87SUFDbEIsT0FBTyxPQUFPO0lBQ2QsVUFBVSxDQUFDLEdBQUcsT0FBTyxTQUFTO0lBQzlCO0lBQ0QsQ0FBQztBQUNGLE9BQUksS0FBSyxRQUFRLFNBQVMsS0FBSyxTQUM3QixNQUFLLFFBQVEsT0FBTyxHQUFHLEtBQUssUUFBUSxTQUFTLEtBQUssU0FBUztVQUV2RDs7Q0FLVixJQUFJLFlBQW9CO0FBQ3RCLFNBQU8sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLOztDQUd0QyxJQUFJLFlBQW9CO0FBQ3RCLFNBQU8sS0FBSyxVQUFVOztDQUl4QixNQUFNLFFBQTRCLE9BQThCO0FBQzlELE1BQUksV0FBVyxRQUFXO0dBQ3hCLE1BQU0sVUFBVSxLQUFLLFFBQVEsTUFBTSxDQUFDLE1BQU07QUFDMUMsVUFBTztJQUNMO0lBQ0EsWUFBWSxRQUFRLEdBQUcsR0FBRyxFQUFFLE9BQU8sS0FBSztJQUN4QyxTQUFTO0lBQ1Y7O0FBSUgsTUFBSSxTQUFTLEtBQUssVUFDaEIsUUFBTztHQUFFLFNBQVMsRUFBRTtHQUFFLFlBQVksS0FBSztHQUFXLFNBQVM7R0FBRztFQUdoRSxNQUFNLFVBQVUsS0FBSyxJQUFJLEtBQUssWUFBWSxTQUFTLEdBQUcsRUFBRTtFQUN4RCxNQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsVUFBVSxNQUFNLE1BQU0sT0FBTztFQUN4RSxNQUFNLFVBQVUsZUFBZSxLQUFLLEVBQUUsR0FBRyxLQUFLLFFBQVEsTUFBTSxZQUFZLGFBQWEsTUFBTTtBQUMzRixTQUFPO0dBQ0w7R0FDQSxZQUFZLFFBQVEsR0FBRyxHQUFHLEVBQUUsT0FBTyxTQUFTO0dBQzVDO0dBQ0Q7OztBQUlMLE1BQWEsaUJBQWlCLElBQUksZ0JBQWdCO0FBRWxELE1BQWEsZ0JBQXNCLFdBQVc7QUFDNUMsZ0JBQWUsS0FBSyxPQUFPIn0=
@@ -0,0 +1,86 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { monitLogBuffer } from "./log-buffer.js";
3
+ import { __decorateMetadata } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js";
4
+ import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
5
+ import { resolveOpenAIWorkerPoolConfig } from "../../utils/providers/openai/openai-dispatcher.js";
6
+ import { QgridDispatcher } from "../qgrid/qgrid.dispatcher.js";
7
+ import { BaseFrameClass, DB, api } from "sonamu";
8
+ //#region src/application/monit/monit.frame.ts
9
+ /**
10
+ * Monit — 대시보드 Monit 탭용 프로세스 로그 관측 API.
11
+ *
12
+ * 읽기 전용. ring buffer 를 얇게 직접 읽으며(범용 쿼리 기계 없이),
13
+ * request log 를 남기지 않는다. 접근 경계는 다른 대시보드 API 와 동일하다.
14
+ */
15
+ const RESPONSE_ENTRY_LIMIT = 1e3;
16
+ var MonitFrameClass = class extends BaseFrameClass {
17
+ constructor() {
18
+ super("Monit");
19
+ }
20
+ async monitLogs(cursor) {
21
+ return {
22
+ processStartedAt: monitLogBuffer.processStartedAt,
23
+ ...monitLogBuffer.after(cursor, RESPONSE_ENTRY_LIMIT),
24
+ vitals: currentVitals()
25
+ };
26
+ }
27
+ async monitInfo() {
28
+ const pool = resolveOpenAIWorkerPoolConfig();
29
+ const host = process.env.HOST ?? "localhost";
30
+ const port = process.env.PORT ?? "44900";
31
+ const conn = activeDbConnection();
32
+ return {
33
+ serverUrl: `http://${host}:${port}`,
34
+ dbHost: conn.host ?? "localhost",
35
+ dbName: conn.database ?? "qgrid",
36
+ openai: {
37
+ minWorkersPerToken: pool.minWorkersPerToken,
38
+ maxWorkersPerToken: pool.maxWorkersPerToken,
39
+ autoscale: pool.autoscale
40
+ }
41
+ };
42
+ }
43
+ };
44
+ __decorate([
45
+ api({
46
+ httpMethod: "GET",
47
+ clients: ["axios", "tanstack-query"]
48
+ }),
49
+ __decorateMetadata("design:type", Function),
50
+ __decorateMetadata("design:paramtypes", [Number]),
51
+ __decorateMetadata("design:returntype", Promise)
52
+ ], MonitFrameClass.prototype, "monitLogs", null);
53
+ __decorate([
54
+ api({
55
+ httpMethod: "GET",
56
+ clients: ["axios", "tanstack-query"]
57
+ }),
58
+ __decorateMetadata("design:type", Function),
59
+ __decorateMetadata("design:paramtypes", []),
60
+ __decorateMetadata("design:returntype", Promise)
61
+ ], MonitFrameClass.prototype, "monitInfo", null);
62
+ function currentVitals() {
63
+ return {
64
+ openaiWorkerCount: QgridDispatcher.openaiDispatcher?.workerCount ?? 0,
65
+ openaiReadyWorkerCount: QgridDispatcher.openaiDispatcher?.readyWorkerCount ?? 0,
66
+ openaiQueueLength: QgridDispatcher.openaiDispatcher?.queueLength ?? 0,
67
+ openaiWorkersByToken: QgridDispatcher.openaiDispatcher?.workerCountsByToken ?? [],
68
+ anthropicTokenCount: QgridDispatcher.anthropicDispatcher?.tokenCount ?? 0,
69
+ anthropicTokenNames: QgridDispatcher.anthropicDispatcher?.tokenNames ?? []
70
+ };
71
+ }
72
+ function activeDbConnection() {
73
+ try {
74
+ const connection = DB.getDBConfig("w").connection;
75
+ if (typeof connection === "object" && connection !== null) return connection;
76
+ } catch {}
77
+ return {
78
+ host: process.env.QGRID_DB_HOST,
79
+ database: process.env.QGRID_DB_NAME
80
+ };
81
+ }
82
+ const MonitFrame = new MonitFrameClass();
83
+ //#endregion
84
+ export { MonitFrame };
85
+
86
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL21vbml0L21vbml0LmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9uaXQg4oCUIOuMgOyLnOuztOuTnCBNb25pdCDtg63smqkg7ZSE66Gc7IS47IqkIOuhnOq3uCDqtIDsuKEgQVBJLlxuICpcbiAqIOydveq4sCDsoITsmqkuIHJpbmcgYnVmZmVyIOulvCDslofqsowg7KeB7KCRIOydveycvOupsCjrspTsmqkg7L+866asIOq4sOqzhCDsl4bsnbQpLFxuICogcmVxdWVzdCBsb2cg66W8IOuCqOq4sOyngCDslYrripTri6QuIOygkeq3vCDqsr3qs4TripQg64uk66W4IOuMgOyLnOuztOuTnCBBUEkg7JmAIOuPmeydvO2VmOuLpC5cbiAqL1xuaW1wb3J0IHsgYXBpLCBCYXNlRnJhbWVDbGFzcywgREIgfSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuLi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBtb25pdExvZ0J1ZmZlciB9IGZyb20gXCIuL2xvZy1idWZmZXJcIjtcbmltcG9ydCB7IHR5cGUgTW9uaXRMb2dDaHVuaywgdHlwZSBNb25pdFNlcnZlckluZm8sIHR5cGUgTW9uaXRWaXRhbHMgfSBmcm9tIFwiLi9tb25pdC50eXBlc1wiO1xuXG4vLyDsnZHri7Xri7kg7JeU7Yq466asIOyDge2VnCDigJQg7Y+066eBIO2BtOudvOydtOyWuO2KuOuKlCDri6TsnYwg7Y+07JeQ7IScIOydtOyWtOyEnCDrlLDrnbzsnqHripTri6QuXG5jb25zdCBSRVNQT05TRV9FTlRSWV9MSU1JVCA9IDFfMDAwO1xuXG5jbGFzcyBNb25pdEZyYW1lQ2xhc3MgZXh0ZW5kcyBCYXNlRnJhbWVDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiTW9uaXRcIik7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBtb25pdExvZ3MoY3Vyc29yPzogbnVtYmVyKTogUHJvbWlzZTxNb25pdExvZ0NodW5rPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IG1vbml0TG9nQnVmZmVyLnByb2Nlc3NTdGFydGVkQXQsXG4gICAgICAuLi5tb25pdExvZ0J1ZmZlci5hZnRlcihjdXJzb3IsIFJFU1BPTlNFX0VOVFJZX0xJTUlUKSxcbiAgICAgIHZpdGFsczogY3VycmVudFZpdGFscygpLFxuICAgIH07XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KCV7KCBIOygleuztCDigJQg7Y+066eBIOu2iO2VhOyalCwg7Y6Y7J207KeA64u5IDHtmowg7KGw7ZqMLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBtb25pdEluZm8oKTogUHJvbWlzZTxNb25pdFNlcnZlckluZm8+IHtcbiAgICBjb25zdCBwb29sID0gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoKTtcbiAgICBjb25zdCBob3N0ID0gcHJvY2Vzcy5lbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9jZXNzLmVudi5QT1JUID8/IFwiNDQ5MDBcIjtcbiAgICBjb25zdCBjb25uID0gYWN0aXZlRGJDb25uZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZlclVybDogYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gLFxuICAgICAgZGJIb3N0OiBjb25uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIixcbiAgICAgIGRiTmFtZTogY29ubi5kYXRhYmFzZSA/PyBcInFncmlkXCIsXG4gICAgICBvcGVuYWk6IHtcbiAgICAgICAgbWluV29ya2Vyc1BlclRva2VuOiBwb29sLm1pbldvcmtlcnNQZXJUb2tlbixcbiAgICAgICAgbWF4V29ya2Vyc1BlclRva2VuOiBwb29sLm1heFdvcmtlcnNQZXJUb2tlbixcbiAgICAgICAgYXV0b3NjYWxlOiBwb29sLmF1dG9zY2FsZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vLyBkaXNwYXRjaGVyIOuvuOy0iOq4sO2ZlCjrtoDtjIUg7KeB7ZuEKSDsi5wgMCDsnLzroZwg7J2R64u17ZWc64ukIOKAlCDqsIDrsrzsmrQg7Iqk64OF7IO37J206528IOyYpOulmOuhnCDrp4zrk6Tsp4Ag7JWK64qU64ukLlxuZnVuY3Rpb24gY3VycmVudFZpdGFscygpOiBNb25pdFZpdGFscyB7XG4gIHJldHVybiB7XG4gICAgb3BlbmFpV29ya2VyQ291bnQ6IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudCA/PyAwLFxuICAgIG9wZW5haVJlYWR5V29ya2VyQ291bnQ6IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5yZWFkeVdvcmtlckNvdW50ID8/IDAsXG4gICAgb3BlbmFpUXVldWVMZW5ndGg6IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5xdWV1ZUxlbmd0aCA/PyAwLFxuICAgIG9wZW5haVdvcmtlcnNCeVRva2VuOiBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnRzQnlUb2tlbiA/PyBbXSxcbiAgICBhbnRocm9waWNUb2tlbkNvdW50OiBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwLFxuICAgIGFudGhyb3BpY1Rva2VuTmFtZXM6IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbk5hbWVzID8/IFtdLFxuICB9O1xufVxuXG4vLyDsi6TsoJwg7Zmc7ISxIGtuZXgg7Jew6rKw7JeQ7IScIOydveuKlOuLpCDigJQgZGV2IOyEnOuyhOydmCDthrXtlakg7YWM7Iqk7Yq4IOufrOuEiOqwgCBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FIOydhFxuLy8g7YWM7Iqk7Yq4IERCIOydtOumhOycvOuhnCDrja7slrTsk7Drr4DroZwgZW52IOuKlCDsi6DrorDtlaAg7IiYIOyXhuuLpC4gREIg66+47LSI6riw7ZmUKOu2gO2MhSDsoIQpIOyLnOyXkOunjCBlbnYg7Y+067CxLlxuZnVuY3Rpb24gYWN0aXZlRGJDb25uZWN0aW9uKCk6IHsgaG9zdD86IHN0cmluZzsgZGF0YWJhc2U/OiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IERCLmdldERCQ29uZmlnKFwid1wiKS5jb25uZWN0aW9uO1xuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbiA9PT0gXCJvYmplY3RcIiAmJiBjb25uZWN0aW9uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmc7IGRhdGFiYXNlPzogc3RyaW5nIH07XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBEQiBjb25maWcg66+47LSI6riw7ZmUIOKAlCBlbnYg7Y+067Cx7Jy866GcIOynhO2WiVxuICB9XG4gIHJldHVybiB7IGhvc3Q6IHByb2Nlc3MuZW52LlFHUklEX0RCX0hPU1QsIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FIH07XG59XG5cbmV4cG9ydCBjb25zdCBNb25pdEZyYW1lID0gbmV3IE1vbml0RnJhbWVDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU0sdUJBQXVCO0FBRTdCLElBQU0sa0JBQU4sY0FBOEIsZUFBZTtDQUMzQyxjQUFjO0FBQ1osUUFBTSxRQUFROztDQUdoQixNQUNNLFVBQVUsUUFBeUM7QUFDdkQsU0FBTztHQUNMLGtCQUFrQixlQUFlO0dBQ2pDLEdBQUcsZUFBZSxNQUFNLFFBQVEscUJBQXFCO0dBQ3JELFFBQVEsZUFBZTtHQUN4Qjs7Q0FJSCxNQUNNLFlBQXNDO0VBQzFDLE1BQU0sT0FBTywrQkFBK0I7RUFDNUMsTUFBTSxPQUFPLFFBQVEsSUFBSSxRQUFRO0VBQ2pDLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtFQUNqQyxNQUFNLE9BQU8sb0JBQW9CO0FBQ2pDLFNBQU87R0FDTCxXQUFXLFVBQVUsS0FBSyxHQUFHO0dBQzdCLFFBQVEsS0FBSyxRQUFRO0dBQ3JCLFFBQVEsS0FBSyxZQUFZO0dBQ3pCLFFBQVE7SUFDTixvQkFBb0IsS0FBSztJQUN6QixvQkFBb0IsS0FBSztJQUN6QixXQUFXLEtBQUs7SUFDakI7R0FDRjs7OztDQXpCRixJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGlCQUFpQjtFQUFFLENBQUM7Ozs7OztDQVVoRSxJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGlCQUFpQjtFQUFFLENBQUM7Ozs7O0FBb0JuRSxTQUFTLGdCQUE2QjtBQUNwQyxRQUFPO0VBQ0wsbUJBQW1CLGdCQUFnQixrQkFBa0IsZUFBZTtFQUNwRSx3QkFBd0IsZ0JBQWdCLGtCQUFrQixvQkFBb0I7RUFDOUUsbUJBQW1CLGdCQUFnQixrQkFBa0IsZUFBZTtFQUNwRSxzQkFBc0IsZ0JBQWdCLGtCQUFrQix1QkFBdUIsRUFBRTtFQUNqRixxQkFBcUIsZ0JBQWdCLHFCQUFxQixjQUFjO0VBQ3hFLHFCQUFxQixnQkFBZ0IscUJBQXFCLGNBQWMsRUFBRTtFQUMzRTs7QUFLSCxTQUFTLHFCQUEyRDtBQUNsRSxLQUFJO0VBQ0YsTUFBTSxhQUFhLEdBQUcsWUFBWSxJQUFJLENBQUM7QUFDdkMsTUFBSSxPQUFPLGVBQWUsWUFBWSxlQUFlLEtBQ25ELFFBQU87U0FFSDtBQUdSLFFBQU87RUFBRSxNQUFNLFFBQVEsSUFBSTtFQUFlLFVBQVUsUUFBUSxJQUFJO0VBQWU7O0FBR2pGLE1BQWEsYUFBYSxJQUFJLGlCQUFpQiJ9
@@ -0,0 +1,42 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { z } from "zod";
3
+ //#region src/application/monit/monit.types.ts
4
+ const MonitLogEntry = z.object({
5
+ seq: z.number(),
6
+ timestamp: z.number(),
7
+ level: z.string(),
8
+ category: z.array(z.string()),
9
+ text: z.string()
10
+ });
11
+ const MonitVitals = z.object({
12
+ openaiWorkerCount: z.number(),
13
+ openaiReadyWorkerCount: z.number(),
14
+ openaiQueueLength: z.number(),
15
+ openaiWorkersByToken: z.array(z.object({
16
+ name: z.string(),
17
+ count: z.number()
18
+ })),
19
+ anthropicTokenCount: z.number(),
20
+ anthropicTokenNames: z.array(z.string())
21
+ });
22
+ const MonitLogChunk = z.object({
23
+ processStartedAt: z.number(),
24
+ entries: z.array(MonitLogEntry),
25
+ nextCursor: z.number(),
26
+ dropped: z.number(),
27
+ vitals: MonitVitals
28
+ });
29
+ const MonitServerInfo = z.object({
30
+ serverUrl: z.string(),
31
+ dbHost: z.string(),
32
+ dbName: z.string(),
33
+ openai: z.object({
34
+ minWorkersPerToken: z.number(),
35
+ maxWorkersPerToken: z.number(),
36
+ autoscale: z.boolean()
37
+ })
38
+ });
39
+ //#endregion
40
+ export { MonitLogChunk, MonitLogEntry, MonitServerInfo, MonitVitals };
41
+
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXQudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL21vbml0L21vbml0LnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIOKUgOKUgOKUgCBNb25pdCAo7ZSE66Gc7IS47IqkIOuhnOq3uCDqtIDsuKEpIOKUgOKUgOKUgFxuLy9cbi8vIHRpbWVzdGFtcC9wcm9jZXNzU3RhcnRlZEF0IOydgCBlcG9jaCBtcyDsiKvsnpDri6QuIHdlYiDsoITsl60gZGF0ZVJldml2ZXIg6rCAIElTTyDrrLjsnpDsl7TsnYRcbi8vIERhdGUg66GcIOuzgO2ZmO2VmOuvgOuhnCwg7Iir7J6Q66eM7J20IOyerOyLnOyekSDqsJDsp4AocHJvY2Vzc1N0YXJ0ZWRBdCDrj5nrk7HshLEp7JmAIOy7pOyEnCDruYTqtZDrpbwg67O07KG07ZWc64ukLlxuLy8g7J20IO2MjOydvOydgCB3ZWIg7Jy866GcIOq3uOuMgOuhnCBzeW5jIOuQmOuvgOuhnCDshJzrsoQg7KCE7JqpIGltcG9ydCDrpbwg65GQ7KeAIOyViuuKlOuLpC5cblxuZXhwb3J0IGNvbnN0IE1vbml0TG9nRW50cnkgPSB6Lm9iamVjdCh7XG4gIHNlcTogei5udW1iZXIoKSxcbiAgdGltZXN0YW1wOiB6Lm51bWJlcigpLFxuICBsZXZlbDogei5zdHJpbmcoKSxcbiAgY2F0ZWdvcnk6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIHRleHQ6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIE1vbml0TG9nRW50cnkgPSB6LmluZmVyPHR5cGVvZiBNb25pdExvZ0VudHJ5PjtcblxuLy8g7Y+066eB7JeQIO2OuOyKue2VmOuKlCDrnbzsnbTruIwg7Lm07Jq07Yq4IOKAlCDquYrsnYAg7JuM7LukL+2BkCDsp4Tri6jsnYAgYXVkaXQg64yA7Iuc67O065OcKOuzhOuPhCnsnZgg66qr7J206rOgLFxuLy8g7Jes6riw64qUIFwi7KeA6riIIOuqhyDqsJwg64+M6rOgIO2BkOqwgCDsjJPsnbTrgphcIuunjCDqsIDrs43qsowg64u17ZWc64ukLlxuZXhwb3J0IGNvbnN0IE1vbml0Vml0YWxzID0gei5vYmplY3Qoe1xuICBvcGVuYWlXb3JrZXJDb3VudDogei5udW1iZXIoKSxcbiAgb3BlbmFpUmVhZHlXb3JrZXJDb3VudDogei5udW1iZXIoKSxcbiAgb3BlbmFpUXVldWVMZW5ndGg6IHoubnVtYmVyKCksXG4gIC8vIO2GoO2BsOuzhCDtmITsnqwg7JuM7LukIOyImCDigJQgYXV0b3NjYWxlIOuhnCDripjqs6Ag7KO864qUIOqyg+ydhCDthqDtgbAg64uo7JyE66GcIOuzuOuLpFxuICBvcGVuYWlXb3JrZXJzQnlUb2tlbjogei5hcnJheSh6Lm9iamVjdCh7IG5hbWU6IHouc3RyaW5nKCksIGNvdW50OiB6Lm51bWJlcigpIH0pKSxcbiAgYW50aHJvcGljVG9rZW5Db3VudDogei5udW1iZXIoKSxcbiAgLy8gZnJlc2gtc3Bhd24g7J206528IOybjOy7pCDsiJjripQg7JeG64ukIOKAlCDtkoDsl5Ag7Ja065akIO2GoO2BsOydtCDsnojripTsp4Drp4wg67O07Jes7KSA64ukXG4gIGFudGhyb3BpY1Rva2VuTmFtZXM6IHouYXJyYXkoei5zdHJpbmcoKSksXG59KTtcbmV4cG9ydCB0eXBlIE1vbml0Vml0YWxzID0gei5pbmZlcjx0eXBlb2YgTW9uaXRWaXRhbHM+O1xuXG5leHBvcnQgY29uc3QgTW9uaXRMb2dDaHVuayA9IHoub2JqZWN0KHtcbiAgcHJvY2Vzc1N0YXJ0ZWRBdDogei5udW1iZXIoKSxcbiAgZW50cmllczogei5hcnJheShNb25pdExvZ0VudHJ5KSxcbiAgbmV4dEN1cnNvcjogei5udW1iZXIoKSxcbiAgLy8g7Zi47Lac7J6Q7J2YIOy7pOyEnOqwgCBidWZmZXIgZXZpY3Rpb24g7JeQIOuwgOugpCDsnKDsi6TrkJwg65287J24IOyImFxuICBkcm9wcGVkOiB6Lm51bWJlcigpLFxuICB2aXRhbHM6IE1vbml0Vml0YWxzLFxufSk7XG5leHBvcnQgdHlwZSBNb25pdExvZ0NodW5rID0gei5pbmZlcjx0eXBlb2YgTW9uaXRMb2dDaHVuaz47XG5cbi8vIO2UhOuhnOyEuOyKpCDri6jsnIQg7KCV7KCBIO2ZmOqyvSDsoJXrs7Qg4oCUIOyWtOuKkCDshJzrsoQvREIg66W8IOuztOqzoCDsnojripTsp4Ag7ZWc64iI7JeQIO2ZleyduO2VmOuKlCDsmqnrj4QuXG4vLyDruYTrsIDqsJIoREIg67mE67CA67KI7Zi4LCDthqDtgbAp7J2AIOygiOuMgCDsi6Psp4Ag7JWK64qU64ukLlxuZXhwb3J0IGNvbnN0IE1vbml0U2VydmVySW5mbyA9IHoub2JqZWN0KHtcbiAgc2VydmVyVXJsOiB6LnN0cmluZygpLFxuICBkYkhvc3Q6IHouc3RyaW5nKCksXG4gIGRiTmFtZTogei5zdHJpbmcoKSxcbiAgb3BlbmFpOiB6Lm9iamVjdCh7XG4gICAgbWluV29ya2Vyc1BlclRva2VuOiB6Lm51bWJlcigpLFxuICAgIG1heFdvcmtlcnNQZXJUb2tlbjogei5udW1iZXIoKSxcbiAgICBhdXRvc2NhbGU6IHouYm9vbGVhbigpLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgTW9uaXRTZXJ2ZXJJbmZvID0gei5pbmZlcjx0eXBlb2YgTW9uaXRTZXJ2ZXJJbmZvPjtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBUUEsTUFBYSxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3BDLEtBQUssRUFBRSxRQUFRO0NBQ2YsV0FBVyxFQUFFLFFBQVE7Q0FDckIsT0FBTyxFQUFFLFFBQVE7Q0FDakIsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7Q0FDN0IsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUtGLE1BQWEsY0FBYyxFQUFFLE9BQU87Q0FDbEMsbUJBQW1CLEVBQUUsUUFBUTtDQUM3Qix3QkFBd0IsRUFBRSxRQUFRO0NBQ2xDLG1CQUFtQixFQUFFLFFBQVE7Q0FFN0Isc0JBQXNCLEVBQUUsTUFBTSxFQUFFLE9BQU87RUFBRSxNQUFNLEVBQUUsUUFBUTtFQUFFLE9BQU8sRUFBRSxRQUFRO0VBQUUsQ0FBQyxDQUFDO0NBQ2hGLHFCQUFxQixFQUFFLFFBQVE7Q0FFL0IscUJBQXFCLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQztDQUN6QyxDQUFDO0FBR0YsTUFBYSxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3BDLGtCQUFrQixFQUFFLFFBQVE7Q0FDNUIsU0FBUyxFQUFFLE1BQU0sY0FBYztDQUMvQixZQUFZLEVBQUUsUUFBUTtDQUV0QixTQUFTLEVBQUUsUUFBUTtDQUNuQixRQUFRO0NBQ1QsQ0FBQztBQUtGLE1BQWEsa0JBQWtCLEVBQUUsT0FBTztDQUN0QyxXQUFXLEVBQUUsUUFBUTtDQUNyQixRQUFRLEVBQUUsUUFBUTtDQUNsQixRQUFRLEVBQUUsUUFBUTtDQUNsQixRQUFRLEVBQUUsT0FBTztFQUNmLG9CQUFvQixFQUFFLFFBQVE7RUFDOUIsb0JBQW9CLEVBQUUsUUFBUTtFQUM5QixXQUFXLEVBQUUsU0FBUztFQUN2QixDQUFDO0NBQ0gsQ0FBQyJ9
@@ -1,6 +1,6 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
- import { createHash, randomBytes } from "node:crypto";
3
2
  import { getLogger } from "@logtape/logtape";
3
+ import { createHash, randomBytes } from "node:crypto";
4
4
  //#region src/application/qgrid/oauth.ts
5
5
  /**
6
6
  * OAuth 유틸 — Claude Code 소스의 OAuth 플로우 그대로 재현
@@ -1,9 +1,9 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
- import { decideConvRouting, issueConvContext } from "./conv-routing.js";
3
- import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
2
+ import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
4
3
  import { getAccessToken } from "../../utils/providers/common/credentials.js";
4
+ import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
5
5
  import { strictify } from "../../utils/providers/common/strictifier.js";
6
- import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
6
+ import { decideConvRouting, issueConvContext } from "./conv-routing.js";
7
7
  import { applyToolCallEmulation, buildToolCallSchema } from "./tool-emulation.js";
8
8
  //#region src/application/qgrid/qgrid.dispatcher.ts
9
9
  var QgridDispatcherClass = class {
@@ -1,19 +1,19 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
- import { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
3
- import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
4
- import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
2
+ import { StreamEvents } from "./qgrid.types.js";
5
3
  import { __decorateMetadata } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js";
6
4
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
7
- import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
8
- import { afterQuery, beforeQuery, finishRunAborted, finishRunWithError } from "./qgrid-run-lifecycle.js";
5
+ import { TokenModel } from "../token/token.model.js";
6
+ import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
9
7
  import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
10
- import { StreamEvents } from "./qgrid.types.js";
11
8
  import { QgridDispatcher } from "./qgrid.dispatcher.js";
12
- import { TokenModel } from "../token/token.model.js";
9
+ import { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
10
+ import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
11
+ import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
12
+ import { afterQuery, beforeQuery, finishRunAborted, finishRunWithError } from "./qgrid-run-lifecycle.js";
13
13
  import { TokenCredentials } from "../token/token.types.js";
14
- import crypto from "node:crypto";
15
- import { getLogger } from "@logtape/logtape";
16
14
  import { BadRequestException, BaseFrameClass, Sonamu, api, stream } from "sonamu";
15
+ import { getLogger } from "@logtape/logtape";
16
+ import crypto from "node:crypto";
17
17
  import { getCacheManagerRef } from "sonamu/cache";
18
18
  //#region src/application/qgrid/qgrid.frame.ts
19
19
  var _ref;
@@ -379,11 +379,13 @@ var QgridFrameClass = class extends BaseFrameClass {
379
379
  provider: "openai",
380
380
  fiveHour: rl?.primary ? {
381
381
  utilization: rl.primary.usedPercent,
382
- resetsAt: unixSecondsToIso(rl.primary.resetsAt)
382
+ resetsAt: unixSecondsToIso(rl.primary.resetsAt),
383
+ windowDurationMins: rl.primary.windowDurationMins
383
384
  } : null,
384
385
  sevenDay: rl?.secondary ? {
385
386
  utilization: rl.secondary.usedPercent,
386
- resetsAt: unixSecondsToIso(rl.secondary.resetsAt)
387
+ resetsAt: unixSecondsToIso(rl.secondary.resetsAt),
388
+ windowDurationMins: rl.secondary.windowDurationMins
387
389
  } : null
388
390
  };
389
391
  } catch (e) {
@@ -617,4 +619,4 @@ function convertAnthropicUsage(raw) {
617
619
  //#endregion
618
620
  export { QgridFrame };
619
621
 
620
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEFudGhyb3BpY1VzYWdlUmF3LFxuICBidWlsZEF1dGhVcmwsXG4gIGV4Y2hhbmdlQ29kZUZvclRva2VucyxcbiAgZmV0Y2hVc2FnZSxcbiAgZ2VuZXJhdGVQS0NFLFxuICByZWZyZXNoQWNjZXNzVG9rZW4sXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMsXG4gIGZvcm1hdFJlc3BvbnNlRm9yTG9nLFxuICBnZXRJbWFnZVBhcnRzLFxufSBmcm9tIFwiLi9xZ3JpZC1yZXNwb25zZS1mb3JtYXRcIjtcbmltcG9ydCB7XG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9nTW9kZSA9IGFyZ3MubG9nTW9kZSA/PyAoYXJncy5pc1N0ZXAgPyBcInJ1blwiIDogXCJhdXRvXCIpO1xuXG4gICAgLy8gbG9nTW9kZTogXCJydW5cIiDihpIg7ISc67KE6rCAIGxpZmVjeWNsZSDqtIDrpqxcbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIikge1xuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgLy8gbGlmZWN5Y2xlLnJ1bkNvbnRleHQocmVxdWVzdExvZ0lkKSDsmYAgZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZENvb3JkIOulvCDrs5HtlakuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHJ1bkNvbnRleHQ6IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkOiByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvZ01vZGU6IFwiYXV0b1wiICjquLDsobQgbm9uLXN0ZXAg6rK966GcKSDrmJDripQgXCJub25lXCJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcblxuICAgIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5zYXZlQXV0b1JlcXVlc3RMb2coYXJncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gbG9nTW9kZSBcImF1dG9cIiDri6jsnbwg7JqU7LKtIOuhnOq5hTogcnVuIGxpZmVjeWNsZShzdGVwIOu2hO2VtCkg7JeG7J20IHJlcXVlc3RfbG9nIDHqsbTrp4wg64Ko6ri064ukLlxuICAvLyBxdWVyeeyZgCBxdWVyeVN0cmVhbSDslpHsqr3sl5DshJwg7IKs7JqpLlxuICBwcml2YXRlIHNhdmVBdXRvUmVxdWVzdExvZyhhcmdzOiBRdWVyeUlucHV0LCByZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogdm9pZCB7XG4gICAgY29uc3QgaW1hZ2VQYXJ0cyA9IGdldEltYWdlUGFydHMocmVzdWx0KTtcbiAgICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgICAgcmVzdWx0LFxuICAgICAgYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICk7XG4gICAgY29uc3QgdG9vbENhbGxDb3VudCA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcInRvb2wtY2FsbFwiKS5sZW5ndGg7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KTtcblxuICAgIFJlcXVlc3RMb2dNb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lPy5sZW5ndGggPyBhcmdzLnByb2plY3ROYW1lIDogbnVsbCxcbiAgICAgICAgbW9kZWxfbmFtZTogcmVzdWx0Lm1vZGVsID8/IG51bGwsXG4gICAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRfbXM6IHJlc3VsdC50dGZ0TXMsXG4gICAgICAgIGNvc3RfdXNkOiByZXN1bHQuY29zdFVzZCAhPT0gbnVsbCA/IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiBNSUNST19VU0QpIDogbnVsbCxcbiAgICAgICAgaW1hZ2VfY29zdF91c2Q6IGltYWdlQ29zdE1pY3JvVXNkLFxuICAgICAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgICAgICBpbWFnZUNvc3RNaWNyb1VzZCAhPT0gbnVsbFxuICAgICAgICAgICAgPyBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZWZmb3J0OiBhcmdzLmVmZm9ydCA/PyBudWxsLFxuICAgICAgICAvLyBtYWxmb3JtZWQgaGlzdG9yeeqwgCDsmYDrj4Qg7ISx6rO17ZWcIO2EtCjtirntnoggc3RyZWFtIHNzZS5lbmQoKSnsnYQg6rmo7KeAIOyViuuPhOuhnSDrsKnslrQuXG4gICAgICAgIGhpc3Rvcnk6ICgoKTogeyB0eXBlOiBzdHJpbmcgfVtdIHwgbnVsbCA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzLmhpc3RvcnkgPyBKU09OLnBhcnNlKGFyZ3MuaGlzdG9yeSkgOiBudWxsO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgICAgIHRvb2xfY2FsbF9jb3VudDogdG9vbENhbGxDb3VudCxcbiAgICAgICAgLy8g7J2066+47KeAIHR1cm4g7Iud67OEKFIxMyk6IHF1b3RhIOyGjOuqqOulvCDsnbTrr7jsp4Ag7JuM7YGs66Gc65Oc7JeQIOq3gOyGjS5cbiAgICAgICAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogYXJncy5pbWFnZUdlbmVyYXRpb24gPz8gZmFsc2UsXG4gICAgICB9LFxuICAgIF0pXG4gICAgICAudGhlbihhc3luYyAoaWRzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGlkc1swXTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0TG9nSWQgfHwgaW1hZ2VQYXJ0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIGJ1aWxkSW1hZ2VHZW5lcmF0aW9uVG9vbFN0ZXBzKGFyZ3MsIGltYWdlUGFydHMsIDApKSB7XG4gICAgICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLmVycm9yKGByZXF1ZXN0TG9nIHNhdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZUxvZ01vZGUgPSBhcmdzLmxvZ01vZGUgPz8gKGFyZ3MuaXNTdGVwID8gXCJydW5cIiA6IFwiYXV0b1wiKTtcbiAgICBjb25zdCBzaG91bGRMb2cgPSBlZmZlY3RpdmVMb2dNb2RlID09PSBcInJ1blwiO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNob3VsZExvZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVuSW5mbyA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBiZWZvcmVRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHR1cm5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgaW50ZXJydXB0T3BlbkFJID0gKCkgPT4ge1xuICAgICAgaWYgKHRocmVhZElkICYmIHR1cm5JZCkge1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5U3RyZWFtKFxuICAgICAgICBhcmdzLFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogKHRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRocmVhZElkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICAgIGlmIChzc2UuY2xvc2VkICYmIHRocmVhZElkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGcIChhdXRvL3J1biDqs7XthrXsnLzroZwg7YG065287JeQIO2ajOyGoe2VtOyVvCDtlagpLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShcbiAgICAgICAgICAgIHJ1bkluZm8ucmVxdWVzdExvZ0lkLFxuICAgICAgICAgICAgcnVuSW5mby5zdGVwSW5kZXgsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgc3RyZWFtUmVzdWx0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuQ29udGV4dCA9IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgICAvLyBydW4gbGlmZWN5Y2xl7J2EIOyViCDtg4DripQg64uo7J28IHN0cmVhbSDsmpTssq3rj4QgcmVxdWVzdF9sb2cgMeqxtOydgCDrgqjquLTri6QgKHF1ZXJ57JmAIOuMgOy5rSkuXG4gICAgICAgIHRoaXMuc2F2ZUF1dG9SZXF1ZXN0TG9nKGFyZ3MsIHN0cmVhbVJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAoc3NlLmNsb3NlZCAmJiBzdHJlYW1FcnJvci5tZXNzYWdlID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgc3RyZWFtRXJyb3IubWVzc2FnZSwgYXJncyk7XG4gICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoc3NlLmNsb3NlZCAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgcHJvamVjdF9uYW1lOiBpbnB1dC5wcm9qZWN0TmFtZSxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGlucHV0LnN5c3RlbVByb21wdCxcbiAgICAgIGhpc3Rvcnk6IGlucHV0Lmhpc3RvcnkgPyBKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHJlcXVlc3RMb2dJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGFwcGVuZFN0ZXAoaW5wdXQ6IEFwcGVuZFN0ZXBJbnB1dCk6IFByb21pc2U8eyBzdGVwSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RlcElkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAoaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGVwX2luZGV4OiBpbnB1dC5zdGVwSW5kZXgsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0Lm91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBpbnB1dC5jYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IFRva2VuTW9kZWwudXBkYXRlRmllbGRzKGlkLCBwYXRjaCk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdXBkYXRlZCA+IDAgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBnZXRPQXV0aFJlZGlyZWN0VXJpKCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgICBjb2RlLFxuICAgICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBlbmRpbmcucmVkaXJlY3RVcmksXG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5zLmFjY291bnRVdWlkKSB7XG4gICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgIFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHRva2Vucy5leHBpcmVzQXQgPz8gMCxcbiAgICAgICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgaWYgKCFRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RhcnRCcm93c2VyTG9naW4obmFtZSk7XG5cbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQ6IGNvZGV4IGxvZ2luIOyZhOujjCDrjIDquLAg4oaSIO2GoO2BsCDsoIDsnqVcbiAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgLmNvbXBsZXRlQnJvd3NlckxvZ2luKClcbiAgICAgIC50aGVuKGFzeW5jIChjcmVkcykgPT4ge1xuICAgICAgICBpZiAoY3JlZHMuYWNjb3VudElkKSB7XG4gICAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgICBcIkFcIixcbiAgICAgICAgICAgIFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgaWRUb2tlbjogY3JlZHMuaWRUb2tlbixcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2V2ZW5EYXk6IHJsPy5zZWNvbmRhcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5zZWNvbmRhcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwuc2Vjb25kYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgaWYgKHJhdy5lcnJvciAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAocmV0cmllZC5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJldHJpZWQuZXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyZXRyaWVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJhdy5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJhdy5lcnJvciB9O1xuICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzO1xuICAgIGNvbnN0IHJ0ID0gZ2V0UmVmcmVzaFRva2VuKGNyZWRzKTtcbiAgICBpZiAoIXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgY29uc3QgdXBkYXRlZCA9IFRva2VuQ3JlZGVudGlhbHMucGFyc2Uoe1xuICAgICAgLi4uY3JlZHMsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoZWQucmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0F0OiByZWZyZXNoZWQuZXhwaXJlc0F0LFxuICAgIH0pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgcHJvdmlkZXI6IHRva2VuLnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogdXBkYXRlZCxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgYWN0aXZlVG9rZW5zOiBRZ3JpZERpc3BhdGNoZXIudG9rZW5zLnNpemUsXG4gICAgICBzdWJzY3JpYmVyOiBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcj8uc3RhdHVzKCkgPz8gbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZEZyYW1lID0gbmV3IFFncmlkRnJhbWVDbGFzcygpO1xuXG5mdW5jdGlvbiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3OiBBbnRocm9waWNVc2FnZVJhdyk6IFVzYWdlUmVzcG9uc2Uge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgIGZpdmVIb3VyOiByYXcuZml2ZV9ob3VyXG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5maXZlX2hvdXIudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuZml2ZV9ob3VyLnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gICAgc2V2ZW5EYXk6IHJhdy5zZXZlbl9kYXlcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LnNldmVuX2RheS51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5zZXZlbl9kYXkucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQSxNQUFNLGlDQUFpQixJQUFJLEtBQXlCO0FBR3BELE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBRXhCLFNBQVMsaUJBQWlCLFNBQW1EO0FBQzNFLFFBQU8sT0FBTyxZQUFZLDRCQUFXLElBQUksS0FBSyxVQUFVLElBQUssRUFBQyxhQUFhLEdBQUc7O0FBR2hGLGVBQWUsY0FBYyxPQUFlLE1BQW1DO0NBQzdFLE1BQU0sUUFBUSxvQkFBb0I7QUFDbEMsS0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0sK0JBQStCO0FBQzNELE9BQU0sTUFBTSxJQUFJO0VBQ2QsS0FB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
622
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEFudGhyb3BpY1VzYWdlUmF3LFxuICBidWlsZEF1dGhVcmwsXG4gIGV4Y2hhbmdlQ29kZUZvclRva2VucyxcbiAgZmV0Y2hVc2FnZSxcbiAgZ2VuZXJhdGVQS0NFLFxuICByZWZyZXNoQWNjZXNzVG9rZW4sXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMsXG4gIGZvcm1hdFJlc3BvbnNlRm9yTG9nLFxuICBnZXRJbWFnZVBhcnRzLFxufSBmcm9tIFwiLi9xZ3JpZC1yZXNwb25zZS1mb3JtYXRcIjtcbmltcG9ydCB7XG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9nTW9kZSA9IGFyZ3MubG9nTW9kZSA/PyAoYXJncy5pc1N0ZXAgPyBcInJ1blwiIDogXCJhdXRvXCIpO1xuXG4gICAgLy8gbG9nTW9kZTogXCJydW5cIiDihpIg7ISc67KE6rCAIGxpZmVjeWNsZSDqtIDrpqxcbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIikge1xuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgLy8gbGlmZWN5Y2xlLnJ1bkNvbnRleHQocmVxdWVzdExvZ0lkKSDsmYAgZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZENvb3JkIOulvCDrs5HtlakuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHJ1bkNvbnRleHQ6IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkOiByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvZ01vZGU6IFwiYXV0b1wiICjquLDsobQgbm9uLXN0ZXAg6rK966GcKSDrmJDripQgXCJub25lXCJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcblxuICAgIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5zYXZlQXV0b1JlcXVlc3RMb2coYXJncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gbG9nTW9kZSBcImF1dG9cIiDri6jsnbwg7JqU7LKtIOuhnOq5hTogcnVuIGxpZmVjeWNsZShzdGVwIOu2hO2VtCkg7JeG7J20IHJlcXVlc3RfbG9nIDHqsbTrp4wg64Ko6ri064ukLlxuICAvLyBxdWVyeeyZgCBxdWVyeVN0cmVhbSDslpHsqr3sl5DshJwg7IKs7JqpLlxuICBwcml2YXRlIHNhdmVBdXRvUmVxdWVzdExvZyhhcmdzOiBRdWVyeUlucHV0LCByZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogdm9pZCB7XG4gICAgY29uc3QgaW1hZ2VQYXJ0cyA9IGdldEltYWdlUGFydHMocmVzdWx0KTtcbiAgICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgICAgcmVzdWx0LFxuICAgICAgYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICk7XG4gICAgY29uc3QgdG9vbENhbGxDb3VudCA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcInRvb2wtY2FsbFwiKS5sZW5ndGg7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KTtcblxuICAgIFJlcXVlc3RMb2dNb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lPy5sZW5ndGggPyBhcmdzLnByb2plY3ROYW1lIDogbnVsbCxcbiAgICAgICAgbW9kZWxfbmFtZTogcmVzdWx0Lm1vZGVsID8/IG51bGwsXG4gICAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRfbXM6IHJlc3VsdC50dGZ0TXMsXG4gICAgICAgIGNvc3RfdXNkOiByZXN1bHQuY29zdFVzZCAhPT0gbnVsbCA/IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiBNSUNST19VU0QpIDogbnVsbCxcbiAgICAgICAgaW1hZ2VfY29zdF91c2Q6IGltYWdlQ29zdE1pY3JvVXNkLFxuICAgICAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgICAgICBpbWFnZUNvc3RNaWNyb1VzZCAhPT0gbnVsbFxuICAgICAgICAgICAgPyBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZWZmb3J0OiBhcmdzLmVmZm9ydCA/PyBudWxsLFxuICAgICAgICAvLyBtYWxmb3JtZWQgaGlzdG9yeeqwgCDsmYDrj4Qg7ISx6rO17ZWcIO2EtCjtirntnoggc3RyZWFtIHNzZS5lbmQoKSnsnYQg6rmo7KeAIOyViuuPhOuhnSDrsKnslrQuXG4gICAgICAgIGhpc3Rvcnk6ICgoKTogeyB0eXBlOiBzdHJpbmcgfVtdIHwgbnVsbCA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzLmhpc3RvcnkgPyBKU09OLnBhcnNlKGFyZ3MuaGlzdG9yeSkgOiBudWxsO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgICAgIHRvb2xfY2FsbF9jb3VudDogdG9vbENhbGxDb3VudCxcbiAgICAgICAgLy8g7J2066+47KeAIHR1cm4g7Iud67OEKFIxMyk6IHF1b3RhIOyGjOuqqOulvCDsnbTrr7jsp4Ag7JuM7YGs66Gc65Oc7JeQIOq3gOyGjS5cbiAgICAgICAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogYXJncy5pbWFnZUdlbmVyYXRpb24gPz8gZmFsc2UsXG4gICAgICB9LFxuICAgIF0pXG4gICAgICAudGhlbihhc3luYyAoaWRzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGlkc1swXTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0TG9nSWQgfHwgaW1hZ2VQYXJ0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIGJ1aWxkSW1hZ2VHZW5lcmF0aW9uVG9vbFN0ZXBzKGFyZ3MsIGltYWdlUGFydHMsIDApKSB7XG4gICAgICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLmVycm9yKGByZXF1ZXN0TG9nIHNhdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBwcmVwYXJlU3RyZWFtKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHsgc3RyZWFtSWQ6IHN0cmluZyB9PiB7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZUxvZ01vZGUgPSBhcmdzLmxvZ01vZGUgPz8gKGFyZ3MuaXNTdGVwID8gXCJydW5cIiA6IFwiYXV0b1wiKTtcbiAgICBjb25zdCBzaG91bGRMb2cgPSBlZmZlY3RpdmVMb2dNb2RlID09PSBcInJ1blwiO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNob3VsZExvZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVuSW5mbyA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBiZWZvcmVRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHR1cm5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgaW50ZXJydXB0T3BlbkFJID0gKCkgPT4ge1xuICAgICAgaWYgKHRocmVhZElkICYmIHR1cm5JZCkge1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5U3RyZWFtKFxuICAgICAgICBhcmdzLFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogKHRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRocmVhZElkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICAgIGlmIChzc2UuY2xvc2VkICYmIHRocmVhZElkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGcIChhdXRvL3J1biDqs7XthrXsnLzroZwg7YG065287JeQIO2ajOyGoe2VtOyVvCDtlagpLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShcbiAgICAgICAgICAgIHJ1bkluZm8ucmVxdWVzdExvZ0lkLFxuICAgICAgICAgICAgcnVuSW5mby5zdGVwSW5kZXgsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgc3RyZWFtUmVzdWx0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuQ29udGV4dCA9IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgICAvLyBydW4gbGlmZWN5Y2xl7J2EIOyViCDtg4DripQg64uo7J28IHN0cmVhbSDsmpTssq3rj4QgcmVxdWVzdF9sb2cgMeqxtOydgCDrgqjquLTri6QgKHF1ZXJ57JmAIOuMgOy5rSkuXG4gICAgICAgIHRoaXMuc2F2ZUF1dG9SZXF1ZXN0TG9nKGFyZ3MsIHN0cmVhbVJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAoc3NlLmNsb3NlZCAmJiBzdHJlYW1FcnJvci5tZXNzYWdlID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgc3RyZWFtRXJyb3IubWVzc2FnZSwgYXJncyk7XG4gICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoc3NlLmNsb3NlZCAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgcHJvamVjdF9uYW1lOiBpbnB1dC5wcm9qZWN0TmFtZSxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGlucHV0LnN5c3RlbVByb21wdCxcbiAgICAgIGhpc3Rvcnk6IGlucHV0Lmhpc3RvcnkgPyBKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHJlcXVlc3RMb2dJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGFwcGVuZFN0ZXAoaW5wdXQ6IEFwcGVuZFN0ZXBJbnB1dCk6IFByb21pc2U8eyBzdGVwSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RlcElkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAoaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGVwX2luZGV4OiBpbnB1dC5zdGVwSW5kZXgsXG4gICAgICB0eXBlOiBpbnB1dC50eXBlLFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC5pbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0Lm91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBpbnB1dC5jYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IFRva2VuTW9kZWwudXBkYXRlRmllbGRzKGlkLCBwYXRjaCk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdXBkYXRlZCA+IDAgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBnZXRPQXV0aFJlZGlyZWN0VXJpKCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgICBjb2RlLFxuICAgICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBlbmRpbmcucmVkaXJlY3RVcmksXG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5zLmFjY291bnRVdWlkKSB7XG4gICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgIFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHRva2Vucy5leHBpcmVzQXQgPz8gMCxcbiAgICAgICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgaWYgKCFRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RhcnRCcm93c2VyTG9naW4obmFtZSk7XG5cbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQ6IGNvZGV4IGxvZ2luIOyZhOujjCDrjIDquLAg4oaSIO2GoO2BsCDsoIDsnqVcbiAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgLmNvbXBsZXRlQnJvd3NlckxvZ2luKClcbiAgICAgIC50aGVuKGFzeW5jIChjcmVkcykgPT4ge1xuICAgICAgICBpZiAoY3JlZHMuYWNjb3VudElkKSB7XG4gICAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgICBcIkFcIixcbiAgICAgICAgICAgIFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgaWRUb2tlbjogY3JlZHMuaWRUb2tlbixcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwucHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwuc2Vjb25kYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgaWYgKHJhdy5lcnJvciAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAocmV0cmllZC5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJldHJpZWQuZXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyZXRyaWVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJhdy5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJhdy5lcnJvciB9O1xuICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzO1xuICAgIGNvbnN0IHJ0ID0gZ2V0UmVmcmVzaFRva2VuKGNyZWRzKTtcbiAgICBpZiAoIXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgY29uc3QgdXBkYXRlZCA9IFRva2VuQ3JlZGVudGlhbHMucGFyc2Uoe1xuICAgICAgLi4uY3JlZHMsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoZWQucmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0F0OiByZWZyZXNoZWQuZXhwaXJlc0F0LFxuICAgIH0pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgcHJvdmlkZXI6IHRva2VuLnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogdXBkYXRlZCxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgYWN0aXZlVG9rZW5zOiBRZ3JpZERpc3BhdGNoZXIudG9rZW5zLnNpemUsXG4gICAgICBzdWJzY3JpYmVyOiBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcj8uc3RhdHVzKCkgPz8gbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZEZyYW1lID0gbmV3IFFncmlkRnJhbWVDbGFzcygpO1xuXG5mdW5jdGlvbiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3OiBBbnRocm9waWNVc2FnZVJhdyk6IFVzYWdlUmVzcG9uc2Uge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgIGZpdmVIb3VyOiByYXcuZml2ZV9ob3VyXG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5maXZlX2hvdXIudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuZml2ZV9ob3VyLnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gICAgc2V2ZW5EYXk6IHJhdy5zZXZlbl9kYXlcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LnNldmVuX2RheS51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5zZXZlbl9kYXkucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQSxNQUFNLGlDQUFpQixJQUFJLEtBQXlCO0FBR3BELE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBRXhCLFNBQVMsaUJBQWlCLFNBQW1EO0FBQzNFLFFBQU8sT0FBTyxZQUFZLDRCQUFXLElBQUksS0FBSyxVQUFVLElBQUssRUFBQyxhQUFhLEdBQUc7O0FBR2hGLGVBQWUsY0FBYyxPQUFlLE1BQW1DO0NBQzdFLE1BQU0sUUFBUSxvQkFBb0I7QUFDbEMsS0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0sK0JBQStCO0FBQzNELE9BQU0sTUFBTSxJQUFJO0VBQ2QsS0FBSyxHQUFHLHFCQUFxQjtFQUM3QixPQUFPLEtBQUssVUFBVSxLQUFLO0VBQzNCLEtBQUs7RUFDTixDQUFDOztBQUdKLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsb0JBQW9CO0FBQ2xDLEtBQUksQ0FBQyxNQUFPLE9BQU0sSUFBSSxNQUFNLCtCQUErQjtDQUMzRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFNBQVMsQ0FBQztBQUM3RSxLQUFJLENBQUMsSUFBSyxRQUFPO0FBQ2pCLFFBQU8sS0FBSyxNQUFNLElBQUk7O0FBR3hCLGVBQWUsaUJBQWlCLE9BQThCO0NBQzVELE1BQU0sUUFBUSxvQkFBb0I7QUFDbEMsS0FBSSxDQUFDLE1BQU87QUFDWixPQUFNLE1BQU0sT0FBTyxFQUFFLEtBQUssR0FBRyxxQkFBcUIsU0FBUyxDQUFDOztBQUc5RCxTQUFTLHNCQUE4QjtDQUNyQyxNQUFNLGdCQUFnQixRQUFRLElBQUksdUJBQXVCLFFBQVEsUUFBUSxHQUFHO0FBQzVFLEtBQUksY0FBZSxRQUFPLEdBQUcsY0FBYztBQUczQyxRQUFPLG9CQURZLFFBQVEsSUFBSSxRQUFRLFFBQ0Q7O0FBR3hDLFNBQVMsNEJBQTRCLE1BQXdCO0FBQzNELEtBQUksQ0FBQyxLQUFLLGdCQUFpQjtBQUMzQixPQUFNLElBQUksb0JBQ1IsMEZBQ0Q7O0FBR0gsTUFBTSxTQUFTLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFDbkMsTUFBTSxjQUFjLFVBQVUsQ0FBQyxTQUFTLFFBQVEsQ0FBQztBQUVqRCxJQUFNLGtCQUFOLGNBQThCLGVBQWU7Q0FDM0MsY0FBYztBQUNaLFFBQU0sUUFBUTs7Q0FHaEIsTUFDTSxNQUFNLE1BQXdDO0VBQ2xELE1BQU0sbUJBQW1CLEtBQUssWUFBWSxLQUFLLFNBQVMsUUFBUTtBQUdoRSxNQUFJLHFCQUFxQixPQUFPO0dBQzlCLE1BQU0sRUFBRSxjQUFjLGNBQWMsTUFBTSxZQUFZLEtBQUs7QUFDM0QsT0FBSTtJQUNGLE1BQU0sU0FBUyxNQUFNLGdCQUFnQixNQUFNLE1BQU0sS0FBSyxRQUFRO0lBQzlELE1BQU0sWUFBWSxNQUFNLFdBQVcsY0FBYyxXQUFXLE1BQU0sT0FBTztBQUV6RSxXQUFPO0tBQ0wsR0FBRztLQUNILFlBQVk7TUFBRSxHQUFHLFVBQVU7TUFBWSxhQUFhLE9BQU8sWUFBWTtNQUFhO0tBQ3JGO1lBQ00sR0FBRztBQUNWLFVBQU0sbUJBQW1CLGNBQWUsRUFBWSxTQUFTLEtBQUs7QUFDbEUsVUFBTTs7O0VBS1YsTUFBTSxTQUFTLE1BQU0sZ0JBQWdCLE1BQU0sTUFBTSxLQUFLLFFBQVE7QUFFOUQsTUFBSSxxQkFBcUIsT0FDdkIsTUFBSyxtQkFBbUIsTUFBTSxPQUFPO0FBR3ZDLFNBQU87O0NBS1QsbUJBQTJCLE1BQWtCLFFBQTJCO0VBQ3RFLE1BQU0sYUFBYSxjQUFjLE9BQU87RUFDeEMsTUFBTSxvQkFBb0Isb0NBQ3hCLFFBQ0EsS0FBSyx1QkFDTjtFQUNELE1BQU0sZ0JBQWdCLE9BQU8sUUFBUSxRQUFRLFNBQVMsS0FBSyxTQUFTLFlBQVksQ0FBQztFQUNqRixNQUFNLGVBQWUscUJBQXFCLE9BQU87QUFFakQsa0JBQWdCLEtBQUssQ0FDbkI7R0FDRSxZQUFZLE9BQU87R0FDbkIsY0FBYyxLQUFLLGFBQWEsU0FBUyxLQUFLLGNBQWM7R0FDNUQsWUFBWSxPQUFPLFNBQVM7R0FDNUIsYUFBYSxLQUFLO0dBQ2xCLGVBQWUsS0FBSyxVQUFVO0dBQzlCLFVBQVU7R0FDVixjQUFjLE9BQU8sTUFBTTtHQUMzQixlQUFlLE9BQU8sTUFBTTtHQUM1QixtQkFBbUIsT0FBTyxNQUFNO0dBQ2hDLHVCQUF1QixPQUFPLE1BQU07R0FDcEMsYUFBYSxPQUFPO0dBQ3BCLFNBQVMsT0FBTztHQUNoQixVQUFVLE9BQU8sWUFBWSxPQUFPLEtBQUssTUFBTSxPQUFPLFVBQVUsVUFBVSxHQUFHO0dBQzdFLGdCQUFnQjtHQUNoQixtQkFDRSxzQkFBc0IsT0FDbEIsMEJBQTBCLEtBQUssdUJBQXVCLEdBQ3REO0dBQ04sUUFBUSxLQUFLLFVBQVU7R0FFdkIsZ0JBQTJDO0FBQ3pDLFFBQUk7QUFDRixZQUFPLEtBQUssVUFBVSxLQUFLLE1BQU0sS0FBSyxRQUFRLEdBQUc7WUFDM0M7QUFDTixZQUFPOztPQUVQO0dBQ0osUUFBUTtHQUNSLGlCQUFpQjtHQUVqQixxQkFBcUIsS0FBSyxtQkFBbUI7R0FDOUMsQ0FDRixDQUFDLENBQ0MsS0FBSyxPQUFPLFFBQVE7R0FDbkIsTUFBTSxlQUFlLElBQUk7QUFDekIsT0FBSSxDQUFDLGdCQUFnQixXQUFXLFdBQVcsRUFBRztBQUM5QyxRQUFLLE1BQU0sUUFBUSw4QkFBOEIsTUFBTSxZQUFZLEVBQUUsQ0FDbkUsT0FBTSxnQkFBZ0IsV0FBVyxjQUFjLEtBQUs7SUFFdEQsQ0FDRCxPQUFPLE1BQU0sT0FBTyxNQUFNLDJCQUE0QixFQUFZLFVBQVUsQ0FBQzs7Q0FHbEYsTUFDTSxjQUFjLE1BQWlEO0FBQ25FLDhCQUE0QixLQUFLO0VBQ2pDLE1BQU0sV0FBVyxPQUFPLFlBQVk7QUFDcEMsaUJBQWUsSUFBSSxVQUFVLEtBQUs7QUFDbEMsbUJBQWlCLGVBQWUsT0FBTyxTQUFTLEVBQUUsSUFBTztBQUN6RCxTQUFPLEVBQUUsVUFBVTs7Q0FHckIsTUFDTSxZQUFZLFVBQWlDO0VBQ2pELE1BQU0sT0FBTyxlQUFlLElBQUksU0FBUztBQUN6QyxpQkFBZSxPQUFPLFNBQVM7QUFDL0IsTUFBSSxDQUFDLEtBQU0sT0FBTSxJQUFJLE1BQU0sOEJBQThCO0FBQ3pELDhCQUE0QixLQUFLO0VBRWpDLE1BQU0sbUJBQW1CLEtBQUssWUFBWSxLQUFLLFNBQVMsUUFBUTtFQUNoRSxNQUFNLFlBQVkscUJBQXFCO0VBRXZDLElBQUk7QUFDSixNQUFJLFVBQ0YsS0FBSTtBQUNGLGFBQVUsTUFBTSxZQUFZLEtBQUs7V0FDMUIsR0FBRztBQUNWLFVBQU8sTUFBTSw4QkFBK0IsRUFBWSxVQUFVOztFQUt0RSxNQUFNLE1BRE0sT0FBTyxZQUFZLENBQ2YsVUFBVSxhQUFhO0VBQ3ZDLElBQUk7RUFDSixJQUFJO0VBQ0osSUFBSTtFQUNKLElBQUk7RUFDSixNQUFNLGtCQUFrQixJQUFJLGlCQUFpQjtFQUU3QyxNQUFNLHdCQUF3QjtBQUM1QixPQUFJLFlBQVksT0FDZCxpQkFBZ0Isa0JBQWtCLG9CQUFvQixVQUFVLE9BQU8sQ0FBQyxZQUFZLEdBQUc7O0FBSTNGLE1BQUksY0FBYztBQUNoQixtQkFBZ0IsT0FBTztBQUN2QixvQkFBaUI7SUFDakI7QUFFRixNQUFJO0FBQ0YsU0FBTSxnQkFBZ0IsWUFDcEIsTUFDQTtJQUNFLFVBQVUsU0FBUztBQUNqQixTQUFJLENBQUMsSUFBSSxPQUFRLEtBQUksUUFBUSxTQUFTLEVBQUUsTUFBTSxDQUFDOztJQUVqRCxhQUFhLE9BQU87QUFDbEIsZ0JBQVc7QUFDWCxTQUFJLElBQUksVUFBVSxPQUNoQixrQkFBaUI7O0lBR3JCLFdBQVcsT0FBTztBQUNoQixjQUFTO0FBQ1QsU0FBSSxJQUFJLFVBQVUsU0FDaEIsa0JBQWlCOztJQUdyQixhQUFhLFdBQVc7QUFDdEIsb0JBQWU7O0lBRWpCLFVBQVUsUUFBUTtBQUNoQixtQkFBYzs7SUFFakIsRUFDRCxnQkFBZ0IsT0FDakI7V0FDTSxHQUFHO0FBQ1YsaUJBQWM7O0FBSWhCLE1BQUksY0FBYztHQUVoQixNQUFNLGNBQWMsYUFBYSxZQUFZO0dBQzdDLElBQUksYUFDRixnQkFBZ0IsU0FBWSxFQUFFLGFBQWEsR0FBRztBQUNoRCxPQUFJLFFBQ0YsS0FBSTtBQU9GLGlCQUFhO0tBQUUsSUFORyxNQUFNLFdBQ3RCLFFBQVEsY0FDUixRQUFRLFdBQ1IsTUFDQSxhQUNELEVBQzJCO0tBQVk7S0FBYTtZQUM5QyxHQUFHO0FBQ1YsV0FBTyxNQUFNLDZCQUE4QixFQUFZLFVBQVU7O1lBRTFELHFCQUFxQixPQUU5QixNQUFLLG1CQUFtQixNQUFNLGFBQWE7QUFFN0MsT0FBSSxDQUFDLElBQUksT0FBUSxLQUFJLFFBQVEsUUFBUTtJQUFFLEdBQUc7SUFBYztJQUFZLENBQUM7YUFDNUQsYUFBYTtBQUN0QixPQUFJLElBQUksVUFBVSxZQUFZLFlBQVksV0FBVztBQUNuRCxRQUFJLFFBQVMsT0FBTSxpQkFBaUIsUUFBUSxjQUFjLEtBQUs7QUFDL0QsVUFBTSxJQUFJLEtBQUs7QUFDZjs7QUFFRixPQUFJLFFBQVMsT0FBTSxtQkFBbUIsUUFBUSxjQUFjLFlBQVksU0FBUyxLQUFLO0FBQ3RGLE9BQUksQ0FBQyxJQUFJLE9BQVEsS0FBSSxRQUFRLFNBQVMsRUFBRSxTQUFTLFlBQVksU0FBUyxDQUFDO2FBQzlELElBQUksVUFBVSxRQUN2QixPQUFNLGlCQUFpQixRQUFRLGNBQWMsS0FBSztBQUdwRCxRQUFNLElBQUksS0FBSzs7Q0FHakIsTUFDTSxVQUFVLE9BQTBEO0FBU3hFLFNBQU8sRUFBRSxjQVJZLE1BQU0sZ0JBQWdCLFVBQVU7R0FDbkQsYUFBYSxNQUFNO0dBQ25CLFlBQVksTUFBTTtHQUNsQixRQUFRLE1BQU07R0FDZCxjQUFjLE1BQU07R0FDcEIsZUFBZSxNQUFNO0dBQ3JCLFNBQVMsTUFBTSxVQUFVLEtBQUssTUFBTSxNQUFNLFFBQVEsR0FBRztHQUN0RCxDQUFDLEVBQ3FCOztDQUd6QixNQUNNLFdBQVcsT0FBcUQ7QUFxQnBFLFNBQU8sRUFBRSxRQXBCTSxNQUFNLGdCQUFnQixXQUFXLE1BQU0sY0FBYztHQUNsRSxZQUFZLE1BQU07R0FDbEIsTUFBTSxNQUFNO0dBQ1osY0FBYyxNQUFNO0dBQ3BCLGVBQWUsTUFBTTtHQUNyQixtQkFBbUIsTUFBTTtHQUN6Qix1QkFBdUIsTUFBTTtHQUM3QixhQUFhLE1BQU07R0FDbkIsU0FBUyxNQUFNLFVBQVU7R0FDekIsZUFBZSxNQUFNO0dBQ3JCLGdCQUFnQixNQUFNO0dBQ3RCLGtCQUFrQixNQUFNO0dBQ3hCLGlCQUFpQixNQUFNO0dBQ3ZCLGNBQWMsTUFBTTtHQUNwQixXQUFXLE1BQU07R0FDakIsV0FBVyxNQUFNO0dBQ2pCLGFBQWEsTUFBTTtHQUNuQixrQkFBa0IsTUFBTTtHQUN4QixPQUFPLE1BQU07R0FDZCxDQUFDLEVBQ2U7O0NBR25CLE1BQ00sVUFBVSxPQUFpRDtBQUMvRCxRQUFNLGdCQUFnQixVQUFVLE1BQU0sY0FBYztHQUNsRCxRQUFRLE1BQU07R0FDZCxVQUFVLE1BQU07R0FDaEIsWUFBWSxNQUFNO0dBQ2xCLGNBQWMsTUFBTTtHQUNwQixlQUFlLE1BQU07R0FDckIsbUJBQW1CLE1BQU07R0FDekIsdUJBQXVCLE1BQU07R0FDN0IsYUFBYSxNQUFNO0dBQ25CLFNBQVMsTUFBTSxVQUFVLEtBQUssTUFBTSxNQUFNLFFBQVEsR0FBRztHQUNyRCxlQUFlLE1BQU07R0FDdEIsQ0FBQztBQUNGLFNBQU8sRUFBRSxJQUFJLE1BQU07O0NBR3JCLE1BQ00sUUFBK0I7QUFDbkMsU0FBTyxnQkFBZ0IsVUFBVTs7Q0FHbkMsTUFDTSxVQUFVLFdBQThDO0FBQzVELFNBQU8sRUFBRSxLQUFLLE1BQU0sZ0JBQWdCLFVBQVUsRUFBRSxZQUFZLFdBQVcsQ0FBQyxFQUFFOztDQUc1RSxNQUNNLGVBQTZDO0FBQ2pELFNBQU8sRUFBRSxPQUFPLE1BQU0sZ0JBQWdCLHNCQUFzQixFQUFFOztDQUdoRSxNQUNNLFNBQ0osVUFDQSxhQUNBLE1BQzZCO0FBQzdCLFFBQU0sV0FBVyxLQUFLLENBQ3BCO0dBQ0U7R0FDQTtHQUNBO0dBQ0QsQ0FDRixDQUFDO0FBQ0YsU0FBTyxFQUFFLE9BQU8sTUFBTTs7Q0FHeEIsTUFDTSxZQUNKLElBQ0EsTUFDQSxnQkFDQSxRQUMrQjtBQUMvQixNQUNFLG1CQUFtQixVQUNuQixtQkFBbUIsU0FDbEIsQ0FBQyxPQUFPLFVBQVUsZUFBZSxJQUFJLGlCQUFpQixLQUFLLGlCQUFpQixLQUU3RSxPQUFNLElBQUksb0JBQ1IsK0RBQ0Q7QUFFSCxNQUFJLFdBQVcsV0FBYyxDQUFDLE9BQU8sVUFBVSxPQUFPLElBQUksU0FBUyxLQUFLLFNBQVMsS0FDL0UsT0FBTSxJQUFJLG9CQUNSLDhDQUNEO0VBR0gsTUFBTSxRQUEyQixFQUFFO0FBQ25DLE1BQUksU0FBUyxPQUFXLE9BQU0sT0FBTztBQUNyQyxNQUFJLG1CQUFtQixPQUFXLE9BQU0sa0JBQWtCO0FBQzFELE1BQUksV0FBVyxPQUFXLE9BQU0sU0FBUztBQUN6QyxNQUFJLE9BQU8sS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFHLFFBQU8sRUFBRSxTQUFTLE9BQU87QUFHOUQsU0FBTyxFQUFFLFNBRE8sTUFBTSxXQUFXLGFBQWEsSUFBSSxNQUFNLEdBQzVCLEdBQUc7O0NBR2pDLE1BQ00sWUFBWSxJQUEyQztFQUMzRCxNQUFNLFFBQVEsTUFBTSxXQUFXLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQztBQUNuRCxNQUFJLENBQUMsTUFBTyxRQUFPLEVBQUUsU0FBUyxPQUFPO0FBQ3JDLFFBQU0sV0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDaEMsU0FBTyxFQUFFLFNBQVMsTUFBTTs7Ozs7Q0FNMUIsTUFDTSxZQUFZLElBQTBDO0VBQzFELE1BQU0sUUFBUSxNQUFNLFdBQVcsUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQ25ELE1BQUksQ0FBQyxNQUFPLFFBQU8sRUFBRSxRQUFRLE9BQU87RUFFcEMsTUFBTSxZQUFZLENBQUMsTUFBTTtBQUN6QixRQUFNLFdBQVcsS0FBSyxDQUNwQjtHQUNFO0dBQ0EsVUFBVSxNQUFNO0dBQ2hCLGFBQWEsTUFBTTtHQUNuQixRQUFRO0dBQ1IsTUFBTSxNQUFNO0dBQ2IsQ0FDRixDQUFDO0FBQ0YsU0FBTyxFQUFFLFFBQVEsV0FBVzs7Q0FHOUIsTUFDTSxXQUFXLE1BQXlDO0VBQ3hELE1BQU0sRUFBRSxjQUFjLGVBQWUsVUFBVSxjQUFjO0VBRTdELE1BQU0sY0FBYyxxQkFBcUI7RUFDekMsTUFBTSxVQUFVLGFBQWEsZUFBZSxPQUFPLFlBQVk7QUFFL0QsUUFBTSxjQUFjLE9BQU87R0FBRTtHQUFjO0dBQU07R0FBYSxDQUFDO0FBRS9ELFNBQU8sRUFBRSxTQUFTOztDQUdwQixNQUFNLG9CQUFvQixNQUFjLE9BQWUsT0FBb0M7RUFDekYsTUFBTSxVQUFVLE1BQU0sY0FBYyxNQUFNO0FBQzFDLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTyxLQUFLLGdDQUFnQztBQUM1QyxVQUFPLE1BQU0sU0FBUyxxQ0FBcUM7O0FBRTdELFFBQU0saUJBQWlCLE1BQU07QUFFN0IsTUFBSTtHQUNGLE1BQU0sU0FBUyxNQUFNLHNCQUNuQixNQUNBLFFBQVEsY0FDUixPQUNBLFFBQVEsWUFDVDtBQUVELE9BQUksT0FBTyxhQUFhO0lBQ3RCLE1BQU0sYUFBYSxNQUFNLFdBQVcsd0JBQ2xDLEtBQ0EsYUFDQSxPQUFPLFlBQ1I7QUFDRCxRQUFJLFdBQVcsU0FBUyxFQUN0QixPQUFNLFdBQVcsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQzs7QUFJckQsU0FBTSxXQUFXLEtBQUssQ0FDcEI7SUFDRSxVQUFVO0lBQ1YsYUFBYTtLQUNYLGFBQWEsT0FBTztLQUNwQixjQUFjLE9BQU87S0FDckIsV0FBVyxPQUFPLGFBQWE7S0FDL0IsYUFBYSxPQUFPLGVBQWU7S0FDcEM7SUFDRCxNQUFNLFFBQVE7SUFDZixDQUNGLENBQUM7QUFFRixVQUFPLE1BQU0sU0FBUyx3QkFBd0IsbUJBQW1CLFFBQVEsS0FBSyxHQUFHO1dBQzFFLEdBQUc7QUFDVixVQUFPLE1BQU0sU0FBUyx3QkFBd0IsbUJBQW9CLEVBQVksUUFBUSxHQUFHOzs7Q0FJN0YsTUFDTSxpQkFBaUIsTUFBeUM7QUFDOUQsTUFBSSxDQUFDLGdCQUFnQixpQkFBa0IsT0FBTSxJQUFJLE1BQU0sb0NBQW9DO0VBQzNGLE1BQU0sRUFBRSxZQUFZLE1BQU0sZ0JBQWdCLGlCQUFpQixrQkFBa0IsS0FBSztBQUdsRixrQkFBZ0IsaUJBQ2Isc0JBQXNCLENBQ3RCLEtBQUssT0FBTyxVQUFVO0FBQ3JCLE9BQUksTUFBTSxXQUFXO0lBQ25CLE1BQU0sYUFBYSxNQUFNLFdBQVcsd0JBQ2xDLEtBQ0EsVUFDQSxNQUFNLFVBQ1A7QUFDRCxRQUFJLFdBQVcsU0FBUyxFQUN0QixPQUFNLFdBQVcsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQzs7QUFHckQsU0FBTSxXQUFXLEtBQUssQ0FDcEI7SUFDRSxVQUFVO0lBQ1YsYUFBYTtLQUNYLGFBQWEsTUFBTTtLQUNuQixjQUFjLE1BQU07S0FDcEIsU0FBUyxNQUFNO0tBQ2Ysc0JBQXNCLEtBQUssS0FBSyxHQUFHLE1BQVUsT0FBTztLQUNwRCxXQUFXLE1BQU07S0FDbEI7SUFDRDtJQUNELENBQ0YsQ0FBQztBQUNGLFVBQU8sS0FBSywwQkFBMEIsT0FBTztJQUM3QyxDQUNELE9BQU8sTUFBTTtBQUNaLFVBQU8sS0FBSyxnQ0FBaUMsRUFBWSxVQUFVO0lBQ25FO0FBRUosU0FBTyxFQUFFLFNBQVM7O0NBR3BCLE1BQ00sTUFBTSxTQUEwQztFQUNwRCxNQUFNLEVBQUUsTUFBTSxjQUFjLE1BQU0sV0FBVyxTQUFTLElBQUk7RUFDMUQsTUFBTSxRQUFRLFVBQ1YsVUFBVSxNQUFNLE1BQU0sRUFBRSxPQUFPLFFBQVEsR0FDdkMsVUFBVSxVQUFVLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxZQUFZO0FBRXJFLE1BQUksQ0FBQyxNQUFPLFFBQU8sRUFBRSxPQUFPLGFBQWE7QUFFekMsTUFBSSxNQUFNLGFBQWEsVUFBVTtBQUMvQixPQUFJLENBQUMsTUFBTSxPQUNULFFBQU87SUFBRSxVQUFVO0lBQVUsVUFBVTtJQUFNLFVBQVU7SUFBTTtBQUcvRCxPQUFJO0lBRUYsTUFBTSxNQURNLE1BQU0sZ0JBQWdCLGtCQUFrQix1QkFBdUIsTUFBTSxHQUFHLEdBQ3BFLEtBQUs7QUFDckIsV0FBTztLQUNMLFVBQVU7S0FDVixVQUFVLElBQUksVUFDVjtNQUNFLGFBQWEsR0FBRyxRQUFRO01BQ3hCLFVBQVUsaUJBQWlCLEdBQUcsUUFBUSxTQUFTO01BQy9DLG9CQUFvQixHQUFHLFFBQVE7TUFDaEMsR0FDRDtLQUNKLFVBQVUsSUFBSSxZQUNWO01BQ0UsYUFBYSxHQUFHLFVBQVU7TUFDMUIsVUFBVSxpQkFBaUIsR0FBRyxVQUFVLFNBQVM7TUFDakQsb0JBQW9CLEdBQUcsVUFBVTtNQUNsQyxHQUNEO0tBQ0w7WUFDTSxHQUFHO0FBQ1YsV0FBTyxFQUFFLE9BQU8sd0JBQXlCLEVBQVksV0FBVzs7O0FBSXBFLE1BQUksTUFBTSxhQUFhLFlBQ3JCLFFBQU8sRUFBRSxPQUFPLHlDQUF5QyxNQUFNLFlBQVk7RUFHN0UsSUFBSSxjQUFjLGVBQWUsTUFBTSxZQUFZO0FBR25ELE1BRmtCLGFBQWEsTUFBTSxZQUFZLEdBQUcsS0FBSyxLQUFLLElBRTdDLGdCQUFnQixNQUFNLFlBQVksQ0FDakQsS0FBSTtBQUNGLGlCQUFjLE1BQU0sS0FBSyxhQUFhLE1BQU07V0FDckMsR0FBRztBQUNWLGVBQVksS0FBSyxzQkFBc0IsTUFBTSxLQUFLLElBQUssRUFBWSxVQUFVO0FBQzdFLFVBQU8sRUFBRSxPQUFPLHFCQUFxQjs7RUFJekMsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZO0FBQ3pDLE1BQUksSUFBSSxTQUFTLGdCQUFnQixNQUFNLFlBQVksQ0FDakQsS0FBSTtBQUNGLGlCQUFjLE1BQU0sS0FBSyxhQUFhLE1BQU07R0FDNUMsTUFBTSxVQUFVLE1BQU0sV0FBVyxZQUFZO0FBQzdDLE9BQUksUUFBUSxNQUFPLFFBQU8sRUFBRSxPQUFPLFFBQVEsT0FBTztBQUNsRCxVQUFPLHNCQUFzQixRQUFRO1dBQzlCLEdBQUc7QUFDVixlQUFZLEtBQUssc0JBQXNCLE1BQU0sS0FBSyxJQUFLLEVBQVksVUFBVTtBQUM3RSxVQUFPLEVBQUUsT0FBTyxxQkFBcUI7O0FBR3pDLE1BQUksSUFBSSxNQUFPLFFBQU8sRUFBRSxPQUFPLElBQUksT0FBTztBQUMxQyxTQUFPLHNCQUFzQixJQUFJOztDQUduQyxNQUFNLGFBQWEsT0FBc0M7RUFDdkQsTUFBTSxRQUFRLE1BQU07RUFDcEIsTUFBTSxLQUFLLGdCQUFnQixNQUFNO0FBQ2pDLE1BQUksQ0FBQyxHQUFJLE9BQU0sSUFBSSxNQUFNLG1CQUFtQjtFQUM1QyxNQUFNLFlBQVksTUFBTSxtQkFBbUIsR0FBRztFQUM5QyxNQUFNLFVBQVUsaUJBQWlCLE1BQU07R0FDckMsR0FBRztHQUNILGFBQWEsVUFBVTtHQUN2QixjQUFjLFVBQVU7R0FDeEIsV0FBVyxVQUFVO0dBQ3RCLENBQUM7QUFDRixRQUFNLFdBQVcsS0FBSyxDQUNwQjtHQUNFLElBQUksTUFBTTtHQUNWLFVBQVUsTUFBTTtHQUNoQixhQUFhO0dBQ2IsTUFBTSxNQUFNO0dBQ2IsQ0FDRixDQUFDO0FBQ0YsU0FBTyxVQUFVOztDQUduQixNQUNNLFNBQWtDO0FBQ3RDLFNBQU87R0FDTCxRQUFRO0dBQ1IsY0FBYyxnQkFBZ0IsT0FBTztHQUNyQyxZQUFZLGdCQUFnQixZQUFZLFFBQVEsSUFBSTtHQUNyRDs7OztDQXJpQkYsSUFBSTtFQUFFLFlBQVk7RUFBUSxTQUFTLENBQUMsU0FBUyxvQkFBb0I7RUFBRSxDQUFDOzs7Ozs7Q0F1RnBFLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsb0JBQW9CO0VBQUUsQ0FBQzs7Ozs7O0NBU3BFLE9BQU87RUFBRSxNQUFNO0VBQU8sUUFBUTtFQUFjLENBQUM7Ozs7OztDQTRHN0MsSUFBSTtFQUFFLFlBQVk7RUFBUSxTQUFTLENBQUMsU0FBUyxvQkFBb0I7RUFBRSxDQUFDOzs7Ozs7Q0FhcEUsSUFBSTtFQUFFLFlBQVk7RUFBUSxTQUFTLENBQUMsU0FBUyxvQkFBb0I7RUFBRSxDQUFDOzs7Ozs7Q0F5QnBFLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsb0JBQW9CO0VBQUUsQ0FBQzs7Ozs7O0NBaUJwRSxJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGlCQUFpQjtFQUFFLENBQUM7Ozs7OztDQUtoRSxJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGlCQUFpQjtFQUFFLENBQUM7Ozs7OztDQUtoRSxJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGlCQUFpQjtFQUFFLENBQUM7Ozs7OztDQUtoRSxJQUFJO0VBQUUsWUFBWTtFQUFRLFNBQVMsQ0FBQyxTQUFTLG9CQUFvQjtFQUFFLENBQUM7Ozs7Ozs7Ozs7Q0FnQnBFLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFFBQVE7RUFBRSxDQUFDOzs7Ozs7Ozs7OztDQWdDL0MsSUFBSTtFQUFFLFlBQVk7RUFBUSxTQUFTLENBQUMsU0FBUyxvQkFBb0I7RUFBRSxDQUFDOzs7Ozs7Q0FXcEUsSUFBSTtFQUFFLFlBQVk7RUFBUSxTQUFTLENBQUMsU0FBUyxvQkFBb0I7RUFBRSxDQUFDOzs7Ozs7Q0FrQnBFLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsb0JBQW9CO0VBQUUsQ0FBQzs7Ozs7O0NBMERwRSxJQUFJO0VBQUUsWUFBWTtFQUFRLFNBQVMsQ0FBQyxTQUFTLG9CQUFvQjtFQUFFLENBQUM7Ozs7OztDQXlDcEUsSUFBSTtFQUFFLFlBQVk7RUFBTyxTQUFTLENBQUMsU0FBUyxpQkFBaUI7RUFBRSxDQUFDOzs7Ozs7Q0E2RmhFLElBQUk7RUFBRSxZQUFZO0VBQU8sU0FBUyxDQUFDLFNBQVMsaUJBQWlCO0VBQUUsQ0FBQzs7Ozs7QUFVbkUsTUFBYSxhQUFhLElBQUksaUJBQWlCO0FBRS9DLFNBQVMsc0JBQXNCLEtBQXVDO0FBQ3BFLFFBQU87RUFDTCxVQUFVO0VBQ1YsVUFBVSxJQUFJLFlBQ1Y7R0FBRSxhQUFhLElBQUksVUFBVTtHQUFhLFVBQVUsSUFBSSxVQUFVO0dBQVcsR0FDN0U7RUFDSixVQUFVLElBQUksWUFDVjtHQUFFLGFBQWEsSUFBSSxVQUFVO0dBQWEsVUFBVSxJQUFJLFVBQVU7R0FBVyxHQUM3RTtFQUNMIn0=