jmap-kit 0.0.0 → 1.0.2

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 (198) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +138 -3
  3. package/dist/src/capabilities/blob/blob.d.ts +83 -0
  4. package/dist/src/capabilities/blob/blob.js +98 -0
  5. package/dist/src/capabilities/blob/blob.js.map +1 -0
  6. package/dist/src/capabilities/blob/types.d.ts +212 -0
  7. package/dist/src/capabilities/blob/types.js +16 -0
  8. package/dist/src/capabilities/blob/types.js.map +1 -0
  9. package/dist/src/capabilities/blob-capability.d.ts +195 -0
  10. package/dist/src/capabilities/blob-capability.js +277 -0
  11. package/dist/src/capabilities/blob-capability.js.map +1 -0
  12. package/dist/src/capabilities/core/core.d.ts +47 -0
  13. package/dist/src/capabilities/core/core.js +59 -0
  14. package/dist/src/capabilities/core/core.js.map +1 -0
  15. package/dist/src/capabilities/core/types.d.ts +13 -0
  16. package/dist/src/capabilities/core/types.js +2 -0
  17. package/dist/src/capabilities/core/types.js.map +1 -0
  18. package/dist/src/capabilities/core-capability.d.ts +307 -0
  19. package/dist/src/capabilities/core-capability.js +344 -0
  20. package/dist/src/capabilities/core-capability.js.map +1 -0
  21. package/dist/src/capabilities/email/email.d.ts +124 -0
  22. package/dist/src/capabilities/email/email.js +136 -0
  23. package/dist/src/capabilities/email/email.js.map +1 -0
  24. package/dist/src/capabilities/email/types.d.ts +776 -0
  25. package/dist/src/capabilities/email/types.js +2 -0
  26. package/dist/src/capabilities/email/types.js.map +1 -0
  27. package/dist/src/capabilities/email-capability.d.ts +266 -0
  28. package/dist/src/capabilities/email-capability.js +241 -0
  29. package/dist/src/capabilities/email-capability.js.map +1 -0
  30. package/dist/src/capabilities/emailsubmission/emailsubmission.d.ts +95 -0
  31. package/dist/src/capabilities/emailsubmission/emailsubmission.js +107 -0
  32. package/dist/src/capabilities/emailsubmission/emailsubmission.js.map +1 -0
  33. package/dist/src/capabilities/emailsubmission/types.d.ts +256 -0
  34. package/dist/src/capabilities/emailsubmission/types.js +2 -0
  35. package/dist/src/capabilities/emailsubmission/types.js.map +1 -0
  36. package/dist/src/capabilities/example/example.d.ts +80 -0
  37. package/dist/src/capabilities/example/example.js +91 -0
  38. package/dist/src/capabilities/example/example.js.map +1 -0
  39. package/dist/src/capabilities/example/types.d.ts +33 -0
  40. package/dist/src/capabilities/example/types.js +2 -0
  41. package/dist/src/capabilities/example/types.js.map +1 -0
  42. package/dist/src/capabilities/identity/identity.d.ts +71 -0
  43. package/dist/src/capabilities/identity/identity.js +83 -0
  44. package/dist/src/capabilities/identity/identity.js.map +1 -0
  45. package/dist/src/capabilities/identity/types.d.ts +110 -0
  46. package/dist/src/capabilities/identity/types.js +2 -0
  47. package/dist/src/capabilities/identity/types.js.map +1 -0
  48. package/dist/src/capabilities/mailbox/mailbox.d.ts +91 -0
  49. package/dist/src/capabilities/mailbox/mailbox.js +103 -0
  50. package/dist/src/capabilities/mailbox/mailbox.js.map +1 -0
  51. package/dist/src/capabilities/mailbox/types.d.ts +248 -0
  52. package/dist/src/capabilities/mailbox/types.js +2 -0
  53. package/dist/src/capabilities/mailbox/types.js.map +1 -0
  54. package/dist/src/capabilities/maskedemail/maskedemail.d.ts +60 -0
  55. package/dist/src/capabilities/maskedemail/maskedemail.js +72 -0
  56. package/dist/src/capabilities/maskedemail/maskedemail.js.map +1 -0
  57. package/dist/src/capabilities/maskedemail/types.d.ts +67 -0
  58. package/dist/src/capabilities/maskedemail/types.js +4 -0
  59. package/dist/src/capabilities/maskedemail/types.js.map +1 -0
  60. package/dist/src/capabilities/maskedemail-capability.d.ts +112 -0
  61. package/dist/src/capabilities/maskedemail-capability.js +166 -0
  62. package/dist/src/capabilities/maskedemail-capability.js.map +1 -0
  63. package/dist/src/capabilities/searchsnippet/searchsnippet.d.ts +51 -0
  64. package/dist/src/capabilities/searchsnippet/searchsnippet.js +63 -0
  65. package/dist/src/capabilities/searchsnippet/searchsnippet.js.map +1 -0
  66. package/dist/src/capabilities/searchsnippet/types.d.ts +88 -0
  67. package/dist/src/capabilities/searchsnippet/types.js +2 -0
  68. package/dist/src/capabilities/searchsnippet/types.js.map +1 -0
  69. package/dist/src/capabilities/submission-capability.d.ts +89 -0
  70. package/dist/src/capabilities/submission-capability.js +75 -0
  71. package/dist/src/capabilities/submission-capability.js.map +1 -0
  72. package/dist/src/capabilities/thread/thread.d.ts +58 -0
  73. package/dist/src/capabilities/thread/thread.js +70 -0
  74. package/dist/src/capabilities/thread/thread.js.map +1 -0
  75. package/dist/src/capabilities/thread/types.d.ts +43 -0
  76. package/dist/src/capabilities/thread/types.js +2 -0
  77. package/dist/src/capabilities/thread/types.js.map +1 -0
  78. package/dist/src/capabilities/utils/assert-invocation-datatype.d.ts +7 -0
  79. package/dist/src/capabilities/utils/assert-invocation-datatype.js +13 -0
  80. package/dist/src/capabilities/utils/assert-invocation-datatype.js.map +1 -0
  81. package/dist/src/capabilities/utils/assert-invocation-method.d.ts +7 -0
  82. package/dist/src/capabilities/utils/assert-invocation-method.js +13 -0
  83. package/dist/src/capabilities/utils/assert-invocation-method.js.map +1 -0
  84. package/dist/src/capabilities/utils/assert-invocation.d.ts +7 -0
  85. package/dist/src/capabilities/utils/assert-invocation.js +22 -0
  86. package/dist/src/capabilities/utils/assert-invocation.js.map +1 -0
  87. package/dist/src/capabilities/utils/assert-non-nullish.d.ts +1 -0
  88. package/dist/src/capabilities/utils/assert-non-nullish.js +6 -0
  89. package/dist/src/capabilities/utils/assert-non-nullish.js.map +1 -0
  90. package/dist/src/capabilities/utils/create-readonly-account-validator.d.ts +49 -0
  91. package/dist/src/capabilities/utils/create-readonly-account-validator.js +80 -0
  92. package/dist/src/capabilities/utils/create-readonly-account-validator.js.map +1 -0
  93. package/dist/src/capabilities/vacationresponse/types.d.ts +100 -0
  94. package/dist/src/capabilities/vacationresponse/types.js +2 -0
  95. package/dist/src/capabilities/vacationresponse/types.js.map +1 -0
  96. package/dist/src/capabilities/vacationresponse/vacationresponse.d.ts +61 -0
  97. package/dist/src/capabilities/vacationresponse/vacationresponse.js +73 -0
  98. package/dist/src/capabilities/vacationresponse/vacationresponse.js.map +1 -0
  99. package/dist/src/capabilities/vacationresponse-capability.d.ts +65 -0
  100. package/dist/src/capabilities/vacationresponse-capability.js +68 -0
  101. package/dist/src/capabilities/vacationresponse-capability.js.map +1 -0
  102. package/dist/src/capability-registry/capability-registry.d.ts +148 -0
  103. package/dist/src/capability-registry/capability-registry.js +360 -0
  104. package/dist/src/capability-registry/capability-registry.js.map +1 -0
  105. package/dist/src/capability-registry/types.d.ts +385 -0
  106. package/dist/src/capability-registry/types.js +2 -0
  107. package/dist/src/capability-registry/types.js.map +1 -0
  108. package/dist/src/capability-registry/utils.d.ts +71 -0
  109. package/dist/src/capability-registry/utils.js +163 -0
  110. package/dist/src/capability-registry/utils.js.map +1 -0
  111. package/dist/src/common/registry.d.ts +366 -0
  112. package/dist/src/common/registry.js +321 -0
  113. package/dist/src/common/registry.js.map +1 -0
  114. package/dist/src/common/types.d.ts +338 -0
  115. package/dist/src/common/types.js +21 -0
  116. package/dist/src/common/types.js.map +1 -0
  117. package/dist/src/common/utils.d.ts +20 -0
  118. package/dist/src/common/utils.js +26 -0
  119. package/dist/src/common/utils.js.map +1 -0
  120. package/dist/src/index.d.ts +40 -0
  121. package/dist/src/index.js +33 -0
  122. package/dist/src/index.js.map +1 -0
  123. package/dist/src/invocation/arguments-proxy.d.ts +14 -0
  124. package/dist/src/invocation/arguments-proxy.js +37 -0
  125. package/dist/src/invocation/arguments-proxy.js.map +1 -0
  126. package/dist/src/invocation/error-invocation.d.ts +27 -0
  127. package/dist/src/invocation/error-invocation.js +39 -0
  128. package/dist/src/invocation/error-invocation.js.map +1 -0
  129. package/dist/src/invocation/invocation.d.ts +111 -0
  130. package/dist/src/invocation/invocation.js +158 -0
  131. package/dist/src/invocation/invocation.js.map +1 -0
  132. package/dist/src/invocation/result-reference.d.ts +86 -0
  133. package/dist/src/invocation/result-reference.js +118 -0
  134. package/dist/src/invocation/result-reference.js.map +1 -0
  135. package/dist/src/invocation/types.d.ts +637 -0
  136. package/dist/src/invocation/types.js +2 -0
  137. package/dist/src/invocation/types.js.map +1 -0
  138. package/dist/src/invocation/utils.d.ts +21 -0
  139. package/dist/src/invocation/utils.js +30 -0
  140. package/dist/src/invocation/utils.js.map +1 -0
  141. package/dist/src/invocation-factory/invocation-factory-manager.d.ts +20 -0
  142. package/dist/src/invocation-factory/invocation-factory-manager.js +50 -0
  143. package/dist/src/invocation-factory/invocation-factory-manager.js.map +1 -0
  144. package/dist/src/invocation-factory/invocation-list.d.ts +32 -0
  145. package/dist/src/invocation-factory/invocation-list.js +77 -0
  146. package/dist/src/invocation-factory/invocation-list.js.map +1 -0
  147. package/dist/src/invocation-factory/types.d.ts +11 -0
  148. package/dist/src/invocation-factory/types.js +2 -0
  149. package/dist/src/invocation-factory/types.js.map +1 -0
  150. package/dist/src/jmap-client/jmap-client.d.ts +252 -0
  151. package/dist/src/jmap-client/jmap-client.js +777 -0
  152. package/dist/src/jmap-client/jmap-client.js.map +1 -0
  153. package/dist/src/jmap-client/types.d.ts +427 -0
  154. package/dist/src/jmap-client/types.js +21 -0
  155. package/dist/src/jmap-client/types.js.map +1 -0
  156. package/dist/src/jmap-client/utils/abort-controller.d.ts +8 -0
  157. package/dist/src/jmap-client/utils/abort-controller.js +24 -0
  158. package/dist/src/jmap-client/utils/abort-controller.js.map +1 -0
  159. package/dist/src/jmap-client/utils/assert-connected.d.ts +7 -0
  160. package/dist/src/jmap-client/utils/assert-connected.js +11 -0
  161. package/dist/src/jmap-client/utils/assert-connected.js.map +1 -0
  162. package/dist/src/jmap-client/utils/deep-freeze.d.ts +7 -0
  163. package/dist/src/jmap-client/utils/deep-freeze.js +17 -0
  164. package/dist/src/jmap-client/utils/deep-freeze.js.map +1 -0
  165. package/dist/src/jmap-client/utils/emitter.d.ts +9 -0
  166. package/dist/src/jmap-client/utils/emitter.js +18 -0
  167. package/dist/src/jmap-client/utils/emitter.js.map +1 -0
  168. package/dist/src/jmap-client/utils/filter-session-capabilities.d.ts +22 -0
  169. package/dist/src/jmap-client/utils/filter-session-capabilities.js +40 -0
  170. package/dist/src/jmap-client/utils/filter-session-capabilities.js.map +1 -0
  171. package/dist/src/jmap-client/utils/jmap-request-error.d.ts +28 -0
  172. package/dist/src/jmap-client/utils/jmap-request-error.js +48 -0
  173. package/dist/src/jmap-client/utils/jmap-request-error.js.map +1 -0
  174. package/dist/src/jmap-client/utils/logger.d.ts +6 -0
  175. package/dist/src/jmap-client/utils/logger.js +22 -0
  176. package/dist/src/jmap-client/utils/logger.js.map +1 -0
  177. package/dist/src/jmap-client/utils/merge-headers.d.ts +11 -0
  178. package/dist/src/jmap-client/utils/merge-headers.js +40 -0
  179. package/dist/src/jmap-client/utils/merge-headers.js.map +1 -0
  180. package/dist/src/jmap-client/utils/template-utils.d.ts +27 -0
  181. package/dist/src/jmap-client/utils/template-utils.js +61 -0
  182. package/dist/src/jmap-client/utils/template-utils.js.map +1 -0
  183. package/dist/src/jmap-client/utils/track-utils.d.ts +19 -0
  184. package/dist/src/jmap-client/utils/track-utils.js +35 -0
  185. package/dist/src/jmap-client/utils/track-utils.js.map +1 -0
  186. package/dist/src/jmap-client/utils/transport.d.ts +12 -0
  187. package/dist/src/jmap-client/utils/transport.js +38 -0
  188. package/dist/src/jmap-client/utils/transport.js.map +1 -0
  189. package/dist/src/jmap-client/utils/validate-session.d.ts +19 -0
  190. package/dist/src/jmap-client/utils/validate-session.js +29 -0
  191. package/dist/src/jmap-client/utils/validate-session.js.map +1 -0
  192. package/dist/src/request-builder/request-builder.d.ts +95 -0
  193. package/dist/src/request-builder/request-builder.js +343 -0
  194. package/dist/src/request-builder/request-builder.js.map +1 -0
  195. package/dist/src/request-builder/types.d.ts +32 -0
  196. package/dist/src/request-builder/types.js +2 -0
  197. package/dist/src/request-builder/types.js.map +1 -0
  198. package/package.json +69 -3
