@vertaaux/cli 0.2.0

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/README.md +345 -0
  2. package/dist/auth/ci-token.d.ts +49 -0
  3. package/dist/auth/ci-token.d.ts.map +1 -0
  4. package/dist/auth/ci-token.js +83 -0
  5. package/dist/auth/device-flow.d.ts +66 -0
  6. package/dist/auth/device-flow.d.ts.map +1 -0
  7. package/dist/auth/device-flow.js +156 -0
  8. package/dist/auth/token-store.d.ts +53 -0
  9. package/dist/auth/token-store.d.ts.map +1 -0
  10. package/dist/auth/token-store.js +78 -0
  11. package/dist/baseline/diff.d.ts +57 -0
  12. package/dist/baseline/diff.d.ts.map +1 -0
  13. package/dist/baseline/diff.js +152 -0
  14. package/dist/baseline/hash.d.ts +54 -0
  15. package/dist/baseline/hash.d.ts.map +1 -0
  16. package/dist/baseline/hash.js +66 -0
  17. package/dist/baseline/manager.d.ts +89 -0
  18. package/dist/baseline/manager.d.ts.map +1 -0
  19. package/dist/baseline/manager.js +157 -0
  20. package/dist/cache/index.d.ts +8 -0
  21. package/dist/cache/index.d.ts.map +1 -0
  22. package/dist/cache/index.js +7 -0
  23. package/dist/cache/route-cache.d.ts +119 -0
  24. package/dist/cache/route-cache.d.ts.map +1 -0
  25. package/dist/cache/route-cache.js +213 -0
  26. package/dist/ci/changed-routes.d.ts +95 -0
  27. package/dist/ci/changed-routes.d.ts.map +1 -0
  28. package/dist/ci/changed-routes.js +304 -0
  29. package/dist/ci/github-api.d.ts +68 -0
  30. package/dist/ci/github-api.d.ts.map +1 -0
  31. package/dist/ci/github-api.js +138 -0
  32. package/dist/ci/gitlab-api.d.ts +75 -0
  33. package/dist/ci/gitlab-api.d.ts.map +1 -0
  34. package/dist/ci/gitlab-api.js +180 -0
  35. package/dist/ci/index.d.ts +6 -0
  36. package/dist/ci/index.d.ts.map +1 -0
  37. package/dist/ci/index.js +4 -0
  38. package/dist/commands/audit.d.ts +58 -0
  39. package/dist/commands/audit.d.ts.map +1 -0
  40. package/dist/commands/audit.js +862 -0
  41. package/dist/commands/baseline.d.ts +22 -0
  42. package/dist/commands/baseline.d.ts.map +1 -0
  43. package/dist/commands/baseline.js +210 -0
  44. package/dist/commands/comment.d.ts +14 -0
  45. package/dist/commands/comment.d.ts.map +1 -0
  46. package/dist/commands/comment.js +363 -0
  47. package/dist/commands/diff.d.ts +24 -0
  48. package/dist/commands/diff.d.ts.map +1 -0
  49. package/dist/commands/diff.js +196 -0
  50. package/dist/commands/doctor.d.ts +58 -0
  51. package/dist/commands/doctor.d.ts.map +1 -0
  52. package/dist/commands/doctor.js +338 -0
  53. package/dist/commands/download.d.ts +12 -0
  54. package/dist/commands/download.d.ts.map +1 -0
  55. package/dist/commands/download.js +183 -0
  56. package/dist/commands/explain.d.ts +62 -0
  57. package/dist/commands/explain.d.ts.map +1 -0
  58. package/dist/commands/explain.js +302 -0
  59. package/dist/commands/init.d.ts +12 -0
  60. package/dist/commands/init.d.ts.map +1 -0
  61. package/dist/commands/init.js +212 -0
  62. package/dist/commands/login.d.ts +14 -0
  63. package/dist/commands/login.d.ts.map +1 -0
  64. package/dist/commands/login.js +222 -0
  65. package/dist/commands/policy.d.ts +13 -0
  66. package/dist/commands/policy.d.ts.map +1 -0
  67. package/dist/commands/policy.js +347 -0
  68. package/dist/commands/upload.d.ts +12 -0
  69. package/dist/commands/upload.d.ts.map +1 -0
  70. package/dist/commands/upload.js +158 -0
  71. package/dist/config/defaults.d.ts +21 -0
  72. package/dist/config/defaults.d.ts.map +1 -0
  73. package/dist/config/defaults.js +49 -0
  74. package/dist/config/loader.d.ts +66 -0
  75. package/dist/config/loader.d.ts.map +1 -0
  76. package/dist/config/loader.js +167 -0
  77. package/dist/config/schema.d.ts +55 -0
  78. package/dist/config/schema.d.ts.map +1 -0
  79. package/dist/config/schema.js +6 -0
  80. package/dist/index.d.ts +9 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +1090 -0
  83. package/dist/interactive/fix-wizard.d.ts +44 -0
  84. package/dist/interactive/fix-wizard.d.ts.map +1 -0
  85. package/dist/interactive/fix-wizard.js +286 -0
  86. package/dist/interactive/init-wizard.d.ts +32 -0
  87. package/dist/interactive/init-wizard.d.ts.map +1 -0
  88. package/dist/interactive/init-wizard.js +193 -0
  89. package/dist/interactive/prompts.d.ts +62 -0
  90. package/dist/interactive/prompts.d.ts.map +1 -0
  91. package/dist/interactive/prompts.js +78 -0
  92. package/dist/monorepo/detector.d.ts +70 -0
  93. package/dist/monorepo/detector.d.ts.map +1 -0
  94. package/dist/monorepo/detector.js +278 -0
  95. package/dist/monorepo/index.d.ts +9 -0
  96. package/dist/monorepo/index.d.ts.map +1 -0
  97. package/dist/monorepo/index.js +8 -0
  98. package/dist/monorepo/workspace.d.ts +142 -0
  99. package/dist/monorepo/workspace.d.ts.map +1 -0
  100. package/dist/monorepo/workspace.js +171 -0
  101. package/dist/output/envelope.d.ts +21 -0
  102. package/dist/output/envelope.d.ts.map +1 -0
  103. package/dist/output/envelope.js +27 -0
  104. package/dist/output/factory.d.ts +73 -0
  105. package/dist/output/factory.d.ts.map +1 -0
  106. package/dist/output/factory.js +60 -0
  107. package/dist/output/formats.d.ts +11 -0
  108. package/dist/output/formats.d.ts.map +1 -0
  109. package/dist/output/formats.js +41 -0
  110. package/dist/output/html.d.ts +45 -0
  111. package/dist/output/html.d.ts.map +1 -0
  112. package/dist/output/html.js +607 -0
  113. package/dist/output/human.d.ts +41 -0
  114. package/dist/output/human.d.ts.map +1 -0
  115. package/dist/output/human.js +274 -0
  116. package/dist/output/json.d.ts +42 -0
  117. package/dist/output/json.d.ts.map +1 -0
  118. package/dist/output/json.js +37 -0
  119. package/dist/output/junit.d.ts +56 -0
  120. package/dist/output/junit.d.ts.map +1 -0
  121. package/dist/output/junit.js +135 -0
  122. package/dist/output/markdown.d.ts +77 -0
  123. package/dist/output/markdown.d.ts.map +1 -0
  124. package/dist/output/markdown.js +411 -0
  125. package/dist/output/sarif.d.ts +160 -0
  126. package/dist/output/sarif.d.ts.map +1 -0
  127. package/dist/output/sarif.js +207 -0
  128. package/dist/policy/evaluator.d.ts +111 -0
  129. package/dist/policy/evaluator.d.ts.map +1 -0
  130. package/dist/policy/evaluator.js +362 -0
  131. package/dist/policy/index.d.ts +15 -0
  132. package/dist/policy/index.d.ts.map +1 -0
  133. package/dist/policy/index.js +11 -0
  134. package/dist/policy/loader.d.ts +97 -0
  135. package/dist/policy/loader.d.ts.map +1 -0
  136. package/dist/policy/loader.js +281 -0
  137. package/dist/policy/schema.d.ts +297 -0
  138. package/dist/policy/schema.d.ts.map +1 -0
  139. package/dist/policy/schema.js +230 -0
  140. package/dist/quality-gate/evaluator.d.ts +58 -0
  141. package/dist/quality-gate/evaluator.d.ts.map +1 -0
  142. package/dist/quality-gate/evaluator.js +274 -0
  143. package/dist/quality-gate/index.d.ts +10 -0
  144. package/dist/quality-gate/index.d.ts.map +1 -0
  145. package/dist/quality-gate/index.js +7 -0
  146. package/dist/quality-gate/types.d.ts +103 -0
  147. package/dist/quality-gate/types.d.ts.map +1 -0
  148. package/dist/quality-gate/types.js +23 -0
  149. package/dist/templates/azure-devops.d.ts +25 -0
  150. package/dist/templates/azure-devops.d.ts.map +1 -0
  151. package/dist/templates/azure-devops.js +109 -0
  152. package/dist/templates/circleci.d.ts +28 -0
  153. package/dist/templates/circleci.d.ts.map +1 -0
  154. package/dist/templates/circleci.js +86 -0
  155. package/dist/templates/github-actions.d.ts +81 -0
  156. package/dist/templates/github-actions.d.ts.map +1 -0
  157. package/dist/templates/github-actions.js +393 -0
  158. package/dist/templates/gitlab-ci.d.ts +26 -0
  159. package/dist/templates/gitlab-ci.d.ts.map +1 -0
  160. package/dist/templates/gitlab-ci.js +70 -0
  161. package/dist/templates/index.d.ts +72 -0
  162. package/dist/templates/index.d.ts.map +1 -0
  163. package/dist/templates/index.js +112 -0
  164. package/dist/templates/jenkins.d.ts +26 -0
  165. package/dist/templates/jenkins.d.ts.map +1 -0
  166. package/dist/templates/jenkins.js +110 -0
  167. package/dist/ui/banner.d.ts +31 -0
  168. package/dist/ui/banner.d.ts.map +1 -0
  169. package/dist/ui/banner.js +84 -0
  170. package/dist/ui/diagnostics.d.ts +39 -0
  171. package/dist/ui/diagnostics.d.ts.map +1 -0
  172. package/dist/ui/diagnostics.js +153 -0
  173. package/dist/ui/spinner.d.ts +61 -0
  174. package/dist/ui/spinner.d.ts.map +1 -0
  175. package/dist/ui/spinner.js +101 -0
  176. package/dist/ui/table.d.ts +63 -0
  177. package/dist/ui/table.d.ts.map +1 -0
  178. package/dist/ui/table.js +236 -0
  179. package/dist/utils/client.d.ts +82 -0
  180. package/dist/utils/client.d.ts.map +1 -0
  181. package/dist/utils/client.js +128 -0
  182. package/dist/utils/detect-env.d.ts +59 -0
  183. package/dist/utils/detect-env.d.ts.map +1 -0
  184. package/dist/utils/detect-env.js +115 -0
  185. package/dist/utils/exit-codes.d.ts +47 -0
  186. package/dist/utils/exit-codes.d.ts.map +1 -0
  187. package/dist/utils/exit-codes.js +61 -0
  188. package/dist/utils/logger.d.ts +87 -0
  189. package/dist/utils/logger.d.ts.map +1 -0
  190. package/dist/utils/logger.js +185 -0
  191. package/dist/utils/sanitize.d.ts +36 -0
  192. package/dist/utils/sanitize.d.ts.map +1 -0
  193. package/dist/utils/sanitize.js +64 -0
  194. package/dist/utils/validators.d.ts +41 -0
  195. package/dist/utils/validators.d.ts.map +1 -0
  196. package/dist/utils/validators.js +123 -0
  197. package/package.json +63 -0
  198. package/schemas/vertaaux.config.schema.json +103 -0
