@powerhousedao/reactor-api 6.0.0-dev.6 → 6.0.0-dev.61

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 (211) hide show
  1. package/dist/codegen.js +1 -1
  2. package/dist/codegen.js.map +1 -1
  3. package/dist/src/config.d.ts +1 -2
  4. package/dist/src/config.d.ts.map +1 -1
  5. package/dist/src/config.js +1 -5
  6. package/dist/src/config.js.map +1 -1
  7. package/dist/src/graphql/auth/resolvers.d.ts +17 -0
  8. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
  9. package/dist/src/graphql/auth/resolvers.js +54 -0
  10. package/dist/src/graphql/auth/resolvers.js.map +1 -1
  11. package/dist/src/graphql/auth/schema.graphql +27 -5
  12. package/dist/src/graphql/auth/subgraph.d.ts +25 -0
  13. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
  14. package/dist/src/graphql/auth/subgraph.js +45 -1
  15. package/dist/src/graphql/auth/subgraph.js.map +1 -1
  16. package/dist/src/graphql/base-subgraph.d.ts +12 -3
  17. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  18. package/dist/src/graphql/base-subgraph.js +94 -0
  19. package/dist/src/graphql/base-subgraph.js.map +1 -1
  20. package/dist/src/graphql/document-model-subgraph.d.ts +28 -43
  21. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  22. package/dist/src/graphql/document-model-subgraph.js +425 -83
  23. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  24. package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
  25. package/dist/src/graphql/drive-subgraph.js +47 -35
  26. package/dist/src/graphql/drive-subgraph.js.map +1 -1
  27. package/dist/src/graphql/graphql-manager.d.ts +13 -5
  28. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  29. package/dist/src/graphql/graphql-manager.js +206 -137
  30. package/dist/src/graphql/graphql-manager.js.map +1 -1
  31. package/dist/src/graphql/index.d.ts +1 -0
  32. package/dist/src/graphql/index.d.ts.map +1 -1
  33. package/dist/src/graphql/index.js +1 -0
  34. package/dist/src/graphql/index.js.map +1 -1
  35. package/dist/src/graphql/reactor/adapters.d.ts +10 -2
  36. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
  37. package/dist/src/graphql/reactor/adapters.js +35 -1
  38. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  39. package/dist/src/graphql/reactor/factory.d.ts +12 -1
  40. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  41. package/dist/src/graphql/reactor/factory.js +1 -1
  42. package/dist/src/graphql/reactor/factory.js.map +1 -1
  43. package/dist/src/graphql/reactor/gen/graphql.d.ts +221 -76
  44. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  45. package/dist/src/graphql/reactor/gen/graphql.js +129 -10
  46. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  47. package/dist/src/graphql/reactor/index.d.ts +1 -1
  48. package/dist/src/graphql/reactor/index.d.ts.map +1 -1
  49. package/dist/src/graphql/reactor/index.js +1 -1
  50. package/dist/src/graphql/reactor/index.js.map +1 -1
  51. package/dist/src/graphql/reactor/operations.graphql +84 -1
  52. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
  53. package/dist/src/graphql/reactor/requester.with-zod.js +104 -38
  54. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
  55. package/dist/src/graphql/reactor/resolvers.d.ts +77 -25
  56. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  57. package/dist/src/graphql/reactor/resolvers.js +164 -70
  58. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  59. package/dist/src/graphql/reactor/schema.graphql +70 -30
  60. package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
  61. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  62. package/dist/src/graphql/reactor/subgraph.js +132 -209
  63. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  64. package/dist/src/graphql/reactor/validation.d.ts +23 -5
  65. package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
  66. package/dist/src/graphql/reactor/validation.js +15 -1
  67. package/dist/src/graphql/reactor/validation.js.map +1 -1
  68. package/dist/src/graphql/system/index.d.ts +0 -1
  69. package/dist/src/graphql/system/index.d.ts.map +1 -1
  70. package/dist/src/graphql/system/index.js +0 -1
  71. package/dist/src/graphql/system/index.js.map +1 -1
  72. package/dist/src/graphql/types.d.ts +6 -5
  73. package/dist/src/graphql/types.d.ts.map +1 -1
  74. package/dist/src/graphql/utils.d.ts.map +1 -1
  75. package/dist/src/graphql/utils.js +7 -3
  76. package/dist/src/graphql/utils.js.map +1 -1
  77. package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
  78. package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
  79. package/dist/src/migrations/002_add_document_protection.js +18 -0
  80. package/dist/src/migrations/002_add_document_protection.js.map +1 -0
  81. package/dist/src/migrations/index.d.ts.map +1 -1
  82. package/dist/src/migrations/index.js +2 -0
  83. package/dist/src/migrations/index.js.map +1 -1
  84. package/dist/src/packages/import-loader.d.ts +5 -3
  85. package/dist/src/packages/import-loader.d.ts.map +1 -1
  86. package/dist/src/packages/import-loader.js +19 -10
  87. package/dist/src/packages/import-loader.js.map +1 -1
  88. package/dist/src/packages/package-manager.d.ts +2 -2
  89. package/dist/src/packages/package-manager.d.ts.map +1 -1
  90. package/dist/src/packages/package-manager.js.map +1 -1
  91. package/dist/src/packages/types.d.ts +9 -4
  92. package/dist/src/packages/types.d.ts.map +1 -1
  93. package/dist/src/packages/util.d.ts +3 -2
  94. package/dist/src/packages/util.d.ts.map +1 -1
  95. package/dist/src/packages/util.js +1 -1
  96. package/dist/src/packages/util.js.map +1 -1
  97. package/dist/src/packages/vite-loader.d.ts +10 -8
  98. package/dist/src/packages/vite-loader.d.ts.map +1 -1
  99. package/dist/src/packages/vite-loader.js +33 -10
  100. package/dist/src/packages/vite-loader.js.map +1 -1
  101. package/dist/src/server.d.ts +18 -11
  102. package/dist/src/server.d.ts.map +1 -1
  103. package/dist/src/server.js +147 -90
  104. package/dist/src/server.js.map +1 -1
  105. package/dist/src/services/auth.service.d.ts +0 -12
  106. package/dist/src/services/auth.service.d.ts.map +1 -1
  107. package/dist/src/services/auth.service.js +13 -40
  108. package/dist/src/services/auth.service.js.map +1 -1
  109. package/dist/src/services/authorization.service.d.ts +70 -0
  110. package/dist/src/services/authorization.service.d.ts.map +1 -0
  111. package/dist/src/services/authorization.service.js +155 -0
  112. package/dist/src/services/authorization.service.js.map +1 -0
  113. package/dist/src/services/document-permission.service.d.ts +47 -7
  114. package/dist/src/services/document-permission.service.d.ts.map +1 -1
  115. package/dist/src/services/document-permission.service.js +162 -7
  116. package/dist/src/services/document-permission.service.js.map +1 -1
  117. package/dist/src/tracing.js +3 -1
  118. package/dist/src/tracing.js.map +1 -1
  119. package/dist/src/types.d.ts +5 -5
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/utils/auth.d.ts +1 -1
  122. package/dist/src/utils/auth.d.ts.map +1 -1
  123. package/dist/src/utils/auth.js +5 -12
  124. package/dist/src/utils/auth.js.map +1 -1
  125. package/dist/src/utils/create-schema.d.ts +21 -1
  126. package/dist/src/utils/create-schema.d.ts.map +1 -1
  127. package/dist/src/utils/create-schema.js +289 -16
  128. package/dist/src/utils/create-schema.js.map +1 -1
  129. package/dist/src/utils/db.d.ts +8 -0
  130. package/dist/src/utils/db.d.ts.map +1 -1
  131. package/dist/src/utils/db.js.map +1 -1
  132. package/dist/src/utils/drive-url.d.ts +2 -0
  133. package/dist/src/utils/drive-url.d.ts.map +1 -0
  134. package/dist/src/utils/drive-url.js +3 -0
  135. package/dist/src/utils/drive-url.js.map +1 -0
  136. package/dist/src/utils/index.d.ts +1 -0
  137. package/dist/src/utils/index.d.ts.map +1 -1
  138. package/dist/src/utils/index.js +1 -0
  139. package/dist/src/utils/index.js.map +1 -1
  140. package/dist/test/authorization.service.test.d.ts +2 -0
  141. package/dist/test/authorization.service.test.d.ts.map +1 -0
  142. package/dist/test/authorization.service.test.js +252 -0
  143. package/dist/test/authorization.service.test.js.map +1 -0
  144. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
  145. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
  146. package/dist/test/connect-switchboard-reshuffle-convergence.test.js +203 -0
  147. package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
  148. package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
  149. package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
  150. package/dist/test/connect-switchboard-sync.test.js +581 -0
  151. package/dist/test/connect-switchboard-sync.test.js.map +1 -0
  152. package/dist/test/document-drive-subgraph.test.d.ts +2 -0
  153. package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
  154. package/dist/test/document-drive-subgraph.test.js +186 -0
  155. package/dist/test/document-drive-subgraph.test.js.map +1 -0
  156. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts +2 -0
  157. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts.map +1 -0
  158. package/dist/test/document-model-subgraph-legacy-permissions.test.js +460 -0
  159. package/dist/test/document-model-subgraph-legacy-permissions.test.js.map +1 -0
  160. package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
  161. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
  162. package/dist/test/document-model-subgraph-permissions.test.js +573 -0
  163. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
  164. package/dist/test/document-model-subgraph.test.d.ts +2 -0
  165. package/dist/test/document-model-subgraph.test.d.ts.map +1 -0
  166. package/dist/test/document-model-subgraph.test.js +439 -0
  167. package/dist/test/document-model-subgraph.test.js.map +1 -0
  168. package/dist/test/drive-handlers.js +1 -1
  169. package/dist/test/drive-handlers.js.map +1 -1
  170. package/dist/test/drive-info-endpoint.test.d.ts +2 -0
  171. package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
  172. package/dist/test/drive-info-endpoint.test.js +123 -0
  173. package/dist/test/drive-info-endpoint.test.js.map +1 -0
  174. package/dist/test/drive-subgraph-permissions.test.js +1 -30
  175. package/dist/test/drive-subgraph-permissions.test.js.map +1 -1
  176. package/dist/test/permissions-integration.test.js +5 -19
  177. package/dist/test/permissions-integration.test.js.map +1 -1
  178. package/dist/test/push-backfill.test.d.ts +2 -0
  179. package/dist/test/push-backfill.test.d.ts.map +1 -0
  180. package/dist/test/push-backfill.test.js +298 -0
  181. package/dist/test/push-backfill.test.js.map +1 -0
  182. package/dist/test/reactor-client.test.js +4 -4
  183. package/dist/test/reactor-client.test.js.map +1 -1
  184. package/dist/test/reactor-resolvers.test.js +8 -11
  185. package/dist/test/reactor-resolvers.test.js.map +1 -1
  186. package/dist/test/reactor-subgraph-permissions.test.js +6 -35
  187. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  188. package/dist/test/subscriptions.test.js +2 -0
  189. package/dist/test/subscriptions.test.js.map +1 -1
  190. package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
  191. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
  192. package/dist/test/utils/gql-resolver-bridge.js +36 -7
  193. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  194. package/dist/tsconfig.tsbuildinfo +1 -1
  195. package/package.json +44 -55
  196. package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
  197. package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
  198. package/dist/src/graphql/system/system-subgraph.js +0 -130
  199. package/dist/src/graphql/system/system-subgraph.js.map +0 -1
  200. package/dist/test/system.test.d.ts +0 -2
  201. package/dist/test/system.test.d.ts.map +0 -1
  202. package/dist/test/system.test.js +0 -211
  203. package/dist/test/system.test.js.map +0 -1
  204. package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
  205. package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
  206. package/dist/test/three-reactor-gql-sync.test.js +0 -368
  207. package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
  208. package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
  209. package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
  210. package/dist/test/two-reactor-gql-sync.test.js +0 -348
  211. package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