@@ -0,0 +1,86 @@
1
+ import type { Id, JMAPResultReference } from "../common/types.js";
2
+ import type { JMAPResultReferenceInternal, ResultReferenceInterface } from "./types.js";
3
+ /**
4
+ * Represents a JMAP result reference that allows one method call to reference
5
+ * the result of a previous method call within the same request.
6
+ *
7
+ * Result references are a core feature of JMAP (RFC 8620 Section 3.7) that enable
8
+ * method calls to depend on the results of earlier method calls in the same request.
9
+ * This allows for efficient batching of interdependent operations without requiring
10
+ * multiple round trips to the server.
11
+ *
12
+ * @remarks
13
+ * This class is primarily used internally by the JMAP client and invocation system.
14
+ * Users typically create result references through invocation method arguments that
15
+ * accept {@linkcode ResultReferenceInterface} objects.
16
+ *
17
+ * A result reference consists of:
18
+ * - An invocation ID (symbol) that uniquely identifies the method call being referenced
19
+ * - A method name to validate the reference type
20
+ * - A JSON Pointer path (RFC 6901) to extract a specific value from the result
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * // Create a result reference to the "id" property from a previous "Foo/set" call
25
+ * const ref = new ResultReference(invocationId, "Foo/set", "/id");
26
+ *
27
+ * // The reference can be resolved to a JMAP result reference format
28
+ * const jmapRef = ref.resolve(lookupFunction);
29
+ * // Returns: { resultOf: "c1", name: "Foo/set", path: "/id" }
30
+ * ```
31
+ *
32
+ * @see {@link https://www.rfc-editor.org/rfc/rfc8620.html#section-3.7 | RFC 8620 Section 3.7: References to Previous Method Results}
33
+ */
34
+ export declare class ResultReference implements ResultReferenceInterface {
35
+ #private;
36
+ /**
37
+ * Constructs a ResultReference
38
+ *
39
+ * @param id - A unique symbol identifying the invocation being referenced
40
+ * @param name - The name of the method call being referenced (e.g., "Foo/set")
41
+ * @param path - A JSON Pointer (RFC 6901) path to the value in the result (e.g., "/id")
42
+ */
43
+ constructor(id: symbol, name: string, path: string);
44
+ /**
45
+ * Get the method name of the invocation being referenced
46
+ */
47
+ get name(): string;
48
+ /**
49
+ * Get the unique identifier symbol for the invocation being referenced
50
+ */
51
+ get id(): symbol;
52
+ /**
53
+ * Get the JSON Pointer path to the value in the referenced result
54
+ */
55
+ get path(): string;
56
+ /**
57
+ * Resolves this result reference to a JMAP result reference format
58
+ *
59
+ * Converts the internal symbol-based invocation ID to a string invocation ID
60
+ * suitable for serialisation in a JMAP request.
61
+ *
62
+ * @param lookupId - A function that maps the invocation symbol to its string ID
63
+ * @returns A JMAP result reference object with resultOf, name, and path properties
64
+ * @throws {Error} If the invocation ID cannot be resolved (invocation not found in request)
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * const ref = new ResultReference(invocationId, "Foo/set", "/id");
69
+ * const jmapRef = ref.resolve(id => idMap.get(id));
70
+ * // Returns: { resultOf: "c1", name: "Foo/set", path: "/id" }
71
+ * ```
72
+ */
73
+ resolve(lookupId: (id: symbol) => Id | undefined): JMAPResultReference;
74
+ /**
75
+ * Serialises this result reference to an internal JSON format
76
+ *
77
+ * Produces a JSON-serialisable representation that preserves the symbol-based
78
+ * invocation ID for internal use. This is used during the pre-serialisation
79
+ * phase before invocation IDs are resolved to strings.
80
+ *
81
+ * @returns An internal result reference object with the symbol ID
82
+ *
83
+ * @internal
84
+ */
85
+ toJSON(): JMAPResultReferenceInternal;
86
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Represents a JMAP result reference that allows one method call to reference
3
+ * the result of a previous method call within the same request.
4
+ *
5
+ * Result references are a core feature of JMAP (RFC 8620 Section 3.7) that enable
6
+ * method calls to depend on the results of earlier method calls in the same request.
7
+ * This allows for efficient batching of interdependent operations without requiring
8
+ * multiple round trips to the server.
9
+ *
10
+ * @remarks
11
+ * This class is primarily used internally by the JMAP client and invocation system.
12
+ * Users typically create result references through invocation method arguments that
13
+ * accept {@linkcode ResultReferenceInterface} objects.
14
+ *
15
+ * A result reference consists of:
16
+ * - An invocation ID (symbol) that uniquely identifies the method call being referenced
17
+ * - A method name to validate the reference type
18
+ * - A JSON Pointer path (RFC 6901) to extract a specific value from the result
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * // Create a result reference to the "id" property from a previous "Foo/set" call
23
+ * const ref = new ResultReference(invocationId, "Foo/set", "/id");
24
+ *
25
+ * // The reference can be resolved to a JMAP result reference format
26
+ * const jmapRef = ref.resolve(lookupFunction);
27
+ * // Returns: { resultOf: "c1", name: "Foo/set", path: "/id" }
28
+ * ```
29
+ *
30
+ * @see {@link https://www.rfc-editor.org/rfc/rfc8620.html#section-3.7 | RFC 8620 Section 3.7: References to Previous Method Results}
31
+ */
32
+ export class ResultReference {
33
+ #id;
34
+ #name;
35
+ #path;
36
+ /**
37
+ * Constructs a ResultReference
38
+ *
39
+ * @param id - A unique symbol identifying the invocation being referenced
40
+ * @param name - The name of the method call being referenced (e.g., "Foo/set")
41
+ * @param path - A JSON Pointer (RFC 6901) path to the value in the result (e.g., "/id")
42
+ */
43
+ constructor(id, name, path) {
44
+ this.#id = id;
45
+ this.#name = name;
46
+ this.#path = path;
47
+ }
48
+ /**
49
+ * Get the method name of the invocation being referenced
50
+ */
51
+ get name() {
52
+ return this.#name;
53
+ }
54
+ /**
55
+ * Get the unique identifier symbol for the invocation being referenced
56
+ */
57
+ get id() {
58
+ return this.#id;
59
+ }
60
+ /**
61
+ * Get the JSON Pointer path to the value in the referenced result
62
+ */
63
+ get path() {
64
+ return this.#path;
65
+ }
66
+ /**
67
+ * Resolves this result reference to a JMAP result reference format
68
+ *
69
+ * Converts the internal symbol-based invocation ID to a string invocation ID
70
+ * suitable for serialisation in a JMAP request.
71
+ *
72
+ * @param lookupId - A function that maps the invocation symbol to its string ID
73
+ * @returns A JMAP result reference object with resultOf, name, and path properties
74
+ * @throws {Error} If the invocation ID cannot be resolved (invocation not found in request)
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * const ref = new ResultReference(invocationId, "Foo/set", "/id");
79
+ * const jmapRef = ref.resolve(id => idMap.get(id));
80
+ * // Returns: { resultOf: "c1", name: "Foo/set", path: "/id" }
81
+ * ```
82
+ */
83
+ resolve(lookupId) {
84
+ const name = this.#name;
85
+ const path = this.#path;
86
+ const resultOf = lookupId(this.#id);
87
+ if (!resultOf) {
88
+ throw new Error(`Failed to resolve id for reference ${JSON.stringify({
89
+ name,
90
+ path,
91
+ })}`);
92
+ }
93
+ return {
94
+ name,
95
+ path,
96
+ resultOf,
97
+ };
98
+ }
99
+ /**
100
+ * Serialises this result reference to an internal JSON format
101
+ *
102
+ * Produces a JSON-serialisable representation that preserves the symbol-based
103
+ * invocation ID for internal use. This is used during the pre-serialisation
104
+ * phase before invocation IDs are resolved to strings.
105
+ *
106
+ * @returns An internal result reference object with the symbol ID
107
+ *
108
+ * @internal
109
+ */
110
+ toJSON() {
111
+ return {
112
+ resultOf: this.#id,
113
+ name: this.#name,
114
+ path: this.#path,
115
+ };
116
+ }
117
+ }
118
+ //# sourceMappingURL=result-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-reference.js","sourceRoot":"","sources":["../../../src/invocation/result-reference.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,OAAO,eAAe;IACf,GAAG,CAAS;IACZ,KAAK,CAAS;IACd,KAAK,CAAS;IAEvB;;;;;;OAMG;IACH,YAAY,EAAU,EAAE,IAAY,EAAE,IAAY;QAC9C,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,QAAwC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACX,sCAAsC,IAAI,CAAC,SAAS,CAAC;gBACjD,IAAI;gBACJ,IAAI;aACP,CAAC,EAAE,CACP,CAAC;QACN,CAAC;QAED,OAAO;YACH,IAAI;YACJ,IAAI;YACJ,QAAQ;SACX,CAAC;IACN,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM;QACF,OAAO;YACH,QAAQ,EAAE,IAAI,CAAC,GAAG;YAClB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK;SACnB,CAAC;IACN,CAAC;CACJ"}