@@ -0,0 +1,180 @@
1
+ /**
2
+ * GitLab API wrapper for MR note operations.
3
+ *
4
+ * Provides utilities for posting and updating MR notes (comments)
5
+ * with sticky note semantics (find existing by hidden header).
6
+ *
7
+ * Uses native fetch (Node 18+).
8
+ */
9
+ /**
10
+ * Make an authenticated GitLab API request.
11
+ */
12
+ async function gitlabRequest(method, url, token, body) {
13
+ const headers = {
14
+ Accept: "application/json",
15
+ "User-Agent": "VertaaUX-CLI",
16
+ };
17
+ // GitLab uses different header for job token vs personal access token
18
+ if (process.env.CI_JOB_TOKEN && token === process.env.CI_JOB_TOKEN) {
19
+ headers["JOB-TOKEN"] = token;
20
+ }
21
+ else {
22
+ headers["PRIVATE-TOKEN"] = token;
23
+ }
24
+ if (body) {
25
+ headers["Content-Type"] = "application/json";
26
+ }
27
+ const response = await fetch(url, {
28
+ method,
29
+ headers,
30
+ body: body ? JSON.stringify(body) : undefined,
31
+ });
32
+ if (!response.ok) {
33
+ const errorData = (await response.json().catch(() => ({})));
34
+ const errorMessage = Array.isArray(errorData.message)
35
+ ? errorData.message.join(", ")
36
+ : errorData.message || errorData.error || response.statusText;
37
+ throw new Error(`GitLab API error (${response.status}): ${errorMessage}`);
38
+ }
39
+ // Handle no content responses
40
+ if (response.status === 204) {
41
+ return {};
42
+ }
43
+ return response.json();
44
+ }
45
+ /**
46
+ * URL-encode a project path for GitLab API.
47
+ *
48
+ * Project ID can be numeric or a path like "group/project".
49
+ * Numeric IDs pass through unchanged, paths are URL-encoded.
50
+ *
51
+ * @param projectId - Project ID or path
52
+ * @returns URL-safe project identifier
53
+ */
54
+ export function encodeProjectId(projectId) {
55
+ // Numeric IDs don't need encoding
56
+ if (/^\d+$/.test(projectId)) {
57
+ return projectId;
58
+ }
59
+ // URL-encode path (group/subgroup/project -> group%2Fsubgroup%2Fproject)
60
+ return encodeURIComponent(projectId);
61
+ }
62
+ /**
63
+ * Find existing note by hidden header identifier.
64
+ *
65
+ * Searches MR notes for `<!-- {header} -->` pattern in body.
66
+ * Handles pagination for MRs with many notes.
67
+ *
68
+ * @param options - Note search options
69
+ * @returns Note ID if found, null otherwise
70
+ */
71
+ export async function findExistingNote(options) {
72
+ const { token, apiUrl, projectId, mrIid, header } = options;
73
+ const headerPattern = `<!-- ${header} -->`;
74
+ const encodedProjectId = encodeProjectId(projectId);
75
+ let page = 1;
76
+ const perPage = 100;
77
+ // Paginate through notes until we find one or run out
78
+ while (true) {
79
+ const url = `${apiUrl}/projects/${encodedProjectId}/merge_requests/${mrIid}/notes?page=${page}&per_page=${perPage}`;
80
+ const notes = await gitlabRequest("GET", url, token);
81
+ for (const note of notes) {
82
+ // Skip system notes (auto-generated by GitLab)
83
+ if (note.system)
84
+ continue;
85
+ if (note.body?.includes(headerPattern)) {
86
+ return note.id;
87
+ }
88
+ }
89
+ // No more pages
90
+ if (notes.length < perPage) {
91
+ break;
92
+ }
93
+ page++;
94
+ }
95
+ return null;
96
+ }
97
+ /**
98
+ * Post new note or update existing one.
99
+ *
100
+ * Uses header identifier to find existing note for update semantics.
101
+ * This prevents note spam and ensures only one VertaaUX note per MR.
102
+ *
103
+ * @param options - Note options
104
+ * @returns Created/updated note with ID and web URL
105
+ */
106
+ export async function postOrUpdateGitLabNote(options) {
107
+ const { token, apiUrl, projectId, mrIid, body, header } = options;
108
+ const encodedProjectId = encodeProjectId(projectId);
109
+ // Try to find existing note
110
+ const existingId = await findExistingNote({
111
+ token,
112
+ apiUrl,
113
+ projectId,
114
+ mrIid,
115
+ header,
116
+ });
117
+ if (existingId) {
118
+ // Update existing note
119
+ const url = `${apiUrl}/projects/${encodedProjectId}/merge_requests/${mrIid}/notes/${existingId}`;
120
+ const note = await gitlabRequest("PUT", url, token, { body });
121
+ // GitLab doesn't return web_url for notes, construct it
122
+ const webUrl = constructNoteWebUrl(apiUrl, projectId, mrIid, note.id);
123
+ return { id: note.id, web_url: webUrl };
124
+ }
125
+ else {
126
+ // Create new note
127
+ const url = `${apiUrl}/projects/${encodedProjectId}/merge_requests/${mrIid}/notes`;
128
+ const note = await gitlabRequest("POST", url, token, { body });
129
+ const webUrl = constructNoteWebUrl(apiUrl, projectId, mrIid, note.id);
130
+ return { id: note.id, web_url: webUrl };
131
+ }
132
+ }
133
+ /**
134
+ * Construct web URL for a note.
135
+ *
136
+ * GitLab API doesn't return web_url for notes, so we construct it.
137
+ */
138
+ function constructNoteWebUrl(apiUrl, projectId, mrIid, noteId) {
139
+ // Convert API URL to web URL
140
+ // https://gitlab.com/api/v4 -> https://gitlab.com
141
+ const webBase = apiUrl.replace(/\/api\/v\d+$/, "");
142
+ // Project path (decode if encoded)
143
+ const projectPath = /^\d+$/.test(projectId)
144
+ ? projectId
145
+ : decodeURIComponent(projectId);
146
+ return `${webBase}/${projectPath}/-/merge_requests/${mrIid}#note_${noteId}`;
147
+ }
148
+ /**
149
+ * Extract MR IID from GitLab CI environment.
150
+ *
151
+ * @returns MR IID or null if not in MR context
152
+ */
153
+ export function extractMRIid() {
154
+ const mrIid = process.env.CI_MERGE_REQUEST_IID;
155
+ if (mrIid) {
156
+ const num = parseInt(mrIid, 10);
157
+ if (!isNaN(num))
158
+ return num;
159
+ }
160
+ return null;
161
+ }
162
+ /**
163
+ * Get GitLab API configuration from environment.
164
+ *
165
+ * @returns API configuration or null if not in GitLab CI
166
+ */
167
+ export function getGitLabConfig() {
168
+ // Token: prefer GITLAB_TOKEN, fall back to CI_JOB_TOKEN
169
+ const token = process.env.GITLAB_TOKEN || process.env.CI_JOB_TOKEN;
170
+ if (!token)
171
+ return null;
172
+ // API URL: from CI or default to gitlab.com
173
+ const apiUrl = process.env.CI_API_V4_URL || "https://gitlab.com/api/v4";
174
+ // Project ID: prefer numeric ID, fall back to path
175
+ const projectId = process.env.CI_PROJECT_ID ||
176
+ process.env.CI_PROJECT_PATH;
177
+ if (!projectId)
178
+ return null;
179
+ return { token, apiUrl, projectId };
180
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CI integration utilities for VertaaUX CLI.
3
+ */
4
+ export { getChangedRoutes, detectBaseBranch, filePathToRoute, BUDGET_MODES, getBudgetConfig, } from "./changed-routes.js";
5
+ export type { ChangedRoutesOptions, ChangedRoutesResult, BudgetMode, } from "./changed-routes.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ci/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,GACX,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * CI integration utilities for VertaaUX CLI.
3
+ */
4
+ export { getChangedRoutes, detectBaseBranch, filePathToRoute, BUDGET_MODES, getBudgetConfig, } from "./changed-routes.js";
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Audit command for VertaaUX CLI.
3
+ *
4
+ * Runs UX and accessibility audits on web pages.
5
+ * Supports various targets, output formats, and CI integration.
6
+ */
7
+ import { Command } from "commander";
8
+ export interface AuditCommandOptions {
9
+ url?: string;
10
+ repo?: string;
11
+ storybook?: string;
12
+ routes?: string;
13
+ authProfile?: string;
14
+ mode?: "basic" | "standard" | "deep";
15
+ wait?: boolean;
16
+ timeout?: number;
17
+ interval?: number;
18
+ format?: string;
19
+ output?: string;
20
+ groupBy?: "severity" | "category" | "route";
21
+ severity?: string;
22
+ category?: string;
23
+ failOn?: "error" | "warning" | "info" | "none";
24
+ threshold?: number;
25
+ maxNewErrors?: number;
26
+ maxNewWarnings?: number;
27
+ failOnExisting?: boolean;
28
+ bypassLabels?: string;
29
+ baseline?: string;
30
+ interactive?: boolean;
31
+ saveTrace?: boolean;
32
+ saveHar?: boolean;
33
+ screenshots?: boolean;
34
+ domSnapshots?: boolean;
35
+ concurrency?: number;
36
+ cache?: boolean;
37
+ uploadArtifacts?: boolean;
38
+ jobId?: string;
39
+ incremental?: boolean;
40
+ baseBranch?: string;
41
+ budget?: "quick" | "standard" | "full";
42
+ policy?: string;
43
+ workspace?: string;
44
+ allWorkspaces?: boolean;
45
+ parallel?: boolean;
46
+ detectMatrix?: boolean;
47
+ noCache?: boolean;
48
+ cacheDir?: string;
49
+ jsonLogs?: boolean;
50
+ base?: string;
51
+ quiet?: boolean;
52
+ machine?: boolean;
53
+ }
54
+ /**
55
+ * Register the audit command with the Commander program.
56
+ */
57
+ export declare function registerAuditCommand(program: Command): void;
58
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,MAAM,WAAW,mBAAmB;IAElC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAG5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAGvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2tBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiT3D"}