@@ -0,0 +1,573 @@
1
+ import { GraphQLError } from "graphql";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { DocumentModelSubgraph } from "../src/graphql/document-model-subgraph.js";
4
+ describe("DocumentModelSubgraph Permission Checks", () => {
5
+ let mockDocumentPermissionService;
6
+ let mockReactor;
7
+ let mockReactorClient;
8
+ let subgraph;
9
+ const mockDocumentModel = {
10
+ documentModel: {
11
+ global: {
12
+ id: "powerhouse/test-model",
13
+ name: "Test Model",
14
+ specifications: [
15
+ {
16
+ version: 1,
17
+ changeLog: [],
18
+ modules: [
19
+ {
20
+ name: "Base",
21
+ operations: [
22
+ { name: "SET_NAME" },
23
+ { name: "SET_VALUE" },
24
+ { name: "RESTRICTED_OP" },
25
+ ],
26
+ },
27
+ ],
28
+ state: { global: {}, local: {} },
29
+ },
30
+ ],
31
+ },
32
+ },
33
+ actions: {
34
+ setName: vi.fn((input) => ({ type: "SET_NAME", input })),
35
+ setValue: vi.fn((input) => ({ type: "SET_VALUE", input })),
36
+ restrictedOp: vi.fn((input) => ({ type: "RESTRICTED_OP", input })),
37
+ },
38
+ reducer: vi.fn(),
39
+ };
40
+ const createMockDocument = (id, name) => ({
41
+ header: {
42
+ id,
43
+ slug: id,
44
+ name,
45
+ documentType: "powerhouse/test-model",
46
+ revision: { global: 1 },
47
+ createdAtUtcIso: new Date().toISOString(),
48
+ lastModifiedAtUtcIso: new Date().toISOString(),
49
+ },
50
+ state: {
51
+ global: { name },
52
+ local: {},
53
+ },
54
+ initialState: {
55
+ global: { name },
56
+ local: {},
57
+ },
58
+ operations: {
59
+ global: [],
60
+ local: [],
61
+ },
62
+ attachments: {},
63
+ clipboard: [],
64
+ });
65
+ const mockDocument = createMockDocument("doc-123", "Test Document");
66
+ const createContext = (options) => ({
67
+ user: options.userAddress ? { address: options.userAddress } : undefined,
68
+ isAdmin: vi.fn().mockReturnValue(options.isAdmin ?? false),
69
+ });
70
+ beforeEach(() => {
71
+ vi.clearAllMocks();
72
+ mockDocumentPermissionService = {
73
+ canRead: vi.fn().mockResolvedValue(false),
74
+ canWrite: vi.fn().mockResolvedValue(false),
75
+ canReadDocument: vi.fn().mockResolvedValue(false),
76
+ canWriteDocument: vi.fn().mockResolvedValue(false),
77
+ isOperationRestricted: vi.fn().mockResolvedValue(false),
78
+ canExecuteOperation: vi.fn().mockResolvedValue(false),
79
+ };
80
+ mockReactor = {
81
+ getDocument: vi.fn().mockResolvedValue(mockDocument),
82
+ getDocuments: vi.fn().mockResolvedValue(["doc-123"]),
83
+ addDocument: vi.fn().mockResolvedValue(mockDocument),
84
+ addAction: vi.fn().mockResolvedValue({
85
+ status: "SUCCESS",
86
+ operations: [{ index: 1 }],
87
+ }),
88
+ };
89
+ mockReactorClient = {
90
+ getParents: vi.fn().mockResolvedValue({
91
+ results: [],
92
+ options: { limit: 10, cursor: "" },
93
+ }),
94
+ getChildren: vi.fn().mockResolvedValue({
95
+ results: [],
96
+ options: { limit: 10, cursor: "" },
97
+ }),
98
+ get: vi.fn().mockResolvedValue(mockDocument),
99
+ find: vi.fn().mockResolvedValue({
100
+ results: [mockDocument],
101
+ options: { limit: 10, cursor: "" },
102
+ }),
103
+ createEmpty: vi.fn().mockResolvedValue(mockDocument),
104
+ execute: vi.fn().mockResolvedValue({
105
+ ...mockDocument,
106
+ header: { ...mockDocument.header, revision: { global: 2 } },
107
+ }),
108
+ };
109
+ subgraph = new DocumentModelSubgraph(mockDocumentModel, {
110
+ reactor: mockReactor,
111
+ reactorClient: mockReactorClient,
112
+ documentPermissionService: mockDocumentPermissionService,
113
+ relationalDb: {},
114
+ graphqlManager: {},
115
+ syncManager: {},
116
+ });
117
+ });
118
+ describe("Query: document", () => {
119
+ // Updated to match new flat resolver structure (TestModel_document instead of TestModel.getDocument)
120
+ const callGetDocument = async (ctx, identifier) => {
121
+ const queryResolver = subgraph.resolvers.Query
122
+ ?.TestModel_document;
123
+ return queryResolver(null, { identifier }, ctx);
124
+ };
125
+ describe("Global Admin Access", () => {
126
+ it("should allow access when user is global admin", async () => {
127
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
128
+ const result = await callGetDocument(ctx, "doc-123");
129
+ // Result is DocumentWithChildren: { document: PHDocument, childIds: string[] }
130
+ expect(result).toBeDefined();
131
+ expect(result.document.id).toBe("doc-123");
132
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
133
+ });
134
+ });
135
+ describe("Document Permission Access", () => {
136
+ it("should check document permissions when no global access", async () => {
137
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
138
+ const ctx = createContext({ userAddress: "0xpermitted" });
139
+ const result = await callGetDocument(ctx, "doc-123");
140
+ expect(result).toBeDefined();
141
+ expect(mockDocumentPermissionService.canRead).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
142
+ });
143
+ it("should deny access when user has no permissions", async () => {
144
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
145
+ const ctx = createContext({ userAddress: "0xunpermitted" });
146
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow(GraphQLError);
147
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden: insufficient permissions to read this document");
148
+ });
149
+ it("should deny access when user is not authenticated", async () => {
150
+ const ctx = createContext({});
151
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
152
+ });
153
+ });
154
+ describe("Document validation", () => {
155
+ it("should throw error when identifier is not provided", async () => {
156
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
157
+ await expect(callGetDocument(ctx, "")).rejects.toThrow("Document identifier is required");
158
+ });
159
+ // Note: Drive validation is no longer part of document query in new API
160
+ // Documents are retrieved directly by identifier, parentId filtering is done via findDocuments
161
+ it.skip("should verify document is in specified drive when driveId provided", async () => {
162
+ mockReactorClient.find = vi.fn().mockResolvedValue({
163
+ results: [],
164
+ options: { limit: 10, cursor: "" },
165
+ });
166
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
167
+ // This test is no longer applicable - drive filtering is done via findDocuments
168
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("is not part of");
169
+ });
170
+ it("should throw error if document type does not match", async () => {
171
+ const wrongTypeDoc = {
172
+ ...mockDocument,
173
+ header: { ...mockDocument.header, documentType: "other/type" },
174
+ };
175
+ mockReactorClient.get = vi.fn().mockResolvedValue(wrongTypeDoc);
176
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
177
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("is not of type");
178
+ });
179
+ });
180
+ describe("Permission inheritance (hierarchy)", () => {
181
+ it("should pass getParentIdsFn that retrieves parent IDs", async () => {
182
+ const mockParents = [
183
+ createMockDocument("parent-1", "Parent 1"),
184
+ createMockDocument("parent-2", "Parent 2"),
185
+ ];
186
+ vi.mocked(mockReactorClient.getParents).mockResolvedValue({
187
+ results: mockParents,
188
+ options: { limit: 10, cursor: "" },
189
+ });
190
+ let capturedGetParentsFn = null;
191
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
192
+ capturedGetParentsFn = getParentsFn;
193
+ return true;
194
+ });
195
+ const ctx = createContext({ userAddress: "0xuser" });
196
+ await callGetDocument(ctx, "child-doc");
197
+ expect(capturedGetParentsFn).not.toBeNull();
198
+ const parentIds = await capturedGetParentsFn("child-doc");
199
+ expect(parentIds).toEqual(["parent-1", "parent-2"]);
200
+ });
201
+ it("should return empty array if getParents fails", async () => {
202
+ vi.mocked(mockReactorClient.getParents).mockRejectedValue(new Error("Not found"));
203
+ let capturedGetParentsFn = null;
204
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
205
+ capturedGetParentsFn = getParentsFn;
206
+ return true;
207
+ });
208
+ const ctx = createContext({ userAddress: "0xuser" });
209
+ await callGetDocument(ctx, "child-doc");
210
+ const parentIds = await capturedGetParentsFn("child-doc");
211
+ expect(parentIds).toEqual([]);
212
+ });
213
+ });
214
+ describe("reactorClient integration", () => {
215
+ // Note: Drive filtering is now done via findDocuments, not document query
216
+ it.skip("should use reactorClient.find to check document in drive", async () => {
217
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
218
+ await callGetDocument(ctx, "doc-123");
219
+ // This test is no longer applicable - drive filtering is done via findDocuments
220
+ expect(mockReactorClient.find).toHaveBeenCalledWith({
221
+ parentId: "drive-1",
222
+ ids: ["doc-123"],
223
+ });
224
+ });
225
+ it("should use reactorClient.get to fetch document", async () => {
226
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
227
+ await callGetDocument(ctx, "doc-123");
228
+ // The shared resolver calls get with identifier and optional view
229
+ expect(mockReactorClient.get).toHaveBeenCalledWith("doc-123", undefined);
230
+ });
231
+ });
232
+ });
233
+ describe("Query: findDocuments", () => {
234
+ // Updated to match new flat resolver structure (TestModel_findDocuments)
235
+ const callFindDocuments = async (ctx, parentId) => {
236
+ const queryResolver = subgraph.resolvers.Query
237
+ ?.TestModel_findDocuments;
238
+ const result = await queryResolver(null, { search: { parentId }, paging: { limit: 10 } }, ctx);
239
+ return result.items;
240
+ };
241
+ describe("Global Role Access", () => {
242
+ it("should return all documents for admin", async () => {
243
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
244
+ const result = await callFindDocuments(ctx, "drive-1");
245
+ expect(result).toHaveLength(1);
246
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
247
+ });
248
+ });
249
+ describe("Document Permission Filtering", () => {
250
+ beforeEach(() => {
251
+ const docs = [
252
+ createMockDocument("doc-1", "Doc 1"),
253
+ createMockDocument("doc-2", "Doc 2"),
254
+ createMockDocument("doc-3", "Doc 3"),
255
+ ];
256
+ mockReactorClient.find = vi.fn().mockResolvedValue({
257
+ results: docs,
258
+ options: { limit: 10, cursor: "" },
259
+ });
260
+ });
261
+ it("should filter documents based on permissions when no global access", async () => {
262
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1" || docId === "doc-1" || docId === "doc-3");
263
+ const ctx = createContext({ userAddress: "0xpartial" });
264
+ const result = await callFindDocuments(ctx, "drive-1");
265
+ expect(result).toHaveLength(2);
266
+ expect(result.map((d) => d.id).sort()).toEqual(["doc-1", "doc-3"]);
267
+ });
268
+ it("should return empty array when user has no document permissions", async () => {
269
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1");
270
+ const ctx = createContext({ userAddress: "0xnopermissions" });
271
+ const result = await callFindDocuments(ctx, "drive-1");
272
+ expect(result).toHaveLength(0);
273
+ });
274
+ });
275
+ describe("Permission filtering", () => {
276
+ // Note: In the new API, findDocuments filters results based on individual document permissions
277
+ // rather than checking drive permission first
278
+ it("should filter documents when user has no global access", async () => {
279
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
280
+ const ctx = createContext({ userAddress: "0xunpermitted" });
281
+ // With no permissions, all documents should be filtered out
282
+ const result = await callFindDocuments(ctx, "drive-1");
283
+ expect(result).toHaveLength(0);
284
+ });
285
+ });
286
+ describe("reactorClient integration", () => {
287
+ it("should use reactorClient.find with type filter", async () => {
288
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
289
+ await callFindDocuments(ctx, "drive-1");
290
+ // The shared resolver now uses find with these parameters - first call includes type filter
291
+ expect(mockReactorClient.find).toHaveBeenCalledWith(expect.objectContaining({
292
+ type: "powerhouse/test-model",
293
+ parentId: "drive-1",
294
+ }), undefined, expect.objectContaining({
295
+ limit: 10,
296
+ }));
297
+ });
298
+ });
299
+ });
300
+ describe("Mutation: createDocument", () => {
301
+ const callCreateDocument = async (ctx, name, parentIdentifier) => {
302
+ const mutation = subgraph.resolvers.Mutation
303
+ ?.TestModel_createDocument;
304
+ return mutation(null, { name, parentIdentifier }, ctx);
305
+ };
306
+ describe("Global Admin Access", () => {
307
+ it("should allow creation when user is global admin", async () => {
308
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
309
+ const result = await callCreateDocument(ctx, "New Doc");
310
+ expect(result).toMatchObject({ id: "doc-123" });
311
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
312
+ });
313
+ });
314
+ describe("With parentIdentifier", () => {
315
+ it("should check write permission on parent when parentIdentifier provided", async () => {
316
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
317
+ const ctx = createContext({ userAddress: "0xpermitted" });
318
+ const result = await callCreateDocument(ctx, "New Doc", "drive-1");
319
+ expect(result).toMatchObject({ id: "doc-123" });
320
+ expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("drive-1", "0xpermitted", expect.any(Function));
321
+ });
322
+ it("should deny creation when user cannot write to parent", async () => {
323
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
324
+ const ctx = createContext({ userAddress: "0xunpermitted" });
325
+ await expect(callCreateDocument(ctx, "New Doc", "drive-1")).rejects.toThrow("Forbidden");
326
+ });
327
+ });
328
+ describe("Without parentIdentifier", () => {
329
+ it("should check global write access when no parentIdentifier", async () => {
330
+ const ctx = createContext({ userAddress: "0xnoglobal" });
331
+ await expect(callCreateDocument(ctx, "New Doc")).rejects.toThrow("Forbidden: insufficient permissions to create documents");
332
+ });
333
+ });
334
+ describe("reactorClient integration", () => {
335
+ it("should use reactorClient.createEmpty with parentIdentifier", async () => {
336
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
337
+ await callCreateDocument(ctx, "New Doc", "drive-1");
338
+ expect(mockReactorClient.createEmpty).toHaveBeenCalledWith("powerhouse/test-model", { parentIdentifier: "drive-1" });
339
+ });
340
+ it("should use reactorClient.execute to set name", async () => {
341
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
342
+ await callCreateDocument(ctx, "New Doc");
343
+ expect(mockReactorClient.execute).toHaveBeenCalledWith("doc-123", "main", [expect.objectContaining({ type: "SET_NAME" })]);
344
+ });
345
+ it("should not call execute if name is empty", async () => {
346
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
347
+ await callCreateDocument(ctx, "");
348
+ expect(mockReactorClient.createEmpty).toHaveBeenCalled();
349
+ expect(mockReactorClient.execute).not.toHaveBeenCalled();
350
+ });
351
+ });
352
+ });
353
+ describe("Mutation: operations (setName, setValue, etc.)", () => {
354
+ const callMutation = async (ctx, operationName, docId, input) => {
355
+ const mutation = subgraph.resolvers.Mutation?.[`TestModel_${operationName}`];
356
+ return mutation(null, { docId, input }, ctx);
357
+ };
358
+ describe("Write Permission Check", () => {
359
+ it("should check write permission before executing operation", async () => {
360
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
361
+ const ctx = createContext({ userAddress: "0xpermitted" });
362
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
363
+ expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
364
+ });
365
+ it("should deny operation when user cannot write", async () => {
366
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
367
+ const ctx = createContext({ userAddress: "0xunpermitted" });
368
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("Forbidden: insufficient permissions to write");
369
+ });
370
+ it("should allow operation for global admin without permission check", async () => {
371
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
372
+ const result = await callMutation(ctx, "setName", "doc-123", {
373
+ name: "New Name",
374
+ });
375
+ expect(result).toMatchObject({
376
+ id: "doc-123",
377
+ revisionsList: expect.arrayContaining([
378
+ expect.objectContaining({ scope: "global", revision: 2 }),
379
+ ]),
380
+ });
381
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
382
+ });
383
+ });
384
+ describe("Operation-Level Permission Check", () => {
385
+ it("should check operation restriction after write permission", async () => {
386
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
387
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
388
+ const ctx = createContext({ userAddress: "0xpermitted" });
389
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
390
+ expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_NAME");
391
+ });
392
+ it("should allow operation when not restricted", async () => {
393
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
394
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
395
+ const ctx = createContext({ userAddress: "0xpermitted" });
396
+ const result = await callMutation(ctx, "setName", "doc-123", {
397
+ name: "New Name",
398
+ });
399
+ expect(result).toMatchObject({
400
+ id: "doc-123",
401
+ revisionsList: expect.arrayContaining([
402
+ expect.objectContaining({ scope: "global", revision: 2 }),
403
+ ]),
404
+ });
405
+ expect(mockDocumentPermissionService.canExecuteOperation).not.toHaveBeenCalled();
406
+ });
407
+ it("should check operation permission when operation is restricted", async () => {
408
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
409
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
410
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
411
+ const ctx = createContext({ userAddress: "0xauthorized" });
412
+ const result = await callMutation(ctx, "restrictedOp", "doc-123", {
413
+ value: 42,
414
+ });
415
+ expect(result).toMatchObject({
416
+ id: "doc-123",
417
+ revisionsList: expect.arrayContaining([
418
+ expect.objectContaining({ scope: "global", revision: 2 }),
419
+ ]),
420
+ });
421
+ expect(mockDocumentPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-123", "RESTRICTED_OP", "0xauthorized");
422
+ });
423
+ it("should deny operation when user lacks operation permission", async () => {
424
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
425
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
426
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(false);
427
+ const ctx = createContext({ userAddress: "0xunauthorized" });
428
+ await expect(callMutation(ctx, "restrictedOp", "doc-123", { value: 42 })).rejects.toThrow('Forbidden: insufficient permissions to execute operation "RESTRICTED_OP"');
429
+ });
430
+ it("should skip operation restriction check for global admin", async () => {
431
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
432
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
433
+ await callMutation(ctx, "restrictedOp", "doc-123", { value: 42 });
434
+ expect(mockDocumentPermissionService.isOperationRestricted).not.toHaveBeenCalled();
435
+ });
436
+ });
437
+ describe("Document type validation", () => {
438
+ it("should throw error when document type does not match", async () => {
439
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
440
+ const wrongTypeDoc = {
441
+ ...mockDocument,
442
+ header: { ...mockDocument.header, documentType: "other/type" },
443
+ };
444
+ mockReactorClient.get = vi.fn().mockResolvedValue(wrongTypeDoc);
445
+ const ctx = createContext({ userAddress: "0xpermitted" });
446
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("is not of type");
447
+ });
448
+ });
449
+ describe("reactorClient integration", () => {
450
+ it("should use reactorClient.get to verify document", async () => {
451
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
452
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
453
+ expect(mockReactorClient.get).toHaveBeenCalledWith("doc-123");
454
+ });
455
+ it("should use reactorClient.execute to apply action", async () => {
456
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
457
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
458
+ expect(mockReactorClient.execute).toHaveBeenCalledWith("doc-123", "main", [expect.objectContaining({ type: "SET_NAME" })]);
459
+ });
460
+ it("should return PHDocument from updated document", async () => {
461
+ mockReactorClient.execute = vi.fn().mockResolvedValue({
462
+ ...mockDocument,
463
+ header: { ...mockDocument.header, revision: { global: 42 } },
464
+ });
465
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
466
+ const result = await callMutation(ctx, "setName", "doc-123", {
467
+ name: "New Name",
468
+ });
469
+ expect(result).toMatchObject({
470
+ id: "doc-123",
471
+ revisionsList: expect.arrayContaining([
472
+ expect.objectContaining({ scope: "global", revision: 42 }),
473
+ ]),
474
+ });
475
+ });
476
+ it("should handle execute errors gracefully", async () => {
477
+ mockReactorClient.execute = vi
478
+ .fn()
479
+ .mockRejectedValue(new Error("Execute failed"));
480
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
481
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("Execute failed");
482
+ });
483
+ });
484
+ });
485
+ describe("AUTH_ENABLED=false behavior", () => {
486
+ it("should allow all read access when admin role returns true", async () => {
487
+ const ctx = createContext({
488
+ isAdmin: true,
489
+ userAddress: "0xanyone",
490
+ });
491
+ const queryResolver = subgraph.resolvers.Query
492
+ ?.TestModel_document;
493
+ const result = await queryResolver(null, { identifier: "doc-123" }, ctx);
494
+ expect(result).toBeDefined();
495
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
496
+ });
497
+ it("should allow all write access when admin role returns true", async () => {
498
+ const ctx = createContext({
499
+ isAdmin: true,
500
+ userAddress: "0xanyone",
501
+ });
502
+ const result = await subgraph.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
503
+ expect(result).toMatchObject({
504
+ id: "doc-123",
505
+ revisionsList: expect.arrayContaining([
506
+ expect.objectContaining({ scope: "global", revision: 2 }),
507
+ ]),
508
+ });
509
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
510
+ });
511
+ });
512
+ describe("No Permission Service", () => {
513
+ let subgraphWithoutPermService;
514
+ beforeEach(() => {
515
+ subgraphWithoutPermService = new DocumentModelSubgraph(mockDocumentModel, {
516
+ reactor: mockReactor,
517
+ reactorClient: mockReactorClient,
518
+ documentPermissionService: undefined,
519
+ relationalDb: {},
520
+ graphqlManager: {},
521
+ syncManager: {},
522
+ });
523
+ });
524
+ it("should deny read access when no permission service and no global access", async () => {
525
+ const ctx = createContext({ userAddress: "0xuser" });
526
+ const queryResolver = subgraphWithoutPermService.resolvers.Query
527
+ ?.TestModel_document;
528
+ await expect(queryResolver(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
529
+ });
530
+ it("should deny write access when no permission service and no global access", async () => {
531
+ const ctx = createContext({ userAddress: "0xuser" });
532
+ await expect(subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx)).rejects.toThrow("Forbidden");
533
+ });
534
+ it("should allow access with global roles even without permission service", async () => {
535
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
536
+ const queryResolver = subgraphWithoutPermService.resolvers.Query
537
+ ?.TestModel_document;
538
+ const result = await queryResolver(null, { identifier: "doc-123" }, ctx);
539
+ expect(result).toBeDefined();
540
+ });
541
+ it("should skip operation restriction check when no permission service", async () => {
542
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
543
+ const result = await subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
544
+ expect(result).toMatchObject({
545
+ id: "doc-123",
546
+ revisionsList: expect.arrayContaining([
547
+ expect.objectContaining({ scope: "global", revision: 2 }),
548
+ ]),
549
+ });
550
+ });
551
+ });
552
+ describe("Edge Cases", () => {
553
+ it("should handle empty user address in context", async () => {
554
+ const ctx = {
555
+ user: { address: "" },
556
+ isAdmin: vi.fn().mockReturnValue(false),
557
+ };
558
+ const queryResolver = subgraph.resolvers.Query
559
+ ?.TestModel_document;
560
+ await expect(queryResolver(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
561
+ expect(ctx.isAdmin).toHaveBeenCalledWith("");
562
+ });
563
+ it("should pass correct operation type name to permission check", async () => {
564
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
565
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
566
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
567
+ const ctx = createContext({ userAddress: "0xuser" });
568
+ await subgraph.resolvers.Mutation?.TestModel_setValue(null, { docId: "doc-123", input: { value: 42 } }, ctx);
569
+ expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_VALUE");
570
+ });
571
+ });
572
+ });
573
+ //# sourceMappingURL=document-model-subgraph-permissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-model-subgraph-permissions.test.js","sourceRoot":"","sources":["../../test/document-model-subgraph-permissions.test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAIlF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,IAAI,6BAAiE,CAAC;IACtE,IAAI,WAA0C,CAAC;IAC/C,IAAI,iBAA0C,CAAC;IAC/C,IAAI,QAA+B,CAAC;IAEpC,MAAM,iBAAiB,GAAwB;QAC7C,aAAa,EAAE;YACb,MAAM,EAAE;gBACN,EAAE,EAAE,uBAAuB;gBAC3B,IAAI,EAAE,YAAY;gBAClB,cAAc,EAAE;oBACd;wBACE,OAAO,EAAE,CAAC;wBACV,SAAS,EAAE,EAAE;wBACb,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,UAAU,EAAE;oCACV,EAAE,IAAI,EAAE,UAAU,EAAE;oCACpB,EAAE,IAAI,EAAE,WAAW,EAAE;oCACrB,EAAE,IAAI,EAAE,eAAe,EAAE;iCAC1B;6BACF;yBACF;wBACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;qBACjC;iBACF;aACF;SACF;QACD,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7D,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;SACxE;QACD,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;KACiB,CAAC;IAEpC,MAAM,kBAAkB,GAAG,CAAC,EAAU,EAAE,IAAY,EAAc,EAAE,CAClE,CAAC;QACC,MAAM,EAAE;YACN,EAAE;YACF,IAAI,EAAE,EAAE;YACR,IAAI;YACJ,YAAY,EAAE,uBAAuB;YACrC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;YACvB,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACzC,oBAAoB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC/C;QACD,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,IAAI,EAAE;YAChB,KAAK,EAAE,EAAE;SACV;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,EAAE,IAAI,EAAE;YAChB,KAAK,EAAE,EAAE;SACV;QACD,UAAU,EAAE;YACV,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;SACV;QACD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,EAAE;KACd,CAA0B,CAAC;IAE9B,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,CAAC,OAGtB,EAAW,EAAE,CACZ,CAAC;QACC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACxE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;KAC3D,CAAuB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,6BAA6B,GAAG;YAC9B,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACzC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC1C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACjD,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAClD,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACvD,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;SACtD,CAAC;QAEF,WAAW,GAAG;YACZ,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACpD,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC;YACpD,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACpD,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACnC,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;aAC3B,CAAC;SACH,CAAC;QAEF,iBAAiB,GAAG;YAClB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACpC,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;aACP,CAAC;YAC9B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACrC,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;aACP,CAAC;YAC9B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;YAC5C,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC9B,OAAO,EAAE,CAAC,YAAY,CAAC;gBACvB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;aACP,CAAC;YAC9B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;YACpD,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACjC,GAAG,YAAY;gBACf,MAAM,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;aAC5D,CAAC;SACH,CAAC;QAEF,QAAQ,GAAG,IAAI,qBAAqB,CAAC,iBAAiB,EAAE;YACtD,OAAO,EAAE,WAAmC;YAC5C,aAAa,EAAE,iBAAmC;YAClD,yBAAyB,EACvB,6BAA0D;YAC5D,YAAY,EAAE,EAAS;YACvB,cAAc,EAAE,EAAS;YACzB,WAAW,EAAE,EAAS;SACP,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,qGAAqG;QACrG,MAAM,eAAe,GAAG,KAAK,EAAE,GAAY,EAAE,UAAkB,EAAE,EAAE;YACjE,MAAM,aAAa,GAAI,QAAQ,CAAC,SAAS,CAAC,KAAa;gBACrD,EAAE,kBAAkB,CAAC;YACvB,OAAO,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;gBAC7D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAErD,+EAA+E;gBAC/E,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3C,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,iBAAiB,CACjE,IAAI,CACL,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAErD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAChE,SAAS,EACT,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,iBAAiB,CACjE,KAAK,CACN,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;gBAE5D,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3D,YAAY,CACb,CAAC;gBACF,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3D,2DAA2D,CAC5D,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;gBACjE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;gBAE9B,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3D,WAAW,CACZ,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBAClE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACpD,iCAAiC,CAClC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,wEAAwE;YACxE,+FAA+F;YAC/F,EAAE,CAAC,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;gBACvF,iBAAiB,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;oBACjD,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBACP,CAAC,CAAC;gBAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,gFAAgF;gBAChF,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3D,gBAAgB,CACjB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBAClE,MAAM,YAAY,GAAG;oBACnB,GAAG,YAAY;oBACf,MAAM,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE;iBAC/D,CAAC;gBACF,iBAAiB,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBAChE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC3D,gBAAgB,CACjB,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAClD,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,MAAM,WAAW,GAAG;oBAClB,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC;oBAC1C,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC;iBAC3C,CAAC;gBACF,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAW,CAAC,CAAC,iBAAiB,CAAC;oBACzD,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBACP,CAAC,CAAC;gBAE/B,IAAI,oBAAoB,GAEb,IAAI,CAAC;gBAChB,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,kBAAkB,CAClE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;oBACpC,oBAAoB,GAAG,YAAY,CAAC;oBACpC,OAAO,IAAI,CAAC;gBACd,CAAC,CACF,CAAC;gBAEF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrD,MAAM,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAExC,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,MAAM,oBAAqB,CAAC,WAAW,CAAC,CAAC;gBAC3D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;gBAC7D,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAW,CAAC,CAAC,iBAAiB,CACxD,IAAI,KAAK,CAAC,WAAW,CAAC,CACvB,CAAC;gBAEF,IAAI,oBAAoB,GAEb,IAAI,CAAC;gBAChB,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,kBAAkB,CAClE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;oBACpC,oBAAoB,GAAG,YAAY,CAAC;oBACpC,OAAO,IAAI,CAAC;gBACd,CAAC,CACF,CAAC;gBAEF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrD,MAAM,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAExC,MAAM,SAAS,GAAG,MAAM,oBAAqB,CAAC,WAAW,CAAC,CAAC;gBAC3D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,0EAA0E;YAC1E,EAAE,CAAC,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;gBAC7E,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEtC,gFAAgF;gBAChF,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC;oBAClD,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,CAAC,SAAS,CAAC;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEtC,kEAAkE;gBAClE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAChD,SAAS,EACT,SAAS,CACV,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,yEAAyE;QACzE,MAAM,iBAAiB,GAAG,KAAK,EAAE,GAAY,EAAE,QAAiB,EAAE,EAAE;YAClE,MAAM,aAAa,GAAI,QAAQ,CAAC,SAAS,CAAC,KAAa;gBACrD,EAAE,uBAAuB,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,IAAI,EACJ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAC/C,GAAG,CACJ,CAAC;YACF,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC;QAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAClC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;gBACrD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC7C,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,IAAI,GAAG;oBACX,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;oBACpC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;oBACpC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;iBACrC,CAAC;gBACF,iBAAiB,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;oBACjD,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;iBACP,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;gBAClF,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,kBAAkB,CAClE,KAAK,EAAE,KAAK,EAAE,EAAE,CACd,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,CAChE,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;gBAExD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;gBAC/E,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,kBAAkB,CAClE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACrC,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBAE9D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;YACpC,+FAA+F;YAC/F,8CAA8C;YAC9C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;gBACtE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,OAAQ,CAAC,CAAC,iBAAiB,CACjE,KAAK,CACN,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;gBAE5D,4DAA4D;gBAC5D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAExC,4FAA4F;gBAC5F,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACjD,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,uBAAuB;oBAC7B,QAAQ,EAAE,SAAS;iBACpB,CAAC,EACF,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;oBACtB,KAAK,EAAE,EAAE;iBACV,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,MAAM,kBAAkB,GAAG,KAAK,EAC9B,GAAY,EACZ,IAAY,EACZ,gBAAyB,EACzB,EAAE;YACF,MAAM,QAAQ,GAAI,QAAQ,CAAC,SAAS,CAAC,QAAgB;gBACnD,EAAE,wBAAwB,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC,CAAC;QAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAExD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACrC,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;gBACtF,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAEnE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACjE,SAAS,EACT,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;gBACrE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,KAAK,CACN,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;gBAE5D,MAAM,MAAM,CACV,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAC9C,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;gBAEzD,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9D,yDAAyD,CAC1D,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBAC1E,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAEpD,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACxD,uBAAuB,EACvB,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAChC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC5D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAEzC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACpD,SAAS,EACT,MAAM,EACN,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAChD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAElC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;gBACzD,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC9D,MAAM,YAAY,GAAG,KAAK,EACxB,GAAY,EACZ,aAAqB,EACrB,KAAa,EACb,KAAc,EACd,EAAE;YACF,MAAM,QAAQ,GAAI,QAAQ,CAAC,SAAS,CAAC,QAAgB,EAAE,CACrD,aAAa,aAAa,EAAE,CAC7B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACtC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;gBACxE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEpE,MAAM,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACjE,SAAS,EACT,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;gBAC5D,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,KAAK,CACN,CAAC;gBACF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;gBAE5D,MAAM,MAAM,CACV,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAC9D,CAAC,OAAO,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;gBAChF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE;oBAC3D,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;oBAC3B,EAAE,EAAE,SAAS;oBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;wBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;qBAC1D,CAAC;iBACH,CAAC,CAAC;gBACH,MAAM,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAChD,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEpE,MAAM,CACJ,6BAA6B,CAAC,qBAAqB,CACpD,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBAC1D,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE;oBAC3D,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;oBAC3B,EAAE,EAAE,SAAS;oBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;wBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;qBAC1D,CAAC;iBACH,CAAC,CAAC;gBACH,MAAM,CACJ,6BAA6B,CAAC,mBAAmB,CAClD,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;gBAC9E,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1B,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,mBAAoB,CACnD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;gBAE3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE;oBAChE,KAAK,EAAE,EAAE;iBACV,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;oBAC3B,EAAE,EAAE,SAAS;oBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;wBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;qBAC1D,CAAC;iBACH,CAAC,CAAC;gBACH,MAAM,CACJ,6BAA6B,CAAC,mBAAmB,CAClD,CAAC,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBAC1E,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1B,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,mBAAoB,CACnD,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAE7D,MAAM,MAAM,CACV,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAC5D,CAAC,OAAO,CAAC,OAAO,CACf,0EAA0E,CAC3E,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;gBACxE,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAElE,MAAM,CACJ,6BAA6B,CAAC,qBAAqB,CACpD,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;gBACpE,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;gBACF,MAAM,YAAY,GAAG;oBACnB,GAAG,YAAY;oBACf,MAAM,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE;iBAC/D,CAAC;gBACF,iBAAiB,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBAChE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBAE1D,MAAM,MAAM,CACV,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAC9D,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACzC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEpE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;gBAChE,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEpE,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,oBAAoB,CACpD,SAAS,EACT,MAAM,EACN,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAChD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,iBAAiB,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;oBACpD,GAAG,YAAY;oBACf,MAAM,EAAE,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE;iBAC7D,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE;oBAC3D,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;gBAEH,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;oBAC3B,EAAE,EAAE,SAAS;oBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;wBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;qBAC3D,CAAC;iBACH,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;gBACvD,iBAAiB,CAAC,OAAO,GAAG,EAAE;qBAC3B,EAAE,EAAE;qBACJ,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAClD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;gBAErE,MAAM,MAAM,CACV,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAC9D,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,GAAG,GAAG,aAAa,CAAC;gBACxB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,UAAU;aACxB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAI,QAAQ,CAAC,SAAS,CAAC,KAAa;gBACrD,EAAE,kBAAkB,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,GAAG,GAAG,aAAa,CAAC;gBACxB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,UAAU;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MACb,QAAQ,CAAC,SAAS,CAAC,QACpB,EAAE,iBAAiB,CAClB,IAAI,EACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAC5C,GAAG,CACJ,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;gBAC3B,EAAE,EAAE,SAAS;gBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;oBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;iBAC1D,CAAC;aACH,CAAC,CAAC;YACH,MAAM,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,IAAI,0BAAiD,CAAC;QAEtD,UAAU,CAAC,GAAG,EAAE;YACd,0BAA0B,GAAG,IAAI,qBAAqB,CACpD,iBAAiB,EACjB;gBACE,OAAO,EAAE,WAAmC;gBAC5C,aAAa,EAAE,iBAAmC;gBAClD,yBAAyB,EAAE,SAAS;gBACpC,YAAY,EAAE,EAAS;gBACvB,cAAc,EAAE,EAAS;gBACzB,WAAW,EAAE,EAAS;aACP,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrD,MAAM,aAAa,GAAI,0BAA0B,CAAC,SAAS,CAAC,KAAa;gBACvE,EAAE,kBAAkB,CAAC;YAEvB,MAAM,MAAM,CACV,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CACpD,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAErD,MAAM,MAAM,CAER,0BAA0B,CAAC,SAAS,CAAC,QACtC,EAAE,iBAAiB,CAClB,IAAI,EACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAC5C,GAAG,CACJ,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YACrE,MAAM,aAAa,GAAI,0BAA0B,CAAC,SAAS,CAAC,KAAa;gBACvE,EAAE,kBAAkB,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MACb,0BAA0B,CAAC,SAAS,CAAC,QACtC,EAAE,iBAAiB,CAClB,IAAI,EACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAC5C,GAAG,CACJ,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC;gBAC3B,EAAE,EAAE,SAAS;gBACb,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;oBACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;iBAC1D,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,GAAG,GAAG;gBACV,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBACrB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;aAClB,CAAC;YAExB,MAAM,aAAa,GAAI,QAAQ,CAAC,SAAS,CAAC,KAAa;gBACrD,EAAE,kBAAkB,CAAC;YAEvB,MAAM,MAAM,CACV,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CACpD,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAE/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,QAAS,CAAC,CAAC,iBAAiB,CAClE,IAAI,CACL,CAAC;YACF,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,qBAAsB,CACrD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1B,EAAE,CAAC,MAAM,CACP,6BAA6B,CAAC,mBAAoB,CACnD,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAErD,MAAO,QAAQ,CAAC,SAAS,CAAC,QAAgB,EAAE,kBAAkB,CAC5D,IAAI,EACJ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAC1C,GAAG,CACJ,CAAC;YAEF,MAAM,CACJ,6BAA6B,CAAC,qBAAqB,CACpD,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=document-model-subgraph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-model-subgraph.test.d.ts","sourceRoot":"","sources":["../../test/document-model-subgraph.test.ts"],"names":[],"mappings":""}