mcp-adr-analysis-server 2.4.1 → 2.5.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.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Release History Resource
3
+ * Provides read-only access to release tracking state including
4
+ * releases, ADR mappings, milestones, and tracking metadata.
5
+ */
6
+ import { ResourceGenerationResult } from './index.js';
7
+ /**
8
+ * Generate release history resource content
9
+ */
10
+ export declare function generateReleaseHistoryResource(projectPath: string, _searchParams?: URLSearchParams): Promise<ResourceGenerationResult>;
11
+ //# sourceMappingURL=release-history-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-history-resource.d.ts","sourceRoot":"","sources":["../../../src/resources/release-history-resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGtD;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,eAAe,GAC9B,OAAO,CAAC,wBAAwB,CAAC,CAwDnC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Release History Resource
3
+ * Provides read-only access to release tracking state including
4
+ * releases, ADR mappings, milestones, and tracking metadata.
5
+ */
6
+ import { McpAdrError } from '../types/index.js';
7
+ import { generateETag } from './resource-cache.js';
8
+ import { loadTrackingState } from '../utils/release-tracker.js';
9
+ /**
10
+ * Generate release history resource content
11
+ */
12
+ export async function generateReleaseHistoryResource(projectPath, _searchParams) {
13
+ try {
14
+ const state = loadTrackingState(projectPath);
15
+ const data = state
16
+ ? {
17
+ projectType: state.projectType,
18
+ detectedPhase: state.detectedPhase,
19
+ totalReleases: state.releases.length,
20
+ releases: state.releases.map(r => ({
21
+ version: r.version,
22
+ date: r.date,
23
+ source: r.source,
24
+ adrCount: r.adrs.length,
25
+ featureCount: r.features.length,
26
+ bugfixCount: r.bugfixes.length,
27
+ breakingChangeCount: r.breakingChanges.length,
28
+ adrs: r.adrs.map(a => ({
29
+ filename: a.adrFilename,
30
+ title: a.adrTitle,
31
+ status: a.adrStatus,
32
+ changeType: a.changeType,
33
+ confidence: a.confidence,
34
+ mappingMethod: a.mappingMethod,
35
+ })),
36
+ })),
37
+ unmappedAdrs: state.unmappedAdrs,
38
+ milestones: state.milestones,
39
+ lastScanTimestamp: state.lastScanTimestamp,
40
+ }
41
+ : {
42
+ message: 'No release tracking data available. Run release_tracking with detect_releases first.',
43
+ projectType: 'unknown',
44
+ totalReleases: 0,
45
+ releases: [],
46
+ unmappedAdrs: [],
47
+ milestones: [],
48
+ };
49
+ const cacheKey = `release_history:${projectPath}`;
50
+ return {
51
+ data,
52
+ contentType: 'application/json',
53
+ lastModified: new Date().toISOString(),
54
+ cacheKey,
55
+ ttl: 60,
56
+ etag: generateETag(data),
57
+ };
58
+ }
59
+ catch (error) {
60
+ throw new McpAdrError(`Failed to generate release history resource: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_ERROR');
61
+ }
62
+ }
63
+ //# sourceMappingURL=release-history-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-history-resource.js","sourceRoot":"","sources":["../../../src/resources/release-history-resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,WAAmB,EACnB,aAA+B;IAE/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,KAAK;YAChB,CAAC,CAAC;gBACE,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;oBACvB,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;oBAC/B,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;oBAC9B,mBAAmB,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM;oBAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACrB,QAAQ,EAAE,CAAC,CAAC,WAAW;wBACvB,KAAK,EAAE,CAAC,CAAC,QAAQ;wBACjB,MAAM,EAAE,CAAC,CAAC,SAAS;wBACnB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,aAAa,EAAE,CAAC,CAAC,aAAa;qBAC/B,CAAC,CAAC;iBACJ,CAAC,CAAC;gBACH,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;aAC3C;YACH,CAAC,CAAC;gBACE,OAAO,EACL,sFAAsF;gBACxF,WAAW,EAAE,SAAS;gBACtB,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE;aACf,CAAC;QAEN,MAAM,QAAQ,GAAG,mBAAmB,WAAW,EAAE,CAAC;QAElD,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,QAAQ;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;SACzB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACxG,gBAAgB,CACjB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Release Tracking Tool
3
+ *
4
+ * MCP tool for tracking releases mapped to ADRs, generating changelogs,
5
+ * managing milestones, and assessing release readiness.
6
+ * Supports both greenfield and brownfield applications.
7
+ *
8
+ * IMPORTANT FOR AI ASSISTANTS: This tool provides:
9
+ * 1. Release Detection: Discovers releases from git tags and GitHub Releases
10
+ * 2. ADR-to-Release Mapping: Three-pass mapping with confidence scoring
11
+ * 3. Changelog Generation: Keep a Changelog format with ADR sections
12
+ * 4. Milestone Management: Tracks milestones linked to ADRs and tasks
13
+ * 5. Release Comparison: Diffs ADR changes between releases
14
+ * 6. Next Release Preview: Shows unreleased work with readiness scoring
15
+ * 7. GitHub Integration: Creates GitHub Releases and Milestones
16
+ * 8. Persistence: Writes CHANGELOG.md, updates TODO.md
17
+ */
18
+ export declare function releaseTracking(args: Record<string, unknown>): Promise<any>;
19
+ //# sourceMappingURL=release-tracking-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-tracking-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/release-tracking-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiFH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAgDjF"}
@@ -0,0 +1,528 @@
1
+ /**
2
+ * Release Tracking Tool
3
+ *
4
+ * MCP tool for tracking releases mapped to ADRs, generating changelogs,
5
+ * managing milestones, and assessing release readiness.
6
+ * Supports both greenfield and brownfield applications.
7
+ *
8
+ * IMPORTANT FOR AI ASSISTANTS: This tool provides:
9
+ * 1. Release Detection: Discovers releases from git tags and GitHub Releases
10
+ * 2. ADR-to-Release Mapping: Three-pass mapping with confidence scoring
11
+ * 3. Changelog Generation: Keep a Changelog format with ADR sections
12
+ * 4. Milestone Management: Tracks milestones linked to ADRs and tasks
13
+ * 5. Release Comparison: Diffs ADR changes between releases
14
+ * 6. Next Release Preview: Shows unreleased work with readiness scoring
15
+ * 7. GitHub Integration: Creates GitHub Releases and Milestones
16
+ * 8. Persistence: Writes CHANGELOG.md, updates TODO.md
17
+ */
18
+ import { z } from 'zod';
19
+ import { McpAdrError } from '../types/index.js';
20
+ import { validateMcpResponse } from '../utils/mcp-response-validator.js';
21
+ import { jsonSafeError } from '../utils/json-safe.js';
22
+ import { detectReleases, detectProjectType, mapAdrsToReleases, generateChangelog, writeChangelog, compareReleases, buildMilestoneMap, createGitHubRelease, syncGitHubMilestone, updateTodoMilestones, previewNextRelease, saveTrackingState, } from '../utils/release-tracker.js';
23
+ // ─── Schema ────────────────────────────────────────────────────────
24
+ const ReleaseTrackingSchema = z.object({
25
+ operation: z
26
+ .enum([
27
+ 'detect_releases',
28
+ 'track_release',
29
+ 'generate_changelog',
30
+ 'compare_releases',
31
+ 'release_summary',
32
+ 'next_release_preview',
33
+ 'create_milestone',
34
+ 'sync_milestones',
35
+ ])
36
+ .describe('Operation to perform'),
37
+ projectPath: z.string().optional().describe('Project root path'),
38
+ // For track_release
39
+ version: z.string().optional().describe('Release version to track (e.g., v2.3.0)'),
40
+ // For compare_releases
41
+ compareFrom: z.string().optional().describe('Starting version for comparison'),
42
+ compareTo: z.string().optional().describe('Ending version for comparison'),
43
+ // For generate_changelog
44
+ format: z
45
+ .enum(['markdown', 'keep-a-changelog', 'conventional'])
46
+ .default('keep-a-changelog')
47
+ .describe('Changelog output format'),
48
+ includeAdrLinks: z.boolean().default(true).describe('Include ADR references in changelog'),
49
+ includeCommitHashes: z.boolean().default(false).describe('Include commit hashes'),
50
+ groupByAdr: z.boolean().default(false).describe('Group changelog entries by ADR'),
51
+ writeToFile: z.boolean().default(false).describe('Write CHANGELOG.md to repo'),
52
+ // For release_summary and next_release_preview
53
+ includeReadiness: z.boolean().default(true).describe('Include release readiness score'),
54
+ includeTimeline: z.boolean().default(true).describe('Include mermaid timeline diagram'),
55
+ // For create_milestone
56
+ milestoneTitle: z.string().optional().describe('GitHub milestone title'),
57
+ milestoneDescription: z.string().optional().describe('GitHub milestone description'),
58
+ milestoneDueDate: z.string().optional().describe('Milestone due date (YYYY-MM-DD)'),
59
+ // For GitHub integration
60
+ createGithubRelease: z
61
+ .boolean()
62
+ .default(false)
63
+ .describe('Create a GitHub Release (requires gh CLI)'),
64
+ syncGithubMilestones: z
65
+ .boolean()
66
+ .default(false)
67
+ .describe('Sync milestones to GitHub (requires gh CLI)'),
68
+ updateTodo: z.boolean().default(false).describe('Update TODO.md with milestone status'),
69
+ });
70
+ // ─── Main Export ───────────────────────────────────────────────────
71
+ export async function releaseTracking(args) {
72
+ try {
73
+ const validatedArgs = ReleaseTrackingSchema.parse(args);
74
+ const projectPath = validatedArgs.projectPath || process.cwd();
75
+ // Discover ADRs
76
+ const { discoverAdrsInDirectory } = await import('../utils/adr-discovery.js');
77
+ const adrDirectory = process.env['ADR_DIRECTORY'] || 'docs/adrs';
78
+ const discoveryResult = await discoverAdrsInDirectory(adrDirectory, projectPath, {
79
+ includeContent: false,
80
+ includeTimeline: false,
81
+ });
82
+ const adrs = discoveryResult.adrs;
83
+ switch (validatedArgs.operation) {
84
+ case 'detect_releases':
85
+ return await handleDetectReleases(projectPath, adrs);
86
+ case 'track_release':
87
+ return await handleTrackRelease(projectPath, adrs, validatedArgs);
88
+ case 'generate_changelog':
89
+ return await handleGenerateChangelog(projectPath, adrs, validatedArgs);
90
+ case 'compare_releases':
91
+ return await handleCompareReleases(projectPath, adrs, validatedArgs);
92
+ case 'release_summary':
93
+ return await handleReleaseSummary(projectPath, adrs, validatedArgs);
94
+ case 'next_release_preview':
95
+ return await handleNextReleasePreview(projectPath, adrs, validatedArgs);
96
+ case 'create_milestone':
97
+ return await handleCreateMilestone(projectPath, validatedArgs);
98
+ case 'sync_milestones':
99
+ return await handleSyncMilestones(projectPath, adrs, validatedArgs);
100
+ default:
101
+ throw new McpAdrError('INVALID_ARGS', `Unknown operation: ${validatedArgs.operation}`);
102
+ }
103
+ }
104
+ catch (error) {
105
+ throw new McpAdrError('RELEASE_TRACKING_ERROR', `Release tracking failed: ${jsonSafeError(error)}`);
106
+ }
107
+ }
108
+ // ─── Operation Handlers ────────────────────────────────────────────
109
+ async function handleDetectReleases(projectPath, adrs) {
110
+ const releases = await detectReleases(projectPath);
111
+ const { projectType, phase } = await detectProjectType(projectPath, adrs.length);
112
+ if (releases.length === 0) {
113
+ return validateMcpResponse({
114
+ content: [
115
+ {
116
+ type: 'text',
117
+ text: `# Release Detection - ${projectType === 'greenfield' ? 'Greenfield' : 'Brownfield'} Project
118
+
119
+ ## No Releases Detected
120
+
121
+ **Project Type**: ${projectType}
122
+ **Project Phase**: ${phase}
123
+ **ADRs Found**: ${adrs.length}
124
+
125
+ ### Getting Started with Release Tracking
126
+
127
+ ${projectType === 'greenfield'
128
+ ? `This appears to be a new project. To start tracking releases:
129
+
130
+ 1. **Tag your first release**: \`git tag v0.1.0\`
131
+ 2. **Create ADRs** to document architectural decisions
132
+ 3. **Set up TODO.md** with milestone structure
133
+ 4. Re-run \`release_tracking\` with \`detect_releases\` to see your releases mapped to ADRs`
134
+ : `This project has existing history but no semver tags. To start:
135
+
136
+ 1. **Tag your current state**: \`git tag v1.0.0\`
137
+ 2. **Run \`generate_changelog\`** to create a CHANGELOG.md
138
+ 3. **Run \`sync_milestones\`** to map ADRs to milestones`}
139
+
140
+ ### ADR Summary
141
+ ${adrs.length > 0 ? adrs.map((a) => `- **${a.title}**: ${a.status}`).join('\n') : 'No ADRs found. Consider creating architectural decision records.'}`,
142
+ },
143
+ ],
144
+ });
145
+ }
146
+ // Map ADRs to releases
147
+ const { mappedReleases, unmappedAdrs } = await mapAdrsToReleases(adrs, releases, projectPath);
148
+ // Save state
149
+ const state = {
150
+ projectType,
151
+ detectedPhase: phase,
152
+ releases: mappedReleases,
153
+ unmappedAdrs,
154
+ milestones: [],
155
+ lastScanTimestamp: new Date().toISOString(),
156
+ };
157
+ saveTrackingState(projectPath, state);
158
+ return validateMcpResponse({
159
+ content: [
160
+ {
161
+ type: 'text',
162
+ text: `# Release Detection Results
163
+
164
+ **Project Type**: ${projectType}
165
+ **Project Phase**: ${phase}
166
+ **Releases Found**: ${mappedReleases.length}
167
+ **ADRs Found**: ${adrs.length}
168
+ **Unmapped ADRs**: ${unmappedAdrs.length}
169
+
170
+ ## Releases
171
+
172
+ ${mappedReleases
173
+ .map(r => `### ${r.version} (${r.date.split('T')[0]})
174
+ - **Features**: ${r.features.length}
175
+ - **Bug Fixes**: ${r.bugfixes.length}
176
+ - **Breaking Changes**: ${r.breakingChanges.length}
177
+ - **Linked ADRs**: ${r.adrs.length}
178
+ ${r.adrs.map(a => ` - ${a.adrTitle} (${a.mappingMethod}, ${(a.confidence * 100).toFixed(0)}% confidence)`).join('\n')}`)
179
+ .join('\n\n')}
180
+
181
+ ${unmappedAdrs.length > 0
182
+ ? `## Unmapped ADRs
183
+ These ADRs are not linked to any release:
184
+ ${unmappedAdrs.map(a => `- ${a}`).join('\n')}
185
+
186
+ Consider using \`track_release\` to manually link them.`
187
+ : ''}`,
188
+ },
189
+ ],
190
+ });
191
+ }
192
+ async function handleTrackRelease(projectPath, adrs, args) {
193
+ if (!args.version) {
194
+ throw new McpAdrError('INVALID_ARGS', 'Version is required for track_release operation');
195
+ }
196
+ const releases = await detectReleases(projectPath);
197
+ const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
198
+ const targetRelease = mappedReleases.find(r => r.version === args.version);
199
+ if (!targetRelease) {
200
+ return validateMcpResponse({
201
+ content: [
202
+ {
203
+ type: 'text',
204
+ text: `# Release Not Found: ${args.version}
205
+
206
+ Available releases: ${releases.map(r => r.version).join(', ') || 'None'}
207
+
208
+ To create this release, first tag it: \`git tag ${args.version}\``,
209
+ },
210
+ ],
211
+ });
212
+ }
213
+ // Create GitHub Release if requested
214
+ let githubReleaseInfo = '';
215
+ if (args.createGithubRelease) {
216
+ const releaseNotes = generateReleaseNotes(targetRelease);
217
+ const result = createGitHubRelease(projectPath, args.version, releaseNotes);
218
+ githubReleaseInfo = result.success
219
+ ? `\n### GitHub Release\n- Created: ${result.url}`
220
+ : `\n### GitHub Release\n- Failed: ${result.error}`;
221
+ }
222
+ // Update TODO.md if requested
223
+ if (args.updateTodo) {
224
+ const milestones = await buildMilestoneMap(adrs, projectPath);
225
+ updateTodoMilestones(projectPath, milestones, adrs);
226
+ }
227
+ return validateMcpResponse({
228
+ content: [
229
+ {
230
+ type: 'text',
231
+ text: `# Release Tracked: ${args.version}
232
+
233
+ **Date**: ${targetRelease.date.split('T')[0]}
234
+ **Linked ADRs**: ${targetRelease.adrs.length}
235
+ **Features**: ${targetRelease.features.length}
236
+ **Bug Fixes**: ${targetRelease.bugfixes.length}
237
+ **Breaking Changes**: ${targetRelease.breakingChanges.length}
238
+
239
+ ## ADR Mappings
240
+ ${targetRelease.adrs.length > 0
241
+ ? targetRelease.adrs
242
+ .map(a => `- **${a.adrTitle}** (${a.adrFilename})
243
+ - Change Type: ${a.changeType}
244
+ - Mapping Method: ${a.mappingMethod}
245
+ - Confidence: ${(a.confidence * 100).toFixed(0)}%`)
246
+ .join('\n')
247
+ : 'No ADRs linked to this release.'}
248
+ ${githubReleaseInfo}`,
249
+ },
250
+ ],
251
+ });
252
+ }
253
+ async function handleGenerateChangelog(projectPath, adrs, args) {
254
+ const releases = await detectReleases(projectPath);
255
+ const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
256
+ const options = {
257
+ format: args.format,
258
+ includeAdrLinks: args.includeAdrLinks,
259
+ includeCommitHashes: args.includeCommitHashes,
260
+ groupByAdr: args.groupByAdr,
261
+ };
262
+ const changelogContent = generateChangelog(mappedReleases, options);
263
+ if (args.writeToFile) {
264
+ writeChangelog(projectPath, changelogContent);
265
+ }
266
+ return validateMcpResponse({
267
+ content: [
268
+ {
269
+ type: 'text',
270
+ text: `# Changelog Generated
271
+
272
+ **Releases**: ${mappedReleases.length}
273
+ **Format**: ${args.format}
274
+ ${args.writeToFile ? '**Written to**: CHANGELOG.md' : '**Preview mode** (use writeToFile: true to save)'}
275
+
276
+ ---
277
+
278
+ ${changelogContent}`,
279
+ },
280
+ ],
281
+ });
282
+ }
283
+ async function handleCompareReleases(projectPath, adrs, args) {
284
+ if (!args.compareFrom || !args.compareTo) {
285
+ throw new McpAdrError('INVALID_ARGS', 'compareFrom and compareTo are required for compare_releases operation');
286
+ }
287
+ const releases = await detectReleases(projectPath);
288
+ const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
289
+ const comparison = compareReleases(mappedReleases, args.compareFrom, args.compareTo);
290
+ return validateMcpResponse({
291
+ content: [
292
+ {
293
+ type: 'text',
294
+ text: `# Release Comparison: ${args.compareFrom} -> ${args.compareTo}
295
+
296
+ ## ADR Changes
297
+ - **Added**: ${comparison.addedAdrs.length}
298
+ - **Modified**: ${comparison.modifiedAdrs.length}
299
+ - **Deprecated**: ${comparison.deprecatedAdrs.length}
300
+
301
+ ${comparison.addedAdrs.length > 0
302
+ ? `### New ADRs
303
+ ${comparison.addedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
304
+ : ''}
305
+
306
+ ${comparison.modifiedAdrs.length > 0
307
+ ? `### Modified ADRs
308
+ ${comparison.modifiedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
309
+ : ''}
310
+
311
+ ${comparison.deprecatedAdrs.length > 0
312
+ ? `### Deprecated ADRs
313
+ ${comparison.deprecatedAdrs.map(a => `- ${a.adrTitle} (${a.adrFilename})`).join('\n')}`
314
+ : ''}
315
+
316
+ ## Code Changes
317
+ - **New Features**: ${comparison.featuresDelta.length}
318
+ - **Bug Fixes**: ${comparison.bugfixesDelta.length}
319
+ - **Breaking Changes**: ${comparison.breakingChangesDelta.length}
320
+
321
+ ${comparison.featuresDelta.length > 0 ? `### Features\n${comparison.featuresDelta.map(f => `- ${f}`).join('\n')}` : ''}
322
+ ${comparison.bugfixesDelta.length > 0 ? `### Bug Fixes\n${comparison.bugfixesDelta.map(f => `- ${f}`).join('\n')}` : ''}
323
+ ${comparison.breakingChangesDelta.length > 0 ? `### Breaking Changes\n${comparison.breakingChangesDelta.map(c => `- ${c}`).join('\n')}` : ''}`,
324
+ },
325
+ ],
326
+ });
327
+ }
328
+ async function handleReleaseSummary(projectPath, adrs, args) {
329
+ const releases = await detectReleases(projectPath);
330
+ const { projectType, phase } = await detectProjectType(projectPath, adrs.length);
331
+ const { mappedReleases, unmappedAdrs } = await mapAdrsToReleases(adrs, releases, projectPath);
332
+ const milestones = args.includeReadiness ? await buildMilestoneMap(adrs, projectPath) : [];
333
+ let timelineDiagram = '';
334
+ if (args.includeTimeline && mappedReleases.length > 0) {
335
+ timelineDiagram = generateMermaidTimeline(mappedReleases);
336
+ }
337
+ return validateMcpResponse({
338
+ content: [
339
+ {
340
+ type: 'text',
341
+ text: `# Release Summary
342
+
343
+ **Project Type**: ${projectType}
344
+ **Project Phase**: ${phase}
345
+ **Total Releases**: ${mappedReleases.length}
346
+ **Total ADRs**: ${adrs.length}
347
+ **Unmapped ADRs**: ${unmappedAdrs.length}
348
+
349
+ ## Release History
350
+ ${mappedReleases.length > 0
351
+ ? mappedReleases
352
+ .map(r => `| ${r.version} | ${r.date.split('T')[0]} | ${r.features.length} features | ${r.bugfixes.length} fixes | ${r.adrs.length} ADRs |`)
353
+ .join('\n| Version | Date | Features | Fixes | ADRs |\n|---------|------|----------|-------|------|\n')
354
+ : 'No releases found.'}
355
+
356
+ ${milestones.length > 0
357
+ ? `## Milestone Status
358
+ ${milestones
359
+ .map(m => `- **${m.name}**: ${(m.completionRate * 100).toFixed(0)}% complete (${m.completed}/${m.total})${m.criticalTodos > 0 ? ` - ${m.criticalTodos} blockers` : ''}`)
360
+ .join('\n')}`
361
+ : ''}
362
+
363
+ ${timelineDiagram ? `## Release Timeline\n\n${timelineDiagram}` : ''}
364
+
365
+ ${unmappedAdrs.length > 0
366
+ ? `## Unmapped ADRs
367
+ ${unmappedAdrs.map(a => `- ${a}`).join('\n')}`
368
+ : ''}`,
369
+ },
370
+ ],
371
+ });
372
+ }
373
+ async function handleNextReleasePreview(projectPath, adrs, _args) {
374
+ const releases = await detectReleases(projectPath);
375
+ const { mappedReleases } = await mapAdrsToReleases(adrs, releases, projectPath);
376
+ const preview = await previewNextRelease(projectPath, adrs, mappedReleases);
377
+ return validateMcpResponse({
378
+ content: [
379
+ {
380
+ type: 'text',
381
+ text: `# Next Release Preview
382
+
383
+ **Suggested Version Bump**: ${preview.suggestedVersion}
384
+ **Unreleased Commits**: ${preview.unreleaseCommits.length}
385
+ **Pending ADRs**: ${preview.pendingAdrs.length}
386
+
387
+ ## Release Readiness
388
+ ${preview.readiness.summary}
389
+
390
+ ## Unreleased Changes
391
+ ${preview.unreleaseCommits.length > 0
392
+ ? preview.unreleaseCommits
393
+ .slice(0, 20)
394
+ .map(c => `- ${c}`)
395
+ .join('\n')
396
+ : 'No unreleased commits.'}
397
+ ${preview.unreleaseCommits.length > 20 ? `\n... and ${preview.unreleaseCommits.length - 20} more commits` : ''}
398
+
399
+ ## Pending ADRs (Accepted, Not Yet Released)
400
+ ${preview.pendingAdrs.length > 0
401
+ ? preview.pendingAdrs.map(a => `- **${a.title}** (${a.filename}): ${a.status}`).join('\n')
402
+ : 'All accepted ADRs are linked to releases.'}
403
+
404
+ ## Recommendations
405
+ ${preview.readiness.recommendations.join('\n')}`,
406
+ },
407
+ ],
408
+ });
409
+ }
410
+ async function handleCreateMilestone(projectPath, args) {
411
+ if (!args.milestoneTitle) {
412
+ throw new McpAdrError('INVALID_ARGS', 'milestoneTitle is required for create_milestone operation');
413
+ }
414
+ const result = syncGitHubMilestone(projectPath, args.milestoneTitle, args.milestoneDescription || '', args.milestoneDueDate);
415
+ return validateMcpResponse({
416
+ content: [
417
+ {
418
+ type: 'text',
419
+ text: result.success
420
+ ? `# Milestone Created/Updated
421
+
422
+ **Title**: ${args.milestoneTitle}
423
+ **Number**: #${result.number}
424
+ ${args.milestoneDescription ? `**Description**: ${args.milestoneDescription}` : ''}
425
+ ${args.milestoneDueDate ? `**Due Date**: ${args.milestoneDueDate}` : ''}`
426
+ : `# Milestone Creation Failed
427
+
428
+ **Error**: ${result.error}
429
+
430
+ Make sure:
431
+ 1. \`gh\` CLI is installed and authenticated
432
+ 2. You have write access to the repository
433
+ 3. Run \`gh auth status\` to verify`,
434
+ },
435
+ ],
436
+ });
437
+ }
438
+ async function handleSyncMilestones(projectPath, adrs, args) {
439
+ const milestones = await buildMilestoneMap(adrs, projectPath);
440
+ // Update TODO.md
441
+ if (args.updateTodo) {
442
+ updateTodoMilestones(projectPath, milestones, adrs);
443
+ }
444
+ // Sync to GitHub
445
+ const githubResults = [];
446
+ if (args.syncGithubMilestones) {
447
+ for (const milestone of milestones) {
448
+ const adrLinks = adrs
449
+ .filter(a => milestone.blockers.some(b => b.includes(a.filename)))
450
+ .map(a => `- ${a.title} (${a.filename})`)
451
+ .join('\n');
452
+ const description = `Milestone from release tracking.\n\nLinked ADRs:\n${adrLinks || 'None'}`;
453
+ const result = syncGitHubMilestone(projectPath, milestone.name, description);
454
+ githubResults.push(result.success
455
+ ? `- ${milestone.name}: synced (#${result.number})`
456
+ : `- ${milestone.name}: failed (${result.error})`);
457
+ }
458
+ }
459
+ return validateMcpResponse({
460
+ content: [
461
+ {
462
+ type: 'text',
463
+ text: `# Milestones Synced
464
+
465
+ **Total Milestones**: ${milestones.length}
466
+ ${args.updateTodo ? '**TODO.md**: Updated' : ''}
467
+ ${args.syncGithubMilestones ? `**GitHub**: ${githubResults.length} milestones processed` : ''}
468
+
469
+ ## Milestone Status
470
+ ${milestones
471
+ .map(m => `### ${m.name}
472
+ - Progress: ${(m.completionRate * 100).toFixed(0)}% (${m.completed}/${m.total})
473
+ - Critical Blockers: ${m.criticalTodos}
474
+ ${m.blockers.length > 0 ? m.blockers.map(b => ` - ${b}`).join('\n') : ' - None'}`)
475
+ .join('\n\n')}
476
+
477
+ ${githubResults.length > 0
478
+ ? `## GitHub Sync Results
479
+ ${githubResults.join('\n')}`
480
+ : ''}`,
481
+ },
482
+ ],
483
+ });
484
+ }
485
+ // ─── Helpers ───────────────────────────────────────────────────────
486
+ function generateReleaseNotes(release) {
487
+ const lines = [`# ${release.version}`, ''];
488
+ if (release.adrs.length > 0) {
489
+ lines.push('## Architecture Decisions');
490
+ for (const adr of release.adrs) {
491
+ lines.push(`- **${adr.adrTitle}** (${adr.changeType})`);
492
+ }
493
+ lines.push('');
494
+ }
495
+ if (release.features.length > 0) {
496
+ lines.push('## Features');
497
+ for (const f of release.features) {
498
+ lines.push(`- ${f}`);
499
+ }
500
+ lines.push('');
501
+ }
502
+ if (release.bugfixes.length > 0) {
503
+ lines.push('## Bug Fixes');
504
+ for (const f of release.bugfixes) {
505
+ lines.push(`- ${f}`);
506
+ }
507
+ lines.push('');
508
+ }
509
+ if (release.breakingChanges.length > 0) {
510
+ lines.push('## Breaking Changes');
511
+ for (const c of release.breakingChanges) {
512
+ lines.push(`- ${c}`);
513
+ }
514
+ }
515
+ return lines.join('\n');
516
+ }
517
+ function generateMermaidTimeline(releases) {
518
+ if (releases.length === 0)
519
+ return '';
520
+ const lines = ['```mermaid', 'gantt', ' title Release Timeline', ' dateFormat YYYY-MM-DD'];
521
+ for (const release of releases.slice().reverse()) {
522
+ const date = release.date.split('T')[0];
523
+ lines.push(` ${release.version} :milestone, ${date}, 0d`);
524
+ }
525
+ lines.push('```');
526
+ return lines.join('\n');
527
+ }
528
+ //# sourceMappingURL=release-tracking-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-tracking-tool.js","sourceRoot":"","sources":["../../../src/tools/release-tracking-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAGlB,MAAM,6BAA6B,CAAC;AAErC,sEAAsE;AAEtE,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,SAAS,EAAE,CAAC;SACT,IAAI,CAAC;QACJ,iBAAiB;QACjB,eAAe;QACf,oBAAoB;QACpB,kBAAkB;QAClB,iBAAiB;QACjB,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;KAClB,CAAC;SACD,QAAQ,CAAC,sBAAsB,CAAC;IAEnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAEhE,oBAAoB;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAElF,uBAAuB;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAE1E,yBAAyB;IACzB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,UAAU,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;SACtD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,QAAQ,CAAC,yBAAyB,CAAC;IACtC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC1F,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACjF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACjF,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAE9E,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACvF,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAEvF,uBAAuB;IACvB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACpF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAEnF,yBAAyB;IACzB,mBAAmB,EAAE,CAAC;SACnB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,2CAA2C,CAAC;IACxD,oBAAoB,EAAE,CAAC;SACpB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACxF,CAAC,CAAC;AAEH,sEAAsE;AAEtE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAA6B;IACjE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE/D,gBAAgB;QAChB,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC;QACjE,MAAM,eAAe,GAAG,MAAM,uBAAuB,CAAC,YAAY,EAAE,WAAW,EAAE;YAC/E,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;QAElC,QAAQ,aAAa,CAAC,SAAS,EAAE,CAAC;YAChC,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAEvD,KAAK,eAAe;gBAClB,OAAO,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEpE,KAAK,oBAAoB;gBACvB,OAAO,MAAM,uBAAuB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEzE,KAAK,kBAAkB;gBACrB,OAAO,MAAM,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEvE,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEtE,KAAK,sBAAsB;gBACzB,OAAO,MAAM,wBAAwB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAE1E,KAAK,kBAAkB;gBACrB,OAAO,MAAM,qBAAqB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEjE,KAAK,iBAAiB;gBACpB,OAAO,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YAEtE;gBACE,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE,sBAAsB,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,wBAAwB,EACxB,4BAA4B,aAAa,CAAC,KAAK,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,sEAAsE;AAEtE,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,IAAW;IAClE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC;YACzB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yBAAyB,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;;;;oBAI/E,WAAW;qBACV,KAAK;kBACR,IAAI,CAAC,MAAM;;;;EAK3B,WAAW,KAAK,YAAY;wBAC1B,CAAC,CAAC;;;;;4FAKsF;wBACxF,CAAC,CAAC;;;;yDAKN;;;EAGE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kEAAkE,EAAE;iBAClJ;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE9F,aAAa;IACb,MAAM,KAAK,GAAyB;QAClC,WAAW;QACX,aAAa,EAAE,KAAY;QAC3B,QAAQ,EAAE,cAAc;QACxB,YAAY;QACZ,UAAU,EAAE,EAAE;QACd,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC5C,CAAC;IACF,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEtC,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;oBAEM,WAAW;qBACV,KAAK;sBACJ,cAAc,CAAC,MAAM;kBACzB,IAAI,CAAC,MAAM;qBACR,YAAY,CAAC,MAAM;;;;EAItC,cAAc;qBACb,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;kBAChC,CAAC,CAAC,QAAQ,CAAC,MAAM;mBAChB,CAAC,CAAC,QAAQ,CAAC,MAAM;0BACV,CAAC,CAAC,eAAe,CAAC,MAAM;qBAC7B,CAAC,CAAC,IAAI,CAAC,MAAM;EAChC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrH;qBACA,IAAI,CAAC,MAAM,CAAC;;EAGb,YAAY,CAAC,MAAM,GAAG,CAAC;oBACrB,CAAC,CAAC;;EAEJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;wDAEY;oBACpD,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,mBAAmB,CAAC;YACzB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,wBAAwB,IAAI,CAAC,OAAO;;sBAE9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM;;kDAErB,IAAI,CAAC,OAAO,IAAI;iBACzD;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5E,iBAAiB,GAAG,MAAM,CAAC,OAAO;YAChC,CAAC,CAAC,oCAAoC,MAAM,CAAC,GAAG,EAAE;YAClD,CAAC,CAAC,mCAAmC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,8BAA8B;IAC9B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC9D,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,sBAAsB,IAAI,CAAC,OAAO;;YAEpC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;mBACzB,aAAa,CAAC,IAAI,CAAC,MAAM;gBAC5B,aAAa,CAAC,QAAQ,CAAC,MAAM;iBAC5B,aAAa,CAAC,QAAQ,CAAC,MAAM;wBACtB,aAAa,CAAC,eAAe,CAAC,MAAM;;;EAI1D,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;oBAC3B,CAAC,CAAC,aAAa,CAAC,IAAI;yBACf,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,WAAW;mBAC9B,CAAC,CAAC,UAAU;sBACT,CAAC,CAAC,aAAa;kBACnB,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC3C;yBACA,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,iCACN;EACE,iBAAiB,EAAE;aACd;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEhF,MAAM,OAAO,GAAqB;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;IAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,cAAc,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;gBAEE,cAAc,CAAC,MAAM;cACvB,IAAI,CAAC,MAAM;EACvB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,kDAAkD;;;;EAItG,gBAAgB,EAAE;aACb;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAErF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,SAAS;;;eAG7D,UAAU,CAAC,SAAS,CAAC,MAAM;kBACxB,UAAU,CAAC,YAAY,CAAC,MAAM;oBAC5B,UAAU,CAAC,cAAc,CAAC,MAAM;;EAGlD,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;oBAC7B,CAAC,CAAC;EACJ,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC9E,CAAC,CAAC,EACN;;EAGE,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;oBAChC,CAAC,CAAC;EACJ,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACjF,CAAC,CAAC,EACN;;EAGE,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAClC,CAAC,CAAC;EACJ,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACnF,CAAC,CAAC,EACN;;;sBAGsB,UAAU,CAAC,aAAa,CAAC,MAAM;mBAClC,UAAU,CAAC,aAAa,CAAC,MAAM;0BACxB,UAAU,CAAC,oBAAoB,CAAC,MAAM;;EAE9D,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EACpH,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;EACrH,UAAU,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;aACvI;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3F,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,IAAI,CAAC,eAAe,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,eAAe,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;oBAEM,WAAW;qBACV,KAAK;sBACJ,cAAc,CAAC,MAAM;kBACzB,IAAI,CAAC,MAAM;qBACR,YAAY,CAAC,MAAM;;;EAItC,cAAc,CAAC,MAAM,GAAG,CAAC;oBACvB,CAAC,CAAC,cAAc;yBACX,GAAG,CACF,CAAC,CAAC,EAAE,CACF,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CACpI;yBACA,IAAI,CACH,gGAAgG,CACjG;oBACL,CAAC,CAAC,oBACN;;EAGE,UAAU,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC;EACJ,UAAU;yBACT,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAChK;yBACA,IAAI,CAAC,IAAI,CAAC,EAAE;oBACX,CAAC,CAAC,EACN;;EAEE,eAAe,CAAC,CAAC,CAAC,0BAA0B,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE;;EAGlE,YAAY,CAAC,MAAM,GAAG,CAAC;oBACrB,CAAC,CAAC;EACJ,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC1C,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,WAAmB,EACnB,IAAW,EACX,KAA4C;IAE5C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAE5E,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;8BAEgB,OAAO,CAAC,gBAAgB;0BAC5B,OAAO,CAAC,gBAAgB,CAAC,MAAM;oBACrC,OAAO,CAAC,WAAW,CAAC,MAAM;;;EAG5C,OAAO,CAAC,SAAS,CAAC,OAAO;;;EAIzB,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,OAAO,CAAC,gBAAgB;yBACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;yBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;yBAClB,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,wBACN;EACE,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE;;;EAI5G,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;oBAC5B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC1F,CAAC,CAAC,2CACN;;;EAGE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACzC;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,IAA2C;IAE3C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAChC,WAAW,EACX,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,oBAAoB,IAAI,EAAE,EAC/B,IAAI,CAAC,gBAAgB,CACtB,CAAC;IAEF,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,CAAC,OAAO;oBAClB,CAAC,CAAC;;aAEC,IAAI,CAAC,cAAc;eACjB,MAAM,CAAC,MAAM;EAC1B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE;EAChF,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC/D,CAAC,CAAC;;aAEC,MAAM,CAAC,KAAK;;;;;oCAKW;aAC7B;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,IAAW,EACX,IAA2C;IAE3C,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE9D,iBAAiB;IACjB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACjE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;iBACxC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,WAAW,GAAG,qDAAqD,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAE7E,aAAa,CAAC,IAAI,CAChB,MAAM,CAAC,OAAO;gBACZ,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,cAAc,MAAM,CAAC,MAAM,GAAG;gBACnD,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,aAAa,MAAM,CAAC,KAAK,GAAG,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;;wBAEU,UAAU,CAAC,MAAM;EACvC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;EAC7C,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,aAAa,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,EAAE;;;EAG3F,UAAU;qBACT,GAAG,CACF,CAAC,CAAC,EAAE,CACF,OAAO,CAAC,CAAC,IAAI;cACL,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK;uBACtD,CAAC,CAAC,aAAa;EACpC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAChF;qBACA,IAAI,CAAC,MAAM,CAAC;;EAGb,aAAa,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC;EACJ,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACxB,CAAC,CAAC,EACN,EAAE;aACK;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,sEAAsE;AAEtE,SAAS,oBAAoB,CAAC,OAAY;IACxC,MAAM,KAAK,GAAa,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAe;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,CAAC,CAAC;IAEjG,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,OAAO,gBAAgB,IAAI,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}